OSXのFileReference
FlashのFileReferenceでのファイルアップロードはFlashPlayerから直接ファイルがアップロードされるのだけど、WindowsだとIEからリクエストされてるのと同じ感じになって(おそらくWinInet APIをつかっているからだと思う)、アクセス先がBasic認証とかかかっていてもIEの認証がとおっていればちゃんとファイルアップロードできる。
でも、OSXの場合は完全にFlashPlayerが独立しているらしく、Basic認証がかかっているとファイルアップロードできないようだ><
それをしらなかったのでykskに無駄に苦労をさせてしまった。もうしわけない!
とりあえずIP認証で代用した。そんな罠があるとはな。。
AS3でのフルスクリーンモード
最小のサンプル。
package {
import flash.display.Sprite;
import flash.display.StageDisplayState;
import flash.events.MouseEvent;
import flash.events.FullScreenEvent;
public class FullScreeeeeen extends Sprite {
public function FullScreeeeeen() {
stage.addEventListener(MouseEvent.CLICK, clickHandler);
stage.addEventListener(FullScreenEvent.FULL_SCREEN, fullScreenHandler);
}
private function clickHandler(event:MouseEvent):void {
if (stage.displayState == StageDisplayState.NORMAL) {
stage.displayState = StageDisplayState.FULL_SCREEN;
}
}
private function fullScreenHandler(event:FullScreenEvent):void {
if (event.fullScreen) {
trace("enter fullScreen mode");
}
else {
trace("leave fullScreen mode");
}
}
}
}
これだけ。あとは addParam("allowFullScreen", true)
(SWFObject書式) すれば使える。
今の Flex2 SDK だったら追加のインストールファイルは何も必要ない模様。
AS3のテスト
これ試してみた。
Flex Builder 2 がいるとか書いてあるけど、Flex2 SDK でも使えた。
この記事の例のをコンパイルするには
mxmlc -include-libraries=../flexunit/bin/flexunit.swc main.mxml
こんな感じでいいよう。
-include-libraries
の代わりに -source-path
で as ライブラリの位置指定してもいけるけどコンパイル時間がすげー長くなってしまう。
てか、swc 使っても長いんですけど。fcshつかった二回目以降のコンパイルでもおっせぇのでFlexって大変だなぁとか思ったり。
このテストアプリはFlexで作られているけど、テストは普通のAS3クラスに対して行えるので、まぁ一応使えるかなぁと言う印象。
作ってるアプリディレクトリに test.mxml、Test.as を置く感じになるかなぁ。
めんどいなー。誰かがasだけでテストクラス書いてくれるのを待とう。
XMLSocket - POE
AS3からSocketクラスができたけど、それでも依然としてテキストベースの通信ではXMLSocketのほうが楽なのでAS3ベースでもXMLSocket使ってる。
でも通信の区切りがNULL文字だったりとか、癖があるんで、なんこかPoCoサーバー作ってみて、うまくラッピングするモジュール作るべきだなと考えてる。
たとえば以下のような。
POE::Filter::XMLSocket
NULL文字で区切る入出力フィルタ。
POE::Component::Server::TCP::XMLSocket
AS3からサポートされているTCP通信でのcrossdomain.xmlの返答機能を組み込んだComponent::Server::TCPのサブクラス。
などなど。
今の仕事が終わったらちゃんと考えよう。
MochiKitをAS3で
package MochiKit { public class Base { public static function bind(f, obj, ...args) { return function() { return f.apply(obj, args.concat(arguments)) }; }
public static function update(self, ...args) {
if (self === null) {
self = {};
}
for (var i = 1; i < args.length; i++) {
var o = args[i];
if (typeof(o) != "undefined" && o !== null) {
for (var k in o) {
self[k] = o[k];
}
}
}
return self;
}
}
}
bindとupdateだけだけどw
なんかAS3は_globalなくなってグローバル関数上書きどうやるかわかんねーし、ビルドインクラスにメソッド追加する方法もよくわかんないのでこんなのかいてやってみる試み。
使うときは import MochiKit.Base; したらあとは
var m = MochiKit.Base;
m.bind(...)
とかもてきったーにはおなじみの使い方できる。
誰か暇な人が全移植してくれはしないだろうか。
width="0" height="0" な Flash だとネット接続できない @ Linux Flash Player 9
これずっとわかんなかったんだけど、今日やっと原因を発見した。
なんだそういうことだったのね。MTASCのバグかPlayerのバグか何かかと思っていて放置してた。
MTASC上でのLoadVars, XMLSocket、Flex2 Builder上でのURLLoaderでうごかないの確認。
ちなみにWindowsやOSXだと問題ない。
Flashタグでは1pxなどと適当に指定しておいて、CSSでそれをくくっているdivを0pxに指定したらOKっぽい。
Flash Player Detection Kit がひどいので改造
インストールされているFlashプレイヤーのバージョンを調べるためにadobeからFlash Player Detection Kitというものが出てるのだが、これのjsの部分がひどいのでいじった。
var付け忘れてる変数にちまちまvarつけたり、関数エクスポートまくりなのを全部隠蔽したりとか。あと使わない部分はごっそり削除。
このjsでは、Flash.VERSION でプレイヤーのバージョンがとれ、Flash.require() でプレイヤーのバージョンをチェックするって感じにしてある。
前者は単純に文字列が入っててで、後者のrequire関数は
if (Flash.require(8,0,0)) {
// プレイヤー8以上入ってる!
}
みたいに使う。
SWFObjectもこの中に突っ込むといいかなとか思ったけど今は必要ではないのでいれていない。
js無名関数 with ExternalInterface
弊社フラッシュチームからは常識じゃん?的なことを言われましたが、FlashのExternalInterfaceに無名関数を使うというテクはなかなか使えるなぁ。
UserAgent取得
var ua = ExternalInterface.call("function() { return navigator.userAgent }");
JSつかってJSONパースさせてオブジェクトを得る
var json = '{foo:"bar"}';
var object = ExternalInterface.call("function(json) { return eval('('+json+')') }", json);
などちょっとしたことやるならjsファイルでなんかやらなくてもas内だけで完結できる。
ちょっとがんばればasクラスだけでjsの正規表現つかうラッパークラスとかもできそうだけど、もうありそうかな。