Ruby言語やLinuxのネタが多いです。
May 05, 2006 [おもひで]
■ [Rails] Ruby on Railsで日本語しか使わない場合でもRuby-GetText-Packageを使う理由
Ruby-GetText-Packageは元々メッセージの国際化のためのライブラリです。なので、とかく、
「アプリを国際化したい場合は使った方が良いよ。」
という話になります。これはこれで正しいのですが、Ruby On Railsに限って言うと、
「日本語でRoRを使う場合はとにかく使った方が便利だよ。」
なのです。ホント?
ViewやControllerでわざわざ英語を考えて_("eigo shiranaimon")なんて書いてらんねーよ、と思う方がいるかもしれません。
でも、国際化を考えない場合、_("eigo shiranaimon")なんてわざわざやらずに、素直に "英語しらないもん" と書いてしまえば良いわけです。
だとしたら、Ruby-GetText-Packageを使うメリット無いじゃん。と思うかもしれませんがそんなことはありません。
まず、Modelの各カラムを抽出したリソースファイル(メッセージカタログ, poファイルのこと)を自動で作成してくれます。このリソースファイルに日本語を記述するだけで、いろいろなところ(主に入力エラー時のカラム名等)が日本語化されます。テーブルが増えたりカラムが増減したりした場合もRakeのコマンド一発で差分を適切にリソースファイルにはき出してくれます。これを手作業でやったりしたらそれはもう大変な作業です。
さらに、入力エラー画面はRuby-GetText-Packageを使うだけ(追記:インストールしてinit_gettextを呼ぶだけ)で、全て日本語化されている状態になります。
また、Content-Typeも適切に指定してくれます。RJS等を一緒に使う場合、Content-Typeを指定する際にちょっとしたトリックが必要なのですが、Ruby-GetText-Packageを入れてしまえば意識する必要がありません。
ActionMailerについても、標準ではUTF-8のメールになってしまいますが、Ruby-GetText-Packageをインストールするだけ使うだけ(インストールしてinit_gettextを呼ぶだけ)でISO2022JPに変換されてメールされるようになります。
これらだけでも、日本語+Ruby On Railsの組み合わせではRuby-GetText-Packageを使ってみる価値はあるのではないでしょうか。ぜひ、一度、使ってみてくださいね。
May 07, 2006 [おもひで]
■ [Ruby] Ruby-GetText-Package-1.5.0
リリースしました。ロシア語のリソースが追加されました。これで11(+2)言語サポートです!
また、アプリケーションを起動したままカタログファイル(moファイル)を更新した場合に、カタログファイルを再読込するオプションを追加しました。
この機能はruby -dでrubyを起動するか、GetText::TextDomain.check_mo=(true)を設定と使えるようになります。サーバ型アプリケーションを起動しっぱなしで開発したい場合に便利です。
なお、Ruby on Railsのではdevelopmentモードであれば自動的にこのモードになります。
この機能を使っていない場合(つまり通常の場合)、高速化のため、一度読み込まれたmoファイルはメモリ上にキャッシュされるようになっています。
エンジョイ!
May 08, 2006 [おもひで]
■ [Ruby] Ruby on RailsでRuby-GetText-Packageを使う
長らく放置していたドキュメントですが、1.5.0リリースに合わせてアップデートかけました。ご参考までに。
#一昨日くらいに終わってたんだけどアナウンスするの忘れてました(苦笑)。
May 09, 2006 [おもひで]
■ [Rails] Ruby-GetText-Packageでデフォルトのロケールを英語以外にする
アプリのmsgidとしては英語で用意するんだけど、中国のリソースを用意してかつ、中国語をデフォルトにしたい、という要望がrails MLで出たので例を書いてみた。
require 'gettext/rails'
class ApplicationController < ActionController::Base
prepend_before_filter :default_locale
def default_locale
if (cookies["lang"].nil? or cookies["lang"].empty?)
GetText.locale = "zh_CN"
else
GetText.locale = cookies["lang"]
end
end
init_gettext "yourapp"
end
この例はcookie["lang"]にデフォルトのロケールをセットする例。langの選択・設定自体は他にGUIを作って設定する。
場合によってはセッションを使っても良いだろうし、ユーザ毎にGUIの制御を行っている場合はデータベースの該当テーブルに設定したりすることもあるだろう。ということで、ライブラリ化は先送りかな。まぁ、Tipsということで。
■ [Ruby] Ruby-GetText-Package Railsでのバグ
validates_length_ofでmessageを%d付きで指定するとローカライズされないとい不具合があったので修正しました。同時にお二方からレポートいただきました。
このファイルのRevision 1.34をダウンロードしてお手元のlib/gettext/rails.rbと置き換えてください(例えば/usr/lib/ruby/gems/1.8/gems/gettext-1.5.0/lib/gettext/配下にインストールされていると思います)。
しかし、我ながらすごいソースだ・・・。見ちゃいやん。
May 11, 2006 [おもひで]
■ [Rails] またRails MLで
i18nのベストソリューションは無いのか、という話が出てる。といっても、i18nと言ってる割には主にメッセージ翻訳機能(つまりGetTextのカバー範囲)のことを言ってるようだ。
どうも、ヤツらはRailsに標準添付されてないと気が済まないらしい。
次点はプラグインか。きっとRuby-GetText-Packageは試してもいないで騒いでるんだろうなぁ。
でもさぁ、現時点でGlobalizeなんてまともに使えないと思うんだけどなぁ。マジでまともに使えてる人いるのかなぁ。あんな不便なヤツでメンテナンスするんであれば一度はRuby-GetText-Packageを使ってみて欲しいなぁ。
■ ということで、再び戦ってみることにした。でも、作者本人が「オレのライブラリが一番に決まってるからそれを使え!」というのはイマイチ信憑性にかけるんだよなぁ。何より、日本人のサポート(MLで反論してくれるとか、アプリの実装も含めてね)が無いのが痛いッス。誰かフォローしてあげようなんて人いません?
まぁ、Ruby-GetText-Packageもまだまだ、ということなんだろうけどさ、なんか寂しいのう。
#Ruby-GNOME2の方もパッチが溜まってるというのに・・・(T_T)。
■ [Ruby-GNOME2] メモリリーク
そうそう、ruby-talkでRuby/GdkPixbufがメモリリークしてるんじゃない?という報告があったけど、メモリリークしてません。なんかアホらしくてリプライする気起きず。まぁ、Robertがフォローしてくれてる通りだから良いんだけどさ。
はー、なんだか今日はネガティブシンキングな一日だった。
■ そういや、Rubyって起動オプションで最大メモリ使用量を指定できないんだよね...。
とすると1台のハードに複数の常駐アプリケーションを載せて動かす、みたいなアプリケーションサーバ的な使い方にはちょっと適用が難しいなぁ(信頼性が低くなるため)、と感じた今日最後のネガティブシンキング野郎なのでした。みんなどうやってるんだろう。普通にそのまま動かしちゃってるのかな。
May 13, 2006 [おもひで]
■ [Rails] InternationalizationComparision
こんなページができてしまったのでやむなく参戦。いや望むところと言うべきか。
きっとここで(彼らが特に気にしている)メッセージ翻訳については圧勝するはず。
だけど、逆にそれ以外の部分、日付・通貨・数値フォーマットのサポート、select_date(), distance_of_time_in_words()等のヘルパーのサポートが欠けていることにいずれ気づくことになる。
■ 元々、Ruby-GetText-Packageはメッセージ翻訳というのが守備範囲なので(もちろん、Railsに関してはすでにその範疇を飛び越えちゃってるけど)、実はこの辺の実装は後回しになってしまってる。
将来的にはRuby/CLDRを機能アップして、それを使うようにするのがベストだと思うんだけど、暫定的にRuby-GetText-Packageに取り込んじゃうのは手かもしれない。
誰かプラグインかなんかで実装してみません?
foo.rhtml
<% GetText.locale = "ja" %>
<%=_("hello world") %>
<% GetText.locale = "en" %>
<%=_("hello world") %>
1つめは日本語で、2つめは英語で表示したい。でも、上記は動かない。代わりに以下のようにする必要がある。
foo.rhtml
<% set_locale "ja" %>
<%=_("hello world") %>
<% set_locale "en" %>
<%=_("hello world") %>
なぜかというと、RailsはGetText::Railsという特別なモジュールをインクルードしているからで、その元となるGetTextモジュールの関数を呼び出してもうまく動作しないから。
■ ところで、このような使い方するのであれば、set_localeはブロックが使えると良いかもしれない。
foo.rhtml
<% set_locale("ja") do %>
<%=_("hello world") %>
<% end %>
<%=_("hello world") %>
ベースとしては英語のロケールなんだけど、最初の1文のみ日本語を表示したい、なんていうケース。まぁ、レアケースだなぁ。
■ [Ruby] Ruby-GetText-Package 中国語(Simplified Chinese)訳
なんだかんだ言っても確実に使ってくれてる人も増えているようです。12言語目は中国語です。なんとなく読めてちょっとうれしいですね。ちなみにLocaleの訳が「国家」になっているようだけど良いのかな。お国柄というところか。それとも日本語と意味が違うのか。

