すべての道は3月に通ず

2001年3月
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

31日 土曜

おっ、今月は珍しいことに一日も休まずに日記を書いたぞ。ミゾレ気味で、本当に寒かった。

Ruby/Gtkの動的なクラスの拡張

わーい。取り込んでもらえる事になりました。

mo.rb

10分ハック。gettextによる翻訳で使われるMOファイルを読むためのクラス。gettextってrubyっぽくないんで、rubyっぽいクラスを後で作るための材料として作った。エラー処理をしていないんでアレゲかもね。

Project X 〜 KAMEプロジェクト

やっぱ、必見ですよね〜 というわけで、リクエストしてみました。本当にやってくれたら嬉しいな〜

30日 金曜

今日は寒かったです。

魅惑の似非科学

うさん臭いのが好きってのもあるけど、こういうセンスは好きだなぁ。 サーバ管理者日誌より

Ruby/Gtkの動的なクラスの拡張

パッチを投げたけど反応無いな〜

地球温暖化防止の京都議定書支持せず 米政府が正式表明

ブッシュ大統領は、これまでも、カリフォルニア州の電力自由化に関して「環境規制などのために発電能力を最大にできないのも問題だ」とか言ってたし、ダボス会議の環境問題の分科会でも参加者から「ブッシュ政権は経済活動を優先して環境対策を後回しにするのではないか」という意見が多く出ていたそうだから、いまさら驚くような事でもないけど、なんかねー まあ、オイルマン政権の力学って感じっすかね。

マスター・キートン

キッズステーションで、「穏やかな死」を見た。毎回見てるけど、今回のは特に良かったね。ストーリーも良かったし、伏線も絶妙だった。本当に質が高い。

29日 木曜

春だね〜と思っていたら、今日は天気が一転して、冷たい雨の一日になった。

ProjectX 〜 挑戦者たち」っていつまでやるのかしら。KAMEプロジェクトとかやってくれないかな〜

さくら

「さくら銀行」の名前もあと数日で消える。三井・住友銀行になるのだが、聞いてみると、将来は実質的には住友しか残らないそうだ。なんとなく寂しいな。

locale

libstdc++にlocaleヘッダが含まれていない事に気が付く。libstdc++のバージョンは2.95.2。そうか、以前にlocaleヘッダがあると思ってたのは、もっと新しいβバージョンだったのかな。

そういえば、libstdc++-v3 FAQ

- codecvt rewritten. Includes codecvt,
  codecvt. In addition,
  implementation-defined conversions using iconv are now supported with
  the __enc_traits partial-specialization of the State template
  parameter of the codecvt class. In this manner, conversions between
  encodings such as UCS4, USC2, UNICODE, UNICODEBIG, UNICODELITTLE, etc
  can be performed.

と書いてある。うふふ。楽しいけど、iconvの代わりに使うには移植性に欠けてるんだよね。(iconvだってそうポータブルではないけど。:-P)

Gimp Users Ring のナビゲーションバー投票

思ってたよりも集まらなかったので、あまり終了したくなかったのですが、 いつまでも続けるわけにはいかないですし、いいかげん終了します。

ナビゲーションバーの集計結果は、
・「いっちーさんのGIMPのウィンドウを元にしたもの」4票
・「でんぷんさんので色を自由に選べる」2票
でしたので、いっちーさんのに決めました。
投票していただいた皆様、どうもありがとうございました。ページ等はこれから更新しますんで、参加サイトの方も後程更新をお願いいたします。

あ、そうそう、幾つか面白い意見があったので紹介しておきますね。

ところで、バナーについては今回は決めませんでしたが、バナーもこちらで正式に決めた方が良いのでしょうか?

28日 水曜

整数問題

ありゃりゃ、そんな方法があったんだ。わー。

Gimp-Ruby

PixelRgnがおっけーになった。vinvert.cを翻訳して動作を簡単に検証。

27日 火曜

N先生に面白い話をいくつか聞いた。口止めされてるのでここには書かないけど。

表現の自由(ウソ)

表現と副作用について、「副作用を免れた言語を持ち得ないことから、我々は表現について必然的に自由ではない」と言えるかも。(笑) \

とよしまさんのWin32 のおはなし

確かに面白いです。(「電波とどいた?」より)

あんま関係ないけど、こないだのGIMPユーザのオフ会でもちょっと出た話だからついでに書いておこう。MSって、バグとかセキュリティーホールとか実装面では屑だけど、DCOMとか.NETとか目指している方向性ってのは結構正しいと僕も感じてます。結局、GNOMEKDEもそれらを再実装することを目指していると言えないこともないし。

地雷ZEROキャンペーン

地雷の悲惨さってのはわかるけど、現状で地雷がなくなったら、より安価で、より効率的な殺戮が可能で、より人道的な兵器が開発されて取って代わるだけだね。でも、こういうキャンペーンは本当にそんな未来を望んでいるのだろうか?

