bar_1

contents_map

ラベル sinatra の投稿を表示しています。 すべての投稿を表示
ラベル sinatra の投稿を表示しています。 すべての投稿を表示

2010年10月21日木曜日

GAE: Windows環境でRubyをつかったGoogle App Engine開発環境導入まとめとコマンドヘルプ

■本稿の目的



Googleによる App Engine のチュートリアルは、とてもわかり易く、手順をシンプルに追った記述となっている。これにより、PythonまたはJavaを使ったGAEの開発の最低限の方法について、知ることができる。



しかしながら、このチュートリアルでは、以下のような難点がある:

  • Rubyの環境については触れられていない

  • 開発用のコマンドの詳細の説明については、省かれている

  • 手順を丁寧に追っているため、記述に若干冗長な感がある




加えて、ネット上の情報を見ると、それらのほとんどはLinuxベースの環境であって、Windows+Ruby環境でのGAE開発に触れた情報は少ない(Googleでキーワード「GAE Ruby Windows dev_appserver appcfg」で検索すると、実際のページ総数はたかだか「約 244 件中 3 ページ目 (0.24 秒)」件である)。



そこで、本稿は:

  • Windows環境(ActiveScriptRuby)

  • RubyをつかったGAE開発

  • Googleのチュートリアルより記述を簡潔に

  • ただし開発用コマンドの説明は詳細まで行う

という方針で、App Engineを利用した開発の手始めについてまとめた。


■凡例


本稿の表記
Googleのチュートリアルの表記、または本稿が想定する環境等

GAEアプリ
App Engineアプリケーション
GAE SDK
App Engineソフトウェア開発キット
GAEリモート動作環境
Googleによって提供されているApp Engine (Python|Java|etc...) ランタイム
 環境。
GAEローカル環境
GAEのソースの記述、ローカルWebサーバーでテストなどをおこなうGAEリモー
ト動作環境の外、すなわちあなたのPCなどのこと。
GAEアプリID
GAEアプリのための任意のID
GAE開発用コマンド
 核となるコマンド: dev_server.rb, appcfg.rb をいう。


■Google App Engineとは



App Engineとは:

  • メールサービス

  • Webサーバー・インタフェース
    Webアプリ
    Webアプリ・開発用コンソール http://(localhost:xxxx|appid.appspot.com)/_ah/admin
     (上記Webアプリは、GAEアプリとしての特徴を有する)

  • ストレージ

を有する、Googleによるサービスの総体のことである。


これらのサービスを使って、ユーザによりGAE SDKを使って開発されるものを、本稿では、GAEアプリと呼ぶ。


GAEアプリを開発、実行する環境は、2つあり:
 GAEリモート動作環境、
 GAEローカル環境
とよぶ。
 
 



■RubyのGoogle App Engine環境



