Archive for 10月, 2008

ActiveObjectsでH2を使うには

DatabaseProvider#getInstance()を参照すると以下の記述が。

SupportedDBProvider provider = SupportedDBProvider.getProviderForURI(uri);
if (provider == null) {
	throw new RuntimeException("Unable to locate a valid database provider for URI: " + uri);
}

つまり、SupportedDBProviderがちゃんと取れてないんですね。
じゃぁ、そっちを見ましょう、と言うことで見てみます。SupportedDBProviderではEnumを拡張して対応しているDBかどうかをチェックしている模様。
その中にH2が含まれていないのですね。結果、DatabaseProvider様が「んなDB知るか!!!」とのたまっているのですね。お気持ちはわかります。
Wicket + Guice + ActiveObjects + H2ができない - kirikenの日記

このエントリに対し、僕はLDCで「SupoprtedDBProvider自体も書き換えたような記憶が」って書きました

気になったので、もっかい見なおしてみたら、そんなこともする必要なくて、

new EntityManager(H2DatabaseProvider.getInstance("jdbc:h2:file:hogehoge", "sa", ""))

を、

new EntityManager(new H2DatabaseProvider("jdbc:h2:file:hogehoge", "sa", ""))

にすればいいだけっぽい。

どういうことかというと、DatabaseProvider#getInstanceは、上で引用してる部分で、サポートしてるDBかどうかチェックしたあとにSupportedDBProvider#createInstanceを呼んでるんだけど、こいつが実際に使用しようとしてるDatabaseProviderをインスタンス化してる。

Constructor constructor = type.getDeclaredConstructor(new Class[] {
    java/lang/String, java/lang/String, java/lang/String
});
constructor.setAccessible(true);
back = (DatabaseProvider)constructor.newInstance(new Object[] {
    uri, username, password
});

こんな感じでね。これって要は、コンストラクタ呼びだしてるだけだよね。んでこのbackを呼びだし元に返してるだけなので、結局はnewしてるのと変わらない。
ま、poolingするときは、このbackを利用可能なpoolProviderに入れて返してるんで、poolingしたい場合にはSupoprtedDBProviderを書き換えるしかないかもだけど。

というわけで、

new EntityManager(new H2DatabaseProvider("jdbc:h2:file:hogehoge", "sa", ""))

でやってみてくださいな。

ってか、H2使うなら、ActiveObjectsよりもJaQu(H2に付属のORM)使うほうが楽しいと思うけどねー。

glassfish_railsは動くのに、jetty_railsが上手く動かない

Rails 2.2でスレッド・セーフになると、JRuby上で動かす利点がさらに増えるよねってことで、JRuby On Railsを試したりしてる。

GlassFish Gemを使って、GlassFish v3にdeployするのは超簡単。
JRubyをinstallして、パスとか通したりしたら、
jruby -S gem install rails
で、JRuby用のRailsをinstall。ちなみにRubyGemsは最初から入ってる。
jruby -S rails demo
で、Railsアプリの雛形作成。
jruby -S gem install glassfish
で、GlassFish Gemのinstall。
jruby -S glassfish_rails demo
で、GlassFishを起動できる。んだけど、注意点が一つ。
WEBRickなりMongrelなりを起動するときは、作成したRailsアプリのディレクトリ(この場合demo)の中で、
ruby script/server
ってやってたけど、glassfish_railsコマンドはdemoの一個上のディレクトリで実行する。
そうすれば、http://localhost:3000/で、例のRailsのスタートページ(動作環境とかがAjaxで見えるやつ)が見える。
demoの中で実行した場合は、Railsアプリはdeployされず、GlassFishの動作確認ページっぽいのしかでてこない。

んで、その辺の情報を調査してるときに、rackに基づいて作られてるアプリをJavaのアプリケーションサーバ上で動かせるJRuby-Rackを発見。
これならRailsだけじゃなくてMerbで作ったアプリケーションなんかもGlassFishとかで動かせちゃう。

