自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
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とかもローカライズされているといいんじゃないかなぁ、と思いつつ、早数年(そんなに?)。誰かそういうのローカライズしていく猛者はいません?(あいかわらずの他力本願)

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

Before...

むとう [えー、それは残念。 とりあえず、ruby-talkで宣伝してみたら需要がどれほどのものかわかると思いますー。スルーさ..]

arton [>自国語に翻訳されて表示されるのが好きな人って多いと思うんだけどなぁ。 なるほど。それは確かにありそうですね。]

むとう [さっそくありがとうございます!!]


September 07, 2008 [長年日記]

[Ruby-GNOME2] Ruby-GNOME2-0.17.0リリース

私がメンテナを退いてから最初の正式リリースです。私が放置しはじめてから長い期間が経ってしまいましたが、無事にリリースされたのをみてホッとしてます。

須藤さんをはじめ、関係各位のみなさん、おめでとうございます。

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

kou [ありがとうございます! むとうさんの苦労が少しわかった気がします。。。]

むとう [おつかれさまですー。]


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 [長年日記]

[Ruby] 継承+エイリアスのハマりどころ

前もハマったような気がするが・・・・。

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ね。