サーバサイドでCommon Lispを使いたい!
今日は風子の誕生日ですね。
風子、誕生日おめでとー。
まあ、それは置いといて、
サーバサイドでCommon Lispを使いたい!
*サーバでCLの処理系を動かす*
まず、どうやってCLの処理系を動かすか、少し考えてみました。
1. CGIとしてCLを走らせる (恐ろしく遅い予感)
2. 何か専用のモジュールとか使う
3. 頑張って何とかする
で、調べてみたら、mod_lispというものがあるそうです。
FreeBSDならportsから簡単に入れることが出来ます。
これは、Apacheにきたリクエストを「Lispサーバ」に渡し、Lispサーバからのレスポンスを
元のレスポンスとして返すものです。Reverse Proxyのようなもの?
この「Lispサーバ」は、mod_lisp専用のプロトコルを話すCLのプログラムです。
これは、Apacheと同一マシンで動かしても異なるマシンで動かしてもいいようです。
ここで、少し疑問。
mod_lispという名前の割には全然Lispが関係ない気がします。
なんというかLisp『でも』使えると言った感じが…
*CLで書かれたWebアプリケーション*
CLで書かれた便利なものはないかと探してみたら、
CL-Wikiと、CLikiというものを発見。
CLikiは色々出来る半面、導入が面倒な(気がした)ため、CL-Wikiを使ってみました。
これは、Wikiだけではなく、HTTPサーバの役割も果たすようです。
上記サイトからCL-Wikiのソースをダウンロードし展開し、CLISP上で
> (load “start.lisp”)
とすると、ポート8080にCL-Wikiのサーバが立ち上がりました。
試しにブラウザから127.0.0.1:8080にアクセスすると無事表示されました。
次に、Apacheと共存させるために、mod_lispを入れた後に、http.confに次のような内容を追加。
#lisp LoadModule lisp_module /usr/local/libexec/apache22/mod_lisp2.so LispServer 127.0.0.1 8080 "cl-wiki" <Location /lisp> SetHandler lisp-handler </Location>
これで、127.0.0.1/lisp/にアクセスがあると、リクエストがCL-Wikiに飛ばされますが、
このままでは動作しません。
最初に書いたとおり、mod_lispは独自のプロトコルを使うため、
CL-Wikiの話す言葉をHTTPからmod_lispのものに書き換える必要があります。
とりあえず、必要そうなところを適当に書き換えたところ、
部分的ではありますが、無事CL-Wikiが動作しました。
ところで、勝手にソース書き換え単ですが、CL-Wikiのライセンスってどうなってるんでしょうか。
調べてもどこにもライセンスが書いてない気が…
*誰かエロい人教えて*
ちょこっと遊ぶ分にはうまく動いたようですが、
実際に外部に公開する場合、このやり方で大丈夫なんでしょうか。
CLを使ったWebサービスってどうなってるんだろう…
(AllegroCLのあれこれを使うっていうのは無しで(^^))
(追記)
CL-Wikiの作者のonjoさんにCL-Wikiを自由にあれこれする許可を頂きました。
ありがとうございます。
>これは、Wikiだけではなく、HTTPサーバの役割も果たすようです。
>試しにブラウザから127.0.0.1:8080にアクセスすると無事表示されました。
>CL-Wikiの話す言葉をHTTPからmod_lispのものに書き換える必要があります。
変なmoduleなんか使わないでReverse Proxyからリクエストを回すだけで動くと思うけど。
それも試してみようと思ったんですが、
mod_proxyが上手く入らなかったので、
現在放置しています(笑)
[…] 先日、後輩が 「風子の誕生日を祝ったのに、観鈴ちんの誕生日を忘れてた人がいるらしいですよ」 と私の古傷をえぐってきたので、 傷を癒すためにゲームを作った。 […]