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さんに、心から感謝と敬意を表します。

Thursday, June 12, 2014

Mixer2 1.2.32 released.

Mixer2 1.2.32 リリースしました。mixer2.org

  • タグのremove機能(プルリク感謝)。これはid属性等が無いタグであってもきれいに消しちゃう機能です。いままでそういう削除機能がなかったということではないのですが。(表現が難しいな...)
  • SpringMVC用のビューリゾルバクラスに、ビュー名に合わせたビュークラスが存在しない場合に例外発生させる/させないの設定オプションを追加しました。

なお、mixer2は独立したxhtml専用のテンプレートエンジンであって、SpringMVCとの組み合わせ専用ということは無いです。念のため。

Saturday, May 24, 2014

あなたのapacheのBasic認証をgoogle 2段階認証に対応させるには

Googleの2要素認証ですが、数年前のリリース以来、少しずつ普及しているようです。

ただ、googleのサービス=例えばgmailとか=でしか使えないし、あるいは自分のwebサービスに導入するにはgoogle様に何らかのお布施をしなければならないんでしょ...と思っているあなた! それは単なる思い込みや誤解です。

目標

  1. 自分が管理するapache上のコンテンツの一部に認証をかけたいとして、
  2. ユーザー名がfooでパスワードがbarだとする。
  3. 導入が比較的お手軽なBasic認証ですませたい。
  4. ただしgoogle2要素認証も使う。スマホのアプリでワンタイムパスワード(以下OTP)を受け取るやつ。
  5. ブラウザ上に出現するbasic認証のダイアログには、アカウントとしてfoo、パスワードとしてbar+OTPを入力する。例えばOTPが123456であればパスワードとして"bar123456"で認証できるようにする

用意するもの

  • linuxマシン。以下の例ではOracleVirtualBox+Vagrantで構築したCentOS6.5を使用(もっと古いディストリでも大丈夫)
  • スマートフォン。android,iphoneどっちでも。

手順

まず、スマホにGoogle認証アプリをインストールしておく。androidならplayストア、iphoneならitunesで「Google認証」で検索すればすぐ見つかります。 既にインストール済みの人はそれをそのまま使えます。

次に、サーバにhttpdやgoogle-authenticatorなどをインストールします。いずれもyumで可能です。ただしgoogle-authenticatorのパッケージはepelリポジトリにしか無いので注意。あとhttpd-develやgccなんかも必要です。

[vagrant@localhost ~]$ cat /etc/redhat-release 
CentOS release 6.5 (Final)
[vagrant@localhost ~]$ sudo yum install http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
[vagrant@localhost ~]$ sudo yum install httpd httpd-devel subversion google-authenticator
[vagrant@localhost ~]$ sudo /etc/init.d/httpd start

この時点で普通にapacheが起動できるはずです。ブラウザでアクセスして確認しておきましょう。iptablesとかは適宜設定しておくか、切っておきましょう。

なお、サーバの時計をできるだけ正確に合わせておいてください。google認証はシークレットキーと時刻情報からワンタイムパスワードを割り出すので、 スマホ側とサーバ側とで時計が狂いすぎているとうまく認証できません。

さてここでgoogle-authenticator-apache-moduleの登場です。 コンパイル済みのバイナリもダウンロードできますが、 それは古くてOTPだけの認証しかできない(2要素認証になってない)バージョンなので、 最新ソースをcheckoutして自分でビルドします。 同梱の設定ファイルのコピーも忘れずに。

$ svn checkout http://google-authenticator-apache-module.googlecode.com/svn/trunk/ google-authenticator-apache-module-read-only
$ cd google-authenticator-apache-module-read-only
$ make
$ sudo make install
$ sudo cp googleauth.conf /etc/httpd/conf.d/

$ sudo vi /etc/httpd/conf.d/googleauth.conf で下記のように編集。(Alias /tmp /tmp を追加しただけ)

Loadmodule authn_google_module modules/mod_authn_google.so
Alias /tmp /tmp
<Directory /tmp>
    Options FollowSymLinks Indexes ExecCGI
    AllowOverride All
    Order deny,allow
    Allow from all
    AuthType Basic
    AuthName "My Test"
    AuthBasicProvider "google_authenticator"
    Require valid-user
    GoogleAuthUserPath ga_auth
    GoogleAuthCookieLife 3600
    GoogleAuthEntryWindow 2
