よろずや

IMHO - Common Lisp で Web システム

IMHO の特徴

IMHO (Internet Metahumble Object) は Web アプリケーション作成のためのツール キットです.Apache と組み合わせて使うことにより, Common Lisp でバリバリ Web 開発ができます.

なんと,CLOS オブジェクトが HTML 要素と対応してます.例えば,HTML テンプレートとして,

<h2>いらっしゃいませ</h2>

あなたは <imho name="hits"></imho> 人目のお客様です.

...

のような index ページのテンプレートを準備したら,

(defclass index (html-element) ()) ;; index ページ用クラス
(defbindings index
  ((hits :type my-counter)))       ;; hits 要素を自前の my-counter クラスに対応させる

(defvar *hits* 0) ;; カウンタ用変数を用意
(defclass my-counter () ()) ;; カウンタクラス
(defmethod render-html ((self my-counter) steram)
  (incf *hits*) ;; カウンタを 1 増す
  (format steram "~X" *hits*)) ;; カウンタを 16 進数で出力

とかできるんです.もう,不恰好で非効率な HTML とはおさらば〜. さらに,html 上のリンクをメソッド呼びだしと対応させたりと,なかなか愉快です.

インストール方法(asdf 使用)

まず,必要なものは apache, cmucl, asdf です.これらが準備できたら,あとはま ず,onshored.com から odcl, imho を anoncvs 経由で入手するだけです.以下は ~/commonlisp にパッケージを置くと仮定してますので,その辺は適切に調整してく ださい.

$ cd ~/commonlisp
$ ls
asdf
$ cvs -d :pserver:anoncvs@aleph.onshored.com/cvs login
password:    ;; パスワードは anoncvs でおけ
$ cvs -d :pserver:anoncvs@aleph.onshored.com/cvs checkout odcl
$ cvs -d :pserver:anoncvs@aleph.onshored.com/cvs checkout imho
$ ls
asdf imho odcl

あとは,~/.cmucl-init に

(load "home:commonlisp/odcl/odcl.asd")
(when (not (find-package "ODCL"))
  (asdf:oos 'asdf:load-op :odcl))
(load "home:commonlisp/imho/imho.asd")
(when (not (find-package "IMHO"))
  (asdf:oos 'asdf:load-op :imho))

とでも書いておいてください.ある程度慣れてきたら,イメージに取り込んでしまう のがいいでしょう.これで Lisp 側の設定は完了です.あとは apache に mod_webapp.so モジュールを組み込むだけです.

$ cd ~/commonlisp/apache/
$ gmake
$ cd apache-1.3
$ su
password:
# mv mod_webapp.so /usr/local/libexec/apache
# cd /usr/local/etc/apache/
# vi httpd.conf

で,httpd.conf には

LoadModule webapp_module    libexec/apache/mod_webapp.so
AddModule mod_webapp.c
<IfModule mod_webapp.c>
  WebAppConnection main warp 127.0.0.1:8007
  ServerName 127.0.0.1
  Port 80
  WebAppMount testapp1 main /imho/
</IfModule>

を書き加えましょう.これで設定とインストールは完了です.

手元の動作環境は,

です.

インストールが完了したら,サンプルを実行してみましょう.

$ cd ~/commonlisp/imho/example
$ lisp
CMU Common Lisp 18e, running on lavie
With core: /home/lambda/local/lib/cmucl/lib/user.core
Dumped on: Fri, 2003-05-26 20:36:49+09:00 on localhost
See <http://www.cons.org/cmucl/> for support information.
Loaded subsystems:
    Python 1.1, target Intel x86
    CLOS 18e (based on PCL September 16 92 PCL (f))
    Gray Streams Protocol Support
* (load "testapp1.lisp")

; Loading #p"/home/lambda/commonlisp/imho/example/testapp1.lisp".
t
*

あとは,ブラウザで http://localhost/imho/testapp1 を見てみましょう.無事 に Hello, World が表示されたでしょうか?ちなみに,testapp1 の内容は

(in-package :imho)

(defclass testapp1-element (html-element) ())

(defmethod render-html ((element testapp1-element) stream)
  (format stream "Hello World!"))

(defapplication testapp1
  :base-url "testapp1"
  :initial-element testapp1-element)

(init/application 'testapp1 :start)

testapp1.lisp

このようなとても短いプログラムです.

実践編

初プロジェクト(IMHO ダウンロード〜現在まで約半日)

Franz 主催の Dynamic Lerning Center もどきを製作してみました.仕様と解答の他 にヒントも表示できるようにしようと考えて製作中.

トップページ

エクササイズに移動したところ

ヒントを表示

解答を表示させようとしているところ

解答を表示させたところ

難易度順にソートしたところ

さらに一日開発

さらにユーザー管理を組み込んでみました.少しだけ拡張も視野の隅っこに入れつつ開発中.開発中のソースは こちら です.

トップページ

まだ登録されていない場合は新規ユーザー作成になる

問題集へ(他にもいろいろ機能を増やす予定)

問題を選んでいる

ヒントを表示しようとしている

解答を表示しようとしている

終了する

終了したものは色がかわる