May 14, 2006 [おもひで]
May 16, 2006 [おもひで]
■ [Ruby] Rubyist Magazine 0014 号
遅ればせながら。
$KCODE = "U"
print "前半:"
ary = gets.strip.split(//)
puts "答え1: #{ary.join + ary.reverse.join}"
puts "答え2: #{ary.join + ary[0...ary.size].reverse.join}"
実行結果
% ruby kaibun.rb 前半:たけやぶ 答え1: たけやぶぶやけた 答え2: たけやぶやけた
KCODE指定はオレの環境がUTF-8だから。
もっと短くできるのかな。
たけやぶぶやけた、もなんだか面白いと思った。
May 17, 2006 [おもひで]
■ [Ruby-GNOME2] Ruby/Poppler, Ruby/VTE
須藤さんが2つのライブラリを同時にインポートしてくださいました。いやぁ、これで23個のライブラリ群ですよ。スゲー(ヒトゴト)。
ちなみに、Ruby/Popplerはfreedesktop.orgが提供するPDFレンダリングライブラリです。PDFをGTK+のウィジェットに書き出すなど、GTK+と親和性が高いとのこと。
試してないけど日本語使えるのかな。PDFWriter使おうと思ったら日本語使えなかった(中村さんのパッチなしでは)記憶があるので、日本語使えるのならニーズは結構あるかもしれないですね。まぁ、GTK+との親和性が高い、というのはいづれにせよ強みではありますが。
Ruby/VTEはシンプルなターミナルエミュレータのウィジェットです。GNOMEターミナルにも使われています。
ぜひともお試しくださいませ。
■ 全然話変わるんだけど、誰かRuby-GNOME2 on Ruby on Railsっていう記事書いてくれません?(とこちらも人任せ)。GUIの無いライブラリ関係(画像処理、PDF、SVG等々)はLinuxなんかで結構便利に使えると思うんだよね。Pure Rubyじゃなくても良いなら性能面でもアドバンテージがあると思うし。
■ [Ruby] Ruby-GetText-Packageバグ
MS Windowsな環境で、developmentモードなのにrake makemoした後に変更が反映されない(キャッシュされたままになる)ことがわかりました。
これは、gettextのlib/gettext/mo.rbのctimeというところをmtimeに修正すれば直りますのでもし気になっていた人がいたら修正してみてください。
ctime/mtimeって違いをあまり気にしてなかったんだけど、ctimeがcreated timeでmtimeがmodified timeの略という理解でOK?
■ [Ruby] Ruby-GetText-Package - イタリア語訳
イタリア語のメッセージカタログが追加されました。こちらは13言語目です。なんかオレってば増やすの好きみたい(苦笑)。
でも、まぁ、Rails MLで吠えた甲斐があったのかも。

May 18, 2006 [おもひで]
■ [Misc] 性別のサポート
Ruby-GetText-Packageで性別毎の変換ってできないの?っていう質問が来た。
外国の言葉には主語が男性か女性かで、その後の文が変わってくるらしい。
残念ながら現状のRuby-GetText-Packageはそれをサポートしていない(ってか他のGetTextファミリーもサポートしていないはず)。
けど、なかなか面白いテーマだと思った。文法的に必要な言語じゃないにしても、例えば、アプリ的には全く同じ動作をするのだけど、男性向けと女性向け(あと最近であれば「その他」も必要か(^^;))で微妙に表現が違うなど。子供向け、大人向けってのもあるかもしれない。日本語であれば子供向けはひらがなのみ、とか。moファイルの互換性をなるべくキープしたままでこういうのもサポートできたら楽しいだろうなぁ。翻訳担当は大変になるだろうけど(苦笑)。
ちなみに現状のアプリでこの辺まで意識した実装とかってあります?
■ [Ruby-GNOME2][Rails] ActiveRecord Editor
なんだか最近、ライブラリのメンテばかりやっていたのでたまには違うものでも、ということで、なんちゃってスクリプトを書いてみました。Ruby/GTK2+Ruby/Libglade2を使ってMigration用のcreate_table()を簡単に書けるというモノです。保存機能も抽出機能もありません。下のテキストエリアに表示された結果を適宜コピペして使います。
Rubyスクリプト自体は180ステップ程度のものです。Typeのところがコンボボックスになってるところがポイントです。案外コンボボックスのサンプルって無いんですよね。まぁ、Ruby/GTK2のサンプルということで。
■ でも、これ、もうちょっとがんばったらDBのスキーマエディタになるかも。

May 19, 2006 [おもひで]
■ [Ruby] File.ctimeとFile.mtimeの件
結局、なかださんのパッチを取り込まさせて頂きました。artonさん、なかださん、ご助言ありがとうございました。
■ [Ruby] File.ctimeとFile.mtimeの件(2)
環境によってctime < mtimeの時もあれば ctime > mtimeの時もある、ということなので、ファイルの更新時刻を取得する目的の場合に、この2つのままではちょっと使いづらいし誤解の元にもなると思った。
というのも、今回の件もそうだったけど、ファイルが生成されたのだろうが、ファイルの内容が更新されたのだろうが、新しいファイルに置き換えられたのだろうが、属性が変更されたのだろうが、それはひとえに更新された、っていうひとまとまりの考え方の方が割と普遍的で、使いやすいのではなかろうか。
ということで以下のようなメソッドを考えてみた。
class File
class Stat
def last_modified
[mtime, ctime].max
end
end
def self.last_modified(filename)
File.stat(filename).last_modified
end
end
p File.last_modified("foo.rb")
って、まぁ、今回は(Rubyのコアライブラリに手を入れるのは避けたいから)使わなかったけどね。
May 21, 2006 [おもひで]
■ [Ruby-GNOME2] GmNotify-0.7
Ruby/GTK2で作ったGmailチェックアプリのようです。なんか昔もこんなアプリを見たような気がしますが。
ちなみにCVS版のRuby/GTK2でないと動かないとのこと。
May 24, 2006 [おもひで]
■ [Ruby] Ruby-1.9.0でrmsgfmtがコケル
ruby 1.9.0 (2006-05-23) [i686-linux]にて。Racc(1.4.5)の仕様が変わっちゃったのかな。うーむ。時間ないし当面見なかったことにしよう・・・。<おぃ
/usr/local/lib/ruby/site_ruby/1.9/racc/parser.rb:99:in `catch': no block given (LocalJumpError)
from /usr/local/lib/ruby/site_ruby/1.9/racc/parser.rb:99
from /usr/local/lib/ruby/site_ruby/1.9/racc/parser.rb:99:in `do_parse'
May 27, 2006 [おもひで]
■ [Ruby] HTTP_ACCEPT_LANGUAGE を変化させて挙動を確認するには
なぜかコメントできなかったのでこちらに書きますが、HTTP_ACCEPT_LANGUAGEはWebブラウザ側の設定で変更可能です。例えば、Firefoxの場合はEdit → Preferences → Advanced → Edit Languagesで設定できます。
なお、ここでは複数の言語を設定できますが、Ruby-GetText-Packageではもっとも優先度の高い(つまり一番上)のものしか有効になりませんので注意してください。
なぜなら、毎回複数言語の中から該当する文字列を抽出するのは効率が悪いからと思ったからです。
#実装できなくはないと思いますが・・・。

▲ kou [#_の第2引数にlocaleを指定できるようにするというのはどうでしょうか.]
▲ むとう [それだと、 ・N_.(), n_.(), s_.()他GetTextが提供する他の関数にもlocaleを指定できる..]