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
lib.zip Set lib.zip as the default location for library files Executes main.js if found in the zip file
program.js Runs a JavaScript program. If omitted, enter console mode D:\jsdb>
ということは、「main.js」にメインコードを記述し、それをzipで固めて、チュートリアルにあるように結合コピーするとオリジナルのコンソールアプリケーションが作れるってことじゃない!こいつぁ便利かも。

早速試してみた

まず、以下のコードを「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秒

このエントリの内容に誤りが見つかったので、別エントリを立てました。以下の内容は無視してください。訂正内容はこちらをご覧ください。(2007/05/05 23:05)
さらに追加情報をこちらに書きました。(2007/05/07 13:40)

あれれ、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")
でもうまく読み込まれる。