JRuby on Rails環境(非GAE)での動作確認
さて、ではこのアプリケーションをGAE環境ではなく、まずは通常のJRuby on Railsアプリとして動作させてみましょう。
SQL4GはH2 Databaseをベースにしていますので、JRuby on RailsでもJDBCアダプタ(activerecord_jdbch2_adapter)で動作させようと思います。そのためdatabase.ymlを下記のように設定しました。とりあえず、動作確認だけですので、設定内容はdevelopment環境のみ記載しています。また、マイグレーションスクリプト内でmembersテーブルのサンプルデータを登録するようにしてあります。サンプルデータの様子は、db/migrate/fixtures/members.ymlをご覧ください。
development: adapter: jdbch2 database: microblog_development username: sa password:
設定を記述したら、マイグレーションを実行したのち、WEBrickを起動します。
$ rake db:migrate (in /home/tnakagoshi/microblog) == CreateMembers: migrating ================================================== -- create_table(:members) -> 0.2010s -> 0 rows == CreateMembers: migrated (2.2560s) ========================================= == CreateStatuses: migrating ================================================= -- create_table(:statuses) -> 0.0790s -> 0 rows == CreateStatuses: migrated (0.0800s) ======================================== $ jruby script/server => Booting WEBrick => Rails 2.3.5 application starting on http://0.0.0.0:3000 => Call with -d to detach => Ctrl-C to shutdown server [2010-03-18 19:28:33] INFO WEBrick 1.3.1 [2010-03-18 19:28:33] INFO ruby 1.8.7 (2009-11-02) [java] [2010-03-18 19:28:38] INFO WEBrick::HTTPServer#start: pid=7181 port=3000
この状態でブラウザを起動し「http://localhost:3000/login」にアクセスしてログインし、動作を確認してみてください。
GAE環境での動作確認
では、ノーマルのJRuby on Railsでの動作が確認できたところで、GAEへデプロイしてみます。デプロイの手順は基本的に第3回のものとほぼ同様ですが一部異なるところがあります。下記に手順のサマリーを再掲し、続いて第3回と異なる箇所を記載します。
- セットアップスクリプト(rails2_appengine.rb)のダウンロードと実行
- environment.rbの書き換え(SQL4G上のデータベース作成コードの追加)
- database.ymlの書き換え(SQL4G用の設定内容に書き換える)
- Gemfileに設定を追加(SQL4Gが利用するJDBCアダプタのgemを追加)
- SQL4G Jar/activerecord_jdbc Jarの配置/jruby-rackのアップデート版Jarの配置
- ローカル環境でのGAE起動と動作確認
- config.ruの書き換え(デプロイ用のアプリケーションID/バージョン番号の設定)
- GAEサーバへのデプロイ実行
- GAE上での動作確認
第3回の手順と異なるところは以下の通りです。
- 上記(1)の手順において、rails2_appengine.rbの実行中にファイルの上書きを要求されるところがありますが、routes.rbおよびsesson_store.rbは上書きしないようにしてください。
- さらに、config/initializers/session_store.rbの以下(最下部)をコメントアウトしてください。これにより、通常のセッションオブジェクト(cookie_store)を利用できるようにします。
# 以下の行を全てコメントアウトします #if defined? JRuby::Rack # require 'action_controller/session/java_servlet_store' # ActionController::Base.session_store = :java_servlet_store #end
マイグレーションの代替コントローラを作る
実際の開発時は、デプロイ用にもう1つ別のディレクトリを作り、そこにアプリケーションのコードをすべてコピーして作業されることを推奨します。また、今回のアプリケーションではMigrationコントローラのindexメソッドでテーブルの作成を行いますので、アプリケーションの起動後は「http://hostname/migration/」を実行するのを忘れないようにしましょう。ちなみにテーブルを作り直す場合は「http://hostname/migration/reset」を実行してください。
class CreateTables < ActiveRecord::Migration def self.up execute <<-"EOF" create table members ( id integer not null default 0 auto_increment primary key, login varchar(255), name varchar(255), password varchar(255), created_at timestamp, updated_at timestamp ); create table statuses ( id integer not null default 0 auto_increment primary key, member_id integer, message varchar(255), created_at timestamp, updated_at timestamp ) EOF end def self.down drop_table :statuses drop_table :members end end class MigrationController < ApplicationController def index CreateTables.up Member.create(:login=>"sql4g",:name=>"SQL4G 公式アカウント",:password=>"sql1234g") Member.create(:login=>"php4g",:name=>"PHP4G 公式アカウント",:password=>"php1234g") Member.create(:login=>"naka54",:name=>"なかごし",:password=>"naka123454") Member.create(:login=>"knowledge_ex",:name=>"株式会社ナレッジエックス",:password=>"12345ex") respond_to do |format| format.html { redirect_to :controller => "login" } end end def reset CreateTables.down index return end end
いかがだったでしょうか。Railsの場合はPHPと比べて若干手順が多いものの、普通に作ったRailsアプリケーションがGAE環境にもそのまま持って行けそうだということがお分かりいただけたのではないかと思います。
本番環境にデプロイ、しかし……
おそらく、この記事をお読みになっている方の中には、実際に記事の通りに動作させてみている方も多いことと思います。dev_appserver.rbによるローカル環境での動作確認までは読者の皆さんも順調にできたのではないでしょうか。しかしながら、筆者の環境では肝心のクラウド上での動作でエラーになってしまって動作させることができませんでした。
ご存じの通り、GAE上でのアプリケーション実行には、いわゆる「30秒の壁」(リクエストを受けてから30秒以内にレスポンスを返さないとHardDeadlineExceedErrorが発生し処理が強制的に中断される)というものがあります。今回のアプリではこの制限にかかってしまい、起動に失敗していました。もともと、GAE上でのRailsは起動(Spin up)に時間がかかると言われており、今回の場合、30秒の制限のうちおよそ22〜23秒をRails自体の起動に費やしてしまっていることが主な原因と考えられます。しかしながら、Googleもこういった問題は認識しているようで、GAEのロードマップの中でSpin up時間の短縮のための機能改良について言及しています。またGAE上でのJRuby環境も今まさに発展の途上にあり、今後のバージョンアップによって動作速度の向上が期待できます。残念ながら現状ではGAE本体での動作検証にまでは至りませんでしたが、今後のGAEを取り巻く動向には引き続き要注目です!
次回は、PHP+GAE を使って、ある有名なアプリケーションを実際に動かしてみます。お楽しみに!!
3/3 |
Index | |
GAE+SQL4GでRailsアプリを開発してみよう | |
Page1 JRubyについて ActiveRecordとSQL4Gの連携 |
|
Page2 google-appengine gemについて セットアップスクリプト(rails2_appengine.rb)について Rails+SQL4Gでのマイグレーション Rails+SQL4Gでアプリケーションを開発してみる |
|
Page3 JRuby on Rails環境(非GAE)での動作確認 GAE環境での動作確認 マイグレーションの代替コントローラを作る 本番環境にデプロイ、しかし…… |
GAE+PHP/Rubyで拓く新世界 |
Coding Edgeお勧め記事 |
いまさらアルゴリズムを学ぶ意味 コーディングに役立つ! アルゴリズムの基本(1) コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう |
|
Zope 3の魅力に迫る Zope 3とは何ぞや?(1) Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか? |
|
貧弱環境プログラミングのススメ 柴田 淳のコーディング天国 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く? |
|
Haskellプログラミングの楽しみ方 のんびりHaskell(1) 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう |
|
ちょっと変わったLisp入門 Gaucheでメタプログラミング(1) Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|