ラムダその2

 
ラムダ:
 http://d.hatena.ne.jp/levin_gsp/20071127/1196143533
 
@IT - 連載:C# 3.0 入門 - 第1回 ラムダ式
 http://www.atmarkit.co.jp/fdotnet/csharp30/csharp30_01/csharp30_01_01.html
 
一つ目は昨年11月にC#のお勉強がてらに書いた記事。
二つ目は@ITのC#連載のC#3.0版、第1回記事。
お誂え向きにラムダ式が取り上げられている。
※私はC#1系2系の連載共に斜め読みしかしておらず、100%理解していない…
 
こんな状況だが、C#3.0でのラムダがどんな風に表現できるのか気になり、熟読してみた。
@ITの該当記事が投稿されてから早10日。
出遅れた感はあるが、気にせず行こう。
元々C#の勉強自体からして相当に出遅れているわけだし。
 
さて、前回私が書いた記事。
ひどいものだ。
@IT記事で解説されている内容を理解すると、まさにそれが露呈する。
一番大きい私の誤解は「匿名メソッド」と「ラムダ式」がごちゃ混ぜの理解になっていたこと。
 
なるべくわかりやすく説明するとすれば。
「匿名メソッド」は“メソッド”であり、「ラムダ式」は“式”なのだ。
その名のとおりの理解で良かったわけだ。
式(expression)として表すことの出来る表現はラムダ式である。
 
さて、今回試したサンプルの詳細は勿論@IT記事に譲るとして。
私がほんの少しだけ自力で試してみたコード…って、Visual Studio 2005 + C#2.0 ではロクなラムダ式が書けないぞ!
しまった…ラムダ自体が C#3.0 の機能ではないかー(T T
試す環境を持ってませんでしたorz
 
ということで、現状は Visual Studio 2008 + C#3.0 をお持ちの方に譲るしかなさそうです(笑

apachectl 3分ハッキング

 
あまりにも最近更新出来ていないので、仕事ネタで更新しておこうと思いついた。
過去のBlogから記事を引っ張りだしてきた。
 
apachectl 3分ハッキング:
 http://myhome.cururu.jp/aquacity/blog/article/91001486526
 
以下の内容は上記記事の転載である。
自分の記事なので著作権を気にしなくていい♪
ああ、せっかくだから少し見直して多少文章を直しておくかな。
 

                                                                                                                      • -

 
諸事情で apachectl をハックすることになった。
 
OSがLinux系の apache では、apachectl を使って httpd(http deamon) の起動・停止を行うのが一般的だろう。
今回、ハックする要件は「httpd 起動の際は必ずSSLを有効にしたい」である。
 
apachectl start
 通常の起動
apachectl startssl(/sslstart/start-SSL)
 SSL有効起動
 
なのは、apacheを使っている方には基本であろう。
この apachectl start をどうにかしたい。
SSL有効起動をするはずが、うっかり通常起動してしまうことを防ぐためだ。
 
まず、apachectl の中身は実は shell script である。
オレはずっとバイナリかと思っていたので、今まで知らなかった(笑
 
中を見てみると意外と簡潔でわかりやすい。
 

### 中略
    case $ARG in
    start)
    if [ $RUNNING -eq 1 ]; then
        echo "$0 $ARG: httpd (pid $PID) already running"
        continue
    fi
    if $HTTPD ; then
        echo "$0 $ARG: httpd started"
    else
        echo "$0 $ARG: httpd could not be started"
        ERROR=3
    fi
    ;;
    startssl|sslstart|start-SSL)
    if [ $RUNNING -eq 1 ]; then
        echo "$0 $ARG: httpd (pid $PID) already running"
        continue
    fi
    if $HTTPD -DSSL; then
        echo "$0 $ARG: httpd started"
    else
        echo "$0 $ARG: httpd could not be started"
        ERROR=3
    fi
    ;;
    stop)
### 以下略

 
これなら3分ハッキングが余裕で可能である。
shell がわからない方のために、2つほど修正方法を紹介しておく。
 
ちなみに上記は引数("./apachectl start"などとした場合の'start'に当たる部分)ごとの処理を行っている部分の一部抜粋。
「start」と「startssl/sslstart/start-SSL」でほぼ同一処理をしているのがわかる。
違うのは一点、$HTTPD に対して -DSSL オプションを与えているかどうかのみ。
HTTPD変数はここで紹介していないが、/apache/bin/httpd などを指定している
 
改修その1:
「'start'オプションが指定されても、SSL有効起動とする」
 
修正前:

    if $HTTPD ; then

修正後:

    if $HTTPD -DSSL ; then

 
これは start 引数指定時処理をhttpdSSL有効起動としてしまう方法。
 
または、start) 〜 ;; を全て削除し、
修正前:

    startssl|sslstart|start-SSL)

修正後:

    start|startssl|sslstart|start-SSL)

 
こちらは、元々のSSL有効起動処理の引数判定の中に'start'も含めてしまう方法。
 
いずれにせよ、これらのパターンだと 'start' オプションでもSSL有効起動を行う。
悪い癖がつく、というデメリットも存在するわけだ。
なので、オレは次の方法を使った。
 
改修その2:
「'start'オプションが指定されたら、エラーメッセージを出力する」
 
修正前:

    start)
    if [ $RUNNING -eq 1 ]; then
        echo "$0 $ARG: httpd (pid $PID) already running"
        continue
    fi
    if $HTTPD ; then
        echo "$0 $ARG: httpd started"
    else
        echo "$0 $ARG: httpd could not be started"
        ERROR=3
    fi
    ;;

