アジャイルWebアプリケーション開発からクラウドまで Project (Zero/WebSphere sMash最新情報) 1 by 樽澤 広亨 / 須江 信洋
画像共有サイトなどを構築する場合、ファイルアップロード処理が必要になります。
sMashはファイルアップロード処理も容易に実装することができるのですが、ドキュメントにあまり詳しい記述がないようなので、簡単にまとめておきます。
Forumを検索すると、以下のスレッドがヒットします。
https://www.projectzero.org/forum/viewtopic.php?f=4&t=984&p=4125
どうやら、普通にmultipart/form-dataでPOSTすれば、勝手にmultipartがdecodeされ、ファイル実体への参照はグローバルコンテキスト(/request/files)に格納されるようです。
HTMLの方はこんな感じ。
[public/testUpload.gt]
<html>
<head>
<style type=”text/css”>
@import “<%= getRelativeUri(”/dijit/themes/tundra/tundra.css”) %>”;
</style>
<script type=”text/javascript”
src=”<%= getRelativeUri(”/dojo/dojo.js”) %>”
djConfig=”parseOnLoad: true”></script>
<script type=”text/javascript”>
dojo.require(”dijit.form.Form”);
dojo.require(”dijit.form.TextBox”);
dojo.require(”dijit.form.Button”);
</script>
</head>
<body class=”tundra”>
<form dojoType=”dijit.form.Form” id=”myForm” name=”myform1″
encType=”multipart/form-data” action=”testUpload.groovy” method=”POST” onSubmit=””>
<input dojoType=”dijit.form.TextBox” name=”file1″ type=”file”><br/>
<input dojoType=”dijit.form.TextBox” name=”file1″ type=”file”><br/>
<input dojoType=”dijit.form.TextBox” name=”file1″ type=”file”><br/>
<button dojoType=”dijit.form.Button” type=”submit”>送信</button>
</form>
</body>
</html>
サーバー側のコードはこんな感じです。
[public/testUpload.groovy]
def onPOST() {
def files = request.files
def filelist = files['file1']
logger.INFO{ “Uploaded Files: ” + filelist.size().toString() }
logger.INFO{ “Information: ${filelist.toString()}” }
filelist.each{ file ->
def src = new File(file['path'])
new File(”${config.root[]}/tmp/${file['filename']}”).withOutputStream{ out ->
src.eachByte{ out.write(it) [...]
CodeZineで「はじめて使うProject Zero」という記事が公開されました。
Project Zeroのインストールから、Webベースの開発ツール(Application Builder)でRESTサービスやサーバーサイドマッシュアップを作成するところまで、一通りの流れを説明してあります。これを機会に、ぜひProject Zeroを試してみて下さい。
DB2にはpureXMLという機能があります。
この機能を利用すると、XML(もしくはXMLのフラグメント)をテーブルの1カラムに格納することができるため、部分的に非定型なデータを効率よく扱うことができます。また、XML列に対してはXPathやXQueryによる検索も可能なため、XMLの良さとRDBの良さを組み合わせて利用することができるのも良い点のひとつです。
ただ、sMashのData Access API(zero.data)からpureXMLを利用する場合、残念ながら標準で用意されているResultHandlerではXML列を素直に取りだすことができません。そこで、こちらを参考に、XML列をStringとして取り出すCustom Handlerを作成してみました。
package handler;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import zero.data.Manager;
import com.ibm.pdq.runtime.handlers.RowHandler;
import com.ibm.db2.jcc.DB2Xml;
public class XmlRowHandler implements RowHandler<Map<String, Object>> {
public Map<String, Object> handle(ResultSet resultSet, Map<String, Object> obj)
throws SQLException {
if (obj == null) {
obj = new HashMap<String, Object>();
}
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
int numColumns = resultSetMetaData.getColumnCount();
for (int i=1; i<=numColumns; i++) {
Object column = resultSet.getObject(i);
if(column instanceof DB2Xml){
obj.put(resultSetMetaData.getColumnName(i).toLowerCase(),
((DB2Xml)column).getString() );
} else {
obj.put(resultSetMetaData.getColumnName(i).toLowerCase(), [...]
Project Zeroの開発ロードマップ、実はこちらで公開されていることはご存じでしたでしょうか?
http://www.projectzero.org/wiki/Development/DevRoadmap
Le Mans Sprint S2では、”Story”という単位でアジャイル開発が行われているようです。
Storyの管理にはJazz(Rational Team Concert)が使われているようですね。(Jazzは、Project Zeroと同じく、オープンな開発体制で商用ウェアを開発するという試みです。興味のある方はこちらをご参照ください。)
【製品の詳しい解説】
- アナウンスメントワークショップ資料(社外公開、PDF)
http://www-06.ibm.com/jp/domino01/mkt/websphere.nsf/doc/002760F2
【チュートリアル&解説】
- developerWorks Japan > Project Zero 関連リンク集
http://www.ibm.com/developerworks/jp/offers/projectzero/
【sMashポータルサイト】
- WebSphere sMashマイクロ・サイト(日本語)
http://www-06.ibm.com/jp/software/websphere/smash/index.html
【Project Zero プロジェクトWebサイト】
- Project Zeroメイン・ページ(英語)
http://www.projectzero.org/
【ドキュメント】
- WebSphere sMash InfoCenter (日本語)
http://publib.boulder.ibm.com/infocenter/wsmashin/v1r0/index.jsp
- WebSphere sMash Getting Started (英語)
http://www.projectzero.org/zero/silverstone/latest/docs/zero.gettingstarted.doc/
- WebSphere sMash 開発者ガイド (英語)
http://www.projectzero.org/sMash/1.0.x/docs/zero.devguide.doc/
【コミュニティ】
- Project Zero フォーラム(日本語)
http://www.projectzero.org/forum/viewforum.php?f=7
- Project Zero 日本語Blog
http://www.projectzero.org/jblog/
REST形式のサービスではレスポンスをXMLで返すものが多く、サーバーサイドマッシュアップを行う際にはXMLの解析が不可避です。
Javaと比べ、GroovyはXMLの取り扱いが容易なのが特徴です。
Javaでは、XMLをパースするだけでも
DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance()
DocumentBuilder builder = fac.newDocumentBuilder()
Document doc = builder.parse(new FileInputStream(’hoge.xml’))
のような手順を踏む必要があります。(parse()メソッドの入力がInputStreamなのも微妙に不便なところです。)さらにXMLからデータを取り出すためには、DOMのAPIを利用した煩雑なコーディングが必要です。
Groovyでは、XMLのパースは、
def hoge = new XmlParser().parse(new File(’hoge.xml’))
のように、たった1行で終了です。さらに、ここからデータを取り出す処理も、
def element = hoge.fuga
def elementName = hoge.fuga.name()
def attribute = hoge.fuga.’@attr’
のように、通常のオブジェクトツリーをたどるのと同様にコーディングできます。
GroovyによるXML処理のコツについては、引き続きこのBlogでご紹介していくつもりですが、今すぐ詳細を知りたい方はこちらをご参照下さい。
Web:Groovy ドキュメント
http://groovy.codehaus.org/Processing+XML
書籍:「Groovy イン・アクション」
http://www.amazon.co.jp/Groovy%E3%82%A4%E3%83%B3%E3%83%BB%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3-Dierk-Konig/dp/4839927278
WebSphere sMashの特徴の一つとして、スクリプト言語で手軽にアプリケーションが開発できることがあります。
サポートされているスクリプト言語はGroovyとPHPですが、Groovyの文法はほぼJavaと同じですので、Javaの経験者であればGroovyの方がとっつきやすいと思います。とはいえ、Groovy自体はまだ日本語の情報が少なく、具体的なコーディングに取り掛かってみると「xxをするにはどうコーディングしたらいいのだろうか?」と悩むことが多いと思います。そこで、このBlogでは「Groovyでいこう」カテゴリーで、Groovyに関する情報をご紹介しようと思います。
まず手始めとして、Groovyスクリプトを実行できる環境を構築しておきましょう。GroovyのランタイムはWebSphere sMash(ProjectZero)にも含まれていますが、コマンドラインからスクリプトの動作確認を行ったりするためには、単体のGroovyを別途導入しておくと便利です。
Groovyはオープンソースソフトウェアであり、プロジェクトのWebサイトは http://groovy.codehaus.org/です。
インストール手順は以下のようになります:
JDK1.5以上を導入しておく。GroovyはJavaベースで動作しますので、JDKの稼動環境が必要です。
http://groovy.codehaus.org/Download から、 Binary Releaseをダウンロードする。2008/7/30時点での最新の安定版はGroovy-1.5.6です。
ダウンロードしたアーカイブを適当なディレクトリに展開する。私は、c:\groovy\groovy-1.5.6 のように、<Groovy全体のホーム>/<Groovyバージョン別のホーム>というディレクトリ構造にしています。
環境変数 GROOVY_HOME に、Groovyのルートディレクトリを設定する。OSによって設定方法は異なりますが、WindowsXPであれば「マイコンピュータ右クリック」-「プロパティ」-「詳細設定」-「環境変数」から、システム環境変数を新規作成します。先ほどの例では、GROOVY_HOME=c:\groovy\groovy-1.5.6 となります。
環境変数 PATH に、%GROOVY_HOME%\bin を追加する
以上で、インストールは完了です。
では早速、Groovyを実行してみましょう。コマンドプロンプト(シェル)を起動して、”groovy -v”を実行してみて下さい。”Groovy Version: 1.5.6″のようにバージョンが表示されれば、インストールは成功です。うまく動作しない場合は、JAVA_HOMEやPATH、GROOVY_HOMEなどの設定が正しいかどうか確認してみてください。
次に、Groovyスクリプト を試すのに便利な「Groovy Console」をご紹介します。Groovy Consoleは、GroovyのSwingBuilderを利用して作られた対話型シェルです。コマンドプロンプト(シェル)から、”groovyConsole”を実行してみてください。次のようなアプリケーションが起動します。
コード入力ペイン(上半分)にGroovyコードを入力し、メニューから「Script->Run」、ないしはCtrl+Rキーでコードを実行できます。実行結果は結果ペイン(下半分)に出力されます。
この例では、Groovyのリストリテラル利用してStringのリストを定義し、リストのsort()メソッドでソートを実行しています。Groovyスクリプトでは、最後の式の評価結果がスクリプトのリターン値になるため、ここではResultとしてソート済みのリストが得られています。
Groovyスクリプトを実行する方法としては、Groovy Console以外にも、groovyコマンドやgroovyshコマンドなども利用可能です。sMashでのGroovyコーディングに悩んだら、まずGroovyスクリプト単体で期待通りに動作するかどうかをこまめに確認することをお勧めします。
