| リンク: | Seasar Projectグループ | アンテナ依存症 | アンテナ依存同盟 | 
| カテゴリ: | Java | Eclipse | EclipseRCP | Flash | Flex | Seasar2 | S2OpenAMF | OpenAMF | Struts | 
| ColdFusion | HTML | ネタ | 妄想 | GAME | ポエム | 独り言 | Life | ETC | 
ここはほその日記です。Orkutのプロフィールはこちら。
アンテナ依存症加速装置 for Eclipse Plugin<開発着手中!そのうちα版リリース予定
2004-09-18 age++;
■ [Life] 21日まで不在になります
インターネットから切り離され、パソコンからも切り離されます。仕事について何かある方は直接電話ください。山に篭ってケータイもつながらなかったらごめんなさいm(__)m
■ [妄想] まいべすとぷらくてぃす
#書いてる事がわけわかめだったので、ツッコミ不用です(^^;結果を待ってくださーい!
作ると自分が楽をできて、みんな幸せ計画。広く一般的に言うベストプラクティスじゃなくて、自分とその周り専用に特化したベストプラクティスです。どんなもんかを簡単に説明すると実装からボトムアップで必要な情報を洗い出し、トップダウンで設計し、人海戦術に持ち込む。最初から最後の落とし所を見つめている。というより、最後の落とし所は用意されているドキュメントの空欄が埋まる事。つまり初めから必要な情報を記入するためのテンプレートがある。そのドキュメントは工程を追うごとに追記されていき、最初から全部埋められるものではない。徐々に埋まっていくもの。実装を始める前に最終形態のドキュメントからソースコードの雛形が生成される。サーバサイドのビジネスロジックを記述するためのメソッドを通過する画面遷移が可能な状態の雛形。ここまで落とし込んだら後は人海戦術に持ち込む。プログラマはビジネスロジックに専念する事ができる。
これは複雑な処理があるプロジェクトには適用できない。マスタメンテナンスが大量にあるようなプロジェクトのみ有効。ユースケースをグルーピングして、同じような機能を大量に抽出できる時に有効。グルーピングできるユースケースが多ければ多い程有効で、少なければ少ない程ありがたみが薄い。
例えばStrutsで大量のマスタメンテナンスを作成する場合、全ての機能をグルーピングした所、必ず検索・追加・修正・削除の機能がある事が分かった。んじゃまずは機能と対をなすAction, ActionFormの命名規約を作ってしまおう。次に4つのボタンを定義して、LookupDispatchActionを継承したActionクラスを生成する。search, insert, update, deleteメソッドが定義されたインターフェースを実装させ、メソッドの定義もしておく。ただしActionは単なるdelegateでビジネスロジックを記述するモデルは別個起こしておく。プログラムのIDかなんかをキーに委譲先のモデルを呼び出すコードも生成しておく。ActionFormは画面項目定義書なるものからひっぱってきて、定義しておく。それぞれのアクションの遷移先はsuccessで生成しておく。ビジネスロジック部で必ず書くであろうActionFormへからのgetは変数を宣言して格納するコードを生成しておく。ついでにDBへのアクセスコードも生成しておく。
…なんか思いつくまま適当に書いたらすごく虚像な気がしておもしろくない〜。
ようはですね〜機械作業の塊には、自動化で楽をしようじゃないか!って事です。人間がやっている機械作業は必ず存在して、プログラムによって自動的に人間の作業を代替する事も可能な部分があるはずです。特にフレームワークを採用して型にハマった開発をする場合に、新規クラスの作成は自動生成できるはず。最初に全部作っちゃう。必要な機能が洗い出されているなら、メソッドまで定義しちゃう。画面項目が決定しているなら項目を格納する変数も宣言しちゃう。人海戦術へ持ち込むためには最低限の品質を確保しつつ、誰も実装所を迷わないようにして、確実に仕様書の通りに作れるようにする。仕様書が完璧に近い状態でなければアウト。仕様書の質の悪さがそのままプログラムの質の悪さにつながります。とは言っても、質が悪くなる部分(スコープ)は限定されているので、修正も全体を見るよりは楽になるはず。
…って、おもしろくないと言いつつ書き続けてしまうorz
今度ほんとにやるんでちゃんとできたらプラクティスとして書きまーす。設計書一式と作業手順、アウトプットのサンプルなどなど公開できたらいいなぁ。ちょーっと前に打ち出した開発プロ(以下略)より断然現実味があって、さらに目の前でやる事ができるチャンスがある。絶対成功させてやる!すばらしい設計に短期間高品質なプログラム。ほんとにできたら爽快ですねー!
2004-09-17
■ [Seasar2][Flex] S2FlexV1.0.1リリース!
http://sourceforge.jp/projects/seasar/
S2FlexがAction Script2に対応です!!
■ [S2OpenAMF] オブジェクトの変換ルール
#まだ殴り書きですので、正式な変換ルールはS2OpenAMF1.0.5のドキュメントとして添付します。1.0.5の正式リリースは来週末を目標にしています。
呼び出し先のメソッドの定義が大きく影響します。
- メソッドの引数がList以外の場合(ObjectやJavaBeans)
 - メソッドの引数がListの場合の要素の変換
				