</Directory>

次に、ユーザー"foo"用の認証設定ファイルの準備。 最初のほうでインストールしたgoogle-authenticatorコマンドを使います。

[vagrant@localhost ~]$ google-authenticator
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/vagrant@localhost.localdomain%3Fsecret%3DOVLUR4T2XXXXXXXX
Your new secret key is: OVLUR4T2XXXXXXXX
Your verification code is 995999
Your emergency scratch codes are:
  39831342
  73015310
  75610143
  61758264
  10475486

Do you want me to update your "~/.google_authenticator" file (y/n) y

Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) y

By default, tokens are good for 30 seconds and in order to compensate for
possible time-skew between the client and the server, we allow an extra
token before and after the current time. If you experience problems with poor
time synchronization, you can increase the window from its default
size of 1:30min to about 4min. Do you want to do so (y/n) y

If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n) y
[vagrant@localhost ~]$ 

何やら楽しそうなURLが表示されました。urlをブラウザにコピペして開いてみましょう。 QRコードが表示されるはずです。 スマホのGoogle認証アプリを起動し、右上のメニューから「アカウントを設定」→「バーコードをスキャン」でブラウザに映っているQRコードを読み取ります。 出力されているsecret keyとverification codeを手作業でスマホに入力する方法でももちろんOKですが、面倒です。

スマホのアプリ画面は次のようになるはずです。赤枠の部分が今回の作業で追加した認証トークンになります。

これでスマホのGoogle認証アプリの準備はできました。サーバ側の設定作業に戻ります。

さきほどのgoogle-authenticatorコマンドの出力結果が ~/.google_authenticator に保存されています。 それを一部コピペ&編集してapacheのユーザー認証設定として使います。

[vagrant@localhost ~]$ cat ~/.google_authenticator 
OVLUR4XXXXXXXXXX
" RATE_LIMIT 3 30
" WINDOW_SIZE 17
" DISALLOW_REUSE
" TOTP_AUTH
39831342
73015310
75610143
61758264
10475486

この内容を少し改変して、/etc/httpd/ga_auth/[ユーザー名] というファイルに格納します。ここではfooというユーザーにしますので、下のような感じ。

[vagrant@localhost ~]$ sudo mkdir /etc/httpd/ga_auth
[vagrant@localhost ~]$ sudo vi /etc/httpd/ga_auth/foo

最終的にこんな結果になるように編集しておき、apacheを再起動したら作業完了です!

[vagrant@localhost ~]$ cat /etc/httpd/ga_auth/foo
OVLUR4XXXXXXXXXX
" RATE_LIMIT 3 30
" WINDOW_SIZE 17
" TOTP_AUTH
" PASSWORD=bar

[vagrant@localhost ~]$ sudo /etc/init.d/httpd restart

PASSWORD=bar というところがポイントです。好きなようにパスワードを決めて書いておいてください。これが2要素認証のうちの第1要素にあたります。

いよいよブラウザでapacheにアクセスしてみましょう。/tmpというURIをファイルシステムの/tmpにAliasし、そこだけ2要素認証がかかるようにしたので、 http://サーバのip/tmp というurlにアクセスします。

いつものBasic認証ダイアログが出現します。ここでユーザー名はfoo、そしてパスワードの欄は bar + ワンタイムパスワードです。 上の画像で言えば、379076を示しているので、ダイアログのパスワードには bar379076 を入力します。/tmp の配下のファイル一覧が見えれば成功です。

補足

本家のwikiに書いてある通り、できればSSLも使うべきです。 そうすればBasic認証のリクエストヘッダも暗号化通信の対象となるため安心です。あと、Basic認証ではなくDigest認証もできるようですね。ためしてないけど。

それから、お気づきの通り、google-authenticatorコマンドはシークレットキーとともにいくつかの緊急用コードも出力してくれます。これはスマホを盗難、紛失、破損などしてOTPを得られなくなってしまった場合に備えての緊急用です。が、google-authenticator-apache-moduleはこれには対応してないようです(詳しく調べてません)。ソースほじろうかと思いましたが疲れたんでこのへんで。

