Ruby言語やLinuxのネタが多いです。
September 04, 2008 [おもひで]
■ [Ruby] nlizeすごい!
artonさんのnlize、rubyのエラーメッセージをローカライズしてしまおう、という拡張ライブラリ。実はRuby-GetTextも使っていただいているのもオレ的には気になるところ。
で、ちょっと試してみた。
$ irb
irb(main):001:0> require 'nlize'
=> true
irb(main):002:0> A
NameError: Aは未初期化定数です
from (irb):2
from :0
irb(main):003:0>
$ export LANG=en
$ irb
irb(main):001:0> require 'nlize'
=> true
irb(main):002:0> A
NameError: uninitialized constant A
from (irb):2
irb(main):003:0>
いいねー。ruby-talkで宣伝すれば言語増えるかもしれないのに〜!(と言ってみる)
そういえば、RubyGemsとかもローカライズされているといいんじゃないかなぁ、と思いつつ、早数年(そんなに?)。誰かそういうのローカライズしていく猛者はいません?(あいかわらずの他力本願)
September 07, 2008 [おもひで]
■ [Ruby-GNOME2] Ruby-GNOME2-0.17.0リリース
私がメンテナを退いてから最初の正式リリースです。私が放置しはじめてから長い期間が経ってしまいましたが、無事にリリースされたのをみてホッとしてます。
須藤さんをはじめ、関係各位のみなさん、おめでとうございます。
September 13, 2008 [おもひで]
■ [Ruby] BOM付きpoファイルとupdatepo
Ruby-GetTextのupdatepo時にBOM付きのpoファイルがあると以下のようなエラーメッセージが出てしまう、という指摘があった。
foo.po:1:2: syntax error msgmerge: 1 個の致命的エラーが見つかりました
BOMはユニコードなテキストファイルの先頭に付ける、2 or 3バイトのバイト列で、例えばnotepad.exeなどで編集・保存すると勝手に付けられてしまう。
これは、GNU msgmerge(少なくとも0.17までは)自体がBOMを受け付けてくれないのが問題だと思うんだけど、poファイルは「翻訳者が扱うファイルであり、プログラミングできない人でも見ればだいたい翻訳することができる」というモノを目指してるわけで、そういう人たちにnotepad.exeを使うなというのは酷というものだ。とりあえずRuby-GetText側で何とかしたい。
というわけで、以下のようなメソッドを使ってupdatepoするタイミングでpoファイルからBOMを削除することにした。
BOM_UTF8 = [0xef, 0xbb, 0xbf].pack("c3")
def remove_bom(path) #:nodoc:
bom = IO.read(path, 3)
if bom == BOM_UTF8
data = IO.read(path)
File.open(path, "w") do |out|
out.write(data[3..-1])
end
end
end
このEF, BB, BFの並びはUTF-8のみで、UTF-16ではエンディアンによってFF, FE、あるいは、FE, FFになるとのことなんだけど、今回はUTF-8の対応だけにした。
というのも、UTF-16のときにBOMを削除してしまうと再読み込み時にエディタによっては問題になる場合がありそうな気がしたから。そこんとこ、どうなんでしょう。
September 14, 2008 [おもひで]
■ [Ruby] Ruby-GetText-Package ブルガリア語リソース
ブルガリア語のリソースファイルを追加しました。
ブルガリアといえば、ヨーグルト・・・すみません。詳しくはWikipediaで。何となくロシア語に似てる感じですね。

