Saturday, September 24, 2011

springの設定ファイルをWEB-INF直下に置くとテストが難しくなる

Spring + Struts あるいはSpring + SpringMVCといった組み合わせでWebアプリケーションを作る場合、
src/main/webapp/WEB-INF/applicationContext.xml
のような位置にspringのbean定義ファイルをつくる例が多いようです。実際、巷の書籍やIT系サイトの記事などでもそのようなサンプルがよく公開されています。

しかし、この配置方法には実は大きな問題があります。JUnitなどのテストケースを実行するとき、その設定ファイルをロードできません。なぜならWEB-INFの直下はクラスパスではないからです。 このスレッドでもほぼ同じ問題について議論されていますが、このときは結論はでていなかったようです。 結局、似たような設定ファイルをsrc/test/resources配下等に置いて二重管理するといった、気の進まない方法に頼ることになってしまいます。

eclipse上でsrc/main/resources/applicationContext.xml のようなビルドパスの通っている位置に移動させたうえで、web.xmlのほうには
    
        org.springframework.web.context.ContextLoaderListener
    
    
        contextConfigLocation
        classpath:mainContextConfig.xml
    
のようにclasspath:記法で書いておけば、クラスパス配下の設定ファイルをロードしてくれる(実体はWEB-INF/classes/mainContextConfig.xmlのようになる)。。。 はずなのですが、そうはとんやかです。

詳細は不明ですが、ContextLoaderListenerは強制的にWEB-INF/直下の設定ファイルを探しに行ってしまいます。 結果、FileNotFoundExceptionを吐いてWebアプリが起動しません。 これを防ぐため、たとえば
    
        contextConfigLocation
        WEB-INF/applicationContext.xml, classpath:mainContextConfig.xml
    
のように書いておき、applicationContext.xmlには<beans><!-- dummy! --></beans>のような無設定のダミーを仕込んで、本来の設定をすべてclasspath:mainContextConfig.xmlのほうに書いておくことで対応できます。

Sunday, August 28, 2011

Chrome+HTML5カンファレンスでライトニングトークしてきました。

先週、Chrome+HTML5 カンファレンス at Google Japan(六本木ヒルズ)で、ライトニングトークに参加してきました。お礼が遅れてしまいましたが、当日の運営の皆様に感謝します。

Thursday, August 4, 2011

mixer2がhtml5に対応しました

ここでの報告が遅れてしまいましたが、version 1.1.0 をリリースしました。 html5の全ての要素、属性に対応しています。下位互換性は保たれているので、従来のXHTML1.0 Transitionalでも大丈夫です。

詳しい使い方のサンプルなどはここで徐々に書いてゆこうかなと。ちょっと忙しいので時間とれてませんが。

Monday, July 11, 2011

xperia arc のOSアップデートで通話に不具合が出るようです

自分も使ってるxperia arcですが、7月初旬にAndroidOSの自動アップデートが配信された後、通話に不具合がでているようです。電話が繋がっても2分前後で切れちゃうとか、音声が全く聞こえないとか。

自分の場合は、電源きる&電池とSIMカードを抜く&再びSIMカードと電池入れる&電源入れる、で直りました。そんなこったろうと思った...

いまtwitterで xperia arc 不具合 みたいなキーワードで検索すると、ドコモショップ行かなきゃ、みたいな話をしている人が結構いますが、そもそもtwitterにそう書く前にTwitter上で検索してみてはいかがでしょう。私の投稿がヒットしますから。w

追加です

数十時間後、ほぼ同じ症状が再発しました。だめだこりゃ。ソニーエリクソンはもう少しテストしてから更新かけてほしいものです。

追加です。この件を解消するべく新たなアップデートが7月27日に出ているようです。 ドコモ、「Xperia arc」「Xperia acro」のソフトウェアアップデートを開始 - ITmedia +D モバイル

Thursday, May 5, 2011

mixer2 1.0.8リリース。TableBuilderでテーブルを組むのが楽になりました。

詳しくは公式サイトのほうをご覧ください。mixer2 - TableBuilder です。あとJavaDocも。→TableBuilder (mixer2 1.0.8 API)

table,tr,tdだけでなく、tbodyやthead,tfootタグにも対応していますので、ブラウザ側でも、たとえばjqueryのdatatables等のライブラリと組み合わせやすいでしょう。たとえば「ASCII.jp:JavaScriptだけで表<table>を並び替え!」とか。

Saturday, April 23, 2011

Tableタグを作るBuilderクラスをつくってます

mixer2で、table,tr,tdタグを組もうとすると、こうなります。

import static org.mixer2.xhtml.TagCreator.*;
...
Table table = new Table();
// 一個目のtd
Td td1 = td(); // td = new Td(); と同じ意味になります。
Tr tr = tr();
td1.getContent.add("a");
tr.getThOrTd().add(td1);
// 2個目のtd
td2 = td();
td2.getContent.add("b");
tr.getThOrTd().add(td2);
// tableに収める
table.getTr().add(tr);
...

面倒ですよね(笑)。他のタグならともかく、tableタグはデータ表示などの目的での利用頻度がものすごく高いタグですので、これじゃあちょっと、あんまりです。

