2005年08月の雑感

更新日:2005-09-03
[トップページへ] [7月] [9月] [過去の雑感へ]

8月28日()

 Gauche 0.8.5

インストールしてみた。

configure
make
make install

これで、いつでもSchemeを試せる環境が整った。 あと私に必要なものは、初心者向け教科書とモチベーション。

 Rabbit 0.0.9 on Linux

Vine Linux にインストールしてみた。

をインストールして、Rabbit 0.0.9 をインストールした。 何の問題もなく動いた。 高橋メソッド用サンプル sample/lightning-talk.rd も動いた。

rabbit -s -b lightning-talk -i jpg sample/lightning-talk.rd

もちゃんと動きました。すばらしい。 rwikiとの連携とかdrubyとの連携などは試してませんが、プレゼンテーションツールとして使えそうです。 ところで、サムネイル画像表示用のHTMLファイルとかは自動生成してくれないのでしょうか? あと、FullScreen にしてから、UnfullScreen すると元のサイズ(800x600)に戻りませんでした。

 Rabbit 0.0.9 on Windows

Windows 2000 にインストールしてみた。

諸事情から、Mingw版 Ruby 1.8.3 を使います。

この辺は、インストール手順に従ってそれぞれインストールします。 Ruby-GNOME2は、全部インストールされる訳ではないですが、Rabbitで必須とされているものはインストールされます。 あとRaebbit 0.0.9のインストールは、ruby setup.rb でインストールしました。 すんなり lightning-talk.rd は表示できました。

ruby rabbit -s -b lightning-talk -i jpg sample/lightning-talk.rd

でちゃんと jpeg ファイルもできました。すばらしい。 rwikiとの連携とかdrubyとの連携などは試してませんが、プレゼンテーションツールとしてWindowsでも使えそうです。


8月27日()

 LLDN 2005

あえて、あまり感想は書かないで、主にどうでもいいようなことだけ。


8月21日()

 『のら犬ローヴァー町を行く』 (マイクル・Z・リューイン)

のら犬のローヴァーを主人公にした短編集。 犬の視点で描かれた小説。 人間に対するローヴァーたち犬の視線は皮肉たっぷりです。 人間に媚びず、したたかに生きるローヴァーが描かれます。 ミステリではないですが、語り口とか、ローヴァーの行動や考え方は、ハードボイルドそのものです。 アルバート・サムスンよりももっとハードボイルドかも。 困っている子犬や牝犬や老犬など弱い立場の犬を見るとほっておけないローヴァー。 ローヴァーは、困った犬たちを助けるために、時には人間すら利用するしたたかさを持っているのです。

お気に入りは、「タブー」。 「もうひとつやらなきゃならないこと」をきっちりやって走り去るローヴァーがかっこいいです。

1つの話がかなり短いので、空いた時間にちびちび読むのにぴったりです。

 『愚者のエンドロール』 (米澤穂信)

氷菓』に続く「古典部シリーズ」第2段。 文化祭に出展するクラス製作の自主映画のラスト、密室で少年が死んでいた。 ところが、犯人はわからず、密室のトリックも明かされないまま映画は終わる。 脚本を書いていた生徒は、病気で倒れてしまい、真相は誰にもわからない。 古典部の面々がこの謎に挑む。 果たしてホータローは、トリックを見破り、犯人を指摘することができるのか?

先に読んでしまったシリーズ3作目の『クドリャフカの順番 「十文字」事件』と比べると ミステリとしての面白さは、こちらに軍配が上がります。 ただ、作品全体としての面白さ、出来の良さでは、3作目の方が上です。

別にネタバレはしてないですが、あとがきは、本編を読まれてから読んだ方がいいと思います。 (私は、先に読んじゃったので、ホータローは、XXの役なんだろうなと思いました。結局、その通りでした。 話の途中で、タイトルから考えても、YYが、ZZの役回りなんだろうと思いました。そこは微妙に違ってましたが。) また、シリーズ未読の方はシリーズ1作目から順番に読んだ方がいいでしょう。

