SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Ruby on Rails + Curl(AD)

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

最終回

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

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サーバにアクセスできます。

次のページ
Curl製Twitterクライアントからのつぶやきポスト

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
Ruby on Rails + Curl連載記事一覧

もっと読む

この記事の著者

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4434 2009/09/30 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング