Tuesday, September 23, 2014

Mixer2 1.2.34でのエンハンス(SpringMVC関連)

今月、Mixer2は実は2回リリースしてます。1.2.33と1.2.34。 1.2.33では一部のメソッドをprivateからprotectedにしたことで拡張、改造がしやすくなりました。 1.2.34ではSpringMVC用のAbstractなViewクラスを少し変更しています(下位互換性はありますのでご安心ください)。また、XMLStringUtilというユーティリティクラスを追加しています。

まずXMLStringUtil。これはXHTML(XML)として有効な文字列かどうかを判別したり、無効な文字列を任意の文字(デフォルトだと空白ひとつ)で置換することができます。 XMLで使用できる文字列はw3c.org上で厳密に決められています。簡単に言うと、いわゆるUTF-8の範囲内の文字と、あとは改行、空白、タブ等のごく限られた制御コードのみということです。 XHTMLはXMLのサブセットですから右に同じということになり、Mixer2が使用しているJavaのJAXB実装もこれに厳密に従っています。そのため、妙な制御コード、たとえば改ページ制御コードがxhtmlテンプレート上に含まれていたり、あるいはそれをorg.mixer2.jaxb.xhtml.*配下のタグ型の内部にうっかり仕込もうとすると、saveToStringする段階で例外が発生してしまうことがあります。 XMLStringUtilはその防波堤となるユーティリティです。

次に、SpringMVC用の抽象ビュークラスに新たにmodifyHtmlStringHookというメソッドを追加しました。 このメソッドは、Mixer2がhtmlオブジェクトをsaveToString()して文字列化したあとに呼ばれ、その後すぐhttp responseするようになっています。

デフォルトのままだとスルーパスするだけ(何もしない)ですが、Viewの実装クラス内でこのメソッドをオーバーライドすると、httpレスポンスされる直前のhtml文字列(Html型のインスタンスではなく)を直接操作できます。これによって、Mixer2ではできないこと、たとえばhtmlコメント等の埋め込みが可能です。 たとえば、HTML5未対応なIE8以下を擬似的にhtml5対応させるために、html5.jsを使うことがあると思います。 しかし、公式サイトを見ての通り、これは

<!--[if lt IE 9]><script src="dist/html5shiv.js"></script><![endif]-->
のように、IE特有のコンディショナルコメントとして埋め込む必要があります。Mixer2はhtmlコメントを埋め込むことができない(あっても無視してしまう)ので、Mixer2付属のSpringMVC用のビュー/ビューリゾルバでは使用できませんでした。1.2.34以降では、modifyHtmlStringHook() をオーバーライドして、例えば</head>タグのあたりをString#replace()メソッド等を使って狙い撃ちにすれば、上記のコンディショナルコメントを追加することができます。

まだ公式マニュアルには実はどちらもまともに書いていません。そのうちちゃんと書かねば。

Sunday, September 21, 2014

#渋谷java でしゃべってきた(@jfutさん、@seri_kさん、ありがとう!)

第8回#渋谷Javaという勉強会で少しばかりしゃべってきました。

自分の話した内容はさておき、まず必見なのがこちら。

Mixer2を使ってくれている@jfutさんに「なんかしゃべっていただけませんか?」とぶしつけにもお願いしたら、なんかすごいのを用意してLTしていただくことができました。感動です。

Mixer2に対する@jfutさんの捉え方というかアプローチはすごく真っ当で、そうなんですよ。Mixer2のAPIはわかりやすくかつ自由度が高いので、自分が必要なヘルパークラス的なものをガンガン作ってしまえば、自分の必要なものに合わせたテンプレート機構を作り上げることができるということです。

思えば、個人的にvelocityのマクロを作ったこともありますがなんだかクセがあって他人がメンテできる状態にしづらかったですし、だからといってjspのカスタムタグはなおさらテストを書きづらいわ一生懸命作ってもバッチ処理では使えないわw。

@jfutさんに一杯ごちそうしたいところでしたが、あいにく昨日は夜に別の予定をいれてしまっていたので挨拶だけしてお別れしました。(@jfutさん、またの機会に!)

一方自分は「QueryDSLとSpringDataでとりあえずCRUD」というテーマで話しました。パワポ資料無しサンプルコードのみのハードボイルドプレゼンで行くぜ!とか言ってたら、 Create(INSERT)とRead(SELECT)やっただけで時間切れでU,Dの話が出来ずじまいという体たらく。 はい、実は前日の暴飲暴食&飲み過ぎのせいで種々の準備と時間の読みとが間に合ってなかっただけですごめんなさいごめんなさいごめんなさい。 サンプルコードと簡単な使い方は公開しておりますのでご興味あるかたはお試しください。

特に、多くの方のツッコミどころである「その手のDSLツールでは、selectの時にjoinってどうやるの?」というところまで話す間も無かったのが超反省点です。 とは言っても、コード見ればなんとなくわかるというレベルの話でしかないので、以下をご覧ください。

最後になりましたが、@seri_kさんがちかぢか東京を離れるため。必然的に#渋谷javaの運営からも距離を置かざるを得ないことになりました。(#渋谷javaは別の有志によってこれまで通り存続します) 初期の立ち上げ、そして1年あまりの運営、本当にありがとうございました。@seri_kさんに、心から感謝と敬意を表します。