最後の台詞は、作者自身の台詞?


8月20日()

 [Ruby][Win32OLE] InvokeVerb をテストする

Win32OLEから、InvokeVerbを使えるかテストするためのスクリプトをRuby1.9に追加した。

テストのやり方は、次の通り。

  1. テスト用の一時ファイル dummy.txt を作成する。

  2. dummy.txtをエクスプローラーで右クリックしたときに表示されるメニューから、「ショートカットの作成」に相当すると思われる文字列を取得する。

  3. 取得した文字列から、WIN32OLE_VARIANT オブジェクトを生成する。

  4. InvokeVerbを実行する。

  5. ショートカットができていることを確認する。

  6. ショートカットを削除する。

  7. dummy.txtを削除する。

1と2がテストの下ごしらえで、3、4、5がテストで、6、7、が後片づけ。

日本語版Windows2000だと「ショートカットの作成」となるが、他の言語のWindowsだとどんな文字になるのかわからない。 そこで、右クリックしたときに表示される文字列の中から最後が"(&S)" で終わるものを見つけることにした。 というのが、2でやっていることです。

1で作ったファイルのフルパスとできたショートカットが指しているファイルの フルパスが一致するかどうかを確認するのが、5でやっていることです。

 [Ruby][Win32OLE] WIN32OLE#each と Enumerable

上のテストスクリプトを書いていて思い出したこと。

WIN32OLEオブジェクトには、each メソッドが定義されています。 だから、次のように書くことができます。

fso = WIN32OLE.new('Scripting.FileSystemObject')
dummy_path = fso.GetAbsolutePathName('dummy.txt')
shell=WIN32OLE.new('Shell.Application')
fi2 = shell.NameSpace(dummy_path).ParentFolder.ParseName(shell.NameSpace(dummy_path).Title)
verbs = fi2.verbs
# verbs.each (WIN32OLE#each) を使う
verbs.each do |verb| 
  puts verb.name
end

でも、WIN32OLEクラスは、Enumerable をインクルードしていません。 だから、次のように書くことはできません。

fso = WIN32OLE.new('Scripting.FileSystemObject')
dummy_path = fso.GetAbsolutePathName('dummy.txt')
shell=WIN32OLE.new('Shell.Application')
fi2 = shell.NameSpace(dummy_path).ParentFolder.ParseName(shell.NameSpace(dummy_path).Title)
verbs = fi2.verbs
# verbs.find (WIN32OLE#find) は使えないからエラー。
shortcut = verbs.find {|verb| 
  /.*\(\&S\)$/ =~ verb.name
}

WIN32OLEは each メソッドを定義してるんだから、WIN32OLE は Enumerableをインクルードすりゃいいじゃんと思われるでしょう。 ですが、そうすると、元々存在している find メソッドが再定義されてしまい使えなくなることがあるのです。 例えば、Excelなんかには、RangeクラスにFindメソッドが元々あるので、Enumerable#findとぶつかるのですね。 そうすると、次のようなちょっとややこしい状況が起こるのです。

Range.Find とやると元々あったExcelのFindメソッドが呼ばれます。 ところで、VBでは、メソッド名の大文字、小文字は区別されません。 Win32OLEの世界でも、それは同じです。 ExcelのFindメソッドを呼ぶつもりで、Range.find と書くこともできます。 ここで、Enumerableをインクルードしていると、Range.Findを実行するつもりで、 Range.findと書くとRubyのfindが呼ばれるというややこしい状況になったりします。

なので、Enumerableをインクルードしていないのです。

しかし、そういう状況を理解していれば、Enumerableをインクルードしたって何の問題もないのです。 実際には、extendを使うのが現実的な解になります。 次のように書くと、find が使えるようになります。