September 15, 2008 [おもひで]
■ [Ruby] Ruby-GetText-Package-1.93.0リリース
今回は主にバグ改修です。rcovと一緒に動作しなくなっていたのを回避しました。rcov使っている方はぜひバージョンアップしてください。
rcovとp_()というメソッド名が衝突しているのが動作しなくなっている原因なのですが、rcov(厳密にはp_を定義しているのはxx.rbというライブラリ)をrequireしている場合にはGetText側でp_の定義をキャンセルしています。
なお、p_()はpgettext()のエイリアスなので、pgettextを使う分には問題無いのですが・・・悩みのタネが一つ増えてしまいました(苦笑)。
他には、Rails-2.0.xベースでexpire_fragmentが動作しなくなっているのを修正しました。
あと、Win32用に提供されているGNU msgmergeで一部不具合があるらしかったのですが、そのmsgmergeでも動作するようにしました。Ruby-GNOME2バージョンを使っている分にはまったく関係ありません。
Railsとは関係ないところで、LinuxなどのPOSIX OS上で文字コードを取得する際、今までは環境変数にja_JP.EUC-JPならEUC-JP、ja_JPとcharsetが指定されていない場合はUTF-8固定、という実装だったのですが、これをlocale charmapを呼び出すように変更しました。一部のロケールでは、環境変数にcharsetを指定しないのに文字コードがUTF-8ではない、ということがあって、そういった環境では文字化けを起こしていたことになるのですが、今回の修正でそういったロケールでも正しい文字コードが取得できるようになったと思います。
September 19, 2008 [おもひで]
class Test
def initialize
hello
foo
end
def hello; p "test1"; end
alias :foo :hello
end
class Test2 < Test
def hello; p "test2"; end
end
Test2.new
この時、Test2.newの結果はどうなるか。
× test2(改行)test2
○ test2(改行)test1
Test2でもfooメソッドをhelloの結果と同じにしたい場合はTest2で改めてエイリアスする必要がある。こんな感じ。
class Test3 < Test def hello; p "test3"; end alias :foo :hello end Test3.new
サブクラスでfooを呼び出すと、サブクラスのhelloを呼んでほしい場合は、素直にfooをメソッドとして定義すればよい。
class Test
def initialize
hello
foo
end
def hello; p "test1"; end
def foo; hello; end
end
class Test2 < Test
def hello; p "test2"; end
end
Test2.new
この場合は、どちらもtest2を返す。
以下のような使い方を基準に考えると不思議ではないかもしれないんだけど、クラスの継承を基準にaliasを使うとなぜだかハマってしまう。こはいかに。
def hello p "hello" end alias :hello_org :hello def hello hello_org p "hello2" end hello
September 23, 2008 [おもひで]
■ [Fedora] VMware Serverが起動しなくなった
久しぶりにVMwareを起動しようとしたらvmware-config.plしてくれと言われる。
せっかくなのでVMware Serverの最新版(1.0.7)をインストールしてみたけど、今度はvmware-config.plでコンパイルエラーになる。
まぁ、いつものことといえばいつものことなので、ここからvmware-any-any-update117d.tar.gzをダウンロードしてrunme.plを実行・・・、あれ、やっぱりコンパイルエラーだ・・・・。
というわけで、グーグル先生経由で駆け馬に無知さんのサイトを参考にさせていただき、無事起動成功。なるほど、any-anyの117dを使うのではなくてVMware Server 1.0.7本体にパッチを当てるのか。
rpmでインストールしたのでちょっと手順が違うので以下にメモしておく。
まずは、こちらから
VMware-server-vmmon-1.0.6-91891-2.6.26-1.patch
VMware-server-vmnet-1.0.6-91891-2.6.26-1.patchの2つのパッチをダウンロードする。
で、VMware-serverをrpmでインストール。あとは以下のような感じ。以下の例ではパッチは/tmpに置いてある。
$ su パスワード: # cd /usr/lib/vmware/modules/source # cp vmmon.tar vmmon.tar.org # cp vmnet.tar vmnet.tar.org # tar xvf vmmon.tar # tar xvf vmnet.tar # patch -p0 < /tmp/VMware-server-vmmon-1.0.6-91891-2.6.26-1.patch patching file vmmon-only/linux/driver.c # patch -p0 < /home/mutoh/VMware-server-vmnet-1.0.6-91891-2.6.26-1.patch patching file vmnet-only/bridge.c # tar cvf vmmon.tar vmmon-only # tar cvf vmnet.tar vmnet-only
あとは、普通にvmware-config.plでOK。
■ 追記:VMWare Server Consoleのステータスバーにvmware toolsが古いというメッセージが出たのでインストールしようとしたら・・・失敗。こちらは、vmware toolsを一旦アンインストールすると良いらしいということなので実施してみたらOKだった。あ、Guest OSはWindows2000ね。

Before...
▲ むとう [えー、それは残念。 とりあえず、ruby-talkで宣伝してみたら需要がどれほどのものかわかると思いますー。スルーさ..]
▲ arton [>自国語に翻訳されて表示されるのが好きな人って多いと思うんだけどなぁ。 なるほど。それは確かにありそうですね。]
▲ むとう [さっそくありがとうございます!!]