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