Ruby言語やLinuxのネタが多いです。
February 06, 2009 [おもひで]
■ [Ruby] github.comはじめました
とりあえず、Ruby-GetText-Packageの最新版をgithub.comに移行してみた。
まだ使い方わかんないから密かにやろうかなと思ってたら、もう、pullしてくれとかいうメールが来た。どうすりゃいいんだ(汗)。
[/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上でチェックできるよ
と言われた。こんなの。
ここで、Fork Queueを選択すると次の画面へ。
で、使ってみたら、これは便利。
これ、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 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してみてくださいませ。
■ [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。
