FsLab JournalでReproducible Research(レポート)を簡単に作りたい
はじめに
この記事は
の17日目の記事です。前日はpocketberserkerさんのFsAttoparsecについて - pocketberserkerの爆走でした。
今日は最近流行り?のリプロデューシブル・リサーチというか、クヌースのいう文芸的プログラミングをF#で簡単にやるための方法の紹介です。
F#でレポートを作りたい
最近は、プログラミング言語問わず、特に動的な言語方面において、コードと文章本文を混ぜこぜにしたドキュメンテーションが、Reproducible Researchの観点、あるいは単純にその便利さからか、よく用いられているように見えます。
私の十八番のR言語だとR Markdown*1
PythonだとiPython Notebook
がその環境に相当します。R言語を用いた例は以下の資料に詳しく載っています。
また、上で挙げたiPython NotebookをF#で使うこともできるようです。これは以前に雑にまとめました。
一方、F#で同様のことをやろうとすると、(ワタクシ調べの範囲で)「F# Formatting」というライブラリを使うとよさそうなのですが、その導入・使用について、ひと手間必要で、上述の2つに比べるとやや面倒な印象があります。実際にF# Formattingをどう使ったらいいかについては、ありがたいことに日本語の情報があり、以下のBLOG記事で丁寧に解説されているので、これを見てみると良いでしょう。
これを見ていて、「これはお気軽に使うにしてはちょっと面倒だぞと。どこかにテンプレート的なもんが転がってないかな?」と探していたら見つけたのがFsLab Jounalでした。
FsLab Journal
FsLab Jounalは、F#界の神・トマスピ氏が用意してくださっている、テンプレートです。
実はこのテンプレートはVisual Studio Express版では使うことができませんでした。当時の私はこれを見つけた喜びに喚起する一方、使えないという現実に絶望を味わったものです。しかし、.NET大好きなF#界隈のみなさんならご存知のように、最近の.NETのオープンソース化に合わせ、Visual StudioもExpress版がCommunity版となり、ありがたいことにこのテンプレートをインストールできるようになったのです!こいつを使うと、いちいちビルドスクリプトを書いたりしなくていい!とても簡単にF#のコードと本文を合わせたレポートを作成することができます。
導入〜チュートリアルのコンパイル
以下、使い方をざっくりと示します。
まず、上記のリンクよりFsLab Jounalをダウンロードすると、自動でVisual Studioに組み込まれ、プロジェクトを新規作成する画面で「FsLab Jounal」が選択できるようになるので、これを使います。
そして、作成されたプロジェクトに対して、何も考えずにビルド&実行(F5)すると結果として、チュートリアルとして用意されているレポートがHTML形式で出力されます*2。
あとはチュートリアルのfsxなんかを見ながら独自のドキュメント&コードを書いていけば「やった!これで簡単にF#でReproducible Researchが出来るぞ!」となるわけです。
以下、ハマった点などをまとめます。
レポート内で日本語を使いたい
(私だけなのかもしれないが)デフォルトだとfsxがshift-jisの文字コードで保存されており、このままだと日本語が正しく表示されません。なので、fsxファイルの文字コードをUTF-8にして再保存しておく必要があります。
レポートのひな型を修正したい
レポート&コードはfsxに書いたものがHTMLなる一方、レポートの外面を決めているひな型は、プロジェクトフォルダ下の
- packages\FsLab.Runner.XXX\styles
にある*3、template.htmlです。なので、レポートの"見てくれ"を変えたければ、これに手を入れればOKです。あるいは、プロジェクト内にあるMain.fs内で呼ばれているJournal.Process関数のtemplateLocation引数にファイルパスを指定してテンプレートを変更することもできます。このとき、ファイルパスとして指定する先には、デフォルトでついてくるテンプレートのフォルダ構成同様に、cssからその他html, jsファイルまで入ったフォルダとすることが必要です。
まとめ
この記事ではF#でReproducible Researchを行うための環境としてFsLab Jounalというテンプレートを使うという方法を紹介しました。「新しい項目」を追加する際には「FsLab Tutorial(using R)」なんてのもあり、RTypeProviderを用いてF#とRを連携させる方法についても簡単に試すことができます。