FexFactoryの拡張(2)

FlexFactory#createFactoryInstance()の戻り値はFactoryInstanceのインスタンスだが、このインスタンスはlookupメソッド呼び出し時のパラメータに渡される(はず)。FactoryInstanceはフィールドにConfigMapを持つので、ここに設定値を保持しておいて、lookup時に参照できる模様。
ConfigMapは、使用しないプロパティがあるとエラーを起こすので、アクセスしない可能性のあるプロパティがあらかじめわかっている場合はConfigMap#allowProperty()を呼んでおく。

FlexFactoryの拡張

FlexFactoryはFlexのリモートオブジェクトを使った通信の際のあて先インスタンスを返す処理を拡張する際に利用するクラス。
このFlexFactoryの拡張の仕方について。

FlexFactoryクラスを継承し、FlexFactoryのインタフェースであるcreateFactoryInstanceとlookupをoverrideする。
services-config.xmlとremoting-config.xmlの記述の仕方は参考ページの通り。
2つのファイルで設定したプロパティ値はそれぞれinitializeメソッドとcreateFactoryInstanceメソッドで参照できる。

remoting-config.xmlで設定したあて先のプロパティを確認してみるコード。

public FactoryInstance createFactoryInstance(final String id, final ConfigMap prop)
{
       Set s = prop.propertyNames();
       System.out.println("set:"+ s);
       Iterator iterator=s.iterator();
       while(iterator.hasNext()){
           String key=(String)iterator.next();
           System.out.println("elem:"+ prop.getPropertyAsString(key, "value not found")); 
       }
...FactoryInstanceを返す処理。省略
}

createFactoryInstanceメソッドのパラメータのConfigMapはremoting-config.xmlのdesitination/propertiesタグで指定したパラメータを持っていて、デフォルトではfactory,source,scopeが設定されている。
あて先ごとに異なったプロパティの種類と値を設定することができ、アプリケーション初期化時に設定したあて先の分だけ呼び出された。
EJBなどFactory内のインスタンスのキャッシュの設定や、APサーバごとのJNDI名の設定などに利用できるかもしれない。

と思ったが、アプリケーションのプリロード時に、使っていないタグをチェックし、存在した場合はエラーになるので、ユーザが自由にタグを追加して動的に読み込むという使い方は推奨されないのかもしれない。上記のようにConfigMapの全要素をトラバースする処理を入れておくとエラーの回避はできた。

参考。
http://livedocs.adobe.com/flex/201_jp/html/ent_services_config_097_26.html
http://www.adobe.com/livedocs/flex/2_jp/fds2javadoc/flex/messaging/FlexFactory.html

SVNのタグとブランチのつけ方

検索するとすぐ出てきたが、以下が簡単にまとまっていてわかりやすい。

http://d.hatena.ne.jp/takayukis/20060609/1149845435
ブランチは1.0.xのように系として存在し、タグは1.0.0のように点(スナップショット)として存在する。

ActionScrpt3のクロージャのthisオブジェクト

ActionScrpt3のクロージャでは、関数呼び出し時に明示的にthisオブジェクトを指定できる模様。
ArrayにはforEachとmapメソッドが用意されていて、パラメータにクロージャのほかに、クロージャ内でthisオブジェクトとして参照されるオブジェクトを渡すことができる。
下記のようなソースがあったとして、forEachの第二パラメータのthisオブジェクトを省略しているため、クロージャ内では、thisがxやwidthフィールドをもっていないために期待した判定結果にならない。しかもなぜかnull参照のエラーも発生しなかった…

arr.forEach(function (item:HogeClass, idx:int, arr:Array):void {
  if (this.x + this.width + moveSpeed > item.x) {
    bMove = false;
    return;
  }
});

下記のように第二引数にthisを渡すと、期待通りクロージャ内で渡したインスタンスがthisとして参照された。

arr.forEach(function (item:HogeClass, idx:int, arr:Array):void {
  if (this.x + this.width + moveSpeed > item.x) {
    bMove = false;
    return;
  }
},this);

もしくはクロージャ内ではthis.xxxという記述にせず、xxxを直に参照するとレキシカルなスコープになって問題なく参照できた。

arr.forEach(function (item:HogeClass, idx:int, arr:Array):void {
  if (x + width + moveSpeed > item.x) {
    bMove = false;
    return;
  }
});

Functionクラスのcallやapplyを使う場合もパラメータでthisを渡すことができる。

(function(arg:String):void {
  trace(arg + ",width:" + this.width);
}).call(this, "arg");

Flexのコマンドラインデバッガ

FlashDevelopにはデバッガが付いていない。このためデバッグしたいときは、Flex SDK標準のコマンドラインデバッガfdbを利用する必要がある。

まず、FlashDevelopのプロジェクトをデバッグビルドしておく。
コマンドラインを起動し、swfの出力フォルダであるbinフォルダに移動し、fdbを起動。

 fdb.exe Foge.swf

fdbのプロンプトで対話的にコマンドを入力する。
主なコマンドは以下。

#カレントのファイルの内容を表示
(fdb)list
#listにファイル番号のパラメータを渡すと、指定したファイルの内容を表示。
#このコマンドでカレントのファイルの切り替えもできる。
(fdb)list
#アプリケーションのファイル一覧を表示。ここでファイル番号を表示できる。
(fdb)info sources
#パラメータの行番号にbreakpoint設定
(fdb)b 53
#パラメータの式をプリント
(fdb)p valXxx
#次の行に進める(step)
(fdb)s
#処理を次に進める(next)
(fdb)n
#バックとレースを表示
(fdb)bt
#処理再開
(fdb)continue
#終了
(fdb)q
#xxxコマンド説明の詳細を表示
(fdb)help xxx