昨年より、ほぼシングルスレッドサーバwizdLiveを作成しております。
これにTinyJSを組み込んでWebアプリケーションを作れるようになったのでご報告です。
TinyJS本体は概ねそのままです。起動時にGET,POSTのパラメータを変数として受け渡す部分を追加、またファイル関連、文字列操作関連を大幅に追加しました。これで従来PHPで動いていたアプリをいくつかTinyJSに移植できました。完全にシングルスレッドだとプロセスが待受で止まってしまう可能性もあるので一応forkで起動しています。いくつか修正すれば完全シングルスレッドも可能かと思います。以下は移植したファイルブラウザーから指定フォルダーをtgzでダウンロードするソース。
/dev/null 2>/dev/null";
//実行します
command(cmd);
return filepath;
}
addr = _GET.path;
if( addr[addr.length-1] == '/' )
{
addr = addr.substr(0,addr.length-1);
}
if( addr.length > 0 ){
tempname=Math.randInt(1000000,9999999);
tempname += '.tgz';
path = createZip(addr,tempname);
// ダウンロードさせるファイル名
tmp_file = path;
j_file = tempname;
// ヘッダ
header("Content-Type: application/octet-stream");
// ダイアログボックスに表示するファイル名
header("Content-Disposition: attachment; filename="+j_file);
// 対象ファイルを出力する。
aa = FILE.loadFromFile(tmp_file);
print( aa );
//削除
FILE.unlink(tmp_file);
}else{
print "圧縮するファイルがみつかりません。";
}
?>
2014-01-16 14.00.49
よく考えたらサーバ側に.jsのコードもあるわけで、サーバ側はjssという拡張子で動作させてます。サーバサイドとクライアントサイドの切替はで可能です。コマンドは随時適当に足してるので一貫性はないんですが、FILE.xxxxはファイル操作系の命令です。名称はphpから変更してないのが多数です。実装時に悩んだんですが、QueryStringは_GET.クエリー変数名で取得できます。やっぱり連想配列の方がよかったですね。そのうち修正します。JSSの拡張子で受けたリクエストをTinyJSに流し込んで実行してます。
さて最近raspberry-piを入手したので早速こちらでコンパイルしてみました。raspberry-piは起動時にアドレスを調べるのが面倒ですね。固定IPにすれば簡単ですが、やはりDNS環境が多いと思うのでなんとかしたいところです。本来wizdliveにはSSDPの機能があってローカルアドレスに自分のアドレスをブロードキャストする機能があるんですが、SSDP受信側のプログラムを作ってないので今回はローカルIPアドレスを別ホストにhttpgetして登録するプログラムをちゃちゃっと作りました。キーは自分のグローバルIPになります。グローバルIPとローカルIPをセットで送信して、ローカルIPなしに別ホストを見にいくとその記録がわかる仕組みです。
ソースはCENTOS6.3の64ビットから32ビットに変換なので、なるべく共通に使えるように修正。主にprintfでのsize_tの扱いを変更しました。これは”%zu”でいけるんですね。勉強になりました。
あとはraspberry-piの/etc/rc.localに起動用にスクリプトを記述して終了。
iPhoneからテザリングしてraspberry-piに接続します。iPhoneのテザリングは通常の方法では記述が足りないようで、デスクトップのツールから認識させました。手作業で失敗してる人はこれを使ってみて下さい。ただ認識が不安定で一度電源落としてからインターネット共有ONにしないと認識しない場合が多いですね。
iPhoneを認識さえしてしまえば、ipもわかるのでiPhoneからsshしたりプログラミングしたりが可能となります。実際には書いてるソースがPC向けなのでiPhoneだとなかなか操作難しいですけどね。
あとはmp3のタグ情報表示したりする関数を作ってるので、オーディオハブにしようかなぁと思ってるところです。なんていったって最近のSDカードは実用に足る容量のカードが数百円ですもんね。1GBのHDDを10万で買った昔が忍ばれます。
ソースを公開しておきます。
github
Copyright(c) 2015 Birdland Ltd. All Rights Reserved.