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

June 06, 2006 [長年日記]

[Ruby] AからZまでの1バイト文字列を配列で取得する

一応、以下に落ち着いたけど、一瞬、ループとか自前で作るなんて変なことしそうになった。

('A'..'Z').to_a

こういったのって意識してないと思いつかないんだよなぁ。脳が老化してる証拠かも(^^;)。
ちなみに他にもっとすごい方法があったりする?


June 08, 2006 [長年日記]

[Ruby] Ruby-GetText-Package-1.6.0

リリースしました。とうとう、と言いますか、1.0.0当初から直さねばならん、と思っていたリストの中でもっともやっかいなものの一つの仕様の変更を行いました。

#といっても、一般的に使ってる分には影響はないはずですのでご安心を。

で、それは何かというと、今まではRubyスクリプトファイル毎にテキストドメインを管理していたのですが、それをやめてクラス・モジュール単位に管理するようにしたということです。以前のままではファイル単位にbindtextdomain(かtextdomain)を呼ばなければいけなかったのですが、今後はクラス・モジュール単位に一回呼ぶだけで良くなりました。

ただ、それだけだと、Rubyのように他の人が作ったgettextize済みライブラリをインクルードして上書き、なんてことをしてしまったときに、追加のメッセージを管理することができなくなります。そこで、1つのクラス・モジュールが複数のテキストドメインを持つことができるようにしました。ささらに、_()等のメソッドを呼び出したときに、Module.ancestorsを上に辿って、該当するメッセージがあるかどうかを検索するようになりました。ちょっと遅くなる感じですが、実際には自分自身のクラスにバインドされたテキストドメインしか使わないでしょうし、他のクラス・ロケールを検索すると言っても多くても数個レベルだと思うので、その辺は許容範囲ということで。

えっと、言いたいことがうまくまとまらないですね。眠いからかな。

まぁ、一応続けます。んで、今回の変更の結果、GetText::Containerが不要となりました。これは、前述のファイルベースの管理ではなく、クラスに1つのテキストドメインという管理方法にするという実装案の一つではあったのですが、管理できるテキストドメインが1つだけなので、複数の箇所からbindtextdomainを呼ぶと最後に呼び出したテキストドメインで上書きされてしまうという欠点がありました。今回からは1クラスに複数のテキストドメインが管理できるためこのような問題が無くなります。

具体的には、これを使っていたRailsのプラグインが、今まではモジュール空間を分ける等の工夫が必要だったのが、今回からはそういった工夫を考えずにbindtextdomainを呼び出せるようになりました。RailsのプラグインをL10n化しようと思っている方は、パッケージに含まれるsamples/rails/vendor/plugins/gettext配下を参照してみてください。moファイルなどもsamples/rails/vendor/plugins/gettext配下に配置することができるようになったので、gettextizeされたプラグインを配布するのも簡単になったはずです(以前はmoファイルだけrails/locale/配下に置く必要があった)。

この辺についてはチュートリアル的なモノを書きたいなぁと思ってますが時間が・・・(-o-;)。

もう一つ、大きな修正として、引数の見直しを行いました。互換性を残していますが、今後は、Railsのようにfoo(domain, opts)みたいな感じでオプション扱いの引数は全部Hashで指定するようになりました。

なんだかまとまらなかったですが、とにかく今回のリリースは結構重要なリリースだったと思うので、ホッとしている次第です(何書いてんだ、オレ(苦笑))。まぁ、ともかく不具合レポートお待ちしております(^^;)。


June 10, 2006 [長年日記]

[Ruby] Ruby-GetText-Package-1.6.0リリースアナウンス

をruby-list, ruby-talk, railsの各MLで。一日遅れだけど昨日は時間取れなかったので今になってしまった。ってもう5時じゃん・・・寝よ。


June 11, 2006 [長年日記]

[Ruby] RDoc for Ruby-GetText-Package

なんだか、例の比較ページを見ると、RDoc対応は良い印象を与える項目らしいのでRuby-GetText-Packageでも用意してみた。

実は2つほど前のリリースからソースコード上はRDoc対応していたのでそれをHTML化(あとちょっと変な箇所はソースも修正したけどね。こちらは次リリースには含める予定)しただけなんだけどね。テンプレートはjamis氏のものを使用。スタイルはyotabanana.comに合わせて緑色ベースに。