修正後:

    start)
    echo "Please Use Command 'startssl/sslstart/start-SSL'
    ;;

 
至ってシンプル。
また、見ての通り、apachectl は httpd を起動したりする、ただの shell スクリプトである。
ハック対象 apachectl の apache(httpd) が起動していても、リプレイス可能である。

csprojとの格闘続編

XNA バージョン違いの影響:
http://d.hatena.ne.jp/levin_gsp/20080110
とある一行。csprojとの戦いに敗れる:
http://d.hatena.ne.jp/levin_gsp/20080107

 
経緯は上記の過去記事を見ていただくとして。
今日も手短に結果の報告だけになってしまうのは申し訳なく。
 
XNA Game Studio 1.0 Refresh で作成された csproj が開けない問題について。
 
疑わしき原因:
1 XNA Framework のバージョン違いの互換性
2 .NET Framework(3.0) のバージョン違いの互換性
3 Visual Studio 2005 が Express でなく、Standard Edition である関係
 
過去記事のコメントで Visual Studio C# Express Edition で開けた、という報告があるが、どの Visual Studio かわからない。
少なくとも、自宅には .NET Framework 3.0 をインストールしていないので、2番ではないことが確証を得られたかな、と。

はじめての三角形

 

 
−−−−−>>>
とりあえずホントのホントの初めてのデモ。
単純な三角形を描画。
−−−−−>>>
 

 
 
 
<<<−−−−−
更にテクスチャを張り付けただけ。
たったこれだけでも奥が深い。
<<<−−−−−
 
 
XNA GSE 1.0 refresh と XNA GS 2.0 で Windows Game Project を新規作成した時のベースコードにも違いがあることがわかったし(笑
 
はてなフォトライフ使ってみた。
 イメージ通り配置出来ないものだなぁ。。。

XNA バージョン違いの影響

Σ( ̄□ ̄;


全く調査とかはしていない結果だけの報告。
XNA Game Studio 1.0 Refresh で作られた実行ファイル(exe)が起動時エラー発生。
 
XNA Framework のバージョンが違うせいか。
それとも .NET Framework 3.0 をインストールしてあるせいか。
 
なんせ互換がない、という事実が切ない。
問題は csproj だけに留まってないんだなぁ。

XNA は頭文字ではない

Xna's Not Acronymed.
(XNA は頭文字ではない)
 
XNA とは何の頭文字ですか?に対して、MicrosoftXNA FAQ で回答した内容。
凄まじいジョークセンス。
XNA は頭文字ではない、の頭文字って。
XBOX New generation なんちゃら、とかを想像した人も多いだろうなぁ。
 
このサイトのタイトルこれに変えちゃおうかな♪
C# ってより XNA 寄りになって行きそうだし。
もちろん XNA を学ぶ上で C# の勉強は必須になるんだけど。
 
 
 
さて冒頭から脱線したが、Microsoft XNA Unleashed 購入によって私のモチベーションは昨年末から高まる一方なのだ。
出来る出来ないは別にして、とにかく具体的に取り組む方向性が見えた。
 
書籍の内容を転載するのはもちろん著作権侵害に当たるので、法に触れないように自分の言葉で表現していく。
まず、サンプルを二つ作った。
ソースも開示できないが、書籍購入者は勿論具体的なコードを知ることが出来る。
XNA Framework に含まれているクラスやメソッド名レベルだけで表現するなら問題ないだろう。
 
書籍に基づいて作ったサンプルは
fps測定ツール」
ベンチマークライブラリ」
とりあえず画像を載せておく。
って、そうだった、、、縮小されちゃうんだった。
不本意ながらもう一つのBlogと相互リンクしとくので、画像を見たい方はそちらをどうぞ。

XNA Sample Bench:
 http://myhome.cururu.jp/aquacity/blog/article/91001724895

 
ベンチマークは単純な処理を行うだけのメソッドを多数用意したクラスを提供するライブラリを作り、各メソッドをコンソールアプリから10000回ずつコールして時間を計測している。
画像右下にチラッと見えているのがfps測定ツール。
640x480のWindowが表示されるが、タイトルバーに1秒ごとのfpsとRealTime/GameTimeでのUpdateメソッドコール周期を出力している。
 
初めの一歩、と言ったところか。

とある一行。csprojとの戦いに敗れる

XNA で文字表示:
http://d.hatena.ne.jp/levin_gsp/20071227/1198759201

上記、前回の投稿で、XNA Game Studio Express 1.0 Refresh で作られた某slnファイルを XNA GS 2.0 でオープン出来ない問題が発生した。
コメントで通りすがりさんに指摘を受け、

菊池 Blog - XNA Frameworkにかなりむかつきを覚えた:
http://www.ailight.jp/blog/kazuk/archive/2006/09/07/11977.aspx

等々を参照。
(英語の記事は避けたけど…(T T
 
XNA 下位エディションのcsprojを開くためには“とある一行”を削除すれば良いということだが、その一行がどこなのかは明記していない。
色々削除して試してみた。
結果

v1.0

この一行(私の試したcsprojではどれも上から11行目)を削除することで、csprojファイルのダブルクリックによるプロジェクトファイル読み込みに成功!
っしゃー!と思ったのも束の間。
複数のcsprojが連携しているソリューションのため、slnで Visual Studio を起動すると、結局エラーが。
(前回掲載したエラーと同様
 
むぅ。
これは…。
と、まだまだ調べたいのだが、時間の都合上ココで断念。
もし回答をご存知の方がいたら、爽やかに(?)コメントくれたりすると嬉しい…って人頼みなわけではないですが。(T T