インストールしてみた。
configure make make install
これで、いつでもSchemeを試せる環境が整った。 あと私に必要なものは、初心者向け教科書とモチベーション。
Vine Linux にインストールしてみた。
Ruby 1.8.3
Ruby-GNOME2 0.13.0
RDtool 0.6.16
をインストールして、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)に戻りませんでした。
Windows 2000 にインストールしてみた。
諸事情から、Mingw版 Ruby 1.8.3 を使います。
Ruby 1.8.3
いつも通りにコンパイルしてインストールしました。
Glade for Windows
Glade for Windows のサイトから、 Development Environment Installer 2.6.10+rc1をダウンロードしてインストール。
Ruby-GNOME2 0.13.0
RDtool 0.6.16
Rabbit 0.0.9
この辺は、インストール手順に従ってそれぞれインストールします。 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でも使えそうです。
あえて、あまり感想は書かないで、主にどうでもいいようなことだけ。
最近、動向を注目していなかったのだが、gauche は進化している。インストールしてみようかな。
最近、動向を注目していなかったのだが、rabbit は進化している。インストールしてみようかな。
朝、ささださんとすれ違いざまに会釈した。 最初、ささださんは気づかなかったみたいだけど、 すぐに慌てて戻ってきて「すいません。気づきませんでいた。」と言われた。 ささださんは気疲れしないんだろうかと こちらが心配になるぐらいにいい人だ。
ペアプロは1時間半ぐらいやったら休憩を取らないと疲れると角谷さんから聞く。
角谷さんと、現実には、XPの理想どおりにすべてがうまくいくとは限らないというような話をした。
咳さんとプロジェクトの成功の鍵は人間関係にあるというような話をした。
須藤さんに頼まれて、咳さんの本にサインする。 「私の名前なんか書いて本当にいいんですか?」と念を押してから、咳さんの名前の下に自分の名前を書いた。 このあと、須藤さんは角谷さんにもサインを貰っていた。
私は、咳さんの本を忘れたので、サインを貰い損ねた。
私は、須藤さんの本を持っていくことを思いつかなかったので、サインを貰い損ねた。
greentea さんは、お中元を贈っているが、お歳暮を贈っていない。 お中元を贈るのは、今年で3年目で、毎年同じ品を贈っている。 (何を贈るか、結構悩んだらしい。) でも何を贈っているのか教えてもらえなかった。
あおきさんにblogのタイトルは月1回変えるのかと聞かれて、 ネタが尽きてきたので、苦しいと白状した。
私は、あおきさんの本を持っていかなかったので、サインを貰い損ねた。
うささんと挨拶したけど、何も話をできなかったのが残念。 ちょっと挨拶しただけだったので、次にお会いしたときに、顔と名前が一致するかどうか自信がありません。 ごめんなさい。(←同じことを繰り返している。謝るのは二度目です。ダメダメ。)
artonさんにWin32OLEを使っているかと聞かれたので、相変わらず使っていないと答えた。
私は、artonさんの本をまだ入手していなかったので、サインを貰い損ねた。
のら犬のローヴァーを主人公にした短編集。 犬の視点で描かれた小説。 人間に対するローヴァーたち犬の視線は皮肉たっぷりです。 人間に媚びず、したたかに生きるローヴァーが描かれます。 ミステリではないですが、語り口とか、ローヴァーの行動や考え方は、ハードボイルドそのものです。 アルバート・サムスンよりももっとハードボイルドかも。 困っている子犬や牝犬や老犬など弱い立場の犬を見るとほっておけないローヴァー。 ローヴァーは、困った犬たちを助けるために、時には人間すら利用するしたたかさを持っているのです。
お気に入りは、「タブー」。 「もうひとつやらなきゃならないこと」をきっちりやって走り去るローヴァーがかっこいいです。
1つの話がかなり短いので、空いた時間にちびちび読むのにぴったりです。
『氷菓』に続く「古典部シリーズ」第2段。 文化祭に出展するクラス製作の自主映画のラスト、密室で少年が死んでいた。 ところが、犯人はわからず、密室のトリックも明かされないまま映画は終わる。 脚本を書いていた生徒は、病気で倒れてしまい、真相は誰にもわからない。 古典部の面々がこの謎に挑む。 果たしてホータローは、トリックを見破り、犯人を指摘することができるのか?
先に読んでしまったシリーズ3作目の『クドリャフカの順番 「十文字」事件』と比べると ミステリとしての面白さは、こちらに軍配が上がります。 ただ、作品全体としての面白さ、出来の良さでは、3作目の方が上です。
別にネタバレはしてないですが、あとがきは、本編を読まれてから読んだ方がいいと思います。 (私は、先に読んじゃったので、ホータローは、XXの役なんだろうなと思いました。結局、その通りでした。 話の途中で、タイトルから考えても、YYが、ZZの役回りなんだろうと思いました。そこは微妙に違ってましたが。) また、シリーズ未読の方はシリーズ1作目から順番に読んだ方がいいでしょう。
最後の台詞は、作者自身の台詞?
Win32OLEから、InvokeVerbを使えるかテストするためのスクリプトをRuby1.9に追加した。
テストのやり方は、次の通り。
テスト用の一時ファイル dummy.txt を作成する。
dummy.txtをエクスプローラーで右クリックしたときに表示されるメニューから、「ショートカットの作成」に相当すると思われる文字列を取得する。
取得した文字列から、WIN32OLE_VARIANT オブジェクトを生成する。
InvokeVerbを実行する。
ショートカットができていることを確認する。
ショートカットを削除する。
dummy.txtを削除する。
1と2がテストの下ごしらえで、3、4、5がテストで、6、7、が後片づけ。
日本語版Windows2000だと「ショートカットの作成」となるが、他の言語のWindowsだとどんな文字になるのかわからない。 そこで、右クリックしたときに表示される文字列の中から最後が"(&S)" で終わるものを見つけることにした。 というのが、2でやっていることです。
1で作ったファイルのフルパスとできたショートカットが指しているファイルの フルパスが一致するかどうかを確認するのが、5でやっていることです。
上のテストスクリプトを書いていて思い出したこと。
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 }
そんなことをつらつらと思い出してしまいました。
タイトル通りソフトウェアテストの入門書。 テストの理論や理想を説明するのではなく、 現場での経験を元に、現実的なソフトウェアテストについてわかりやすく解説した本。
「基本的にテストケースはどう書いてもいい。」と一刀両断しつつ、 テストケースの具体例を挙げて書き方のポイントを説明したり、 テストの自動化がうまくいかない場合があることを強調するなど、実践的で具体的。
『すごいやり方』と一部内容が重なります。 全部で5章あるのだが、そのうち最初の2章は、「すごい会議」と関係ないけど面白い。 短いので、さらっと読めます。
ネットワークとは何かから始まって、Ethernet、TCP/IPあたりまでを丁寧に非常にわかりやすく解説している本。 ネットワーク初心者が最初に読む本としてオススメ。
全体が9章に分かれていて、1章1日分としている構成がいい。 また、解説と会話が交互に出てきて、初心者にはとっつきやすいと思われる。
9章が、ちょっと詰め込み過ぎで、それぞれのトピックの解説がほんのちょっとだけになってしまったところが残念。
表紙のキャラクターを見ると非常に微妙な感じがしないでもないですが(←日本語になってない)中身はわかりやすくて丁寧です。
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へのバックポートは、今のところ予定してません。まだまだ、実験段階ですから。
高校を舞台にした日常の謎の連作短編。 「おいしいココアの作り方」のああでもない、こうでもないと推理する過程が楽しい。
こういう問題に遭遇したので、
configure --build=i686-cygwin --host=i386-mingw --target=i386-mingw
としていたのだけど、RubyのないCygwin環境で、いきなり実行するとコンパイルできません。 クロスコンパイル扱いになるので、ruby.exe があらかじめないとコンパイルができないのです。
順序としては、
Cygwin環境で、cygwin版Ruby (ruby.exe) を作る。
Cygwin環境で、mingw版Rubyを作る。
としないといけません。
ruby.exe を消した後で、Mingw版を先に作ろうとして、しばし悩んでしまいました。
Cygwin に splint が含まれていることに気づいたので、win32ole.c を評価しようとしたけど、壁が大きくて挫折。
『ささらさや』に続くシリーズ。 前作のようなミステリらしさはほとんどありません。 中学を卒業したばかりの少女の成長物語です。 舞台は、前作と同じだし、サヤをはじめ、登場人物も前作と同じ。 唯一違うのは主人公が、中学を卒業したばかりの少女だということ。 わりとありがちな展開で予想がつく分だけ、ちょっと醒めてしまうけど、じーんとくる話です。 登場人物とか舞台設定とかは同じで、また別の物語を読んでみたい。
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が有効っていう実装上のバグまであるよ...。
一緒に行く人と同じコマを受けないように調整(別に同じでもいいとは思うんだけど、せっかくなので)。
えーと。新たに、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クラスができるかも知れません。