地雷は悲惨だ。でも、悲惨だからこそ戦争への抑止力として働いているって面もあるのよ。ひとたび戦争になったら、国境線に地雷が敷き詰められ、何年にもわたって人を傷つけ続ける。だからこそ、どっかの独裁者だって戦争をためらうのよ。(少しはね) それを忘れちゃいけない。ベトナム戦争でアメリカの反戦運動が盛り上がったのは、アメリカ兵の血が流されてからだった。湾岸戦争に至っては、お茶の間でピンポイント爆撃の映像が流されるにいたった。戦争の悲惨さは僕等の前からどんどん隠蔽されてゆく。でも、戦争はどこか遠い世界の悲劇じゃない。同じ人間がこの地球で血を流しているんだ。僕等は今そういう感覚を失いつつある。思えば、戦争が悪だという概念が確立されたのは近代に入ってからだった。これからは一体どうなるのだろうか。

地雷をなくすことはそれはそれで尊いものだろう、でもそう簡単に口にできるような軽薄なものでもないはずだ。俺も「世界は苦しみながら、平和な世界へ移行しようとしている」と信じているが、それをなすのは盲目的な人道主義ではないだろう。

うーん。うまく書けないな〜

メモ: Ruby/Gtk

要するにこんな感じ。(パッチを作成中。)

VALUE gtk_type_hash;

VALUE
get_gtk_type(gtkobj)
    GtkObject *gtkobj;
{
    GtkType gtype;

    for (gtype = GTK_OBJECT_TYPE(gtkobj);
         gtype != GTK_TYPE_INVALID && gtype != GTK_TYPE_NONE;
         gtype = gtk_type_parent(gtype))
    {
        VALUE klass = rb_hash_aref(gtk_type_hash, INT2FIX(gtype));
        if (!NIL_P(klass))
            return klass;
    }

    return Qnil;
}

ら・ぷらす

公文の「ら・ぷらす」というのに入ることにした。フランス語で広場という意味らしい。

26日 月曜

メモ: Ruby/Gtk

get_gtk_typeの動作が固定なんで、外部から拡張しにくい。GtkTypeをキーにしたRubyのクラスのハッシュを用意しておいて、GTK_OBJECT_TYPE(obj)から、gtk_type_parentでGTK_TYPE_INVALIDかGTK_TYPE_NONEになるまでたどりながらこのハッシュを索くってのが拡張性があって良いなぁ。

経済

株価も1万3千円台にもどったし、円安は米国景気に引きずられた一過性なもの? でも、日本も今円安の方が都合がいいんだろうな…

米経済は、あんだけ個人投資家が買っていた株の株価が一気に下がったわけだから、大減税してもそう簡単に消費が回復することはないような気がするが…どうだろう。まあお手並拝見。

ピースメーカー / The Peace Maker

テレビでやってたんで、ピースメーカー見た。平和の仮面をかぶった死の商人たちが紛争の影で何をやっていたか知らないときっと理解できないだろうな。現実は「白か黒か」なんて単純じゃない。それにしても音楽が秀逸だったな。

25日 日曜

¥が下がり続けて(T_T)。ああ、ホントに根拠レスだったな。見通し甘かったです。これもね。

元3組のメンバで宴会

高校の時のクラスのみんなとエソカイ。みんな変わってなくて、懐かしかった。(つうか、相変わらずハイテンション杉っすよ。) 何だかんだ言って、みんな大学決まってたし、留学する人もいて、みんな羽ばたいて行くんだな〜とか感慨深い。余談だけど、某O山氏のその後を聞いてかなりショックだったよ〜

あと、この日記の隠れファン(?)が何人かいることを知って少し驚いた。読んでるんならメールでもくれれば良いのに。(「読んだよ。」とかだけでもいいんで。)
つうか、勝手に他人のパスワード解析とかに総力上げたりしないでくらはい \ > 某M氏

24日 土曜

朝起きれなくて帰省できなかった。(T_T)

Gimp-Ruby

昨日のやつバギー杉。やっぱ、駆け込みで色々変更するとろくなことがないな。

前もって用意しておいたShelfオブジェクトを使ってパラメータを保存するようにした。明日こそはTileとPixelRegionを…

http://www.xfree86.org/pipermail/i18n/2001-March/001376.html

色々事情はあるんだろうけど、また互いの不信感を増すだけのような…

23日 金曜

背骨のなかほど辺りが痛い。成長痛かな?

Gimp-Ruby

新しいスナップショットを出した。まだまだ変更したい部分があるので、Win32でチェックするのはそれからかな。

22日 木曜

慶應の三田キャンパスまで行って入学手続きをしてきた。行きは良かったのだが、帰りに迷ってJR田町駅まで40分くらい(行きは10分)かかってしまった。万歩形を持って行けば良かったな。電車の振動も合わせて5000歩くらいはいったんじゃないだろうか? わはは。

