|
事業仕分けによる次世代スーパーコンピューターの開発予算削減について、どうお考えですか?
|
Ruby on Rails 2.0入門:Flickerベースのアプリケーションの作成はじめに2004年に初めてリリースされたRails Webアプリケーションフレームワークは、Ruby言語のキラーアプリケーションになり、CRUD(Create、Read、Update、Delete)パターンに基づくWebアプリケーションを短時間で作成できる非常に強力なツールとして急速に普及しました。そして2007年末、今やすっかり有名になったこのWebアプリケーションフレームワークのバージョン2.0がリリースされました。最初のリリースのときほどの驚きはありませんが、Rails 2.0はやはり多くのイノベーションを実現し、開発をより効率的で楽しいものにしています。本稿では、Rails 2.0の概要と、最も重要な新しい機能を説明し、それらを使ってシンプルでも目を引くWebアプリケーションを作成する方法を紹介します。よくある「15分でブログを作る」というような例ではなく、ここで紹介するアプリケーションサンプルは、最近人気の写真共有Webサイト「Flickr」向けの、便利で一度使ったらやめられないフォトブラウザです。 図1〜4は、サンプルのフォトブラウザ「RailTrack」のスクリーンショットです。スクリーンキャストについては、こちらを参照してください。 図1 RailTrackrスクリーンショット1:Rails 2.0のFlickrブラウザ ![]() 図2 RailTrackrスクリーンショット2:Floridapfeのフォトセット ![]() 図3 RailTrackrスクリーンショット3:Floridapfeの「Snowy Owl」フォトセット ![]() 図4 RailTrackrスクリーンショット4:「Snowy Owl」フォトセットのキツネザルの写真 ![]() インストールと基本セットアップ最初に行わなければならないのは、Rails 2.0フレームワークをインストールして基本的なアプリケーションのスキャフォルドを作成し、すべて正しくセットアップされていることを確認することです。Ruby言語とRubyGems(Rubyライブラリの標準パッケージングシステム)がシステムにまだインストールされていない場合は、RubyおよびRubyGemsのWebサイトを参照してインストールしてください。また、Pastieのサイトも参照してください。これは、Rails 1.xベースのアプリケーションを新しいバージョンに移行できるかどうかをチェックするツールです。準備ができたら、Rails 2.0をインストールします。手順は前のバージョンと同じです。端末を開き、次のコマンドを入力します。 gem install rails --include-dependencies $ sudo gem update actionmailer actionpack activerecord activesupport $ sudo gem install activeresource $ sudo gem update rails $ ruby -v ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0] $ gem -v 1.0.1 $ rails -v Rails 2.0.2 $ gem list --local *** LOCAL GEMS *** actionmailer (2.0.2, 1.3.6, 1.3.3) actionpack (2.0.2, 1.13.6, 1.13.3) actionwebservice (1.2.6, 1.2.3) activerecord (2.0.2, 1.15.6, 1.15.3) activeresource (2.0.2) activesupport (2.0.2, 1.4.4, 1.4.2) rails (2.0.2, 1.2.6, 1.2.3) ... other libraries here ... すべて正しく動作していることを確認するには、次のコマンドを使って新しいWebアプリケーションのスキャフォルドを生成します。 rails testapp cd testapp/ script/server 図5 新たに作成したRails 2.0アプリケーションのウェルカム画面 ![]() RailTrackrアプリケーションRailTrackrは、ビジュアルリッチなWebベースのFlickrフォトブラウザです。このブラウザを使って、Rails 2.0の優れた機能を紹介します。サンプルアプリケーションを起動するには、本稿のサンプルコードをダウンロードし、通常のscript/serverコマンドを実行します。このアプリケーションはFlickrのAPIを使って写真を読み込むので、Flickr ServicesのサイトにAPIキーを要求し、そのキーをサンプルコードのflickr_helper.rbファイルに入力する必要があります。このアプリケーションは、Flickrのユーザー、フォトセット、およびフォトセットに含まれる写真をナビゲートする方法を提供します。つまり、ここでは、FlickrUser、Photoset、Photoの3つのエンティティが定義されています。アプリケーションドメインでは、1つのFlickrUserに複数のPhotosetを割り当てることができ、各Photosetに複数のPhotoを割り当てることができます。これらがRailTrackrのRubyモデルになります。 Rails 2.0のRESTサポートRails 2.0の主な新機能の1つは、完全に「RESTful」であることです。REST(Representational State Transfer)のAPIに従うことでリソースの公開が非常に簡単になりました。実際、すべてのRailsモデル、もっと正確に言えば、アプリケーションのすべてのリソースを、HTTPプロトコルの基本コマンド(GET、POST、PUT、DELETE)を使って操作、アクセス、変更可能なオブジェクトとして公開できます。これらのコマンドは公開されるリソースに対するCRUD(Create、Read、Update、Delete)操作に直接マップされます。RESTはRails 1.xでもすでにサポートされていましたが、さらに統合が進み、使いやすくなりました。RESTの原則に従ってリソースを公開するために必要なことは、写真リソースの操作に関する表1のようなメソッドを持つRailsコントローラを定義することだけです。 表1 RESTコントローラが提供しなければならないメソッド
script/generate scaffold Photoというコマンドを実行すると、次のファイルとエレメントが作成されます。
多様なビューRails 2.0では、マルチビューのサポートがテンプレートにまで拡張されています。それぞれ特定のエンジンでレンダリングされているリソースに、さまざまな形式でアクセスし操作することができます。ビューのファイル名構文は[name_of_the_view].[format].[engine]です。たとえば、show.html.erbというファイルは、次の処理を実行します。
コントローラはrequest.format関数とrespond_to関数を使って、レンダリング形式の変更と実行フローの適切なテンプレートへの転送をそれぞれ行うことができます。指定がない場合、Railsは要求されたリソースのMIMEタイプに従って適切なテンプレートを検出します。次のリストに、コントローラのメソッドが写真のリストをHTMLページまたはXMLファイルのいずれかとして返す方法を示します。 class PhotosController < ApplicationController # GET /photos # GET /photos.xml def index @photos = # load photos from Flickr respond_to do |format| format.html # index.html.erb format.xml { render :xml => @photos } end end end class PhotosController < ApplicationController # ... omissis ... # GET /photos/1.jpg def show @photo = Photo.find(params[:id]) respond_to do |format| format.jpg end end end <%= @photo.image_data %> デフォルトの形式(HTML、XML、ATOMなど)のほかに、ファイルconfig/initializers/mime_types.rbを編集してMime::Type.register_alias関数を使うことでカスタムの形式を作成する方法もあります。この機能を示す有効な構成は次のとおりです。 # Bind jpeg mime-type to the format.jpg format Mime::Type.register_alias "image/jpeg", :jpg # Bind the richtext mime-type to the format.rtf format Mime::Type.register "text/richtext", :rtf # Bind an additional formatter to the html mime-type, to be used # for mobile devices with a limited display Mime::Type.register_alias "text/html", :mobile class PhotosController < ApplicationController before_filter :detect_mobile_device def index @photos = # load photos from Flickr respond_to do |format| format.html # index.html.erb format.mobile # index.mobile.erb end end ... omissis ... def detect_mobile_device if request.env['HTTP_USER_AGENT'] && request.env['HTTP_USER_AGENT'][/BlackBerry/] request.format = :mobile end end end リソースのネストによるわかりやすいURLの作成ここまでは、次のようなRESTのURLに基づいてリソースを提供するRailTrackrの機能を説明しました。
ActionController::Routing::Routes.draw do |map| map.resources :photos map.resources :photosets map.resources :flickr_users # default mapping map.connect ':controller/:action/:id' map.connect ':controller/:action/:id.:format' end
ActionController::Routing::Routes.draw do |map| map.resources :flickr_users map.resources :flickr_users, :has_many => :photosets map.resources :photosets, :has_many => :photos # default mapping map.connect ':controller/:action/:id' map.connect ':controller/:action/:id.:format' end class PhotosetsController < ApplicationController before_filter :load_user # Given a sample url like site.com/flickr_user/max/photosets , # params[:flickr_user_id] automagically points to 'max' def load_user @flickr_user = FlickrUser.find(params[:flickr_user_id]) end # GET /photosets def index @photosets = Photoset.by_user(@flickr_user)[0..50] respond_to do |format| format.html # index.html.erb end end end このネストリソースマッピングは、コントローラ内だけでなく、ビュー内でのURLの生成にも使うことができます。たとえば、@flickr_userはID maxのユーザーを参照し、@photosetはID 123のフォトセットを参照しているとします。次のすべてのステートメントをビュー内で正しく使うことで、link_toなどのリンク関数に関連付け可能なURLを生成できます。
パフォーマンスの確認RailTrackrのユーザーサイドの機能はこれで完成です。しかし、多くの写真をダウンロードして処理するリソース負荷の高いアプリケーションでは、スムーズな操作を実現するためにパフォーマンスが極めて重要になります。Rails 2.0では、全体的なパフォーマンスに対するさまざまな改善が盛り込まれ、アプリケーションを高速化するための高度な手法がサポートされています。特に重要なものは次のとおりです。
JavaScriptバンドル機能JavaScriptバンドル機能とは、アプリケーションのすべてのJavaScriptファイル(またはその一部)を1つのファイルにまとめてからクライアントに送信する機能です。現在、Webアプリケーションは多くのJavaScriptライブラリを使ってユーザーエクスペリエンスを向上させ、リッチなビジュアル効果を提供しています。一方で、ブラウザは1つのJavaScriptライブラリを取得するたびに複数の要求を実行しなければならないため、パフォーマンスが低下するという欠点もあります。ライブラリすべてを1つにまとめることで、ブラウザは1つの要求しか実行する必要がなくなり、Rails 2.0はJavaScriptファイルを迅速に提供できるようになりました。RailTrackrも同じです。凝った効果を提供するには多くのJavaScriptファイルが必要です。比較のため、あるユーザーのすべてのフォトセットを含むページにJavaScriptバンドル機能を使わずにアクセスした場合の所要時間(図6)と、JavaScriptバンドル機能を使った場合の所要時間(図7)を示します。レポートの作成にはFirebugを使いました。 図6 バンドル機能を使わずに多くのJavaScriptライブラリをダウンロードした場合 ![]() 図7 同じJavaScriptライブラリを1つのファイルにまとめて所要時間を短縮した場合 ![]()
<%= javascript_include_tag
"prototype" , "effects" , "dragdrop" , "instant" , "reflex" ,
:cache => "railtrackr" %>
<!-- Will create a single railtrackr.js file -->
バンドル機能は、Railsが実稼動モードになると有効になり、開発中は無効なので、開発者のデバッグセッションでわずらわしさを感じることがありません。 Cookieベースのセッションパフォーマンス向上が期待できるもう1つの理由は、Rails 2.0では、セッションデータを保管するときに、サーバー上のデータベースファイルや一時ファイルではなく、ブラウザのCookieを使用することです。ステート情報はすべてクライアント上に残るので、アプリケーションはステートレスに動作でき、水平方向のスケーラビリティによってパフォーマンスが向上します。必要に応じて、サーバーを追加して、各サーバーでまったく同じアプリケーションを実行させることで、レプリカ間でのセッションデータの同期を気にせずに、スループットを向上させることもできます。RailsはCookieにセッションデータを格納するときに暗号化を行いますが、それでも、このソリューションを用いて機密データをセッションに格納したり、セッションに巨大なオブジェクトを格納したりすることは避けてください。なぜなら、ブラウザは要求のたびにCookieをサーバーに送り返すからです(そのため、Cookieは軽量でなければなりません)。ドメインのマルチターゲット機能最近のブラウザは、一般的に、アクセスしている各ドメインに対して2つの同時接続だけを開きます。RailTrackrのページには多くの画像が収められているので、これではブラウザがすべての要求をキューに入れてしまいパフォーマンスが低下します。次のステートメントを指定すると、Railsはドメインのマルチターゲット機能をアクティブにし、複数のドメインに分散された静的なリソースのURLを生成します(デフォルトは4つで、%d記号が数字0〜3に置き換えられて、名前が作成されます)。
ActionController::Base.asset_host = "static%d.yoursite.com"
クエリキャッシュ機能Rails 2.0には、このほかにもデータベース層のパフォーマンス向上を実現するための機能がいくつか用意されています。たとえばクエリキャッシュ機能では、1つの要求を処理するときに同じクエリを何度も実行することを回避できます。データベース方面の変更点今回のサンプルコードでは、Rails 2.0がアプリケーション開発のユーザーサイドにもたらす変更にのみ焦点を当てています。モデルやデータベースマッピングにはまったく触れず、Flickr ServiceのリモートAPI呼び出しを優先させました。しかし、新しいバージョンのRailsでは、そのバックエンドや、人気のあるActiveRecordパーシステンス層に対する一連の変更も行われています。これらの変更は本稿の対象外ですが、最も重要な変更点をここで簡単に説明します。
まとめ本稿では、Rails 2.0がWeb開発の世界にもたらした変化を説明しました。主にユーザーサイドの面を中心に、RESTの完全なサポートと、パフォーマンスの向上を確認しました。また、Railsのバックエンドに加えられた変更点についても簡単に説明しました。また、Rails 2.0には、ruby-debugライブラリの統合によるデバッグ機能の改善、JSONサポートの向上、RSSフィード用ビルダの改良、ルートの名前空間化、HTTP Basic認証のサポート、セキュリティの向上などの小さな機能も導入されています。 これらの機能の詳細については、下記の「関連資料」のリンクを参照してください。また、RailTrackrとそのソースコードも使ってみましょう。定期的に更新していますのでbattlehorse.netのチェックもお忘れなく。 関連資料
著者紹介Riccardo Govoni(Riccardo Govoni)
2003年からJ2EE開発者としてイタリアの金融サービス会社に勤務。ソフトウェアアーキテクトとして従来の銀行システムのWebフロントエンドの設計に従事。物理学修士。SCJP(Sun Certified Java Programmer)資格を持つ。
関連記事 最新トップニュース
|
japan.internet.com 10周年記念
インターネットコムマーケティングセミナー ROI を最適化するパフォーマンスマーケティングの最前線 【12/16(水)13時〜 東京・赤坂】 申込はコチラ>>
|