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

February 24, 2003

[Ruby] 10年目の誕生日

なんだそうです。おめでとうございます。


February 24, 2005

[Ruby-GNOME2] だ、だめだ....。

この前の最新のRubyでRuby-GNOME2がおかしい問題だけど久々(?)にやばい。わからん。うーぬ...。 再現スクリプトはこんなの。

require 'gtk2'
Gtk.init
test = Gtk::Window.new
class << test    #特異クラス(だっけ?)がまずいらしい。
end
p test.show_all  #ここはGtk::Windowのメソッドなら何でも良い。

これを実行すると

  VALUE ptr = rb_funcall(klass, rb_intern("superclass"), 0);

このptr(ポインタ値)が、Gtk::Windowのポインタ値より常に20ずれるようになってしまったようだ(少なくともruby 1.8.2 (2004-12-25)では問題ない)。

それともklassはCLASS_OF(obj)で取ってるんだけどそこがまずい?

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

kzys [すみません。 ruby-dev と ruby-gnome2-devel-ja でちょっと行き違ってしまったみたいです..]

むとう [ありがとうございます。助かりました!]


February 24, 2006

[Rails] ロケールによるテンプレート切り替え

航海日誌さん経由で知ったのですが、「Rails勉強会@東京 第3回」でRailsの国際化について話があって、Ruby-GetText-Packageも議題に上げて頂いたようですね。ありがとうございました。ってか、国際化ってそんなにホットな話題になってるんでしょうか。なんかそれ自体がちょっと意外だったりしますが。

さて、いろいろとリンクを辿ってYuguiさんの議事録を読まさせていただいた(議事録を残して頂きありがとうございました)のですが、「ロケールによるテンプレート切り替え」「文言単位での対照訳」のどちらを使うのか悩まれている方がいらっしゃるようですね。

なので、それについて私の意見をちょっと書いてみようと思います。まぁ、Ruby-GetText-Packageの開発者なので若干偏っているとは思いますが(結論は見えてますしね(苦笑))。

まず、「ロケールによるテンプレート切り替え」ですが、私はこれには否定的な考えです。議事録では利点として

「国際化対応というのは異なる文化慣習への対応でもあるから、単なる文言の修正では済まないこともある。テンプレートごと差し替えてしまえばそういうケースでも対応が楽。」

とあります。これは、真かもしれません。しかし、実際のアプリ開発を考えると

「翻訳者が開発者も兼ねておりしかもずっと開発体制を維持できる」

か、あるいは、

「テンプレートはもう仕様変更無し」

の2つの場合でしか成功しないと思います。特にモリモリ開発中のアプリでは大変です。

例えば、あなたがアプリの開発者だとしましょう。ある画面(テンプレート)にボタンとメッセージを追加したとします。あなたは日本語のテンプレートと、英語のテンプレート(あと、英語っぽいテンプレート)には手を入れることができるでしょう。でも、divタグやらなにやらが変更されているテンプレートについてはあなたが手を入れることはできないでしょう。なので翻訳者に「これこれこういう機能を実装したから、それをテンプレートに反映してね」とお願いしなければなりません。そして、その翻訳者(兼開発者)はその機能を十分に把握した上で適切にテンプレートに反映させる必要があります。

これは本当に骨の折れる作業です。しかも、修正されたテンプレートが正しく修正されたのか、開発者自身が判断つかないという事態になりかねません。「テンプレートごと差し替えてしまえばそういうケースでも対応が楽。」と言う見解にはやはりNOと言わざるを得ません。

さて、開発が進んだところで、翻訳者が開発を続けられなくなった場合どうでしょうか。きっと(古くなってしまった)言語テンプレートは削除せざるを得ないでしょう。

これに対し「文言単位での対照訳」にしておけばどうでしょうか。翻訳者はテンプレート書き換えに比べて(自由度が減るため)負荷が減ります。さらにRuby-GetText-Packageを使っていれば、未翻訳であってもその部分が英語で表示されるだけで済むため、多少無理はあってもその言語を残せる可能性が高まります。その言語で使いたいユーザにとっては少しでも自分の読める言語になっている方が良いと思う人が多いのではないでしょうか。

したがって、私としては、なるべく開発者自身が把握できる範囲でViewの実装までして、文言だけ翻訳してもらう、というスタイル、(まぁ、つまりGetTextのアプローチなわけですが)を強くオススメします。

GetTextの歴史を考えても、多くのGUIアプリはこれで十分なはずです。

