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

February 06, 2009 [長年日記]

[Ruby] github.comはじめました

とりあえず、Ruby-GetText-Packageの最新版をgithub.comに移行してみた

まだ使い方わかんないから密かにやろうかなと思ってたら、もう、pullしてくれとかいうメールが来た。どうすりゃいいんだ(汗)。

[Ruby] Ruby-GetText-Packageのテストの仕方 on github.com

忘れないようにメモ。とりあえず、こんな感じ。

[/home/foo]$ gem uninstall gettext  (重要)
[/home/foo]$ gem install locale
[/home/foo]$ gem install allison  (for RDoc)
[/home/foo]$ git clone git://github.com/mutoh/gettext.git
[/home/foo]$ cd gettext
[/home/foo/gettext]$ rake makemo
[/home/foo/gettext]$ rake test

[Ruby] gitのChangelog

変更履歴はChangeLogを手で書くんじゃなくてコミットのログから生成すべきだよね・・・。

でも、pullした時のマージ元のlogってどうやって取得できるの?

git logってやってみたけど出てくるのはorigin/masterの修正分だけみたいなの。


February 07, 2009 [長年日記]

[Ruby] github.comはじめました (2)

Forkしてくれた人がpullしてくれー、と言ってきた、という話の続き。

なんだか大改修してくれちゃったなー、とほほ、全部いきなりはマージ無理ッスと愚痴言ったら、

「Fork Queue」で一つずつWeb上でチェックできるよ

と言われた。こんなの。

github.com / Fork Queue (1)

ここで、Fork Queueを選択すると次の画面へ。

github.com / Fork Queue (2)


で、使ってみたら、これは便利。
これ、commitする単位・・・かな。受け取った側はその単位でApply/Ignoreを実施できる。もちろん、Web上から。
些細な修正はどんどんApplyできるのがとてもいい。
Forkした側もなるべく一つ一つの修正単位を小さくするとApplyされやすくなるだろうな。


February 08, 2009 [長年日記]

[Ruby] github.comはじめました (3)

昨日、Webから実施したFork QueueのApplyした結果をローカルに取り込もうと思って、git pullした。

これで反映できたのかなぁ?と思いつつ、その後、手元で何点か変更しgit commit、git pushしたら

[mutoh@sowhat]~/dev/git/gettext% git push
To git@github.com:mutoh/gettext.git
 ! [rejected]        master -> master (non-fast forward)
error: failed to push some refs to 'git@github.com:mutoh/gettext.git'
 

と怒られた。いろいろ試したけどよくわからず。結局、こちらのサイトに従い、以下のようにしてみたら、うまく変更が反映された…模様。これは正しいやりかたなのか? むー、きちんとgit勉強しないとダメみたいだな・・・。今オレがやりたいのはgitを勉強することではないのだけど、いつもながらこうやって目的がスリかわってくのね・・。

 git fetch origin
 git push origin +master

今日の確認ポイント:
Fork QueueのApply結果をローカルに取り込む場合はfetchを使う?


February 09, 2009 [長年日記]

[Ruby] github.comはじめました (4)

昨日のFork QueueでApplyしたものが微妙にとれていない気がする・・・。pullじゃだめなの?


February 12, 2009 [長年日記]

[Ruby] github.comはじめました (5)

gitの使い方がよくわからん!とイライラしてたら、Git cheat sheetなるものを教わった。右上に作業のフローが書いてあったりして便利そう。


February 13, 2009 [長年日記]

[Rails] ActiveRecord-2.3.0のValidationのローカライズ

Ruby-GetText-PackageのActiveRecordのローカライズではメッセージのローカライズは出力時に実施する、というポリシーで実装している。以下の例を見ればわかりやすいと思う。

GetText.locale = "ja"
a = Article.new
a.save #=> false
a.errors.full_messages #=>  ["タイトルを入力してください。", "内容は10文字以上で入力してください。"]
GetText.locale = "en"
a.errors.full_messages #=> ["Title can't be blank", "Description is too short (minimum is 10 characters)"]

