OCamlによるライフハック

関数型言語は素晴らしいので、仕事にも趣味にも生かしましょう。

OCaml de API

現時点ではまだまだ願望の域。

OCamlでWebサーバー作って、OCamlでWeb APIを書いたら、

OCamlの実行ログを蓄積してあれこれできるんじゃないか?

 

フロントエンドもサーバーサイドもOCamlでいい感じに書けるのがすごくいい。

でも、そうなると

 

・Ocsigen

・bs-express(Reason)

のどちらに統一するか、悩ましい。

 

作りたいアプリの案もまた増えそうだし、

とりあえずお試しで実装してみるのが良いのだろうか・・・。

Pythonであれこれするのは表面だけ

あれから1ヶ月がたちました。OCaml Jupyterの環境は未だに構築できておりません。

できれば Development Versionを取りたいのですが、相変わらずエラー吐きまくりです。

 

というわけで、この計画は一時中断。別のことを調査したので備忘録。

  • Unixモジュールを使えば、OCamlでサーバーサイドなプログラムが作れる。
  • 普通にコンパイルしても使えない。.cmaファイルを読み込む必要がある。

うまいことやりゃ、HTTP通信を介して対話的な開発支援ができるのではないだろうか。つまり、

  • フロントエンド(Kernelの処理)はPythonで書く。
  • OCamlのToplevelとはAPIを介して対話する。
  • ユーザのプログラムは、サーバー側が状態を保持する。

といったことが実現できると幸せになれる。

OCaml Jupyter のインストールに手こずった

先週設定したテーマを進めようとしたら、環境整える段階でつまづきました。

テーマ→求めているものは、カーネルだった。 - OCamlによるライフハック

ひとつのシステムを動かすために、複数のプログラミング言語が使われていたり、多数のツールが複雑に組み合わさったりしているものです。

細かいことはよくわからんという人のために、必要なものが全て詰め込まれていて、それをインストールするだけで使えるようになるパッケージなるものが存在するわけです。

ちなみに、自分の場合はopamのjupyterというパッケージを入れようとした時に、いろいろとエラーを吐かれて先に進めなくなりました。

英語のエラーメッセージを読むのは結構辛いけど、どうにか解読してわかったことが、

  • conf-gmp がビルド出来ていない
  • 依存関係を確認して、いろいろなパッケージを入れる必要がある
  • opamだけでは完結しない

jupyterのDependenciesを見たところ、結構な数のパッケージが入っていないことが判明しました。条件を満たしていたのが、

ocaml>=4.04.0

のみ。これはOCamlそのもののバージョンを4.04.0以上にしてくださいね、という意味です。大体は指定されたバージョンより上であれば問題ないのですが、

base64>=2.1.2 & <3.0.0

のように一定の範囲内でないとダメなケースも稀にあります。

試行錯誤してちょっとずつエラーの数が減っていったけど、それでも解決しなかったのがzmq。こちらはビルドに失敗しているようで、以下のような結果になりました。

#=== ERROR while compiling conf-gmp.1 =========================================#
# context     2.0.1 | macos/x86_64 | ocaml-base-compiler.4.04.0 | https://opam.ocaml.org#5b9162fe
# path        ~/.opam/4.04.0/.opam-switch/build/conf-gmp.1
# command     ~/.opam/opam-init/hooks/sandbox.sh build sh -exc cc -c $CFLAGS -I/opt/local/include -I/usr/local/include test.c
# exit-code   1
# env-file    ~/.opam/log/conf-gmp-88202-39e0b1.env
# output-file ~/.opam/log/conf-gmp-88202-39e0b1.out
### output ###
# + cc -c -I/opt/local/include -I/usr/local/include test.c
# test.c:1:10: fatal error: 'gmp.h' file not found
# #include <gmp.h>
#          ^~~~~~~
# 1 error generated.




<><> Error report <><><><><><><><><><><><><><><><><><><><><><><><><><><><><>  🐫 
┌─ The following actions failed
│ λ build conf-gmp 1
└─ 

gmpがないって怒られています。C言語のエラーなので、opamとは直接関係がないようです。 brew経由でgmpをインストールした後、改めてopam経由でjupyterのインストールを試みたところ、

<><> jupyter.2.4.0 installed successfully <><><><><><><><><><><><><><><><><>  🐫 

