EXEを作ってみた ― 2007年05月04日 03時11分17秒
これはちょっと便利かも
ゆるゆるとJSDBを試しているが、本家のチュートリアル眺めてたら、「Standalone JSDB programs」という項があって、
c:\temp>pkzip program.zip main.jsとか書いてあるじゃないですか。
c:\temp>copy /b jsdb.exe+file.zip program.exe
c:\temp>program.exe
さらに-helpオプションつけて起動してみたら、.zipのアーカイブをパラメータに渡せるとあった。
D:\jsdb>jsdb -help JSDB 1.52Compiled Apr 27 2007. http://www.jsdb.org/ Copyright 2003-2006 by Shanti Rao and others. JSDB [-strict] [-werror] [-load file.js] [-debug server] [lib.zip] [program.js] -strict Strict syntax mode -werror Treat warnings as errors -load file.js Load and run file.js before program.js -debug server:port Connect to a debugger serverということは、「main.js」にメインコードを記述し、それをzipで固めて、チュートリアルにあるように結合コピーするとオリジナルのコンソールアプリケーションが作れるってことじゃない!こいつぁ便利かも。lib.zip Set lib.zip as the default location for library files Executes main.js if found in the zip fileprogram.js Runs a JavaScript program. If omitted, enter console mode D:\jsdb>
早速試してみた
まず、以下のコードを「main.js」で保存。コードの中身はかなり適当。
write("what your name ? > "); writeln( "hello, ", readln()," !!" ); sleep( 1000 );
そんで、main.jsをmain.zipとして固める。
そしてチュートリアルにある要領で、コピー。hello.exeとした。
D:\jsdb>copy /b jsdb.exe+main.zip hello.exe jsdb.exe main.zip 1 個のファイルをコピーしました。 D:\jsdb>さて、hello.exeを実行。
D:\jsdb>hello what your name ? > hoge hello, hoge !! D:\jsdb>おお、ちゃんとできてるよ。
使い道
とりあえず思いつくのは、ライブラリ読み込み処理をmain.jsに記述してカスタマイズした実行環境にするってとこかな。
と思ったが、アーカイブ内のmain.jsを実行するとそのまま終了しちゃうので、この方法だとドラッグドロップ専用になっちゃうな(たぶんコマンドライン引数は受け取れるだろうから)。 もっとも、ライブラリロードを起動時になんとかするんだったら、-loadをくっつけたバッチファイルにしちゃえばよいんだし。ちぇ。
JSDBを触ってみた[2] ― 2007年05月02日 01時02分55秒
あれれ、Streamでhttpが...
前回のエントリでローカルディスクからのprototype.jsの読み込みを行ったが、なんとなくhttp経由もやりたくなったのでちょっと試してみた。
js>var stream = new Stream("http://localhost/prototype.js") js>stream.readText()あれれ、ハマったまま帰ってこないよ。
気を取り直してもう一度
んじゃ、1行づつ読んでみるか。
js>var stream = new Stream("http://localhost/prototype.js") js>while( ! stream.eof ) { writeln( stream.readln() ); } /* Prototype JavaScript framework, version 1.4.0 * (c) 2005 Sam Stephensonあれれれれ、最後の「}」を出力しないでハマってるよ。: : element = element.offsetParent; } while (element); return [valueL, valueT]; }
もしかして...
prototype.jsのソース(1.4.0ね)を確認したところ、Safari対応の条件判断のifブロックを閉じた後に改行なしでEOFになっていた。
もしや、と思ってその後に改行を1つ入れたところ、2番目のコードで最後まで読み込んで制御が戻ってきた。
...って、! stream.eof が真にならないの!?
さらに
改行追加版のソースにしても、最初の stream.readText() はやはり制御を返さないし。
あと、テキスト操作のせいかわからんが、posやpositionプロパティは常に0のまま。どういうこっちゃ。
ここまでの暫定結論
http読み出しはXHRを使うしかないな。と思ったら、XMLHttpRequestの実装、ないのか。
ってことは、ActiveX使えってか?うむ、JSDBはもう少し様子見かな...
JSDBを触ってみた[1] ― 2007年05月01日 18時46分07秒
またprototype.jsかよ
JSDBをちょっと触ってみた。で、我ながらアレだと思うが、prototype.jsをロードしてみようと。
基本的にはおんなじ
前に書いたprototype.jsを使えるようにと同じ方法でロードできる。
js>load("dummy.js") true js>load("prototype.js") true js>$R(1, 10).each( function(value, index) { writeln( "[" + index + "] - " + valu e ); } ) [0] - 1 [1] - 2 [2] - 3 [3] - 4 [4] - 5 [5] - 6 [6] - 7 [7] - 8 [8] - 9 [9] - 10 js>
ただ、load関数はローカルファイルパスのみ有効みたいで、URL渡したら(なぜかtrueを返すが)コードは実行されなかった。仕方ないから、JSDBのインストールパス内にlibsとでもサブフォルダ切ってそこにぶち込んでおくとよいかと。
おまけ
WSHでもだいたい通るみたいだが、パスセパレータに「/」(スラッシュ)も指定できる。JSDBインストールフォルダにサブフォルダ「libs」を切って、そこにprototype.jsを設置したとすると、
load("libs/prototype.js")でもうまく読み込まれる。
最近のコメント