- 画像をボタンとして扱いたいのだが [otsuka]
- 画像をボタンとして扱いたいのだが [うめつ]
- AMF3 Vector型 [otsuka]
- AMF3 Vector型 [arkw]
- SWT to SWF [otsuka]
- SWT to SWF [nod]
- Tweener処理後に対象オブジェクトを削除 [otsuka]
- Tweener処理後に対象オブジェクトを削除 [+39]
- Tweener処理後に対象オブジェクトを削除 [otsuka]
- Tweener処理後に対象オブジェクトを削除 [tksh]
- AS3のコレクションライブラリ [otsuka]
- AS3のコレクションライブラリ [yossy@beinteractive]
2010年1月14日
Flash | TextFlowLineの文字列データ
Flex SDK 4.0.0.10485に含まれているText Layout Framework(TLF)でのお話。
TLFで文章内の一行を表すのがflashx.textLayout.compose.TextFlowLineクラス。このTextFlowLineオブジェクトに含まれるテキスト、つまりある一行の文字列データを取得したいのだけど、TextFlowLineクラスにはgetText()メソッド的なそのものずばりのメソッドやプロパティが用意されていない。
なので、今まで非常にややこしい方法でテキストを取っていたんだけど、やっと簡易な方法がわかった。
var line:TextFlowLine = textFlow.flowComposer.findLineAtPosition(xxx); var lineStr:String = line.paragraph.getText().substr(line.getTextLine().textBlockBeginIndex, line.textLength);
このline.getTextLine()メソッドによって、TLFからFlash Text EngineのTextLineオブジェクトを取得できる。このTextLineクラスのtextBlockプロパティとTextFlowLine.paragraphプロパティはほぼ同義なものと思われる。
ちなみに、Adobeサイトに上がっているTLFのAPIドキュメントは古い。
2009年10月 8日
Flash | URLRequest で空の POST
URLRequest - ActionScript 3.0 言語およびコンポーネントリファレンス注意:Flash Player で実行されているときに、参照されるフォームに本文がない場合、Flash Player では自動的に GET 操作が使用されます。これは、メソッドが URLRequestMethod.POST に設定されている場合でも同じです。このため、正しいメソッドが使用されるように、ダミーの body を必ず含めることをお勧めします。
今日嵌っていたポイント。上記ドキュメントにあるようにダミーデータをくっつけて解決。
var req:URLRequest = new URLRequest(url); req.method = URLRequestMethod.POST; req.data = "dummy";
2009年9月29日
Flash | Flash CS5+FlashBuilder 4
moockblog: Flash CS5/Flash Builder 4 Integration Preview with Richard GalvanFlash CS5+FlashBuilder 4では、Flash BuilderからFlaファイルのライブラリが参照できるようになるってことか? この記事だけでは詳しく分からないけど、両者の連携強化は期待できる機能。If you use Flash Builder as your main programming IDE, but still use Library symbols from a .fla file for graphics, your compiling and debugging process is going to be significantly more convenient in Flash CS5/Flash Builder 4.
ただ、
when editing a class file in a Flash Professional Project, Flash Builder will not list the symbols available in the main .fla file, and will not provide code hints for those symbols.とのことなので、ライブラリのシンボルをFlash Builderで編集しているASコードから参照してもエラーにならないだけで、それ以上のことはできないのかも。
2009年8月 3日
Flash | Dateオブジェクトのソート
僕が実装を担当したFlashに重大なバグが見つかった。しかもリリースの半日くらい前に。そしてそのバグはなかなか再現しない。少なくとも自分の環境では発生させることができず、まったく原因が分からなかった。
結局リリースまでに原因が判明せず、再現性が低いのでとりあえずリリース。が、アクセスの多いサイトだったので、確立は低いとは言えバグに遭遇するユーザもそれなりにいるわけで・・・
昨日の夜になってようやく再現環境を作ることができ、今朝バグを解決。原因は僕の勝手な思い込みだった。
var aug2:Date = new Date(2009, 7, 2); var aug3:Date = new Date(2009, 7, 3); var aug4:Date = new Date(2009, 7, 4); trace(aug2 < aug3); // true trace(aug3 < aug4); // true var dates:Array = [aug4, aug3, aug2]; dates.sort(); trace(dates);
例えば上のコード。最後のdates変数の値は8/2、8/3、8/4の順のDateオブジェクト配列になると思わない? JavaだったらDateクラスはComparableインターフェースを実装しているので、普通にソートすればそうなるのだけど、ActionScriptにはComparableインターフェースなんてなく、Array.sort()メソッドのAPIドキュメントにある通り「データ型に関係なく、すべてのエレメントがストリングとしてソート」される。
つまり、DateオブジェクトのtoString()メソッドの結果を基に以下の順にソートされる。
- Mon Aug 3 00:00:00 GMT+0900 2009
- Sun Aug 2 00:00:00 GMT+0900 2009
- Tue Aug 4 00:00:00 GMT+0900 2009
そんなことを知らずに日付順にソートされてるはずと思い込んでいたのが、バグの原因でした。
関係者の皆様、ユーザの皆様、すいませんでした。
2009年6月20日
Flash | 画像をボタンとして扱いたいのだが
単純な矩形ではない複雑な形の画像をボタンとして扱いたい。
AS3 だけで作ろうとすると、[Embed] メタデータタグを使って画像を埋め込んで、それを Bitmap オブジェクトとして取得する。
Bitmap を Sprite でラップして、Sprite.buttonMode を有効にする。でもこれだと、Bitmap を囲った Sprite の矩形がヒット領域になってしまう。でも画像の透過部分はヒット領域にしたくない。
Sprite.hitArea は Sprite 型。
どうすればいいんだ? 何かド忘れてしている?
2009年6月 3日
Flash | EncryptedLocalStore
初めて EncryptedLocalStore クラス使ったけど、簡単に使えて便利。AIR だけじゃなく、Flash Player でも使えるようになればいいのに。
Flash プログラマーの中には、結構センシティブな情報をサーバサイドではなく SharedObject に保存しようとしちゃったりする人もいるので、こんな風に手軽に使える暗号化データストアがあるといいと思うんだよね。
「AIR アプリケーションをアンインストールするときは、アンインストーラは暗号化されたローカルストアに格納されたデータを削除しません。」という仕様は微妙。
AIR アプリのアンインストーラーは、スタートアップに登録したショートカットも消されないので、AIR にはいつかアンインストーラーの設定もできるようになって欲しい。
2009年6月 2日
2009年5月29日
Flash | SWFとAIRアプリの通信
ごちゃごちゃと書いてあって読んでもよく分からなかったけど、接続名をアンダースコアで始めるようにすれば次のようにLocationConnectionオブジェクトを設定すればいい。
▼SWF → AIR
・送信側 (SWF)
lc.send("_xxxxxxx", "methodName", ...args);
・受信側 (AIRアプリ)
lc.allowDomain("swfが置いてあるサーバのホスト名");
lc.connect("_xxxxxxx");
▼AIR → SWF
・送信側 (AIRアプリ)
lc.send("_xxxxxxx", "methodName", ...args);
・受信側 (SWF)
lc.allowDomain("app#" + appID + "." + pubID); // appIDはアプリケーションID、pubIDは発行者ID
lc.connect("_xxxxxxx");
2009年5月22日
Flash | クロスドメイン
・Security.allowDomain() メソッド
・LoaderContext.checkPolicyFile プロパティ
クロスドメインなSWFコンテンツで軽く嵌った点。またきっと引っかかると思うのでメモ。
前者は、ExternalInterfaceを使ってJavaScriptからSWFにアクセスする場合に、JavaScriptとSWFがホスティングしているサーバのドメインが違うと必要。
後者は、Loaderクラスが画像をロードしてBitmapData.draw()メソッドを使っていじくる場合に、画像とSWFがホスティングしているサーバのドメインが違うと必要。もちろん画像をホスティングしているサーバにはクロスドメインポリシーファイルを置いておく必要がある。
2009年4月27日
Flash | AMF3 Vector型
Vector Format in AMF3 - AKABANA
arkwさんのサイトで、Vector型とDictionary型のAMF仕様が紹介されていた。そういえば10で追加されたVector型のことをすっかり忘れていた。Dictionary型はOject型としてシリアライズされるものだと勝手に思い込んでいた。
これらの型については、AMF3の仕様書にはまだ反映されてないようだけど、arkwさんが調べたのかな? 有益な情報ですね。
後日検証して、Django AMFにも反映させたいと思います。
型マーカの13~15は何に使われているのだろう?
あと、サーバサイドからFlash/Flexに戻り値を返すときに、VectorやDictionary型で受け取りたいことってあるんだろうか?
2009年3月24日
Flash | AmFast
via Ted On Flash: AmFast Remoting for Python
Cで書かれたPythonのAMFエンコーダ/デコーダ。
以前にDjango AMFとPyAMFとで、至極簡単なパフォーマンス比較を行ったことがあるんだけど、誤差と言えるような差なんだけど、常にPyAMFが速かった。AmFastはPyAMFより10倍以上速いと書かれているので、相当速いに違いない。
Cの勉強を兼ねてソースを見てみたんだけど、まずはPythonモジュールをCで書く方法を学ぶ必要がありそうだ。
2009年2月15日
Flash | SWT to SWF
Ted On Flash: Eclipse E4 M1 SWT: JAVA to AS3
SWTアプリは一度も作ったことはないけど、この変換がちゃんとできるんならスゴイな。
まだJava APIにしかできないことがいっぱいあると思うんだけど、そういう機能を使っている場合どうなるのだろうか。
2009年1月20日
Flash | swfmill
Flash Liteでの携帯サイト制作の練習をと思い、サーバとごにょごにょやりとりするものを作っていたのだが、loadVariable()/loadMovie()のクリック制約に悩まされている。
この制約内で頭使ってFlash Liteサイトを作るのが醍醐味なのかもと思いつつも、サーバサイドでSWFを動的に生成するしかないという結論に至った。
というわけで、swfmillを初めて使っているのだが、XMLの記述はなかなか直感的で書きやすい。ライブラリに画像をいくつか突っ込んだSWFを作ろうとしているだけなので、これで事足りそう。
Flash 9のSWFも生成できればいいのに。これくらいシンプルな方が使いやすい。
動的生成にはサーバサイドプログラムからswfmillのプロセス立ち上げて、XMLデータを渡したりしなければならなそうなので、ちょっと面倒。
2008年12月10日
Flash | ObjectUtil.toString() 出力されないプロパティ
[#SDK-13013] ObjectUtil.toString() misses password property - Adobe Bug System
ObjectUtil.toString()メソッドは、passwordとcredentialsプロパティを出力しないという挙動を知らず、しばらく嵌ってた。ちゃんとAPIドキュメントに明記して欲しいよねー。
2008年11月15日
Flash | Flash CS4 日本語ドキュメント
Adobe Flash CS4 Professional * Flash CS4 Professional
先日までFlash CS4のβ版からヘルプを呼び出しても認証が掛かってて見られなかったけど、今日誤ってヘルプを選択したらアクセスできるようになっていた。
あー、公式だとこういう風に訳すのかと思うところが多々。原稿はもうとっくに提出しているので、今更直したくないけど。
2008年11月 9日
Flash | AS3でRemote Shared Object
SharedObject - ActionScript 3.0 言語およびコンポーネントリファレンスガイドsetDirty() メソッド
SharedObject.setProperty() メソッドは、setDirty() を実装します。ほとんどの場合、たとえばプロパティの値がストリングや数値のようなプリミティブ型のときは、setProperty() を呼び出すことが可能で、setDirty() を呼び出す必要はありません。ただし、プロパティの値が独自のプロパティを持つオブジェクトである場合は、setDirty() を呼び出してオブジェクト内の値が変更された日時を示します。
もう、なんで?というAS仕様に悩むこと2時間。
FMSのRemote Shared Objectを使うプログラムを初めてAS3で書いてたんだけど、AS側から
so.data['key'].name = value;と、RSOのデータを変更してもサーバにこの変更が伝わらない。
オレ様のコードは正しいはずなのに…と、この辺りの書き方をいろいろアレンジしてみたが直らない。で、ドキュメントを読み直していたら、AS2の時とは挙動が変わってた。
新しくsetProperty() や setDirty() メソッドが追加されており、RSOのプロパティ値を変更する場合は基本的には setProperty() メソッドを使うようだ。データがObjectやArrayの場合でその中身だけ変更した場合とかは、setDirty() を明示的に呼び出す必要がある。なので、上記のコードは
so.data['key'].name = value;
so.setDirty('key');とすることで、サーバまで変更が伝わるようになった。
因みに、上で引用しているドキュメントの「setDirty() を呼び出してオブジェクト内の値が変更された日時を示します。」の、最後の「変更された日時を示します」は誤訳っぽい印象。
2008年10月15日
Flash | Flash Playerダウンロードページ
Adobe Flash Player - Downloads
いつもこのページになかなか辿り着けないので今日はメモしておく。
Adobe Flash Player 10 Update for Flash CS4 ProfessionalにDebug版のFlash Player 10も含まれている。
2008年9月26日
Flash | dango
サーバサイドではRubyを使ったFlashとのリアルタイム通信フレームワーク。昨日のFlex勉強会のプレゼンで知りました。
通信はポーリングとかではなくストリーミングで、データフォーマットはJSONとのこと。
データフォーマットはAMF(RubyAMF)を使てみては、とAdobeの外国人から突っ込まれていたけど、確かにフォーマットをJSONとAMFとで選択できるといいかも。
一サーバで100接続くらいはさばけるらしい。複数台でスケールアウトできる仕組みがあれば実用性が高まりそう。
BlazeDSだとFlashから使えないので(何か方法はありそうだけど)、Flashからでも使えるdangoは今後期待大。FMSクローンになれば言うことナシ。
2008年9月22日
Flash | AIRアプリ向けコード署名証明書
グローバルサイン、Adobe AIR向けコードサイニング証明書の提供を開始 | ネット | マイコミジャーナル
先日、あるプロジェクトでも話題に上ったAIRアプリの証明書。価格帯的にはThawteとほぼ同じだけど、国内で対応してもらえるのはありがたい。
数ヶ月前までは大手企業のAIRアプリでもCA発行の証明書による署名はされてないものが多かったけど、最近はきちんと署名されたアプリが増えてきている様子。
基本的に制作会社側ではクライアント企業の電子証明書は取得できないので、AIRアプリの制作を行う場合は、早めにこの点について確認しておく必要がある。
2008年6月 5日
Flash | Flex Builder 3 with Java 6
スタンドアロンのFlex Builder 3をインストールして、そこでプラグイン「Explore it」を使おうと思ったらインストールは出来たけど、動作しなかった。
調べてみると、Flex Builder 3付属のJREはJava 5だった。てっきりもうJava 6が使われてると思い込んでいた。
Flex Builder 3が使うJREをJava 6のものに変えようと前にも書いたやり方を試してみたところ、うまくいかずJava 5が使われたままだった。
Flex Builder 3のショートカットのリンク先を次のように変えるとOKだった。Explore itも動作するようになった。
"C:\Program Files\Adobe\Flex Builder 3\FlexBuilder.exe" -vm "C:\Program Files\Java\jdk1.6.0_05\jre\bin\javaw.exe"
2008年5月15日
Flash | Flash Player 10
Adobe Labs - Flash Player 10 Beta Release Notes
大分大幅な機能強化だ。
File Reference runtime accessは待望の機能。AIRの必要性がひとつ減った感じ。
Dynamic Sound Generationも面白そう。
2008年5月 6日
Flash | AMF仕様書の日本語版
Developer Documentation - BlazeDS - Confluence
いつの間にかAMF仕様書の日本語版が出ていた。が、AMF 3の方は英語のままだ。
Django AMFの開発もしばらくやってないのでそろそろ再開したいが…
忙しいときはやりたいことがいっぱいあるんだけど、いざ時間ができるとダラダラしてしまい何もやらない病はどうしたらいいのだろうか。
とりあえず今月の目標としては、ストリッパーズに野球部(軟式)を創設する。
2008年3月26日
Flash | メタデータタグ
via 中垣 茂 ( Shigeru Nakagaki ) | ブログ ( Flex, AIR, ColdFusion ) | メモ : Flex 3 メタデータ一覧
ちゃんとドキュメントにまとめられてたんですね。いつもタグに指定できるプロパティが分からなくなってしまって調べるのに苦労していたので、これは助かる。
でもまだ他にもメタデータタグはあるよね? ぱっと思いつくのは [SWF] タグ。
Flash | PureRubyなRTMPサーバ
PureRubyなRTMP(MP4/H.264)サーバをオープンソース化しました - takumalog
これはすごいですね。このままRuby製FMSクローンまで育てて欲しいです。
2008年3月20日
Flash | Tweener処理後に対象オブジェクトを削除
Tweener.addTween(aDisplayObject, {alpha:0, onComplete:deleteObject});
function deleteObject():void {
this.removeChild(aDisplayObject);
}上のコードのように、あるDisplayObjectをフェードアウトした後に、それが属しているDisplayObjectContainer(上の場合this)から削除したいのだけど、上のコードだとdeleteObject()が呼ばれた時ににはTweenerがまだaDisplayObjectを何かしてるから削除できないよとエラーになってしまう。
こういうことをしたい場合、どうすればいいのでしょうか? Tweenerに詳しい方、教えてくださいまし。
お礼にSMEの3/30のライブチケットを差し上げます。
2008年3月13日
Flash | AS3のコレクションライブラリ
Javaで言うところのSortedMapのAS3実装が欲しくて探してみたんだけど、このVegasというフレームワークしか見つからなかった。確かにライブラリというよりはフレームワーク。巨大すぎて使う気がそがれる。
必要なクラスだけ抽出して…と思ったけど、継承が深いので面倒くさそう。
今回は自分で実装するとしても、Apache CommonsのCollectionUtilsレベルのコレクションライブラリがあると便利な気がする。標準のArrayとObjectだけでは何かと不便。
Spark projectで作ってくれないかなあ。
2008年3月 5日
Flash | ライブラリのアセットはリフレクションで
今取り組んでいる案件は訳あってFlash CS3でコンパイルしなければならないが、コンテンツはほぼActionScriptオンリーで作成している。ソースはFlex Builder 3のActionScriptプロジェクトとして書いているのだが、Flash CS3でコンパイルするため[Embed]メタタグで画像等の素材を埋め込むことができない。そのため、Flashのライブラリに画像を登録し、リンケージで書き出している。
例えばIconクラスとしてリンケージ書き出したビットマップのシンボルは、ActionScriptの中で扱うときに
var iconData:BitmapData = new Icon(0, 0); var icon:Bitmap = new Bitmap(iconData); addChild(icon);といった感じとなる。
しかし、Flex BuilderからFlashのライブラリは参照できないので、Iconクラスの参照が常にエラーとして表示されてしまう。Flashのライブラリをクラスパスに加える方法はないものなのか。
で、このエラー表示は鬱陶しいなあと思っていた今日この頃だったのだけど、さっきリフレクションでオブジェクトを生成すればいいんじゃんということに気付いた。
var IconClz:Class = getDefinitionByName('Icon') as Class;
var iconData:BitmapData = new IconClz(0, 0) as BitmapData;
var icon:Bitmap = new Bitmap(iconData);
addChild(icon);これでFlex Builderからエラーの表示が消えた。スッキリした。他のエラーにも気付きやすくなったし。
リフレクションでのオブジェクト生成がパフォーマンスにどれ位影響を与えるのか、後で調べてみる。
追記
簡単なパフォーマンステストをしてみた。リフレクションの方が遅いと予想してたけど、僕の環境ではリフレクションで生成しようが、クラスを直接参照して生成しようが実行速度は変わらなかった。
2008年2月29日
Flash | TextFieldの最小限の高さ
TextLineMetrics - Adobe Flex 3リファレンスガイド
TextFieldのheightプロパティを、そのフィールドに含まれるテキストに合わせた最小限のものにしたくて次のようなコードを書いていた。
var textField:Text = new TextField(); textField.wordwrap = true; textField.text = '長いテキストと仮定します。'; textField.height = textField.textHeight;しかし、これだと複数行になる場合に何故か最終行が表示されず困ったことになる。なので、上のコードの最後を
textField.height = textField.textHeight + 5;と、その時の気分に合わせて適当に高さを加えていた。
上記のTextLineMetricsクラスのドキュメントに掲載されている図を見て、このナゾが理解できた。
TextFieldの中のテキストとTextFieldの枠(heightの対象になるもの)の間に上下それぞれ2pxずつのガターがあったのだ。なので、最終行までちゃんと表示させるにはTextFieldの高さはtextHeightの値に少なくとも4pxを加える必要がある。つまり、TextFieldの高さを最小限にするためには次のようなコードになる。
var gutter:int = 2; textField.height = textField.textHeight + gutter * 2;
幅に関しても同じ。すっきりした。
2008年2月27日
Flash | CS3のTextInput、TextAreaコンポーネント
TextArea - ActionScript 3.0 コンポーネントリファレンスガイド
Flash CS3のテキスト入力コンポーネントへの入力を監視してゴニョゴニョやろうと、textInputイベントをlistenしてたんだけど、このイベントオブジェクトのpreventDefault()メソッドを呼んでも何も起こらない。そのまま入力できてしまう。
長時間いろいろ試した挙げ句に最終的にソースを読んでみると、コンポーネントの内部でTextFieldからのtextInputイベントを一度キャッチして、イベントオブジェクトを作り直して再送出していた。このイベントオブジェクトのcancelableプロパティはfalseになっていた。
あれ? cancelableプロパティはtrueってドキュメントに書いてあったじゃんと思って再度見てみると、
cancelable:と書いてあった。確かにウソは書かれていないのだけど。。。ここではfalseに固定されてるんだから、trueの場合のことなんて書くなよ。
true は、preventDefault() メソッドを呼び出して、デフォルトの動作をキャンセルします。
幸いなことにtextInputイベントを再送出している箇所のメソッドがprivateではなかったので、これらのコンポーネントクラスを継承した自前テキスト入力コンポーネントを作って解決。
2008年2月25日
Flash | Red5 0.7.0
Red5 v0.7.0 final 02.23.2008 Open Source Flash
Red5の新バージョンがリリースされていた。今まで0.6.3が出たちょっと後のSVN Trunkバージョンを使っていたけど、これを機に最新にアップグレードしてみたら、既存のプログラムは動かなかった。
Red5はこんなことの繰り返しだ。早く安定して欲しい。
2008年2月20日
Flash | Flex to Flash
Flex(ActionScriptプロジェクト)で開発していたものをFlash CS3環境に移行しなければならなくなった。すぐにできるかと思ったら、結構面倒くさかった。
以下、やったこと。
Embedしていた画像やSWFといったアセット類をFlashのライブラリに移し、リンケージの設定やらコードの修正を行う。
corelibとas3syndicationlibが動かない。というか、componentsフォルダに置いてもこれらのSWCがFlash CS3から認識されない。なので、ソースファイルをクラスパスに加える。が、コンパイルエラー。corelib内のクラスからmxパッケージ配下のクラスへの参照があるため。Flex 3のソースディレクトリをクラスパスに加えてみたが、うまくいかなった。仕方ないので、mx.utils.StringUtilへの参照をcom.adobe.utils.StringUtilに変更。
コンパイルは通ったが今度はas3syndicationlibのDateUtilクラスから例外がスローされる。調べてみたらこのバグ報告と同じ。
対処方法は、このブログエントリーのコメント欄に。DataBase.asをcom.adobe.utilsパッケージに置いて、DateUtilクラス内のDateBaseクラスへの参照をこのcom.adobe.utils.DateBaseに変更する。
これで動くようになった。
corelibやsyndicationlibなどのコアとなるようなライブラリはmxパッケージに依存しないで欲しい。
2008年2月15日
Flash | Wowza H.264サポート
Wowza Media Server Pro H.264 Preview Release
これが正式にサポートされるようになると、FMS 3との機能差は大分縮まる。
2008年2月 9日
Flash | AS3 デコンパイラ
出力されるデコンパイル結果は僕には何だかよく分からないものだけど、クラスに含まれるメソッドやその引数、変数にどんなものがあるのかは読み取れる。
さっきこのデコンパイラの存在を知ったばかりなんだけど、早速これが役に立って、ある問題の回避方法が分かった。これで眠れる。
2008年1月30日
Flash | Commandsライブラリ
fladdict.net blog: AS3で非同期処理を行う為のcommandsライブラリ
すばらしい。SerialCommandクラスがかなり便利そう。後でソースを追ってみよう。
これらのCommand連結を流れるようなインターフェースで実現できればベター。
ちょろっとSerialCommandクラスのソースを見てみたけど、次の関数処理に移る際の条件となるイベントがEvent.COMPLETEに固定されている。デフォルトはCOMPLETEイベントでいいと思うんだけど、Commandを連結する際に他のイベントに設定できるとより便利かも。
2008年1月28日
Flash | Flex UIコンポーネントのcallLater()メソッド
callLater() メソッドの使用 -- Flex 2このメソッドの存在を今更ながら知った。次回のEnterFrameイベント発生時まで処理をペンディングするということか。いちいちイベントリスナーの処理を書かなくていいから便利そう。多用すると危険な気がするけど。callLater() メソッドは、現在の更新ではなく、次の画面更新で実行する処理をキューに格納します。
ActionScriptの関数としても欲しい。自分で書けばいいだけか。
2008年1月23日
Flash | Loaderのイベント
TNSTUDIO blog: AS3_メモ4これはおそらくcompleteイベントではなくinitイベントをlistenするようにすればいいのでは?
ロードした画像にスムージングかけたいのだけども、パブリッシュブレビューだとロードがcompleteしたタイミングで、event.target.contentを参照してもnullになったりしませんか?
loader.contentLoaderInfo.addEventListener(Event.INIT,
function(e:Event):void {
// var loader:Loader = e.target.loader;
var bitmap:Bitmap = loader.content as Bitmap;
}
});試してないけど。
2008年1月16日
Flash | クロスドメインでのリダイレクト
例えば「www.example.com/base.swf」のFlashコンテンツから「before.example.net/cgi-bin/data.cgi」というURLに対してCGIのリクエストを行っているとする。クロスドメインなリクエストになるので、このURLでのCGI呼び出しの前に「before.example.net/crossdomain.xml」が読み込まれる。
さて、今日あるトラブルにより、Flashは何もいじらないまま「before.example.net」へのCGIリクエストを「after.example.net」に転送させる必要があった。そのためまずbefore.example.netのApacheでmod_rewriteを使って全リクエストをafter.example.netにリダイレクトさせるようにした。
ところが、これだと
・Flash → before.example.net/crossdomain.xml →(リダイレクト)→ after.example.net/crossdomain.xml
となり、Flashコンテンツは「after.example.net」に対してリクエストを許可されることになる。つまり、以降の「before.example.net」へのリクエストは許可されていないことになりFlashからリクエストは送信されない。
解決策としては、「before.example.net/crossdomain.xml」は転送しないでそのままFlashに返すようにする。こうすると
・Flash → before.example.net/crossdomain.xml
・Flash → before.example.net/cgi-bin/data.cgi →(リダイレクト)→ after.example.net/cgi-bin/data.cgi
といった望ましい挙動となった。
要するにFlashからのリクエストをリダイレクトする場合、crossdomain.xmlへのリクエストはリダイレクトしてはいけないということ。
2008年1月15日
Flash | URLLoader
AS3であるWebサービスを使用するライブラリを作ろうとしていたところ、いくつか引っかかったポイントがあった。
まず標準APIのURLLoader。そのWebサービスはWSSE認証が必要だったために、HTTPのリクエストヘッダに任意の値をセットできる必要があった。幸いURLLoaderに渡すURLRequestクラスのAPIドキュメントを見ると、requestHeadersプロパティが用意されている。
WSSEヘッダの値の生成は、corelibのWSSEUsernameTokenクラスを使えばOKなので、これでWSSEの認証部分はOKだなと思ったら、ここに第一の罠が。
URLLoaderでリクエストヘッダを付けたリクエストを送っても、そのヘッダが付いていない。検索してみると「URLRequestHeader#requestHeadersが反映されない」というFxUGの投稿が見つかった。同じ症状。
結論から書くと、FxUGで書かれているようなcrossdomain.xmlが云々という問題ではなく、GETリクエストでは任意のリクエストヘッダが付与されないということが分かった。同じリクエストのmethodをPOSTにして適当にPOSTデータを付けてURLLOaderから送信してみるとWSSEヘッダはちゃんと付いていた。おそらくFlash Playerの問題。仕様なのかバグなのかは分からないけど。
じゃあ、GETリクエストで任意のリクエストヘッダが付けられるURLLoaderをSocket使って自作するしかないのかと思っていたところ、次の記事を見つけた。
HTTP Authentication for HTTP/GET requests using ActionScript 3上と同じことが書いてあります。で、この人はHTTPURLLoaderクラスというURLLoaderではできない機能を持つものを作って公開してくれてます。基本的なインターフェースはURLLoaderと同じなので、クラス名をHTTPURLLoaderに差し替えるだけで使える。I was not able to set the header of a HTTP/GET request. Macromedia Flash Player allows you set the header only for POST requests.
このお陰でGETリクエストでもWSSEヘッダを付けられるようになりました。
WSSE認証ができたら、次はPOSTメソッドでXMLデータを送受信する機能の実装。POSTリクエストなら標準のURLLoaderで問題ないなと思ったら、ここにもまた罠が。
何が悪いのか分からなかったのだけど、何度やってもレスポンスのXMLが受け取れない。COMPLETEイベントを受け取る前に、「Error #2032: ストリームエラー」で中断されてしまう。Proxyソフトで正しいXMLレスポンスが返ってきているところまでは確認できているのだが。
URLLoaderは使わずにHTTPURLLoaderクラスを使うかと思って、試してみたところHTTPURLLoaderクラスはPOSTメソッドに対応していなかった。あちらを立てればこちらが立たず。なかなかうまくはいきません。
HTTPURLLoaderに手を入れてPOSTに対応させるかとごちゃごちゃいじってたんだけど思い通りにいかず、最終的に行き着いたのがas3httpclientのSocketURLLoader。HTTPURLLoaderと同じ人が作ってます。もっと早くに気付いていれば。。
このSocketURLLoaderクラスを使うと、POST結果のXMLレスポンスもちゃんと受け取れるようになって、万事解決。前にも書いたHTTPステータスも受け取れるみたい。すばらしい。
2007年12月 4日
Flash | Flash Media Server 3
アドビ、H.264対応のFlash Player、Media Serverをリリース - @IT
同時接続数や帯域の制限がなくてこの値段なら、前のバージョンに比べてかなりリーズナブル。
アップグレード価格は用意されてないのかな。
2007年11月 9日
Flash | ライブストリーミングサーバ
糸柳和法のオッパイぷるるん☆放送局 - 各種 RTMP サーバーでのライブストリーミングの実現
FMS / Wowza / Red5 それぞれを使ってのライブストリーミング検証記事。オリジン/エッジサーバ方式のクラスタリング構成での検証も。これは必読。
そんなにクライアントが多くないマルチユーザアプリならRed5で特に問題なく動いているけど、負荷が掛かる状況や動画ストリーミングとなると怪しいところが出てくるのかも知れない。
Wowzaの動作検証をまだやってないけど、余裕ができ次第やってみないと。
2007年11月 1日
Flash | onEnterFrameループ
今日学んだこと。
画面表示の裏でonEnterFrameループを使って重たい処理を分割実行するときは、毎フレームではなく数フレームに1回の割合で処理を実行するようにして画面表示処理への影響を抑える。
2007年10月19日
Flash | JIS X 0213文字セットへの対応
[231260]環境依存文字を入力すると文字化けする(Flash CS3)
Flashコンテンツの中のテキストフィールドにWindows VistaからJIS X 0213で追加された文字を入力しようとすると文字化けするというトラブルが発覚し、こちらで調べた限り対処法が分からなかったので、先日AdobeのFlash Playerテクニカルサポートに問い合わせを送った。問い合わせの翌日、Flashでは環境依存文字はサポートされておりませんと、上記URLを添えて返答があった。
上記サポートデータベースの内容はFlash CS3のものだがFlash Playerにも当てはまるみたい。ただ、Flashコンテンツ上にテキストフィールドに直接入力しすると文字化けするけど、コピペすると入力できるし(フォントがちょっとおかしいが)、サーバから取得した環境依存文字を表示する分には問題ない。次期バージョンでサポートされることを期待。
2007年10月18日
Flash | Flash CS3のアイコンパネル
Flash CS3に備わっている各種パネルのドッキング機能とアイコン化機能は、ステージやスクリプトエディタを広く使いたい場合にすこぶる便利。なんだけど、「アイコンパネルを自動的に折りたたむ」ようにしている時、アイコンパネルを開いたままFlash以外のアプリケーションに切り替えると、Windowsのタスクバーが点滅してしまうのが難点。
何とかできないものか。
Flash CS3にはまだまだ便利機能がありそうなんだけど、全然使えていない気がする。
2007年9月14日
Flash | MXPファイル作成
・Flash | MXP ファイルの作り方
・Flash CS3用コンポーネントの作り方
・mxpファイルの作成方法
・add some Extension Manager
2007年9月13日
Flash | 続・Remoting Classes for Flash CS3
フリーランス時代にトーサキと仕事したとき、Flash Remotingを使うと関数を呼び出してレスポンスを取得するまでのprogressが取れないのが気になる点として挙げられた。
あれから3年半。ActionScript 3になって、ようやくこの機能を実現できる目処が付いた。
以前に、Strippers Remoting ClassesというFlash 9からAMFを使ったRPC呼び出しを行うクラスを作ったけど、これはflash.net.NetConnectionを使って実装していた。NetConnectionクラスを使えばAMFプロトコル自体は全く意識しなくてもいいのだが、AMFに含まれる細かい情報を扱えないため、Django AMFの独自機能を実装する上で障害になっていた。
で、ここ数日ちょっと余裕ができたので、AMF <-> ByteArrayを相互変換できるようにし、flash.net.URLLoaderを使ってサーバとやりとりするように作り直している。ByteArrayクラス自体にオブジェクトのAMFシリアラズ/ディシリアライズメソッドが備わっているので、AMFメッセージの構造さえ知っていれば比較的容易に実装できる。URLLoaderクラスを使えばProgressイベントが取れるため、前述の機能が実現できるようになった。
サーバから受け取ったAMFメッセージのバイナリデータを自分でパースするので、NetConnectionクラスやFlexのRemoteObjectクラスでは取れなかったAMFのヘッダを自在に扱うことができるようにもなった。
このAMFヘッダをHTTPヘッダのように扱えば、前に考えていたキャッシュ的な機能を実現できるかも知れない。
Flash | FlashでHTTPステータス
HTTPStatusEvent - Adobe Flex™ 2 リファレンスガイドURLLoaderクラスでサーバから受け取ったレスポンスのHTTPステータスコードを参照しようとしたら、常にゼロ。どういうわけだ?と思ってAPIドキュメントを調べてみたら、ちゃんと書いてありました。HTTP ステータスコードをプレーヤーに渡すことができないブラウザで実行される Flash Player プラグインでは、常に値 0 が生成されます。該当するブラウザには、Netscape、Mozilla、Safari、Opera、および Internet Explorer for the Macintosh があります。
って、Win IE以外の主要ブラウザではHTTPステータス取得できないじゃん。HTTPステータス取得は諦めるしかないか。
URLLoaderじゃなくてSocket使ってHTTPプロトコルを実装すればできるのかな? JavaのCommons HTTPClientやCommons NetみたいなライブラリはまだAS3では存在しない?
2007年9月12日
Flash | AMF Predefined Headers
Predefined headers | Open Source Flash
このページは見過ごしていた。あとRemoting EnvelopeとDebug informationのページも。
これらのページを読んでDjango AMFではいくつかAMFの解釈を間違ってた部分があることに気付いたので、直してリリースした。
定義済みヘッダのうち、RequestPersistentHeaderは独自機能を実装する上で重要そう。「This is implemented in mx.remoting.Connection.」とあるけど、flash.net.NetConnectionでもサポートされているのかどうか調べなければ。
DjangoではURLにくっつけるタイプのセッションIDをサポートしていないのでDjango AMFでAppendToGatewayUrlヘッダは意味がなさそうだけど、AMFPHPはこのヘッダの機能を使ってたんだなということが分かった。
ReplaceGatewayUrlヘッダは、ゲートウェイURLのリダイレクト機能ってことか。何かに使えるかな?
2007年9月10日
Flash | Hessian
Hessian now available to Adobe Flash developers
もうWatchしている人は相当少なくなったであろうCaucho Technology。Scottというエンジニアがほぼ1人でServletコンテナのResinを開発し、勢い余ってEJBやらORMやらを独自仕様でスピーディーに開発しちゃって、果てはPHPまでResinに載っけちゃうもう何でもアリな有様。Tomcatがバージョン3とか4とかいまいちな感じの時は、僕もResinのライセンス買って使っていました。独自仕様とは言っても、いつもNice!な感じで機能を拡張していて僕は大好きでした。オープンソースでありながら有償というスタイルも好きでした。しかしながら、今はもう使ってないのですが。
Resinについては、過去に一度WEB+DB PRESSにResin記事を書いているおかもと氏のWikiにまとめられてます。
そんな時代を突っ走るCauchoからFlash絡みのプレスリリースが。HessianとはWebサービスのバイナリプロトコルで、簡単に言っちゃえばAMFのようなもの。結構昔からHessianの名前だけは聞いていたので、もう仕様としては落ち着いたものになっていると思われます。AMFと比べて効率がいいのかどうか分かりませんが、いろんな言語での実装が揃っているので遊んでみると楽しいかも知れません。ざっとAPIを見たところ、認証に関するものがないのでお堅いアプリへの実戦投入は難しいかも知れません。
Python実装もあるので、余裕がある時にDjango AMFをHessianに置き換えて、Flashと連携させてみたいと思います。
[追記]
と思って少しいじってみたけど、Pythonのhessianlib.pyはクライアント用のライブラリだった。メッセージヘッダやメソッド名の抽出などサーバ側で必要となるパース処理は自分で作らなければならない。面倒。
2007年9月 7日
Flash | Flash Media Server 3
Flashcomguru.com: Adobe Announces Flash Media Server 3
詳しくはこっちのPDFに。FM3FAQ.pdf
H.264のサポートや、RTMPEプロトコル導入によるコンテンツプロテクション等、実直なアップデート。Serverside ActionScriptの拡張がなかったのは残念。
「Mobile video delivery to Flash Lite 3」という項目があったけど、FMS3ではなくFlash LiteがRTMPプロトコルに対応しただけじゃないのか? Flash Lite 3搭載携帯とか登場したら、オンデマンドビデオサービスを自由に作れてしまうわけだ。
気になった機能は「Server-side re-Publish」と、次のリダイレクト機能。
Will FMS3 support a solution similar to HTTP-302 redirect?この機能はどうやって実現されているのだろう。FMS3というよりFlash Player側の拡張のように思うけど。Red5やWowzaでも対応して欲しい。
Yes, this will be a new feature of FMS3 to support advanced load balancing and smart redirection.
2007年9月 4日
Flash, Python | Django与Flash的結合
DjangoFlash - Woodpecker.org.cn Wiki for CPUG
via 常山日記
Django AMFについて中国語で書かれたページ。
2007年8月31日
Flash, Python | Django AMF 0.5.1でやること
- AMF0でUNDEFINED型のサポート。
- amf.RemotingServiceクラスでFaultイベントが返ってきた場合に例外をスローするようにする。
- gettextへの対応。
1番目のはもう実装済み。3番目のgettextモジュールは使ったことがないので、これから調べてみないと。
あー、なるほど。Djangoで国際化機能がサポートされているのか。
追記 2007/9/3
全部対応した。しばらく様子を見てリリース。
2007年8月30日
Flash, Python | Django AMF 0.5リリース
先日告知した機能を実装したDjango AMF 0.5をリリースしました。
AMFのRPCサービスメソッドを実行するだけなら、Flash/Flexよりも簡単にできる手段だと思います。S2Flex2、AMFPHP、WebORB、RubyAMF、そして純正Flash Remoting MXと、サーバ側のプロダクトが何であろうと関係はありません。ちゃちゃっとネットワーク越しにサービスメソッドを実行したい場合に便利かも知れませんよと。
まずは日本語ドキュメントは書きました。
・Django AMF
・amf.RemotingServiceクラス リファレンス
2007年8月23日
Flash | Wowza Media Server
Adobeの元社員が立ち上げた会社が開発しているFlash Media Serversの代替プロダクト。FMSに比べて圧倒的に安い価格。5,000ドルで無制限ライセンスが買える。
オープンソースのRed5と同様にJavaで作られている。なのでサーバサイドのプログラムもServerside ActionScriptではなく、Javaで開発できる。
まだフリー版も試していないけど、Red5よりも安定しているならお金払ってでもこっちの方がいいかも知れない。有償製品なのでサポートもあるし。
今後Red5と共に追っていこう。
2007年7月16日
Flash | 覚え方
trick7.com blog: Flashやってる人があやふやにしがちなことあー、コレすごく分かる。僕も「リステナー」と呟きながらタイプします。listener を書く時に、頭の中でリステナーと思い描く人(3)、口に出しちゃう人(1)
中学校の時、消しゴムのeraserを「イラセアー」と覚えてました。「影」という漢字は、先生が黒板に書いた時にクラスの誰かが「ひきょうさん(日京三)」と叫んだせいで、今でもそう覚えてます。太陽が昇る方角はバカボンの歌の逆と覚えているため、いちいち冒頭の歌詞を歌わなければ思い出せません。
2007年6月18日
Flash | WebORB for PHP 2.0
WebORB Blog: WebORB for PHP status update
WebORB for PHP 2.0が今月末にリリース予定だそう。.Net版WebORBと同様のサービスブラウザ等の管理コンソールを搭載してくるらしい。
Django AMFでも管理画面的なものは作りたいが、さてどうしよう。
それよりもRTMP経由でのRPCをパースする実装を作りたいなあ。
2007年6月12日
Flash | Red5 for Flash Player 9 Update 3
Flex 3 betaと合わせてリリースされたFlash Player betaにアップグレードしたらRed5にRTMPで接続できなくなってしまった。という報告が昨夜MLに流れ、さあ大変ということになったのだが、今朝には問題がFixしていた。
というわけで、今はRed5の0.6.1よりもtrunkを使った方がいいです。
ついでにRemotingを使うんなら僕のパッチを当てた方がいいです。というか当てないとまともに動かないと思うんだけどなあ。僕の環境が何かおかしいのか?
2007年5月29日
Flash | Red5評価中
現在あるプロジェクトで使うためにRed5を評価中。特に問題なければ、FMSではなくRed5を使う予定。
が、Red5のRemoting周り、AMFのデコードで致命的な問題を発見。Red5の該当箇所のコードをDjango AMFのコードと比較し、AMFのデコードで間違ってそうな箇所を捜す。幸いバグが分かって簡単に直すことができた。
バグ報告してパッチを送ったら、即効で取り込まれた。直面したバグをとりあえず回避するコードだったんだけど、ちゃんとチェックしてるんだろうかと心配になる程の早さだった。
http://jira.red5.org/browse/APPSERVER-146
http://jira.red5.org/browse/APPSERVER-147
勝手な想像だけど、Red5はRTMP実装と比較してAMF実装にはそんなに力を入れてないと思うので、まだAMF周りにはバグはありそう。
案の定(?)、上記のパッチだけではAMFのバグが修正しきれていなかった。
なのでもう1つパッチを送付したが、こいつのコードは怪しいと思われたのか今度はなかなか取り込まれない。
http://jira.red5.org/browse/APPSERVER-151
2007年5月16日
Flash | Flexでメール投稿フォームを作成したい
Flexでメール投稿フォームを作成したい | フォーラム - Flex User Group
ここにもコメントをくださっていたsuamaさんによる別ドメイン下のリモートSMTPサーバを使用する方法についての投稿。
crossdomain.xmlで許可していても25番ポートを使おうとするとエラーになるそうです。僕も「crossdomain.xmlで指定すれば、1024番以下のポートでもSocket通信が可能だと思っていた」ので意外でした。
Flash | Custom Component for FlashCS3
AKABANA - Custom Component for FlashCS3
arkwさんによるFlexで作ったSWCライブラリをFlash CS3で使う方法の解説記事です。
なるほど、Componentsディレクトリの下に任意のディレクトリを作れば、それがコンポーネントパネルのツリー表示フォルダとして認識されるんですね。知りませんでした。
ライブラリやコンポーネントパネルからコンポーネントをステージ上にドラッグ&ドロップした時に、(Flash 8用とかの)Adobe純正Remotingコンポーネントのようにアイコンを表示したいのだけど、それが分からないんですよね。あと、コンポーネントインスペクタからプロパティを設定できるようにするには、どうすればいいのか。
と書いておけば、また解説していただけるのではないかと淡い期待を抱いてます。「明日やろうは馬鹿野郎」なので、きっとすぐに。
2007年5月15日
Flash | ASファイルをソースパスルートに配置
AKABANA - global function like AS2 for AS3
package宣言なしでルートに配置したASファイルの関数はimport宣言ナシ、つまりトップレベル関数として使えるらしい。
裏技っぽいけど、理論的に考えるとそうなりますな。
2007年5月12日
Flash | Remoting Classes for Flash CS3 ActionScript 3.0
Flash CS3用のRemotingコンポーネントはまだ出ていないけど、それっぽいクラスライブラリをFlex2用に作っていたので、Flash CS3で動くようにmxパッケージのクラスを使わないように書き直しました。Flash CS3でもFlex 2でも使えます。
Strippers Remoting Classes 1.0-beta
これでFlash CS3からもDjango AMFを使えますよ。
使い方は、Flash8までのFlash Remotingコンポーネントと同じような感じです。
import jp.strippers.remoting.*;
import flash.net.Responder;
var gatewayUrl:String = "http://127.0.0.1/gateway/";
var serviceName:String = "addressBookService";
var serviceFactory:ServiceFactory = ServiceFactory.getInstance(gatewayUrl);
var service:RemotingService = serviceFactory.getService(serviceName);
// service.connection.setCredentials("username", "password"); 認証が必要な場合
var pc:PendingCall = service.getCards(); // リモーティングメソッドの呼び出し
pc.responder = new Responder(onResult, onFault);
/** サーバからの戻り値が引数に渡されます。 */
function onResult(results:Array):void {
// 結果を処理する
}
function onFault(fault:Object):void {
trace(fault.description);
}
コンポーネントとしてSWC化したいのだけど、Flash用のコンポーネントの作り方が分かりません。。。
2007年5月10日
Flash | ozacc-mail library for AS3 1.0-beta
ozacc-mail library for AS3 1.0-beta
こんなところでもちょいと触れられているOML for AS3ですが、β版をリリースするのをすっかり忘れていました。POPサーバからのメール受信機能もサポートしました。
コード例
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:oml="http://www.ozacc.com/library/oml" layout="absolute">
<mx:Script>
<![CDATA[
private function receive():void {
var delete:Boolean = false;
fetchMail.getMails(delete);
}
private function onMailReceived(event:MailEvent):void {
trace(e.mail); // 受信したメールをトレース
}
]]>
</mx:Script>
<oml:FetchMail id="fetchMail" host="POPサーバ名" username="ユーザ名" password="パスワード" mailReceived="onMailReceived" />
<mx:Button label="受信" click="receive()" />
</mx:Application>
MailクラスのAPIも少し変わっています。α版ではJava風にMail#setForm()とかgetFrom()とかアクセスメソッドを用意してたけど、ActionScript風に
var mail:Mail = new Mail();
mail.from = new InternetAddress("amechang@example.com", "あめちゃん");
mail.subject = "エサの件";
mail.text = "もっと食べたい。";というようにプロパティアクセスの形式にしました。
せっかくなので、ちょっと高度なActionScript3講座。メールヘッダに含まれるBエンコードされた文字列をデコードするメソッドを解説します。
public static function bDecode(str:String):String {
return str.replace(/=\?([\w\-]+)\?B\?([a-zA-Z0-9=\+]+)\?=/ig, decodeBase64);
}
private static function decodeBase64():String {
var decoder:Base64Decoder = new Base64Decoder();
decoder.decode(arguments[2]);
var ba:ByteArray = decoder.flush();
return ba.readMultiByte(ba.length, arguments[1]);
}このコードで解説すべき点は二つ。
1つ目は、文字列置換の方法。ここではbDecode()メソッドの中のString#replace()メソッドに正規表現でパターンを指定し、第二引数にdecodeBase64関数を指定しています。パターンに一致した文字列はこの関数からの戻り値に置換されます。
またこの関数の中では正規表現パターンでマッチした文字列がグループ毎に納められた配列であるargumentsグローバル変数にアクセスできます。
正規表現パターンの最後に指定しているフラグも重要です。これは文字列の中に複数一致するパターンが表れたら、その一致する文字列すべてをdecodeBase64で処理するということです。
2つ目。Base64文字列のデコード方法。Base64Decoder#decode("Base64文字列")でBase64Decoderインスタンスの中にデコードされた文字列ができました。それをflush()でByteArrayとして取得し、ByteArray#readMultiByte(ba.length, "文字コード")でFlashPlayerが扱えるUTF8の文字列に変換しています。
メールヘッダではBエンコードの他にQエンコードというエンコード方式も希に使われます。今ではほとんど見かけませんが。
OML for AS3ではQデコードができません。QデコードのAS3コード書ける人がいたら、是非教えてください。
2007年4月28日
Flash | ネームスペースを使ったイベント監視
川o・-・)<2nd life - ActionScript3 でネームスペース使ったキーイベント監視ユーティリティ作りました
via BeInteractive!
スバラシイですね。ネームスペースを使ったイベントハンドラー関数定義のやり方は目から鱗。ちょっと感動しました。
proxyでしかネームスペースを使ったことないので、AS3のネームスペースちゃんと理解してないんだけど、今作っているライブラリもこの方式が適用できないか考えてみよう。
FlexBuilderのライブラリプロジェクトはやっぱりちょっと不便ですよね。僕もyossyさんと同じく、ライブラリプロジェクトとテスト用のプロジェクトの二本立てです。
2007年4月23日
Flash | FlexBuilder with Java 6
前にJava 6でmxmlcのコンパイルが速くなってると書いたけど、mxmlcとFlexBuilderのJVM設定は別だということに先日気がついた。
FlexBuilder(スタンドアロン版)をインストールしている場合、インストール先/Flex Builder 2/Flex SDK 2/bin/jvm.config にmxmlcが使うJVMの設定を行うファイルがある。デフォルトではJAVA_HOME環境変数を見るので、JAVA_HOMEがJava 6を指していればいい。
FlexBuilderに付属しているJREのバージョンは1.4。これを変更するには、インストール先/Flex Builder 2/FlexBuilder.ini に
-vm C:\path\to\Java\jdk1.6.0\jre\bin\javaw.exeという行を加えればよい。FlexBuilderの起動が速くなりました。
2007年4月18日
Flash | Flash CS3のAPIリファレンス
ActionScript 3.0 Language and Components Reference
Flash CS3のAPIリファレンス。やっぱりmxパッケージは入らないわけだ。
2007年4月 4日
Flash, Python | Django AMF 0.4.1
一日でバージョンアップ。認証システムとしてDjangoのユーザ認証機能をそのまま使える関数を追加しました。かなりオシャレな仕上がりになりました。 http://sourceforge.jp/projects/djangoamf/
ActionScript側でDjangoユーザアカウントのユーザ名とパスワードをセットして、パーミッション制限が掛かっているRPCメソッドを呼び出せば、勝手に認証・ログインを行い、そのセッションクッキーをセットしてくれます。ユーザがDjangoのスーパーユーザーならば、存在するすべてのパーミッションに対して有効になります。
自分で認証の処理とか書かなくていいので、この楽チンっぷりはやばいよ。
var service:RemotingService = new RemotingService();
# アクセスユーザのユーザ名とパスワードを設定します。
service.setCredentials("username", "password");
service.do_something();・settings.py# 設定ファイルに次の一行を加える。 AMF_AUTH_FUNC = 'amf.django.authenticate'・sample/view.py
from amf.django import permission_required
# このview関数を実行するのに必要なパーミッションを
# デコレータの引数に指定します。
@permission_required('add_user')
def do_something(request):
return 'This function can be invoked by authenticated user.'ここまでやったら @login_required デコレータもサポートしたいなあ。
2007年4月 3日
Flash, Python | Django AMF 0.4
先月末からいくつかリリースが続いてますが、今度はDjango AMFの新バージョン。ようやく認証システムを実装しました。これで実際のお仕事にも使っていただけると思います。
http://sourceforge.jp/projects/djangoamf/
Djangoのユーザ認証システムをDjango AMFでもそのまま使おうかと思ったのだけど、もっと柔軟にできるような仕組みにしました。したつもりです。
まだドキュメントをWikiにまとめてないのだけど、コードにするとこんな感じ。
var service:RemotingService = new RemotingService();
# アクセスユーザのユーザ名とパスワードを設定します。
service.setCredentials("username", "password");
service.do_something();・settings.py# 設定ファイルにアクセスユーザのパーミッションを取得する # 関数を指定します。文字列または関数オブジェクト。 AMF_AUTH_FUNC = 'sample.views._get_user_perms'・sample/view.py
from amf.django import permission_required
# このview関数を実行するのに必要なパーミッションを
# デコレータの引数に指定します。
@permission_required('admin')
def do_something(request):
return 'This function can be invoked by admin user.'
def _get_user_perms(request, username, password):
"""
settings.pyで指定した関数。Django AMFが認証時に実行します。
指定されたusernameとpasswordから、ユーザが所持している
パーミッション(ロール)の文字列を返します。
複数パーミッションを所持している場合はリストかタプルで返します。
"""
if username == 'username' and password == 'password':
return 'admin'
return None認証に失敗するとFlashにはFaultEventが返ります。FaultEvent#typeの値は「AMFAuthenticatinError」、#codeの値は「401」です。
次のバージョンではDjangoの認証システムをそのまま使える便利関数を提供する予定です。
2007年3月30日
Flash | ozacc-mail library for AS3 1.0-alpha
ozacc-mail library for AS3 1.0-alpha
結局テキストメールの送信のみをサポートしてリリース。ソースはまた後日。とりあえずswcファイルだけ。
ActionScriptのコード例
// SendMailオブジェクトの生成
var sendMail:SendMailImpl = new SendMailImpl("SMTPサーバ名");
sendMail.connectionTimeout = 5000;
// イベントリスナーの登録
sendMail.addEventListener(MailEvent.MAIL_SENT, function(e:MailEvent):void {
Alert.show("メールを送信しました。");
trace(e.mail); // 送信したメールを取得
});
sendMail.addEventListener(MailEvent.MAIL_ERROR, function(e:MailEvent):void {
Alert.show("何かエラー");
trace(e.mail); // 送信できなかったメールを取得
});
sendMail.addEventListener(NetEvent.CONNECTION_TIMEOUT, function(e:NetEvent):void {
Alert.show("接続タイムアウト");
}
// 送信するメールの作成
var mail:Mail = new Mail();
mail.addTo(new InternetAddress("amechang@example.com", "あめちゃん"));
mail.setFrom(new InternetAddress("aiai@example.com", "アイアイ"));
mail.setSubject("メールの件名");
mail.setText("メールの本文");
// メールの送信
sendMail.send(mail);
MXMLタグでSendMailを定義する場合のコード例
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:oml="http://www.ozacc.com/library/oml" layout="absolute">
<mx:Script>
<![CDATA[
private function send():void {
var mail:Mail = new Mail();
// 送信するメールの生成 (省略)
sendMail.send(mail);
}
private function onMailSent(event:MailEvent):void {
Alert.show("メールを送信しました。");
trace(e.mail); // 送信したメールを取得
}
private function onMailError(event:MailEvent):void {
Alert.show("何かエラー。");
trace(e.mail); // 送信できなかったメールを取得
}
]]>
</mx:Script>
<oml:SendMail id="sendMail" host="SMTPサーバ名" mailSent="onMailSent" mailError="onMailError" />
<mx:Button label="送信" click="send()" />
</mx:Application>
2007年3月29日
Flash | GUIのmxmlc
Tanablog: mxmlc の GUI 版アプリケーション
スタイルシートだけサクッとコンパイルしたい時とかに便利ですね。まあ、mxmlcの起動は遅いのでサクッとはいかないんですが。
まだリリースされたばかりのバージョン0.1ですが、起動の度にmxmlcのパスを指定しなければいけないのが面倒なので、時期バージョンで対応に期待です。
2007年3月28日
Flash | Apolloでメール
ozacc-mail library for AS3を使ったサンプルアプリケーションをApolloで作ってみました。
OMLの受信機能がまだ完全ではないので、まずは送信フォームだけです。サンプルなので起動の度にSMTPサーバの設定をしなければいけません。SMTP認証には対応していません。
(もしPOPサーバの設定をすることになったら、パスワードとかのデータはどこにどういう形式で保存すべきなんだろう?)
メールの差出人や宛先欄には「amechang@example.com <あめちゃん>」といった具合に「メールアドレス <名前>」のフォーマットで指定できます。メールアドレスだけでも可です。
メールの送信に関しては、Apolloのセキュリティ関係がまだよく分からないけど、自分の環境で試した限りは外のSMTPサーバに繋ぐのも問題ありませんでした。
インストールしたPCに対してファイルアクセスはしませんのでご安心を。
アプリケーションにはオシャレにフランス語で名前を付けました。「Expediteur」と言います。意味はまんまメーラー。何て読むのか分かりませんが、大学の時に第二外国語でフランス語をやっていたトーサキに訊いてみたところ「イクスピディトゥ」みたいな感じでした。合ってるかどうか分かりません。
まだアプリケーションのアイコンはないです。
そんなApolloアプリですが、試してみたい方は以下のURLからインストールを。
Expediteur.air
2007年3月26日
Flash | Spark project
BeInteractive! [Spark project 本格運営開始!]
スバラシイ! さすが未踏プロジェクトです。
AOContainerを早速テストしてみました。ページに掲載されているファーストステップをやっただけですが。SpringやSeasarでおなじみのDIコンテナなので、結果に対して今更物珍しくも何ともないのだけど、ActionScriptで実現できることについてはやはり新鮮です。
ただ、設定XMLがスクリプトの中に入るというのは、違和感を覚えるところ。ただ、この設定を外から読み込もうと思うと、その設定ファイルをどこに置くかという非常に悩ましいことになるので仕方ないんですが。設定スクリプト内で実装クラス宣言をコードに埋め込む必要があるのもあまり動的な感じがせず、これならプログラムでオブジェクトを生成してグローバル領域に置いた連想配列クラスに突っ込んでおいてもいいような気がします。
DIコンテナとしてはRSLを扱えるようにならないと。
と、JavaのDIコンテナに慣れた身としてはつい比較してしまうけど、ASでDIコンテナは個人的には待ってましたと言わんばかりのものなので、AS3Unitと合わせて今後活用してきたいと思います。
OML for AS3を使う上でもDIコンテナがあれば、設定と実行コードを切り分けられるのでいいかも知れない。
Flash | ozacc-mail library for AS3 もうすぐ
今週中にリリース予定。テキストメールの送信はもう出来てるんだけど、受信したメールヘッダの日本語変換処理で引っかかってます。FetchMail(受信)については未完成でも、とりあえず出そうと思います。
Apolloでメーラーが作れちゃいます。SMTPサーバに直接繋ぐので、CGIとか作る必要無しです。
今後は、ファイル添付メールの送信も出来るようにするつもりです。Apolloで導入されたFileや、ByteArrayをそのまま送れるように。
APIはJava版と大体同じものを用意しているので、Java版のOMLを使ったことがある人なら馴染みがあると思います。非同期なので、イベント処理が多少必要になります。
2007年3月19日
Flash | Apollo Runtime ファーストインプレション
Apollo Runtimeを早速インストールして、サンプルアプリをいくつか実行してみました。
RuntimeもApolloアプリケーションもインストールは楽チンです。アプリケーションはWindowsの場合、C:\Documents and Settings\username\Program Files\Adobeというディレクトリ下にアプリケーション毎にディレクトリが作成されています。アンインストールはコントロールパネルの「プログラムの追加と削除」からできます。
exeファイルがそのまま起動するので、見た目はデスクトップアプリと何ら変わりありません。
Alphaリリース一発目なのでいろいろとあって当然なんですが、今の段階で気付いたネガティブ面。リリースノートを含めドキュメントを何も読んでないですが。
- Fresh(RSSリーダー)はFlexコンポーネントで作られているのかな? ツリーメニューなどのアニメーションがもっさりでぎこちない。
- Scoutを使って分かったけど、まだFlashPlayerがApollo内のブラウザに備わってない。
- 日本語フォントの表示が変。
2007年1月31日
Flash | Amfphp 1.9 beta 2
5 1/2 blog � Amfphp 1.9 beta 2 - ridiculously faster
AMF3をサポートしたAMFPHP 1.9の新しいベータ版ではえらく速くなってるらしい。PHPネイティブではなく、Cで書いたAMFのエンコーダとデコーダを使っているとのこと。そしてもう一点、ブラウザがgzip圧縮をサポートしている場合、サーバからの戻りデータを圧縮しているとのこと。
後者の圧縮についてはDjango AMFの場合、django.middleware.gzip.GZipMiddlewareをMiddleware設定に加えるだけで実現できるので、Django AMF自体では何もする必要はない。が、ドキュメントには記載しておいた方がよさそう。
2007年1月23日
Flash | 文字列からクラス取得
X-LABO: AS3 パッケージ記述簡略化知らなかった。いろいろと使えそう。
flash.utils.getDefinitionByNameを用いると 文字列からクラスを取得できるようです。
2007年1月10日
Flash | AMFキャッシュ
Flash Remotingによる(AMFを使った)リモートサービスの呼び出しでは、HTTPヘッダによるキャッシュは利用できない。だから、滅多に更新されないデータを返すリモートサービスでも実行する度にサーバとの間でデータのやりとりが発生し、無駄なコストが生じてしまう。この辺りはAjaxでも同じなのかな?
Flashに返すAMFMessageオブジェクトを生成したら、現在日時とリクエストURLやメソッドパラメータをキーにして、オブジェクトをキャッシュする。で、HTTPレスポンスヘッダにLast-Modifiedヘッダを追加する。
FlashPlayerからのリクエストを送るときにHTTPヘッダにIf-Modified-Sinceヘッダを付けてくれるのか分からないけど、もし付けてくれるならその値を取得する。もし付けてくれないならAMFメッセージのヘッダに付けるようにして、その値を取得する。
で、そのリクエスト内容をキャッシュのキーと比較して、キャッシュ内容が更新されていなければ、データは返さず何か特別なレスポンス(AMFのエラーレスポンスを利用してもいいかも)を返す。Flash側はそのレスポンスを受け、以前に取得しているデータを再利用する。
If-Modified-Sinceヘッダがなかったり、キャッシュの内容が新しければ、キャッシュしているAMFMessageオブジェクトを返す。これでDBアクセスなどのコストも減らせるかも知れない。
以上のようなちょっと複雑な処理をサーバサイドのAMF実装とActionScriptのライブラリで吸収し、容易にAMFキャッシュが使えるAPIを提供する。というアイデアが先日浮かんだ。
2007年1月 8日
Flash | ServiceCapture vs Charles
AMF3の実装をやっているとき、HTTPモニターツールのServiceCaptureを使用した。HTTPの通信内容をモニターできるツールはいくつかあるけど、ServiceCaptureはAMFの内容を解析して表示してくれる。AMFの他にもXML、SOAP、JSONにも対応しているとのことなので、Ajaxアプリ開発でも便利そう。
Javaで稼働するのだけど、Java 6を使っていたせいかUIの動作も軽く、AMFやXMLを使用するFlashアプリ開発では今後マストツールになりそう。こちらは使用期間が15日で、1ライセンス35ドル。
ServiceCaptureと同様AMF解析機能付きHTTPモニターツールとして、Charlesというソフトもある(ロゴマークは何故に壺?)。こちらは今日になって初めて使ってみたのだけど、AMFの解析表示がServiceCaptureより詳細だった。また、レスポンスのバイナリデータをHex表示できるので、Charlesを先に使っていればAMF3実装作業がもう少し効率的にできたかも。
Charlesは使用期間が30日で、1ライセンス50ドル。ServiceCaptureと同様にJavaで動作する。使用期間中はやたらとスプラッシュスクリーンが表示されるので、いらつく。
AMFの解析に関して言えば、Charlesの方が高機能。が、普通にFlash/Flexアプリを開発する人にとってはそこまでAMFの詳細が必要になるケースは滅多にないと思う。UIはServiceCaptureの方がシンプルで使いやすかったし、パフォーマンスもServiceCaptureの方が若干いいように感じた。
なので、普段使う(?)にはServiceCaptureがいいと思うのだけど、僕の場合にはCharlesの方がいいのかなあ。ライセンス費が激高ってわけでもないので、両方のライセンスを大人買いするか(会社の経費で)。
2007年1月 7日
Flash | AMF3
Open Source Flash - amf3:index
Django AMFのために、ActionScript 3.0で導入されたAMF3メッセージフォーマットのPython実装を行っていたのだが、ほぼ完了してリリースの見込みが立った。
AMF3の公式な仕様は公開されていないが、バイナリデータを解析した先人が上記のページで公開してくれている。
仕様を読んでもよく分からなかったが、最終的に実装してみてAMF3が効率的にデータを取り扱い、データ量を減らしていることがよく理解できた。
例えば、["アイアイ", "アイアイ"] という同じ文字列を含む配列の場合、["アイアイ", #0] というように既出の文字列は参照番号に置き換えられて出力される。
また、[["アイアイ", "アイアイ"], ["アイアイ", "アイアイ"]] という二次元配列の場合は、[["アイアイ", #0], ##0] と、文字列の参照に加え、既出の配列オブジェクトも参照に置き換えられる。配列型、日付型など数値型以外のデータはオブジェクト参照の対象となる。
さらにクラスオブジェクトの場合は、クラス定義(クラス名、クラスメンバーとして定義されているプロパティ名の配列)が先に出力され、以降に表れる同じクラスのオブジェクトはクラス定義への参照番号とプロパティの値だけが出力される。
このようにAMF3は文字列参照、オブジェクト参照、クラス定義参照を使って重複するデータを省き、データ量や解析コストを減らす仕組みを備えている。シンプルな仕組みなので、AMF3へのシリアライズ(AMF3からのディシリアライズ)にもコストが掛からないよく考えられたフォーマットだ。
お陰で実装するのは面倒だったけど。
2006年12月13日
Flash | Java 5とActionScript 3の構文比較
Flash Player 9/ActionScript3.0/Flex2の勉強日記 - Java 5 と ActionScript 3 の構文比較
こういう比較表は一方のプログラムに慣れ親しんでいると他方の文法を理解するのに便利。
ActionScriptは変数の型宣言が後ろにくる形に未だに慣れないけど、AS3になってE4Xや正規表現が言語に組み込まれ、言語仕様としては今までに僕が使ってきた言語の中では最も気に入ったものになっている。
AS3でサーバサイドのプログラムも書ければなあ。
2006年11月 7日
Flash | AVM組み込みブラウザ
アドビ、モジラにActionScript Virtual Machineのコードを寄贈へ - CNET JapanMozilla Foundationでエグゼクティブディレクターを務めるFrank Hecker氏によれば、将来的に同ソフトウェアはFirefoxに組み込まれる計画で、2008年前半には実現される見通しだという。
昔からAdobe(Macromedia)はFlashプラグインではなく、Flashを組み込んだブラウザそのものを作ればいいジャンと思っていたのだけど、それに近いことがFirefoxで実現されるのかも知れない。
2006年10月30日
2006年10月20日
Flash | Apollo Runtime
Apolloについて大きな勘違いしていのだけど、ApolloはmProjectorのようにOSネイティブの実行ファイルを作るためのものではなく、Java Virtual Machineみたいな実行環境だったんだね。
いずれApollo2Exeみたいなソフトが登場することでしょう。予言しておきます。
2006年10月16日
Flash | Flexアプリ
Flex2を使って作ったアプリケーションを先週末初めてリリースした。いわゆる管理サイト的なものなので、一般の目には触れないけど。
これをHTML+Ajaxで作れって言われたら、かなりしんどいと言うかやりたくないので、リッチ(?)なU/Iを簡単に実現するのであれば、Flexは有効だと思った。
ただ、標準コンポーネントのモッサリ感というか重さというかその辺りがいまいちなので、軽快な処理を実現したいのであればHTML+Ajaxの方がいいかも知れない。
最初は慣れないのでmain.mxmlに全部のスクリプトを書いてしまってて、途中からこのままじゃイカンと思い、スクリプトを各コンポーネントに分散。AdobeのFlexサンプルサイトのソースを見たりして、開発の後半では勝手が掴めてきて、それなりに綺麗な構造で作れるようになった。少しずつノウハウを溜めていかないとね。
UIコンポーネントを使う場合、スタイルを調整しただけくらいではいかにもFlexで作りました感が出てしまうので、デザインコンシャス(!!)なサイトを作るのであれば、UIコンポーネントやそのスキンを自作しないとダメかな。
2006年10月 2日
Flash | 可変長引数
ステートメント、 キーワード、ディレクティブ - Adobe Flex™ 2 リファレンスガイドあるメソッドがパラメータはカンマ区切りの値のリストを受け付けますが、Array クラスのインスタンスとは異なります。
... restで受けた引数を一旦Arrayとして保持し、他のメソッドの... rest引数に渡そうとしたのだけど、ダメだってことが分かった。可変長引数とはこういうものなのか。
その後、ふと思いついて可変長配列を引数に取るメソッドをFunction.apply(Object, Array)で実行してみたところ、引数のArrayが自動的に可変長配列に展開されるのか、うまくいった。
2006年9月28日
Flash | Remotingでファイルアップロードしたいのに
Flash 8からFileReferenceクラスを用いてファイルアップロードができるようになったけど、Flash Remoting経由でのアップロードができないため、いつも面倒くさいことになっている。
例えばブログエントリーを画像付きで投稿するとなると、
- Remoting経由でタイトルや本文を送信。
- サーバでエントリーを保存して、エントリーIDを返す。
- AS3の場合、URLRequest.dataにエントリーIDをセットして、ファイルをアップロード。
- サーバでファイルを保存。
セキュリティ確保のために、FileReferenceの用途が限定され過ぎてるんだよなあ。FileReferenceにdataプロパティ(選択したファイルのバイナリデータ)とpathプロパティ(選択したファイルのローカルファイルパス)があれば便利になるのに。
例えば、ローカルファイルにアクセスしようとした場合、都度確認を求めるダイアログが出て、ユーザに選択を委ねるようにすればいいんじゃないかな。怪しいサイトの場合は許可しなければいい。この仕組みがないと、勝手にPC上のファイルが怪しいサイトにアップロードされてしまうから。
Apolloではきっとローカルファイルへのアクセスができるようになるんだろうけど。
あとさ、FileReference.browse()で出てくるファイル選択ダイアログがOS標準のものと違って使いにくいよね。せめてダイアログサイズを可変にして欲しい。今のじゃ小さくて、ディレクトリの中のファイルを探すのが大変。
2006年9月 7日
Flash | Flex 2 with AMFPHP
既存のPHP WebアプリからAMF0でやりとりをするFlexプログラムを作成中。いくつか学んだことをメモ。
AMF0でAMFPHPを使用するには、
NetConnection#objectEncoding = ObjectEncoding.AMF0を指定して、サーバに接続する。で、「サービスクラス.メソッド名」、Responderインスタンス、サービスメソッドに渡す引数をいくつでも、の3つ引数を
NetConnection#call() メソッドに渡す。
Flashの
Connection#setCredentials(username, password)に直接該当するメソッドはないが、
NetConnection#addHeader("Credentials", false, {userid: username, password: password})を呼べばOK。
Responderインスタンスで指定した2つのコールバック関数の引数は、Flashだと ResultEvent、FaultEvent だったが、Flexの場合はサーバからの返り値がそのまま渡される。
AMFPHPが_explicitType という名前で返している型情報がFlexだと取得できない。なくなっている。
Flex2とAMF0 とAMFPHP : nod::ぶろぐ::RIA::Flash/Flex/Ajaxとあるので、型情報を取得する方法があるのかも知れない。Flex2.0当初(アルファ版?)の頃は、AMF0で接続すると、JavaからAS3に変換する際に型情報が失われるということがありました。(Release版である現在のバージョンのものはできるそうです。
2006年9月 6日
Flash | Flex embedタグ
AKABANA - embedタグ②MEMO。[Embed(source='test.xml', mimeType='application/octet-stream')]
private static const Xml:Class;このようにすれば、バイナリデータを埋めれるみたいです。
そして、Xmlというクラスは、ByteArray型を継承したクラスになるみたいです。
2006年9月 5日
Flash | FlashLite2.0対応携帯
あれれ?どうやらauの秋端末からFlashLite2.0対応っぽい (CODE THE FUTURE -未来をデザインせよ-)
FlashLite2.0対応携帯がようやくAUから。これで大抵のFlashアプリが携帯で動かせるようになるはず。でも、XMLのパースなんかを携帯のCPUにやらせて大丈夫なのかな? すぐにバッテリーがなくなりそう。
P702IDを買ったばかりだけど、DoCoMoが903でFlashLite2.0に対応しなかったら、AUに乗り換えてもいいかな。
Flash | Flex 2 日本語ドキュメント
Adobe - Flex : Flex ドキュメンテーション
日本語ドキュメントがアップされてた。気付かなかった。
Flex Builderの発売日が9月下旬に延期されてた。
2006年9月 2日
Flash | Flashでmod_deflate圧縮コンテンツを受け取れない 2
先日、IE上のFlashでmod_deflate圧縮が掛かったXMLを読み込めないというエントリーを書いたけど、ようやく原因が分かった。
Apacheからのレスポンスヘッダに「Content-Encoding: gzip」ヘッダと「Cache-Control: no-cache」ヘッダが含まれているとこの現象が発生した。XMLコンテンツをキャッシュさせないためにこのヘッダを入れていたのだけど、外してみたら解決した。
他にブラウザキャッシュを抑制するHTTPヘッダに「Pragma」と「Expires」があるが、これらは入っていても問題なかった。
Cache-Controlヘッダがないとプロキシでキャッシュされてしまうのかな? でもExpriresヘッダで過去日時を指定しておけば実質的にキャッシュされない? プロキシ依存なのかも知れないけど、この辺の挙動がよく分からない。
2006年8月21日
Flash | 同一のDisplayObjectインスタンスは複数同時に表示できない
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()">
<mx:Script>
<![CDATA[
import mx.controls.Label;
public function init():void {
var l:Label = new Label();
l.text = "text";
box.addChild(l);
box.addChild(l); // RangeError: Error #2006: 指定したインデックスが境界外です。
}
]]>
</mx:Script>
<mx:VBox id="box" />
</mx:Application>Flexでこのようなコードを書くと、boxの中に2つの「text」が縦に並びそうだけど、実際にはランタイムエラーが発生する。「インデックスが境界外」って、インデックスは指定してないのに、とハマってしまった。その後、いろいろ実験してみて、DisplayObjectContainerには同一インスタンスを2つ以上追加できないようになっていることが分かった。よくよく調べてみると、
Class DisplayObjectContainer - addChild() methodと、ドキュメントに出ていた。
If you add a child object that already has a different display object container as a parent, the object is removed from the child list of the other display object container.
つまり、DisplayObjectContainerに同一インタンスの重複登録ができないのではなく、登録される側のDisplayObjectが親(所属)コンテナを一つしか持てないということだった。納得。
だけど、例えば同じ画像を複数表示したい場合は、Imageオブジェクトを複数作らないといけない。clone()メソッドを実装したサブクラスを作ってしまえばいいと思うのだけど、プロパティを全部コピーするコードを書くのが面倒。BeanUtils#copyProperties(Object, Object)的なライブラリはないかな?
Flash | Flex内にiframe埋め込み
Deitte.com: Finally Updated: Embedding HTML in a Flex application using an IFrame
これは使えそう。
Flash | ResizeEffectの基点
Resize - Adobe Flex 2 Language Reference
Flex2のResizeEffectクラスには、リサイズの基点を指定するためのプロパティがないんだな。常にDisplayObjectの左上を基点に拡大縮小が行われてしまう。RotateEffectクラスの方にはoriginX、originYプロパティで基点を指定できるのに。
サブクラスを作ってプロパティを加えるか。mxパッケージのソースってどこかにインストールされてるのか?
2006年8月18日
Flash | Flashでmod_deflate圧縮コンテンツを受け取れない
FlashからXMLを取得する際、Apacheがmod_deflateでXMLを圧縮している場合に、IEだと正常に動作しない症状に悩まされている。mod_deflateを外せばちゃんと動くし、mod_deflateが有効な場合でもFirefoxだと問題なく動作し、またIEでも生のXMLを取得する分には問題ない。
IEとFlashPlayer間でXMLを受け渡しするときに何らか問題が発生していると推測しているのだけど、mod_deflateで圧縮されたコンテンツの解凍はブラウザが行い、解凍されたコンテンツがFlashPlayer Pluginに渡されているはずだよね? なら、mod_deflateの有無に関わらずFlashPlayerは正常にXMLを読み込めていいはずなのだが。
う~む・・・
2006年8月11日
2006年8月 7日
2006年7月26日
2006年7月19日
Flash | AS3 メタデータの使い方が分からない
AS3ではメタデータが使えるらしいのだけど、その使い方が分からない。「Programming ActionScript 3.0」にもメタデータの文法的なことについては何も載っておらず、[Embed]メタタグが突然出てくるだけ。nodさんのエントリーを参考に、あるクラスの中で
[ArrayElementType("jp.strippers.mail.InternetAddress")]
private var toAddresses:Array;
public function addTo(address:InternetAddress):void {
toAddresses.push("stringだよ");
}と、要素の型をInternetAddressに指定したつもりの配列にStringを突っ込むよう書いてみたけど、コンパイルエラーは起きなかったし、実行時にもこの部分ではエラーは発生しなかった。MXMLでこのスクリプトを使用するときにだけ意味があるのかな?
Flash | AS3 メールヘッダをエンコード
できた!package jp.strippers.mail {
import flash.utils.ByteArray;
import mx.utils.Base64Encoder;
public class MailUtil {
private static const B_ENCODE_PREFIX:String = "=?ISO-2022-JP?B?";
private static const B_ENCODE_SUFIX:String = "?=";
private static const DEFAULT_CHARSET:String = "iso-2022-jp";
public static function encodeHeader(str:String):String {
var sb:String = new String();
var nonAscii:String = new String();
for (var i:uint = 0; i < str.length; i++) {
var charCode:Number = str.charCodeAt(i);
if (0x20 <= charCode && charCode <= 0x7e) {
if (nonAscii.length > 0) {
sb += bEncode(nonAscii);
nonAscii = "";
}
sb += String.fromCharCode(charCode);
} else {
nonAscii += String.fromCharCode(charCode);
}
}
if (nonAscii.length > 0) {
sb += bEncode(nonAscii);
}
return sb;
}
public static function bEncode(str:String):String {
var ba:ByteArray = new ByteArray();
ba.writeMultiByte(str, DEFAULT_CHARSET);
var encoder:Base64Encoder = new Base64Encoder();
encoder.encodeBytes(ba);
return B_ENCODE_PREFIX + encoder.flush() + B_ENCODE_SUFIX
}
}
}ポイントとしては、ドキュメントにないBase64Encoderクラスを使うところと、文字コードの変換にByteArrayクラスを使っているところ。ところで、AS3にはJavaで言うところのStringBufferクラスがないので、Stringをバンバン結合するしかないみたい。corelibのソースに
var sb:String = new String(); というStringBufferを模しているようなコードが含まれていたので、真似してみた。追記: 少なくともbeta2まではStringBufferクラスは存在していた様子。akihiro kamijo: StringBuilder クラス
Flash | AS3 Codec
日本語のテキストメールを送るには、次の2つのエンコードが必要になる。- 本文の文字コードをJISにする
- ヘッダ内の日本語をJISにした上で、MIMEエンコードする
問題は後者。AS3版のCommonsCodecみたいなユーティリティクラスが公開されてないかな?
Thunderbirdで確認する限り、「Subject: 件名」みたいにMIMEエンコードせずにモロに日本語をヘッダに入れてても問題ないのだけどねえ・・・ Flex2 Language Referenceには何故か載っていないけど、mx.utils.Base64Encoder、mx.utils.Base64Decoderというクラスが存在してた。
で、次のコードで文字列をJISに変換してMIME Bエンコードを施すことができた。
function encode(str:String):String {
var ba:ByteArray = new ByteArray();
ba.writeMultiByte(str, "iso-2022-jp");
var encoder:Base64Encoder = new Base64Encoder();
encoder.encodeBytes(ba);
return encoder.flush();
}戻り値の文字列の前後を「=?ISO-2022-JP?B?」と「"?="」で括ってやればOK。あとは、文字列の日本語のみにこのエンコードを適用するようにできればヘッダのMIMEエンコードはバッチリだ。
2006年7月18日
Flash | AS3 corelib DateUtil
DateUtil - corelib ActionScript 3 API Reference
メールのDateヘッダで使用する日付フォーマットは、RFC822で定められたものでなければいけないのだけど、このフォーマットでの文字列出力はDateクラスのメソッドでは用意されていない。
面倒くさいけど自分でフォーマット変換クラスを作るかと思っていた矢先、AS3のcorelibでDateUtil#toRFC822()というそのまんまのメソッドが提供されていることを発見。ラッキー。
試してみたら、タイムゾーンは常に「GMT」になった。
Flash | AS3のイベントリスナー
昔、ActionScript 2.0が発表されたときにECMAScriptをそのまま採用したことに不満を書いたことがあるけど、今回のAS3で敢えて標準仕様のDOMイベントモデルにまんま準拠しなかったのがイベントリスナー。
DOMイベントモデルでは、EventListenerインターフェースを実装したクラスのインスタンスをイベントリスナーとして登録しなければいけないけど、AS3でのイベントリスナーはFunctionのみなので、実装の手間を大幅に減らすことができる。
AS2でもいちいちリスナーFunctionを定義したオブジェクトを作って登録しなければいけないクラスがあったので、そういうのがなくし、イベントリスナーのモデルをシンプルにした点は評価したい。
個人的にはエラーイベントのハンドリングで次のような機構が実装されて欲しかった。
例えばErrorEventのサブクラスであるAsyncErrorEventをディスパッチするクラスに、addEventListener(ErrorEvent.ERROR, handleError)とErrorEventタイプを登録しておけば、全てのエラーイベントをキャッチしてくれるような機構。try...catch(e:Error)のイベント版。
Flash | OML for AS3
「Programming ActionScript 3.0」を8割方読み終わった。新機能の実装する練習として、いくつかプログラムを作っているのだけど、ozacc-mail libraryのAS3版を実装中。JavaMailに相当するようなライブラリはないので、AS3のSMTPクライアントはもうどこかで公開されているのかも知れないけど、SMTPクライアントから自作することにした。
Socketクラスを使ったSMTPクライアントはほぼ完成し、きちんとヘッダがセットされていないメールを送れるところまではできた。SMTPサーバに接続する上でのセキュリティを考えると、実践ではなかなか使いづらいだろうけど、サーバプログラム無しでSWFから直接メールを送信できる手軽さはイイ。
ところで、本来SMTPコマンド「HELO」のパラメータとしてSMTPクライアントのFQDNを渡すのだけど、AS3では実行マシンのホスト名を取得する手段がない(と思われる)。Javaで言うところの「InetAddress.getLocalHost().getHostName()」。まあ、この値は所詮テキトーでいいんだけどさ。
2006年6月29日
Flash | ファイルアップロードで2回サーバにアクセス (2回目)
Flash/flexでのファイルアップロードに関するTechNote(FileReference API):nod::ぶろぐ::RIA::Flash/Flex/Ajax以前に「ファイルアップロードで2回サーバにアクセス」というエントリーを書いたけど、Flash Player 9で挙動が変わったようです。ややこしい。Flash Player 8は10kb以上のファイルをアップロードをする際は、0サイズで一度接続テストをするとのことです。
Flash Playerが2度ファイルアップロード先に指定されたURLにアクセスすることになります。アクション先に指定されたアップロード用プログラムでは、Content-lengthをみて適切に処理する必要があるということですね。Flash Player 9は、オプション扱いで設定により接続テストをするように変更されたとのこと。
デフォルトはしない(=false)になっているので、設定しないかぎりは2度アクセスされることはないようです。
2006年6月 1日
Flash | AMFPHP 1.2.5
CHANGELOG 1.2.5 - Fixed issue with getClassPath - Fixed MethodTable not recognizing encapsulated variables - Modified ServiceBrowser for private/public methods - Fixed bug in class loader for class name finding with packages - Added correct typing for AdoDB with MySQL databases1.2.5で結構メジャーな不具合が修正された。
ストリッパーズでは1.2.1をベースに独自にバグ修正して機能追加したカスタマイズバージョンのAMFPHPを使っているのだけど、新しいバージョンの内容をマージするのが難しくなってきた。
せめてAMFPHPのCVSが公開されていればいいのだけど、今SFで公開されているCVSはもう使われてないみたい。うーん。
2006年4月21日
Flash | ファイルアップロードで2回サーバにアクセス
前回のエントリーに引き続き、FileReferenceクラスでのファイルアップロードの問題。FileReference#upload(url)メソッドを実行すると引数で渡しているURLに何故か二度アクセスしている。一度目はファイルデータは送信しておらず、2度目で送信している。
これに関して検索してみたけど、次のBlog記事しか見つけられなかった。
http://blog.hybrid-style.com/archives/2006/01/filereferenceup.html
困ったことにはならないようにサーバサイドのプログラムを作ればいいだけなんだけど、このFlash(FlashPlayer)の仕様はスッキリしない。フガフガ。
Flash | ファイルアップロードでエラーを通知するには
Flash 8からFileReferenceクラスを使ってファイルのアップロードが出来るようになったけど、初めてこの機能を使うことになり、APIドキュメントを調べてみた。HTMLフォームと同じようなことができる(他のテキストフィールド等の値と一緒にファイルアップロードできる)のかと思っていたら、全く違っていた。FileReference#upload(url)メソッドを使って、ファイルだけを送信する仕組みだった。
例えば画像ファイル付きでブログエントリーをアップしようと思ったら、まずファイル以外のデータをサーバに送信し、サーバでそのデータに対して一意のIDを割り振る。そしてそのIDをFlashに戻し、FlashではそのIDをパラメータとして持つURLに対しファイルをアップロード。サーバではIDからブログエントリーとアップロードされた画像ファイルを関連づけるという手順が必要になる。結構面倒くさい。
今問題になっているのが、サーバでファイルを受け取って、例えば画像ファイルではなかったからNG、みたいな結果をFlashに返したい場合、サーバからの戻り値をFlashで受け取る手段が用意されていないこと。
onCompleteリスナーが用意されているけど、サーバからの戻り値は受け取れない。onHTTPErrorリスナーがあるので、何らかのエラーをサーバから返す場合は404等のHTTPステータスを返すしかなさそうだ。
むぅ、FileReferenceは使いにくいなあ。
FLASH-JP.COMのフォーラムにもありました。
ファイルアップロードのエラー原因を知ることはできるでしょうか
2006年4月10日
Flash | SE|PY with SVN
SE|PY, the editor, the blog [HowTo: Configure SVN on Windows]
最近になってようやくストリッパーズスタッフの間でSubversionを使用してくれるようになった。以前からtracは使っていたので、これでタスクとソースを並行して管理できる。
ActionScriptエディタのSE|PY 1.5系にSVN連携機能(厳密にはTortoiseSVNとの連携)が付いていることに気がついた。SE|PY内のプロジェクトブラウザ(Workspace Panel)で直接ファイルをコミットしたり更新したりできる。日本語もちゃんと通りました。
但し、SE|PYのプロジェクトファイル(sxmlファイル)を編集して保存すると、xmlのエンコーディングが「cp932」と書き出されてしまい、再度そのsxmlファイルを開こうとすると、対応してないエンコーディングエラーになってしまいます。その場合はsxmlファイルを他のエディタで開いて、頭のエンコーディングをutf-8に書き直せばOK。でも面倒だ・・・
2006年4月 6日
2006年4月 5日
Flash | AMFPHP
今携わっているプロジェクトでAMFPHPを使っているのだけど、以前に使用したOpenAMFより大分便利。ただ、PHPにはdate型が標準では備わっていないために、AMFPHPではFlash Dateクラス <-> PHP float型の変換が自動ではできない(設定が必要)。そこが不便なので、PEARのDateクラスとFlash Dateクラスを自動変換できるように修正してみた。これで更に便利に。
こういう仕組みはどうよ?とAMFPHPのフォーラムに投げてみたのだけど、あまりにも変な英語すぎるせいか相手にもされない。。。
あと、PDOを使ったS2Daoのライト版みたいなものも作っています。S2Dao.PHP使えばいいんだけどさ。久しぶりのPHPの勉強も兼ねて。
Javaで言うところのThreadLocal的な仕組みを利用するには、$GLOBALSを使うしかないのかな?
2005年11月 2日
2005年10月20日
Flash | FlashVars変数がSWFに渡らない
HTMLからSWFに変数を渡そうとFlashVarsを使っていたのだけど、FirefoxやSafariでは変数がSWFに渡らずundefinedになってしまう。(IEではOK)
で、手探りで解決法を探っていたのだが、<param>や<embed>要素のflashvars属性名が小文字になっていたのを「FlashVars」とキャピタライズしたらうまくいくようになった。
XML(XHTML)的には属性名に大文字が入るのはいいんだっけ?
2005年10月19日
2005年10月 8日
Flash | プログレッシブJPEG
Macromedia - Flash TechNote : fl0271 - プログレッシブ JPEG 画像を動的に読み込めない
特定のJPEG画像をSWFで表示できないバグに見舞われて、ボスに訊いてみたら、「プログレッシブJPEGが原因じゃない?」と一言。調べてみたら、ズバリその通りでした。こんなのは常識?
上のページではFlash Player 7以下ではNGと書いてあるけど、Flash Player 8では読み込めるのかな? もしそうでも8が普及するまでにはまだ時間掛かりそうなので、サーバ側でプログレッシブJPEGをそうじゃないJPEGに変換するようにしなければ。どうやったらプログレッシブを判定できるのだろう。メタデータとして何か埋め込まれいるのかな。要調査。
2005年10月 6日
2005年8月31日
2005年7月31日
2005年7月27日
2005年7月14日
2005年7月13日
Flash | Flash Player 8 ベータ版
Macromedia - Flash Player : Macromedia Flash Player Public Beta
ようやく登場。メインマシンにはインストールしにくいので、ノートPCの方に入れてみようかな。触れ込み通りパフォーマンスが劇的アップしているのか!?
Flash Playerのバージョン切り替えを簡単に行えるユーティリティソフトってないかな。
2005年3月20日
2005年1月16日
Flash | Maven Repo Search | Flash Edition 1.0-SNAPSHOT
Maven Repo Search | Flash Edition
基本形はできた。Backボタンとか付けちゃうあたり、まだHTMLベースWebアプリの考え方が抜けていない。ラベルを含めてU/Iをもうちょっと作りこまないと。
データグリッドの描画が遅い。コードの改善でパフォーマンスを上げられるのだろうか。もしかすると、この辺は時期Flashプレーヤーに期待するしかないのかも知れない。
このカート機能のおかげで、dependenciesタグの作成は今までより楽になると思う。今までは一個ずつ検索してコピペしていくしかなかったから。Mevenideにこういった機能が含まれればベストなんだけどなあ。
ご意見、ご要望があれば伺います。
2005年1月14日
Flash | データバインディング
Maven Repo Search | Flash Edition
作りかけなんだけどアップしてみた。すごいね、データバインディング機能って。XMLConnectorとDataSet、DataGridを使ってみたんだけど、今までスクリプト書いてたのは何だったんだ!?と衝撃を受けました。僕はVBやDelphiを使ったことがないんだけど、こんな感じで楽にプログラミングができてしまうものなの? もしそうなら、ひたすらコード書くのと比べて生産性は格段に上がるね。
で、上のMaven Repo Search Flash。repositoryカラムで、文字数が多くて冒頭しか表示されてないのだけど、これはWindowsのU/Iみたいにカーソルを合わせればツールチップで値を表示することはできないのでしょうか? ご存知の方がいましたら教えてください。
因みにMaven Repo Searchは、「http://maven.ozacc.com/search?keyword=seasar&type=all&format=xml」のようにformatパラメータに"xml"を指定すればXMLで結果を受け取れます。Eclipse PluginはこのXML結果を使用しています。
2005年1月 7日
Flash | Flash Remoing FaultクラスとJava例外クラス
久しぶりに仕事でFlash Remotingを使った。ちょうど一年ぶり。堅苦しくなったと思っていたFlash Remoting AS2だけど、使ってみると以前のバージョンより勝手がいい。
サーバ側はOpenAMF 1.0 RC10。特にハマった点はなかったけど、mx.rpc.Faultクラスの各プロパティに、Javaの例外クラスのどのプロパティが該当するのか分からなかったので、サクッと調べてみた。
- faultcode
- "SERVER.PROCESSING"という値。よく分からん。
- faultstring
- Exception.getMessage()の例外メッセージ
- description
- 例外メッセージ (faultstringと同じ)
- detail
- 例外のスタックトレース
- type
- 例外クラスのFQDN
2005年1月 5日
Flash | XPath4AS2
XPath4AS2MEMO。XPath4AS2 is an ActionScript 2 library to add XPath functionality to Flash.
2005年1月 4日
Flash | Central SDKをインストールしたら
Flash MX 2004にCentralのSDK拡張をインストールしたら、Flash起動時に
*** XML 解析エラー ***というエラーが出るようになった。ググってもスペイン語と中国語の情報しか出てこず、解決方法がわからない。folder属性を加えたとしても値に何を入れればいいんだ!?
C:\Documents and Settings\user\Local Settings\Application Data\Macromedia\Flash MX 2004\ja\Configuration\ActionsPanel\CustomActions\CentralAppAPI.xml:
行 478:tiptext エレメントに folder 属性が見つかりません
<folder index="true" id="Types" name="Types" version="6">
Flash | MTASC - AS2 クラスコンパイラ
Motion-Twin ActionScript2 Compiler
オープンソースのAS2クラスコンパイラ。Flashなしでも、このツールだけあれば、クラスのSWFが生成できる。ワンダフル!!
早速ダウンロードして試してみました。AS2のクラス.asファイルを-headerオプションを付けて実行。ホントにSWFファイルが出来上がりました。SWFを解析してみたところ、AS1のコードに全て置き換えられていました。
これで、クラス単体のSWFを簡単に作れるようになったわけだ。
早速MLにも申し込んでみたけど、誰かが不具合報告すると即行で直してCVSにアップしてる。これは今後の機能拡張に期待できるプロダクトかも。
Flash | Using the Tween and Transition Classes in Flash MX 2004
Macromedia - Developer Center : Using the Tween and Transition Classes in Flash MX 2004
Macromedia純正のTweenクラスとTransitionクラスの使い方。写真が怖い。
2005年1月 3日
Flash | Simon Wacker
simonwacker.com - Weblog | About | Projects | Portfolio
as2lib作者のBlog。やばいよ、この人。AS2でAOP Frameworkを作ってる。
2004年12月14日
Flash | Flasm
no|wrap.de - FlasmMEMO。Flasm disassembles your entire SWF including all the timelines and events. Looking at disassembly, you learn how the Flash compiler works, which improves your ActionScript skills. You can also do some optimizations on the disassembled code by hand or adjust the code as you wish. Flasm then applies your changes to the original SWF, replacing original actions.
2004年12月13日
Flash | SEPYのメニューを日本語化
なるほど、スバラシイ。最新版との組み合わせだと"Search"メニューが加わっているので、それ用の項目を足さないとダメだけど、XMLファイル見れば簡単です。
SEPYは有料になってもいいから、日本語の読込/書込をきちんとサポートしてくれないかな。
2004年11月25日
Flash | AS Development Tool
SourceForge.net: Project Info - AS Development Tool (asdt)MEMO。A plugin for the popular Eclipse platform to work with ActionScript 2 files. It should provide such features like code coloring, code folding, code completion, outlining, refactoring ...
2004年11月24日
Flash | Flash Remoting for AS2
ほそかわさんの日記を見ながら、AS2用のFlash Remotingに触れてみた。いや、もう大混乱。今年の初めの頃は、Flash Remoting + OpenAMF + Springでブイブイ言わせてた(?)のに、クラスが変わってたりして分からなくなった。ほそかわさんも書いているけど、AS2 APIが適用されて堅苦しくなってしまった感もあるなあ。
所々ヘルプがブランクページなんだけど、うちだけ!?
追記
と思って、ヘルプのソースを調べてみました。(ヘルプはHTMLなので)
<html>原因は、このmetaタグの位置です。文字コードの指定がタイトルより後に位置しているため、タイトルの日本語の文字コードがブラウザで解釈できないときにブランクページになっています。
<head>
<title>Flash Remoting の ActionScript の使用の概要</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script language="JavaScript" src="../../_sharedassets/pages.js"></script>
</head>
ヘルプのHTMLに対して一括置き換えかければよさそう。
2004年11月 2日
Flash | #includeで読み込む外部asのコメント
#include "external.as"
外部のActionScriptファイルにコメントが入っていると読み込めないんだが、いつからこんな仕様になった?
2004年10月24日
Flash | 久々のFlash
半年ぶりくらいに仕事でFlashをいじった。もう何かいろいろと忘れてる。プレビュー(Ctrl+Enter)しようとして、Ctrl+F11を押したりして、Eclipseと混ざってる。
使いたいメソッドもすぐに出てこず、ヘルプを調べながらだったので、やたら時間が掛かった。
途中うっかり無限ループの処理を作ってしまい、プレビューしたらフリーズ。保存していなかったので作り直し、なんて悲しい事態も。
久しぶりにActionScriptを書くと新鮮で面白い。でもEclipse + Javaに慣れてると、もっと高度なIDEが欲しいところだ。
2004年9月 5日
Flash | イベントの委譲 (Delegateクラス)
FN0408001 - イベントの委譲 - Flash : テクニカルノート7.2から追加されたDelegateクラスについて。後で読むべし。Delegateクラスをスクリプトやクラスにimportすると、イベントを特定のスコープと関数に委譲(delegate)することができます。
うぉー、地震だー。
2004年8月28日
Flash | 7.2
Macromedia - Flash MX 2004 : Flash MX 2004 7.2 アップデータ
早速入れてみた。起動時間はかなり短くなった。あとの改善点はまだ実感するに至ってないけど、起動時間の短縮だけでもアップデートの価値はある。
2004年8月26日
Flash | OnEnterFrameBeacon
darron schall: A hidden gem... or two
FLASH OOPを読み始め、OnEnterFrameBeaconクラスの存在を知り、ちょっと感動する。
夏も終わりだね。
2004年8月23日
2004年7月31日
Flash | KineticFusion 2.0
Kinesis Software - Home of KineticFusion
大幅に機能強化して、コマーシャルソフトになって登場。それでもサポート付きで$300ちょっと。Flexと比べられる代物ではないが、価格だけ見ると激安。
今後サーバ・コンポーネントがリリースされるらしいけど、それがどういう形になるのか。目が離せない一品。ということで、MLを購読。
Flash | Mkulu QA Proxy
QA Proxyvia blog.keitap.comMkulu QA Proxy is used to view the details of HTTP packets. It is a useful tool for web development and testing. Work is ongoing to increase the tool's functionality. The proxy is able to parse the binary AMF protocol used by Macromedia Flash Remoting.
MEMO。
2004年7月11日
Flash | OpenAMF 1.0RC7
最近使う機会がなかったので追ってなかったOpenAMF。いつの間にか1.0RC7までリリースされていた。upgraded Jakarta Commons Logging from 1.0.3 to 1.0.4
improved handling for java.lang.Number parameters
improved handling for shorts, integers, floats, and doubles
added javadocs to the org.openamf.DefaultGateway class
added javadocs to the org.openamf.AdvancedGateway class
improved method: SessionControlInvoker.supports
improved method: PageableResultSetServiceInvoker.supports
Springもそうだったけど、ReleaseCandidateになってからが長いよね。って言うか、RCになって初めて本格的な開発が始まってるように思える。
Commons Loggingが1.0.4になっていることにも今日気がついた。
2004年7月 1日
Flash | LocalData class
MEMO。To ease the pain of storing data locally, you can use my custom LocalData class, which wraps the funtionality of the SharedObject class into two easy-to-use methods: save() and load().
2004年6月29日
2004年6月20日
Flash | クロージャ
データと関数をひとまとめにしてカプセル化したものを、 クロージャといいます。
これは、オブジェクト指向でいうところのオブジェクトと機能的には同じですが、クラスを明示的に宣言したりする必要がない分気軽に使うことが出来ます。データとコードの結びつきは、クラスを定義して生成したオブジェクトよりも強いくらいです。
「クロージャ」って単語を初めて目にした。英語にすると「closure」?
2004年6月17日
2004年6月 2日
Flash | KineticFusion
MEMO。KineticFusion
swf と XMLを相互に変換するJAVAベースのアプリ。SWFはMacromediaから仕様が公開されているので、色々とSWF生成ツールが作られているのだけど、これはSWFからXMLを生成し、それをXMLベースで修正してSWFに戻すことができます。これを使えばサーバ上で動的にSWFを生成することも可能だと思われます。
2004年6月 1日
Book, Flash | FLASH OOP - ActionScriptによるオブジェクト指向プログラミング
持ってるだけで満足しちゃう位の名著な予感。
誰かのAmazonアフィリエイトリンクを使って注文してみよう。一件でいくらになるのか知らんけど。
2004年5月31日
2004年4月20日
2004年4月14日
Flash | MXMLをクライアントで
Flexが出たときに、友人がこのような技術について話していた。Flash MXの成果物もMXMLにして、Flash Player側でMXMLを解釈して実行できるようになれば、サーバ側で動的にMXMLを生成するのは容易なので、いろいろと面白そうなことが出来るはず、と。Flex は MXML ActionScript 2.0 でかかれているテキストファイルを、サーバーで SWF にコンパイルし、クライアントへデリバリーします。これとは逆に、MXML をクライアントでパースして、Flash Player で UI をレンダリングしようと試みている人もいます。
今のMXMLの仕様だと表現しきれない部分があるだろうけど、その辺は今後拡張していくとして。
Flexなんて製品はなくして、MXMLを解釈できるFlashプラグインを12,000ドルで出すってのはどうでしょう(??)。
2004年4月 8日
Flash | AS2 Logging Framework
Java 1.4 Loggingフレームワークをほぼ踏襲している。オイラも前にAS2用のLoggingの仕組みを作ったけど、こっちの方が本格的だ。
2004年4月 2日
Flash, Java | DTO for Flash Remoting
Flash Remoting経由でやりとりするオブジェクトのクラスは、Flashで必要なプロパティだけをまとめた専用のクラスを作った方が良さそうだ。J2EEデザインパターンのDTOと同じような感じで。ただ、そうなるとFlash Remoting用にそのDTOを返すサービスメソッドを作らねばならない。
2004年3月31日
Flash, Java | OpenAMF CVS版
以前に書いたOpenAMF 1.0 RC5の不具合ですが、3月初めにCVSのコードは修正されていました。
ソースを見たら自分とほぼ同じコードで解決していたので、ちょっと嬉しい。ASTranslator.fromActionScript(Object asObject, Class desiredBeanClass)はprotectedだったけど、ASTranslator 1.5.6でpublicに戻された模様です。
2004年3月30日
Flash | Flexの価格
Flexがリリースされましたね。もうベータプログラムのNDAは関係ないでしょう。Flex presentation server pricing starts at $12,000 for two CPUs and includes annual maintenance.
Flexの価格を初めて見たとき、$1,200に見えました。妥当な価格だなと思っていたら、ゼロの数が違ってました。まあエンタープライズ向けと言ってしまえばそれまでなんだけど・・・ 採用事例を早く見てみたい。
多分ほとんどのケースでは、サーバ上でJSPみたいにMXMLをSWFに変換する必要はないはず。僕が欲しいのは、ローカルPC上でコマンドラインで動かすことができるMXMLのコンパイラ。これを$1,000位(もっと安く)で出してくれ。
Flash, Java | org.openamf.RequestContext
I committed a new class into OpenAMF's CVS repository.OpenAMFのMLから。HttpSessionを簡単に取得できるようになるのは便利そう。The new class is org.openamf.RequestContext
This class provides easy access to the HttpServletRequest object and the HttpSession object.
Application developers can use these static methods:
RequestContext.getHttpServletRequest
RequestContext.getHttpSession
2004年3月21日
Flash | 過剰なイントロダクション
「過剰なイントロダクション」っていうのは望ましいことなの?サイトが、Macromedia によって提供されるユーザビリティに従うものであること。これには、効果的なナビゲーション、低いバンド幅のユーザへのアクセス、過剰なイントロダクションなどが含まれます。
2004年3月17日
2004年3月 7日
Flash | Remotingな仕事
今回は、Remoting技術(予算なかったため、OpenAMF使用)でやったのだが、気になる点がいくつか。先週納品したFlash×OpenAMF×SpringなWebアプリのクリエイティブディレクター兼Flashオーサーの日記から。・サーバー側とクライアント側の作業進捗が同期しないといけない。あるいはサーバー側が先行して実装させている必要がある。
今までみたいにXMLデータをサーバー側とやりとりするという形なら、とりあえずはローカルに作った同じフォーマットのXMLファイルで動作確認をしながら進めたが、Remotingでやり取りするのはFlash側データはインスタンス化されたデータであるので、サーバー実装がされていないときのやり取りのしようがないような気がする。それかめんどくさいがローカルでいちいちデータを作るか・・そんなことしてたら、サーバー実装作業しちゃうのと変わらないし・・・大きなシステム屋さんと組んでRemotingとか使うのは無理そう。
・Remotingで関数呼び出しをして、フィードバックしている間のProgressがとれない。
これはなんか方法あるんだろうか?Macromedia 純正のRemotingだったらできたりするのかな・・・
ぱっと見た感じでは方法なさそう。
数千アイテムとかのインスタンス読み込みがあるとフリーズしてるみたいになりそうだ。と、とりあえず気になった点。
後者の指摘ポイントは、今のところFlash Remotingの仕様では無理。HTTPプロトコルを使うサーバとの通信メソッドならContent-Length値が取れる(必ずではないが)けど、AMF(Action Message Format)にはオブジェクトサイズを示すような属性はもっていないのだろう。独自に拡張を施すことができるものなのだろうか? と言っても、サーバ側だけでなく、Flash側のRemotingコンポーネントも拡張しなきゃいけないので無理か。
今回はイントラ用だったので、擬似ローディングプログレスバーを実装したけど、パブリックなものだったらこの辺りはきちんとしないといけないところ。
因みに、予算があっても僕はOpenAMFを使用したと思う。
2004年3月 5日
Flash | Macromediaのオンラインショップ
U/IにFlashを採用したオンラインショップで売上が30%上がったとか宣伝文句を並べてFlashの販促に努めているマクロメディアは、何故自身のオンラインショップにFlashを採用しないのか。謎だ。
Flash | 右クリックを無効に
Flash Player 右クリックメニュー を無効にする方法MEMO_root.createTextField ("disable_memu", 999, 0, 0, Stage.width, Stage.height);
と書くと、拡大とか画質、設定といった右クリックでのメニューが表示されなくなります。
2004年3月 4日
Flash | ASDocGen
これは応援しないとね。言語がJavaなら開発にも参加したいところだけど、C#だから僕には無理。テスターとして参加しよう。steve webster has started an open-source project to create a javadoc utility for flash. he's looking for help, so if you have the time to participate, you should drop by the project site:
>> http://www.asdocgen.org/
according to the site, the first beta is expected in march.
2004年2月15日
Flash, Java | OpenAMF 1.0 RC5 改
Flashからの引数がなぜかdoubleで処理されています。メソッドに定義されている型に合わせて、勝手にメソッドをInvokeするはずなので、ここは引数に宣言されているintで処理されると思いきや、doubleで処理されています。 なのでエラーが発生し、戻り値が正常に受け取れませんでした。 とりあえずintで宣言している引数を両方ともdoubleにした所Flash側で戻り値が受け取れました。この問題、僕のところでもずっと前から起こっていて、開発者にバグ報告もしたのだけど、今のところまだ対処はされていない。
回避策として、サービスオブジェクト(Java側)のメソッドにはdoSomthing(int)とdoSomething(Double)を用意し、
doSomething(Double num) {
doSomething(num.intValue());
}と、わざわざint値に変換していました。まぁ大した手間ではないのでこれでもよかったんだけど、いい加減うざくなったので、ソースにちょこっと手を加え、パラメータにint、long、Integer、Longが要求される場合、OpenAMFで変換できるようにしてみました。かなり無理やりだけど。
上のコード例のように引数がDoubleのもの、intのもの両方が定義されている場合、Doubleが優先されます。この使い分けは、同じサービスメソッド内容でFlashから呼び出す時だけ、ある処理を追加したいって時に役立ちます。
この問題点の箇所は、org.openamf.util.OpenAMFUtilsにあります。ソースをいじってしまったので、正確な行数がわからなくなってしまいましたが、50行目付近に
decodedObject = translator.fromActionScript(parameter);というコードがあります。translatorインスタンスのクラスはASTranslatorです。
ASTranslator.fromActionScript(Object asObject)では、
Class desiredBeanClass =となっており、さらにDecoderFactory.decideClassToTranslateInto(Object asObject)では、asObjectがASObjectクラスのインスタンスでない場合、つまりDouble型などのネイティブ型の場合、
DecoderFactory.decideClassToTranslateInto( asObject );
return fromActionScript( asObject, desiredBeanClass );
asObject.getClass()で取得されたクラスに変換されます。だから、fromActionScript()メソッドにDouble型オブジェクトが渡されれば、Doubleのオブジェクトそのままで返されてしまいます。
ASTranslator.fromActionScript(Object asObject, Class desiredBeanClass)はprotectedなので、OpenAMFからは呼べません。このメソッドをpublicにして、OpenAMF側もこれに合わせて・・・って手もありますが、それよりは今回改造したようにOpenAMF内でDouble→求められる数値型への変換を行ってしまう方が手っ取り早いと思います。
2004年2月12日
Flash | Flash FIELD - AS2クラスライブラリ
Flash ActionScript 2.0用の(java.util.collectionのような)コレクション・フレームワークがないものか探してみたのだけど見つけられなかったので、自分で作り始めました。
テスター募集中です。
誰かAS2用正規表現クラスを作って~。
2004年2月 2日
Flash | Remotingのオブジェクト生成
FlashRemotingを使って、サーバ→Flashでやりとりするオブジェクトはどのように生成されるのか。Flash側(AS2)クラスのオブジェクト生成手順のこと。Remotingドキュメントには載ってないのだけれど、Remotingはどうもサーバから渡されたプロパティをセットしてから、コンストラクタを呼び出してる様子。
サーバ→Flashに渡されたオブジェクトのプロパティがJavaオブジェクトと同期していなかったので、そのオブジェクトクラスのコンストラクタ内に初期化コードを書かないようにしたら、正しくプロパティをセットしてくれるようになった。
コンストラクタを後から呼ぶのが仕様なのかなあ? ちょいと不便だ。詳細仕様が知りたい。
2004年1月24日
Flash, UML | EAでFlashのクラス図
Enterprise ArchitectでActionScriptのクラス図を描いていたので、その定義ファイルを出力。たった8つしか定義してないけど、毎回登録するのも面倒なので。基本データ型以外も入ってます。
2004年1月21日
Flash | 戻り値がvoidの場合
Flash Remoting経由でJavaのメソッドを使用するとき、そのメソッドの戻り値がvoidだとどうなるのか。
今まで戻り値が何かしらあるメソッドの呼び出ししか行っていなかったので、上記の疑問がふと浮かんだ。
serviceObject.doSomthing(); // 戻り値が void のメソッド
function doSomething_Result(data) {
trace(data); // ここで出力されるのは null
}答えはnullでした。サーバ側(OpenAMF)ではメソッドの実行が完了するとすぐにnullを送り返します。
メソッド名_Result()が呼び出されている時点でメソッド実行が成功していることは判るのだけど、実行が成功しているのにnullが返ってくるのはイヤな感じだ。Javaサイドではvoidではなくtrueを返すようにした方がいいのかなぁ・・・
2004年1月20日
Flash | リモート呼び出し
OpenAMFを使うプロジェクトの打ち合わせで、サービスインターフェースの定義を検討している時に「頻繁に呼び出すメソッドでいちいちXXオブジェクトを渡してたらアレじゃない」といった感じのことを言われて気が付いた。
すっかり意識から抜けてたんだけど、FlashとRemoting Gateway間はオブジェクトをシリアライズしてインターネット経由で送って、先方でディシリアライズする(オブジェクトの値渡し)わけだから、多分パフォーマンスに響くわけだ。
今回は呼び出し頻度は減らせないので(しかも頻繁の回数が半端じゃない)、XXオブジェクトのキー要素だけを渡して、シリアライズ/ディシリアライズの負担を軽減させることに。
2004年1月16日
Flash, Java | OpenAMF 1.0 RC5
1.0 Finalが出るかと思いきや、RC5だった。RC5 Contains:
- cleanup of ASTranslator integration
- memory leak fix
- fix for char data typeI hope this is the last RC before 1.0. Currently the plan is to release 1.0 sometime next week.
多分、これがそのまま1.0 Finalになるのでは。
2004年1月11日
Flash | GDispatcher使用方法
理解するために訳してみた。
原文: http://www.gskinner.com/blog/archives/000027.html
GDispatcherのダウンロードについては原文を参照。
いくつか前のエントリーで、EventDispatcher クラスを拡張して自分が欲しい機能をいくつか追加するつもりだと書いたけど、要求を満たすにはゼロから書き直さないといけないとすぐに分かったんだ。そして GDispatcher が出来上がったんだ。僕は気前がいいから ;) このクラスをコミュニティで共有したいと思ってね。このエントリーを読んでダウンロードしてくれよ。
GDispatcher は ActionScript 2.0 に対応した新しいイベント・ディスパッチのクラスで、EventDispatcher インターフェースを完全に実装しているため、簡単に取り替えが出来るようになっているのさ(イェーイ ポリモーフィズム!)。EventDispatcher で定義されている基本機能に加えて、次の新しい機能も備えている。
- リスナーは、ディスパッチャからの全てのイベントを購読できる
- リスナーは、指定されたイベント、または(リスナーのスコープ内での)全イベントを扱うファンクションを定義できる
- リスナーがあるイベントを既に購読しているかどうか確認できる
- 指定されたイベント、または全てのイベントに対する全リスナーを削除することができる
新機能の使い方を簡単にまとめてみた。時間ができたら、プロジェクトの中での実際に使用する方法についてまとめるつもりだ。だけど、過去のいくつかのエントリーを読んでもらえれば、いいアイデアが浮かぶんじゃないかな。(Using EventDispatcher, EventDispatcher: the next morning)
全てのイベントを購読する
これは他のイベントを購読するのと同様のやり方で実現できるんだ。イベント名の代わりに「ALL」を渡せばいい。
someObject.addEventListener("ALL",this);全てのイベントに対するリスナーを削除するのも一緒さ。
someObject.removeEventListener("ALL",this);
実際には、ディスパッチ・オブジェクト(someObject)からのあらゆるイベントコールがトリガーとなる、ALLという一つのイベントを購読していることに気を付けて欲しい。つまり、もし同じオブジェクトからの別のイベントを購読していると、ダブって呼び出されることになる。同様に、ALLイベントのみ購読し、そこから特定のイベントを削除することはできないんだ。
ハンドラー・ファンクションを指定する
addEventListenerメソッドにオプションの第三パラメータでは、呼び出すべきファンクションの名前を指定できるんだ。このファンクションは第二パラメータで指定されたオブジェクトのスコープ内で呼び出される。
someObject.addEventListener("click",this,"onClicked");勿論、この機能は他の新機能と併せて使うことができるぜ。「ALL」イベントの購読のようにね。
someObject.addEventListener("ALL",this,"onSomeEvent");このリスナーを削除するときは、全てのパラメータが同一じゃなきゃダメなんだ。
// これじゃ削除できない
someObject.removeEventListener("ALL",this);
// これなら削除できる
someObject.removeEventListener("ALL",this,"onSomeEvent");
リスナーを確認する
GDispatcher には、「eventListenerExists」というメソッドが追加されていて、あるイベントに対応するリスナーが既にセットされているかどうかを調べることができるんだ。
if (someObject.eventListenerExists("click",this)) {
trace("Yes, it's