自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

August 02, 2005 [長年日記]

[Ruby-GNOME2] Ruby-GNOME2 in GnomeFiles

アップデートされました。10でvoteプリーズ!!

[Ruby-GNOME2] pkg-config viewer-1.0

Ruby/GTK, Ruby/Libglade2, Ruby-GetText-Packageを使った完全な形のサンプルアプリケーションを作ってみました。Ruby-GNOME2-0.13.0が必要です。

ディレクトリ構成・配布形態も含め、このサンプルを参考にすれば簡単にL10n化可能なGUIアプリケーションを構築することができます。

サンプルの説明

このツールはpkg-configというコマンドのGUIラッパです。pkg-configを使う方でパッケージ名をよく忘れてしまったり、各オプションの内容を色々と調べたい方向けのツールです。あー、ニッチだ(苦笑)。

プログラムの説明

ポイントとしては、ほとんどbin/pkgconfigviewerの中身しかコードを手で記述していない、という点です。lib/pkgconfigviewer/pkgconfigviewerglade.rbはruby-glade-create-packageが自動生成したファイルそのままです。

また、bin/pkgconfigviewer自体もpkgconfigviewerglade.rbをコピってその上で編集しています。

L10n化した部分の手間とかが多少ありますが、純粋に自分でコーディングしたのは、たかだか100ステップ程度です。すごいでしょ。

#といっても、pkg-config.rbというRuby/GLib2に含まれるライブラリがロジックの本体でそこは100ステップには含まれていないのですが(^^;)。


August 03, 2005 [長年日記]

[Misc] Hyper Estraier

会社のPCのドキュメントの全文検索用に入れてみた。けども。

日本語のパスがダメなんだよなぁ。検索結果とかはきちんと出るんだけど、そのURLをクリックすると該当ファイルが存在しない、と言われてしまう。

これ書いてて気づいたんだけど、もしかして、file://で直接アクセスしたい、っていうのがまずいのかな...。そういや、http://は試してないや。明日試してみよう。でも、あくまでも希望はfile://での直接アクセスなんだよね。そのままファイル編集しちゃいたいので。

誰かハマった人いません?(すぐ他力本願(^^;))

一応、User's Guideの文字化け対策のところを見て以下のようにしてるけどダメみたい。

estcmd gather -cl -fx .pdf,.rtf,.doc,.xls,.ppt T@estxfilt -fz -ic CP932 -pc CP932 -sd -cm casket .

なんとなくCP932のURLがURLエンコードされたまま、UTF-8のHTMLに混ぜ込んであるのがまずいんじゃないかという気がする。一度URLエンコードを普通にUTF-8に変換してあげれば動く予感。

でも、その辺って、Cのソースいじるしかないのかなぁ。C言語苦手だしなぁ(苦笑)。

本日のツッコミ(全2件) [ツッコミを入れる]

