会社のLTでOCaml/Ocsigenについて発表しました

うちの会社は割といろんな言語を使っているエンジニアがいるのですが、OCamlerは少なそうだったのでOCamlを布教するべく、OCamlでWebサービスが作れるOcsigenの紹介LTをしてきました。

簡単にOcsigenを題材に選んだ流れをまとめると、
 先週月曜(2014/07/07)に全社ハッカソンがあった
→せっかくなのでOcsigenでなんか作りたかった
→チュートリアルの途中で力尽きた
→社内LTの発表順が翌週だったので、土日使ってチュートリアルを最後まで終わらせてネタにすることにした
というような感じでした。

本当はチュートリアルで終わらずにアプリを作りたかったのですが、思いのほか環境構築のほうに手間取ったためにたどり着けませんでした…
まぁ思いのほかOcsigenのモジュール構成が複雑だったので、ある程度習熟しないと一朝一夕でなんか作るのはしんどそうでしたが。

というわけで、今回発表したスライドです。
デモについてはいつまで動かしておくか不明なので、リンク切れしてるかもしれません。
また発表時のものから実名・所属などを改変してあります。

5分しか発表時間がなかったので、基本的に「HTMLとかサーバ-クライアント間のやり取りとかにも型がつくと嬉しいよね!」という部分に焦点を当てて発表を構成しています。
発表後に@xuwei_kさんからIRCで「あのフレームワーク頭おかしいくらいHTML5 Validにこだわってるから、その辺に焦点当てたほうが面白かった」みたいなお言葉を頂戴しました。
確かに面白そうなものの、それ紹介すると多相バリアントとかに触れざるを得ないので、知らない人に5分で紹介するのは結構辛そう…
なおTwitterでは、ことりちゃんにも言及していただけました。
突っ込みどころ作った甲斐があったね!

ちなみに、質疑応答に備えて予備スライドを4枚ほど用意しておいたのですが、全く使うことはありませんでした…
「ことりちゃんって何のキャラですか?」という質問が絶対来ると思ったのに…
”>整礎清楚可愛いこのはちゃんに並ぶ、高階可愛いことりちゃんについて語ろうと思ったのに…

実際に作業した内容はOcsigen公式のチュートリアルが全てですので、あまり詳しく書くことはないのですが、

  • 断片しかないので順序良く並べないと未定義変数になったりする
  • 「Cairo.set_source_rgb ctx ~red ~green ~blue」は「Cairo.set_source_rgb ctx ~r ~g ~b」の間違い
  • Color and size of the brushのところはpageに関する変更が2つあるが、2つ目の方に1つ目の変更が入ってないので手動マージする必要がある

辺りはちょっと注意が必要そうでした。

この辺だけ注意しつ@ymotongpooさんの「OPAMを使い始めた」辺りを参考にopamを入れ、@mzpさんの「OCamlで作ったWebアプリをHerokuで動かす方法(2) 〜Ocsigen/Eliom編〜」を参考にEliom環境を整えて実験すれば大体なんとかなる気がします。
なおEliomというのはOcsigenプロジェクトのうちの、Webフレームワークの名前です。
他にOCamlで書かれたWebサーバであるOcsigen Server、OCamlバイトコードをJavascriptに変換するJs_of_ocamlなどの色々な技術が合わさってOcsigenという全体プロジェクトを成しています。
ややこしいですね。

今回、手元の環境はUbuntuで、デプロイ環境はCentOSでやったのですが、

  • opamさえ入れればなんとかなると思ったけど、OCamlコード自体の前提ライブラリはapt-getやyumで入れる必要がある(そりゃそうだ)
  • CentOSではocaml-lablgl-develを入れてからopam switch installしないと、Graphicsライブラリ無効のOCaml環境が出来上がってCairo2のインストールで詰む
  • OpamでCairo2を入れるときにocsigenserverやeliomがコンパイルし直しになるので一度アンインストールされるが、Cairo2のインストールがコケるとアンインストールされっぱなしになるのでCairo2を入れてから入れなおす必要がある
  • デプロイ環境ではopamをローカルインストールするとmake installしてからの実行がパス通らなくてめんどくさい

などなどのトラップに引っかかり、環境構築に結構な時間を割いてしまいました。
特にCentOSで作業する場合は予めocaml-lablgl-develを入れておくのだけは気をつけたほうが良さそうです。
まぁ自分のデプロイ環境に関してのみ言えば、そもそもデプロイ環境でmake & make install走らせるのはなかなかナンセンスなので、@mzpさんの記事を参考にビルド済みパッケージをリリースするようにするなり、herokuにデプロイするようにするなりした方がお手軽な気もしますね。

なお結構久々にOCamlを書いたので、開発環境について@osiireさんの「OCamlの開発環境の作り方 2012年暮れ版」@no_maddoさんの「OCaml: DebianでのOCamlの開発環境セットアップ2013年暮れ版」@camlspotterさんの「OCaml 開発環境について ~ コンパイラに付属しない非公式ツールたち」辺りを追いかけて整備しなおしました。
あまりグラフィカルなやつはOCaml界には存在しないようなので、vagrantfileとかdockerfileとかで理想の開発環境を作っておくとポータブルになりそうですね。やりたい。

布教のために発表したといいつつ、OCaml自体について勉強したい人がいきなりEliom触るのは辛そうですね…
OCaml知らずにこのページにたどり着く人は少なそうですが、OCaml.jpのチュートリアルが充実しているのでここを見るか、品切れですが五十嵐先生の「プログラミング in OCaml」辺りを読むのが良いと思います。
と思ったら後者は電子書籍化されてました。
これは知らなかったので自分も買おうかな。

Ocsigenは面白いのでもうちょい突っ込んで勉強したいですね。今回のチュートリアルではBusしか使いませんでしたが、Reactとかも面白そう。
というわけで、色々な参考文献へのポインタを自分用兼ねて貼っておいたところで、今回はこの辺で。