ここからの第三部は、司会のかずひこさんの紹介通り、「ヤケド必至のマニアな時間」がはじまりました。
冒頭、Windows 連携を誇示するかのようにオフィスアシスタントのイルカちゃんが PowerPoint を起動して、「TBD」と書かれた部分をプレゼンテーションのアジェンダに書き替えたりしていました。もちろん、背後ではこれを Ruby プログラムが操っています。
Win32OLE1 が主役です。 COM (Component Object Model) 2は、Windows のカーネルでない部分で、サービス、といっても半分は定義でできています。 そのなかで、今回紹介するのは WSC (Windows Script Component)3、その中で実際サービスを提供している ScrObj.dll との連携を考えます。 VBScript、JScript、VB6 などから Ruby を呼び出す Rubyize も、これでつくられています。
ASR4 附属。使用するには、regsvr32 rbobj.wsc で一回レジストリに登録しないといけません。 これがどういうものかを、JScript 版と VBScript 版の二種類で説明されました。
C レベル (水面下) では何をやってるか? を明示するためにデモの C 実装が示されました。Visual Basic のオブジェクトの引数の順番に Rubyize の Object(bstr) 引数を合わせている点がはまりやすい、と指摘されました。
「最初は呼べば呼ぶほどオブジェクトを作りまくる実装だったので、結果を返すときだけ生成するようにした」という裏話も披露されました。
このころからマイクに若干の異常がみられましたが、その日のうちに運用上の解決を見たようです。
Net::HTTP よりシェアがあります (ここで控室から Net::HTTP 作者の青木さん 連行 登場です)。
open-uri では (くさるほど考えて、ユーザがモノを憶えなくてもいいように)「典型的な望み」に API をチューンしてある。
SHA1 アルゴリズムを使うためのライブラリは digest/sha1 なのに、SHA256 アルゴリズムや SHA512 は digest/sha2。類推が効かない上に、2 という名前も良くない。ファイル名 sha2 が短いために、今更 sha256 というファイルを作ってもユーザーは短いほうを使いたがるので誘導できない。
残念ながら、ここでゴングがなってしまいました。時間切れです。「鳴ってしまった。すいません」
Ruby は高い記述力を備えているので、メソッドのフローを詳細に、また後から見ても分かりやすく書くことができる。 一方で、基本がテキスト表現なので、クラス間の関連は一目で把握できない。 オブジェクト指向においてはクラス間の関連が本質的に重要なので、 この状態は美しいアーキテクチャを開発する障害になる。 なにも考えないでベタでコーディングするとめちゃくちゃになりがち。 どうせ作るんなら美しいアーキテクチャを実現したい!
標準的なビジュアル化の方法にはユースケース図やクラス図やシーケンス図などたくさんの種類があるが、講演では以下が紹介されました。
結論。静的構造、システム全体の振舞、クラスの役割が明確化する。
デザインパターンは、典型的な問題の文脈に対して (逆に言えばインタフェースとしては問題ごとに安定)、動的な解法を示すものである。 動的なので、ライブラリの対象外 (となることが多い)、と一般にはいわれている。
けれども、もとが動的な Ruby なら MLF7 を使えばライブラリ化できるのでは? 実際にはどうなのか? 使い物になるのか?
実際に試してみると GoF8 の 23 個のパターンのうち 9 個が実装できた。試したものはすべてライブラリ化できた (ここで Composite パターンの事例が紹介されました)。 けっこうパターンって単純な話が多いので、できるのは当たり前だなぁ。
いつかあるかもしれない「Ruby プログラミング + モデリングでより楽しくなろう - その 2」に続く……。
MDA の立場は Ruby の立場(というかアジャイル系の立場)と正反対にある
これを Ruby でどのように実現するか? PSM に関しては、Ruby でメカニズムやパターン記述能力によって, プラットフォームやアーキテクチャに依存する部分が表現可能なので PSM をわざわざ用いて表現する必要がない。また、Ruby でコードテンプレートの記述ができるので、わざわざ PSM 上で定義しなくても、PIM からいきなりコードを生成しちゃっていい。さらにアクション言語として Ruby そのものを採用すれば、実行まで可能!
実践編を。
ここで 10 分間の休憩。 懇親会の最後のアナウンス。
Win32OLE: Windows のオブジェクト (Excel や Word) を Ruby から扱うためのライブラリ。Ruby 1.8 から標準添付。るびまに「Win32OLE 活用法」が連載中 ([[0003-Win32OLE]])。 ↩
COM (Component Object Model): Windows の部品化技術。他にも ActiveX とか OLE とも呼ばれる。Win32OLE を使えば気にしなくていいはず。 ↩
WSC (Windows Script Components): コンポーネントとして扱えるように (XML で) パッケージされたスクリプト。http://www.microsoft.com/japan/msdn/columns/scripting/scripting091399.asp ↩
ASR (ActiveScriptRuby): arton さんの開発している Windows 版の ruby 実装。Windows とブリッジ可能で、Windows のオブジェクトを利用したり、IE で JavaScript の代わりに使ったり、バッチファイルのように利用したり、HTA (IE の表示部分を使って Shell を動かす) と呼ばれるアプリケーションを記述するのに使ったりできる。 ↩
DRY (Don’t Repeat Yourself): 「同じことを二度も繰り返すな」という設計指針。Ruby on Rails も採用している。 ↩
オブジェクト指向のソフトウェア構造を記述するための図法。1997 年 OMG で統一規格が制定されてから急激に普及した ↩
MLF (Meta Level Feature): メタ水準の言語仕様のこと。約 10 年前に MLF をめぐって、発足したばかりの ruby-list メーリングリストで、石塚さんとまつもとさんの討論が交わされています。今読んでも大変参考になる議論です。 ↩
Gang of Four : 最初のデザインパターンに関する書籍を出した四名 (Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides) のこと ↩
あるいは、MDD (model driven development) と呼ぶこともあります。 ↩