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読書会の様子を貼っています。
Recommendation for iruby #tqrk08 from Michiaki Ariga
これだけだと魅力がわかりにくいと思うので、実行結果を貼ります。 描画したグラフも共有できるのが大きな魅力だと思います。
もしかすると、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を表示するのに使うので、予めgithubでapi 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が見れるはずです!
以下のURLを入れて試してみました。
https://github.com/chezou/iruby-example/blob/master/nyaplot-example.ipynb
Nyaplot 3Dのグラフはマウスでグリグリ動かせるので楽しいですね。
RubyのMikon+Nyaplotで可視化
さて、Mikonとd3.jsを使ったiruby上の可視化ライブラリNyaplotを使って可視化してみます。
MikonはRubyにおけるpandasのような位置づけで、表形式のデータ操作が得意なライブラリです。いわゆる、Rで有名なDataFrameがRubyで扱えるようになります。 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が無事見れるようになりました。
雑感
今回、GHEでの検証まではしていませんが、概ねGHE上のgistやレポジトリのipython notebookを描画することはできそうな目処が経ちました。
しかし、MikonとNyaplotを使ったグラフ描画は別途サーバサイドで用意する必要がありそうです。 Nyaplot自体は依存関係は薄いのですが、Mikonを使おうと思うとするとNMatrixのビルドが大変だったりするのでdocker上のiruby notebookを立ちあげなければなりません。 この状況だと、手元にあるcsvなどを食わせようとした時は、dockerで立ち上げたipythonサーバにデータを移して食わせる必要があるなど、社内で普及を促すのにハードルが高い印象を受けました。