Webの安全のために手をつくしてくれているGoogle先生とプログラマー諸氏に感謝!

Tuesday, May 6, 2014

spring-bootと組み込みTomcatが便利すぎて鼻血でそう

Tomcat embeded - 組み込み型Tomcat - が正式にサポートされたのは2011年5月のTomcat7.0.14の前後あたりのようです。もう3年も前です。 一方で2014年4月、Spring frameworkはSpring Boot 1.0.0を正式にリリースしました。

この二つのニュースを別個に見ると「ふーん」としか思えません。時間軸もズレすぎですし。 しかし、最近、某所でSpring-Bootとtomcat-embededを組み合わせて使ってみたら、便利すぎて鼻血出そうになりました。

便利さがうまく伝わるかどうかわかりませんが、せめてメンテついでにMixer2のサンプルアプリで使ってみるか、と思いまして、 mixer2-fruitshop-springbootを作りました。 動かし方はこちらのページとほぼ同じ。

SpringFrameworkと組み込み型Servletコンテナをうまいこと組み合わせてくれる、という機能はspring-bootの数多くの機能のうちのひとつにすぎませんが、 とにかくここでは組み込みTomcatとの連携機能の話だけにします。

とりあえずmixer2-fruitshop-springbootをざっくりご覧いただきつつ ポイントを挙げます。

  • src/main/webapp/WEB-INF/web.xml のようなフォルダやxml設定ファイルはもはや存在しません。こうした旧来型のWebアプリケーションとしての構造は分業開発の妨げになりやすいのですが、これは普通の単純なjavaライブラリとまったく同じ構造です。もちろんこれは、Servlet3.0準拠であることや、あるいは、ビューエンジンとしてjspではなくMixer2を使っているおかげでビューのテンプレートをwebappとかWEB-INFとかそういうところに置く必要が無い、ということによる効果でもあります。
  • pom.xmlのbuildタグ周辺を見てください。実質的にはmaven-jar-pluginとmaven-dependency-pluginが使われているだけです。特別なビルド方式は必要ありません。spring-bootにはmaven用のプラグインもあれこれ用意されているのですが、ビルド方式までもが特定のフレームワーク提供のプラグインに縛られるのは個人的には好みではないのでこの方法を採用しました。これにあとmaven-assembly-pluginを追加して、アプリ本体のjarとlibフォルダ配下に集められるjarをまとめてzip化するようなセッティングをすれば、リリース成果物の生成も簡単です。
  • pom.xmlのpackaging指定はwarではなくjarです。このwebアプリケーションはmvn packageするとjarファイルになります。いわゆるfat-jarではなく純粋なjarです。tomcat-embeded-x.y.z.jar等の組み込みtomcatライブラリの助けを得ながらwebアプリケーションとして起動します。コマンドラインで言えば java -jar mixer2-fruitshop-springboot-1.0-SNAPSHOT.jar -classpath "lib/*" で起動できます。
  • サンプルアプリではServerクラスにmain()メソッドを置いてあります。eclipse等での開発作業中はこのserverクラスを通常のjavaアプリとして起動し、ブラウザで8080ポートを見て動作確認をします。繰り返しますがwebアプリではあるものの構造上は単なるjavaアプリなので、eclipseでWTPのようなプラグインは必要ありません。tomcatも別途用意する必要がありません。だって組み込みtomcatだから。ただのjavaアプリだから。
  • tomcatのcontext.xmlやwebアプリとしてのWEB-INF/web.xmlにあたるものは全てjavaコードとして記述します。サンプルアプリではMvcConfigurationSessionTrackingConfigListenerにあたります。もちろんここのコード上で設定されている値はspringの種々の機能を使えば、他の設定ファイルやコマンドライン引数等で外側から上書きすることが可能となります。Springのprofile機能も使いこなせるでしょう。

こんな話だけでは便利さが伝わらないかもしれません。とにかくこれはちょっとしたパラダイムシフトですね。 これからは、「tomcatを用意してそこにSpringMVCによるwebアプリケーション(*.warファイル)をdeployする」のではなくて、 「webアプリケーションとtomcatをSpringFramework上で起動する」という感覚になります。もう、webアプリとtomcatを別々に用意する必要はないのです。これらは、ひとつです。

Sunday, April 6, 2014

第5回 #渋谷java でトークしてきた

今日はこんなイベントに参加してきました。

第五.五回 #渋谷java - connpass

javaに関することなら何でもありのゆるふわjava LTイベントです。

参加される方はSIerの方や自社プロダクト開発の方やフリーランスの方など様々です。 LTの内容は初心者向け〜ガチ勢向けまで幅広く実施して頂いておりますので初心者の方もモヒカンの方お気軽にどうぞ!

2月にやるはずだったのが大雪のため4月に延期になったやつです。 私はセッション枠で20分ほどしゃべらせていただきました。資料がこちら。

その場でJenkinsを「ポチっとな」してMixer2のビルドとセントラルリポジトリへのデプロイ作業を生実演でお見せするという試みがけっこうウケたようで、うれしかったです。 ついでなのでプレゼンで語りきれなかったことを少し書きます。

perlならcpan, PHPならPEARやPECL, rubyならrubygems そしてJavaならmavenセントラルリポジトリのように、近代的なプログラミング言語のほとんどが、 パッケージリポジトリ=コンパイル済みで即利用可能な状態のライブラリの集積所=と、それをうまく使いこなすためのコマンド機構を持っています。

mavenはビルドツールではありますが、そのキモはmavenセントラルリポジトリとの自動的な連携にあります。これはGradleでもAnt+Ivyでも同じことが言えます。 java以外の言語でも似たようなものです。 だからこそ、現代のプログラマーはパッケージリポジトリのことをもっと意識しそこに貢献すべきです。今日のトークの動機はそこにあります。 ソーシャルコーディングに必要なのはGitHubだけではないのです。

mavenセントラルリポジトリにライブラリをupする権限を得るには審査が必要だという話をしましたが、 それはあくまで形式的なものです。 たとえばgroupIdが他とバッテイングしてないかとか、pomの書き方ちゃんとわかっていそうかとか、 MITかGPLかApache2かライセンスをちゃんと表示しているかとか、 なにかの商標にひっかかってなさそうかとか。。。 逆に言うと「おまえの作ったjavaライブラリはmavenセントラルに入れてもいいほどすっげえ便利かどうか」ということは考慮されません。 それはsonatype.orgの中の人が決めることではなく、全世界のjavaユーザーが決めることだからです。

門戸は開かれています。さあ、あなたもこれで、javaのOSSライブラリ開発者!

なお、他の方のトークで個人的に面白かったのがこちら。

@テスト
public void 文字列マッチャーのテスト() {
    文字列("テストなんとか", は("テスト".で始まる()));
}

っておいなんだこれw

最後になりましたが、運営の@seri_kさんほか会場設営などやってくださっているビズリーチ社の関係者の方々に感謝します。私も結構ガチで転職を考えております。w

参考リンク: 第五.五回 #渋谷java - Togetterまとめ

Tuesday, January 28, 2014

Mixer2でページのヘッダとフッタを挿入する方法

「Mixer2でビューを作るとき、いろんなページで共通のヘッダやフッタ部分を挿入するのってどうやるのだろう?」 よくあるケースです。JSPで言えば <jsp:include page="header.jsp"> にしておきつつ、 header.jspファイル内には <div id="header">ヘッダーのなか</div> のように書いておくやつ。

しかし、JSP的なやり方だと、ヘッダはヘッダ、フッタはフッタ、のようにバラバラになってしまい、 webデザイナーの立場からするとメンテが面倒なうえに実際の見栄えの確認がしづらくなってしまいます。 Mixer2ではいろいろなやり方がありますが、わかりやすくかつ手っ取り早いのが、パーツ取り用htmlテンプレート作戦です。

まず、通常の画面表示用テンプレートの他に、 parts.html のような名前でパーツ取り専用テンプレートを用意し、そこにヘッダとフッタのブロックを自由に書きます。

 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
    <meta charset="utf-8" />
 </head>
 <body>
 <div id="header">
  実際にヘッダにしたい内容
 </div>
 これはパーツ取り専用htmlなので実際には出力しませんよ
 <div id="footer">
  フッタにしたい内容
 </div>
 </body>
 </html>

