火曜日 12 23, 2008

Merb will be merged into Rails 3 !!

歴史は繰り返すとはこのことでしょうか。眠気もさめるようなニュースが到来。 ちょうどかつてWebwork2がStruts2にマージされたように、


 


最近話題を集める「Merb2」がRails3にマージ!


このマージによる変更点やメリットなど。




  • merb-coreをベースにRailsが作られる。それにより現在のmerbのように、Railsがモジュール化する。

  • ORM/template/javascriptなどは、デフォルトとして提供されるものもあるが、それ以外のものもサポートする。たとえばORMでは、デフォルトは現状と同じActive-Record。一方でSequelやDataMapperも使用可能に。テストではRSpecが使えたりなど。

  • パフォーマンスを改善するために行われたMerbの改善点をRailsにポート。

  • プラグイン開発のためのpublic APIを提供。現状のRailsで起こりがちなRailsのアップグレードによるプラグインの動作不能をなくすためのプラグイン開発用APIを提供。

  • Rails3は現状の2.xといくつかの部分で互換性がなくなる。非互換部分は最小にする予定で、2.xのアプリケーションを3のアプリケーションに簡単にマイグレーションする方法も提供予定。


 


少なくとも5月にラスベガスで開催されるRailsConf2009にはベータバージョンをリリース予定。全体的にRailsがMerbのいいところを取り入れるような感じになるようですね。


以下、アナウンス。


The day Merb joined Rails
Katz Got Your Tongue?
The Merbist

金曜日 12 12, 2008

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経由でコネクションプーリングを行うことができます。

水曜日 12 10, 2008

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がパフォーマンスという面で考えても非常によい選択肢となったのではないでしょうか?

火曜日 12 09, 2008

Rails2.2 new feature(2) - 1 : i18n_generators

先日i18nを試してみましたが、正直ロケールファイルが面倒くさいとおもっていたら、こんなのがあるようです。


i18n対応Scaffoldとロケールファイルを自動生成してくれるgem。現在0.3.1。

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.i18n.default_locale = 'ja'


が設定され、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

月曜日 12 08, 2008

Ruby EE for Solaris!

Ruby1.8.6互換で、GCをmark&sweepに対応させ、メモリ使用量を削減したRuby Enterprise Editionに、ついにSolaris正式対応版が登場。

Ruby Enterprise Edition 20081205

正式対応したことで、インストールも非常に簡単に。


$ gtar zxvf ruby-enterprise-1.8.6-20081205.tar.gz
$ ./ruby-enterprise-1.8.6-20081205/installer



注意点としては1つ。LD_LIBRARY_PATHを/opt/sfw/libに通していると、コンパイルエラーとなりますので、/opt/sfw/libを外してください。

sparc Solarisでしか試していませんが、多分x86でも行けると思います。

これでSolarisでもApache2+Passenger+Ruby EEという組み合わせが使えます!

金曜日 12 05, 2008

(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として使うことがあるかもしれません。

木曜日 10 09, 2008

How to compile EventMachine on Solaris

thinやneverblockを使う際に必要になるeventmachine。しかしSolarisではデフォルトでは、gem install eventmachineではコンパイルエラーでインストールできません。eventmachineをインストールするには、一工夫必要です。

まずgccではなくSun Studioをインストール。

その後、環境変数に以下の値を設定します。


export CXX=g++



(/usr/sfw/binにはパスを通しておいてください)

そして


gem install eventmachine



これでthinもneverblockも使うことができます。

金曜日 9 26, 2008

Passenger for Solaris

RailsアプリケーションをApacheに非常に簡単にデプロイできるモジュールPhusion Passenger a.k.a. mod_rack/mod_railsをSolaris10(SPARC) + Apache 2.2.9で動作させてみました。

今回はSPARC版ですが、基本的にx86版でも動作すると思います。






あらかじめSunStudioまたはgccをインストールしておきます。

そしてまずCoolStackのRubyを用意します。CoolStackのRubyはこちらからダウンロードできます。

解凍後、pkgaddします。



あらかじめSunStudioまたはgccをインストールしておきます。

そしてまずCoolStackのRubyを用意します。CoolStackのRubyはこちらからダウンロードできます。

解凍後、pkgaddします。


pkgadd -d . CSKruby_1.3.1_sparc.pkg



そうすると、/opt/coolstack/bin/ 以下にruby/gemがインストールされるので、パスを通しておきます。

Passengerのインストール時に必要になるので、rackをインストールします。


gem install rack



上記のmod_rackのサイトのバイナリ/ソースではインストールできないので、
こちらからパッチをあてたソースをダウンロードします

9/29追記]Passenger2.1.0からSolarisパッチがマージされているようです。こちらからソースをダウンロード。

