28
GaucheCGIプログラミング Kazuhiro Hishinuma (@kazh98) MCPC: a Compe==ve Programming Circle. 1

GaucheでCGIプログラミング

Embed Size (px)

DESCRIPTION

Lisp Meet Up presented by Shibuya.lisp #5 での発表資料 cf. http://atnd.org/events/39675

Citation preview

Page 1: GaucheでCGIプログラミング

GaucheでCGIプログラミング

Kazuhiro  Hishinuma  (@kazh98)

MCPC:  a  Compe==ve  Programming  Circle. 1

Page 2: GaucheでCGIプログラミング

自己紹介

•  Kazuhiro  Hishinuma  (かにたん♪)  – TwiDer:  @kazh98  – Web:  hDp://www.arnip.org/  – 「MCPC:  a  Compe==ve  Programming  Circle」代表  

MCPC:  a  Compe==ve  Programming  Circle. 2

Page 3: GaucheでCGIプログラミング

自己紹介

MCPC:  a  Compe==ve  Programming  Circle. 3

Page 4: GaucheでCGIプログラミング

(CDR  …)

MCPC:  a  Compe==ve  Programming  Circle. 4

Page 5: GaucheでCGIプログラミング

よく聞かれること・・・

Schemeで  

なにを  書いているんですか?

MCPC:  a  Compe==ve  Programming  Circle. 5

Page 6: GaucheでCGIプログラミング

答え

CGIです。

MCPC:  a  Compe==ve  Programming  Circle. 6

Page 7: GaucheでCGIプログラミング

GaucheでCGIを書くメリット

Schemeを実用できる  ・・・以上。

MCPC:  a  Compe==ve  Programming  Circle. 7

Page 8: GaucheでCGIプログラミング

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

Page 9: GaucheでCGIプログラミング

いままでにつくったもの

•  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

Page 10: GaucheでCGIプログラミング

(compare-­‐aoj-­‐solved)

MCPC:  a  Compe==ve  Programming  Circle. 10

Page 11: GaucheでCGIプログラミング

(CDR  …)

MCPC:  a  Compe==ve  Programming  Circle. 11

Page 12: GaucheでCGIプログラミング

GaucheでCGIを書くには・・・?

• text.html-­‐lite  ライブラリ  • www.cgi  ライブラリ  • gauche.parameter  ライブラリ  

・・・を使おう!!  

MCPC:  a  Compe==ve  Programming  Circle. 12

Page 13: GaucheでCGIプログラミング

CGIが作り出すものは・・・?

HTML

MCPC:  a  Compe==ve  Programming  Circle. 13

XHTML

Page 14: GaucheでCGIプログラミング

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

Page 15: GaucheでCGIプログラミング

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

Page 16: GaucheでCGIプログラミング

これは・・・

S式だ

MCPC:  a  Compe==ve  Programming  Circle. 16

Page 17: GaucheでCGIプログラミング

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

Page 18: GaucheでCGIプログラミング

CGI  の動作手順

1.  パラメータを受け取る  2.  XHTMLを生成する  3.  結果を返す

MCPC:  a  Compe==ve  Programming  Circle. 18

Page 19: GaucheでCGIプログラミング

www.cgi  ライブラリ

1.  パラメータを受け取る  2.  XHTMLを生成する  3.  結果を返す

MCPC:  a  Compe==ve  Programming  Circle. 19

赤字の部分を受け持ってくれる

Page 20: GaucheでCGIプログラミング

関数cgi-­‐main

(define  (main  args)      (cgi-­‐main  (lambda  (p)          (list  (cgi-­‐header)  ;  XHTML  の生成処理          ))))  

MCPC:  a  Compe==ve  Programming  Circle. 20

Page 21: GaucheでCGIプログラミング

関数cgi-­‐get-­‐parameter

•  (cgi-­‐get-­‐parameter  “名前”  p)  で、パラメータの値がとれる。  

•  存在しなかったら#f  •  cgi-­‐main  の中で、パラメータによる場合分けをすると読みやすい!!

MCPC:  a  Compe==ve  Programming  Circle. 21

Page 22: GaucheでCGIプログラミング

関数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

Page 23: GaucheでCGIプログラミング

gauche.parameter  ライブラリ

•  大域変数/動的スコープ的なもの  – Common  Lisp  だとスペシャル変数とか言うらしい  

•  (parameterize  ((x  ‘hoge))  …)  …  で呼び出された云々は、変数x  を参照可  

> あんま使わない <

MCPC:  a  Compe==ve  Programming  Circle. 23

Page 24: GaucheでCGIプログラミング

その他

•  認証関係はDokuWiki  Authoriza=on  Library  が便利だよ!!(ステマ  – hDps://github.com/kazh98/Gauche-­‐www-­‐dokuauth  

– ユーザ管理をDokuWiki  ACL  に丸投げライブラリ  

•  (気が向いたら)3ヶ月後にお話します。

MCPC:  a  Compe==ve  Programming  Circle. 24

Page 25: GaucheでCGIプログラミング

(CDR  …)

MCPC:  a  Compe==ve  Programming  Circle. 25

Page 26: GaucheでCGIプログラミング

まとめ

•  みんな大好きS式表現でXHTML  組めるよ!  •  Schemeを実用するのには良いネタだよ!  •  Ruby  の10倍遅重・・・  

CGI  を書くことが目的じゃない、Schemeを書くことが目的だ!!!

MCPC:  a  Compe==ve  Programming  Circle. 26

Page 27: GaucheでCGIプログラミング

THANKS  FOR  YOUR  

LISTENING!! MCPC:  a  Compe==ve  Programming  Circle. 27

Page 28: GaucheでCGIプログラミング

Q.Gauche  のライブラリ  読み込みが遅いだけでは?

•  恐らくその通りです。www.cgi  ライブラリは依存ライブラリの数が多いので、ディスクアクセスが多くなり、特にそれが遅いサーバ上だと速度低下が起きるようです。  

•  私が実用するときは、www.cgi  ライブラリ中の必要関数だけ抜き出して、cgi  スクリプト本体に埋め込むことが多いです。  

•  ↑自動化できたらいいですね。

MCPC:  a  Compe==ve  Programming  Circle. 28