次に実際に画面に出すテンプレートファイル(fooTemplate.htmlだとします)には次のように書いておきます。

 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
    <meta charset="utf-8" />
 </head>
 <body>
 <div id="header">
  ここにヘッダがはいる予定です
 </div>
  実際に出力したいコンテンツ...
 <div id="footer">
  ここにフッターがはいる予定
 </div>
 </body>
 </html>

画面出力のviewクラスはこんな感じ。(あくまでも模式的な例です)

Html partsHtml = mixer2Engine.loadHtmlTemplate("parts.html");
Div headerDiv = partsHtml.getById("header",Div.class).copy(Div.class);
Div footerDiv = partsHtml.getById("footer",Div.class).copy(Div.class);
Html fooHtml = mixer2Engine.loadHtmlTemplate("fooTemplate.html");
fooHtml.getBody().replaceById("header", headerDiv);
fooHtml.getBody().replaceById("footer", footerDiv);

実際には、テンプレートのロードを何度もやるのはやや非効率です。 共通クラスを切り出して、そこでparts.htmlのロードを一回だけ行ってheader/footer用Divインスタンスの copy()の結果を返させて、それを使うような感じがよいでしょう。

「fooTemplate.html上に <div id="header">ここにヘッダが入る</div> みたいなことを書く手間すら省きたい」という要求も実現可能です。

Html partsHtml = mixer2Engine.loadHtmlTemplate("parts.html");
Div headerDiv = partsHtml.getById("header",Div.class).copy(Div.class);
Div footerDiv = partsHtml.getById("footer",Div.class).copy(Div.class);
Html fooHtml = mixer2Engine.loadHtmlTemplate("fooTemplate.html");
// bodyタグの先頭にヘッダdivを差し込む
fooHtml.getBody().getContent().add(0, headerDiv);
// bodyタグの最後にフッタ用divを差し込む
fooHtml.getBody().getContent().add(footerDiv);

こんな感じ。

いかがでしょう。Mixer2でのビュー実装の書き方は様々です。 jspのカスタムタグではなく通常のjavaで書くので柔軟性とテストの書きやすさは段違い、というのがポイントです。 要件に合わせてご自由にどうぞ。

Thursday, January 9, 2014

Java5で動くMixer2をリリースしました(あくまで実験的)

Java5がリリースされたのは2004年10月。そして今はもう2014年です。もうすぐJava8も出ます。 そんな時期にMixer2をjava5でも動かせるようにするってそれ誰得?ww というツッコミもけっこうありました。(※Mixer2は本来はJava6以上が動作条件です)

しかし、世の中にはレガシーなシステムなんていくらでもあるようです。詳しくは言えませんが、 Java1.4(5ですらない!)で現役で稼働しているシステムが存在し今もチビチビ改修していると言う話を、つい先日まのあたりにしました。 Javaから離れてしまいますが、全日空の国内線旅客システムが実はつい最近まで Fortran(COBOLですらない!)で動いていたというニュースもありましたね。

さて、話をMixer2に戻しましょう。 Mixer2はJavaのJAXB-APIを使ってXHTMLを入出力しています。JAXBはJava6以降でJDK/JREに標準搭載となったため、 本来、Java5では動きません。

ただ、jaxbはもともと独立したライブラリとしてSunの社内で開発が続き、のちにJava6で初めて実行環境に標準搭載されたという経緯があります。 これはjaxbに限ったことではなく他のapiでも似たような流れをたどることがあります。

ということは、jaxbやその関連の、既に公開されているライブラリを、 Mixer2が依存ライブラリとして使用するようにすればJava5でも動くということになります。 そう、実はそれほど遠い道のりではないのです。実際1日2日でできちゃったし。

そんなこんなでとにかく、mixer2-java5 version 0.1.2 をリリースしました。

使い方は本家Mixer2とまったく変わりありません。ただし、以下の点にご注意ください。

  • あくまで実験的なものですので、サポートやバージョンアップはそれほど期待しないでください。
  • SpringMVC関連機能は削り落としてあります。純粋にテンプレートエンジン機能のみです。