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

July 07, 2002

[Ruby-GNOME2] 頭の中メモ

Ruby側から見ると情報をset/getすると言う意味で、GTK+側はAPIがいっぱいある巨大なハッシュって言えると思うんだよね。

でも、時と場合によってRuby側とは関係なくハッシュから情報がなくなったり増えたりするのがたまに傷。そこをどう同期を取るかってことなんだよなぁ。ムズイ。


July 07, 2003

[Ruby-GNOME2] シグナルの動きを調べる

こっちもまとめてみた。ご意見夜露四苦。

どうでもいいけどやっぱり日本語だと楽だの。


July 07, 2004

[Misc] 家のPCのHDDが

ブート時に異音がしてBIOS起動時のHDD認識に異様に時間がかかるようになってしまった...。しかもどうやら2つあるHDDの両方がダメのようだ。

一度BIOSからOSを起動すると音が収まり、普通に動作するのでひょっとしてBIOS自体が何かおかしくなっちゃってるのかなぁ。

夏を迎える前にいやな感じだ。うーむ。


July 07, 2007

[Fedora] FC7でJavaアプレットが起動しない

ハードディスクを高速なものに換装したんだけど、その際にディスクの中身もクリーンにしようと思ってFC7(x86_64)を一からインストールしなおした。

いろいろと順調にいって、Java Appletを使うためにSun Java(i386版。amd64版だとjre/plugin配下が無いんだよね)とを入れ、Firefoxのi386版を入れ直し、

ln -s /usr/java/latest/jre/plugin/i386/ns7/libjavaplugin_oji.so /usr/lib/mozilla/plugins/.

した.....んだけどアプレットが表示されない。うーん、なぜだろうと思っていろいろと調べてるうちに/usr/java/latest/bin/ControlPanelがlibstdc++.so.5がないよ、とエラーになることに気づいた。なるほどそういうことか、ということで

yum provides libstdc++.so.5

としたところ、compat-libstdc++-33 i386 というのが見つかったのでこれを

yum install compat-libstdc++-33.i386

したところ無事動作した。

[Ruby] Ruby-GetText-Package-1.10.0

リリースしました。今回の目玉は高速化です。

まず、_(), n_()で、一度変換された文字列が言語毎にメモリ上にキャッシュされるようになりました。

繰り返し呼び出される場合(Railsもそうですよね)、2度目以降の呼び出しが(手元の計測では)1.3〜1.8倍程度高速化できました。当然、一画面で複数回メソッドを呼び出すわけですから複雑な画面では更なる高速化が期待できるでしょう。

なお、キャッシュをクリアしたい場合はGetText.clear_cacheメソッドを呼び出します。また、デバッグモード(ruby -d or $DEBUG=true)か明示的にGetText.cached = falseをしておくとキャッシュされません。Ruby on Railsの場合はdevelopmentモードではこのフラグがfalseで起動されますので、サーバを起動したままmoファイルをアップデートした場合、今まで同様反映されます(されなかったらバグ(^^;))。

次に、Ruby on Railsのキャッシュ(Action/Fragment)に対応しました。これはこの前のエントリを参照してください。これを使うと結構Railsアプリの高速化を図れると思います。

もう一つ、GetText.ns_()というメソッドを追加しました。これはGetText.s_, n_の合体版です。

以下のようにして使います。

ns_("Foo|There is an apple", "There are %{num} apples", i) % {:num => i}

ns_("Bar|There is an apple", "There are %{num} apples", i) % {:num => i}

どちらも英語の場合は、"There is an apple", "There are %{num} apples"に展開されます。

なお、この"Foo"、"Bar"は単数の方にだけつければ良いです。

#まぁ、ここまで使い分けたいということはそうそう無いと思いますが。

あと、これはもともとRuby-GetTextのバグでGNU Gettextに合わせただけなのですが、

(1) _("a")

(2) n_("a", "b", i)

(3) n_("a", "c", i)

の3種類があった場合の挙動が変わりました。まず、(1), (2)があったとすると、これはmsgid = "a", msgid_plural = "b"の1つの組になり、(1)は(2)の単数形と同じ翻訳文字列が使われます。

次に、(2), (3)があったとすると、まず、rgettextではWarningが出て(2)のみが翻訳対象になり、(3)はpoファイルに出てきません。"c"に該当する場合でも"b"であるかのように変換されます。なので、簡単に言えばこのような使い方はNGです。もし、どうしても、aの部分は同じで、b, cの部分を使い分けたい、という場合は前述したns_()を使うようにしてください。

その他の変更点ですが

・ベトナム語、ボスニア語、クロアチア語、ノルウェー語の追加

・error_messages_forが複数のモデルを引数にとることができるようになった

・各種不具合の修正

です。あー疲れた。

ぜひ、使ってみてくださいね!

おっと書き忘れ。Windowsの場合、msgmergeをインストールするために、今まではgladewin32をインストールすることをお勧めしてたんだけど、これからはRuby-GNOME2 Win32 GUI InstallerをインストールすればOK。Ruby-GetTextもRuby-GNOME2も両方楽しめてお買い得(ホントは無料です(^^;))。


July 07, 2008

N_()の使いかた(再)

いまだにN_()の使い方やN_()と_()の違いについての質問が絶えないのでもう一度整理してみる。

まず、以下のようなコード。

class Hello
  bindtextdomain("hello")
 
  HELLO_WORLD = _("Hello world")
 
  def say_hello
     _("Hello!")
  end
 
  def say_hello_world
     HELLO_WORLD
  end
end

say_helloとsay_hello_world、2つのメソッドがある。_("")の使い方としては前者が正解で後者が間違い。なぜか。

  • say_helloの方はsay_helloが呼び出された時点でのロケールで翻訳表示される。
  • say_hello_worldは、スクリプトが読み込まれたときの環境のロケールで表示される。
  • 通常のCUI/GUIアプリだと1回起動してしまえば全ての同じシステム上のロケールを使うことになるだろうからほとんど気にしないでも良いかもしれないが、RailsのようなWebアプリだとリクエストごとにクライアントのロケールが異なるため、say_hello_worldの方法だと意図しない動作になってしまう。

    では、どのように書くと良いかというと、N_()を使って以下のように記述する。

    class Hello
      bindtextdomain("hello")
     
      HELLO_WORLD = N_("Hello world")
     
      def say_hello
         _("Hello!")
      end
     
      def say_hello_world
        _(HELLO_WORLD)
      end
    end
    

    N_()は実は何もしないメソッド。rgettext(poファイル抽出時)にそれが翻訳対象文字列であることを伝えるためのメソッドで、実際の翻訳はsay_hello_world内の_()で行っている。

    まとめると、_()はインスタンス化後に使用するもの、N_()はクラスレベルで使用し、実際に使うときに_()で使用するもの、というのがRuby-GetTextの基本的なお作法だという風に覚えてしまうと良いと思う。


    更新 設定