FlashとDBの連携方法いろいろ

FlashでDBのデータを扱おうと思ったら、すぐ考えられたものだけでいくつもあった。

「FlashとDBの連携」なんて言うと特別なようだけど、要はViewにFlashをもってきた単なるWebアプリケーションの方法論。そりゃあ、こんな時代だもの、方法いろいろあります。やるときはやる。やれないときはやれない。つまるところ、永久不滅ポイント。あの大車輪のおじいちゃん見ていると、がぜん勇気のわいてくる今日この頃です。

さて、FlashでDBのデータを表示させるための可能性を、メリット/デメリットは置いておいて、とりあえず列挙。

  • Flash Remoting
  • SOAP + WebService
  • REST + XML.load()
  • JSON + LoadVars
  • 単純にXML読み書き
  • パラメータ渡し(無いな…)

リクエストごとDBに問い合わせて、結果をXMLなりJSONで返すという方法については、まるっきりAjaxなわけだけど、リクエスト内容がパターン化できる場合は、RSSのようにXMLをDBのキャッシュ機構のように使うこともできそう。つーか、XMLを簡易DBにすれば良いのか。DBの更新頻度が高くなければ、ファイル制御やIOのネックも気にならないし、ありかもなあ。

ちなみに、サーバサイドで何を使うかも迷うところ。perlでもPHPでもXML操作はゴリゴリいける。一般的な技術ほど、選択肢が広がって迷いが起こる。うーむ。

ここは性能要件やらサーバ環境などをトータルに見て考えないといけないってか。考えているうちに、コーディングしちゃった方が早い気もするけど。まあ、ササッとやっつけちゃおう。

flash.geom.ColorTransform

flash8 はリリース直後にちょっと触って、あとは最近まで放置したままだった。ということで、今さらながら、ぼちぼち試していくことに。とりあえず、flash8 では Color クラスを使っちゃいけないらしいので、代替の ColorTransform クラスの習得から。ほとんど同じフローで、一安心。

やっぱり猫はかわいいなあ。

続きを読む "flash.geom.ColorTransform"

ActionScript で10進数を16進数に変換する

MovieClipの現在のRGBをトレースしたら、10進数で表示されるので困る。自分で16進数に直しても良いけど、そのくらいサポートしてるだろうと思って調べたら、ありました。

var trans:Transform = new Transform(mc);
trace(trans.colorTransform.rgb.toString(16));

toString の引数に、構文解析用の基数を指定すればOK。これで2進数から36進数までいけるっぽい。便利。しかし、何で今まで知らなかったのか不思議。

ちなみに、逆に16進数を10進数に変換する場合には、parseInt を使用する。

var string = "FFFF00";
trace(parseInt(string, 16));

こっちはちゃんと知っていた。自分よ、なぜ。

Flash開発はSEPYからeclipseへ

ようやく業務が冷静さを取り戻してきたので、ここぞとばかりに Flash イジリを再開。しかし、SEPY で AS を書くのが、どうもしっくり来ない。しばらく eclipse を使ったあとでは、どうしても SEPY に物足りなさを感じる。

というわけで、未練もなく SEPY にサヨナラを告げ、eclipse で環境を作ることに。今回は、「ん・ぱか工房:ActionScript2.0メモ」を参考に、「eclipse + ASDT + MTASC」の組み合わせで。ああ、この世の中ってスゴイなあ、と思った。

AS3 対応を考えると、eclipse への環境移行は自然な流れだけど、AS3 が正式に出たらば、公式の環境を用意してもらえそうな気もする。だもんで、ちょっと早まった気もするけど、まあ細かいことは気にしない。もう環境できちゃったし。ハハハ。

続きを読む "Flash開発はSEPYからeclipseへ"

ウィンドウのタイトルが変わってしまう

Flashオブジェクトのあるページで、URLにハッシュ値が付いている場合、Flashオブジェクトにフォーカシングすることで、ウィンドウのタイトルがハッシュ値で置き換わってしまう。この現象が確認できたのは、WinIEのみ。あやしすぎる挙動だす。

これがまた厄介な問題だったりする。

ページ内リンク(「ページの先頭に戻る」とか)で、アンカーの値がURLのハッシュ値に設定されると、その次にFlashオブジェクトを操作するだけで、タイトルが謎の文字列に変わるわけで。ブックマークしようとするユーザーが非常に困る。