通りすがり [http://hyperestraier.sourceforge.net/sfmltoj.cgi?key=/mail..]

むとう [さっそく情報ありがとうございます! 実はML読もうとしてたのですが文字化けしてて読めなかったんですよね。 sfmlt..]


August 04, 2005 [長年日記]

[Misc] (続) Hyper Estraier

あしたにさんが、文字化けを直してくれるようなゲートウェイCGIをメールしてくれました。ありがとうございました。きっと、ここの話のものでしょうか。

公開はされてないのかな、残念。

ちなみにこの問題は直接的にiconvの問題とは別みたいですね。

Hyper Estraier側で対応してもらった方が良いような気がします。

#ってここで言うなよ、って感じですが。

本日のツッコミ(全2件) [ツッコミを入れる]

あしたに [こんにちは。ということで公開してみました。上記リンク先から飛べます。]

むとう [ありがとうございますm(__)m。]


August 06, 2005 [長年日記]

[Fedora] Core 4でRosegarden4

gcc4ではコンパイルできないらしい。けど、CC=gcc32とやってもうまくいかない。面倒くさいので、試しにFedora Core 3用のバイナリRPM(rosegarden4-1.0-1.rhfc3.ccrma.i386.rpm)を--nodepsで入れて、起動時にライブラリが無いよ!というエラーが出るものを片っ端から(libloやらliblrdfやらraptorやらjack-audio-connection-kitやら)を野良ビルド&インストールしたら無事動いた(一部怪しげな動きもするけど)。

にしても、これ、すごいね。正直感動した!

オレレベルの利用方法であれば全然支障ないや。うきっ!


August 07, 2005 [長年日記]

[Misc] Hyper Estraierと日本語ファイル名

この前の話なんだけど、平林さんの方で検討して頂いているようです。本来MLで議論する内容にも関わらず、ここでちょこっと書いた愚痴レベルのものまで拾って頂いて恐縮です。

ともかく、企業で使う場合、現時点でのデファクトスタンダードはどうしてもWindows + IEだと思うので、対応して頂けるのはありがたいことです。


August 08, 2005 [長年日記]

[Ruby-GNOME2] WikiRPC Client by ZnZさん

今のところHiki専用だそうです。Ruby/GTK2, Ruby/Libglade2を使って頂いてます。

[Ruby-GNOME2] 大バグ発見

元ネタはこちら。実はこれ、昔から気づいてたんだけど今まで放置しちゃったんだよなぁ。てへっ。
とまぁ、ちょっと頭を整理するためにここにメモしてみる。

まず、以下のPureRubyWindow, GtkWindowという仮想的なクラスを例としてあげる。

(1)
class PureRubyWindow
   def child
      @child
   end
   def set_child(value)
      @child = value
      self
   end
end
 
(2)
class GtkWindow
   def child
       gtk_widget_get_child(self)      #実際のCのコードを呼び出すイメージ
    end
    def set_child(val)
       gtk_widget_set_child(self, val) 
       #=> valはGTKの内部でCのポインタとしてchildが管理されている。
       self
    end
end

この例で、以下のようなコードを書いたとする。Ruby-GNOME2ではよく見るコードだと思う。

def create_window
   child = Button.new
   window = PureRubyWindow.new
#   window = GtkWindow.new
   window.set_child(child)
end
 
window = create_widget

このコードではchildの有効な生存期間はwindowの生存期間と同じ、となるのが直感的だ。実際にウインドウが表示されているときに、自分が生成したボタンのインスタンスが実は無くなっているっていうのは気持ち悪いよね。つまり使用者はPureRubyWindowみたいな動作を期待するはず。

が、しかし。

GtkWindow版では、それぞれCのAPIを呼び出すだけになっており、実体としてCのライブラリ側ではchildは生き続けるが、Rubyオブジェクトとしてcreate_windowが呼び出された後はGCの対象になってしまう(はず)。

で、実は現在のRuby-GNOME2の実装は上記のGtkWindowになっている。

GtkWindow#childが返す値はC言語のポインタとしては同じものを指しているものの、それをラップするRubyオブジェクトが毎回違う、ということが発生する(GCのタイミングにもよるみたい)。

もうちょっと厳密に言うと、一度Rubyオブジェクト→Gtkオブジェクトに変換される際にGtkオブジェクト自身にRubyオブジェクトのポインタを覚えさせることをしているので上記のcreate_windowのような順番では問題ないのけど、それは話の本筋と異なるので割愛する。

これにより問題となるのは、GtkWindow自体を自分で拡張したりサブクラスを作成したときにRuby側で定義したオブジェクト内の情報(インスタンス変数や特殊メソッド等)が正しく引き継げないことだ(Rubyとしては新しいオブジェクトが生成・返されてしまう)。

それでは、GtkWindowをどのような実装にすればよいか。

以下のようなソースを見てみる。

class GtkWindow
   def initialize
      @store = {}
   end
   def child
       val = gtk_widget_get_child(self)      #実際のCのコードを呼び出すイメージ
       @store["child"] << val
       val
    end
    def set_child(val)
       gtk_widget_set_child(self, val) 
       @store["child"] << val
       self
    end
end

つまり、GTKのAPIに渡した情報であったとしても、PureRubyWindowと同様な動きが期待されるメソッドでは、GtkWindowのインスタンス変数としてcreate_windowで渡されるchildを保存しておくということだ(childそれ自身に覚えさせておくのではない、というのがポイント)。

こうしておくことで、少なくともGtkWindowの生存期間とchildの生存期間を合わせることができる....はず。

実はRuby-GNOME2では、これの局所的な問題解決用にG_RELATIVE2というマクロが定義されている(正直忘れてた....(^^;))。

で、それを使って上記のGtkWindowをもうちょっとCっぽく書いてみる。

#ただ、今見直すと、第3引数が不要と思われるのでここでは省略。

class GtkWindow
   def child
       val = gtk_widget_get_child(self)      #実際のCのコードを呼び出すイメージ
       G_RELATIVE2(self, val, "child");  //"child"はHashのkey。
                      //この"child"は文字列ではない方が良いかも。
       val
    end
    def set_child(val)
       gtk_widget_set_child(self, val) 
       G_REMOVE_RELATIVE(self, "child"); 
       G_RELATIVE2(self, val, "child"); 
       self
    end
end

要はこれをRuby-GNOME2全体に適用すればよいのだけど...。もうちょっと整理しないとしないとだなぁ。ということで以下にTODOをあげておく。

  1. まず、どういった基準で上記を適用するか、全てのCのWrapperメソッドで適用していいのか。
  2. 上記のマクロは実装も含めもう少し整理した方が良いな。
    GOBJ2RVAL3(key, self, gobj)/RVAL2GOBJ3(key, self, val)みたいなのを作っても良いかもしれない。
  3. G_RELATIVE/G_RELATIVE2の実装は見直したほうがいいなぁ...。
  4. 上記はsetter/getterの組み合わせで成立する。addとかinsertとか、同じ変数(らしきもの)に値がどんどん追加されるようなものはもう少し検討が必要そう。
  5. プロパティやシグナルなど、自動的に生成されるRubyオブジェクトにも同様な仕掛けを入れ込むが必要あるかも。

さてさて。どうしたもんかなぁ。まぁ、問題自体が今になって顕在化するようなものだから今さら焦ってもしょうがないよね(?)。ゆっくりやるとするか...。ってかホントにこれで大丈夫なのか不安だ(苦笑)。

しかし、このTomaszって人すごいなぁ。こんな短期間によくここまで考察できたなぁ。いっそのこと彼に書き直してもらえないかな(^^;)。


August 09, 2005 [長年日記]

[Ruby-GNOME2] gemcalのGtk2への移植

Ruby/GTK2でgemcalを実装したのだそうです。Ruby/GTKからの変更点などがあげてあり、Ruby/GTKから移行しづらいなぁ、と思っている方には参考になるかも。

「その他」の項目であげられている内容についていくつかコメントを。

  1. Widget class に border_width=() が無くなっている
    → Gtk::Container#border_width=の誤りだと思うのですが、Gtk::Container#border_width=, Gtk::Container#set_border_widthともに存在します。
  2. リサイズ時の最小サイズを指定する set_usize が使えない。代替手段はなく、最小サイズを指定する方法は無い。....
    → Gtk::Widget#set_usizeは Gtk::Widget#set_size_requetなどを使うことになります。Gtk::WindowであればGtk::Window#set_default_sizeかな。
  3. Gdk::Pixmap から Gtk::Pixbuf に変更。
    → これは変更する必要はないと思うのだけど、GTK2ではGdk::Pixbufを使うとより簡単に画像を利用できます(Gtk::PixbufはGdk::Pixbufのtypoだと思う)。

[Rails] 国際化ライブラリ「Multilingual Rails」

樂水開発日記さんのとこ。いつもわかりやすい解説ありがとうございます。

で、本題だけど、本当にこのリソースファイルの持ち方って使いやすいのかな....。翻訳者は全員同じファイルを編集しなきゃならないってのは結構気持ち悪いんだけどなぁ。他の言語の人のところを間違えて修正して気づかなかったりしたりするとイヤだし...。

いや、まぁ、それはいいんだけどさ。それよかLocaleってもろRuby-GetText-PackageのLocaleモジュールとぶつかりまくりなんだけど...。

しかも、POSIXのsetlocaleに依存してTimeとかのL10n化もできてるって言ってるけど、それぢゃ、Win32下で動かないよ....。

うーぬ。RoRがどんな国際化をサポートしようとかまわないけど、それによってRuby-GetText-Packageに火の粉が降りかかってるのはイヤだなぁ。RoRってすごく影響力ありそうだし何か手を打たなきゃダメかな。でも、WWWアプリは仕事だけで十分だからあまり興味が持てないんだよなぁ。

[Rails] とりあえず始めてみるか

ということでひとまず、インストールしてみた。この際、Ruby-GNOME2の大バグ放置の方向で(!)。

んが、しかし。

$ rails /var/www/myapp
undefined method `name' for #

なんてエラーが出て先に進めず....orz。RubyがCVS版だから?


August 10, 2005 [長年日記]

[Ruby] RubyGems

Rubyを1.8.2に落としてRoRをインストールしてみた。でも、どうもその先に進む気にならない。

いやー、もう、フレームワークとか落ち着いて勉強できないお年頃なのかも。

いやいや、そんなことより、やらなきゃいけないのはまずはRuby-GetText-Packageのgem化だろう!

と開き直り、gem化開始。こういうときTODOがたまりまくってるとすぐに難しいことは後回しになるね。てへっ。

昔、ZnZさんが作ってくれたヤツをベースにすぐできるだろー、的にふんふんふふんと鼻歌交じりにあっさり終わらせようとしたところ....。

ZnZさんの指摘通り_locale.soは変なところにインストールされちゃうし、

data/配下はインストールされないし、

pre-*.rbみたいなファイルも全部インストールされちゃうし、

もう、どうにもこうにもわからんちん!うがーっ!!

ということで、全部ruby-talkに投げてみることにした。

いやぁ、自分で考えるのが苦手になってきたのは老化のはじまりかもね!(ヤケ)

ってか、gettext自体、rubyに標準添付されちゃわないかな...。gem化するのが面倒くさいから標準添付希望、ってちとムシが良すぎるか(苦笑)。

[Ruby-GNOME2] (続)大バグの件

Tomaszがgtk-devel-listに問い合わせてくれた結果Owenから速攻でリプライがきた。彼はすでにこれについての考察しているらしい。

その中で、(GNOME official bindingではない)Rubyについて言及してくれているのは、ちょっとだけとはいえ嬉しいことだ。

後でじっくり読もう。→ Introducing "toggle references"

簡単に言うと、この問題は他の言語バインディングにも言えることなのでGLib-2.8でそれに関する関数を二つほど追加する、ってなことらしい。

これをしてくれるのであれば、少なくともGObjectなものに関してはRuby/GLib側で吸収できそう、つまりG_RELATIVE2の改善は不要そう。

ただ、GBoxedなオブジェクトや、GBoxedですらないオブジェクトについてはやっぱり自前で何とかしなきゃいけないんだろうな。

ふと気づいたんだけど、未だにgtk-devel-listに入ってないオレって...(汗)。

そういや、昔、入ろうとしたんだけどなぜか入れなかったんだよな...。

本日のツッコミ(全2件) [ツッコミを入れる]

shiro [おお、これは有難いかもしれません>toggle reference。 ただ、複数のオブジェクトからなる循環参照はまだ..]

むとう [そうですねぇ。循環参照問題って正直どうすればいいのか全然解決策がイメージできてないです。 これはスクリプトを使う側で..]


August 11, 2005 [長年日記]

[Ruby] RubyGems(続)

うーん、誰からも回答がない。質問の仕方が悪いのかなぁ。みんなOSCONに行っちゃってるのかな。

[Rails] MLに入った

とりあえず、ruby-gettextについての誤解を正しておいた。

でも、読み返したら変な英語だった。

ついでに、Multilingual Railsを使いたい人がWin32でruby-locale使えないんじゃない?っていう質問してたので、ruby-gettext使えばいいじゃん、って返しておいた。

ひどいデビューだ。ちょっとケンカ腰だけど、まぁいいや。

ついでに複数形の実装についても意地悪な質問をしてみた。

ruby-gettextを使ってもらえるようにするか、あるいは、Multilingual Railsがgettext並の機能を正しく持つように導びいてあげるか、の二つのベクトルで攻めるとしよう。

どうでも良いけど、やっぱりあのメソッドライクなリソースファイル、メンテナンスが面倒くさいだろうなぁ。あまりにもメンテナンスの大変さを軽視してるよ....。だって自分で翻訳用のオリジナルファイルを作らなきゃいけないんだぜ。rgettextで自動抽出、msgmergeで古いリソースにマージって手順が取れないととてもじゃないけど翻訳をし続けることができないと思うんだけどな。そういうサポートツールも作る気でいるのかしらん。それならそれもアリだけど。

なんか、msgid/msgstrがメンドクチャイと思ってる人がいるのね。そう言う人はpoEditとかのツールを使えばいいと思うんだけどなぁ。とにかくメンテナンスし続けることを考えてみるべきだと思う。例えば10個程度のメッセージを翻訳するんだったらそれこそ、何使ってもいいんだけどさ。


August 12, 2005 [長年日記]

[Rails] いかん

やりすぎた。アホだ<オレ。反省。

しかし、オレだけがまずいまずいって言ってもダメだなー。

オレがRuby-GetText-Packageのメンテナって黙っておけば良かった。失敗。

単に他の類似ライブラリ批判にやってきただけと見られるのは当然か....。うーむ。

[Rails] Typo

すごいね、これ。編集画面がニョキーってのびたり、プレビューがリアルタイムになるところとか。

やっぱり、新しいものには触れていかなきゃいかんねぇ。

でも、あまり楽しくないんだなこれが。なんだろう、もう歳ってことなのかな。


August 13, 2005 [長年日記]

[tDiary] うーん、またしても

コメントスパムか....。勘弁してくれ〜。


August 15, 2005 [長年日記]

[Ruby] Ruby-GetText-Pacakge標準添付依頼

西尾さんに推薦していただいたので、渡りに船、ということで自分からもお願いしてみました。西尾さん、ありがとうございます。

取り込んでもらえたらいいのだけど...。


August 17, 2005 [長年日記]

[Ruby-GNOME2] GTK+-2.8.0 released

Pango-1.10.0, GLib-2.8.0も。

うぬぬ、この前、2.6.x対応が済んだと思ったばっかりだったのに...(T_T)。

Ruby-GetText-Packageに力を入れてる場合じゃないのか、オレ....(T_T)。

Ruby/GTK2のAPIドキュメント作ってるときに見つけたGTK+のリファレンスマニュアルのtypoを何点か指摘しただけなんだけど、Thanks toに名前を挙げてくれてるってのは嬉しいね。オープンソースならではと言いますか。

[Ruby] RubyGems

RubyGemsでインストールしたライブラリのrequire_gemって何だ?

requireに比べてバージョンが指定できるだけのもの、とかそういう理解でOK?

[Ruby-GNOME2] キミも開発に参加してみないか!

自分一人でやるのつらいので協力者を募集します。

興味のある方は私まで。さぁ、みんなでインプリしよう!

#とりあえず、enの方で一人手を挙げてくれた。一人じゃないんだっ!

本日のツッコミ(全5件) [ツッコミを入れる]

Before...

babie [重複インストールかな?>いけるのといけないの 実際のライブラリは /usr/lib/ruby/gems/1.8/ge..]

むとう [そもそもrequire自体がオーバーライドされているみたいですよ。 requireのタイミングで$:に読み込むパスを..]

babie [あー、そういえばるびま記事で言ってました。すんません。]


August 18, 2005 [長年日記]

[Misc] お。安部さん復活ですね。

陰ながら心配しておりました。ってか10kg減量って...うらやまぢぃ。


August 21, 2005 [長年日記]

[Ruby-GNOME2] 2 new developers

今回、GTK+-2.8向けの改修をしてもらえることを機に、Guillaume CottenceauとPascal Terjan両氏にRuby-GNOME2プロジェクトチームとして参加して頂きました(厳密にはRuby-GNOME2の開発用CVSへのアクセス権をあげただけなんだけど)。

二人とも以前からパッチくれたり問題解析してもらっているので今後もさらに協力してくれることでしょう。してくれるといいな。

すでにSFの開発者として18人がクレジットされています(AUTHORSは26人)。残念ながら現在もアクティブに動いている人はその中の一握りなのですが、それでもこれだけの人数の人たちがいろいろと手伝ってくれたのは有り難いことです。

[Ruby] Ruby-GetText-Package on RubyForge

Ruby-GNOME2は他の人に任せて、Ruby-GetText-Packageを1.0.0に向けて改良中です(すみません、→ Ruby-GNOME2な方々)。

残念ながらRuby本体には取り込んでもらえそうにない(反応0...orz)→gemもサポートしたい、ということで開発主体をRubyForgeに移しました

MLも作ってみたので興味のある方は是非参加してください。

すでにかなり改造したRuby-GetText-Packageの開発版がCVSにあります。人柱募集中です(^^;)。

落ち着いたら、前言ってた翻訳系のサイトも立ち上げてみようかなぁ(遠い目)。

ところでRubyForgeってssh出来ないのかな。みんなどうやってサイトを構築してるのだろう。

[Ruby] rake

今回、Gem化するにあたってrakeも使ってみてるんだけど、これ、便利だね。数行書くだけ(というかマニュアルからのコピペ)でtar.gzとかgemとか作ってくれるし。

以前から、青木さんのsetup.rbと何が違うのかなぁ、ってよくわかってなかったんだけど、最大の利点はタスクを自分で定義できる、ってことだということが使ってみて理解できた。この数日間でのオレなりの理解を忘れないようにちょっとメモっておこう。

青木さんのsetup.rbでは、all/config/show/setup/install/clean/destcleanの7つのタスク(ruby setup.rb task のtaskの部分)のみ使うことができる。これはこれでとても簡潔でインストーラとしての機能に不足はない。

ただし、それ以外のタスク、例えば、テストするタスク、po→moファイル化するタスク、raccファイル→.rbファイル化するタスク、という具合に細かく分類することはちょっと難しい[*1]。もちろん、それらはインストール時には一気にやってしまえばいい(pre|post-TASK.rbのどこかに記述しておく)から実際にインストールを実施するユーザから見れば問題ないんだけど、開発時にはそれらを別々に実行したいなんて時も多い。さらには、tar.gz, gem化する等というタスクをconfig/setupあたりに入れるわけにもいかない。

なので、オレは今まで個別にスクリプトを書いて開発時にはそれを実行するようにしてきた。まぁ、それはそれでいいのだけど、rakeに従って記述しておくと、ファイルは1つにまとめることが出来るし、定型的なタスクがデフォルトで用意されているのも便利。

[*1] setup.rbでも(pre|post-TASK.rbのどこかから呼び出す別ファイルとしてそれぞれ別のタスク用.rbファイルを用意するっていう回避策もあると思う。でも、それって結局Rakefileを使うと楽ちんだ。

ちょっと不思議なのが、なぜかインストール関係が弱い(自分で書かないといけない)...ように思う。うまいやり方があるのかなぁとは思うのだけど、いくつか見た他のアプリもたいていは自前のinstall.rbを持ってたり、青木さんのsetup.rbを使ってたりしてる。まぁ、Gem化しちゃえば必要ないよ、ってことかもしれないけど、インストールしてくれるsetup.rb互換のタスクがデフォルトで準備されてたら便利なのになぁ(ってすでにある?)。

というわけで、今のところは、開発者向け(つまりオレ向け)タスクはrake、インストールには青木さんのsetup.rbと棲み分けしようかと考え中。

具体的には、raccファイル→.rbファイル化、po→moファイル化、gem,tar.gz化あたりはRakefileに仕込んでおき、setup.rbはあくまでインストール向け(pre|post-setup.rbとかでrakeのタスクを呼ぶ)。

ユーザはgemの場合はgemでインストールするし、tar.gzからインストールする場合は従来通りsetup.rbを使う、って感じ。どうかな。


August 26, 2005 [長年日記]

[Ruby] Ruby-GetText-Package

これまでにやった変更点について書いておく。

今まで、rgettext/rmsgfmtはコマンドとして呼び出す必要があった。

これだとWin32な環境なんかでは扱うのがとっても面倒(c:\ruby\bin\ruby c:\ruby\bin\rubyrgettext *.rb -o foo.potってするか、rgettext.bat *.rb -o foo.potみたいなバッチを作ってた)だったんだけど、setup.rbやRakefile中ではあえてコマンドである必要はないので、同等の機能のGetText.rgettext, GetText.rmsgfmtというモジュール関数にした。これ使えば実質rgettext/rmsgfmtコマンドはいらなくなるので便利。

#require 'gettext/rgettext", require 'gettext/rmsgfmt'をする必要あり。

Ruby-GetText-Packageに付属されていて、他のプロジェクトでもよく使い回されているmakemo.rb(複数の.poファイルからrmsgfmtを使って.moファイルを適切なディレクトリに生成してくれる)と同等の機能もGetText.create_mofilesという風に実装してしまった。そのアプリのトップディレクトリ(setup.rbやらREADMEやらが置いてあるのと同じ階層)のRakefileからこの関数を呼び出せば簡単にmoファイルを作ってくれる。

デフォルトではpo/#{lang}/*.poをdata/#{lang}/LC_MESSAGES/*.mo 配下にコピーされるのだけどもちろん引数を渡せばpoファイル、moファイルの配置先を変更できる。

#こちらもrequire 'gettext/rmsgfmt'が必要。

moファイルの標準検索パスは今まで、

/usr/share/locale/#{lang}/LC_MESSAGES/*.mo

/usr/local/share/locale/#{lang}/LC_MESSAGES/*.mo

だった(厳密には/usr/shareの部分はConfig::CONFIG['datadir']の値)が、

さらに、

/usr/share/locale/#{lang}/*.mo

/usr/local/share/locale/#{lang}/*.mo

も対象として呼ぶようにした。GetText.bindtextdomainでのユーザ指定時も、LC_MESSAGES配下とその一つ上のディレクトリも読み込むようにした。

これは、LC_MESSAGESというのに馴染めない人向け。

さらにさらに、rubygemsがインストールされている場合、 /usr/lib/ruby/gems/1.8/gems/#{libname}/data/locale/LC_MESSAGES(ともちろんLC_MESSAGESなしも)も検索することにした。これはgemsがdata/配下を適切にインストールしてくれないから....というのがあるんだけど、実装した今はむしろ、rubygemsの作法の方が良いような気がしてきた(/usr/share/localeとかにmoファイルをインストールする際に、変に他のアプリとファイル名がぶつかることを気にしないで済む)。

そんな感じ。あとは今、Rails向けサンプル作成中。gettext/railsというRails向けのライブラリを用意する予定。といっても、実は現在リリースされている0.9.0の機能であるGetText::Containerを使えばRailsでもマルチテキストドメイン(カタログファイルの別ファイル化)をサポートできることがわかった。ヘルパーや外部ライブラリを作成する人は、それ専用のテキストドメインを使いたいはずなので是非とも使いやすい形でリリースしたいところだ。

[Rails] Railsというフレームワーク

CGIという点から見ると、やってることはtDiaryやHikiとそんなに変わらないと思う。汎用的だけどね。おかげで何をやっているのかすぐに理解できた。

ちょっと富豪的なアプローチの実装なのでオレだったら性能面を心配して(実装もせずに)あきらめちゃうようなところだけど(苦笑)。おかげでRuby-GetText-Packageが起動時にmoファイルをパースするコストがバカにならない、なんて思ってたオレが小さく見えたよ。そんなコストは、あの実装に比べればゴミだゴミっ!

にしてもActiveRecordのORMはすごい便利だね。これ、Ruby-GNOME2なんかと組み合わせて使うとおもしろそう。Ruby-GNOME2 on Ruby on Rails...なんちて。

ちなみに、RoRのヘルパー機能は簡単に言うとtDiaryやHikiのプラグインみたいなものだ(自動的に読み込むとかは無いんだけど)。なので、そっち系のプラグインたちは簡単にRoRに移植できるんじゃないかと思う(もしかしたら移植せずに動くのもありそう)。暇になったらアクセスカウンタあたりを移植してみようかな。

[Rails] ヘルパー

ヘルパーの各ファイルはActionView::Baseのインスタンス(クラス?)内でevalされるのか...。これはつまり、tDiaryやHiki同様、メソッド名には他のヘルパーに対してユニークな名前を付けなきゃいけない、という制限があるということなのね...。


August 27, 2005 [長年日記]

[Misc] GetText for JavaScript

GetTextのRails対応やっててふと気づいたんだけど、JavaScriptってGetTextみたいな機構無いのかな?

もしないなら実装してみようかなぁと思って以下のサンプルを書いてみた。

Firefoxで動作確認してみた。IEでも動くのかな。


<html>
<head>
<script language="javascript">
var textdomain = new Object();
 
textdomain['a b c'] = "あいう";
textdomain['Hello World'] = "こんにちは世界";
 
function _(str){
  return textdomain[str];
}
</script>
</head>
<body>
<script language="javascript">
document.writeln(_("a b c") + "<br/>");
document.writeln(_("Hello World"));
alert(_("Hello World"));
</script>
</body>
</html>

textdomainの宣言部分を動的に生成する感じ。もちろん、messages_ja.jsみたいに言語ごとにファイルを用意してHTML生成時に読み込むも良いだろうけど、それだとメンテナンス性が悪いので、poファイル、moファイルを作るようにして、そこからRuby-GetText経由でJavaScriptを生成するようなことを考え中。
eRubyで書くと、イメージ的にはこんな感じ。


<html>
<head>
<% bindtextdomain_js("foo") %>
</head>
<body>
<script language="javascript">
document.writeln(_("a b c") + "<br/>");
document.writeln(_("Hello World"));
alert(_("Hello World"));
</script>
</body>
</html>

こうしておくだけで、先の例のhead部分のJavaScriptをLocaleに応じて生成してくれる感じ

こんな感じでどうかなぁ。名前空間とかで問題とかあるかなぁ。JavaScript最近よく知らないから思いつかないや。

そうそう、これの欠点は、1つのtextdomainしか持てないってこと。

まぁ、1つのHTMLドキュメント上のJavaScriptであれば許容範囲内かなぁ。


August 28, 2005 [長年日記]

[Ruby] IO.write(path, mode, str)

なんてのがあっても良いかなぁ、とちょっと思った。


August 30, 2005 [長年日記]

[Ruby] Ruby-GetText-Package Rails sample

Ruby-GetText-Packageの次リリースに向けて翻訳を依頼している各国の人たちから続々と翻訳ファイルが届いています。すでに、英語、スペイン語、韓国語、日本語、フランス語がサポートされています。Ruby-GetText-Packageに含まれる小さなRails向けサンプルは、もしかしたらRoRのアプリの中で最も多国籍化されたアプリケーションとしてデビューすることになるのかもしれません(^^)/。

まだまだ他の言語も募集中ですよ〜。(って日本語で書いてもしょうがないか...(^^;))。

ちなみに、RoRのページにあるGetTextのチュートリアルに比べると相当簡単にL10n化できるようになります(なんてったってrequire 'gettext/rails'ってするだけですし)。

しかも、おそらく他のL10nライブラリでは実現できていないmulti-textdomainを色々なレベルでサポートします(アプリ単位>コントローラ単位>ヘルパー単位、それぞれのライブラリ単位)。もちろん、DRYの法則に従い記述する場所は最小限です(アプリ単位で1つで良いならばApplicationControllerでbindtextdomainを呼べばよいだけ)。

一応、今週末をメドに考えています。お楽しみに!

#この前書いたJavaScriptの件は後回しにしました。すんまそ。

せっかくなのでサンプルの画面イメージを取ってみた。左側の「ロケールの選択」でロケールを選べるようになってる。

(WWWブラウザの「画像を表示」で最大表示できます)

Ruby-GetText on RoR