私は、Microsoft Windows上でネイティブ実行可能ファイルとして実行されるTankanと呼ばれる Common Lispのプロプライエタリな商用アプリケーションを実装しました。
これは、日本語の漢字を暗記するように自分を訓練するためのプログラムです。
プログラムはバックグラウンドHTTPサーバーとして実行されます。このサーバーの実行とページへの移動は、Visual C ++を使用して開発した小さなシステム通知領域(別名「トレイ」)アイコンアプリケーションによって調整されます。
小さなトレイアイコンアプリケーションは、Lispベースのサーバーを起動、監視、および停止し、その標準入出力に関連付けられたWin32パイプを使用してLispサーバーと通信します。パイプを介して、Lispサーバーはトレイアイコンアプリケーションに正しいポート番号で正確なURLを通知し、そのトレイアイコンアプリケーションはシェルAPIを介してブラウザを起動してそのURLを閲覧できます。ユーザーはアイコンをダブルクリックするだけでUIが表示されます。
Lispプログラムは、ユーザーの入力履歴とさまざまなオブジェクト間のさまざまな関係を含むかなり複雑なセッション状態をメモリ内に維持します。Lispの循環オブジェクト表記(*print-circle*
変数で有効)とカスタムCLOS print-object
メソッド間での動作は、永続性の実装に非常に役立ちます。ユーザーは状態をディスクに保存し、中断したところから再開できます。UIの状態を含むすべてが保存されます。オブジェクトグラフには、サイクルと同様に多くの共有サブ構造があります。さらに、ディクショナリエントリオブジェクトのコンテンツのように、永続化する必要のない多くの静的な問題。ANSI Common Lispのカスタム印刷オブジェクトメソッドを使用すると、それでも機械可読なオブジェクトの要約印刷表現を作成できます。
Web UIではJavaScriptはほとんど使用されません。UIの一部を非表示および表示するためのコントロールでさえ、フォームの送信とHTMLの再レンダリングによって実行されます。したがって、UI状態のすべての詳細はサーバーにあり、ユーザーが保存するときに保持されます。HTMLの再生成は非常に高速です。それは、マクロを生成するHTMLをフィードする巨大なLispバッククォート式によって行われます。Clozure Common Lisp(CCL)によってコンパイルされたコードにより、これが非常に速く行われるため、UIの[+]ボタンをクリックして何かを開くと、サーバーにリクエストを送信し、単なるローカルJavaScript要素を実行してローカルドキュメント要素の可視性を変更するだけではなく、完全なページです。
このプログラムはもともとCLISPで開発されました。ANSI CLは標準言語であるため、実装が適切に行われ、言語の卑劣な落とし穴(「未定義」または「実装定義」の動作)があまり多くないため、CCLに簡単に移植できます。
CLISPは放棄されていません。同じ一般的なコードベースの多くを使用して、ライセンスバックエンドを強化するために引き続き使用されます。
IronCladライブラリが提供する楕円曲線暗号を使用して、プログラムのオリジナルライセンスシステムを開発しました。これは、ライセンスサーバーがライセンスに署名してそれらを認証するために使用されます。(OpenSSLのコマンドラインプログラムを使用して、サーバーキーのECパラメーターを生成した可能性があることを覚えているようです。)
ライセンスはLispオブジェクトとして表されます。Clozure Common LispによってコンパイルされたWindowsプログラムがS式ベースのライセンスを生成でき、Debianサーバーで実行されているCLISPプログラムがそのオブジェクトの欠落しているデジタル署名フィールドを埋めて送り返すことができることは、Lispの移植性へのオマージュです署名を検証できるWindowsプログラム。
サーバーでは、CGIベースのライセンスサービスに加えて、ライセンスを管理するための簡単なコマンドラインAPIを使用します。ライセンスを一覧表示し、特定のライセンスを見つけ、その属性を編集できます。たとえば、一時ライセンスの有効期限を編集して、ユーザーに例外を付与するなどです。ライセンスバックエンドも電子メールを生成します。サーバー側のCGI処理にライブラリを使用しませんでした。Apache環境変数とコマンドライン引数を処理するために、手巻きのLispコードを使用しました。(ただし、URLエンコードとHTML生成の処理にはライブラリコードが使用されます。)ストレージにデータベースは使用されません。ライセンスは呼ばれるファイルに連結され、licenses.lisp
それだけです。