でもなぁ。なんだか見づらいんだよなぁ、RDocって。Javadocに慣れちゃってるかな。Rubyってファイルを跨って同じモジュールの関数を定義したりするから、左上フレームのファイルを選択すると、そのファイルの中にあるモジュールだけが表示されたりすると嬉しいんだけどな。あとフレームもなぁ。検索しづらいし・・・。まぁ、提供するということが重要と言うことで。

[Ruby] RubyKaigi

みなさんの日記を拝見させていただきましたが、有意義だったみたいですねぇ。おつかれさまでした。


June 14, 2006 [長年日記]

[Ruby] Ruby-GetText-Package-1.6.0のバグ by artonさん

すみません、正直デグレです。以下のパッチで直りますので困っている方はこれをご利用くださいませ。

--- rails.rb.old        2006-06-14 02:12:36.000000000 +0900
+++ rails.rb    2006-06-14 02:13:38.000000000 +0900
 @@ -180,6 +180,8 @@
    end
 
    class Base
 +    include GetText::Rails
 +
      def self.human_attribute_name(attribute_key_name) #:nodoc:
        s_("#{self}|#{attribute_key_name.humanize}")
      end


June 17, 2006 [長年日記]

[Ruby-GNOME2] Gtk.initイラネー

とうとう、というかなんといいますか、Gtk.initを廃止しました。

次のリリース(7月を予定)バージョンからはGtk.initの存在を忘れて頂いて構いません(^^;)。


June 18, 2006 [長年日記]

[Ruby] One-Click-Installer 1.8.4-17 release candidate 2

Ruby-GNOME2をコンパイルしようとしたら、MSVCRT.dllが無いよ、とエラーが。実際、objdumpするとDLL Name: MSVCRT.dllが出てくる。

これって、MSVCRT71.dllを使ってるんじゃなかったっけ!?

[Ruby] One-Click-Installer 1.8.4-17 release candidate 2 続き

でも、cl.exeにリンクされてるからMinGWでコンパイルしたってことはないよな・・・。

[Ruby] One-Click-Installer 1.8.4-17 release candidate 2 続き2

MSVCRT.libの間違いだった。んでもってLIB環境変数の指定誤りだった。そういえば、ディスクが無くなったので別ドライブに開発環境を(VCとかSDKとか)を移したんだった。まったくおばかさんなんだから(誰?)。


June 24, 2006 [長年日記]

[Ruby-GNOME2] Ruby-GNOME2のコンパイル on Win32

前回に続いて。なぜかRuby/Pangoがruby extconf.rbのタイミングでうまくいかない(本来ならyesのところがことごとくnoになる)。

mkmf.logを見ると"LINK : fatal error LNK1104: cannnot open file 'm.lib'というエラーメッセージが出てる。でも、そのファイルはどこにもにゃい。

ところで、これってLinuxで言うところのlibm.soのことだよなぁ。もしかしたらいらないんじゃね?と思ってc:\GTK\lib\pkgconfig\pango.pcのLibs行から -lmを削って、ruby extconf.rbを再実行したらうまくできたっぽい。

となると、これはGlade for Win32最新版に含まれるpkg-configの問題かな・・・。

[Ruby-GNOME2] Ruby-GNOME2のコンパイル on Win32(2)

Ruby/Libgladeでコンパイル失敗。うぬぬ。

どうやら、Ruby/Libgladeのディレクトリ直下にあるdependファイルがMakefileに展開されると以下のようになるのが問題っぽい。

INSTALL_SCRIPT = $(RUBY) -r {.;$(srcdir);$(topdir);$(hdrdir)}ftools
 {.;$(srcdir);$(topdir);$(hdrdir)}-e 'File::install(ARGV[0], ARGV[1], 0755, true)'
GLADE_CREATOR = ruby-glade-create-template
BINDIR = $(prefix)/bin

これをもともとのdependの中身と同じように戻すと動作するようになる。

INSTALL_SCRIPT = $(RUBY) -r ftools -e 'File::install(ARGV[0], ARGV[1], 0755, true)'
GLADE_CREATOR = ruby-glade-create-template
BINDIR = $(prefix)/bin

これは One Click RubyインストーラかRuby自体の不具合だと思うんだけど、時間がないので原因は追ってないんだけどね。

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

なかだ [lib/mkmf.rbのバグです。]

むとう [そうでしたかー。]


June 26, 2006 [長年日記]

[Ruby-GNOME2] Ruby-GNOME2のコンパイル on Win32(3)

今度はRuby/PangoのコンパイルでRuby/Cairoなしバージョンが出来上がってしまうことに気づいた。

mkmf.logを見ると、