本稿では、単にApp Engineを導入するのでなくて、Rubyを用いた環境を導入する
ことを想定している。実際には、Javaの環境をベースに JRubyを介して、Rubyを
利用する形となる(一般的に提供されている、PythonやJavaによる環境ではない
��。


このRubyを利用するための環境は、 gem形式でGoogleが用意してくれている。
 



■GAEアプリ開発の一連の流れを簡潔に述べる



チュートリアルの流れを、簡潔に表にまとめた。





































ステップ用意するもの得られるものやること

1.GAE開発環境の用意

GAE SDKのダウンロード作業

GAEの開発環境

Ruby用のGAE SDKをインストールする。
方法については、

前回の記事

を参照のこと。 

2.GAEアプリのアカウントを登録

Googleアカウント、
GAEアプリID、
SMSを受信できる携帯電話

GAEアプリのURL(http://GAEアプリID.appspot.com/)

GAEアプリのアカウント登録サイトで、必要とされる情報を入力する※。


3.GAEローカル環境でのGAEアプリの開発

ソースコード

GAEアプリ

GAEアプリのソースコードを記述する。

4.GAEリモート動作環境へのアップロード

GAEアプリ、
アップロード・コマンドの実行(appcfg.rb)、
GoogleアカウントのIDとパスワード

GAEリモート動作環境でのGAEアプリの起動

アップロード・コマンドを実行し、GAEリモート動作環境にアップロードする。




※ステップ2の注意



SMSの登録内容について。電話番号の表記の仕方(81を含むのかそうでないか)、メ
ールアドレスかイマイチ判然としない。何度か試しているうちに、Googleか
らSMSが来たため、どれが正しいかわからなかった。



このサイト

でも、同様の事例をまとめているようだ。


Googleから送信されるSMSには、"Google App Engine Code: xxxxxxx"(xは数
字)という内容で、これがGoogleの GAEアカウント認証サイトによって認証
される必要がある。(当方は、ドコモの携帯電話で2010年 9月に行った。)
 
 
 
 




■GAE開発用コマンドについて



GAE SDKのをインストールすると、チュートリアルに紹介されているコマンド:
dev_appserver.rb, appcfg.rb が、ディレクトリ: %RUBY_HOME%\bin\ などに、
格納される(実際には、BATファイルからなる複数のスクリプトから構成されるが、本稿で
はここのスクリプトについての説明は割愛する)。



◆概要



●dev_appserver.rb



開発用のローカルWebサーバー兼GAEローカル環境でのGAEアプリのランチャ。
使い方:
 dev_appserver.rb [オプション] <warディレクトリ>



「warディレクトリ」にあるGAEアプリを、ローカル環境で起動する。


このローカルWebサーバーは、Googleアカウントをシミュレートしていて、独自
のログイン、ログアウト画面を有する。



●appcfg.rb



GAEアプリの管理コマンド


使い方:
 D:/PROGRA~1/ruby-1.8/bin/appcfg.rb [options] <action> <app-dir> [<output-file>]




管理とは、以下のことを指す:

  • ランタイム環境へのGAEアプリのアップロード
  • index.yamlの更新・削除
  • スケジュール・タスクの管理
  • スケジュール・タスクの管理

  • ランタイム環境へのデータのアップロード

http://code.google.com/intl/ja/appengine/docs/python/tools/uploadinganapp.html




◆GAE開発用コマンドの詳細説明




●dev_appserver.rb



開発用のローカルWebサーバー兼GAEローカル環境でのGAEアプリのランチャ。



使い方:



  <dev-appserver> [options] <war directory>

※--help オプション時も、<war directory>指定が必要



オプション:



--help, -h
 このヘルプメッセージを表示して終了。

--server=SERVER
 -s SERVER
  最新のSDKバージョンを判別に使用するサーバの指定。

--address=ADDRESS
 -a ADDRESS
  WebサーバーがバインドするローカルPC上のインタフェースのアドレスの指
  定(もしくは、0.0.0.0 で全てのインタフェース)。

--port=PORT
 -p PORT
  WebサーバーがバインドするローカルPC上のポート番号の指定。

--sdk_root=root
 格納されているSDKでオーバーライドする場合のSDK格納ディレクトリの指定。

--disable_update_check
  最新のSDKバージョンのチェックを無効に指定。




例:




D:\Program Files\ruby-1.8\usr\local\sinatra_test>dev_appserver.rb --help .
D:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/appengine-tools-0.0.15/lib/appengine-tools/boot.rb:50: warning: `*' interpreted as argument prefix
=> Skipping update check
=> Booting DevAppServer
=> Press Ctrl-C to shutdown server
Usage: <dev-appserver> [options] <war directory>

Options:
--help, -h                 Show this help message and exit.
--server=SERVER            The server to use to determine the latest
-s SERVER                   SDK version.
--address=ADDRESS          The address of the interface on the local machine
-a ADDRESS                  to bind to (or 0.0.0.0 for all interfaces).
--port=PORT                The port number to bind to on the local machine.
-p PORT
--sdk_root=root            Overrides where the SDK is located.
--disable_update_check     Disable the check for newer SDK versions.




●appcfg.rb



GAEアプリの管理コマンド。



使い方:



 D:/PROGRA~1/ruby-1.8/bin/appcfg.rb [options] <action> <app-dir> [<output-file>]




アクション:



<action>は、以下のうちいずれか 1つである必要がある:


 help
  あるアクションのヘルプを出力する
 request_logs
  リクエスト・ログをApache共通ログ形式で出力する。
 rollback
  処理中の更新をロールバックする。
 update
  新しいバージョンのGAEアプリに更新、あるいは新規作成する。
 update_indexes
  GAEアプリのインデックス(注)を更新する。
 update_cron
  GAEアプリのcronジョブを更新する。
 update_queues
  GAEアプリのタスク・キューの定義を更新する。
 update_dos
  GAEアプリの対DoS保護の環境設定を更新する。
 version
  バージョン情報を出力する。
 cron_info
  cronジョブの次回の実行までの時間を表示する。
 run
  ユーザーのGAEアプリ環境でjrubyを実行する。
 bundle
  GAEリモート環境へのデプロイのために、ローカルのGAEアプリをパッケージングする。




'run' コマンドは、カレント・ディレクトリをGAEアプリのディレクトリと、みなします。
'help <action>' で、詳細の説明を見てください。



オプション:



-h, --help            ヘルプを表示して終了。
-s SERVER, --server=SERVER
接続を行うサーバー。
-e EMAIL, --email=EMAIL
利用するユーザ名。省略時は入力待ちに。
-H HOST, --host=HOST  全てのRPCで送られるホストヘッダの上書き。
-p PROXYHOST[:PORT], --proxy=PROXYHOST[:PORT]
指定したプロクシ・サーバを介してリクエストをプロ
する。
--proxy_httpsも指定した場合、HTTPだけがプロクシ
され、そうでなければHTTPとHTTPSの両方がなされる。
--proxy_https=PROXYHOST[:PORT]
HTTPSリクエストをプロクシするプロクシ・サーバ。
--sdk_root=root       GAE SDKの格納場所を上書きする。
--passin              標準入力からログイン・パスワードを読む。
--insecure            管理コンソールとの通信ではHTTPSを使用しない。
--enable_jar_splitting
巨大なjarファイル(> 10M)を小さなファイルに分割する。
Split large jar files (> 10M) into smaller fragments.
--jar_splitting_excludes=SUFFIXES
--enable-jar-splitting が指定された場合、コンマ
区切りでSUFFIXESに指定された拡張子にマッチするファイルは、全ての
jarファイルにおいて、分割から除外される。
When --enable-jar-splitting is set, files that match
the list of comma separated SUFFIXES will be excluded
from all jars.
--retain_upload_dir
GAEリモート環境へのアップロード時に使用した一時ディレクトリを残す。
Do not delete temporary directory used in uploading.
--compile_encoding
JSPをコンパイルするときに使用する文字エンコーディングの指定
The character encoding to use when compiling JSPs.
-n NUM_DAYS, --num_days=NUM_DAYS
ログデータを入手する日数の指定。カットオフ・ポイントは、UTCで12時
である。できるだけ全てのログを得る場合は 0 を指定する。デフォルト
値は 1 である。
Number of days worth of log data to get. The cut-off
point is midnight UTC. Use 0 to get all available
logs. Default is 1.
--severity=SEVERITY ? アプリレベルログメッセージのシビア度の指定。範囲は 0
(DEBUG) から 4 (CRITICAL)である。
Severity of app-level log messages to get. The range
is 0 (DEBUG) through 4 (CRITICAL). If omitted, only
request logs are returned.
-a, --append          既存のファイルに追記する。
-n NUM_RUNS, --num_runs=NUM_RUNS
スケジュールされた計算するための実行時間の数
Number of scheduled execution times to compute




例:



D:\Program Files\ruby-1.8\usr\local\sinatra_test>appcfg.rb --help
D:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/appengine-tools-0.0.15/lib/appe
ngine-tools/appcfg.rb:51: warning: `*' interpreted as argument prefix
D:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/appengine-tools-0.0.15/lib/appe
ngine-tools/boot.rb:50: warning: `*' interpreted as argument prefix

usage: D:/PROGRA~1/ruby-1.8/bin/appcfg.rb [options] <action> <app-dir> [<output-
file>]

Action must be one of:
help: Print help for a specific action.
request_logs: Write request logs in Apache common log format.
rollback: Rollback an in-progress update.
update: Create or update an app version.
update_indexes: Update application indexes.
update_cron: Update application cron jobs.
update_queues: Update application task queue definitions.
update_dos: Update application DoS protection configuration.
version: Prints version information.
cron_info: Displays times for the next several runs of each cron job.
run: run jruby in your application environment.
bundle: package your application for deployment.
The 'run' command assumes the app directory is the current directory.
Use 'help <action>' for a detailed description.

options:
-h, --help ? ? ? ? ? ?Show the help message and exit.
-s SERVER, --server=SERVER
? ? ? ? ? ? ? ? ? ? ? The server to connect to.
-e EMAIL, --email=EMAIL
? ? ? ? ? ? ? ? ? ? ? The username to use. Will prompt if omitted.
-H HOST, --host=HOST ?Overrides the Host header sent with all RPCs.
-p PROXYHOST[:PORT], --proxy=PROXYHOST[:PORT]
? ? ? ? ? ? ? ? ? ? ? Proxies requests through the given proxy server.
? ? ? ? ? ? ? ? ? ? ? If --proxy_https is also set, only HTTP will be
? ? ? ? ? ? ? ? ? ? ? proxied here, otherwise both HTTP and HTTPS will.
--proxy_https=PROXYHOST[:PORT]
? ? ? ? ? ? ? ? ? ? ? Proxies HTTPS requests through the given proxy server.
--sdk_root=root ? ? ? Overrides where the SDK is located.
--passin ? ? ? ? ? ? ?Always read the login password from stdin.
--insecure ? ? ? ? ? ?Do not use HTTPS to communicate with the Admin Console.
--enable_jar_splitting
? ? ? ? ? ? ? ? ? ? ? Split large jar files (> 10M) into smaller fragments.
--jar_splitting_excludes=SUFFIXES
? ? ? ? ? ? ? ? ? ? ? When --enable-jar-splitting is set, files that match
? ? ? ? ? ? ? ? ? ? ? the list of comma separated SUFFIXES will be excluded
? ? ? ? ? ? ? ? ? ? ? from all jars.
--retain_upload_dir
? ? ? ? ? ? ? ? ? ? ? Do not delete temporary directory used in uploading.
--compile_encoding
? ? ? ? ? ? ? ? ? ? ? The character encoding to use when compiling JSPs.
-n NUM_DAYS, --num_days=NUM_DAYS
? ? ? ? ? ? ? ? ? ? ? Number of days worth of log data to get. The cut-off
? ? ? ? ? ? ? ? ? ? ? point is midnight UTC. Use 0 to get all available
? ? ? ? ? ? ? ? ? ? ? logs. Default is 1.
--severity=SEVERITY ? Severity of app-level log messages to get. The range
? ? ? ? ? ? ? ? ? ? ? is 0 (DEBUG) through 4 (CRITICAL). If omitted, only
? ? ? ? ? ? ? ? ? ? ? request logs are returned.
-a, --append ? ? ? ? ?Append to existing file.
-n NUM_RUNS, --num_runs=NUM_RUNS
? ? ? ? ? ? ? ? ? ? ? Number of scheduled execution times to compute




■TODO




  • gem について

  • App Engine の設定項目について

  • GAE Ruby で使用されているRuby FWについて






2010年7月28日水曜日

WinXP環境でGAE/JRuby/Rails/Sinatraにより彼女と自宅でデートする

0. Abstract



熱海はハードル高いので、まずは自宅だよね。ということで、ちょっと以前から:

などを参照して、ローカルPC(XP)でGAEの実験してたわけだが、これまで当方の環境では、ThreadErrorを吐くなど不具合があり、寸分も動作しなかった。



この度、やっと動作を確認できたので、ここに試行錯誤をまとめて示そうと思う。
結論だけ先に挙げますと、gemパッケージ内の主にJRubyに何らかの原因がありいくつか不具合現象が生じていたが、gemの更新により、それらが解消された、というつまらないことなのですが…。


それに加えて、今回ちょっと特殊なのは:

  • XPのアカウント名が日本語だったこと

  • 動作確認にCygwinも用いたこと

になります。


上記に起因する不具合現象について、相当調査し(ぐぐっ)たが、エラーそのものも含めて、全然情報がなかった。ActiveScriptRubyやCygwinという当方とまっ
たく同じ環境でも、何の問題も無く、みんなすんなり動いてるようでした。



本稿ではまず、1.に実験した環境・構成を示します。次に2.にて、当初存在した
不具合現象を示します。そして、3.に今回成功した修正方法を、4.に修正後の動作結果を示します。最後に、修正方法を5.結論に述べ、今後の課題を6.とします。
またリファレンスと付録を、それぞれ7.、8.とします。

 

 



1.動作確認に使用した環境と構成




以下、(1)~(2)に、環境・構成等を示す。


Windows XPは、以下XPと略す。
Cygwin/XPは、XP上にインストールしたCygwinを示す。
ActiveScriptRubyでの実験は、同環境をインストールするとできるruby console
から行った。
Cygwin/XPでの実験は、Cygwinのコンソールから行った。


(1) 実験した環境



実験していたのは、下記のような環境である:
OS  Windows XP(winver.exe; Version 5.1 (Build 2600.xpsp_sp3_gdr
   .100216-1514 :Service Pack 3)),
   Cygwin/XP(setup.exe version 2.697)

Ruby ActiveScriptRuby 1.8.7 (XP; ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]),
   Ruby 1.8.7 (Cygwin/XP; ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin])

Java java version "1.6.0_20"
   Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
   Java HotSpot(TM) Client VM (build 16.3-b01, mixed mode)




AcriveScriptRuby、Cygwin/XP上のruby両者で、動作することを確認できた。


(2)gemの構成



  • 構成1(動作しない)

  • $ gem list
    
    *** LOCAL GEMS ***
    
    appengine-apis (0.0.16)
    appengine-rack (0.0.9)
    appengine-sdk (1.3.4)
    appengine-tools (0.0.13)
    bundler08 (0.8.5)
    google-appengine (0.0.13)
    jruby-jars (1.4.1)
    jruby-rack (1.0.1)
    rack (1.1.0)
    rubygems-update (1.3.7)
    rubyzip (0.9.4)


  • 構成2(動作確認できた)

  • $ gem list
    
    *** LOCAL GEMS ***
    
    appengine-apis (0.0.18, 0.0.16)
    appengine-rack (0.0.11, 0.0.9)
    appengine-sdk (1.3.5, 1.3.4)
    appengine-tools (0.0.15, 0.0.13)
    bundler08 (0.8.5)
    google-appengine (0.0.15, 0.0.13)
    jruby-jars (1.5.1, 1.4.1)
    jruby-rack (1.0.1)
    rack (1.1.0)
    rubygems-update (1.3.7)
    rubyzip (0.9.4)



2.不具合現象




不具合現象は、実行時に下記ログに示されるような現象である(一部、当方で入れた
デバッグ用のメッセージも含む)。


◇ログ1(ActiveScriptRuby; No such file or directory (Errno::ENOENT))



D:\Program Files\ruby-1.8\usr\local\sinatra_test>appcfg.rb bundle .
D:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/appengine-tools-0.0.13/lib/appe
ngine-tools/boot.rb:78: warning: `*' interpreted as argument prefix
file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/jruby-stdlib
-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb:926:in `set_pa
ths': No such file or directory - No such file or directory - C:/Documents and S
ettings/テ」ツ・セテ」ツ・・(Errno::ENOENT)
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/defa
ults/jruby.rb:17:in `set_paths'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/defa
ults/jruby.rb:60:in `installed_spec_directories'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/sour
ce_index.rb:58:in `from_installed_gems'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/gem_
path_searcher.rb:84:in `init_gemspecs'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/gem_
path_searcher.rb:19:in `initialize'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from D:/PROGRA~1/ruby-1.8/bin/appcfg.rb:9
Error executing jruby




◇エラーログ2 (Cygwin/XP, dev_appserver.rb; Error opening zip file or JAR manifest missing)


$dev_appserver.rb .
/usr/lib/ruby/gems/1.8/gems/appengine-tools-0.0.15/lib/appengine-tools/boot.rb
=> Booting DevAppServer
=> Press Ctrl-C to shutdown server
exec "java" "-classpath" "/usr/lib/ruby/gems/1.8/gems/appengine-sdk-1.3.5/appeng
ine-java-sdk-1.3.5/lib/appengine-tools-api.jar" "-Djava.util.logging.config.file
=/usr/lib/ruby/gems/1.8/gems/appengine-sdk-1.3.5/appengine-java-sdk-1.3.5/config
/sdk/logging.properties" "-Dcom.google.appengine.plugin.path=/usr/lib/ruby/gems/1
.8/gems/appengine-tools-0.0.15/lib/appengine-tools/app_yaml.jar" "-javaagent:/u
sr/lib/ruby/gems/1.8/gems/appengine-sdk-1.3.5/appengine-java-sdk-1.3.5/lib/agent
/appengine-agent.jar" "com.google.appengine.tools.development.DevAppServerMain"
"--disable_update_check" "/home/masa/local/sinatra_test"
Error opening zip file or JAR manifest missing : /usr/lib/ruby/gems/1.8/gems/app
engine-sdk-1.3.5/appengine-java-sdk-1.3.5/lib/agent/appengine-agent.jar
Error occurred during initialization of VM
agent library failed to init: instrument





◇エラーログ3(ActiveScriptRuby; Mutex relocking by same thread (ThreadError))


D:\Program Files\ruby-1.8\usr\local\sinatra_test>appcfg.rb generate_app .
D:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/appengine-tools-0.0.13/lib/appe
ngine-tools/boot.rb:78: warning: `*' interpreted as argument prefix
=> Generating gemfile
=> Bundling gems
D:/Program Files/ruby-1.8/lib/ruby/1.8/pathname.rb:263: warning: `*' interpreted
 as argument prefix
D:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/bundler08-0.8.5/lib/bundler08/d
ependency.rb:59: warning: discarding old version
Calculating dependencies...
Updating source: http://gems.rubyforge.org
D:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/bundler08-0.8.5/lib/bundler08/r
esolver.rb:115:Warning: Gem::Dependency#version_requirements is deprecated and w
ill be removed on or after August 2010.  Use #requirement
Caching: appengine-rack-0.0.9.gem
Caching: jruby-jars-1.4.1.gem
Caching: jruby-rack-1.0.1.gem
Caching: rack-1.1.0.gem
Installing jruby-jars (1.4.1)
Installing rack (1.1.0)
Installing jruby-rack (1.0.1)
Installing appengine-rack (0.0.9)
Done.
=> Packaging gems
=> Installing appengine-rack.jar
=> Installing jruby-core-1.4.1.jar
=> Installing jruby-stdlib-1.4.1.jar
=> Installing jruby-rack-1.0.1.jar
=> Installing appengine-sdk
=> Generating rackup
file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/jruby-stdlib
-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb:888:in `search
er': Mutex relocking by same thread (ThreadError)
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/cust
om_require.rb:33:in `require'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/shared/builtin/ja
vasupport.rb:37
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/shared/builtin/ja
vasupport.rb:31:in `require'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/cust
om_require.rb:31:in `require'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/defa
ults/jruby.rb:70:in `spec_directories_from_classpath'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/defa
ults/jruby.rb:60:in `installed_spec_directories'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/sour
ce_index.rb:58:in `from_installed_gems'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/gem_
path_searcher.rb:84:in `init_gemspecs'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems/gem_
path_searcher.rb:19:in `initialize'
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb
        from file:/D:/Program Files/ruby-1.8/usr/local/sinatra_test/WEB-INF/lib/
jruby-stdlib-1.4.1.jar!/META-INF/jruby.home/lib/ruby/site_ruby/1.8/rubygems.rb:9
        from D:/PROGRA~1/ruby-1.8/bin/appcfg.rb:9
Error executing jruby





3.回避・修正方法



不具合現象の(1)、(3)に関しては、google-appengineパッケージの更新(下記(1))で、修正されることがわかった。不具合現象(2)については、パッケージ内のスクリプトの一部のパスの指定方法に、問題があることがわかった(下記(2))。

下記(1)、(2)に回避・修正方法を示す。



(1) GAE gemファイルの更新


エラーログから、jruby-jar等に問題があることが推測された。
google-appengineのgemを最新のものに更新することで、当該現象は発生が抑えられた。
   gem update google-appengine




(2) GAE/JRubyのスクリプトdev_appserver.rbの修正(Cygwinの場合)



パスの指定部分を、全てcygpathでラッピングする[1]

/lib/ruby/gems/1.8/gems/appengine-tools-0.0.15/lib/appengine-tools/
appserver.rb


<             server_args[-1] = File.expand_path(path)
---
>             tmp_expath = File.expand_path(path)
>             server_args[-1] = `cygpath -wp #{tmp_expath}`.chomp


<           java_args << AppEngine::SDK::TOOLS_JAR
---
>           java_args << `cygpath -wp #{AppEngine::SDK::TOOLS_JAR}`.chomp



<               AppEngine::SDK::SDK_ROOT + '/config/sdk/logging.properties'
<           java_args << "-Dcom.google.appengine.plugin.path=#{plugin_jar}"
---
>               `cygpath -wp #{AppEngine::SDK::SDK_ROOT}/config/sdk/logging.prop
erties`.chomp
>           java_args << "-Dcom.google.appengine.plugin.path="+`cygpath -wp #{pl
ugin_jar}`.chomp
>


<             java_args << '-javaagent:' + AppEngine::SDK::AGENT_JAR
---
>             java_args << '-javaagent:' + `cygpath -wp #{AppEngine::SDK::AGENT_
JAR}`.chomp




これもっと綺麗な方法ないかな、とも思いますが・・・。





4.動作結果




ブラウザからhttp://localhost:8080/にアクセスすれば、所望の結果が得られる。

D:\Program Files\ruby-1.8\usr\local\sinatra_test>dev_appserver.rb.bat .
D:/PROGRA~1/ruby-1.8/lib/ruby/gems/1.8/gems/appengine-tools-0.0.15/lib/appengine
-tools/boot.rb:50: warning: `*' interpreted as argument prefix
=> Booting DevAppServer
=> Press Ctrl-C to shutdown server
2010/07/26 1:23:22 com.google.apphosting.utils.jetty.JettyLogger info
情報: Logging to JettyLogger(null) via com.google.apphosting.utils.jetty.JettyLo
gger
2010/07/26 1:23:22 com.google.apphosting.utils.config.AppEngineWebXmlReader read
AppEngineWebXml
情報: Successfully processed D:\Program Files\ruby-1.8\usr\local\sinatra_test\WE
B-INF/appengine-web.xml
2010/07/26 1:23:22 com.google.apphosting.utils.config.AbstractConfigXmlReader re
adConfigXml
情報: Successfully processed D:\Program Files\ruby-1.8\usr\local\sinatra_test\WE
B-INF/web.xml
2010/07/26 1:23:22 com.google.apphosting.utils.jetty.JettyLogger info
情報: jetty-6.1.x
2010/07/26 1:23:25 com.google.apphosting.utils.jetty.JettyLogger info
情報: Started SelectChannelConnector@127.0.0.1:8080
2010/07/26 1:23:25 com.google.appengine.tools.development.DevAppServerImpl start

情報: The server is running at http://localhost:8080/







5.結論





  • JRuby(jruby-jars)は、バージョンによってはActiveScriptRuby、もしくはCygwin/XPにおいて、ThreadErrorにより動作しない

  • gemパッケージ:google-appengineを、最新のバージョンに更新する。

  • Cygwinでは、一部のスクリプトのjavaコマンド発行時のパス名が問題となる

  • Cygwinのコマンド:cygpath -wp で、ラッピングしてjavaコマンドに渡されるように、dev_appserver.rbを修正する。

  • 上記により、ActiveScriptRuby, Cygwin/XP両者の環境で、ローカルPC上で、GAE/JRubyの動作を確認できた。




6. Future Works





  • gem, appcfg.rb, dev_appserver.rb の使い方詳細の調査

  • リモート・サーバ上での動作

  • 彼女を作る

  • 不具合現象の原因となるgemパッケージの依存関係、ThreadErrorの生じる箇所
      については、今回あきらめた。JRubyの内部動作に強い興味を持つ向きは、探ってみてもよいかもしれない。





7.補論



  • Gemリポジトリ格納場所の再設定

  • 不具合現象(1)の発生は、3.回避・修正方法の(1)により、抑えられる。しかし、類似の現象を未然に防止するため、Gemリポジトリの設定をしておいたほうがよいかもしれない。


    本稿の場合、3.appcfg.rbから実行されるgemにおいて、リポジトリ処理に日本語パス名起因である不具合現象(1)が、当初存在していた。

    gemは、動作時にリポジトリ・ファイルを作成する[2]

    AcitiveScriptRubyの場合、特に指定がなければ、リポジトリはディレクトリ:%HOME%となる。このパス名に、日本語が含まれている場合、google-appengineのバージョンによっては、不具合現象(1) の原因になる。

    これを防ぐには、google-appengineパッケージの更新、もしくは環境変数GEM_HOMEを、適切に設定する。

    設定方法は、
    コンパネ>システム>詳細設定、またはコマンド・プロンプト
    で、環境変数:GEM_HOMEを、日本語を含まないパスに設定する

    である。

  • Cygwin

  • Cygwinに関しては、ホーム・ディレクトリを、日本語パス名を含まないものに変更している。





8.References



[1] Toru Takahashi; "CygwinでJavaを快適に使う";http://www.02.246.ne.jp/~torutk/javaoncygwin/javaoncygwin.html


[2] docs.rubygems.org; "RubyGems User Guide | RubyGems Manuals";
3.2 Installing RubyGems in a User Directory,
     
http://docs.rubygems.org/read/chapter/3#page83