最近のトラックバック

2021年7月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
無料ブログはココログ

« 2008年5月 | トップページ | 2008年7月 »

2008.06.20

ObjectPeepHole公開ほか

 ちょっと更新の間が開いてしまった。
 最近もドタバタとしてて、妻の祖母の葬儀で急遽石川県に行ったり(地方だと移動だけでも時間も金もかかりますね)、自宅に友人を計8人呼んで飲んだり(料理の準備はわりと大変だが外で飲むより遥かに楽しい)、久々に服役中の某友人を刑務所に訪問したりがあった。

 服役の罪状は株のインサイダー取引である。奴とは以前は一緒にTacticoプロジェクトをやる予定であったのだけれど、突然の逮捕で戦線離脱となったのは相当な痛手だった。本人は幸い今でも仕事の意欲は失ってなかったので(体はむちゃくちゃ痩せてたのが気になったけど)、しっかり刑期満了を待つしかないね。悪事に手を染めたのは問題だけど、仕事の能力はあるし性格的にも僕は気にっている奴だから。

 しかしシャバに出てくるのは早くても次のワールドカップの頃なのでまだかなり先だ。
 いまだ裁判が長引きそうなホリエモンも同様だけど、能力があって年齢的にもバリバリ活動できる人を長期間拘束する刑は賛成しかねる。刑を受けること自体は必要だと思うが、時間的拘束を避けることはできんものかね。


 さて、一方仕事がらみでは、ちょっとしたツールをリリースしました。
 名前はObjectPeepHoleといって、詳しい内容はSourceForgeのここです。ついでに英語版の記事も書きました。あとでNUnit本家でも紹介メールを打ってみるつもり。
 一方、日本語のメーリングリストで紹介に適切なところが見つからなかった。なんか関連したコミュニティを知っている人がいたら教えて下さい。

 完全にエンジニア向けのツールなので素人にはわからいだろうけど、.NETでユニットテストの効率を高めたいと思っている人には興味を持ってもらえるのではないかと思います。特にGUIのテストの自動化にはかなり便利です。すでに自分でもこれを実際に使って、Tacticoのテストの自動化カバー率を上げる作業に取り組んでいます。

 動的にクラスを作り、ILインストラクションを吐いてコードを動的生成するテクニックを使っています。作ってみて思ったけど、これは.NETがJavaに対して最も優れている機能かもね。

 このアイデアを1年早く思いついていたら、自分の仕事時間を2週間分くらいは節約できていたろうなあ。

 なんかどっちも時間を節約する話になってしまった。とにかく今はやるべきことがありすぎていくら時間があっても足らずあせってるのよ。

2008.06.06

FieldAccessExceptionでハマる

 相場はとうとう5/16につけた高値を堂々超えてきた!今日陰線を引くのは気になるが、当面上昇基調くさい。でもその前にちょっとだけ下落してくれると嬉しいな。コールの売りポジを縮めたい。

 さて前回書いた件で、動的にクラスを作るテクニックに取り組んでみたはよいものの、いざ実行してみたらFieldAccessExceptionが出てうまくいかない。
 本当にこの手のセキュリティがらみの問題にぶつかると資料が乏しくて難儀する。分野的にマイナーなのでWebで調べてもヒット数が少ないし...。過去にもJavaのセキュリティで何時間も悪戦苦闘して結局お手上げだったことがあった。

 まあセキュリティ関係のAPIは、何を許して何を許さないかを柔軟に決められなくてはいけないし、典型的な使い方であれば簡便にできること、パフォーマンスに影響を出さないこと、などを考えるとAPIが複雑になるのは仕方ないとは思う。
 一般的にどんなAPIでも、設計者は全体を統一的に無駄なく記述できることを目指すのに対し、その結果抽象度が高くなりすぎて学習が困難になる、というのはよく見られることだ。「俺のしたいことはこんな単純なのに、なぜこんな面倒な手順を踏まなければならんのだ」とライブラリに対して思ったことは多くある。
 数年前でもJ2EEには複雑でクラスのリストを見ただけでげんなりするのがいっぱいあったが、きっと最近はさらにそうなのだろうな。抽象度と学習のしやすさのトレードオフは将来もずっとソフトウェアにとって重要なテーマだと思う。

 一応、今回の件については、動的アセンブリから自分のアセンブリのメソッドを呼ぶように回流させることで問題は回避できることはわかっているけれども、当初の予定の手法で実装できれば格好いいので方法をMS本家のフォーラムで問い合わせてみた。うまい回答が得られればそっちでいこう。

 しかしMSILレベルでコードを書くのは短いものであってもドキドキする。このレイヤだと型チェックがないので、int型の変数にstringを入れるのも自在である。それでもVisualStudioのデバッガはそういう事態も想定しているらしい動きをするのでなかなか流石。

 一方MSDNのドキュメントはVS2008になってクソになった。フィルタを".NET"にすると.NETの重要な機能のかなりの割合がフィルタから外されてしまうし、かといって全項目にすると項目が多すぎるし、検索をすればローカルのHDDだけを対象にしてすらGoogleで検索するより時間がかかる。ドキュメントはVS2005のを使おうかな...

2008.06.03

.NETのイベント強制発生と動的型生成

今日は純粋に技術的な話題。

.NET(とくにWindows Forms)においては、ふつう外部のイベントを強制的に発生させることはできないことになっている。いろいろぐぐっても特に情報はない。
でも、リフレクションを使えば何とかなるのでは? と思い立って、この前の週末にちょっと予備調査としてSystem.Windows.Forms.dllをディスアセンブラにかけて解析してみた。(サンデープログラミングとしては格好のネタだ)
 その結果十分いけそうという感触を得たので、今後隙をみてこの機能を使うライブラリを整備していくつもり。

これで何がやりたいかというと、GUIアプリケーションをNUnitでテストするカバー率を上げるのだ。ドラッグ&ドロップ系統やMouseEnter/Leaveというイベントを自在に発行できればテストは圧倒的にやりやすくなる。

ちなみに、OnMouseEnter等のprotectedメソッドをリフレクションを使って直接呼ぶのは、自分のイベントハンドラだけでなくWindows.Forms内の実装も実行されてしまい、副作用の危険が大である。あくまでも自分でくっつけたdelegateだけを呼ぶのがポイント。

さらに、このテクニックと、動的な型生成(System.Reflection.Emitにある一連の機能)を組み合わせるとテストコードの記述性は新しい次元になる。

動的な型生成はJavaにはないのでJUnitにこのアイデアを使うのは無理かなあ。型生成は面白いんだが、メソッドの定義はMSILを直接使わなくちゃいけないので、足し算ひとつするんでも

g.Emit(OpCodes.Ldarg_1);
g.Emit(OpCodes.Ldarg_2);
g.Emit(OpCodes.Add);

 こんな感じである。

 ある程度出来上がったらちゃんと使い方をまとめて公開する予定です。NUnitの人たちにもアナウンスしたいのでドキュメントは英語でも書かないと...

« 2008年5月 | トップページ | 2008年7月 »