archive-com.com » COM » N » NITOYON.COM

Total: 757

Choose link from "Titles, links and description words view":

Or switch to "Titles and links view".
  • getter/setter のアクセス制御指定子は同じでなければいけない? (2) - 解決編 - てっく煮ブログ
    prog actionscript30 pdf の名前空間を参照 独自名前空間としては AS3 や mx internal が有名どころでしょうか 今回は getter が public setter が internal だったため public sample と internal sample の2つがクラス内に定義されていたのです そのため 単に sample と記述すると どっちの名前空間を参照するのかが曖昧になってしまっていたわけです setter なのか getter なのかを文脈で判別して 自動的に名前空間も割り当てて欲しいところなのですが そうもいかないようです そこで 気になった 名前空間が異なるなら 同じ名前の関数を作れるはず これはもちろんOK package import flash display Sprite public class Test extends Sprite public function a void AS3 function a void じゃあ これは package import flash display Sprite public class Test extends Sprite

    Original URL path: http://tech.nitoyon.com/ja/blog/2007/02/28/p1/ (2016-02-13)
    Open archived version from archive

  • getter/setter のアクセス制御指定子は同じでなければいけない?(1)‐AS で自己カプセル化 - てっく煮ブログ
    エラーになる mxmlc Test as 設定ファイル C flex frameworks flex config xml をロードしています N program as Test as 20 col 4 エラー sample への参照があいまいです sample hoge 参照が曖昧ってなぜ よく分からん 2007 2 28追記 理由が分かりました 詳しくは getter setter のアクセス制御指定子は同じでなければいけない 2 解決編 参照 クラス内部のみ setter を使えるようにはできないんだろうか もちろん sample を直接いじればいいんだけど sample という変数が存在すること自体 クラス全体に秘密にしたいこともある これをリファクタリング業界では 自己カプセル化 というらしい 自己カプセル化を行う上で setter だけを private にしたい という要望は往々にしてでるはずなんだろうけど ActionScript3 では無理なようだ setter の中で argument caller から呼び出し元のクラス内を取得すればいけるかな と思ったら AS3 では argument caller が定義されていないし ううむ

    Original URL path: http://tech.nitoyon.com/ja/blog/2007/02/20/p1/ (2016-02-13)
    Open archived version from archive

  • ExternalInterface.addCallback で定義された関数は apply できない - てっく煮ブログ
    draw color int void graphics beginFill color graphics drawCircle 0 0 50 graphics endFill HTML は swfobject js を使って楽チンに script src swfobject js script script window onload function var so new SWFObject ExtTest swf ExtTest 300 300 9 white so write box script div id box div 準備ができたところで FireBug のコンソールでいろいろ実験してました 関数は定義されている ExtTest draw function 呼び出しもできる ExtTest draw 0 でも toString call apply は失敗 ExtTest draw toString ExtTest draw toString is not a function ExtTest draw call ExtTest draw call is not a function ExtTest draw apply ExtTest draw apply is not a function apply call toString が定義されていないことが分かりますね toString と call はいいとして apply がないのはちょっと不便です そこで 私は次のような実装ラッパー関数を作ってます function applySwf swf method args if swf typeof swf method function switch args args length 0 case 0 return swf method case 1 return swf method args 0 case 2 return swf method args 0 args 1 case 3 return swf method args 0 args 1 args 2 case 4 return swf method args 1 args 1 args 2 args 3 default throw argument too many ちょっとかっこ悪すぎな実装ですが いちおう呼び出せます applySwf ExtTest draw 0xff0000 SWF をロードした直後に ExtTest call function としてやってもできそうなのですが SWF 側で ExternalInterface addCallback するタイミングは実装依存なので難しそうです 追記 上のへぼ実装版 applySwf 関数をかっこよくする方法が 最速インターフェース研究会 Functionコンストラクタを使ってJavaScriptネイティブじゃない関数をラッピングする方法 にて紹介されています ma la さん ありがとうございます 2007

    Original URL path: http://tech.nitoyon.com/ja/blog/2007/02/14/p1/ (2016-02-13)
    Open archived version from archive

  • Tamarin の avmplus.exe に独自関数を実装 - てっく煮ブログ
    0xff 0xff 0xff 0xef 0x41 0x86 0x01 0x08 0x72 0x65 0x61 0x64 0x4c 0x69 0x6e 0x65 0x0d 0x74 0x6f 0x70 0x6c 0x65 0x76 0x65 0x6c 0x2e 0x61 0x73 0x24 0x31 0x00 0x07 0x61 0x76 0x6d 0x70 0x6c この16進数の羅列が toplevel as のバイトコードなんです toplevel as をバイトコードに変換して toplevel cpp を作れば動きそうです ということで toplevel as をコンパイルしてみます in を指定して 他の AS もまとめてコンパイルするのを忘れずに java jar asc authoring jar import global abc in shell ByteArray as in shell Domain as in shell DoubleArray as in shell Endian as in shell FloatArray as in shell IntArray as in shell Java as in shell ShortArray as in shell StringBuilder as in shell UIntArray as in shell UShortArray as in extensions Dictionary as shell toplevel as toplevel abc 3850 bytes written toplevel abc が生成されました さらに なんと toplevel cpp と toplevel h も自動的に更新されました const int toplevel abc length 3908 const int toplevel abc method count 122 const int toplevel abc class count 15 const int toplevel abc script count 1 static unsigned char toplevel abc data 3908 0x10 0x00 0x2e 0x00 0x02 0x00 0x00 0x02 0x00 0x00 0xe0 0xff 0xff 0xff 0xef 0x41 0x79 0x08 0x72 0x65 0x61 0x64 0x4c 0x69 0x6e 0x65 0x0d 0x74 0x6f 0x70 0x6c 0x65 0x76 0x65 0x6c 0x2e 0x61 0x73 0x24 0x31 0x00 0x07 0x61 0x76 0x6d 0x70 0x6c 0x75 どうも ActionScript 内に native 宣言された関数があると cpp と h が書き出されるようです toplevel abc class count と toplevel abc script count の値が減ってしまっていますが ひとまずは気にせずに先に進むことにします いざ 実行 toplevel cpp と toplevel h が更新されたところで avmplus exe をビルドします いざ 実行 avmplus exe hoge abc hoge やったー 地味ですが System alert が実行できたことが分かります alert 関数を native 実装 さて ActionScript で実装していた alert 関数を C での実装に切り替えてみましょう まずは toplevel as の編集です alert 関数を native 宣言にします toplevel as package avmplus public class System public native static function alert text String void public native static function exec command String int public native

    Original URL path: http://tech.nitoyon.com/ja/blog/2007/02/13/p1/ (2016-02-13)
    Open archived version from archive

  • Tamarin と遊んでみた - てっく煮ブログ
    のパーサー ECMAScript の仕様にあるオブジェクト Array String Date の実装 E4X の実装などが入っている avmplus lib を出力 MMgc 名前から想像するにガベコレ MMgc lib を出力する shell avmplus lib MMgc lib zlib lib をリンクして avmplus exe を出力する avmplus を実装 zlib 説明不要 zlib 依存関係が設定されているので shell プロジェクトをビルドするだけで avmplus exe ができあがる もちろん バッチビルドしてもいいけど お試し プレゼンにもあったソースを試してみた hoge as 正規表現で grep import avmplus var re RegExp System argv 0 var line while line System readLine if line match re System write line n プレゼン通りに asc authoring jar で ByteCode を生成して avmplus exe で実行できました すばらしい java jar asc authoring jar import global abc hoge as hoge abc 220 bytes written avmplus exe hoge abc var hoge as var re RegExp System argv 0 var line で この import avmplus って何 avmplus パッケージの謎 avmplus パッケージは ActionScript の言語仕様ではなく shell プロジェクトで定義されている 例えば avmplus System write の実体は tamarin shell SystemClass cpp の中で次のように定義されている void SystemClass write Stringp s if s toplevel throwArgumentError kNullArgumentError string core console s つまり ActionScript ByteCode な世界から呼び出すパッケージを C で実装できる というわけ shell プロジェクトは高々5 000行なので 解読も比較的簡単 自分オリジナルの avmplus exe を作れちゃう avmplus Win32 CreateWindow とか avmplus Win32 COM CreateObject InternetExplorer Application とか avmplus exe 側で実装さえすればできちゃうわけですよ 楽しそう 他の楽しいこと Tamarin の中身を探索するだけでわくわく test フォルダの中に大量の ActionScript テストコードがある undocumented な細かい仕様が分かるかも util フォルダの中に abcdump as なる怪しげな ActionScript が core abcFormat txt という ByteCode の仕様書 のようなものが

    Original URL path: http://tech.nitoyon.com/ja/blog/2007/02/01/tamarin-trial/ (2016-02-13)
    Open archived version from archive

  • asc_authoring.jar で遊んでみた - てっく煮ブログ
    new TextField text width 400 text text MySprite addChild text 手始めに mxmlc でコンパイルする場合を紹介します mxmlc default size 400 300 MySprite as これだけで MySprite swf が出力できます MySprite as で Test as を参照しているのですが そのへんも自動的に判別してリンクしてくれています では 次に本題の asc authoring jar でのコンパイルをしてみましょう SWF を作るには swf でルートになる Sprite クラスを指定します 実行時エラー java jar asc authoring jar import global abc import playerglobal abc swf MySprite 400 300 MySprite as これで MySprite as はできるのですが Test クラスが SWF に含まれていないため 実行時に参照エラーになります 実行時エラーがいやん という人は strict をつければコンパイル時にエラーになります コンパイル時エラー java jar asc authoring jar strict import global abc import playerglobal abc swf MySprite 400 300 MySprite as Compiler Error 1180 Call to a possibly undefined method Test MyScript as Ln 7 Col 27 var test Test new Test 1 error found さてさて 参照エラーを解決するには in パラメータを使って 必要なクラスを列挙してやる必要があります ここでは Test as があればいいので in Test as ですね java jar asc authoring jar import global abc import playerglobal abc in Test as swf MySprite 400 300 MySprite as これで成功 ソースコードからではなく ByteCode をリンクしてみたい気もします 直感的には import Test abc を使って次のようにできそうなんですが 実行時エラー java jar asc authoring jar import global abc import playerglobal abc import Test abc swf MySprite 400 300 MySprite as コンパイルもできるんだけど 実行時に参照エラーになっちゃう MySprite swf をバイナリエディタで覗いてみると 確かにこの場合だと Test abc の中身が MySprite swf には含まれていないご様子 ByteCode のリンクはできないんだろうか strict について補足 strict の話がでたのでついでに補足 mxmlc はデフォルトで

    Original URL path: http://tech.nitoyon.com/ja/blog/2007/01/31/asc-authoring/ (2016-02-13)
    Open archived version from archive

  • AS3の1ファイル複数クラスを応用してファクトリーメソッドを実装 - てっく煮ブログ
    醤油 public function get mochi String return 角焼 class KyotoZouni implements IZouni public function get soup String return 白味噌 public function get mochi String return 丸煮 これで準備完了 次のように使います Test as package import sample import flash display Sprite import flash utils getQualifiedClassName public class Test extends Sprite public function Test var factory ZouniFactory new ZouniFactory var z IZouni z factory create Tokyo trace z soup 醤油 z factory create Kyoto trace

    Original URL path: http://tech.nitoyon.com/ja/blog/2007/01/18/p1/ (2016-02-13)
    Open archived version from archive

  • AS3で1ファイルに複数のクラスを定義する方法 - てっく煮ブログ
    がファイル名の SampleClass as と同じです package test の中に他のクラスや関数 変数 名前空間を含めることはできません 残りの定義は package test の外で行っています foo クラスや bar 関数のように いくつでも定義できますが ファイル外からは一切参照できない点に注意してください まとめると 別ファイルに公開するクラスや関数は パッケージ宣言に書く パッケージ宣言は1つのソースファイルにつき クラス 関数 変数 名前空間のうち ただ1つの定義しか含めることができない となります パッケージの public や internal も絡みあうと複雑なので 図にまとめてみました パッケージ内の public なクラスはどこからでも参照できる パッケージ内では public internal のクラスで相互参照できる 同じファイル内のクラスは参照できる 注意すべきは class I から class I は参照できない class I は package sample とは別のパッケージに存在するため package sample の internal なクラスの参照に失敗する 別のパッケージ Test as からは class P のみ参照できる internal なクラスおよびパッケージ宣言外で宣言されたクラスは参照できない

    Original URL path: http://tech.nitoyon.com/ja/blog/2007/01/16/p1/ (2016-02-13)
    Open archived version from archive



  •