チカとScarletとミーチング。一応プロジェクトは立ち上がったのかな…

プリチー

  .~.
  /V\
 //Y\\
/(_|_)\
 ^^ ^^

Gimp-Ruby

バグを沢山潰したし、色々改良できた。ただ、かなり手を入れたんで、エンバグしてそうだ。FuのGUIをうまく分割できる公算がついたので、GUIをQtとかにすげかえられるようにしてみようかな〜(笑)

あと、いい加減Tile/PixelRegionをちゃんとしなくちゃなぁ〜

21日 水曜

目が変な感じだ。これはひょっとしていわゆる花粉症?

20日 火曜

Ruby

rb_iterator_pがrb_block_given_pになっている。しかも、Changelogにも書いてないし… 互換性のためにrb_iterator_pも残しておいて欲しかったでしゅ。

Gimp-Ruby

ブラシのダイアログを開くと「Gtk-WARNING **: gtk_signal_handler_block_by_data(): could not find handler containing data (0x86324B0)」 というエラーが出る。

エソカイ

いつものメンバでエソカイ。

でも、正直あんまり楽しくなかった。カラオケが嫌いなのは置いておいても。

19日 月曜

慶應の三田校舎まで手続きしに行こうと思ったが、3時までしかやってなかったので、あきらめた。

Gimp-Ruby

別にちょっとだけ手を付けてたgckの拡張ライブラリを多少マトモにしてつっこんだ。これで、7343行。最長記録更新中。(←阿呆)

アクセス数

減ってるみたい。健全な傾向だ。

18日 日曜

Gimp-Ruby

Gtk::FontSelectionを自前で用意して、フォントをScript-Fu等と同様に選択できるようにしてみる。なかなか具合が良い。

Gimpユーザのオフ会

いよいよ今日だ。わくわく…

素敵な方ばかりでとても楽しかったです。あんな話やこんな話も聞けちゃいましたし。

17日 土曜

ごろごろ。

Gimp-Ruby

いっちーさんのところの環境でも動作したらしい。めでたい。しかし、パターンやグラデーションを選ぶと応答が無くなるというのは全く原因不明だ。Image, Drawable, Layer, Channelについてはuser_dataの使い方がlibgimpとRuby/Gtkで衝突しているのが原因だってわかっているのだけれど…

16日 金曜

一昨日にオープンしたばかりの新宿のTHE SUIT COMPANYでスーツとかを買ってきた。入学式で着るために。

それにしても、ネクタイってのは身の危険を感じる。

15日 木曜

Gimp-Ruby

久しぶりに手を付けて、ようやくWindowsで動作した。次は、Drawable, PixelRegion, Tileの扱いを改善か。

МИР

МИРが落ちてくるのは21日頃らしい。見えるのかな?

14日 水曜

うげ。何やら気持ちわるい。

13日 火曜

熱は下がった。もう一日早く医者にかかってれば、昨日は受けに行けただろうか?

12日 月曜

熱がまだ38℃ある。無理はしないことにしていたので、横国の後期は受けに行かなかった。自分で決めたこととはいえ、やるせなくて涙が出てくる…

11日 日曜

しんどい。

parted song

:-)

10日 土曜

医者に行って注射してもらったらだいぶ気分がよくなったなり。でも、そこで耳で体温測ったんだけど、36.8℃しかなくてビックリだ。行く前に脇の下で測ったらたっぷり38.7℃あったのに… でも、「体がだいぶ熱いね〜」とか言ってたから、きっとそんなもんなんだろう。ところで、体温って何?

9日 金曜

カッコントウでも飲んで一日静養していれば直ると思ってたら、夜には39.6℃まで上がった。こりゃ、インフルエンザをうつされたな。あしたはちゃんと病院に行こう。

DeCSS2

たしかに7行ですね。全然読めないけどさ。

