Professional Documents
Culture Documents
Shibuyaes Takesako
Shibuyaes Takesako
~ eval のいばら道 ~
※ 某 G 調査機関による調べによる
4
JavaScript でフォント名一覧を
取得する 3 つの方法
<OBJECT id="dlgHelper"
CLASSID="clsid:3050f819-98b5-11cf-bb82-00aa00bdce0b"
width="0px" height="0px"> </OBJECT>
function getAllFontsByDialogHelper() {
var fontslist = '';
try {
for (var i = 1; i < dlgHelper.fonts.count; i++) {
fontslist += dlgHelper.fonts(i) + '\n';
}
}
catch(e) {
fontslist = 'sorry, could not get fonts list.';
}
return fontslist;
}
6
7
※ 動作するブラウザが激しく IE に限定される
8
(2) LiveConnect で Java アプレットを操作
java.awt.GraphicsEnvironment#getAllFonts()
function getAllFontsByLiveConnect() {
var fontslist = '';
try {
var fonts = java.awt.GraphicsEnvironment.
getLocalGraphicsEnvironment().getAllFonts();
for (var i = 0; i < fonts.length; i++) {
fontslist += fonts[i].getFontName() + '\n';
} LiveConnect
} - Netscape3 以降の仕様( JavaScript1.
catch(e) { 1)
fontslist = 'sorry, could not get fonts list.';
} - Firefox, Opera で動作
return fontslist; Java のオブジェクトを JavaScript から操
} 作
9
LiveConnect とは?
できること
Java のオブジェクトを JavaScript から操作できる
その逆も
動作環境
Netscape3 以降( JavaScript1.1 )の仕様
Firefox, Opera で動作
使用できる条件
Java アプレットの実行が許可されているとき
10
(3) Flash の TextField.getFontList() を利用
user_fonts.sort();
getURL('javascript:fontList("‘
+ escape(user_fonts)
+ ‘“)’, '_self');
斜め下から始める
初めての Flash
13
FlashProxy.swf で Flash 関数を動的実行
function Sound(){
return new FlashProxy("Sound", Sound.methods);
}
var sound = new Sound();
:
class FlashProxy{
static var proxy;
var target;
function FlashProxy() {
this.target = new (eval(_root.className));
}
return obj;
}
function addListener(event) {
this.target[event] = function(){
ExternalInterface.call("FlashProxy.onTrigger", _root.id, event, arguments);
}
}
class FlashProxy{
static var proxy;
var target;
function FlashProxy() {
this.target = new (eval(_root.className));
19
JavaScript から Flash
の
スタティック関数を
eval っぽく実行したい!
20
例えば Ruby の場合…
1. ふつうの eval
2. Object#instance_eval
3. Module#module_eval/class_eval
→ 空前のメタプログラミング期ブーム
21
それ
Flashy.swf
でできるよ
22
それ Flashy.swf 使えばできるよ
<script language="JavaScript">
var flash = document.getElementById('flashy');
flash.setStatic('flash.system.IME.enabled', true); // IME オン
</script>
eval 使えないけど、どうする???
JavaScript で SWF を動的生成すればできる
よ!
<script>
var data = ‘data:image/gif;base64,’+
‘R0lGODlhAAEwAMQAAJ2M5Me98GRK1DoYyYBr3PHv ・・・(中略)・・・
Pe99XO81Y50auc6PBkZEgpzbmt7HJa2I57CffgnMNqmWHAWNBwwGsKp
KsrmJqltOOV69nuYxSkqpoTata18rWtrr1rTIIAQA7';
http://www.kawa.net/works/js/data-scheme/base64.html
Firefox, Opera で動作 残念ながら IE では動作しませんが・・・
27
GIF SWF
28
SWF ファイルフォーマットの仕様書
29
Alexis' SWF Reference http://sswf.sourceforge.net/SWFalexref.html
: : : : 30
SWF File Header, SWF Tags…
struct swf_header {
unsigned char f_magic[3]; 'FWS' or 'CWS'
unsigned char f_version;
unsigned long f_file_length;
}
struct swf_header_movie {
swf_rect f_frame_size;
unsigned short fixed f_frame_rate;
unsigned short f_frame_count;
};
struct swf_csmtextsettings {
swf_tag f_tag; /* 74 */
unsigned short f_text_id_ref;
unsigned f_use_flag_type : 2;
unsigned f_grid_fit : 3;
unsigned f_reserved : 3;
long float f_thickness;
long float f_sharpness;
unsigned char f_reserved;
}; 31
SWF ファイルを
DIS アセンブル
しながら勉強したい…
32
swfdump コマンドで DIS アセンブル
:
( 8 bytes) action: unknown[8e] (remainder of 8 bytes:"\0\0\0\2)\0p\0")
:
アクションレコードの抽出に失敗 …
orz 34
SWF::Parser (CPAN) なら・・・
dumpswf.plx
Flash.swf そのものを生成する
Perl スクリプト「 Flash.pl 」を生成
http://www.nmt.ne.jp/~ysas/butaperl/swf/Parser.sjis.pod.html
http://search.cpan.org/~YSAS/SWF-File/lib/SWF/Parser.pm
35
Sothink SWF Decompiler (試用期間 30 日)
http://www.sothink.com/product/flashdecompiler/ 36
DIS アセンブル結果( Sothink SWF Decompile
r)
37
しかし、
URI データスキームに
埋め込みの SWF は
Flash Player 9
では動かない… orz
Flash Player 8 では動いたのに(><)
38
Flash 上で動く ECMAScript の処理系
があればいいじゃね?
バイトコードインタプリタ
一旦スクリプトをバイトコード的なものに変換してから
独自 VM 上で実行
ECMA-262 3rd Edition にほぼ準拠
+いくつかの拡張(コルーチンなど)
ActionScript1 的な感じで記述が可能
詳しくは Web で
http://www.be-interactive.org/?itemid=6
http://www.be-interactive.org/?itemid=194
41
Xelf (ゼルフ)の開発者 – 新藤さん(高校 3 年生)
ゲームを製作しやすくしよう
プロジェクトの一環とし
て、 ECMAScript + α の
処理系を Flash(AS) 上に
実装
期待 age
42
まとめ
43
Flash で eval っぽいことをするには?
JavaScript でできないことをプラグインで
Java アプレット + LiveConnect ( IE では使えない)
Flash 使えばいろいろできる(クロスブラウザ)
JavaScript から Flash のコードを実行したい
ActionScript で任意の関数を呼ぶ方法
FlashProxy.swf ( id:brazil さん)
Flashy.swf (奥一穂さん)
SWF ファイルの動的生成( URI データスキーム)
Flash Player 9 以降ではもう使えない技… orz
Flash 上で動く ECMAScript + α の処理系あるよ
これ最強! 新藤さん GJ
44
ご清聴ありがとうございました