JRuby on rails 2.2.2 new feature(4) : Connection Pooling
前回のスレッドセーフによって、もたらされた大きな機能として、コネクションプーリングがあります。Javaによるweb開発等ではおなじみのこの機能がついにRailsにも提供されることになります。
設定としては、database.ymlに、
development:
adapter: jdbcmysql
database: rails_development
encoding: utf8
pool: 5
username: ユーザ名
password: パスワード
host: localhost
のように、プールサイズを指定することで設定します。デフォルト値は5です。
またJRuby on Railsの場合は、DataSourceを使うことももちろんできますので、
development:
adapter: jdbc
jndi: jdbc/jndi_rails
driver: com.mysql.jdbc.Driver
pool: 5
というように設定して、アプリケーションサーバ側でデータソースを作成すれば、jndi経由でコネクションプーリングを行うことができます。
2008/12/12 by Tomo Nozawa
JRuby on rails 2.2.2 new feature(3) : Thread Safe
昨日のTechDaysでの講演がBuilder zdnetの記事になってました。ちょっと恥ずかしいです。
参加していただいた皆様、ありがとうございました。
あとJavaFX1.0がリリースされたので、ちょっとさわりはじめてみました。Netbeans6.5 on OSXで日本語が文字化けしてしまいます。Windowsでの回避方法は分かったのですが、macではわかりません。macは文字コードUTF-8だった気がするのですが、気のせいでしょうか?どなたか対処法ご存知でしたら、教えてください。
前置きが長くなりましたが、今回は上の記事にもありますが、Rails2.2.2のスレッドセーフとJRubyについてです。コネクションプールは次回。
ご存知の通り、Rails2.2.0からはスレッドセーフとなりました。この恩恵を一番受けるのが、JRubyです。
まずは次の図をご覧ください。