しかし、ActiveRecord-2.3.0では、エラーメッセージを生成したタイミングでローカライズしてしまうので一度エラーメッセージを生成後、そのメッセージを再度別の言語で出力できない。具体的には以下のようになる。

I18n.locale = "ja"
a = Article.new
a.save #=> false
a.errors.full_messages #=>  ["タイトル を入力してください。", "内容 は10文字以上で入力してください。"]
I18n.locale = "en"
a.errors.full_messages #=>  ["タイトル を入力してください。", "内容 は10文字以上で入力してください。"]

例えば、1画面で英語と日本語のエラーメッセージを出力する、ということができる今のGetText wayの方が作りとしてはベターだと思う。

今後の方針だけど、GetTextの実装を再度ActiveRecord-2.3.0に適合させるか、あるいは単にActiveRecord-2.3.0に合わせるか、という2つの案がある。
前者は再びモンキーパッチと言われてしまうデメリットがあり、後者は機能的な退化になる。どうしたものかなぁ。悩ましい。


February 15, 2009 [長年日記]

[Rails] gettext_activerecord

Ruby-GetText-Packageの機能の中から、ActiveRecord-2.2以降向けの機能を独立させたものがgettext_activerecordです。

とりあえず一通りのテストが通ったのでgithubに置いておきます。

まだ、Railsと一緒に、というわけにはいきませんが、ActiveRecord単体ではすでに動作するレベルになっています。sampleフォルダに例がありますのでそちらで遊んで見てください。

それから、テストはここに手順を書いてみました。

もし、開発に参加するぞ!という方がいらっしゃいましたら、ぜひともforkしてみてくださいませ。

そうそう、昨日の問題ですが、従来のRuby-GetText-Packageと同じ動作にしました。ま、あまりうれしい人が多いとは思わないのですが(苦笑)。

[Rails] Rails I18nのbackend

gettext_activerecordはRails I18nのbackendは使用していません。したがって他のbackendと組み合わせて使うことができます。

現在、Rails I18nのbackendは1つしか指定できないので、Ruby-GetText-Packageをbackendとして定義してしまうと例えば他のbackendを前提としたプラグインなどのローカライゼーションができなくなってしまうためです。

基本的にRuby-GetTextのメソッドは_("")を使います。t()とかI18n.t()などのRails I18nのメソッドをオーバーライドする必要がないのもbackendを使う必要がない理由の強い理由の1つです。もちろん、Simpleバックエンドを継承したbackendを作って・・・ということもできますが、それじゃ他のbackendのときはどうすんの?とかその辺が美しくないですよね。

それから、もう一つの理由として、backendを使ったとしてもどっちにしろ本体側にも手を入れる必要があることがあります。どうせモンキーっすよ。へへ。

実態としては今後しばらくはSimple backendと組み合わせて、Ruby-GetTextファミリがサポートしていないRails本体やSimple backendベースのプラグインのローカライゼーションはSimple backendに任せて、アプリのL10nはRuby-GetTextを使う、という住み分けになるのではないかと考えています。

[Rails] gettext_activerecordをRails-2.2で使ってみたいという気の早い人へのアドバイス

まだ試していないのですが、ActiveRecordの部分だけでもRails-2.2で使ってみたい、ということがありましたら、たぶん以下のようにするとよいと思います。

1. locale, locale_rails gemを入れる。

2. locale_railsのチュートリアルに従い、アプリをI18n化しておく。

3. init_localeの前後に、bindtextdomain_to(ActiveRecord, "sample_textdomain", :path => RAILS_ROOT + "locale")みたいな感じでActiveRecordに対し、使用するテキストドメイン(sample_textdomain)を教えてあげる。

こんな感じですね。あとはRakefileですが、これはサンプルのを見ていただければ大丈夫じゃないかな。

そんな感じでレッツトライ!


