OS に併せて処理を若干変更 しなければいけない こともあると思うのですが、JRuby では Ruby での一般的な OS の取得方法である PLATFORM 定数を参照しても、常に ‘java’ が返されてしまうため、実際に実行されている OS が今まで通りの方法では取得できません。

 これの解決策としては、Java の System クラスの getProperty メソッドを使う手があります。

java.lang.System.get_property('os.name')
# => 'Mac OS X'

 気をつけておきたいのは MRI などで PLATFORM 定数が返す内容とは異なる為、PLATFORM 定数に正規表現を使って OS を検出している場合、必ずしも同じ正規表現で検出できるとは限らない点です。


 debugger というメソッドを呼び出すことでその行からデバッグ用のコンソールを立ち上げてくれる ruby-debug は、C で書かれているネイティブ拡張を含んでいる為に、C によるネイティブ拡張を標準で利用できない JRuby では使えません。

しかし、その C で書かれている ruby-debug の部分を他の方法で実装した gem をインストールすることによって、MRI (本家 Ruby) と同じように debugger を利用できます。利用手順は以下の通りです。

 気になった点は、jgem でインストールされた ruby-debug-base-0.10.3-java/lib/ 内のいくつかのファイルの権限が 600 になっていた点で、後から手動で 644 に変更しました。


 今週は “先を行くこと” (”Living on the Edge”) がお休みですが、Rails のコミュニティーは相変わらずなので、情報をお待ちの皆様を暇にさせることはありません。

 ライアン・ディーグル (”Ryan Daigle”) が、開発版のいくつかの変更をフォローしており、それらについての素晴らしい解説をいくつか投稿してくれました。

 それらよりも特筆すべきなのは、国際化サポート (I18n: “Internationalization”) が Rails のコアに導入されたことかもしれません。スヴェン・フュッフス (”Sven Fuchs”) が、国際化の技術的な詳細と API および、Rails と国際化の歴史について説明しています。国際化サポートは、Rails 2.2 の公開に合わせて完全に安定化させられる予定です。国際化に興味のある方は、Google グループでアイディアやフィードバック、パッチ等を提供してみてはいかがでしょうか。


先週末は、ソフトバンクから発売されたアップルの携帯電話というかスマートフォン iPhone (”アイ・フォーン”) が、メディアをにぎわせていました。

 そんな iPhone に、Ruby on Rails が生まれたきっかけとなったプロジェクト管理ツール Basecamp を利用する為のアプリケーション、Outpost が8月に提供される様です。


 ここのところ開発版 Rails ではさほど大きな変更や機能追加が無かったので、かなり短くなっています。この記事で触れられていない小規模な変更などについては Rails commit logs の方を参照してください。ActionPack のリファクタリングやマルチスレッド化、ActiveModel などもありますが、まだまだ開発途中で、それほど具体的でないので省略します。

要望や批判がありましたら、いつもの様にコメント欄にお願いします。

script/server が Thin に対応

 script/server が Thin が使用可能かチェックし、可能であれば使用する様になりました。開発環境で Thin を使用している場合でも、運用環境で Thin を使用している場合でも便利な機能でしょう。Thin を使用する場合は、environment.rbconfig.gem 'thin' を追加する必要があります。

この機能のパッチは fluxin の人達が提供してくれました。

コミット内容は GitHub から閲覧できます。

String#humanize が語形変化 (”Inflection”) でカスタマイズ可能に

 中核拡張 (”Core Extension”)String#humanize が、テーブル項目の様なアンダーバー付き文字列を読みやすくするのに使われる様になりました。例えば以下の様になります。

"actor_salary".humanize
=> "Actor salary"
"anime_id".humanize
=> "Anime"

レガシーな項目名を設定していたり、出演者の報酬 (”Actor salary”) という項目に "act_sal_money" といった様な「非人間的」な名前を使っている場合は、"Act Sal Money" が返されてしまい、あまりうまく機能しません。

この語形変化は、単数形、複数形、例外、不可算などと同じように、語形変化法則を指定することでカスタマイズできます。

Inflector.inflections do |inflect|
  inflect.human /_cnt%/, '\1_count'
  inflect.human 'act_as_money', 'Actor salary'
end

正規表現を使って "click_cnt""Click count" できる点は気に留めておきたいところです。

このパッチを提供してくれた ダン・マンジェス (”Dan Manges”)パスカル・エラート (”Pascal Ehlert”) に感謝。

コミット内容は GitHub から閲覧できます。

ハッシュを使って複数テーブルにまたがる条件を設定可能に

 ネイクさん (”Pratik Naik”) が、結合 (”JOIN”) されたテーブルにハッシュでそれぞれ条件を設定できる、小規模ながら便利な ActiveRecord の機能を提供してくれました。説明より以下の例を見た方がわかりやすいでしょう。

Anime.all(
  :joins => :character,
  :conditions => {
    :active => true,
    :characters => { :gender => 'female' }
  }
}

この ActiveRecord クエリーは、アクティブに設定され、キャラクターが女性 (”female”) のすべてのアニメを返します。

コミット内容は GitHub から閲覧できます。

あとがき

 今回は以上です。小規模な修正や変更でも、もっと紹介して欲しいものがあれば、是非教えてください。

きょうのはま

湿度にやられています。