移転しました
http://osd.jp/itoasuka/ に移転しました。
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 配列)型にも対応していません。
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 を試してみた
私は前々から Wicket は Scala と相性がいいに違いないと言ってはいましたが、未だに試していなかったのでこの連休を利用して試してみました。ORM は最近 Doma がお気に入りだったのですが、Scala では APT が使えないので Squeryl を試してみました。
とにかく直列化が鬼門
Wicket といったら、とにかく Serializable です。Scala の場合は、直列化可能なクラスには @serializable を付けるのがお約束です。ところが、これは java.io.Serializable を実装するのとは意味が違っているようで、Model に食わせることができないのですね。
それから、Wicket は Scala ネイティブなフレームワークではないので、ほうぼうで 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 つきをはじいている。
- Doma は PostgreSQL 8.0 以上サポートを表明しているので、これは NOWAIT が使えない PostgreSQL 8.0 に対しては正しい挙動。
- しかしながら PostgreSQL 8.1 以上のユーザにとってはちょっと寂しい。
- なんにしても、NOWAIT を付けただけで「悲観的排他制御には対応していない」と言われるので、FOR UPDATE すら使えないと一瞬思ってしまう。