finally節の中でtry/catch

Streamなどを使ったら、finally節でcloseする。これお作法。などと言われますが、
finally節の中でtry/catchするのは、どうにも美しく無いように感じてしまいます。

	public static void main( String[] args ){
		BufferedReader br = null;
		try{
			br...
		}catch( IOException e ){
			e.printStackTrace();
		}finally{
			try{
				if( null != br ){
					br.close();
				}
			}catch( IOException e ){
				e.printStackTrace();
			}
		}
	}

ならば、こう書く。

	}finally{
		IOUtils.closeQuietly( br );
	}

commons-ioが必要です。

ActionScriptのオーバーロード

GAE/JとFlex3ともに鼻が利くようになって来たため、ここのところ順調に開発が進んでいます。(もはやFlexはhtmlより手に馴染んでいる気がします)
設計から実装に落とす際にハマったのがオーバーロード

どうにもコンパイルエラーが消えないので、よくよく調べてみるとActionScriptではオーバーロードがサポートされていないようです。
もちろん無ければ無いで、容易に次善策が見つかる機能では有るのですが、コンストラクタのオーバーロードが出来ないのは、
少し設計にインパクトが発生してしまいました。

この開発が一段落したら、基本文法からおさらいしようと考えています。

Google App Engine/J 開発サーバ用管理コンソール

Google App Engineでは本番サーバにアップロードせずとも、Eclipseプラグインとして提供されている開発サーバ上で、
たいていの処理を確認することが出来るわけですが、本番サーバで提供されている管理コンソールが無いところを不便に感じていました。

しかし、機能は落ちますがDBのViewerは提供されていたようです。
http://localhost:8080/_ah/admin/datastore

↓で他の管理機能にもアクセスできそうな記述をあちこちで見かけるのですが、私の環境だと404 Not Foundとなります。(私だけ??)
http://localhost:8080/_ah/admin/

Google App Engine/J上でBlazeDSを用いたFlexアプリケーションを動かす

GAE/Jについて一通りの動作確認が終わったため、当面対応が必要となるプロダクトに着手しました。

ポイントはユーザインタフェースとしてFlash(開発はFlexにて)を使用するところで、通信手段はAMF(BlazeDS)を使用します。
管理系機能やデバッグ用にhtmlのユーザインターフェースも併用する形を考えています。

当初考えていた技術要素は以下の通りです。

どれも外せない要素なので、かなり時間をかけて調査しましたが最終的にはMayaaだけは諦めました。

簡単にそれぞれについての調査結果やハマリポイントをまとめます。

Slim3
ひがさんのblogにも有る通り、Slim3のデモで用意されているサンプルはAMFではなくシンプルなHTTP通信のものです。
今回のプロダクトではAMFの重要性が高い上に、Slim3のタイプセーフクエリの恩恵にも与りたいためSlim3+AMFの動作を検証する必要が有りました。
○検証結果
BlazeDSのソースを修正するところは非情に面倒でしたが、結果的にSlim3側はほとんど何もせずに期待動作の確認が取れました。
○その他
普段はMayaaと連携させているため気付かなかったのですが、slim3it(サンプルプロジェクト)でもJSPはwar直下に配置されていることに気付きました。
出来ればwar/WEB-INF/view 以下に配置する構成にしたいのですが、SAStrutsのようにweb.xmlに指定するなどの方法で指定できないか考えてみたいと思っています。

    <context-param>
        <param-name>sastruts.VIEW_PREFIX</param-name>
        <param-value>/WEB-INF/view</param-value>
    </context-param>

BlazeDS
GAE/J環境ではRemotingしか動作しない上、BlazeDSのソースを修正する必要が有るという情報が幾つか見つかりました。

試しに素のBlazeDSを用いて確認してみましたが、やはり期待動作が確認出来ないため、上記手順に沿ってBlazeDSの修正版バイナリを得ました。
○検証結果
まだStringが戻り値の公開メソッドしか試していませんが問題なく動作しているようです。
○その他
DuplicateSessionDetected例外への対処が少し強引な気がしています。

Mayaa
○検証結果
http://d.hatena.ne.jp/two-stroke/20090627/1246094807
↑とおそらく同件と思われるのですがMayaaを組み込むと、どうしてもリクエストしたパスに「/index.html」を付けて処理される問題が発生します。
これまではEclipse上からのローカル実行でのみ発生していたのですが、何故か今回の構成に組み込んだ場合、GAE本番環境でも再現するようです。
大部分がFlashで構築されており、この問題は以前も追いかけて解決に至らなかったため、今回の構成からMayaaを外すことにしました。

■まとめ
BlazeDSのソース修正さえ実施すれば、とくに問題なく使用可能です。
先人達の有益な情報に感謝します。

Shellで終了コード取得

Shellからプログラムを実行し、その終了コードを表示したい場合、
使用するShellにより、終了コードを格納している変数名が異なることが分かったのでメモ。

■sh/bash

echo $?

csh/tcsh

echo $status

unsigned char型の変数らしく、終了コードが255以内の場合にしか使えないようです。

Google App Engine/J 一里塚到達

設定していた最初の目標点に先ほど到達し、GAEを用いた開発の雰囲気を有る程度掴むことが出来ました。

Google App Engine(J)が公開されるまでは、SAStruts + S2JDBC + Mayaaという構成で開発を進めて来ました。
S2JDBC-Genも含め、本当に「さくさく感」を体感できる完成度の高いフレームワークだと現在も変わらず考えています。

ここのところGAEへの取り組みに注力しており、こちらはSlim3 + Mayaaという構成で進めています。

GAEへの移行には、JDBCからJDOというインパクトの大きい変更が有るわけですが、
Slim3SAStrutsS2JDBCと同じく、ひがさんが開発されているため、新しいプロダクトで有りながら、これまでの経験を生かしつつ進めることが出来ています。
HotReloadingという大きなメリットの他にも、S2JDBCの「流れるようなインターフェース」「タイプセーフクエリ」の信奉者としては、Slim3でJDOを同じように扱えることが大きな救いです。

現時点で感じていることをまとめます。

  • 本番環境へのDeployに対する負荷が限りなく低くなったため、常に本番環境で動かせるのは大きな安心感を生む。
  • (SA)StrutsからSlim3への移行は思ったよりもずっと楽だった。
  • MayaaがGAE対応されていて非常に助かった。
  • Eclipseプラグイン上(=ローカル環境)と、GAE上(=本番環境)で動作が異なることが結構有る。
  • RDBMSBigTableパラダイムシフトの完全な消化には、まだまだ時間がかかりそう。
  • GAEは開発者を夢中にさせる魅力を確実に持っている。

そして、publicプロパティに慣れすぎてアクセッサを用意することが、意外に大きなストレスになっていることに自分でも驚いています。

GAE環境のMayaaではが使えない?

GAE環境で、Slim3 + Mayaaを用いて開発しています。

.mayaaでループ処理を記述するため、を用いたのですが、
Eclipse環境(=ローカル)では、期待動作するものの、GAE環境にDeployするとエラー画面に遷移し、かつログも出力されません。

試しにを用いたところ期待動作が確認出来ました。
#他の系taglibは、まだ試していません。

<!-- コレだと期待動作が得られる -->
	<m:forEach m:id="loop" items="${memberList}" var="member" replace="true" />

<!-- コレではエラーになってしまう
	<c:forEach m:id="loop" var="member"
		items="${memberList}" replace="true" />
-->