CodeZine(コードジン)

特集ページ一覧

Curl+JRuby+Google App EngineでTwitter風アプリを作る
~GAE編~

最終回

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/09/30 14:00
目次

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行目を以下のよう変更します。

app/views/statuses/start.html.erb
|| {let server_url = "http://<%= request.host_with_port() %>/"} 
{let server_url = "http://アプリケーションID.appspot.com/"}

 そしてWARファイルを再作成し、開発用サーバを立ち上げ http://localhost:8080/statuses/start をアクセスするとCurlクライアントから GAEサーバにアクセスできます。


  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 吉田裕美(ヨシダユウミ)

    有限会社 EY-Office 取締役 CADのベンチャー企業でCADのコア部分や図面管理システムなどの開発に従事した後、独立しJava,Ruby,PerlでWebアプリを中心に開発してきた。現在は殆どの開発はRuby on Rails。 ここ数年はソフトウェアエンジニアの教育に興味をもち、従来の...

バックナンバー

連載:Ruby on Rails + Curl
All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5