そこで、こんな風に、わかりやすくtableを組めるTableBuilderクラスをつくっているところです。

...
TableBuilder tb = new TableBuilder();
tb.tr(0).td(0).add("a"); // 1行目、1列目のtdにaがはいる
tb.tr(0).td(1).add("b"); // 1行目、2列目のtdにbがはいる
Table table = tb.build(); // これでtableタグ全体ができる
...

もちろんこれだけでなく、行、列のindexを指定しなくてもadd("a")とかするだけで最後尾に自動的にtrやtdを作るようなメソッドもつくろうかなとも思っています。いろいろと試しているところです。

mixer2の次期リリースに搭載できると思います。乞うご期待。

Wednesday, April 20, 2011

mixer2 version1.0.6リリース。FormUtilクラスを追加しました。

formタグ内部のinputやselect等に、JavaBeanクラスの内容を自動的に挿入するユーティリティが追加されました。詳しくは mixer2 - Form and JavaBean をご覧ください。

Strutsのアクションフォームクラスや、Spring MVCのcommandクラスでも使われている、一般的なJavaBeanをそのまま使うことができます。Webアプリにおいて、formタグを使ったCRUD的な画面を生成する際に、結構便利に使えると思われます。

Saturday, March 19, 2011

mixer2 version1.0.4で部分マーシャル機能が追加されました

従来のmixer2は、Webページの全体、つまり<html>から</html>までを一気に文字列化する必要がありました。

version1.0.4以降、任意のタグ、例えば<div>から</div>までなど、htmlの一部分だけを出力(マーシャル)することができるようになりました。

これによって、たとえばVelocityやJSPなど、他のテンプレートエンジンと組み合わせて使うために、Webページの一部だけをmixer2で出力したいという要求に答えられるようになりました。

Sunday, March 6, 2011

オープンソースカンファレンス2011 Tokyo/Springへの謝辞

オープンソースカンファレンス2011 Tokyo/Spring - オープンソースの文化祭!に参加してきました。(土曜日だけですが)

セミナーをいくつか見て回りましたが、その中でも[パネルディスカッション] オープンソース/クラウド時代のキャリアデザインとははなかなか興味深かったです。超満員。事前登録しといてよかったー。

そして(自分的には)本題のLT(ライトニングトーク)でmixer2についてしゃべらせていただきました。5分しかないというのにその半分は笑いを取りにいくための思い出話(?)をしてしまいましたww。 しかしだからといってmixer2をかいつまんででも紹介するのは5分ではおさまるわけもないので、「詳しくはWebで!」ってやつです。

LTでしゃべれるのは10人前後(先着順)ですが希望者はもっといたようです。 本当はああいうのは若い学生さんとかに譲るべきなんでしょうが、ほんと自分なんかがしゃべらせてもらっちゃってすいません。

そして、スタッフなど中の人に心から感謝を申し上げます。お疲れ様でした。 すごい人数でしたので、来年は大学施設とかではなく、東京ビッグサイト?ww

mixer2での繰り返しデータの埋め込み

先月のことですが、こんなツイートを見かけました。

mixer2おもしろそう。 http://goo.gl/W1pRO スクリプトや式といった処理と、テンプレートをキレイに分けられそう。繰り返しデータの埋め込みもサポートされているなら、Wicketのテンプレートだけ取り出したような、自分的には理想のテンプレートエンジンになりそう。
(とある方のつぶやきより)

mixer2に好感を持っていただけているようでうれしいです。

嬉しいよというついでに、「繰り返しデータの埋め込みもサポートされているなら」という点について、mixer2開発者としての説明をしてみたいと思います。

ツイート主さんの懸念、というよりは素朴な疑問と言うべきそれは、とても当然です。 Hello Worldには本当にHelloWorldを表示することしか書いてませんから。 どんなプログラマーでも、Javaでの開発でよく使われるJSPやVelocityのような従来のテンプレートエンジンとの比較を無意識に考えてしまうので、「じゃあ、ループしながら値を埋め込むようなときはどうすんだろ?」とふと思うのは当然です。

結論を言うと、
Q.たとえばDB検索の結果とかで複数の値があるとき、それを繰り返し処理しながら表示するのって、mixer2ではどうやんの?
A.普通にJavaでforやwhileなどを使ってください。
なのです。

具体的なサンプルソースは本家サイトのTIPSのページの下のほうに書いておきました。

さて、上のリンク先、見ていただけましたでしょうか?そう、コードが長いですww。 JSPだったら<c:foreach>のようなカスタムタグを含めた3,4行ですみそうなところが、 mixer2だと10行くらいになっちゃってます(コメント行いれると15,6行!)

もちろん、これがベストプラクティスだということではありません。 こうした繰り返し処理を簡略化する汎用ユーティリティのようなものをmixer2のほうで用意するべきなのかもしれません。

ともあれ、ひとまずはmixer2を使う側のコーディングでどうにでもなりますよ、ということはなんとなくわかっていただけると思います。なにしろ、VelocityのVTL言語でもなくJSPのカスタムタグでもなく、ただのJavaコーディングなのですから。