新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

とりあえず hunchentoot ふたたび

ubuntu で試す

sudo apt install cl-hunchentoot でいけます。 インストールしただけだと何も使えません。悪いことに ubuntu のパッケージからは test が削られてます。まずは”素”の hunchentoot を動かします。

acceptor で動かす(ほとんど素)

#-:asdf (load "/usr/share/common-lisp/source/cl-asdf/asdf.lisp")
(require :hunchentoot)
(require :cl-who)
(setq hunchentoot:*hunchentoot-default-external-format*
     (flex:make-external-format :utf-8 :eol-style :lf))
(setq hunchentoot:*default-content-type* "text/html; charset=utf-8")

(hunchentoot:start
      (make-instance 'hunchentoot:acceptor :port 4242))

これで動きます。 localhost:4242 にアクセスして welcome のページが見れればまずは OK です。 f:id:ryos36:20190228152021p:plain

さて、これどこを見ているかというと、default の root というのが”コンパイル時"に決まるようになっていて、ubuntu で標準にいれれは /usr/share/common-lisp/source/hunchentoot/www です。 参考までに書くと make-instance 時に :document-root を指定すればそこが標準の root になります。

  (make-instance 'hunchentoot:acceptor :port 4242 :document-root "/home/WWW")

easy-acceptor で動かす

cgi 的なことが簡単にできます。easy と書いてありますが、あまり細かい設定をする必要がない場合、というかたいていの場合ではこちらを使うことになるかと思います。素の acceptor は本当に素で(機能的に分離したようだ)、dispatch-table 的なものすらありません(たぶん)。なので、acceptor を単純に使おうとすると、”恐らく"自分で handler を書き直さないといけなくて、その場合は acceptor を継承した class を作る必要がありそうです。 以前の hunchentoot は dispatch-table を自分で頑張って書いていた印象がありますが(うろおぼえ)、easy-acceptor を使えば handler を定義するだけで OK です。

#-:asdf (load "/usr/share/common-lisp/source/cl-asdf/asdf.lisp")
(require :hunchentoot)
(require :cl-who)
(setq hunchentoot:*hunchentoot-default-external-format*
     (flex:make-external-format :utf-8 :eol-style :lf))
(setq hunchentoot:*default-content-type* "text/html; charset=utf-8")

(hunchentoot:start
      (make-instance 'hunchentoot:easy-acceptor :port 4242))

(hunchentoot:define-easy-handler (say-yo :uri "/yo") (name)
  (setf (hunchentoot:content-type*) "text/plain")
  (format nil "Hey~@[ ~A~]!" name))

はい clisp でも sbcl でも ubuntu 上で動きました(追記: clisp 不安定。sbcl がおすすめです)。localhost:4242/yo にアクセスできれば OK です。localhost:4242/yo?name=yoyo などとラッパーの掛け合いよろしく遊んでください。 上のソースは実験的に start を先にしていますが、通常は逆でしょうね(start が後)。

古い情報に注意しましょう

この blog は 2019/2/28 に書いてますが、私はその情報で右往左往しました。 たぶん hunchentoot のバージョンが上がったことによる差異でしょう。今後は hunchentoot を使う時はパッケージ作って、バージョンチェックしないとダメかも。

まずは hunchentoot:start-server を使っているもの。相当古いので使えません。(私が知っていたのはこのあたり) 2008 年頃の blog に見ることが出来ます。 2011 年頃は、情報が途中ですね。acceptor だとたぶんほとんどと何もできません。サーバが立ち上がるので間違ってはないのですが。いくつかのサイトは acceptor をつかっています。easy-acceptor じゃないと動きませんでした。たぶん、いまや easy-acceptor でないと動かないと思います。

いろいろ調べる羽目に

動かすためにいろいろ調べる羽目になってしまいました。まずは asdf の設定を変えました。keen さん?とかを参考に ~/.config/common-lisp/source-registry.conf.d/ をつくり、10-systems.conf に (:tree "/usr/share/common-lisp/source/") と書いてます。そこで 00-debug.conf とかつくって (:tree (:home "Lisp/")) として、そのディレクトリに git から hunchentoot と usocket を持ってきました。usocket を持ってきた理由は、新しいバージョンの hunchentoot が新しいバージョンの usocket に依存していたためです。(めんどくさ~~い) これで最初は log-message* 関数を使ってログを出し(エラー出力に表示される)、最後はソース読んで改変して動きを確かめました。一苦労でした。