appengine-jruby はまりどころ
appengine-jrubyを使うと、GAE/JでJRubyが簡単に使えるらしいので、Twitter botを書き直してみたが、はまりどころ満載だったので、メモしておく。
appengine-jrubyで簡単GAE/JRuby開発 - しばそんノートがまとまっているので、その通りにやると、
- hpricotが動かない。
appengine-jrubyはgemをWEB-INF/lib/gems.jarにまとめてしまう。hpricotは自分でjruby版パッケージをビルドしないといけないのだが、
git clone git://github.com/whymirror/hpricot.git cd hpricot jruby -S rake package_jruby appcfg.rb gem install pkg/hpricot-0.8.257-jruby.gem
しただけでは、gemに含まれるhpricot_scan.jarが読み込まれないみたい。contentメソッドがないとか、scanはプライベートメソッドだとか、意味不明なエラーがでたが、自分でhpricot-0.8.257-jruby/lib/hpricot_scan.jarをWEB-INF/libにコピーするとちゃんと動いた。↓でうまくいってます。
body = AppEngine::URLFetch.fetch(@uri).body doc = Hpricot.parse(NKF.nkf("-wE", body)) # EUCのページ
- Datastoreが文字化けする。
ここに原因と対策が書いてある。多謝。
appengine-apis の memcache.rb を読み込むと Datastore に格納する日本語が文字化けする - milk1000cc
オリジナルを書き換えなくても、自分のファイルでoverwriteしてしまえばok。
require 'appengine-apis/datastore_types' 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 # <-- comment out java.lang.String.new(value) # <-- add else value end end end end end