Ramaze はModularなWebアプリケーションフレームワークです。 以下のようにしてインストールしました。

   1  % sudo gem install ramaze
   2  % sudo gem install manveru-innate
   3  % sudo gem install manveru-nagoro

続いて、以下のようひな形を生成して起動します。

   1  % ramaze --create hello
   2  % cd hello
   3  % ramaze

ログの出力

ss1

起動画面

ss2

posted by Png genki on Thu 9 Apr 2009 at 19:34

2日前ぐらいからいろいろ頑張ってたのですが、ようやくGAEjの本番環境でMerbアプリを動かせました。

http://jmerbist.appspot.com/

ss

使っているgemをfreezeする仕組みがあるフレームワークであれば、どれでも以外と簡単に動きそうな感じがします。

いやー、これは色々面白い事が出来そうですね!

posted by Png genki on Thu 9 Apr 2009 at 17:23

Google App EngineでMerbを動かしてみた。

ss

しかし、本番環境にデプロイするためには別途Google App Engine Javaのアカウント申請が必要らしい。申請してみたけれど、レスポンスが無いので初回の10000万件の枠はもう無くなっている模様。

残念だなー。

posted by Png genki on Thu 9 Apr 2009 at 09:02

最新のhpricotをjruby(1.2)で利用する手順をメモしておきます。

まず、githubから最新のhpricotをcloneしてきます。

あとは、以下のようにしてjruby用のパッケージをbuildしてインストールします。

   1  % jruby -S rake package_java
   2  % sudo jgem install pkg/hpricot-0.8.235-jruby.gem

これでOK.

posted by Png genki on Thu 9 Apr 2009 at 01:52

以前、Merb用のaliasの設定をご紹介しましたが、今度はjruby版です。

   1  alias jm='PATH=./bin:$PATH jruby -S merb'
   2  alias jmi='jm -i'
   3  alias jmg='PATH=./bin:$PATH jruby -S merb-gen'

rubyとjrubyを両方使ってると、

   1  % jruby -S merb

のように書く事が多いので、aliasを設定しておくと便利ですね。

posted by Png genki on Thu 9 Apr 2009 at 01:48

思い立ってJRubyの環境を入れてみる事にしました。

ちょうどバージョン1.2が出ているようなので、ソースを落としてきます。

http://dist.codehaus.org/jruby/1.2.0/jruby-src-1.2.0.tar.gz

落としてきたファイルは/usr/local/jruby-1.2.0 あたりに展開します。 展開したら、Javaらしくantでbuildします。

   1  % ant

あとは、以下のように~/.zshrcなどで環境変数を設定します。

   1  export JRUBY_HOME=/usr/local/jruby-1.2.0
   2  export PATH=:$JRUBY_HOME/bin:$PATH

これで、ひとまずjrubyが動くようになります。

   1  % jruby -v
   2  jruby 1.2.0 (ruby 1.8.6 patchlevel 287) (2009-04-08 rev 6586) [i386-java]

posted by Png genki on Wed 8 Apr 2009 at 16:14

Merb/DataMapperをしばらく使っていたのですが、 少なくともバージョン0.9.10, 0.9.11では、 associationの実装にバグがあり、 レコード数が多いテーブルがあると、aggregation系の処理に時間がかかるという問題がある事が分かりました。

例えば、Post.has n, :comments な関係がある時に、 以下のようなコードを実行すると、このようになります。

   1  ?> Post.first.comments.count #=> 188
   2   ~ (0.000865) SELECT "id" FROM "posts" ORDER BY "id" LIMIT 1
   3   ~ (0.000094) SELECT "id", "post_id" FROM "comments" WHERE ("post_id" IN (1)) ORDER BY "id"
   4   ~ (0.000063) SELECT COUNT(*) FROM "comments" WHERE ("post_id" = 1)

2つ目のSQLは不要なのですが、発行されてしまいます。 例えばCommentのレコード数が多かった場合、Commentオブジェクトを大量に生成しようとしてしまうため、致命的な遅さになってしまいます。

目下この問題の解決策を探しているところですが、 Edge-DMのspec/仕様でerrorが出ている状態なので、なかなか手が付けられない感じです。 とりあえず、dm-coreのassociations/relationship.rbの中の、

   1        # @api private
   2        def get_children(parent, options = {}, finder = :all, *args)
   3          parent_value = parent_key.get(parent)
   4          bind_values  = [ parent_value ]
   5  
   6          with_repository(child_model) do |r|
   7            parent_identity_map = parent.repository.identity_map(parent_model)
   8  
   9            query_values = parent_identity_map.keys
  10            bind_values = query_values unless query_values.empty?
  11            query = child_key.zip(bind_values.transpose).to_hash
  12            collection = child_model.send(finder, *(args.dup << @query.merge(optio
  13  ns).merge(query)))
  14  
  15            return collection unless collection.kind_of?(Collection) && collection.any?

の最後の collection.any? で件のSQLが実行されているところまでは分かりました。 DataMapper::CollectionはextlibのLazyArrayを継承しているクラスなのですが、どうもそのへんの仕様が変わったのに追従できてないのかな。 モジュールを過度に分散しすぎるのも、整合性を保つのが大変になるという問題がありますね。 注意深く完全なSpecを書く事を心がけていれば防げる問題かもしれないですが。

posted by Png genki on Wed 8 Apr 2009 at 05:06

最近の釣果ならぬYak Shaving状況:

  • watch.s21g.com が重たくて固まる
  • CouchDB-adapterを疑ってmysqlに戻す
  • まだ遅いのでdm-aggregatesを調査
  • dm-core が原因っぽいのでdm-coreのソースを見る
  • dm-core のスペックが通らない
  • postgresが必要なのでインストール
  • Mac用インストーラではdo_postgresがmakeできない
  • postgresをソースからインストール <- いまここ

ということで、MacOSにPostgresを入れるためにユーザを作成する手順のメモ。

   1  # dscl . -create /Users/postgres
   2  # dscl . -create /Users/postgres UserShell /bin/bash 
   3  # dscl . -create /Users/postgres RealName "Postgres"
   4  # dscl . -create /Users/postgres UniqueID 451
   5  # dscl . -create /Users/postgres PrimaryGroupID 451
   6  # dscl . -create /Users/postgres NFSHomeDirectory /usr/local/pgsql

UID/GIDの根拠は自信が無い。UIDは500未満にしておくとログイン画面にでないようになるそうだ。

Alas, life is full of yakshaving!

See Also

posted by Png genki on Tue 7 Apr 2009 at 23:47

桜が散る前に、4/8の夜21時よりMerbJog#2を開催いたします。

詳細・参加申請は以下のサイトをご覧ください。

飛び入り参加もOKです。

よろしくお願いします。

posted by Png genki on Tue 7 Apr 2009 at 06:01

DataMapperはSQLを解さないアダプタも利用可能なので、この方法でSQLが実行できるかどうかはアダプタを選びますが、一般的には以下のようにすれば直接SQLを実行できます。

   1  Post.repository.adapter.execute("sql string")

結果は、例えばmysqlを使っている場合にはDataObjects::Mysql::Resultが帰ってきます。

posted by Png genki on Tue 7 Apr 2009 at 00:57