IoをCGIで使う

IoLanguage CGI
IoLanguage CGI (originally uploaded by juno_)

なんとなくウェブサーバ上でIo (IoLanguage)のスクリプトが動かしたくなって、mod_ioを入れようとしたらサイトが落ちているようでダウンロードできず。しかたないので、lighttpdでCGIとして動かしました。

lighttpd側の準備は、server.modulesmod_cgiを加えて、

server.modules = (
               ...,
               "mod_cgi"
               )

拡張子が.ioのファイルにIoのインタプリタをアサインすれば完了。

cgi.assign = ( ".io" => "/usr/local/bin/io" )

あとは、以下のようなスクリプトを用意してブラウザからアクセスすれば、古き良きCGIとして動いてくれます。

#!/usr/local/bin/io
 
"Content-Type: text/html\n\n" print
 
page := Object clone do(
  html := "
<html>
  <head>
    <title>{title}</title>
  </head>
  <body>
    <h1>{title}</h1>
    <ul>
    </ul>
    <p>
      Generated at {now}<br/>
      Powered by {version}<br/>
    </p>
  </body>
</html>"
 
  values := Map clone
  bind := method(key, value,
    self values atPut(key, value)
  )
 
  render := method(
    buf := self html asBuffer
    self values foreach(key, value,
      buf replaceSeq("{" .. key .. "}", value)
    )
    buf print
  )
)
 
page bind("title", "Hello, IoLanguage")
page bind("now", Date now asString)
page bind("version", System version asString)
page render
 
exit

さすがに「HTMLと変数をセットでprint」ってのは避けたかったので、テンプレートエンジンもどきみたいな構造になってますが、Ioは手探りで書いている現状なのでこれでいいのかどうなのか…。

使用可能なタグ <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>