- _remoteClassを指定しないと要素はHashMapになります。
 - _remoteClassを指定していると要素はJavaBeansになります。
 - Number, Dateなどその他オブジェクトは正しく変換されます
 
 
変換パターンの一部を下記に示します。
| _remoteClassを設定している | |
| Flash | Java | 
| Object | JavaBeans | 
| AS2Class | JavaBeans | 
| 
Array └ Object  | 
ArrayList └ JavaBeans  | 
| 
Array └ AS2Class  | 
ArrayList └ JavaBeans  | 
| _remoteClassを設定していない | |
| Flash | Java | 
| Object | JavaBeans | 
| AS2Class | JavaBeans | 
| 
Array └ Object  | 
ArrayList └ HashMap  | 
| 
Array └ AS2Class  | 
ArrayList └ HashMap  | 
これは正規品にも言える事ですが、以下の事を守れば正しく動作します。
■ [S2OpenAMF] リリース間近
今日リリース予定ですが、今日のリリースはRC1という事にしておきます。ドキュメントの整備とサンプルの用意が間に合わないからです。何に間に合わないかというと今週末に間に合わない…。今週末、私はパソコンに触れられない環境へ旅立つ予定なので、今日を逃すとリリースがちょっと先になってしまうのです。RC1でバグと要望の意見を集めて、正式リリースでバグを直し、要望を盛り込みたいです。
■ [GAME] プロマシアの呪縛
買ってしまった!!いつ封を開けて、いつプレイするか…10日後か1ヵ月後か3ヵ月後が創造もつきませんが、気が向いて、時間があったら遊びます。昨日は昼頃から鯖落ちしてたみたいで、先行組は悲しい思いをした事でしょう(^_^;。1日10時間とかプレイしてた土日が非常に懐かしいです。おととしくらいの記憶ですが…。
■ [OpenAMF] OpenAMFの可能性
既に様々なServiceInvokerがあって、正規品と遜色なくAxisやEJBを呼び出す事が可能ですが、さらに機能を追加する事も可能です。今、言っている機能の追加はServiceInvokerの追加ではなく、ServiceInvokerに対して新しい指示を出す方法です。アノテーションをFlashから指定するような感じでいかようにでもサーバサイドの機能をいじれるというイメージです。
その一例が_remoteClassです。これはたまたまMacromediaが指定している固有のプロパティですが、Flashにはプロパティの名前の制限がありませんので、自前で自由に定義できるわけです。例えば…おもしろい使い方がパッと出ませんが、_sleep = '5000'を指定したオブジェクトを引数に渡した場合、5秒待機してから処理を開始する。_async = trueを指定したオブジェクトを引数にした場合は、メソッドの呼び出しが排他され処理が待ち行列に追加される等。
これで新しいFlashの使い方、開発方法を模索できないかなぁと思っていて、何か応用して使いたい所です。ちなみにこれはFlexでも可能です。Adapter作れば良いだけですから!
■ [Flash] Flash Remotingを使う場合に気をつけたい事
Flashとサーバサイド(Java)をつなぐ時にインターフェースを設計しますよね。そこで確実に注意しておこうかなと私が今考えている事を書いてみようと思います。注意するのは全てJava側です。
- 呼び出し先のクラス(Java側)でメソッドをオーバーロードしない
 - オーバーロードする場合、引数の数を変える
 - Flashからの引数がAS2クラス、Object以外の場合は上記制約を受けない(プリミティブな型なら大丈夫)
 
簡単に説明するならば、Flashは引数の型が違うだけのメソッドを呼び出しづらいって事です。_remoteClassが記述されていれば、呼び出すメソッドの決定はとても容易なのですが、指定されていない場合、型が定まらないので呼び出し先のメソッドを確実に決定できません。OpenAMFのランクで言うと85となっていて、100ではありません。なのでOpenAMF自信も確実では無いが、一応呼び出してみたという感じになっています。ランクが下がるのはFlash Remotingのこういう特性を意識しないで、サーバサイドのメソッドを定義しているからです。ここだけ気をつけていればメソッドが正しく呼ばれないし、引数の型が意図した型で送られてこないという事はありません。
■ [S2OpenAMF] 仕様をどうしよう
下記2つのエントリをふまえると、_remoteClassが設定されていないObjectはASObjectにマッピングしないと、AMFGatewayとコンパチとは言えません。がしかし、今現在S2OpenAMFはJavaBeansにマッピングしちゃってます。マッピングの仕組みが違う方法を取っているからです。仕組みについてはリリース前に詳しく書く予定です。とりあえずリリースしちゃって、コンパチじゃないと駄目!とか、マッピングしてくれた方が嬉しいとか意見を集めようかなと思います。それによってコンパチレベルの設定で仕様を切り替えられるようにしたり、2つのInvokerServiceを提供する方法が考えられます(後者にすると思いますが)。
■ [Flex] ObjectをJavaBeansにマッピングさせる方法
一つ下のエントリの解決策はObjectに_remoteClassプロパティを設定する事です。
    var object = new Object();
    obj.id = 'ID';
    obj.name = 'NAME';
    obj._remoteClass = 'packageName.ClassName';
			これでちゃんとJavaBeansにマッピングされ、メソッドも正しく呼び出されます。Arrayに格納されたObjectもちゃんと、ArrayListに格納されたJavaBeansへと変換されます。
■ [Flex] AMFGatewayはObjectをJavaBeansにマッピングしない
Flash RemotingのgatewayはFlashのObjectをJavaBeansにマッピングしてくれたと思ったのですが、FlexのAMFGatewayはマッピングしてくれません。具体的にどんなObjectかというと
    var object = new Object();
    obj.id = 'ID';
    obj.name = 'NAME';
			これを
    public class Hoge {
        private String id;
        private String name;
        /* setter/getter省略 */
    }
			というJavaBeansにマッピングしてくれません。じゃぁ何で渡ってくるかというと、ASObjectで渡ってきます。オーバーロードされたメソッドは定義していません。確実にASObjectで渡ってきます。Arrayに格納されたObjectもArrayListに入ったASObjectで渡ってきてしまいます。OpenAMF(Flash Remoting MX)はちゃんとJavaBeansにマッピングしてくれるんですけどね。
■ [独り言] メーリングリスト…って言うのか?
なんかプロジェクト関連のメーリングリストに登録されたらしいのですが、一向にMLからメールが届きません。山ほど届くのはCCにズラーっと人が並んだメール。もしかして…この人達CCで全員にメール出してるのか!!それをメーリングリストと呼んでいるのか!!確かにメーリングリストと呼んでも良いのかもしれませんが、非常に非効率です…。というわけで状況の改善を提案する予定。アドレス帳を使えばとても簡単にこういう事は実現できますが、本物のメーリングリスト設置しましょうよ。絶対便利ですから〜
■ [Life] 18〜21日不在です(土, 日, 祝)
日記を付け始めてからもう217日。1日だって書かなかった事はありませんでした。いや、むしろ書けなかったという事がありませんでした。これは確実に毎日パソコンを触っているという事で中毒極まりない!!もちろんケータイで更新なんてしてないので、確実にパソコンを触っています。雨の日も風の日も旅行の日も風邪の日もなぜかサボる事無く続けています。
がしかし、今回初めてパソコンを持たずに外出します。よって初めて日記の更新が無い日が!完全にインターネットから切り離されて過ごすつもりなので、パソコンによる連絡は一切取れません。一応休日なんで動いて欲しい時はケータイまでご連絡を…手を伸ばせばすぐ自宅にいるのと同じ状態になると思いますんで。
# makotan 『大丈夫だよ。ケータイからでも日記は更新できるんだから。』
# hoso-kawa 『たまにゃネットから切り離されてみたいわけよ(w』
# makotan 『そういえば、大阪のからさわぎで「ほそのかわたろう」って言ったら誰の事かわかったらしい。「ほその」定着おめでとう!!(笑)』
# hoso-kawa 『わーいわーい♪って日記上部にも強調して書いてあるのに、時代の流れは「ほその」か(w』
# MIZOMIZO 『『Flash Remotingを使う場合に気をつけたい事』に対する質問です。
1.呼び出し側のクラスってクライアントFlash
2.だとすると、as2はオーバーロードってできるの?』
# akon 『プロマシアの呪縛、封を開けました。一歩リード!』
# hoso-kawa 『MIZOMIZOさん>あー、ごめんなさい。呼び出し側ではく、呼び出し先のクラスでした。Javaのメソッドの話です。AS2はメソッドのオーバーロードできないですね。』
# hoso-kawa 『akonさん>負けてられない!という事で封を開けました。説明書まで読みました!これで同じラインには立ったはず(w』
# higayasuo 『S2OpenAMFの_remoteClass対応早くリリースして。
S2Flexは、ASTranslator(Flex版)のパッケージが
1.0と1.5で違ってしまったので、1.5のみに対応しようと思ってます。
つまり、Flash, Flex1.0はS2OpenAMFで、
Flex1.5はS2Flexで。』
# hoso-kawa 『了解しました!
とりあえずソースだけでも今日中に公開できるようがんばります。』
# akon 『抜かれた・・・説明書は字があまりに小さいので停滞しています・・・』
# hoso-kawa 『新しいエリアの説明くらいしか無かったデスヨ。早くヤリターイ!』
2004-09-16
■ [ETC] 妄想が次々と実現されていく
https://www.yaokin.com/sankanoh/index.html
ロールプレイングショッピングシステム!!!やはりFlashです。ちょっとコミカルさに欠けるけど、作った人はえらいっ(笑)
2004-09-15
■ [GAME] FFXIやるかやるまいか…
今日は時間があるのでやるかやらないか迷い中…。プロマシアの呪縛関連のアップデートもあるだろうし、何より課金しわすれていて、解約状態(笑)来月末までに支払わないとキャラが消えるっ!!でもこれからPT組んでLV上げって感じじゃないし、合成も釣りも面倒だ。ということでやっぱりやめた(笑)一度サボリ癖が付くとなかなか復帰できないもんです。
■ [独り言] Flexのすばらしさ
入門は手探りだけでなんとかなっちゃう所。つまり、非常にとっつきやすい。分かりやすい。簡単。素敵。Flashのとっつきに2週間は必要だ!の法則が、Flexはインストールから10分でとっつきOKって感じ。あくまで個人的感想ですけど…。サイズに関してはちょっと慣れないですね。HTMLのサイズに関しては、これくらいでこの幅だ!っていうのはもう勘でわかるんですけど、Flexのサイズはまだ慣れていない。
楽しいうちに存分にイジリ倒しておけ!自分の中の旬を逃すと次に燃える(萌える)のがいつか分かりませんから!!
2004-09-14
■ [OpenAMF] JavaServiceInvokerはなぜASObjectをJavaBeansにマッピングしないか
#書いてある内容が間違ってたらツッコミお願いします。
一言ですませるなら、OpenAMFは呼び出し先のメソッドの判定方法が若干甘い!!という事です。
一言で済ませた後に長々と説明しましょう。これはOpenAMFの内部の動きを知る必要があります。OpenAMFはFlashから送られてきたオブジェクトをFlashから送られてくる情報を元にJavaBeansに変換しているわけではありません。Flashから送られてくる「クラス名、メソッド名、引数の数」を元に呼び出し先のクラスを走査し、呼び出し先のメソッドを捜し当てます。探し当てたメソッドの引数の型を元に、Flashから来たオブジェクトを変換しているのです。まとめると、呼び先を特定して、呼び先の情報を元に、送られてきたオブジェクトを変換しているという事です。
ではなぜASObjectをJavaBeansにマッピングできない事があるのか。そうです、必ず変換できないわけでは無いんです。私はOpenAMFの特性を利用して少しいじわるなクラスを作り、それをFlashから呼び出すようなコードを書きました。そのコードとは下記のようなクラスです。
public class InvokeTest { public void test(ASObject asObject) { } public void test(TestJavaBeans beans) { } }
つまり引数の数が同じで、引数の型が違う、JavaBeansより前にASObjectが引数のメソッドが宣言されている。
OpenAMFはメソッドの定義順にFlashが呼び出そうとしているメソッドを評価します。先の説明の通り、クラス名、メソッド名、引数の数がマッチすれば、それは呼び出したいメソッドだと評価します。ここで肝となるのが引数の型は見ていないという事です。呼び出し先のメソッドを決定する際に、引数の型は決定していないのです。なぜならFlash側からは引数の型をサーバへ送信していないから。なので先に説明した3つの条件が一致すれば、OpenAMFはメソッドを決定してしまいます。
上記の例の場合、Flashが呼び出したいメソッドはtest(ASObject)メソッドだと決定し、引数の変換を開始します。なのでASObjectは正しくJavaBeansへ変換されません。これがオーバーライドされているいじわるなメソッドが無い場合、正しくJavaBeansへ変換されます。
OpenAMFはクライアントから送られてきたオブジェクトがASObjectだと認識した後に、getType()メソッドを呼び出し、なんらかのクラス名が設定されていれば、そのクラスへと変換を試みるのですが、AS1までは_remoteClassなんていうサーバサイドの変換先のJavaBeansを設定するような仕様はありませんでした。OpenAMFはまだ_remoteClassを参照し、JavaBeansへ変換する機能がありません。将来きっと_remoteClassを参照してJavaBeansへ変換する機能が追加されると期待していますが。
ここでAS2クラスをちゃんとJavaBeansに変換するにはOpenAMFにどういう手を加えれば良いのでしょうか?OpenAMFのDecoderをいじったり、様々な所に手を入れた結果、最も簡単であろう結論が出ました。それは、ASObjectに_remoteClassというプロパティが存在していれば、setTypeメソッドを使用して_remoteClassの内容をASObjectに設定するというものです。getTypeメソッドの動作を上記動作に作り変えてしまえば、全てが丸くおさまってしまうのですが、あくまで私が作っているのはOpenAMFのServiceInvoker。大元のコードには一切手を加えないという信念の元、外部よりsetTypeメソッドを使用して、typeの設定をする事にしました。ちなみにtypeを設定した後、OpenAMFUtilsのdecodeParameterメソッドを呼び出さなければ変換は行われません。一連の処理が終り、うまく変換できなかったASObjectを取得して、_remoteClassの内容を設定し、もういちど変換をかけて正しくJavaBeansへ変換してもらおうというのが私の書いた処理です。getTypeによってどのように動作が変わるかはOpenAMFUtilsのdecodeParameterメソッドを見てください。その中からぐーんとドリルダウンしてASTranslatorのDecoderFactoryのdecideClassToTranslateIntoメソッドで使用されています。詳しい動作については…ソースをご覧ください(うわつ、ここまで来て手抜き)
最初にAS2対応の作業を行った時は、OpenAMFからASTranslatorまで様々な所に手を入れてしまったのですが、四苦八苦しているうちに作り所が見えてきて、上記のような対応が最も簡単でOpenAMFにもASTranslatorにも影響が無いという判断ができました。こんな事を実験したり、書いたりする時間がある事をとても幸せだと感じます!
■ [S2OpenAMF] ネストのネストのネストは大丈夫か
記述したコードが思わぬ副産物を産んでいて、とても良い状態に(笑)OpenAMFUtilsとJavaBeansDecoderが優秀すぎですっ!
| Flash | Java | |
| 
Array ├ AS2Class │ └ AS2Class │ └ Array | ├ AS2Class │ └ AS2Class └ AS2Class  | 
→ | 
List ├ JavaBeans1 │ └ JavaBeans2 │ └ List | ├ JavaBeans3 │ └ JavaBeans3 └ JavaBeans2  | 
こんなんでも全然大丈夫でした。OpenAMFがAS2対応になるために書いたコードは現時点で85行。四苦八苦コードを取り除いて整頓すればもっともっと少なくなるはず。やっぱり好きだー!OpenAMF!
■ [S2OpenAMF] 意図していないのに正しい動きに…
Flash側からネストしたオブジェクトを渡したのですが、きちんとJavaのオブジェクトに変換されています。私はそんなコードを書いた覚えが無いのに一体どこで変換されているんだっ!本来ならAS2Classから変換されたJavaBeansのフィールドを走査して、ASObjectを発見し、JavaBeansへ変換するコードを書かなければならないはずなのに、ちゃんとできちゃってます。図示するとこんな感じ
| Flash | Java | |
| 
Array └ AS2Class └ AS2Class  | 
→ | 
List └ JavaBeans └ JavaBeans  | 
とても正しいのに納得がいかない(爆)どこで勝手に変換されてしまっているのか要調査かつ、ネストの階層が深くなった場合のテストもするっ!これにクリアすれば、S2OpenAMFのAS2対応版リリースはそう遠くないです。
■ [Flex] 動的に作成されるMXMLを解釈させるには2
JSPで動的に作成されたMXMLをFlexに解釈させるには、Flexが提供しているTagLibを使えば可能です。例えば
<%@ taglib uri="FlexTagLib" prefix="mm" %> <% String helloString = "Hello World !!"; %> <mm:mxml> <mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"> <mx:Label id="label0" text="<%= helloString %>"/> </mx:Application> </mm:mxml>
とやれば、画面にHello World !!と表示されます。Flex Builderで作成したMXMLとほぼ同一のものですね。非常に簡単でうれしい(笑)
■ [Flex] 動的に作成されるMXMLを解釈させるには1
うーみゅ、普通に考えて無理か。FlexDetectionFilterの中身さえ分かれば自前で作れるのだけれど。えっ?そんな使い方おかしいって?おっしゃる通りで…たんなる趣味と思ってください。
#あ、もしかしてそんな事ないや。やってみよう。
■ [仕事] 鎮火
担当の方が優しくて助かります。やっぱり直接出向いて話を聞いた方が作業が進みますね。ちなみにどれもこれも本来の私の仕事では無かったり(苦笑)。困っている人は見捨てられません。これが「余計な苦労を買って出る」精神ですかー!
■ [Life] 蓬莱泉 空
そういえば最近飲んでいなかったなぁと思って、いつも空ゲット専用に使ってる通販サイトを見てみると…おおっ?!この時期に在庫ありますよ。11月の出荷を待たずしてゲットできそうです。でも抱き合わせ販売で一升瓶相当を買えとなってるのが高くつく。蓬莱泉の日本酒ってどれも高いんですよね〜。空を買うためにほとんど飲みましたよ(笑)でもどれもイマイチ。マズくは無い。が、とびきりうまいわけでも無い。今年の冬は熱燗にしてもとてもおいしい日本酒を探すつもりです。基本的には冷で飲むんですけどね。さむーい日には、熱燗をクイっといくのも楽しみですから(^-^)
■ [ETC] SF.jp調子が悪い時がある
http://d.hatena.ne.jp/masataka_k/20040913#p1
ADMIN機能が不安定この上ない
便乗して日々苦労していたSF.jpの調子の悪さを書いてみる(今は苦労を克服した)。ファイルをアップしようとしたらアップできないし、ファイルだけアップされて無かったり、できちゃったリリースにファイルを追加しようとしてもできなかったり、ファイルの上書きができなかったり、ファイルの削除ができなかったり、リリースノートが登録されなかったり、登録できても権限エラーになったり…。いーっぱい調子の悪い所あります(涙)ちなみにこれはファイルリリースについてだけの調子悪い所です。でも、扱いには慣れました!何が起こったって冷静に対処できる程、ことごとくやられています(笑)
# uguu 『テンプレートの空欄を埋めていくって、TDDと同じ様な感じですよね。実装前に用意されたテストを埋めるって言う作業が。私も同じようなことを考えてはいたのですが、仕事ごとの共通点があまり無いのと、自分の周りに勉強意欲のある人がいなかったため挫折しましたorz』