GAE用の書き換え 2
その他
(1)環境設定のconfig/enviroment.rbファイルですがrails_on_gaeプラグインが作り出した内容を一部変更しています。
require 'rubygems' require 'lib/require_fix' require 'lib/rake_fix' #require 'lib/actionmailer-2.3.2.jar' require 'lib/actionpack-2.3.2.jar' #require 'lib/activerecord-2.3.2.jar' #require 'lib/activeresource-2.3.2.jar' require 'lib/activesupport-2.3.2.jar' require 'lib/rails-2.3.2.jar' require 'lib/jruby-openssl-0.5.1.jar' require 'lib/bumble' # <--- bumble_appengine_jruby からオリジナルのbumbleに変更 require 'lib/beeu' require 'lib/active_record_features_for_bumble' # <--- 追加
(2)コントローラーの共通部分app/controllers/application_controller.rbですが、CurlからのアクセスにはCSRF対策の値がポストされないので、protect_from_forgeryをコメントアウトします。
(3)デフォルトのindex.htmlファイルがあると入り口ページが表示されませんのでpublic/index.htmlを削除します。
日本語文字化け対処
現在のDatastoreライブラリですが、日本語が文字化けするので以下のパッチをconfig/initializers/datastore_patch.rbに書きます。このパッチはmilk1000ccさんが作られたものです。
module AppEngine module Datastore def Datastore.ruby_to_java(value) # :nodoc: if SPECIAL_RUBY_TYPES.include? value.class value.to_java else case value when Fixnum java.lang.Long.new(value) when Float java.lang.Double.new(value) when String #value.to_java_string java.lang.String.new(value) # Thanks http://d.hatena.ne.jp/milk1000cc/20090802/1249218370 else value end end end end end
OpenSSLの制限
GAEでは一部暗号化の関数が制限されていて、セッションに使う Cookieの改ざん検出の部分でエラーになってしまいます。そこでメッセージダイジェスト作成関数をconfig/initializers /openssl_patch.rb ファイルで変更しています。
# 実アプリには使わないで下さい require 'digest/sha1' module ActiveSupport class MessageVerifier private def generate_digest(data) Digest::SHA1.hexdigest(data) end end end
ローカルでの実行とデバック
GAE用のアプリはPC上で開発用サーバを使って実行できます。ただし、JavaアプリのデプロイのようにWARファイルの作成が必要になります。また実行中にソースコードを変更しても、変更は反映されません。
手順
% jruby -S warble war # WARファイルの作成 % dev_appserver.sh tmp/war # 開発用サーバーの起動
アプリは http://localhost:8080/ で確認できます。開発時にDatastoreの内容を確認した場合は、http://localhost:8080/_ah/admin にアクセスする事で、下の画面のように Datastoreの内容を見たりレコードを削除したりできます。
GAEへのデプロイ
ローカルで動作が確認できたら、実際のGAE環境にデプロイしてみましょう。 GAEを使うには、アプリケーションID(Application Identifier)を取得する必要があります。この手順はCodeZine: Google App Engine for Javaを使ってみよう!(4ページ)に詳しく書かれています。
デプロイする際には appengine-web.xml ファイルの <application> ~ </application> の ~ の部分にアプリケーションIDを書きます。デプロイは次のコマンドで行います。途中でアプリケーションID取得で使った e-mail、パスワードでの認証が行われます。
% appcfg.sh update tmp/war Reading application configuration data... ... ... Email: # <--- e-mailを入力 Password for ~~~: # <---- パスワードを入力 ... ... Update completed successfully. Success. Cleaning up temporary files...
デプロイが完了したら、 http://アプリケーションID.appspot.com/ をアクセスするとアプリが使えます。ただし、最初のアクセス時にはページが表示されるまでにかなり時間がかかりま す。
CurlクライアントからのGAEアクセス
ここで使用しているCurlの開発用ライセンスは、localhostから読み込んだコードしか実行できないためGAEサーバのCurlページは実行できません。しかし開発用ライセンスで動くCurlアプリからインタネット上のサービスにはアクセスできますので、今回のサーバ側ソフトをGAEサーバをアクセスするように変更し、PC(localhost)上で動かせばGAEサーバ上のTwitter風サービスをCurlから使う事が出来ます。
やり方は app/views/statuses/start.html.erb ファイルの6行目を以下のよう変更します。
|| {let server_url = "http://<%= request.host_with_port() %>/"} {let server_url = "http://アプリケーションID.appspot.com/"}
そしてWARファイルを再作成し、開発用サーバを立ち上げ http://localhost:8080/statuses/start をアクセスするとCurlクライアントから GAEサーバにアクセスできます。