で、いまのところ対処法が見つかっていませぬ。ううう。

タイトルが変わる原因が分からないので、変わったものを document.title で上書きする方法を考えた。ところが、Flashがクリックされたり、フォーカシングされたイベントで、それを実行しても、効果なし。すぐ別のタイミングで上書きされてしまう。ふざけんなー。

setInterval とかで、一定時間ごとにチェックして書き換えるとか、そういう方法しかないのかなあ。あんまやりたくないなあ…。ヘルプミー。

HTMLからFlashへ変数が渡せない?

HTMLからFlashに変数を渡すには、2通りの方法がある。ひとつはFlashVarsを使用する方法、もうひとつはSWFファイルURL指定時に、クエリーとして変数を付加する方法。

// 後者抜粋
<param name="movie" value="deftrash.swf?hoge=foo" />
<embed src="deftrash.swf?hoge=foo" ... />

前者は FlashPlayer6 以上で、後者はもっと前の世代でもOK。そんなわけで、後者の方法を使用している人も多いはず。ところが、ここで落とし穴。変数の文字列に「#」が含まれていると、Operaでは、「#」以降の文字列を渡すことができない!(FlashVarsの方法では大丈夫っぽい)

どうやらURLエンコーディングしてあげる必要があるみたい。

// JavaScript で対応する場合
<script type="text/javascript">
document.write("<param name=\"movie\" value=\"deftrash.swf?hoge=\" + escape("#foo") + "\" />");
document.write("<embed src=\"deftrash.swf?hoge=" + escape("#foo") + "\" ... />");
</script>

location.hashをFlash側に渡そうとして、コレにすごいハマった。Operaとかスゴイ嫌いだよ。ううう。

onEnterFrame で複数メソッドを個別に実行する方法

onEnterFrameとかのイベントで、複数のメソッドをダイナミックに実行するうまい方法がわかりませぬ。これはFlashを始めた頃から悩んでいることのひとつだったりして。

たとえば、徐々にアルファ値を上げていきながら、あるタイミング(フレーム)からスケールアップするとか。または、onEnterFrame 内で処理Aと処理Bを同時に実行するとき、onEnterFrame をdeleteするには、両方の処理が完了するのを待たなければならず、そのためにムダなif文が入ってしまうとか。

その場しのぎで色んな方法を試してきたけど、そろそろ汎用化できたら良いなーってことで、EventDispatcher を使う方法を試してみたよ。

続きを読む "onEnterFrame で複数メソッドを個別に実行する方法"

MovieClipLoader.onLoadProgress が呼ばれない

MovieClipLoader のイベントで、onLoadStart や onLoadInit は呼ばれるのに、onLoadProgress が一向に効かない。超ハマる。なんじゃろう。

色々探った結果、ちゃんとヘルプに書いてあった。

メモ : onLoadProgress をプレビューモードで使用してハードディスク上にあるローカルファイルをロードしようとしても、プレビューモードではローカルファイル全体がロードされるため、正常に機能しません。

ここは Flash 8 になっても変わらず。仕方ないのでローカルサーバに上げてイジることに。こうなると本番と開発中でパスが変わるので、Constantsクラス作って設定ファイル代わりにしてみたけど、なんだか忘れそうだし面倒だし、後々のトラブルになりそうだなあ。むぅ。

そう言えば、以前は本番用と開発用を切り替えるために、Factory パタンを使って、開発のためだけに結構なクラスのコードを書いたっけ。形はキレイなんだけど割に合わなかったなあ。

Flash 8 になったのに、それらしい使い方はまだ全然していない。ある程度バグレポートが出てからでも良いかなーとか、ちょっとのんびり構えてみるフリ。

Flash Player 6 for Mac のバカ野郎

ちょっとサイトの動作確認でも、と思って、古い Mac を引っ張り出して IE を立ち上げたら、動作が不安定。というか、何度も何度もリロードされる。何故。

色々イジってみると、どうも Flash Player が一世代前のものだったということが原因のようだ。最新版にすると現象は、スッパリ解決。

onClipEvent(load) {
    this.onRelease = function() {
        getURL("hoge.html","_self","POST");
    }
}

大体、こんな感じの記述をしてたのだけど、これだと Flash Player 6 では、load時に実行までされてしまうらしい。えー。作り変えるの面倒なんで、とりあえず detect に逃げる予定。しまったなあ。

ロードされる側で NowLoading するときの課題

ロードする側とロードされる側は、なるべく相互干渉しないように作りたい。しかし、そこには見えない大きな壁があったのです。ううう。

MovieClip.loadMovie() や MovieClipLoader.loadClip() を使用して、外部 swf を呼び出す場合、ロードごとに NowLoading (ローディングバー等)を出したいということがあるじゃないですか。その場合、呼び出される側に NowLoading が設置して、二者を分離する方が良いと思うのです。オブジェクト指向的にも。

しかし、実際思ったように動いてくれない。ローディングバーが表示されるときには、すでに外部 swf が読み込み終わっていたりして。何だかなあ。

原因は、リンケージの「最初のフレームに書き出し」にある。

続きを読む "ロードされる側で NowLoading するときの課題"

FlashPlayerの普及率

Flash Player と他プラグインとの普及率比較グラフ
Flash Player のバージョン毎普及率リスト

Flash MX 2004 の登場以来、割と当たり前のように ActionScript2.0 で書いて、Flash Player 7 でパブリッシュしていたけど、上のページを見ると判断ミスだったかもしれない。バージョン7のアジアでの普及率は、いまだ9割未満。こういう状況を考えると、ActionScript1.0で書いて、バージョン6でパブリッシュする方が無難でしょう。(※バージョン6でもActionScript2.0は使用できるみたいだけど)

しかし、一度 ActionScript2.0 に慣れてしまうと、昔のクラス定義の流れが、まどろっこしく思える。

MyClass = function(){};
MyClass.prototype = new MovieClip();

そして、割り当てる MovieClip に対して、

#initclip
Object.registerClass("myclass_mc", MyClass);
#endinitclip 

早く Flash Player 7 がたくさん普及すれば良いのに。あと、8ball が早くリリースされて、これもスゲー勢いで普及すれば良いのに!

SWF::Builder の効用








SWF::Builder を使えば、CGI を通して動的に Flash を生成することができるわけですよ。こりゃあ面白いと思って、しばし使いどころを考えていたんだけど、別に Flash 内部に吸収すればできるんじゃないのって話ばかり。間に perl を挟む利点が、思いつかないなあ。

他の人はどんな使い方してんだろうと思って検索したら、フォント周辺で上手いことやろうってことで盛り上がってるっぽい。とりあえず、generative.info さんとこの「SWF::BuilderでLinuxサーバー上でフォント生成は可能か」という熱いエントリーを追いつつ、自分でもベンジャミンの名言で挑戦。うん、できた。素敵!

でもでも、単にサーバサイドで入力文字列をフォント化するのであれば、SWF::Builder じゃなくてもイケるよなあ、と。もっと、サーバが動的に swf ファイルを生成することの意味があるような使い方って、無いんだろうか。

パラメータに合わせて動きが変わるような Flash ならば、それは Flash 内部でそういう風に作りこめば良い。SWF::Builder の効用を考えるなら、入力内容を swf 生成時に埋め込まないといけないようなもの…。うーん。

Flash が Flash を作って読み込んで、その Flash がまた Flash を作って…みたいなこととかしたら、意味ないけど面白かったりするのかなあ。あー、データ収納箱として swf ファイルを使ったりするか。サウンドも使えるっぽいし、そこに全部詰め込むとかね。苦しいか。

とりあえず、ちょっと寝かせておこうっと。

SWF::Builder を使ってみる








前回インストールした SWF::Builder を使って実際に flash を作成してみた。率直な感想として、かなり面白い。今回は静的にコードを書いて描画したんだけど、CGI を絡めて動的に描画することも可能なわけで。アイデア次第でいかようにも拡がりそう。素敵だ。

ちなみに、このチンケなムービー、ずっと見てると酔いそうになる。申し訳ない。

とりあえず、例によってソースさらしておきまふ。

続きを読む "SWF::Builder を使ってみる"

SWF::Builder のインストール

CPAN をうろついていたら、SWF::Builder という面白げなモジュールを発見。perl で flash が作れるなんて、かなり素敵なことが起こりそうじゃないですか。

というわけで、以下インストールのメモ。

続きを読む "SWF::Builder のインストール"