fso = WIN32OLE.new('Scripting.FileSystemObject')
dummy_path = fso.GetAbsolutePathName('dummy.txt')
shell=WIN32OLE.new('Shell.Application')
fi2 = shell.NameSpace(dummy_path).ParentFolder.ParseName(shell.NameSpace(dummy_path).Title)
verbs = fi2.verbs
# 理解した上で、Enumerable を extend
verbs.extend(Enumerable)
# 今度は問題なし
shortcut = verbs.find {|verb| 
  /.*\(\&S\)$/ =~ verb.name
}

そんなことをつらつらと思い出してしまいました。


8月14日()

 『知識ゼロから学ぶソフトウェアテスト』(高橋寿一)

タイトル通りソフトウェアテストの入門書。 テストの理論や理想を説明するのではなく、 現場での経験を元に、現実的なソフトウェアテストについてわかりやすく解説した本。

「基本的にテストケースはどう書いてもいい。」と一刀両断しつつ、 テストケースの具体例を挙げて書き方のポイントを説明したり、 テストの自動化がうまくいかない場合があることを強調するなど、実践的で具体的。

 『すごい会議』(大橋禅太郎)

すごいやり方』と一部内容が重なります。 全部で5章あるのだが、そのうち最初の2章は、「すごい会議」と関係ないけど面白い。 短いので、さらっと読めます。


8月13日()

 『Lepton先生のネットワーク技術勉強会』(Lepton)

ネットワークとは何かから始まって、Ethernet、TCP/IPあたりまでを丁寧に非常にわかりやすく解説している本。 ネットワーク初心者が最初に読む本としてオススメ。

全体が9章に分かれていて、1章1日分としている構成がいい。 また、解説と会話が交互に出てきて、初心者にはとっつきやすいと思われる。

9章が、ちょっと詰め込み過ぎで、それぞれのトピックの解説がほんのちょっとだけになってしまったところが残念。

表紙のキャラクターを見ると非常に微妙な感じがしないでもないですが(←日本語になってない)中身はわかりやすくて丁寧です。

 [Ruby][Win32OLE] InvokeVerb を何とかする

1.9の最新版に、WIN32OLE_VARIANT クラスを追加しました。

手元で、

require 'win32ole'
file="d:\\win32ole\\test.html"
shell=WIN32OLE.new('Shell.Application')
arg = WIN32OLE_VARIANT.new("編集(&E)")
shell.NameSpace(file).ParentFolder.ParseName(shell.NameSpace(file).Title).InvokeVerb(arg)

と実行してみたら、編集がちゃんと動いているようです。

上の例を

require 'win32ole'
file="d:\\win32ole\\test.html"
shell=WIN32OLE.new('Shell.Application')
shell.NameSpace(file).ParentFolder.ParseName(shell.NameSpace(file).Title).InvokeVerb("編集(&E)")

としても「開く」を選択したときと同じ動きにしかならないのは、今までと同じです。 ちなみにWIN32OLE_VARIANTを使って同じようにダメな動きをさせるには、

require 'win32ole'
file="d:\\win32ole\\test.html"
shell=WIN32OLE.new('Shell.Application')
arg = WIN32OLE_VARIANT.new("編集(&E)", WIN32OLE::VARIANT::VT_BSTR|WIN32OLE::VARIANT::VT_BYREF)
shell.NameSpace(file).ParentFolder.ParseName(shell.NameSpace(file).Title).InvokeVerb(arg)

とします。

テストスクリプトにも、この辺のものをつけ加えておきたいところなのですが、 「編集」なんてモロに日本語だし、どうすればいいんだか。 WIN32OLE_VARIANTクラスについては、まだまだ、改良の余地がありそうです。 とりあえず、最低限の機能だけ動くようになったので、コミットしました。

1.8へのバックポートは、今のところ予定してません。まだまだ、実験段階ですから。


8月12日(金)

 『春期限定いちごタルト事件』(米澤穂信)