February 17, 2009 [長年日記]

[github] locale, locale_rails

github.comが心地よいので、Ruby-Locale, Ruby-Locale for Railsもgithub.comに移行しました。エンジョイ!(<オレ)


February 26, 2009 [長年日記]

[Rails] Rack-0.9.1を試す

早くもlocale_railsがRails-2.3.0rc1で動作しなくなった。

Rack統合が原因であることはすぐにわかった(ActionController::AbstractRequestがなくなったことでエラーになっていた)が、そもそもRackって何ぞや、ということで試してみることにした。

こちらを参考に。

まずはインストール

gem install rack

hello.rb

 require 'rubygems'
 require 'rack'
 
 class HelloApp
   def call(env)
     body = "Hello, Rack"
     [200, {"Content-Type" => "text/plain"}, [body]]
   end
 end

hello.ru

 require 'hello'
 run HelloApp.new

サーバ起動

 $ rackup hello.ru

Firefoxからhttp://localhost:9292/ にアクセスして・・・ NO!! ほぼコピペなのにエラー・・・orz。

Rack::Lint::LintError: No Content-Length header found

このバージョンではContent-Lengthを指定しないといけないのか・・・。なるほど。

 require 'rubygems'
 require 'rack'
 
 class HelloApp
   def call(env)
     body = "Hello, Rack"
     [200, {"Content-Type" => "text/plain", "Content-Length" => body.length}, [body]]
   end
 end

サーバ再起動。うーん、またしてもエラー。

Rack::Lint::LintError: header values must respond to #each, but the value of 'Content-Length' doesn't (is Fixnum)

#each持ってないといけないのか・・・・。Fixnumじゃダメってことなのね。とりあえず配列にしてみよう。

 require 'rubygems'
 require 'rack'
 
 class HelloApp
   def call(env)
     body = "Hello, Rack"
     [200, {"Content-Type" => "text/plain", "Content-Length" => [body.length]}, [body]]
   end
 end

サーバ再起動。うーん、またしてもエラー。

Rack::Lint::LintError: header values must consist of Strings, but 'Content-Length' also contains a Fixnum

文字列じゃないとダメってことか?

 require 'rubygems'
 require 'rack'
 
 class HelloApp
   def call(env)
     body = "Hello, Rack"
     [200, {"Content-Type" => "text/plain", "Content-Length" => body.length.to_s}, [body]]
   end
 end

"Hello, Rack" やったーっ!(ヒーローズのヒロ風。勢いで牡丹をジンタンと読む感じで)

.... ってか、疲れた。locale_railsはまた後にしよう。

[Rails] Rack-0.9.1 + Ruby-Locale-0.9.0

LocaleのCGIドライバは、Ruby標準添付のCGIモジュールに依存した作りになっているのだが、CGIを使わずにRack::Requestを使用するRackではそのままではRuby-Localeを使えない。で、ちょっとだけRack::RequestをいじってCGIと同じように振る舞うようにしてしまうことでRuby-Localeで動作するようになる。

 require 'rubygems'
 require 'rack'
 require 'locale'
 
 module Rack
   class Request
     def has_key?(key); params.has_key?(key); end
     def accept_language; env["HTTP_ACCEPT_LANGUAGE"]; end
     def accept_charset; env["HTTP_ACCEPT_CHARSET"]; end
  end
 end
 
 class HelloApp
   Locale.init(:driver => :cgi)
 
   def call(env)
     request = Rack::Request.new(env)
     Locale.set_cgi(request)
     str = "#{Locale.candidates.inspect}"
     [200, {"Content-Type" => "text/plain", "Content-Length" => str.length.to_s}, [str]]
   end
 end

ちなみにRails-2.3.0の新しいActionController::RequestはRack::Requestを継承しつつ、CGIに近いインタフェースになっているのでLocaleのCGIドライバをそのまま使える・・・といいのだけど・・・。has_key?は無さげだ・・・orz。