週刊nmosh - GCアップデート / Cursesビルドの統合 / ライセンス戦略

MITのアレとカブっているという抗議がかなり多かったので中断していたけど、とりあえずnmoshということで復帰。
Githubリポジトリ名とかもどうするかは考え中。全然別の名前にする手もあるけど、ライブラリ名で使ってしまったものは変えられないので非常に難しい。。

GCアップデート

使用しているBoehmGCを7.3alpha3相当にアップデートした。これで、CygwinDarwin上での問題はいくらか改善したはず。
あとBoehmGCはライセンス的にコードを改変した場合はその明示を求めているので、手元にはsubtree mergeで作ったGC(とlibatomic_ops)の全ヒストリを含んだリポジトリを持っている。

Cursesビルドの統合

Win32向けにPDCursesのCMake版を用意した。

nmoshと同じレベルにチェックアウトしておくと同時にGUI/CUICursesがビルドできるようになる予定。従来、CursesGUI版とCUI版のビルドが排他だったが、諸般の事情で両方使えるようにする必要があったので。。まだnmoshのライブラリ側が対応していないので両対応のアプリケーションは書けない。

ライセンス戦略

今のところ本体はMIT/BSDライセンスとして配布されているが、nmosh部分に関してはパブリックドメインでの再リリースを検討している。
実は著作権表記がRAMに乗らないので採用出来ないという地味に考えさせられる事例が最近あった。今回のケースでは横に掲示するなりパンフレットに入れるなりの回避策が取れなかったが、そのような方法で回避できたとしても追加のコストに見合わないケースは多いように思える。(何をもって"配布"なのかという問題も有る。今回のケースは物理的に配布するのでこの問題が起きたが、通常の展示ではこのような問題は無い。)
パブリックドメインなソフトウェアとしては、例えばSQLiteが有る。libtommathはWTFPLとパブリックドメインのデュアルライセンス(?)となっている。WTFPLやNYSLのような"いわゆるパブリックドメイン風"ライセンスは名称がpolitically correctでないという非常にどうでも良い問題から、通常のパブリックドメインと定義が異なるという本質的な問題まで色々と課題がある。
多分、現状でもっとも望ましいパブリックドメイン系ライセンスはCC0(クリエイティブ・コモンズ 0)で、実際GNUはCC0をパブリックドメイン用に推奨している( http://www.gnu.org/licenses/license-list.en.html#CC0 )。

シリアルポートのサポート

Win32上でのシリアルポートの読み書きをサポートした。まだ制御用信号はサポートしていないが、今のところの想定アプリケーション(GPS)としては十分な機能。
制御信号のサポートは地味に難しい。TCPでのOOBデータのようなもので、通常のデータストリームの中に含まれるわけではない。
あと、Win32のシリアル通信用のAPIは微妙なクセが有り、Socketのようなバッファリングルール - つまり、1バイトでも受信したら受信処理を切り上げ、受信はタイムアウトしない - を実現するには:

    theCommTimeouts.ReadIntervalTimeout = MAXDWORD;
    theCommTimeouts.ReadTotalTimeoutMultiplier = MAXDWORD;
    theCommTimeouts.ReadTotalTimeoutConstant = MAXDWORD-1; /* FIXME: WHY? */
    SetCommTimeouts(h,&theCommTimeouts);

のようにしてReadTotalTimeoutConstantに超長いタイムアウトを設定する以外の方法が無い。加えて、ReadIntervalTimeoutは効くとは限らないという問題もある。
POSIXでのサポートもそのうち復活させる予定。

ライブラリのpreキャッシュ

nmoshにturbochargeアプレットとその利用指定を行うオプション-Rを追加した。これは(nmosh applet turbocharge list)ライブラリを読み込むのに必要なライブラリを予めアーカイブしておく機能で、Win32上でこれを使用すると起動時間が劇的に改善する。

C:\build\mosh.ninja>nmosh --verbose -R
nmosh top program
-> PRELOAD: (nmosh) at 1135751
-> PRELOAD: (shorten) at 1175745
-> PRELOAD: (shorten helper) at 2576996
nmosh>

verboseオプションで確認すると、PRELOADとして表示される。アーカイブは、単にexpandしたライブラリをFASL形式(Schemeオブジェクトをシリアライズしたもの)で出力し、先頭にindexを付けて連結しただけのもの。
この機能を利用することで、nmoshを使用したアプリケーションをバイトコードだけで配布することが出来る。従来はリソースの形で実行ファイルに組み込んでいたが(この機能は結局非公開に終わった)、運用上の都合で別のファイルの方が有利かつシンプルなのでこのような実装になった。
preキャッシュの高速化はファイルを見に行かないことによって実現されているので、当然トレードオフとして元のソースコードを更新しても再度キャッシュしない限りは古いコードが(暗黙に)実行されることになる。アプリケーションとして配布するときは特にこれでも問題ない(更に、他のnmoshインスタンスの影響を受けなくなるメリットも有る)が、開発中は意外と罠になりがち。
現在はrnrsなどのSchemeベースライブラリはすべて起動時に読み込んでいるが、将来的にはこの仕組みに移行してベースライブラリであっても必要な物しかロードしないようにしたいところ。実際、nmoshの起動がpsyntaxに比べて遅いのは、起動時のランタイムライブラリの読み込みでGCが起きる所為だったりする。