ソースを解凍後、(ここでは解凍後/opt/passengerというディレクトリに展開されたとします)以下のようにしてインストールします。


cd /opt/passenger/bin
./passenger-install-apache2-module



対話式のインストールになりますので、指示に従うだけでPassengerがインストールされます。後は、httpd.confに通常のPassengerと同様に


LoadModule passenger_module /opt/passenger/ext/apache2/mod_passenger.so
PassengerRoot /opt/passenger
PassengerRuby /opt/coolstack/bin/ruby



と設定し、後はVirtual hostを設定するだけで、railsを動作させることができます。

土曜日 9 20, 2008

New Relic Lite

(J)Railsアプリケーションの状況をブラウザ上で監視するサービス「Relic」から無料版が登場。

RPM Lite


上記のサイトで登録すると、Rails用のプラグインのアドレスとライセンスが送られてきます。そのメールにしたがってプラグインをインストール後、送られてきたライセンスファイルを<$RAILS_ROOT/config/に配置すると自動的に情報を送信し始めます。


その後は、カットオーバー後のサイトであれば、New Relicのページにて、リアルタイムに監視することが可能です。無料版の場合、CPU、メモリー負荷、ActiveRecordのfind/saveのレスポンス時間、ユーザリクエストのレスポンス時間、各アクションのレスポンス時間などをみることができます。


また開発中であれば、Developer Modeというものがあり、ローカルホストで上記のような情報を取得することも可能です。アプリケーションのボトルネックを見つけるにはちょうどいいかもしれません。


さらに有料版ではActiveRecordの詳細情報やCluster情報、Error、トランザクション情報もみることができます。

水曜日 9 10, 2008

Bort : the prototype of rails2.1 application

新しくRailsアプリケーションを作ろうとした際に、最初のいくつかの工程はいつも同じかもしれません。例えばrestful_authenticationインストールして、generateして、route.rbを書き換えて、will_paginateをインストールして、Capistranoの設定ファイルを作ってという風に。

正直なところ、少し面倒かもしれません。その面倒くささに着目したRails2.1用のアプリケーションのひな形が登場

bort

このbortには以下のプラグインおよび設定がなされています。
Restful Authentication
user/sessionコントローラ作成済み。AASMインストール済み。route.rbおよびmailer/observer設定済み。ユーザアクティベーション設定、パスワードリマインダー設定。

Will Paginate
プラグイン版
Rspec & Rspec-rails
Exception Notifier

Railsアプリで問題が発生した場合、メールで通知。
deploy.rb

Capistranoの設定ファイルひな形作成済み。


ほかにもindex.htmlやrails.pngが消去済みだったり、application.html.erbが作成済みだったり、かゆいところに手が届く感じのひな形になっています。

ルーティンワーク的な処理がすべて終わっているという意味では、ちょっと便利かもしれません。

火曜日 9 09, 2008

NeverBlock for MySQL

前回のポストで来るRails2.2のマルチスレッドとそれに伴うコネクションプーリングが実装されるという話を書きましたが、現状のRailsでもコネクションプールのようにパラレルにDBに対してクエリを投げることができるactive recordのアダプター「NeverBlock」が大きな話題になっています。

このアダプタは、Ruby1.9のFiberを1.8系にポートしたPoor Man's Fiberを使って実装されたもので、Ruby1.8系で動作し、Railsをサポートしています。

このNeverBlockはDBはPostgresまたはMySQLをサポートし、EventMachineと組み合わせることで劇的にパフォーマンスを向上させることができるようです。

では、実際にNeverBlock for MySQLを使ってみたいと思います。

まず、上記サイトからNeverBlockをチェックアウト。

git clone git://github.com/espace/neverblock.git


続いて、MySQL用ドライバ、カスタマイズされたEventMachineをチェックアウト。

git clone http://github.com/espace/mysqlplus.git

git clone http://github.com/espace/eventmachine.git



それぞれgemをビルドし、インストール。

