全く予備知識なしの人はいないかもしれないけど念のため:
激しく進化中なので将来変わるかもしれない。
準備するもの:
注意:
% ./configure ... --enable-threads=pthreads ...
% getconf GNU_LIBPTHREAD_VERSION
NPTL 2.4
% ./configure ... --enable-multibyte=utf-8 ...
こうなってればOK
% gosh -V
Gauche scheme interpreter, version 0.8.10 [utf-8,pthreads]
詳細な手順については、Kahuaのサイトの「チュートリアル Step0」を参照してもらうとして...
とりあえず /usr/local/kahua の下にまとめて放り込むのがお薦め。
% ./configure --prefix=/usr/local/kahua
% make
% make -s check
% sudo make install
% ./configure --prefix=$HOME/kahua
% make
% make -s check
% make install
% make install
% kahua-admin update ワーカ名
$HOME/workの下に、siteという名前でサイトバンドルを作成する。
% kahua-package create ~/work/site
注意:
% cd ~/work
% find site
site
site/app
site/app-servers
site/database
site/etc
site/etc/kahua.conf
site/etc/user.conf
site/logs
site/plugins
site/run
site/socket
site/static
site/templates
site/tmp
Kahuaを起動するとは、kahua-spvr(スーパバイザ)を起動すること。kahua-spvrが残りのサーバプログラム群を起動/管理する。
% kahua-spvr -S ~/work/site -H 8088
コマンドラインオプション:
% (kahua-spvr -S ~/work/site -H 8088 >>/path/to/stderr.log 2>&1 &)
% screen -d -m kahua-spvr -S ~/work/site -H 8088
→ redditもどきを作る
(またブックマークかよ)
まずは$HOME/workの下に bookmarks というスケルトンを作成する。
% kahua-package generate bookmarks
Creator Name> Tatsuya BIZENN
E-Mail Address> bizenn@kahua.org
% cd bookmarks
生成されたそのままをビルドして先ほどのサイトバンドル(~/work/site)にインストールしてみる。
% ./DIST gen
% ./configure --prefix=/usr/local/kahua \
--with-site-bundle=$HOME/work/site
:
% make
:
% make check
:
% make install
configureオプションの意味:
$HOME/work/site/app-serversファイル(起動設定ファイル)に
(bookmarks :arguments () :run-by-default 1)
を追加する。
;; -*-scheme-*-
;; Application Service Configuration alist.
;;
(;;Each entry follow this format:
;;(<type> :arguments (<arg> ...) :run-by-default <num>
;; :profile <path-to-profile-base>
;; :default-database-name <path-to-database>)
(bookmarks :arguments () :run-by-default 1))
kahua-adminコマンドを起動してapp-serversを読み直させる。
% kahua-admin -S ~/work/site
spvr> ls
wno pid type since wid
spvr> reload
(bookmarks)
spvr> ls
wno pid type since wid
0 23223 bookmarks May 23 17:57 hx3:dudm
reloadコマンドは、app-serversを読み直し、必要ならワーカを起動する。すでに起動しているワーカプロセスに対しては何もしない。
ついでに後ほどkahua-shellで使用する開発ユーザをサイトバンドルに追加しておく。
spvr> lsuser
()
spvr> adduser bizenn hogehoge
done
spvr> lsuser
("bizenn")
(require 'kahua)
(setq auto-mode-alist
(append '(("\\.kahua$" . kahua-mode))
auto-mode-alist))
実はEmacs 21.4ではこの機能が動かないらしい... 確認して、1.0.4までには直します。
*.kahuaなファイルの役割は、継続エントリと永続クラスを定義すること
ブックマークエントリを保存するためのクラスを定義する。
(define-class <bookmark-entry> (<kahua-persistent-base>)
((url :init-keyword :url :allocation :persistent
:index :unique) ;; 重複を許さない
(title :init-keyword :title :allocation :persistent
:index :any) ;; 重複を許す
(score :init-value 1 :allocation :persistent)
(count :init-value 0 :allocation :persistent)))
このクラスのインスタンスは暗黙のうちにオブジェクトデータベースに保存される。
(define page-template
(kahua:make-xml-template
(kahua-template-path "bookmarks/page.xml")))
(define-entry (index)
(define (bookmark-list/)
(table/
(map/ (lambda (bm)
(tr/ (th/ (a/ (@/ (href (ref bm 'url)))
(ref bm 'title)))
(td/ (ref bm 'count))
(td/ (ref bm 'score))))
(coerce-to
<list> (make-kahua-collection <bookmark-entry>)))))
(kahua:xml-template->sxml
page-template
:title (title/ "Reddit modoki revised")
:body (bookmark-list/)))
名前つきの継続エントリ(有名エントリ/well knownエントリ)を定義する。
書式:
(define-entry (entry-name path1 path2 ...
:keyword param1 param2 ...
:mvkeyword mvparam1 mvparam2 ...
:rest restpaths)
body ...)
次のようなHTTPリクエストがワーカに渡ってきたら、
POST /bookmarks/entry-name/fuga/hoge/moke/fugu HTTP/1.1
param1=value1&mvparam1=mvalue1
ワーカは以下のように変数が束縛された環境でbody部分を評価する(==継続エントリを起動する)。
path1 = "fuga"
path2 = "hoge"
param1 = "value1"
param2 = #f
mvparam1 = ("mvalue1")
mvparam2 = ()
restpaths = ("moke" "fugu")
(define-entry (new)
(define (submit-url-form/)
(form/cont/
(@@/ (cont (entry-lambda (:keyword url title)
(make <bookmark-entry>
:title title :url url)
(redirect/cont (cont index)))))
(table/
(tr/ (th/ "Title: ")
(td/ (input/ (@/ (name "url")))))
(tr/ (th/ "URL: ")
(td/ (input/ (@/ (name "title")))))
(tr/ (th/)
(td/ (input/ (@/ (type "submit")
(value "Submit"))))))))
;; 次のページに続く
;; 前のページから続く
(kahua:xml-template->sxml
page-template
:title (title/ "Submit URL")
:body (submit-url-form/)))
無名の継続エントリを定義する
(entry-lambda (path1 path2 ...
:keyword param1 param2 ...
:mvkeyword mvparam1 mvparam2 ...
:rest)
body ...)
引数の意味やURLの各要素とのマッピングはdefine-entryと同じ
(define-entry (entry-name ...) ...)
==
(define-entry entry-name (entry-lambda (...) ...))
(redirect/cont (cont entry-name ...))
(define (go/countup bm)
(inc! (ref bm 'count))
(html/
(extra-header/ (@/ (name "Status") (value "302 Found")))
(extra-header/ (@/ (name "Location") (value (ref bm 'url))))))
;; 次のページに続く
;; 前のページから続く
(define-entry (index)
(define (bookmark-list/)
(table/
(map/ (lambda (bm)
(tr/ (th/ (a/cont/
(@@/ (cont (cut go/countup bm)))
(ref bm 'title)))
(td/ (ref bm 'count))
(td/ (ref bm 'score))))
(coerce-to
<list> (make-kahua-collection <bookmark-entry>)))))
(kahua:xml-template->sxml
page-template
:title (title/ "Reddit modoki revised")
:body (bookmark-list/)))
キモはここだけ
(td/ (a/cont/ "[up]"
(@@/ (cont (lambda ()
(inc! (ref bm 'score))
(redirect/cont (cont index))))))
(a/cont/ "[down]"
(@@/ (cont (lambda ()
(dec! (ref bm 'score))
(redirect/cont (cont index)))))))
shiroさんのWiLiKiの Kahua:Reddit-modoki のページに貼ってあります。また、パッケージとして、www.kahua.orgからもダウンロードできるようにしておきます。
どれもそう難しくないし、チュートリアルでは一部触れているのでやってみて下さい。
ご清聴ありがとうございました。
今後もKahuaをよろしくお願いします。