ActionScript3のScrollPaneでハマる

ActionScript3つまりFLASHでのお話です。
HTMLの場合はdivタグのスタイルwidthやheightを設定してoverflow:autoとすれば簡単なスクロール領域を用意できます。
ActionScript3の場合はScrollPaneを使えばいいらしいのです(それがわかるまで自分で大きさやScrollRectを計算してスクロールバーまで自作してこんな機能はflashにないのかと愚痴ってました)が、その内容をあてがうところで躓きました。単純にaddChildすると手前に表示されてScrollPaneが奥になってしまいます。てっきり子供にさえすればコンポーネントが勝手にやってくれるのかと思いましたが違いました。sourceというメソッドがあって、それにオブジェクトを放り込む必要があったのです。
さらに、このScrollPaneのsourceに放り込んだオブジェクトは使い回しができません。ほかの子供になると対象から外れてしまうようです。別のScrollPaneのsourceにあてがってやると一番最後のもののみが表示されます。オブジェクトの単純コピーでは参照になるためかやはりだめで、別の入れ物を用意してやらないとだめのようです。異なる窓で大きさの異なるMovieClipを表示させたかったのに、できませんでした。

Flashにおけるフォーカスの扱い方にハマる

Flashのお話です。
イベント処理を確認していたところ、イベントが発生しない事があったので動作を確認していました。
どうやらコンポーネントにフォーカスが移動すると、stageがイベントを拾わなくなるようです。
stageをクリックするだけではだめで、stageに置いたオブジェクトを選択してもだめでした。
結局、この問題の原因となったListを選択したらフォーカスをstageに移動させるという、いまいちな方法で対処しました。
ざっと検索しても出てこなかったので、この挙動は不具合なのか仕様なのかよくわかりませんでした。

ActionScript3で一度loadした画像をキャッシュとして扱うのにハマった

Flash的にはインスタンスの複製とでもいうのだろうけど、こういう独自の呼び方はなかなか覚えられない傾向があるで覚える気もない(だから覚えないんだろうけど)。
ライブラリに最初から埋め込んである画像はクラスとして書き出しておけばnew hoge(0,0);とかでいくらでも表示を量産できるんだけど、Loaderでloadした画像で同じことをしようとしてはまった。
いろいろ端折ってるけど、たとえばこういう使い方

var loaderObj:Object = new Object(); // グローバルに宣言

var bm:Bitmap = Bitmap( loader.content ); // loadした内容をbmへ
loaderObj[ 'huga' ] = loader.content; // loadの内容をオブジェクトに入れて

var bm2:Bitmap = Bitmap( loaderObj[ 'huga'] ); // 他の関数から呼んでみる


実際に有効なのはbm2のみ。
オブジェクトに丸ごと放り込みさえすれば後は使い放題なのかと思いきや、1対1の関係らしい。
「actionScript3 loader」をググってヒットしたページを順番に眺めていたらヒントがあった。
Loaderではなく、bmを見に行けばいいらしい。

var bm:Bitmap = Bitmap( loader.content ); // loadした対象をbmへ
loaderObj[ 'huga' ] = bm; // loadの内容ではなくbmをオブジェクトに入れて

var bm2:Bitmap = Bitmap( loaderObj[ 'huga' ].bitmapData ); // 他の関数から呼んでみる


ここまで書いておいて、もしかすると?と思って書き直してみた。

var bm:Bitmap = Bitmap( loader.content ); // loadした対象をbmへ
loaderObj[ 'huga' ] = Bitmap( loader.content ); // loadの内容ではなBitmapの・・・(なんて呼び方?キャストではないしオブジェクトの変換?)をオブジェクトに入れて

var bm2:Bitmap = Bitmap( loaderObj[ 'huga' ].bitmapData ); // 他の関数から呼んでみる


リファレンス眺めてもこの挙動につながる箇所を見つけられなかったけど、とりあえずBitmapとしてオブジェクトに入れておけば、自由に扱えるらしいことが分かった。
BitmapでLoaderの何らかの制限から開放されているといったところか。
「Loaderはファイルを読むためのオブジェクト」とあるので、それ以外の用法は制限されるのか、一度Bitmapにすればその制限から開放されて通常の(期待した)使用ができるのか。
loaderObj[ ‘huga’ ]自体の型には何も違いはないのだけれど。
Loaderだから何々ができないという書き方がどこにもない(探した中では)のが悲しい。

ちなみに、clone()なしでも表示は量産できるだけど、オリジナルをnullにするとかどうにかすると道連れになるかどうかとかなのかもしれないけど、今のとこ必要ないので気にしないことにする。オブジェクトに入れたものが何者なのかこんがらがったままだし。

UTF-8とUnicode

文字を扱うときは普段からUTF-8を使用します。Shift_JISやeucはめったに使いません。
さて、UTF-8はUnicodeなのですが、表記の方法で躓きました。
PerlやPHPなどのスクリプトで扱う場合は、たとえば「あ」なら「\xe3\x81\x82」と記述するのですが、「U+xxxx」という表記が必要な自体にでくわしました。
Flashで文字のコードを取得使用とするとこの表記でしか取得できないようで、文字を管理するにはコードで管理したほうが楽なのでこのコードで扱うことに島した。
さてここで問題です。「U+xxxx」の表記ってコレいったいナニ?といろいろ調べていくと、「UCS2」というコード体系だということが判明。Perでこの表記を取得するには以下のとおり。