さらに、そのJRuby-Rackを使ってJetty上でRailsや、MerbなどのRackベースのframeworkで作られたアプリケーションを動かせるようにする、jetty-railsを発見。
こいつは、RailsやMerb以外にも、GlassFish GemではできないJava Servletアプリケーションも動かせるらしい。
GlassFish Gemの手軽さで、RailsとServletの共存ができるなんて素晴しいってことで、さっそく試してみた。

jruby -S gem install jetty-rails
で、install。
GlassFish Gemとは違って、Railsアプリのディレクトリ(今回はdemo)に入って、
jruby -S jetty_rails
で、上手くいくはずなのに、次のようなエラーが。

C:/jruby/jruby-1.1.4/lib/ruby/gems/1.8/gems/activesupport-2.1.2/lib/active_support/dependencies.rb:513:in `new_constants_in': protected method `log' called for ActiveSupport::Dependencies:Module (NoMethodError)
from C:/jruby/jruby-1.1.4/lib/ruby/gems/1.8/gems/activesupport-2.1.2/lib/active_support/dependencies.rb:510:in `require'
from C:/jruby/jruby-1.1.4/lib/ruby/gems/1.8/gems/jetty-rails-0.6/lib/jetty_rails.rb:13
from C:/jruby/jruby-1.1.4/lib/ruby/gems/1.8/gems/jetty-rails-0.6/lib/jetty_rails.rb:27:in `require'
from C:/jruby/jruby-1.1.4/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
from C:/jruby/jruby-1.1.4/lib/ruby/gems/1.8/gems/jetty-rails-0.6/bin/jetty_rails:36
from C:/jruby/jruby-1.1.4/lib/ruby/gems/1.8/gems/jetty-rails-0.6/bin/jetty_rails:19:in `load'
from C:/jruby/jruby-1.1.4/bin/jetty_rails:19

config/jetty_rails.ymlを

---
:servers:
- :context_path: /demo
  :adapter: :rails
  :base: jetty_rails_proj
  :environment: development
  :port: 3000
:environment: production
:jruby_min_runtimes: 1
:jruby_max_runtimes: 2
:thread_pool_max: 40
:thread_pool_min: 1
:acceptor_size: 20

こんな感じで作って、config/environment.rbに
ActionController::AbstractRequest.relative_url_root = "/demo"
を追加しても同じ。

むーん。

===追記(10/30)===
どうやらJRuby1.1.4のバグのようです。
http://blogs.sun.com/cinnabar/entry/jetty_rails_with_jruby1_1

===追記(11/7)===
http://blogs.sun.com/cinnabar/entry/jruby1_1_5_releaseにある通り、JRuby1.1.5で動作するのを確認しました。

元「協力会社さん」として

「外注と同じ仕事しかしないなら辞めろ」
http://d.hatena.ne.jp/yuripop/20081021/p1

を受けて、id:yuripopと「協力会社さん」という立場で一緒の現場で働いていた身として、色々書いておきたいことがある。

って思ったけど、

前は、だれのブログを見ても必ずJavaのソースがあるとか、いかにコードを書くかという話だった感じだけど、いまはいかに仕事をするかとか、いかに生きるかとか。技術話から業界話にシフトしたのか。
http://d.hatena.ne.jp/nowokay/20081021#1224616671

を見て、あーやっぱ僕はコード書こうって思ったのでやめとく。

ただ、ひとつだけ。
色々あった現場だけど、僕はid:yuripopと一緒の現場にいれてよかったなぁって思うよ、うん。

第一回ひがやすを飲み会

第一回ひがやすを飲み会に参加したつもりが、いつの間にかjava-jaに参加していた。

吉岡さんがWassrの「今夜は飲みに行けるよ!」ボタンをずっと褒めてた。その後、酔っ払ってからはずっと眼鏡っ子を口説いてた、気がする。
あと、池面眼鏡っ子くどいてる姿も写メ撮った。
その後、早めにyuripopと一緒に帰った。品川駅まで。

翌日、傘置き忘れたことに気がついた。

次のページ »