What is it, naokirin?

型による安全なWebプログラミングライフ 〜 OCaml & Ocsigen〜

というタイトルの通りのことを目指して、現在OCamlとOcsigenというWebアプリケーションフレームワークでWebアプリケーションを作ってみようと思ってます。

ちなみにこのOCamlとOcsigenというのはかなり癖のある環境で、私は今のところDebian上でしかOcsigenまで含めた環境構築ができてません。

WindowsOCamlの環境として、必須となるようなライブラリ群もインストールにかなり手間取るのでやめた方がいいです。(正直、挫折必至)
Macでもhomebrewによるインストールでかなり問題なさそうでしたが、ネイティブ用のコンパイル時にいくつかのライブラリでこけました。macportsは試していないのと、普通にインストールした場合を知らないのですが、homebrewでのインストールはいくつかのライブラリを使う場合(今回のOcsigenを含めて)、難しいです。。。

追記:
もしかすると、Macの場合はOCamlのバイナリインストール(dmgファイルによる)を行った方がいいかもしれません。まだOcsigenのインストールは試していませんが…。

さらに追記:
試したところ、MacではOCamlをソースからビルドしてインストールしたものが最も安定するようです。まだOcsigenの(ry


そこで今回はかなりうまく成功したDebian上での開発をメインに書いておきます。

OCamlとOCsigenのインストール

まずはインストールですが、http://ocsigen.org/install に書いてある通りでほぼいいですが、追加でgdbmが必要です。なので./configure を実行する前に

aptitude install libgdbm-dev

を実行しましょう。

これで./configureを実行して、makeを実行した際に失敗する場合は

./configure --with-ocaml

で./configureを実行してからmakeしてみましょう。

これでインストールできなかったら、自力でなんとかする。(といいつつ、現状ほかの環境では何ともなってない。)

最後にmake installしたら、

ocamlfind list | egrep 'lwt|js_of_ocaml|ocsigenserver|eliom'

でocamlfindにlwt、js_of_ocaml、ocsigenserver、eliomがインストールできているか確かめてみる。

Ocsigen ServerとEliomでHello World

初めてと言えばHello WorldということでHello Worldを実装してみました。

Githubにコードを上げたのでリンクをば。 https://github.com/naokirin/Eliom_examples

~.confというサーバー実行時に読み込む設定ファイルと、モジュールとなる~.cmo(もしくはcma)ファイルが必要になるようです。

まずはモジュールとなるhelloworld.mlファイルを見ます。

open Lwt
open Eliom_pervasives
open HTML5
open Eliom_services
open Eliom_parameters
open Eliom_output.Html5

let main_service =
  register_service ~path:["hello"] ~get_params:unit
    (fun () () -> return (html (head (title (pcdata "helloworld")) [])
                      (body [h1 [pcdata "Hello, World"]])))

register_service に ~path でurlを指定します。上の例では http://localhost:8080/hello になっています。
もっと深い階層にしたい場合は ~path:["foo"; "bar"] 等にすれば、 http://localhost:8080/foo/bar になります。

また~get_paramsはurlでパラメータを受け取るときに使うもので、受け取らない場合はunitを指定します。


helloworld.conf内は

<ocsigen>
  <server>

    <port>8080</port>

    <logdir>./log</logdir>
    <datadir>./data</datadir>

    <user>naoki</user>
    <group>naoki</group>

    <commandpipe>/tmp/ocsigen_command</commandpipe>

    <charset>utf-8</charset>

    <findlib path="/usr/local/lib/ocaml/3.12.1"/>
    <extension findlib-package="ocsigenserver.ext.staticmod"/>

    <extension findlib-package="ocsigenserver.ext.ocsipersist-sqlite">
      <database file="./db/file"/>
    </extension>

    <extension findlib-package="eliom.server"/>

    <host charset="utf-8" hostfilter="*">
      <site path="">
        <eliom module="./helloworld.cma" />
      </site>
    </host>

  </server>
</ocsigen>

のようになっています。

はlogおよびdataのためのディレクトリを指します。
は実行するユーザー、およびグループです。(ここは各自修正してください。)
はデータベース用のファイルです。

あとは実行するモジュールとしての部分にそのモジュールを記述すれば良いです。今回は.cmaファイルを用いるようにしていますが、.cmoファイルでも問題ありません。

ちなみに下ので指定している属性pathはurlでhttp://localhost:8080/以下で指定されるパスになります。これ以降に.mlファイルで指定したパスが入ります。

これであとはコンパイルとサーバーを起動すれば、実行することができます。

まずはコンパイルです。

ocamlfind ocamlc -thread -package eliom.server -c helloworld.ml
ocamlfind ocamlc -thread -package eliom.server -a helloworld.ml -o helloworld.cma

そのあと必要となる、data、log、dbディレクトリを作成して、db下にfileを作成します。

mkdir data log db
touch db/file

そしてocsigenserverを起動します。

ocsigenserver -c helloworld.conf

これで http://localhost:8080/hello にアクセスすれば、Hello, Worldが見れるはずです。