my $string = 'あ';
&from_to( $string, 'utf8', 'ucs2' );
print unpack('H*', $string );
# 3042


JcodeよりもEncodeのほうがいいらしい?この当たりは試してないのでどちらとも。ただ、日本語に依存するものがないときは基本的にEncodeを使ったほうが安全という話。今回はUTF-8からUCS2なので、下手に日本語環境を考えるとコードが化けたりしかねない。
これで、文字を管理することができるようになりました。
UCS2って今まで気にしなかったコード名です。他にもUCS4とかあるようです。

Flashへのフォント埋め込みは無法地帯?

Flashはいろいろできてとても便利です。
画像や図形、それに肝心の文字。
さて、ここで文字を表示するためのフォントのお話です。

Adobeがライセンスを持っているフォント(FlashやAdobeReaderにバンドルされているもの)は自由に埋め込むことができます。
しかし、Windowsについているフォントや、オフィス系ソフトを入れると入るフォントはライセンス上そのアプリケーションとセットでなければなりません。
そして、そのフォントは商用利用できないことがほとんどです。
つまり、「このフォントを使って何がしを注文できます」と商売はできないということです。

商用フォントであればこれらの制限はないものが多いですが、Flahsへの埋め込みは別です。
Flashへの埋め込みは個人であってもNGなものがほとんどのようです。
静止画テキストであればその文字限定ということで画像と同じ扱いなのか、特に問題はないものの、ユーザが個別に入力できる文字にそのフォントで表示できるようなダイナミックテキストになるとほとんどアウトです。
つまり、フォント情報をフォントとして扱える状態で埋め込むことは配布と同じことになり、ライセンス違反となります。
フォント自体に埋め込めない機能があればいいのですが、パスとして引っ張り出せば回避されますからね。

さて、web上で名刺などをデザインできるサイトがちらほらありますが、アクセスしたパソコンにあるフォントしか表示できなかったり、フォントの都合で出来上がりは見た目と違うと断ってあるサイトはさておき、「パソコンになければサーバからダウンロードします」と露骨にライセンス違反と思われる行為を宣言しているサイトを見つけました。
おそらくフォントを埋め込んだswfを個別に読み込むのでしょう。システムとしては理に適っていますがライセンス的には・・・
ここまで露骨だとある意味ほほえましいですが、フォントベンダーが放置している理由も良くわかりません。相手にするほどでもないというのか、正規の配布ライセンスを持ているのか(フォントサーバ扱いのライセンスになるのでン百万ぐらいするらしい)謎です。

ちなみに埋め込みに関するライセンスを回避するには、フォントとして再利用できない形で表示するのであれば問題ないようです。つまり、フォントデータから自由に「文字を表示」できる状態を用意することが問題で、文字ではない画像で表示するのであればフォントを再利用できない状態であると判断されるとのことです。だって、そうじゃないと校正をFAXやメールに添付して送ることもライセンス違反になっちゃいますからね。

何がいいたいかというと、フォントを利用した何かを転送することが問題なのではなく、フォントの情報そのものが転送されることに問題があるということです。結論として画像でやれと。

Adobe Flash CS4の不可解な挙動

いろいろいじくっていると、パブリッシュ時にエラーを吐いてくれます。
もちろん、構文に問題があるからなのですが。
で、出くわしたこんなエラー
「ReferenceError: Error #1065: 変数 ComponentShim は定義されていません。」
グーグル先生に尋ねても知らん振り。
仕方がないので何千行もあるソースをコメントアウトしたりtraceの場所を増やしてみても変えたりしてもこのメッセージ1行のみ。
つまりコンパイル時のエラーらしい。

ならコンパイルエラーと書け。
構文エラーじゃないじゃん?

いろいろ弄っていると、いつの間にかシンボルの1つが画面から消えているのに気がついた。
オブジェクトとしては存在するんだけれど、表示されない。
ボタンでは表示できるがムービークリップでは表示できない。
一度ファイルを閉じて開きなおしてみるが、なぜか保存時のものに回復されず、最新の状態が復帰してしまう。
これはまさに顔面蒼白という状態である。

もうどうにでもなれと、アプリケーションを落として再起動してみると・・・
なんてことはない。
正常に機能していた。

そういえば操作を戻す作業をしてからおかしくなったような・・・?
どうやらFlashのガベージコレクションには欠陥があるようだ。
どういう手順で発症するのかわからないが、何らかの条件で最新の状態のみが優先されリセットされていないらしい。
それで戻る操作をすると整合性が取れなくなり、コンパイラのどっかで構文エラーが発生してパブリッシュに失敗するようだ。
しかし検索してもヒットしないエラーにお目にかかれるとは。

CentOSのFirefoxでFLASHを使えるようにする

Firefoxには自動的にアドオンやらプラグインやらを追加する機能がありますが、CentOSではFLASHのプラグインをダウンロードするものの導入に失敗し、手動で入れても失敗します。
Adobeのサイトからtar.gzのファイルを落として回答すると「libflashplayer.so」ファイルがあるので、「/usr/lib/mozilla/plugins」にコピーしてfirefoxを再起動すると何事もなかったように動き始めます。
さて、これでサイトのスクリーンショットの機能を試しますか、これでWindowsのcrenaから開放されるのかな?このソフトのためにクローラーにWindowsが必要だったのだけど。