#!/usr/bin/perl -w
# 531-byte qrpff-fast, Keith Winstein and Marc Horowitz <sipb-iap-dvd@mit.edu>
# MPEG 2 PS VOB file on stdin -> descrambled output on stdout
# arguments: title key bytes in least to most-significant order
$_='while(read+STDIN,$_,2048){$a=29;$b=73;$c=142;$t=255;@t=map{$_%16or$t^=$c^=(
$m=(11,10,116,100,11,122,20,100)[$_/16%8])&110;$t^=(72,@z=(64,72,$a^=12*($_%16
-2?0:$m&17)),$b^=$_%64?12:0,@z)[$_%8]}(16..271);if((@a=unx"C*",$_)[20]&48){$h
=5;$_=unxb24,join"",@b=map{xB8,unxb8,chr($_^$a[--$h+84])}@ARGV;s/...$/1$&/;$
d=unxV,xb25,$_;$e=256|(ord$b[4])<<9|ord$b[3];$d=$d>>8^($f=$t&($d>>12^$d>>4^
$d^$d/8))<<17,$e=$e>>8^($t&($g=($q=$e>>14&7^$e)^$q*8^$q<<6))<<9,$_=$t[$_]^
(($h>>=8)+=$f+(~$g&$t))for@a[128..$#a]}print+x"C*",@a}';s/x/pack+/g;eval

8日 木曜 晴れ

37.3℃。ちょっと無理しただけでこれだ。体力が無いと、本当に無理出来ないな〜

Gimp-Ruby

昨日書いた通り新しいスナップショットをだした。

買った本

7日 水曜 晴れ

Gimp-Ruby

昨日の続き。おっけー、おっけー。きちんとロードできるようになった。前述したような理由で、MSWin版Rubyで動作を確認しようと思ったけど、ダミーのインポートライブラリを用意するのが結構面倒だったので、Mingw版Rubyで動作確認すべく、関連づけをいじる。で、gimpを起動する・・・が、死ぬほど遅い。しかも、大半のスクリプトが一般保護法違反を起こす。この一般保護法違反の原因で一番ありそうなのは、Ruby本体に-fnative-structを指定していないのに、拡張ライブラリでは指定してコンパイルしていたて事だろう。gtk拡張ライブラリへのパッチもまとめなくちゃいけないし、次のスナップショットは明日だな。

[転載] 第一回CINEMA甲子園ワークショップのお知らせ

一応転載しておこう。

Subject: [cinema-kousien] 第一回CINEMA甲子園ワークショップのお知らせ
From: "Yuki Sato" <yuki-s@yhb.att.ne.jp>
To: <groodio@egroups.co.jp>
Cc: <cinema-kousien@egroups.co.jp>
Date: Mon, 5 Mar 2001 13:08:12 +0900
Reply-To: cinema-kousien@egroups.co.jp
X-Mailer: Microsoft Outlook Express 5.50.4133.2400
Mailing-List: list cinema-kousien@egroups.co.jp; contact cinema-kousien-owner@egroups.co.jp
List-Unsubscribe: <mailto:cinema-kousien-unsubscribe@egroups.co.jp>

拝啓
 
春光天地に満ちて快い時候、皆様方も益々ご健勝の事と存じます。
私どもCINEMA甲子園実行委員会も6月の開幕に向けて、全力で頑張って
おります。

さて、来る3月30日・31日に中学生・高校生を対象に第一回のCINEMA
甲子園ワークショップを開催することになりました。DVカメラに触れたこと
のないような中学生、高校生の方々に映像制作の楽しさを味わっていただ
けたらと思っております。

なお、参加費は無料となっております。皆様、奮ってご参加ください。

以下に詳細をお知らせします。
なお、http://www.groodio.com/cinema/workshop.html からもワークショップの
ご案内をしておりますので、こちらもぜひのぞいてみてください。

------------------------------------------------------------
◇◇◇第一回CINEMA甲子園ワークショップのお知らせ◇◇◇
  ♪♪ついにC甲がワークショップをやるって本当?!♪♪
         ええ!?しかも、無料なの?!?!

■日時
3月30日(金)・31日(土) 10:00 −− 17:00 
※できるだけ両日参加でお願いします。

■場所
神奈川大学附属中・高等学校 コンピュータルーム
(JR横浜線中山駅より徒歩15分、あるいは相鉄鶴ヶ峰駅からバスで20分)

■参加資格
中学生または高校生 
※DVカメラ操作やパソコンの経験は問いません。

■プログラム概要
*一日目:「カメラワーク入門講座」
 
カメラ操作、撮影の仕方などを講師の方による講義とフィールドワークを通して
学びます。午前中の講義では、DTV概略、カメラ操作の基本などを学び、午後
はフィールドワークとしてあるテーマにしたがって、映像を撮りに行きます。
撮影場所は神奈川大学附属中・高等学校及び中山駅周辺を予定しています。

*二日目:「映像編集入門講座」

iMacのiMovieを使って、基本的な映像編集の操作を学びます。講師の方から
基本的な操作の講義を受けたあと、前日に撮影した映像を実際に編集してみま
す。そして、各班ごとに3分から5分の映像作品を制作。その後、上映会を行い
ます。

30〜40名程度の中・高校生を3,4人のグループに分け、各グループは3〜5分の
映像作品を制作します。各班にビデオカメラを1台貸し出し、最低1名のインストラ
クター(CINEMA甲子園学生スタッフ)をつけます。

■当日必要なもの
・昼食
・筆記用具
・交通費

■参加方法
http://www.groodio.com/cinema/workshop.html  からお申し込みできます。

または、お名前、メールアドレス、電話番号、学校名、学年、参加可能日(30日の
み/31日のみ/両日参加 のいづれか)、DVカメラ操作経験の有無を明記の上、
yuki@groodio.com までメールをお送りください。
 
※応募につきましては定員に達しました時点で締め切らせていただきます。
 あらかじめご了承下さい。

■問い合わせ先
担当:佐藤有希(CINEMA甲子園実行委員会学生スタッフ・ワークショップ担当)
メール: yuki@groodio.com

                        
                       CINEMA甲子園実行委員会

Parted: Hurd Port

1.5.1-pre1をベースにHurdへの移植がなされました。

脳の性別診断

あなたは、非常に男性的な脳の持ち主です。 (女性でこの結果が出た人は、脳と体の性が一致していない(トランスジェンダー)である可能性があります。)

6日 火曜 晴れ

「不信任の否定は必ずしも信任ではない」

なんか、排中律否定してません? でも、その方が矛盾が少なくて良いかもね。失言もおっけーさ。(笑)

Gimp-Ruby: 退かぬ!、媚びぬ!、省みぬ〜!

gtk拡張モジュールのコンパイル方法について昨日の日記に追記。

dllwrapに--def=hogehoge.defを指定しないと、
dllwrap: no export definition file provided
dllwrap: creating one, but that may not be what you want
とか言って、グローバルなシンボルをすべてエクスポートしてくれるみたい。

それはさておき、昨日の続き。「mGimpUI = rb_define_module_under(mGimp, "UI");」で落ちているところまでわかってる。

$ ruby test.rb
B:/CYGWIN/USR/LOCAL/lib/ruby/1.6/gimpui.rb:25: [BUG] Segmentation fault
ruby 1.6.2 (2000-12-18) [i386-mingw32]

abnormal program termination

となるので、

    fprintf(stderr, "%s(): mGimp=%p; address=%p \n",
            __func__, (void*)mGimp, &mGimp);

というコードをInit_gimpとInit_gimpuiに埋め込んでみる。

$ ruby test.rb
Init_gimp(): mGimp=0256D838; address=6334A0C0
Init_gimpui(): mGimp=A30825FF; address=6F6C5F58
B:/CYGWIN/USR/LOCAL/lib/ruby/1.6/gimpui.rb:25: [BUG] Segmentation fault
ruby 1.6.2 (2000-12-18) [i386-mingw32]

abnormal program termination

値もアドレスも全然違いますよ〜 こりゃたしかに、死にますね。でも、いったい何故? 同じように

    fprintf(stderr, "%s(): rbgimp_color_get_struct=%p\n",
            __func__, &rbgimp_color_get_struct);

を埋め込んで、関数のアドレスも調べてみる。

$ ruby test.rb
Init_gimp(): rbgimp_color_get_struct=63347EE0
Init_gimpui(): rbgimp_color_get_struct=6F6C5FC0
B:/CYGWIN/USR/LOCAL/lib/ruby/1.6/gimpui.rb:25: [BUG] Segmentation fault
ruby 1.6.2 (2000-12-18) [i386-mingw32]

abnormal program termination

これも違う。なんでだ? ひょっとして、名前じゃなくて序数によるインポートになってる? んなはずないか・・・ さらに、比較のためにg_mallocとrb_obj_allocのアドレスも調べてみる。

$ ruby test.rb
Init_gimp(): g_malloc=63348750
Init_gimp(): rb_obj_alloc=633482B0
Init_gimpui(): g_malloc=6F6C62DC
Init_gimpui(): rb_obj_alloc=6F6C5FA0
B:/CYGWIN/USR/LOCAL/lib/ruby/1.6/gimpui.rb:25: [BUG] Segmentation fault
ruby 1.6.2 (2000-12-18) [i386-mingw32]

abnormal program termination

これもちがーう。こーいうもんなのかな・・・ まてよ。Delphiのデバッガにモジュールのロード状態とかを見る便利な機能があったような・・・、Delphi内でRubyを実行できないからダメか。仕方ないのでgdb。おぉ、tcl/tkのGUIがあるじゃないか。CygnusのInsight Debuggerってやつですね〜 引数付きでrunを呼び出すにはどうしたら良いか分からなかったので、結局コンソールを開いて作業をする。あー、でも、やっぱ良くわからない。

mGimpのような定数はRubyのインタプリタを経由して取得してみるか。これで同じ値が取得できなかったらもう諦めっすね。rb_const_getは使い方が良くわからないので、rb_eval_string("Gimp")。とする。

$ ruby -I. B:/cygwin/test.rb
Init_gimp(): mGimp=0256D820; address=6334A0C0
Init_gimp(): rbgimp_color_get_struct=63347F20
Init_gimp(): g_malloc=63348750
Init_gimp(): rb_obj_alloc=633482B0
Init_gimpui(): mGimp=A31425FF; address=6F6C6068
Init_gimpui():(rb_eval_string("Gimp")) mGimp=0256D820;
Init_gimpui(): rbgimp_color_get_struct=6F6C6070
Init_gimpui(): g_malloc=6F6C6344
Init_gimpui(): rb_obj_alloc=6F6C6000

今度は、gimp.so側と同じ値を得ることができた。

しばらく考えて、ひょっとしてDLLの変数のエクスポート自体に問題があるんじゃないんだろうかと考える。MSのサイトを漁って、「ただし、DLL 内に変数をインポートするには、__declspec(dllimport) を必ず使用しなければなりません。」というのを見付けた。というわけで、ちゃんと__declspec(dllimport)を使ったら、同じ値とアドレスになった。これで、あとgtk+側にも同じことをしておけば、おっけー。よしよし、これなら明日にはちゃんと出来るな。(そう願いたい)

っていうか、シェアードセクションと勘違いしてましたよ。

5日 月曜 晴れ

Ruby WM

Sawfish的なウィンドウマネージャでRubyを組み込んだものがあったら良いなと思った。誰か作って下さいよ〜

Gimp-Ruby: Windows手強すぎですよ〜(T_T)

とりあえず、普通のスクリプトから正常にrequireできるのを確かめることにする。が、手元のgtk.soは何故かgdk_imlib.dllを必要としてて、gdk_imlib.dllはインストールしていなかったので、そこで失敗。仕方ないのでgtk.soを自分でコンパイルする事にする。

とりあえず、cygwin + mingw版rubyで gtk拡張モジュールをコンパイルする方法を簡単に書いておこう。(素のcygwinではなくて、bmingwというパッケージを入れておく必要があるようなので注意。これはcygwinのルートで展開するだけでインストールできる) ここでは、B:\cygwinをcygwinのルート、B:\gtk-0.24をgtk拡張ライブラリのソースディレクトリとする。まず、gtk-config.cygwinでgtk_srcに代入している部分を自分の環境に合わせて編集する。これは、Window形式のパスなんで注意。たとえば、「gtk_src = 'B:/CYGWIN/USR/SRC'」などとする。(バックスラッシュ(円マーク)じゃなくてスラッシュでおっけー) また、「-fnative-struct」をCFLAGSに追加しておくのを忘れてはいけない。(忘れて泣く泣く再コンパイルする羽目になったんで)

mingwを使おうとしているということは、X版のgtk+ではなくて、Win32ネイティブなgtk+を使おうとしていると思うので、まず、このパッチを当てる。

--- gtk-0.24.orig/extconf.rb	Thu Feb 15 08:49:30 2001
+++ gtk-0.24/extconf.rb	Mon Mar  5 10:31:52 2001
@@ -63,7 +63,7 @@
 
   lib_ary = []
   if /cygwin/ =~ PLATFORM
-  elsif /mswin32/ !~ PLATFORM
+  elsif /mswin32|mingw/ !~ PLATFORM
     lib_ary = [ ["X11", "XOpenDisplay"],
                 ["Xext", "XShmQueryVersion"],
                 ["Xi", "XOpenDevice"],

gtk-config.cygwinはrubyで書かれているのでmingwなrubyから直接実行することができない。gtk-config.cygwinを実行するためにad hocな方法だが、以下のパッチを当てる。拡張子rbがrubyに関連づけされていて、環境変数PATHEXTが設定されているなら、gtk-config.cygwinの拡張子をrbにするだけでOKかもしれない。

--- gtk-0.24.orig/extconf.rb	Thu Feb 15 08:49:30 2001
+++ gtk-0.24/extconf.rb	Mon Mar  5 10:31:52 2001
@@ -18,12 +18,12 @@
   
   begin
     config_cmds.each do |config_cmd|
-      version = `#{config_cmd} --version`
+      version = `ruby #{config_cmd} --version`
       if not version.chomp.empty?
 	config_libs, config_cflags = "--libs", "--cflags"
-	$LDFLAGS, *libs = `#{config_cmd} #{config_libs}`.chomp.split(/(-l.*)/)
+	$LDFLAGS, *libs = `ruby #{config_cmd} #{config_libs}`.chomp.split(/(-l.*)/)
 	$libs = libs.join(' ') + ' ' + $libs
-	$CFLAGS = `#{config_cmd} #{config_cflags}`.chomp
+	$CFLAGS = `ruby #{config_cmd} #{config_cflags}`.chomp
 	break
       end
     end

そして、
$ ruby extconf.rb B:/gtk-0.24/gtk-config.cygwin
$ make
でコンパイル成功。helloworld.rbも動作した。

[3月6日追記] 阿呆でした。こんな莫迦なパッチを当てる必要はなくて、単純に、
$ ruby extconf.rb 'ruby B:/gtk-0.24/gtk-config.cygwin'
とすれば良かった。

で、
require 'gimp'
require 'gimpui'
というスクリプトを試すが、gimpui.soのロードに失敗。
$ ruby -IB:/gtk-0.24/src test.rb
LoadLibraryExA: B:/CYGWIN/USR/LOCAL/lib/ruby/1.6/i386-mingw32/gimpui.so B:/CYGWIN/USR/LOCAL/lib/ruby/1.6/gimpui.rb:25:in `require': 31: システムに装着してあるデバイスは動作していません。 - B:/CYGWIN/USR/LOCAL/lib/ruby/1.6/i386-mingw32/gimpui.so (LoadError)
from B:/CYGWIN/USR/LOCAL/lib/ruby/1.6/gimpui.rb:25
from test.rb:2:in `require'
from test.rb:2

gimp_ui_initが失敗しているんじゃないかと思って、その部分をコメントアウトした。しかし、症状は変化無し。

ここ3日くらい必死で頑張ってるのにまだ動かない。Windows手強すぎですよ。泣きたいかも。

茨の道はさらに続く

この31ってのはWin32のエラーコードか? 久しぶりにDelphiのCDからWin32 Programmer's Referenceを持ち出して調べてみると、
31L ROR_GEN_FAILURE
とある。 Alphabetical Orderな方を見ると、
ERROR_GEN_FAILURE
A device attached to the system is not functioning.
とある。あったあった。 でも、何が問題なのかサッパリだ。

--export-allが指定されていてもシンボルがエクスポートされていないんじゃないかと思って、でっちあげたインポートライブラリのdefファイルに書いていたシンボル名をDLLのコンパイル時に使われるdefファイルにも書くようにしてみる。で、また同じtest.rbを実行してみる。

$ ruby test.rb
B:/CYGWIN/USR/LOCAL/lib/ruby/1.6/gimpui.rb:25: [BUG] Segmentation fault
ruby 1.6.2 (2000-12-18) [i386-mingw32]

abnormal program termination

どうやら少しは進んだようだ。ということは、DLLのシンボルが解決できないのが原因だったようだ。エラーメッセージ意味不明だぞ。> MS

その後、printfデバッグ(笑)で、
mGimpUI = rb_define_module_under(mGimp, "UI");
で落ちているところまでわかった。Why〜?

http://www.yomiuri.co.jp/08/20010301ig90.htm

なんか、話題になってるらしい。結構常識的な事しか書いてないと思うけど、案外評判悪いなぁ〜 俺は「読売」も「新しい歴史教科書をつくる会」も嫌いなんだが、中国政府のこういった干渉や「日中関係を大きく損ない、想像も出来ない結果を招く」みたいな脅しはウザすぎ。政治問題にするまえに、歴史はちゃんと検証してくれ。

従軍慰安婦問題だけど、ろくに検証されていない(しかも、これまでの検証では、日本軍の組織的な関与はなかったことが明らかになっているんじゃなかったっけ?)し、慰安婦と関係者の聞き取り調査結果すら全然公開されていないんじゃなかったっけ? これで信じろって方が無理ですよ。(そうそう、慰安婦問題を創作したのは朝日新聞だっけ?)

南京{{大|中|小}虐殺|事件}ってのも同じ。多くの異論(たとえば、東中野修道「『南京虐殺』の徹底検証」(展転社)や獨協大学の中村粲教授の著書)があることはわりかし知られていると思うし、ろくに検証もせずに、教科書に「三十万人虐殺説」しか掲載されていないってのはどうみたっておかしいでしょ? (「大山事件」「済州事件」「通州事件」はどうした? ってのもあるけどね。)

立場が違えば、歴史観が違うってのは、わりと普通にあることなんでそれほど気にしちゃいない。どっちも好きにしてくれ、「現在の価値観で歴史を断じる事は、歴史から何も学ばない事に等しい。」って事さえ分っててくれればね。(大体、教科書に書いてある歴史を素直に信じてる奴なんていないだろ?)

4日 日曜 雨

伯父さんと伯母さんが来た。1日と2日にいとこが2人結婚したらしい。突然だったので、本当に驚いた。

Gimp-Ruby

明け方まで昨日書いたような事をやってて、その後新しいスナップショットを公開し、睡眠に入る。ActiveScriptRubyを入れている関係で、拡張子rbをmingw版Rubyに関連付けしたくないんだけど、どうやって動作を検証しようか考える。

3日 土曜

Gimp-Ruby

Windows手強すぎ。疲れたので経緯は後で追記しよう。

追記

まず、extconf.rbをちょろまかして、Makefileを作れるようにした。しかし、このMakeを処理しようとするとmake.exeが死ぬ。しょうがないので、1年ぶりくらいにcygwinをアップデート。インストーラがGUIになっててビックリだ。1年ぶりくらいだから、流石にほとんどのパッケージが更新されていて、どうせだから全部更新する。なんと、ダウンロードに4時間もかかってしまった。くそぅ。でも、まあmakeは動くようになった。

ちょろまかさないでちゃんとextconf.rbが通るようにするため、何が問題なのか確かめようと、$DEBUGにtrueを代入して試す。「checking for gimp_main() in -lgimp... gcc -bmingw -o conftest -IB:/CYGWIN/USR/LOCAL/lib/ruby/1.6/i386-mingw32 -DNT -D__MSVCRT__ -Os -IB:/CYGWIN/USR/LOCAL/include -mno-cygwin -fnative-struct -I/usr/src/gtk+/gdk -I/usr/src/gtk+ -I/usr/src/glib -I/usr/src/glib/gmodule -I/usr/src/gimp/libgimp -L/usr/src/glib -L/usr/src/gtk+/gdk -L/usr/src/gtk+/gtk -L/usr/src/gimp/libgimp -lgtk-1.3 -lgdk-1.3 -lglib-1.3 -lgimp-1.2 -lgimpui-1.2 conftest.c -lgimp -lwsock32 -lmsvcrt
cpp: unrecognized option `-remap'
cpp: -lang-c: linker input file unused since linking not done
gcc: installation problem, cannot exec `cc1': No such file or directory」
この-remapって何者? しかもcc1はちゃんと存在しているのに実行できないなんておかしすぎる。ここでもかなり色々悩んだ。rbconfig.rbを書き換えてみたり、gccのspecsを書き換えてみたり。他にも色々試した。しかし、さっぱり原因がわからない。むしろ、自分で掘った穴に自分で落ちてた気味。かなりたってから、bmingwのバージョンがgccのバージョンとあっていない事に気が付く。阿呆すぎだけど、気がつかないときは本当に気がつかないので恐ろしい。

コンパイル出来るようにした。しかし、リンクでも問題が発生する。普通に「dllwrap --target=mingw32 --as=as --dlltool-name=dlltool --driver-name=gcc -mno-cygwin --export-all -s --def=gimp.def -LB:/CYGWIN/USR/LOCAL/lib -L/usr/src/glib -L/usr/src/gtk+/gdk -L/usr/src/gtk+/gtk -L/usr/src/gimp/libgimp -lgtk-1.3 -lgdk-1.3 -lglib-1.3 -lgimp-1.2 -lgimpui-1.2 -o gimp.so rbgimp.o rbgimpenv.o rbgimppixelrgn.o rbgimpcolorspace.o rbgimpdrawable.o rbgimpparasite.o rbgimptile.o rbgimputils.o rbgimpunit.o rbgimpintl.o rbgimpfeatures.o rbgimplimits.o rbgimpproceduraldb.o rbgimpimage.o rbgimpdisplay.o rbgimptypes.o rbgimpparasiteio.o -L. -lmingw32-ruby16 -lgimp-1.2」としても、g_mallocやg_freeといったglibの関数がundefined referenceになってしまってエラーになる。これも理由に気が付くのに気が遠くなるほどの時間を要した。途中に-lglib-1.3等があるからリンクされているかと思いきや、この位置で指定されても、language driverであるgccには渡らないんだ。extconf.rbで$LDFLAGSに指定しても無駄で、have_libraryでチェックしなくちゃ最後の位置には指定されない事に気がつく。これってRubyのバグじゃねーの?

これでいちおうコンパイルできるようになったが、have_func("gimp_sysconf_directory", "libgimp/gimp.h")が何故かyesになる。libgimp-1.2.dllはgimp_sysconf_directoryをエクスポートしていないし、実際リンク時にこけるのに・・・ でも、have_func("gimp_sysconf_directory")だとnoになる。理解に苦しむ。

ここまでくれば、gimpui拡張ライブラリの方は簡単だ。gimp.soとgtk.soのインポートライブラリを作って同様にリンクする。

2日 金曜 雪のち雨のち晴

朝は雪が降っていたがすぐにミゾレだか雨だかになってしまって残念。そのうち晴れてきたし。今日は、久しぶりに図書館と本屋に行ってきた。

買った本

借りた本

Gimp-Ruby

細かな変更を沢山。

晴れときどきGIMPの「PythonをWindowsで」を読んで、pygimpがWindowsで動作している事を初めて知った。いっちー様がWin32でのコンパイルに挑戦しているようなので、そのあたりもいじってみるが、結構周りがバギィでどうしたものか…

1日 木曜 雨

久しぶりの雨のような気がして気分が良い。

__STDC_ISO_10646__マクロ

i18n@XFree86.Orgで持久戦中らしいので、一通り読んでみた。

__STDC_ISO_10646__マクロは技術的には悪くないと思うよ。必要に応じて変換を省いてパフォーマンスを上げたりも出来るしね。ただ、C99を根拠にCSIを捨てるといった暴論は迷惑極まり無い。(そもそも根拠になってないし) そういう政治的な面ではやっぱり好きになれないんだよ。

そういえば、C99の具体的な内容について知ったのは、去年の7月20日だったな。

Gimp-Ruby