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 26, 2008 [おもひで]
■ [Ruby] Ruby-GetText-Package:TextDomainのスコープ
バグレポートでbindtextdomainがうまく働かない場合があるというレポートをもらった。
TextDomainのスコープは実は曖昧な部分があったので、本来の仕様としてRuby-GetText-Packageでbindtextdomainを宣言したときにそれがどの範囲で適用されるべきかを図に整理してみた。
■ 基本的には、クラス・モジュールの中から外に向かってテキストドメインを探していき、その中で最初にヒットした翻訳文字列が使われる。
Rubyのメソッド呼び出しとクラス・スーパークラスの関係にちょっと似てるけど、もうちょっと緩い感じ。たとえば、クラスであればスーパークラスを探す他にクラスの所属しているモジュールも検索対象となる。
あと、GetText.bindtextdomainと記述すると、実はグローバルな宣言になり、どこからも参照されることになる。今のところAnonymousなクラス・モジュールもその性質上グローバルなTextDomainを使うという実装になっている(Anonymousなクラスはたくさん生成される場合があり、それぞれクラス名が異なるとその分bindされるターゲットが異なってしまう。実際Railsがそのような実装をしていてメモリリークをおこしてしまっていた、って、メモリリークには他にも原因があるんだけど(苦笑))。
あとちょっと本題からはずれるけど、1つのクラス・モジュール内で複数のTextDomainにbindすることもできる。これは同じクラス名で別の開発者が別のTextDomainを使って機能を追加する場合に使用されることを想定している。
とまぁ、こんな感じで複数のモジュールを検索していくと時間がかかってしょうがないので、一度検索した翻訳文字列はキャッシュするようになっている。
■ で、バグレポートの内容なんだけど、トップレベルのbindtextdomain(3行目)が有効にならない、というもの。上記のスコープにしたがって直すこととしよう。
