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

April 05, 2008 [長年日記]

[Rails] Rails + ApacheでのREST

っていうタイトルで合ってるのかな、ま、いいや。

今さら、RailsとApacheという組み合わせもないよな、みたいなことを言われそうだけど、AppHonyakuはそういう組み合わせ。fcgiとか使わないと遅くて使い物にならん!という声も多いようだけど、AppHonyakuのように、あまりマスを目指さないサービスで細々とスタートするなら充分使えると思うんだよな(今のところの感想です)。もちろん、よく使うページはページキャッシュしたり、努力はしてるんだけどね。

で、そのページキャッシュなんだけど、Railsについている.htaccessのままだと、同じURLに対するGETはうまくいくけどPOSTがうまくいかない。

具体的には、http://apphonyaku.s332.xrea.com/x/catalogs/というURLにGETするときはcatalogs.htmlというキャッシュファイルを参照してくれるので良いのだけど、同じくPOSTしようとすると、やっぱりcatalogs.htmlを読んでしまうため、POSTされない。

で、以下のように.htaccessを書くことで、POSTの時は無条件にdispatch.cgiに振り分けられるようにできた。

RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_METHOD} =POST [NC]
RewriteRule ^(.*)$ dispatch.cgi [QSA,L]

ちなみに、"=POST"の部分は間にスペースを入れるとerror.logに"RewriteCond: bad flag delimiters"と出力して動作しないので注意。


April 12, 2008 [長年日記]

[Ruby] Ruby-GetText FAQその?

  1. Windowsでrake updatepoがおかしいor不正
    GNU GettextのWin32版が入っているかどうか確認してください。
  2. 日本語しかサポートしないのに、いちいち_("")なんて英語で書いていられないのですが。
    _("")は一切なくして日本語書いちゃいましょう。
  3. _("aaaa #{foo} bbbb") が翻訳対象にならないのですが。
    その形式は翻訳対象になりません。_("aaaa %{foo} bbb") % {:foo => "value"} という形式を使ってください。


April 26, 2008 [長年日記]

[Ruby] Ruby-GetText-Package:TextDomainのスコープ

バグレポートでbindtextdomainがうまく働かない場合があるというレポートをもらった。

TextDomainのスコープは実は曖昧な部分があったので、本来の仕様としてRuby-GetText-Packageでbindtextdomainを宣言したときにそれがどの範囲で適用されるべきかを図に整理してみた。

TextDomainのスコープ

基本的には、クラス・モジュールの中から外に向かってテキストドメインを探していき、その中で最初にヒットした翻訳文字列が使われる。

Rubyのメソッド呼び出しとクラス・スーパークラスの関係にちょっと似てるけど、もうちょっと緩い感じ。たとえば、クラスであればスーパークラスを探す他にクラスの所属しているモジュールも検索対象となる。

あと、GetText.bindtextdomainと記述すると、実はグローバルな宣言になり、どこからも参照されることになる。今のところAnonymousなクラス・モジュールもその性質上グローバルなTextDomainを使うという実装になっている(Anonymousなクラスはたくさん生成される場合があり、それぞれクラス名が異なるとその分bindされるターゲットが異なってしまう。実際Railsがそのような実装をしていてメモリリークをおこしてしまっていた、って、メモリリークには他にも原因があるんだけど(苦笑))。

あとちょっと本題からはずれるけど、1つのクラス・モジュール内で複数のTextDomainにbindすることもできる。これは同じクラス名で別の開発者が別のTextDomainを使って機能を追加する場合に使用されることを想定している。

とまぁ、こんな感じで複数のモジュールを検索していくと時間がかかってしょうがないので、一度検索した翻訳文字列はキャッシュするようになっている。

で、バグレポートの内容なんだけど、トップレベルのbindtextdomain(3行目)が有効にならない、というもの。上記のスコープにしたがって直すこととしよう。