と表示されたので、どうやらうまくいったようです。

最後にくだらないことですが、opamでラクダ🐫が出てくるのが面白いと思いました。

求めているものは、カーネルだった。

My hobby is watching professional baseball.

プロ野球好きです。テレビで中継を見たり、インターネットの速報を追うことのほうが多いですが、球場にも割と行きます。

そして、最近はいろんなデータを簡単に手に入れることができるので、あれこれ見て楽しんでいます。その一環でデータ分析もたまにしているものの、どうせならOCamlでぬるぬるやりたいと思う次第です。

テーマ

OCamlでデータ分析する土台を作りたいです。

理由

データ分析といえばR言語Pythonが有名です。実際に自分が使ったことがあるのはPythonのみなので、そちらについてのみ言及します。

Pythonはとても扱いやすく、機械学習など専門的な処理でもシンプルに記述できるインタプリタ言語です。OCamlもシンプルさは負けていないのですが、データ分析などで有用なライブラリが豊富な点はPythonに軍配が上がります。Python専用というわけではありませんが、Jupyter Notebook というツールが使える点も非常に良いです。

しかし、インタプリタ言語の性質故にPythonは決して処理が速いとはいえません。同じことをやるならば、より高速な言語で開発を進めた方が効率的でしょう。それが慣れ親しんだ言語であれば尚更。

結局のところ

OCamlPythonの利点を合わせたツール−−すなわち、拡張したOCamlカーネル*1−−を開発します。OCamlはトップレベルと言う対話環境でプログラムファイルを読み込むだけでなく、ソースコードを直接書いてコンパイルさせることもできるので、Jupyter Notebookとの相性は良いはずです。

必要なこと

既存のOCamlカーネルの改良

同じようなことを考えている人は少なからずいるわけです。例えばこれ。GitHub - andrewray/iocaml: An OCaml kernel for the IPython notebook

そして、そのツールにない機能を色々と補ったのがこれ。GitHub - akabe/ocaml-jupyter: An OCaml kernel for Jupyter (IPython) notebook

これらをベースにしてあれこれ作っていこうかと思います。これに関する記事も追い追い書きます。

OCamlの拡張

方向性は二つ考えられます。ひとつは言語そのものの拡張、もうひとつは専用のライブラリを作成です。

前者は

のようなもの、後者は

のようなものを想定しています。

*1:開発ツールそのものではなく、Jupyter NotebookとOCamlの仲介役みたいなもの

OCamlはもっと知られてもいい

はじめに

(  ˙-˙  )「開発言語は何ですか?」

(`・ω・´)「OCamlです」

( ゜Д゜)「!?」

という事態が頻繁に発生することは誠に遺憾です。

しかし、ごくごく狭い界隈では通じても、世間一般ではマイナーの範疇を超えないのもまた事実。一般人でも知っているサービスで使われているんだし、もっと知られてもいいはず。

そのためには間口を広げるのが手っ取り早い! タブンネ

目的

建前

本音

OCamlから離れたくない

実務で触る機会が全然なさそうで、辛いです……。

プログラマーとしての基礎はJavaで出来たはずなのですが、大学でOCamlに染まりました。おかげさまで、OCamlの構文に滅法強くなりました。

自己表現の訓練

口頭であろうと、文章であろうと、伝えることが苦手です。意識があらゆる方向に動いて結論が定まらない、もしくは理解度合いが中途半端になることが主な原因です。これらは自分の性格(好奇心旺盛)の裏返しでもあります。

慣れればマシになるのですが、苦手なことを続けるのはかなりきついです。なるべく長続きする方法を考えて、興味があるものをテーマを選べば良いのではないか?という結論に至りました。

それでも飽きっぽいのが懸念事項。

備忘録

上の項目に関連することなのですが、記録するのも苦手です。話を聞きながら同時にメモを取るという行為が、得意な分野以外だと負担が大きいからです。

それでも必要不可欠なことである以上、地道だけど慣れるのが最善策でしょう。

具現化希望事項(WISH LIST)

  • 自分が求める何かを作る
  • 万人受けしそうな何かを作る
  • 初心者から熟練者まで使える開発環境を作る
  • ブラウザ上で動く支援ツールを作る

今後増減するかも。

蛇足

適当に調べたら思ったより色々なツールが存在することがわかって、 思いのほか知的探究心がくすぐられました。