高校を舞台にした日常の謎の連作短編。 「おいしいココアの作り方」のああでもない、こうでもないと推理する過程が楽しい。

 [Ruby] Cygwin環境でMingw版Rubyを作るとき

こういう問題に遭遇したので、

configure --build=i686-cygwin --host=i386-mingw --target=i386-mingw

としていたのだけど、RubyのないCygwin環境で、いきなり実行するとコンパイルできません。 クロスコンパイル扱いになるので、ruby.exe があらかじめないとコンパイルができないのです。

順序としては、

  1. Cygwin環境で、cygwin版Ruby (ruby.exe) を作る。

  2. Cygwin環境で、mingw版Rubyを作る。

としないといけません。

ruby.exe を消した後で、Mingw版を先に作ろうとして、しばし悩んでしまいました。

 [Cygwin][Ruby][Win32OLE]

Cygwin に splint が含まれていることに気づいたので、win32ole.c を評価しようとしたけど、壁が大きくて挫折。


8月6日()

 『てるてるあした』 (加納朋子)

ささらさや』に続くシリーズ。 前作のようなミステリらしさはほとんどありません。 中学を卒業したばかりの少女の成長物語です。 舞台は、前作と同じだし、サヤをはじめ、登場人物も前作と同じ。 唯一違うのは主人公が、中学を卒業したばかりの少女だということ。 わりとありがちな展開で予想がつく分だけ、ちょっと醒めてしまうけど、じーんとくる話です。 登場人物とか舞台設定とかは同じで、また別の物語を読んでみたい。

 [Ruby][Win32OLE] 取り外し不可

WIN32OLE_EVENTで、イベントハンドラを設定できても、外すことができない([ruby-talk:150845])のは どうひいき目に考えても、設計上のバグとしか言えない...。

さらに、

win32ole_event_obj.on_event { handler1() }
win32ole_event_obj.on_event { handler2() }

だと、handler2が有効で

win32ole_event_obj.on_event('foo') { handler1() }
win32ole_event_obj.on_event('foo') { handler2() }

だと、handler1が有効っていう実装上のバグまであるよ...。


8月1日(月)

 TechED 2005

一緒に行く人と同じコマを受けないように調整(別に同じでもいいとは思うんだけど、せっかくなので)。

 [Ruby][Win32OLE] InvokeVerbを何とかする

えーと。新たに、WIN32OLE::VARIANTクラスを導入します。

str = WIN32OLE::VARIANT.new("印刷(&P)")
shell.NameSpace(file).ParentFolder.ParseName(shell.NameSpace(file).Title).InvokeVerb(str)

とやると動くというのでどうだろうか。

コンセプトはPerlのWin32::OLE::Variantと同じようなもんです。 コンセプトは同じですが、メソッドは、Value()ぐらいだけ用意します。 どうしても必要だと感じたら、そのときに追加します。 また、引数の順番はPerlのWin32::OLE::Variantとは違っていて、第2引数が型です。 省略時は、Win32OLEでやっている型変換がそのまま使われます。 上の例だと、

str = WIN32OLE::VARIANT.new("印刷(&P)", WIN32OLE::VARIANT::VT_BSTR)

としたのと同じになります。 InvokeVerbを呼び出すときには、何の工夫もせず、そのまま値渡しで呼び出します。

参照渡しにしたいときは、

str = WIN32OLE::VARIANT.new("印刷(&P)", WIN32OLE::VARIANT::VT_BSTR|WIN32OLE::VARIANT::VT_BYREF)

とします。

この辺は、これまで、Perlとは違うコンセプトでやってきたのですが、InvokeVerbを何とかするには Perlと同じコンセプトを導入する必要があるんじゃないかと感じ始めています。 1.9には、そう遠くない将来、WIN32OLE::VARIANTクラスができるかも知れません。


[トップページへ] [7月] [9月] [過去の雑感へ]