once upon a time,

Iris Tradをビール片手に聞くのが好きなエンジニアが、機械学習やRubyにまつわる話を書きます

Docker上にnbviewerを立ててiruby+Nyaplotで描いたグラフを共有できるようにしてみた

昨年末に@domitryさんが書かれた記事でも話題になった、RubyのライブラリMikonとNyaplotで生成したグラフをipython notebookとして社内のGHEでも共有することを目標に、nbviewerをlocalのdocker上で立ててみました。

ちなみに、1/10のyokohama.rbでモクモクした成果です。

(今回は手元で検証したため、Macでdocker環境を構築しています。GHEでの検証までは行っていません)

nbviewerとは

皆さん、ipython notebookはご存知でしょうか?

ipython notebookは以下の特徴を持ちます。

  • 対話的に書いたコードと実行結果が描画されて、それを保存できる
  • markdownも書ける
  • nbviewerを使えば、notebookが共有できる!
  • Python,Ruby,Juliaが対応している

Rubyの例ですがTokyu Ruby会議で発表したスライドを貼っておきます。 kawasaki.rbではipython notebookでパーフェクトRuby読書会の様子を貼っています

これだけだと魅力がわかりにくいと思うので、実行結果を貼ります。 描画したグラフも共有できるのが大きな魅力だと思います。

もしかすると、Gunosyの粟飯原さんが以前作られたnotebookをご覧になった方もいるかもしれません。

また、Mining the Social Web 2nd Editionがipynbを用意していたりします。(コードの教育にも向いていると思います)

この、ブラウザで手軽にipython notebookの結果を見れるようにしているのがnbviewerです。githubで公開されているレポジトリやgistなら特に問題なく静的に再現してくれるのが特徴です。 nbviewerのいいところは、Python, Ruby, Juliaの実行環境がなくてもjsonをレンダーしているだけなのでブラウザで表示できることです。

便利なnbviewer+ipython notebookですが、社内のGHEに使いたい場合は自分でnbviewerを立てなければなりません。 そこで、今回はnbviewerを手元のMacとboot2dockerで動かしてみます。

Macでdocker

Macではboot2dockerを使ってVirtualBox上にdockerの環境を立てます。

brew install boot2docker
boot2docker init
boot2docker up

もしboot2docker initに失敗したら

自分の環境のVirtualBoxは古かったので、途中でこんなエラーがでました。

error in run: Failed to initialize machine "boot2docker-vm": exit status 1

こちらを見ると、VirtualBoxのバージョンが古いとダメなようなので、VirtualBoxをアップデート後に

boot2docker delete
boot2docker init

で無事起動しました。

Jupyter Notebook Viewer

Dokcer上でnbviewerを動かすには、用意されているdocker imageを使えばよいです。

基本的には公式に従えば大丈夫です。 https://github.com/jupyter/nbviewer

基本的にgistやgithubレポジトリに置いたipynbを表示するのに使うので、予めgithubapi tokenを取得しておきましょう。

docker pull jupyter/nbviewer
docker run -p 8080:8080 jupyter/nbviewer -e 'GITHUB_API_TOKEN=YOUR_API_TOKEN'

nbviewerを起動する

open http://$(boot2docker ip 2>/dev/null):8080/

これで、あなたのブラウザにdocker上のnbviewerが見れるはずです!

f:id:chezou:20150111031411p:plain

以下のURLを入れて試してみました。

https://github.com/chezou/iruby-example/blob/master/nyaplot-example.ipynb

f:id:chezou:20150111031415p:plain

Nyaplot 3Dのグラフはマウスでグリグリ動かせるので楽しいですね。

RubyのMikon+Nyaplotで可視化

さて、Mikonとd3.jsを使ったiruby上の可視化ライブラリNyaplotを使って可視化してみます。

MikonはRubyにおけるpandasのような位置づけで、表形式のデータ操作が得意なライブラリです。いわゆる、Rで有名なDataFrameRubyで扱えるようになります。 NyaplotはJuliaでいうところのGadfly的な位置づけで、グラフの描画ができるライブラリです。面白い事例では地図の可視化とかも出来たりします。

MikonはNMatrixに依存しており、こいつがCBLASなど依存が激しくMacでビルドをするのが大変だったので、こちらもdockerで環境を作りました

docker pull domitry/sciruby-docker
docker run -i -p 9999:9999 domitry/sciruby-docker:latest
open http://$(boot2docker ip 2>/dev/null):9999/

今回は次のgistを可視化してみました。 https://gist.github.com/chezou/38ddcc79babe34b73f10

nbviewerで見る場合はこちら

こんな感じでipython notebookが無事見れるようになりました。

f:id:chezou:20150111031419p:plain

雑感

今回、GHEでの検証まではしていませんが、概ねGHE上のgistやレポジトリのipython notebookを描画することはできそうな目処が経ちました。

しかし、MikonとNyaplotを使ったグラフ描画は別途サーバサイドで用意する必要がありそうです。 Nyaplot自体は依存関係は薄いのですが、Mikonを使おうと思うとするとNMatrixのビルドが大変だったりするのでdocker上のiruby notebookを立ちあげなければなりません。 この状況だと、手元にあるcsvなどを食わせようとした時は、dockerで立ち上げたipythonサーバにデータを移して食わせる必要があるなど、社内で普及を促すのにハードルが高い印象を受けました。