"cl -I. -Ie:/GTK/INCLUDE -Ie:/ruby/lib/ruby/1.8/i386-mswin32/include
  -Ie:/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt
  -MD -Zi -O2b2xg- -G6 -Ie:/GTK/INCLUDE  -IE:/GTK/include/pango-1.0
  -IE:/GTK/include/glib-2.0 -IE:/GTK/lib/glib-2.0/include
  -IE:/GTK/include/pango-1.0 -IE:/GTK/include/cairo
  -IE:/GTK/include/glib-2.0 -IE:/GTK/lib/glib-2.0/include    conftest.c -P"
e:/ruby\lib\ruby\site_ruby\1.8\i386-msvcrt\rb_cairo.h(21) :
 fatal error C1083: Cannot open include file: 'ruby.h': No such file or directory

clの-Iオプションにe:/ruby/lib/ruby/1.8/i386-mswin32が入っていない。うーん、なんでだろう。

ひとまず、以下のようにして回避。

E:\ruby-gnome2\pango>ruby extconf.rb 
--with-opt-include=e:/ruby/lib/ruby/1.8/i386-mswin32

それにしても道は険しいのう。

[Ruby-GNOME2] Ruby-GNOME2のコンパイル on Win32(4)

む。Ruby/GTKでも同じ問題が。うーむ。

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

なかだ [extconf.rbで$hdrdirとか$srcdirとかいじってませんか。]

むとう [$hdrdirを使っていました。その部分を修正したら動くようになりました。 ありがとうございます。]


June 28, 2006 [長年日記]

[Ruby] 『るびま』の特別号

日本 Ruby カンファレンス 2006の内容レポートだそうです。すばらしい。

一通り読まさせて頂きましたがいろいろと勉強になりました。

[Ruby] Amrita2の国際化

RubyKaigi2006のレポートを読んでいて、ふと、Amrita2に興味を持った。Amrita2+Ruby-GetTextで国際化アプリ作るとどうなんだろう。

クイックスタートの例を参考にするとまずは以下のように書けるんだろう。

#試してません。

require 'gettext'
require "amrita2/template"
include Amrita2
 
class PO
  include GetText
  bindtextdomain("foo")
  def title
    _("hello world")
  end
 
  def body
    _("Amrita2 is a html template libraly for Ruby")
  end
end
  
tmpl = TemplateFile.new("template.html")
tmpl.expand(STDOUT, PO.new)

../sample/hello/template.html

<html>
   <body>
      <h1 id='title'>title will be inserted here</h1>
      <p id='body'>body text will be inserted here</p>
   </body>
</html>

これで、title, bodyタグ内のそれぞれ文字列が置き換えられてローカライズされるという感じかな。

こりゃー、簡単だ。すごくきれいにできてる。

・・・なんだけど、オレの感覚では、開発時、ローカライズのためだけにひたすらidを考えていくというのはちょっときびしい気がする。例えば100画面あったりするとこりゃもう大変だ。逆に言えば、2,3画面なら全然オーケーなんだろうけど。

100画面のケースを考えると、やっぱりこの場合のidはロジック向けということで閉じるべき(ローカライズ向けに使ってはいけないよう)な気がする。これをベースにrgettextみたく、idの自動抽出ツールを書いて上記サンプルのPOクラスを自動生成するのも簡単だろうだけど、ローカライズに特化するためにはロジック置き換え部分との差別化を図るために何らかの手段(idにプレフィクス付ける等)をつけなきゃいけなさそう。じゃないとロジック置き換え部分もローカライズ対象として抽出されちゃうからね。

いや、Amritaが国際化に向いていないとかという話をしたいのでなくて、ローカライズドメッセージ(言語リソース)の特異性っていうのかな。Amritaは表示(View)とロジック(Controll/Model)を、静的なテンプレート、動的なRubyスクリプトの2つにうまく切り離してるわけなんだけど、ローカライズドメッセージって限りなく静的な情報なんだけど実は要求毎に動的に切り替わるViewとして扱われる必要があるんだよね。ってことに気づいたと。

この辺をうまく扱ったテンプレートエンジンって誰か考えてくれないかなぁ。もちろん、バックエンドはRuby-GetTextで(苦笑)。

[Ruby] Amrita2のPOとは

Amrita2のPOってPresentatio Objectの略なのか・・・。GetTextのpoファイルと被るネーミングだなぁ。一緒に使うと混乱する人も出てくるんだろうな。相性悪いか・・・(苦笑)