またこの方から改訂版が送られてきた。 パワフルな人だ。素直にそのまま取り込むことにした。
さらにこの方の情報によれば、 PerlのOLEでもinvokeのテストは駄目だそうだ。 つまり、一筋縄ではいかないということだ。
・・・結局私は何もやってないような。 いや、やってはいるんだけど、空回りしてるというか。
間違えてソースをかけた。
動かなかったExcelのテストは動くようになった。
invokeを使った引数つきプロパティ設定のテストに失敗するようになった。
今の私の力では同時に2つのテストに合格するようにできない。 invokeのテストはあきらめることにした。 Excelのテストに合格するようにしたWin32OLEを 0.2.5としてリリースしよう。
やっと読み終えました。 英語が苦手なので原書は入り口で挫折。 翻訳の方も(自分のことは棚にあげます)文章がわかりにくかった。 XPでは「わかりやすいのはいいことだ」とされてるのに。
ruby-listで指摘されたので、修正する。
ふと思いついて、erbを使ってみる。 更新日とかソフトのバージョンとかサイズとか いちいち入力するのが面倒なのでerbを使って自動生成するようにしてみた。 これで更新漏れが減ることを期待している。
でもって一部のページの構成を見なおしました。 直接リンクしていただいている場合は修正をお願いします。 ごめんなさい。
ruby/rubyunit/rubyunit_j.html => ruby/rubyunit/index.html
ruby/rubyunit/rubyunit_e.html => ruby/rubyunit/index_e.html
ruby/rubywin/rubywin01.html => ruby/rubywin/index.html
をWindowsにインストール。 環境は、ruby 1.6.3 (2001-02-20) [i386-mingw32] Raccのインストールが途中でこけるので手動でインストール。
cygwinでtelnetデーモン立ち上げて、telnetでログインして mingw32版rubyを使うという変則的なことをしているので こける原因を追求するのはあきらめる。
RDは特に問題なく動きました。
そういえばいつの間にか Ruby は 1.6.3 になってます。
Win32OLE のREADMEの英語が間違っていると指摘されたので修正。
日本語もそこそこ扱えるようになったRubyWinですが、テストが不十分です。 そこで積極的にRubyWinを使う機会を増やしてみようと考えてます。 まずは、この雑感をRubyWinを使って書いてみたりとか。
それにしても全部RubyWinで抱え込んだのでファイルサイズが大きくなりました。
zipで圧縮したソースが700KB超えてます。
gcc -bmingw
でコンパイルしたRubyWin.exeは500KB超えます。
Shift-JIS と JIS変換だけのためにnkfを丸ごと抱え込むというのはやり過ぎか。
しかも日本語を入力するとスクロールとかやたらと遅くなります。 日本語用エディタとしては駄目です。使えません。 まあ、元々エディタを作ろうとしていた訳では無いからいいか。
RubyWinは以前よりも日本語を扱えるようにはなりましたが、 他力本願で実装したので、私は、その処理内容を一切理解してません。 ちょっと日本語処理も知っておいた方がいいかと思う今日この頃。
後は、JISコードの変換。
JIS <=> Shift-JIS <=> UTF8
という方式でやってみることに。 変換には、nkfを利用。 nkf1.9を入手してたので、このソースと、 Ruby本体のnkf拡張ライブラリのソースを比較しながら眺める。 初めて知ったけど、nkfのオリジナルソースは、 最初からPerlの拡張モジュールも作れるようになってるようだ。 で、Rubyの拡張ライブラリはこれをお手本としているみたい。 そこで、RubyWinでも拡張ライブラリのソースをお手本にすればできそう。 nkf1.9 + Ruby用拡張ライブラリ ext/nkf.c + 私の修正 で Shift-JISとJISコード変換機能ができあがり。 やっぱり他力本願。
続けて行末処理。
RubyWinで行末(EOL)がLFのファイルを読んでも改行するとそこだけCRLFになってしまう。 そこで、行末を判定してCRLFかLFかCRかを切り替えるように変更。 元々、Scintillaには、そのための機能が用意されている。
SendMessage(hwnd, SCI_SETEOLMODE, SC_EOL_CRLF, 0); SendMessage(hwnd, SCI_SETEOLMODE, SC_EOL_LF, 0);
なんて感じで簡単に切り替えができる。またしても他力本願。
Shift-JIS と UTF8の変換組み込み完了。 文字コードの判別は、JVimを流用。 Shift-JISとUTF8の変換はuconvを流用。 調子に乗ってEUCとUTF8の変換も組み込む。 すべて他力本願。
せめてShift JISには対応したいと思っていたので、いろいろ調査。
RubyWinが利用しているScintillaは Shift JISだと日本語の入力や表示がうまくいかないので 今はUTF-8になってます。 (ScintillaでShift JIS(CP932)コードをうまく扱う方法をご存知の方は教えてください。)
で、Shift JISを扱うには、
文字コードを判断して
Shift JISならUTF-8に変換して読み込み、UTF-8からShift JISに変換して出力する。
ようにすれば、読み込みと書き込みはできます。
後は、スクリプトを実行するときに$KCODEまで変更するかどうかとか、 その辺をちょっと考えないといけないのですが。
RubyでUTF-8のコード変換といえばよしだむさんのuconv。 ということでソースを眺める。 Shift JISとUTF-8の変換はこれを利用できそう。 うーん。JISとUTF-8の変換がない。 まあでも、それは、nkf拡張ライブラリのソースを見て JISとShift JISを相互変換すればいい話だし。 あっ。文字コードの自動判別もサポートしてないのか。
そこで、JVimのソースを眺める。
judge_jcode
なるいかにもそれらしい名前の関数があったので、
ちょっといじってみる。自動判別にはこれが使えそう。
1.9というのがリリースされている。2.0ではunicodeに対応する(予定)らしい。
class Foo class Bar end end
をCレベルで実現するには、
VALUE rb_cFoo; VALUE rb_cBar; rb_cFoo = rb_define_class("Foo", rb_cObject); rb_cBar = rb_define_class_under(rb_cFoo, "Bar", rb_cObject);
とします。
module Foo class Bar end end
をCレベルで実現するには
VALUE rb_mFoo; VALUE rb_cBar; rb_mFoo = rb_define_module("Foo"); rb_cBar = rb_define_class_under(rb_mFoo, "Bar", rb_cObject);
とします。さらに
module Foo module Bar end end
を実現するには
VALUE rb_mFoo; VALUE rb_mBar; rb_mFoo = rb_define_module("Foo"); rb_mBar = rb_define_module_under(rb_mFoo, "Bar");
とします。 クラスを定義する方が引数の数が1つ多いのは、親クラスを指定するからです。 モジュールは親クラスを持たないので引数の数が1つ少なくて済むわけです。
いろいろとあれこれ試行錯誤している間に、 メールをくれた当の本人 から改訂版win32ole.cが送られてきた。 しかも私が書いていたコードよりもかなりスマート。 ありがたく、これを利用させてもらうことにした。
バグレポートをもらったので対処する。
data = gets p data
こんなのを実行して、"abc" と入力すると オリジナルのRubyでは "abc\n"となるのに RubyWinでは"abc\r\n"になってしまっていたのを修正。 これでまた一歩オリジナルRubyに近づいた。 バグレポートを下さった方は、プログラミングの先生をされているようで、 RubyWinは授業で使われている模様。
元々プロパティは、
oleobj['Property'] = value
って感じで設定できるので、引数があるプロパティは
oleobj['Property', 1, 2] = value
てな感じで書けるといいかも。で、昨日の例だと
sheet['Cells', 1, 2] = 10
てな具合になります。 ということで、まずは、Rubyがこの表記を受け入れてくれるかどうか実験。
$ cat oleobj.rb class OLEOBJ def []=(x, *y) value = y.pop options = y.join(",") puts "[#{x}, #{options}] = #{value}" end end oleobj = OLEOBJ.new oleobj['Cells', 1, 2] = 10 oleobj['Cells'] = 10 $ ruby oleobj.rb [Cells, 1,2] = 10 [Cells, ] = 10
Rubyレベルでは大丈夫なようなので、Win32OLE(Cレベル)でも大丈夫そうだ。
DCOM対応をどうすればいいのか調査。
CoCreateInstanceEx
を使うらしい。でもってこの関数がWindows 95でもOKなのか調べる。
VC++では、-D_WIN32_DCOM オプションをつけてコンパイルするといいみたいだ。
Cygwinでは、CoCreateInstanceEx
がみつからず、リンクエラーになる。
とりあえず、VC++限定?
実は、Win32OLEもMingw(Cygwin + bmingw)がメインの開発環境になっているのでちょっと複雑な気分。
「引数つきのプロパティの設定はできないの?」
と直接メールで問い合わせがきた。
引数つきのプロパティって良く知らなかったのでruby-listで聞いてみる。
単純にinvoke
を起動しても駄目らしい。
そこで適当にole_setproperty
をでっちあげてみるが、これでいいのか確認する手段が無い。
とりあえず公開して誰かに試してもらおう。
ひょんなことから、Tokyo Perl Mongersの人に極道編の著者だとばれてしまう。
VMwareの紹介があって、なんかすごく欲しくなりました。
昼頃、私は帰ったのですが、既にサイン本は完売でした。 買ってくださった皆様ありがとうございました。
Tokyo Perl Mongers の展示って何をしてるんだろうと思って覗いたらクイズをやってた。
「挑戦してみますか?」
と聞かれたので、自分が極道編の著者であることは内緒にしたまま
「Perl じゃなくて Ruby しか使ってないんだけど。」
と断ってから挑戦。結果は、最初から2問連続不正解で惨敗。
Ruby関連の何人かの方にお会いできたので良かったです。 誰も来てくれなかったらどうしようと思っていたのでほっとする。
アスキーの人にも会えたし、○○さんが○○だとか、○○さんは実は○○だとか いろいろわかって楽しかった。
Ruby WorkshopやPerl/Ruby Conferenceでお世話になったSさんに遭遇。 会えるとは全く予想してなかった分、嬉しかった。
「何か喋りませんか?」
と誘われたのだけど、何も準備してないので断る。
次のWindowsはXPらしい。ついでにOffice XPだとか。 XPというとeXtreme ProgrammingじゃなくてWindowsのことだと思う人が増えるんだろうな。 うーむ。
Windows XP は
ペアプログラミングで開発されている。
短期リリースを基本とし、毎週Service Packがリリースされる。
WinUnitというWindows XPテスティングフレームワークが標準添付され、 GUIの自動テストが完璧にできる。
...というのは大嘘です。
英語は苦手なので疲れる。 英語から逃げてたんだが、とうとう逃げられなくなったみたいだ。
えーと、2、3日前に読んだ誰かの日記の情報。
w3mで"u"とか"c"とか入力すると一番最後の行にURLが表示されます。 で、この表示秒数がハードコーディングされていてソースを変更すれば表示時間が長くなるらしいです。
これはいいことを読んだと思い時間が取れたので、ソースを調べてみました (私ももうちょっと長い時間表示して欲しいと思うことがあるので)。
どうやらそれらしいのが見つかったので修正してみる。 うまく動いているっぽい。しばらくこれで使ってみよう。
どこを変更したかすぐ忘れるのでメモ代わりのパッチ。 表示時間が10秒から60秒になるっぽいです(無保証)。
次のスクリプトを実行すると問答無用でRubyWinが終了するというメールが届く。
break
調べてみたところRuby側をいじれば終了するのは避けられそう。
Ruby(ruby.exe)の場合は、上のスクリプトを実行した場合、"unexpected break" と メッセージを出してruby.exeも終了しちゃえばいい。 でも、RubyWin(rubywin.exe)の場合は、"unexpected break" と メッセージを出してもrubywin.exeは動き続けなくてはいけない。 rubywin.exeが終了することは誰も期待してない。
この違いが結構大きいんです。
GNOME Office の DiaってやっぱりこのDiaのこと?
太巻を丸かじりするのは関西だけの風習なのか。
ふう。何とかなったかな。