adlがうごかなくてはまる
kamaitachi のサンプルアプリで Air アプリをつくろうとおもってつくろうとしたんだけど、adl
がうまくうごかなくてはまった。
環境は OSX 10.5.5 + Air1.5 + Flex SDK 3.2.0.3958。
普通に実行すると
$ adl HelloWorld-app.xml
unknown error
Error: Error #2014: Feature is not available at this time.
at runtime::SecurityManager$/initAppDataDirRoot()
at runtime::SecurityManager$/GetPersistentStorageDirectoryName()
at runtime::AppRunner/run()
at global/runtime::ADLEntry()
こんなんなる。別にコードが悪い訳じゃなくて、adtでパッケージ作るとそれは起動できる。
でなんかよく見るとディレクトリ関係のとこでこけてるからためしに sudo でうごかしてやったらうごいた。。なんやねん。
どっかのパーミッションかえてやればいいんだろうけどそれがどこだかわからんなぁ。
Colin Moock さんのイベント
いってきましたー。Flash系のイベントに参加したのははじめてだったのだけど、asよりということもあるかもしれないけど、とても面白かった。
感想など。
Colinさんによる ECMAScript4 の話
- ECMAScriptの話はへーという感じである
- 日本語うまい
- null の発音はヌルではなくてどっちかといえばナルに近くて最初訳してくれるまで何言ってるのかわからなかった。
yossyさん
- javaっぽくリフレクションできるやつ。個人的には興味ないけどすごくよくできてる感がした。
- AS3Unit いいねー
- as2でもaddChildとかどーのこーの。as2の話はよくわからん。addChildをアドチルドといっていたのがきになりまくる。
- swfassistすげーー。スイフ(スウィフ?)アシストって呼んでたのもびっくりした。swf == スイフ? ってよむんだー。
むらゴンさん
- タッチパネルThinkpadは思った以上によさげ。
- 最初Flash IDEの画面出ててこれはアウェイかなーと思いきや動画にエフェクト二種類かけてその解説など。おもしろかった。
- プレゼン画面が黒板にチョークを模したもので実際にチョークで字かいたりできた。質感もよかった。おもれー。
せこん
- 多言語化の話。よかった。僕も使いたい。(機会があれば)
- 「gettextって便利なあぷりがあるんですよぅ」とか1から説明していたりとアウェイ感でてておもしろかった。
むらけんさん + 寺井さん
- バカスw
岩崎さん
- なんかフレームワークのイベントマネージャの話。よくわからなかった。
yu-kobayashiさん
- HotRubyの話。こないだblog記事みたときもおどろいたけど、実際に3Dのピンボールうごいてるのみてぽかーんとした。
飛び入りの人
- ダッシュ四駆郎。その発想はなかったなぁw
質疑応答
- as3からByteArray+Socketで直接MySQL接続できるとはいってもそれを実際のサービスで使うのはねーよwww FlashPlayerからつなげる == だれでもそのMySQLにつなげる。ですからね。
本当にただの感想です。
yossyさんと話すチャンスがなかったのでsparkprojectをDISれなかったのが残念である。
Safari3でExternalInterfaceる際のBK
as側で
ExternalInterface.addCallback("foo"...)
した場合Safariからは
document["swfid"].foo
でその関数が取れるわけですが、どうもこのオブジェクトをSafariがキャッシュしやがるらしく、二回目以降のロードで
typeof(document["swfid"].foo) == "function"
はswfがロードされる前でも真になります。
上記コードでswfのロードチェックを行っていたためはまりました。。
解決法として
ExternalInterface.addCallback("ready", function():Boolean { return true });
とかを作り、typeofチェックに加えて、この関数を実際によんでちゃんとtrueが返って来るまで待つようにしたらOKでした。やれやれ。
ustream hacks #3 publish movie from your own swf!
次、配信のほう。こいつはすこしやっかいだった。
まず接続は
nc.connect("rtmp://209.85.64.39/ustvVideo/{chid}", { id: "{userid}", sessionid: "{sessionid}", mode: "broadcast", channel: "{chid}", version: "v2.131b" });
とかいう感じ。
chid, sessionidはどちらも配信ページのswfソース部分にある。useridは配信ページを開いたときに http://www.ustream.tv/service.php
とかにPOSTしててその結果に入ってる。
そんで、
ns.publish("live_channel_{chid}", "live");
すれば配信される。はずなのだけど、されない。FMSへの配信自体はうまくいっていて、#2でやった自前再生swfでは再生されるのだけど、ustreamのchannelページではoff airのままだ。
FMSのほうに配信開始用の関数がある模様。それもパケット見てたら見つけることができた。
publish後、
nc.call("channelStatus", new Responder(function ():void { }), "{chid}", "live");
とかいれたら、channelページでも見えるようになった。これでいいのかしらないけど。
ただこれだと、一定時間で接続が切られてしまう。まだなにかあるっぽい。
どうもFMS側からcallBackという名前の関数をよんできていて、それをうけてpongというFMS関数をよぶようになっているようだ。これをしないときられちゃうわけだなきっと。
ので、
nc.client = this;
とかして、thisのクラス内に
public function callBack():void {
nc.call("pong", new Responder(function ():void {}));
}
とかしたら大丈夫になった。OKOK。
これでとりあえず配信もできるようになった。
あと他に callBack()
とおなじように viewersNum(num:Number)
とか定義しておくと、接続人数がかわるたびに呼んでくれるようだ。これで今何人とか取れると。
ustream hacks #2 play movie from your own swf!
にぽたんに続き僕も解析してみました!
ustreamのFMSを自前のswfから使う方法です。#2再生、#3配信、と続きます。
再生は普通にFMSで動画再生するのとほとんど一緒です。URLとか引数とかに気をつけるだけ。その部分だけ書きます。
nc.connect("rtmp://209.85.64.39/ustvVideo/{chid}", { mode: "channel", channel: "{chid}", sessionid: "{sessionid}" });
して、
ns.play("live_channel_{chid}");
以上!
{sessionid}
はプレイヤーのSWFObject部分にありますが、chidは少し見つけにくい。new videoRate('{chid}','XXXX','channel');
とかのやつ。
asdoc
Adobe - Adobe Flex 2:インタラクティブなWebサイト、インターネットアプリケーション
ASDocが正式にサポートされ、SDKに付属するようになりました。
ってあるからためしてみたけど
Error: Could not create toplevel.xml: Unknown OS for ASDoc. ASDoc will only run on Windows and Mac OS X.
などといわれてLinuxではうごかない。くそう。
サポートする気ないのかなー。動かなくしてる理由もよくわからん。
asdoc 自体のドキュメントも日本語のlivedocsにない模様。古いのね。
AS3 の 未定義 int
var i:int; trace(i); // => 0
これいやすぎrrrrrr
未定義の状態をつくれない。
これしたいときは Number つかって isNaN するしか方法ないのかなぁ。
var i:Number;
trace(i); // => NaN
Encode.as
おきた。
早く出社する人が増えてきて、9時ごろになるとうっさくて寝られなくなるなぁ。ねむい。
package {
import flash.utils.ByteArray;
public class Encode {
public static function encode(encoding:String, string:String):ByteArray {
var octets:ByteArray = new ByteArray();
octets.writeMultiByte(string, encoding);
return octets;
}
public static function decode(encoding:String, octets:ByteArray):String {
return octets.readMultiByte(octets.bytesAvailable, encoding);
}
}
}
こんなんでどうか。
このコードは、perlのunicodeフラグを分かってない人に対するEncode.pmの説明にも使えそうな気がする。
ByteArray文字コード変換
sjisbytes:ByteArray
を decode:
var utf8strings:String = sjisbytes.readMultiByte(sjisbytes.length, "shift_jis");
encode:
var sjisbytes:ByteArray = new ByteArray();
sjisbytes.writeMultiByte(utf8strings, "shift_jis");
おー。
ByteArrayのデフォルトエンディアン
いまどきビッグエンディアンがデフォルトとは!