gem build [それぞれのgem名].gemspec

gem install [それぞれのgem名].gem


現状対応しているアプリケーションサーバはthinとmongrelのみで、config/environment.rbに、thinを使う場合は

require 'never_block/frameworks/rails'

require 'never_block/servers/thin'



mongrelの場合は、

require 'never_block/frameworks/rails'

require 'never_block/servers/mongrel'



と記述。

そしてdatabase.ymlのアダプタを

adapter: neverblock_mysql

に変更します。これでNeveBlockを使うことが可能になります。またdatabase.yml内に

connections: [数字]


というパラメータを足してやれば、コネクション数を設定可能です。(記述しない場合はデフォルトの4になります)

NeverBlockを使うことで特に高負荷時にパフォーマンスが劇的に向上するようです。

月曜日 9 08, 2008

Rails 2.2 and Connection Pooling

C・ナッターのスレッドセーフRailsに関するブログ記事が大きな話題になっていますが、まもなくそのスレッドセーフであるRails2.2が登場します。

この2.2からスレッドセーフになることにより、以前取り上げた通り、従来まではActiveRecordではデータベース接続が1つで使い回していたものが、コネクションプーリングを行うことができるようになるようです。

2.2からはdatabase.ymlにpoolパラメータが追加され、以下のような設定でプール数を設定可能になります。

development:
adapter: mysql
username: root
database: myapp_dev
pool: 10


ナッターの文章にもありますが、スレッドセーフになることにより、JRubyを使えば、RubyのスレッドはJavaを経由してカーネルネイティブスレッドへと展開されるため、従来よりはるかに高いスケーラビリティを得ることができるようになるはずです。またJDBCのコネクションプールをJRubyから使うことにも意味が出てきて、より信頼性が高く、効率的になるはずです。

木曜日 6 19, 2008

Ruby Kaigi 2008

明日からいよいよRuby会議2008

それに合わせて、C・ナッターが来日。

ナッターは21日(Sat.)にJRuby: Ready for Actionというセッション予定

明日20日には河原さんがSunではじめるエンタープライズRubyの世界という事例紹介を行います。
僕も3日間、参加します!。Sunのブースにいるので、時間があれば来てくださいね!

金曜日 6 13, 2008

Passenger2.0

オランダのスタートアップ「Phusion」が開発し、大きな話題になったPassenger。
それを大幅に改良したPassenger2.0RC1がRailsConfで発表され、リリースがまたれていましたが、ついに登場。
Passengerはmod_railsとも呼ばれ、phpのように特に難しい設定をすることなく、RailsアプリをApacheで高速に動作させることができるというものです。
1.0.5では高速なものの、そのメモリ消費量が問題視されていましたが、2.0では大幅にメモリ使用量を改善。さらに2.0では以下のような特徴があります。
  • Rackサポート
    これによりRails専用だった1.0.5とは異なり、MerbなどのRack対応アプリも動作可能に
  • WSGIサポート
    Pythonのウェブ層抽象化のWSGIをサポート。Djangoが動作可能に
  • Apache Worker MPMをサポート
  • Fair Load バランシングをサポート

もちろんより安定性が向上したことに加えて、パフォーマンスも向上。
2.0でレンタルサーバなどリソースが限定されている環境でより手軽にRailsアプリを使えるようになったことは間違いないでしょう。
なお詳細はRailsConfでのプレゼンテーション資料(PDF)をご覧ください。


木曜日 6 12, 2008

Maglev

RailsConfで発表されたMaglevプロジェクトが気になります。
Maglevとはリニアモーターカーを意味する名の通り、新しい超高速なRubyの処理系。
SmallTalk VM(GemStone)を手がけるGemStone社が、Smalltalk VMを拡張する形で実現しようとしているもの。
ただ近日中にはリリース予定のようですが、最終的にはRails環境に非常に高速で安定し、スケーラブルな環境をもたらすことを意図しているようです。
こちらの記事を見る限り、既存の処理系では圧倒的といっていいほど高速な処理を提供しています。もちろんベンチマーク特性などによって、ほかのテストでは悪い結果もでているようですが。
まだまだ未実装なとこるが多く、安定稼働までは時間がかかりそうな気もしますが、その動向から目を離せないプロダクトです。
About

Tomo

Search

Archives
« 4月 2014
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
今日