とはいえ。どーしてもテンプレート切り換えをしたい場合もあるでしょう。ターゲットが「英語と日本語だけ。自分が全部やるから問題ない!」という場合などはその方が効率的かもしれません。

Rails MLでは同じくYuguiさんがプラグインで実装されていらっしゃいますが、これにさらにRuby-GetText-Packageを組み合わせるとロケールの選択がRuby-GetText-Packageと同等になるため、便利だと思います&ちょっとだけ実装が簡単になると思います。

#次のRuby-GetText-Packageではこの機能を導入しちゃおうかしら。ライブラリとしてはどちらの機能も提供する、というのはアリだよね。

--vendor/localize_templates/init.rb:
 
ActionController::Base.class_eval do
  alias render_file_without_locale render_file
  private :render_file_without_locale
 
  def render_file_with_locale(template_path, status = nil, use_full_path = false, locals = {})
    locale = GetText.locale
    [locale.to_s, locale.language].each do |v|
      localized_path = template_path + "_" + v
      return render_file_without_locale(localized_path, status, use_full_path, locals) if template_exists? localized_path
    end
    render_file_without_locale(template_path, status, use_full_path, locals)
  end
  alias render_file render_file_with_locale
end

こんな感じ。require 'gettext/rails'とinit_gettextは別途必要です。って、試してませんので動かなかったらごめんなさい(苦笑)

話はちょっとズレますが、Rails MLってローカライズ周りのネタって結構話出てるんですかね。Rails ML入った方が良いのかなぁ。ってこれ以上ML入るとメールがパンクしそうでなかなか踏み入れられないものがあるのですが(苦笑)。

おっと、忘れてた。(ローカライズとは別に)User-Agent毎にテンプレートファイルを切り替える目的でrender_fileの挿げ替えというのは良いアイデアだと思います。


February 24, 2010

[Ruby] String#to_fの挙動

げっ。1.8.6だけ挙動が違うのか…。昔は動いていたような気がするのだが…。

#って、もう、1.8.6系ってサポート外にしても良いかなー。

% rvm ruby -e 'p "0.7".to_f'
 
jruby-1.4.0: jruby 1.4.0 (ruby 1.8.7 patchlevel 174) (2009-11-02 69fbfa3) (OpenJDK 64-Bit Server VM 1.6.0_0) [amd64-java] 
 
0.7
 
ruby-1.8.6-p399: ruby 1.8.6 (2010-02-05 patchlevel 399) [x86_64-linux] 
 
7.0
 
ruby-1.8.7-p249: ruby 1.8.7 (2010-01-10 patchlevel 249) [x86_64-linux] 
 
0.7
 
ruby-1.9.1-p378: ruby 1.9.1p378 (2010-01-10 revision 26273) [x86_64-linux] 
 
0.7
 
ruby-1.9.2-preview1: ruby 1.9.2dev (2009-07-18 trunk 24186) [x86_64-linux] 
 
0.7

しかしバージョン間の違いをいとも簡単に見比べることができるのは楽しいね。

[Ruby] String#to_fの挙動(2)

ruby-1.8.6-p399の問題か?

% rvm system
% ruby -v -e 'p "0.7".to_f'
ruby 1.8.6 (2009-08-04 patchlevel 383) [x86_64-linux]
0.7

[Ruby] rvmで利用可能なVMの一覧を取得する。

1.8.6で利用可能なのはp399だけなのかな。

% rvm list --all
  :
  :
(ruby-)1.8.6(-p383)
(ruby-)1.8.6-head
  :
  :

1.8.6-headというのが最新なのかな。じゃ、これをインストールしてみよう。

% rvm install 1.8.6-head
% rvm list
 
rvm Rubies
 
   jruby-1.4.0 [ [amd64-java] ]
   ruby-1.8.6-head [ x86_64 ]
   ruby-1.8.6-p399 [ x86_64 ]
   ruby-1.8.7-p249 [ x86_64 ]

同じバージョンでも複数のパッチレベルを試せるのね。素敵。

[Ruby] String#to_fの挙動(3)

ruby-1.8.6-headで再度試す。

% rvm 1.8.6-head
% ruby -v -e 'p "0.7".to_f'
ruby 1.8.6 (2010-02-05 patchlevel 399) [x86_64-linux]
7.0

がくっ。そうか、ヘッドとは現在の最新のパッチレベルだから今回は同じ399だったってことか…。
ひとまず見なかったことにして今日は寝るとしよう(^^;)。


追記