GoogleとYahoo!がFlash検索を改善
AdobeがFlashの検索インデックス化技術をGoogleとYahoo!に提供することでFlashコンテンツが検索されやすくなるそうです。
具体的な技術は明らかにされていませんがWebmaster Central blogのQ&Aから気になる点をまとめると、
Q: What about non-textual content, such as images?
At present, we are only discovering and indexing textual content in Flash files.
Also note that we do not index FLV files, such as the videos that play on YouTube, because these files contain no text elements.
インデックスされるのはSWF内のテキスト情報のみ。
画像やFLVファイルはインデックスされない。
Q: What are the current technical limitations of Google’s ability to index Flash?
1. Googlebot does not execute some types of JavaScript. So if your web page loads a Flash file via JavaScript, Google may not be aware of that Flash file, in which case it will not be indexed.
JavaScriptでSWFをロードしているとインデックスされない場合あり。
2. We currently do not attach content from external resources that are loaded by your Flash files. If your Flash file loads an HTML file, an XML file, another SWF file, etc., Google will separately index that resource, but it will not yet be considered to be part of the content in your Flash file.
外部ファイルは個別にインデックスされるが、元のSWFファイルの一部とはみなされない。
とのこと。
まだ開発中とのことですが、逆にJavaScriptや外部ファイルに中途半端に対応されるよりも、HTMLにはインデックスされたいコンテンツを記述して、SWFObjectなどJavaScriptでSWFコンテンツに置き換えられる方がありがたい気もしますが。。。
getter/setterを利用してイベントリスナーを動的に切り替える
AS2では
Mouse.addListener(this);
とすることで、MouseDown時に、this.onMouseDownメソッドが呼ばれるようになります。
trace("default");
}
function test() {
trace("test");
}
Mouse.addListener(this);
this.onMouseDown = test;
などとすることで、addListenerした後でもonMouseDownメソッドを動的に切り替えることができます。
AS3で採用されたイベントモデルでは、addEventLisntener時にイベントリスナーの参照を引数として指定するようになり、また、ほかのモダンな言語と同様、参照渡し(call by reference)ができないため、以下のようなコードではAS2に相当する動的なリスナーの切り替えができません。
trace("default");
}
function test(event:MouseEvent):void {
trace("test");
}
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
onMouseDown = test; //意味なし
上記の例では、addEventListenerで渡されるのは、その時点でのonMouseDownの値なので、その後にonMouseDownの値を変えても意味がありません。
【参考】AS3では関数の引数はすべて値渡し(call by value)である
そこで、下記のようにgetter/setterメソッドを利用することで同じような動作が実現できます。
この例では、最初のMouseDownと2回目以降のMouseDownで呼ばれるリスナー関数が切り替わります。
複数の非同期処理の完了を通知するQueueクラス
複数のファイルを読み込む場合など、複数の非同期処理の進行状況とすべてが完了したタイミングをイベントとして受け取ることができるQueueクラスを公開しました。
サンプルのダウンロードはこちらから。
クラスを公開するというほど大げさなものではありませんが、なるべく標準的なイベントモデルには変更を加えずに、複数イベントの完了を通知することができます。
仕組みはいたって単純で、各イベントを受け取るリスナーを Queue(待ち行列)に追加し、イベントが呼ばれたらQueueから削除しているだけです。
Queueが削除されたタイミングとQueueがなくなったタイミングでイベントが発生し、
queue.length / queue.totalで進行状況を知ることができます。
また、エラー発生時にもリスナーをQueueから削除するようにしておけば、ファイルが一部取得できなかった場合にもQueueの完了イベントを受け取ることができます。
AS3で陥りがちなメモリーリーク
AS3ではガベージコレクションによるメモリ管理が導入されています。
ガベージコレクションとは、簡単に言えば「どこからも参照されなくなったオブジェクトがころあいを見計らって勝手にメモリから消去される」仕組みです。
この「どこからも参照されなくなった」という条件がクセモノで、気をつけないとすぐにメモリーリークの原因になります。
メソッドクロージャとバインドメソッド
「メソッドクロージャ」という用語の使われ方が混乱しているようなので詳しく調べてみました。
イベントリスナーの引数のデフォルト値をnullにする
AS3で採用されたイベントモデルでは、イベントリスナーの引数として必ずEventクラス(またはそのサブクラス)のオブジェクトが渡されますが、場面によっては、イベントで呼び出されるメソッドを直接呼び出したい場合があります。
そのような場合は、引数となるEventオブジェクトのデフォルト値をnullにしておくと便利です。
下の例では、testメソッドを直接実行したり、Timerを使って1秒後に呼び出したりしています。
eclipseでタブのスタイルを変更する
eclipse+Flex Builder plug-inの場合、
タブの形がeclipse標準のものになりますが、これがちょっと独特な形をしています。

「設定」→「一般」→「外観」で、
「トラディショナル・スタイルのタブを表示」をチェック
すると、すっきりします。

Flex Builder 3(eclipse)のワークスペースの管理
開発環境の全体像を掴むことは、気持ちよくプログラムを書くためにも重要です。
Flex Builderは、eclipseベースで作られているため、
ワークスペース、ワークベンチ、ワーキングセット、パースペクティブなど、
eclipseの様々な用語に戸惑います。
以下、それぞれの用語の概念とポイントをご紹介します。
Flex Builder 3 beta 3(Eclipse Plugin)のインストール
Embedタグを用いたFlash CS3とFlex Builderの連携
これまでは、あくまでFlex BuilderをFlash CS3のエディタとして利用する(デバッグ&ビルドはFlash CS3で行う)方法を紹介してきましたが、できればFlex Builderでデバッグ&ビルドまで行える、もしくはFlash CS3でもFlex Builderでも同じものをビルドできるのが理想的と言えます。
いくつかの方法を試してみた中で発見した、今のところ最も理想に近い方法を紹介します。
ポイントはFlex BuilderでSWFを読み込むためのEmbedタグを利用することです。