Wicket 1.5-rc2 リリース!

 Wicket 1.5-rc2 がリリースされました。なぜか今回は「RC2」ではなく「rc2」です。お間違えのないようご注意ください(笑)。

 これは私にとってとても嬉しいリリースなのです! このリリースにあわせて wicketstuff の 1.5-rc2 がリリースされました。そしてこの中に WicketScala 拡張があるのですが、この度はじめて Scala 2.8.1 対応となりました!(これまでは 2.7.5)。これでシコシコ SNAPSHOT をビルドする必要がなくなります。やったね!

Scala + Wicket にあう ORM を探す

 面白みがないので JPA はとりあえずおいときます。Doma がお気に入りなので、Doma が念頭にあったりします。それを踏まえて Scala + Wicket にあう ORM を探しています。文中でいう「エンティティ」とはレコードと紐づくクラスのことです。

Squeryl

 Wicket で利用するなら直列化に関する仕組みがしっかりできていないといけません。Squeryl その点でポロポロ問題がでました。以前もとりあげましたが、まず、エンティティに定義している serialVersionUID がなぜか永続化対象になってしまいます。これはバグでしょう。それから、エンティティのフィールドにカスタム型(ユーザ定義型)が使えるのですが、そのカスタム型が必ず継承しなければならないクラスが Serializable ではないのでカスタム型を使用したエンティティは直列化できなくなってしまいます。

 結論としては現時点では Squeryl は Wicket との相性は悪いです。ただ、以下の ORM に比べると、エンティティをイミュータブルにできたり、フィールドの型に Option 型を使用することができるなどとても Scala 的です。今後に期待しています。

Circumflex ORM

 Circumflex という Web アプリケーション・フレームワークがあるのですが、その ORM を単独で使うことができます。ドキュメントが少なく、トランザクション管理のやり方を見つけるまでずいぶん苦労しました。「やりすぎ」と評される DSL っぷりですが、その分、直感的な使い方ができたりもします。おそらく必要になったときに DB セッションが始まるという仕組みになっていて、リクエストサイクルリスナでコミットやロールバックしてあげればどこでセッションがどれだけ使われるかわからないような Wicket にはうってつけの仕組みだと思います。

 Squeryl のようにエンティティをイミュータブルにすることはできなさそうです。また、デフォルトで対応している型が少ないのもネックで BINARY(byte 配列)型にも対応していません。

MyBatis

 iBatis あらため MyBatis です。これは Scala ネイティブではありません。非常に柔軟で、エンティティに縛りがほとんどありません。ただ、そもそも Java 用ですので(.Net 版もあるが)Scala 側から歩み寄らなかればならない点もいくつかあります。フィールドにカスタム型が指定できますが Option 型を扱うためのいい方法が私には見つかりませんでした。

 Guice との連携も簡単で、これ単独で AOP によるトランザクション境界も設定できて Wicket との相性は良いです。Scala 的でない部分に目をつぶれば良い選択肢だと思います。

Ubuntu 10.10 で KeePass 2.14 を動かす。

 私はパスワード管理に KeePass Password Safe を使っています。Windows のソフトウェアですが、KeePassX という KeePass 互換のソフトが Ubuntu の標準リポジトリに存在します。

 しかし、KeePassX は KeePass バージョン 1 系と互換性がありますが、バージョン 2 系とはありません。

 Windows 陣がとっとと KeePass 2 系に以降しているのに Ubuntu 陣がそれに追従できないのはまずい!ということで、よく見てみたら、これは Mono でも動くとのこと。私の環境では、以下のライブラリを追加すると動かすことができました。たぶん mono-runtime も必要ですが、私の環境では入れたつもりがなかったのですがすでにはいっていました。

sudo aptitude install libmono-system-runtime2.0-cil
sudo aptitude install libmono-winforms2.0-cil

起動は以下のように

mono KeePass.exe

Scala + Wicket + Squeryl を試してみた

 私は前々から WicketScala と相性がいいに違いないと言ってはいましたが、未だに試していなかったのでこの連休を利用して試してみました。ORM は最近 Doma がお気に入りだったのですが、Scala では APT が使えないので Squeryl を試してみました。

とにかく直列化が鬼門

 Wicket といったら、とにかく Serializable です。Scala の場合は、直列化可能なクラスには @serializable を付けるのがお約束です。ところが、これは java.io.Serializable を実装するのとは意味が違っているようで、Model に食わせることができないのですね。

 それから、WicketScala ネイティブなフレームワークではないので、ほうぼうで Java コレクションが使われているわけです。Scala には Scala コレクションを Java コレクションに変換する機能があるわけですが、この変換結果が Wicket から見ると Serializable じゃないので、警告ログが出てしまいます。なので、コピーコンストラクタを使ったりするはめになり、オーバーヘッドがちょっと気になるところ。

 Squeryl は「Scala ORM」でググッたら一番初めに出てきたので使ってみただけなのですが、仕組み的にはとても好みに合いました。Doma と同じく、フィールドにドメインオブジェクトを使用することができ、さらにエンティティをイミュータブルにできるってのが良いです(これは私の Doma の不満点のひとつでした)。ところが、こいつ、SerialVersionUID すら永続化しようとするのですよ。エンティティ中の永続化しないプロパティをアノテーションによって指定することができるのですが、Scala は SerialVersionUID をアノテーションで指定するので、これで永続化対象で外すことできなさそうです。なので、Wicket でちょいと使いにくいかなと思いました(とりあえず、@serializable だけをつけて @SerialVersionUID をつけないようにして回避しています)。

昨日の Wicket に関するつぶやき

  • Wicket かわいいよ、Wicket
  • Wicket には BigInteger のコンバータがない。BigDecimal はある。
    • Doma は BigInteger に対応している。けど、Wicket に BigInteger のコンバータがないし、自分で作るのもめんどい割に報われなさそう(使わなさそう)だから、自作のドメイン用コンバータは BigInteger へは当面非対応で。
    • と思ったけど、BigDecimal にしてから、toBigInteger で暫定的に対応しようかしら。

昨日の Doma に関するつぶやき

 最近、Twitter でつぶやいてばかりでぜんぜんここを更新していなかったので、つぶやきをまとめ、補足しておきます。

PostgreSQL の FOR UPDATE(行ロック)の話

  • Doma 1.13.0 では PostgreSQL の FOR UPDATE NOWAIT 構文が使えない。FOR UPDATE は使える。
    • Doma が NOWAIT つきをはじいている。
    • DomaPostgreSQL 8.0 以上サポートを表明しているので、これは NOWAIT が使えない PostgreSQL 8.0 に対しては正しい挙動。
    • しかしながら PostgreSQL 8.1 以上のユーザにとってはちょっと寂しい。
    • なんにしても、NOWAIT を付けただけで「悲観的排他制御には対応していない」と言われるので、FOR UPDATE すら使えないと一瞬思ってしまう。

Doma tools への要望

  • DAO のメソッド名をリファクタリングで変更したら、SQL ファイルのファイル名も追従してほしいなぁ。