Ruby1.8.7(MRI)の場合、1つのOSのネイティブスレッドがRubyインタプリタに割り当てられ、GILがあって、Rubyのスレッドはグリーンスレッド(ユーザ空間のスレッド)として動作することになります。そのため、Railsがスレッドセーフになっても、Ruby自体がグリーンスレッドのため、グリーンスレッドレベルでのマルチスレッド化となり、Rubyインタプリタ自体はシングルスレッドで動作することになります。そのため、パフォーマンスを向上させるためには、複数のインタプリタを起動させる事が必要となります。
これに対して、JRubyの場合、JVMがネイティブスレッドに対応しており、JRubyのグリーン・スレッドが1対1でJVMに割り当てられたネイティブスレッドにマッピングされることになりますので、実質Railsがネイティブスレッドで動作することになります。そのため、MRIと同じ1つのプロセスでもよりよいパフォーマンスを得ることができるようになっています。
このようにRailsがスレッドセーフになったことで、JRuby on Railsがパフォーマンスという面で考えても非常によい選択肢となったのではないでしょうか?
2008/12/10 by Tomo Nozawa
Rails2.2 new feature(2) - 1 : i18n_generators
先日i18nを試してみましたが、正直ロケールファイルが面倒くさいとおもっていたら、こんなのがあるようです。
JRubyでも動作します。Rails2.2.2以降対応
まずインストール。
$ gem install gettext
$ gem sources -a http://gems.github.com (githubをgemレポジトリとして追加)
$ gem install i18n_generators
デモアプリで試してみます。まずはscaffold。generatorが変更になっています.
$ ./script/generate i18n_scaffold article title:string body:text
この状態で、英語、ドイツ語のロケールファイルが自動生成されますが、日本語がないので、以下のコマンドで作ります。
./script/generate i18n ja
そうすると、environment.rbに
が設定され、config/locales/ja.ymlが自動生成されます。
僕の環境では、generateした時に必ず
undefined method `count' for #
さらにModel/Viewをi18n化したい場合は、
./script/generate i18n_translation ja
で生成されるはずなのですが、同様のエラーが出て、こちらは動作しません。
現在のものでも、十分使えますが、very very very very roughly implemented just for experimentとあるので、これから開発が進んでいくのでしょう。これからの発展に期待です。
Via :: Close to the EDGE
2008/12/09 by Tomo Nozawa
(j)Ruby on Rails 2.2 new feature (2) : i18n
かなり時間があいてしまいましたが、Rail2.2の新機能であそんでみたいと思います。前回は2.2.0でしたが、書かない間に2.2.2の正式リリースがでてしまいました。すいません。
gem update rails
でアップデートできます。アップデート後は、railsコマンドでdemoアプリを作成しなおしました。
今回はi18nを使ってみます。まず日付をローカライズするためのプラグインをインストールします。
./script/plugin install git://github.com/clemens/localized_dates.git
続いてi18nを初期化してロケールファイルを読み込む処理を行います。
I18n.default_locale = 'ja-JP'
%w{yml rb}.each do |type|
I18n.load_path += Dir.glob("#{RAILS_ROOT}/app/locales/*.#{type}")
end
config/initializers/load_i18n.rb(ファイル名は任意)に上記の内容を記述。
demoアプリでscaffold
./script/generate scaffold post title:string content:text
もちろんmigration。そしてapp/models/posts.rbを編集。
class Post < ActiveRecord::Base
validates_presence_of :title, :content
validates_uniqueness_of :title
end
つづいて、ロケールファイルの準備。
app/locales/ja-JP.rb
{
:'ja-JP' => {
:date => {
:formats => {
:default => "%Y-%m-%d",
:short => "%e %b",
:long => "%B %e, %Y",
:long_ordinal => lambda { |date| "%B #{date.day}, %Y" },
:only_day => "%e"
},
:day_names => %w(日曜日 月曜日 火曜日 水曜日 木曜日 金曜日 土曜日),
:abbr_day_names => %w(日 月 火 水 木 金 土),
:month_names => [nil] + %w(1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月),
:abbr_month_names => [nil] + %w(1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月),
:order => [:year, :month, :day]
},
:time => {
:formats => {
:default => "%a %b %d %H:%M:%S %Z %Y",
:time => "%H:%M",
:short => "%d %b %H:%M",
:long => "%B %d, %Y %H:%M",
:long_ordinal => lambda { |time| "%B #{time.day}, %Y %H:%M" },
:only_second => "%S"
},
:am => '',
:pm => ''
},
:datetime => {
:distance_in_words => {
:half_a_minute => '30分',
:less_than_x_seconds => '{{count}} 秒以下',
:x_seconds => '{{count}} 秒',
:less_than_x_minutes => '{{count}} 分以下',
:x_minutes => '{{count}} 分',
:about_x_hours => '約 {{count}} 時間',
:x_days => '{{count}} 日',
:about_x_months => '約 {{count}} ヶ月',
:x_months => '{{count}} ヶ月',
:about_x_years => '約 {{count}} 年',
:over_x_years => '{{count}} 年以上'
}
},
:number => {
:format => {
:precision => 3,
:separator => '.',
:delimiter => ','
},
:currency => {
:format => {
:unit => '¥',
:precision => 2,
:format => '%u%n'
}
}
},
:activerecord => {
:errors => {
:template => {
:header => "{{model}}でエラーが発生しました",
:body => "以下のメッセージを確認してください:",
},
:messages => {
:inclusion => "は、含まれていません",
:exclusion => "は、有効ではありません",
:invalid => "は、妥当ではありません",
:confirmation => "は、確認できません",
:accepted => "は、入力できません",
:empty => "は、何も入力されていません",
:blank => "は、ブランクです",
:too_long => "は、長すぎます ({{count}}文字以下)",
:too_short => "は、短すぎます ({{count}}文字以上)",
:wrong_length => "は、桁数が合っていません({{count}}桁必要です)",
:taken => "は、有効ではありません",
:not_a_number => "は、数字ではありません",
:greater_than => "は、{{count}}文字を超えて入力されています",
:greater_than_or_equal_to => "は、{{count}}文字以上入力されています",
:equal_to => "は、{{count}}と同値です",
:less_than => "は、{{count}}文字未満です",
:less_than_or_equal_to => "は、{{count}}文字以下で入力されています",
:odd => "は、端数が入力されています",
:even => "は、偶数が入力されています"
}
},
:models => {
:post => "記事"
},
:attributes =>{
:post =>{
:title => "タイトル",
:content => "内容"
},
},
},
}
}
これでエラーメッセージが日本語化されます。

上記はruby hashで記述しましたが、
:ja-JP
:date
:format
:default "%Y-%m-%d"
.
.
.
のようにyaml形式で書くこともできますので、viewの日本語化をymlで書きます
/app/locales/ja-JP.yml
ja-JP:
label:
posts:
new_post: 新しい記事を作成
create: 投稿する
back: 前の画面へ
そしてview、app/view/posts/new.html.erbを以下のように編集。
<h1><%= t('label.posts.new_post') %></h1>
<% form_for(@post) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :title, t('activerecord.attributes.post.title') %><br />
<%= f.text_field :title %>
</p>
<p>
<%= f.label :content, t('activerecord.attributes.post.content') %><br />
<%= f.text_area :content %>
</p>
<p>
<%= f.submit t('label.posts.create') %>
</p>
<% end %>
<%= link_to t('label.posts.back'), posts_path %>
そうすると、このように、

viewも日本語化できます。
正直なところ、gettextを使う方が何倍もお手軽ですが、Rails標準のi18nとして使うことがあるかもしれません。
2008/12/05 by Tomo Nozawa
