Upload
kazuhiro-hishinuma
View
6.226
Download
3
Embed Size (px)
DESCRIPTION
Lisp Meet Up presented by Shibuya.lisp #5 での発表資料 cf. http://atnd.org/events/39675
Citation preview
GaucheでCGIプログラミング
Kazuhiro Hishinuma (@kazh98)
MCPC: a Compe==ve Programming Circle. 1
自己紹介
• Kazuhiro Hishinuma (かにたん♪) – TwiDer: @kazh98 – Web: hDp://www.arnip.org/ – 「MCPC: a Compe==ve Programming Circle」代表
MCPC: a Compe==ve Programming Circle. 2
自己紹介
MCPC: a Compe==ve Programming Circle. 3
(CDR …)
MCPC: a Compe==ve Programming Circle. 4
よく聞かれること・・・
Schemeで
なにを 書いているんですか?
MCPC: a Compe==ve Programming Circle. 5
答え
CGIです。
MCPC: a Compe==ve Programming Circle. 6
GaucheでCGIを書くメリット
Schemeを実用できる ・・・以上。
MCPC: a Compe==ve Programming Circle. 7
GaucheでCGIを書くデメリット % cat test.scm (use www.cgi) % time gosh test.scm 0.176u 0.045s 0:00.22 95.4% 22+8792k 0+0io 0pf+0w % cat test.rb require "cgi" % time ruby test.rb 0.011u 0.022s 0:00.22 13.6% 8+1957k 25+0io 8pf+0w
※さくらのレンタルサーバ MCPC: a Compe==ve Programming Circle. 8
いままでにつくったもの
• AJP: a Judge System for Programming Contest • An Assembler for Meiji-‐MPU • (compare-‐aoj-‐solved) – hDp://www.arnip.org/compareaoj.cgi – Aizu Online Judge のSolved 比較 – Lisper のため(?) のUI
MCPC: a Compe==ve Programming Circle. 9
(compare-‐aoj-‐solved)
MCPC: a Compe==ve Programming Circle. 10
(CDR …)
MCPC: a Compe==ve Programming Circle. 11
GaucheでCGIを書くには・・・?
• text.html-‐lite ライブラリ • www.cgi ライブラリ • gauche.parameter ライブラリ
・・・を使おう!!
MCPC: a Compe==ve Programming Circle. 12
CGIが作り出すものは・・・?
HTML
MCPC: a Compe==ve Programming Circle. 13
XHTML
XHTML
<html xmlns=“hDp://www.w3.org/1999/xhtml”> <head> <=tle>Content</=tle></head> <body> <h1>Hello, World!</h1></body></html>
MCPC: a Compe==ve Programming Circle. 14
XHTML → Symbolic Expression
(html :xmlns “hDp://www.w3.org/1999/xhtml” (head (=tle “Content”)) (body (h1 “Hello, World!”)))
MCPC: a Compe==ve Programming Circle. 15
これは・・・
S式だ
MCPC: a Compe==ve Programming Circle. 16
text.html-‐lite ライブラリ
• (html:[タグ名] 引数…) でXHTMLを生成できる • 属性はキーワード引数で表現 – 属性名=“値” → :属性名 “値”
• 子要素やテキストノードは式の入れ子で表現 – <b><u><i>Hello</i></u></b> → (html:b (html:u (html:i “Hello”)))
MCPC: a Compe==ve Programming Circle. 17
CGI の動作手順
1. パラメータを受け取る 2. XHTMLを生成する 3. 結果を返す
MCPC: a Compe==ve Programming Circle. 18
www.cgi ライブラリ
1. パラメータを受け取る 2. XHTMLを生成する 3. 結果を返す
MCPC: a Compe==ve Programming Circle. 19
赤字の部分を受け持ってくれる
関数cgi-‐main
(define (main args) (cgi-‐main (lambda (p) (list (cgi-‐header) ; XHTML の生成処理 ))))
MCPC: a Compe==ve Programming Circle. 20
関数cgi-‐get-‐parameter
• (cgi-‐get-‐parameter “名前” p) で、パラメータの値がとれる。
• 存在しなかったら#f • cgi-‐main の中で、パラメータによる場合分けをすると読みやすい!!
MCPC: a Compe==ve Programming Circle. 21
関数cgi-‐get-‐parameter (let ((mode (cgi-‐get-‐parameter "mode" p)) (uid (cgi-‐get-‐parameter "uid" p)) (cid (cgi-‐get-‐parameter "cid" p))) (list (cgi-‐header) (cond ((and mode (string=? mode "src")) (gp-‐source)) ((and uid (not (string-‐null? uid)) cid (not (string-‐null? cid))) (gp-‐compare uid cid)) (else (gp-‐default)))))
MCPC: a Compe==ve Programming Circle. 22
gauche.parameter ライブラリ
• 大域変数/動的スコープ的なもの – Common Lisp だとスペシャル変数とか言うらしい
• (parameterize ((x ‘hoge)) …) … で呼び出された云々は、変数x を参照可
> あんま使わない <
MCPC: a Compe==ve Programming Circle. 23
その他
• 認証関係はDokuWiki Authoriza=on Library が便利だよ!!(ステマ – hDps://github.com/kazh98/Gauche-‐www-‐dokuauth
– ユーザ管理をDokuWiki ACL に丸投げライブラリ
• (気が向いたら)3ヶ月後にお話します。
MCPC: a Compe==ve Programming Circle. 24
(CDR …)
MCPC: a Compe==ve Programming Circle. 25
まとめ
• みんな大好きS式表現でXHTML 組めるよ! • Schemeを実用するのには良いネタだよ! • Ruby の10倍遅重・・・
CGI を書くことが目的じゃない、Schemeを書くことが目的だ!!!
MCPC: a Compe==ve Programming Circle. 26
THANKS FOR YOUR
LISTENING!! MCPC: a Compe==ve Programming Circle. 27
Q.Gauche のライブラリ 読み込みが遅いだけでは?
• 恐らくその通りです。www.cgi ライブラリは依存ライブラリの数が多いので、ディスクアクセスが多くなり、特にそれが遅いサーバ上だと速度低下が起きるようです。
• 私が実用するときは、www.cgi ライブラリ中の必要関数だけ抜き出して、cgi スクリプト本体に埋め込むことが多いです。
• ↑自動化できたらいいですね。
MCPC: a Compe==ve Programming Circle. 28