Pythonista以外が環境を汚さずにJupyter Notebookに触れる方法 あるいは，Rubyist以外が環境を汚さずにJupyter NotebookでRubyに触れる方法

## TL;DR
* [**Jupyter Notebook**][jupyter]がアツい！ RubyとかElixirも動かしてみたい！
* Dockerコンテナで動かせば楽！
  - [**Docker Toolbox**][toolbox]だけでOK！
  - Pythonの知識なくても環境構築できる
  - RubyやElixirの知識がなくてもJupyter Notebook上でそれらの言語が扱える

## Jupyter Notebookについて
[**Jupyter Notebook**][jupyter]がキテる！という話は色々なところでなされているため本稿では省略する:

* [Jupyterがすごい勢いでやってくるからお前ら備えとけ（IPython Notebook + R） - Qiita][qiita]
* [Railsエンジニアに役立つJupyter NotebookとiRuby - クックパッド開発者ブログ][cookpad1]
* [現代のエンジニアのための強力なメモ帳 Jupyter notebookのすゝめ - クックパッド開発者ブログ][cookpad2]

このJupyter Notebook，Pythonista以外にとっては環境構築が面倒であるという欠点（？）がある．よくわからないまま言われるがままに環境を整えることもできる．が，あとで本格的にPythonを始めようとしたときに頭を抱えることになりかねない．Pythoninstaではない人はPythonのベストプラクティスを知らないことが多いからだ．
また，Jupyter Notebookはkernelというものを利用することでPython以外の言語を動かすことも可能である．が，例えばRubyを普段触らない人がこれをセットアップするのは非常に面倒くさい．Rubyistではない人はRubyのベストプラクティスを知らないことが多いからだ．この問題はあらゆるKernelを導入するときに同じように言える．

このJupyter Notebookのような，「（自分にとって）よくわからない環境」を構築するのにはDockerが向いているような気がする．ということで，本稿ではそのやり方について説明する．

## Docker Toolbox
[Docker Toolbox][toolbox]にはDocker Client，Docker Machine，Docker Compose，Docker Kitematic，VirtualBoxが含まれる．ローカルでDocker使いたければとりあえずこれ入れとけばなんとかなる．

まだ使ったことのない人はとりあえず以下のコマンドでDocker Machineを動かしておく．

```
$ docker-machine create --driver virtualbox dev
$ eval $(docker-machine env dev)
```

## DockerでJupyter Notebookを動かす
[Jupyter Notebook][jupyter]のGitHub repoを見ると，[Dockerfileが含まれている](https://github.com/jupyter/notebook/blob/master/Dockerfile)ことがわかる．今回はこれを参考にして，各言語のカーネルごとにDockerfileを作っていく．
とりあえずサンプルとして，[Ruby][iruby-notebook]及び[Elixir][ielixir-notebook]のkernelが入ったDockerfileを用意してあるので，これを元にDockerfileを書いていく（=> [**izumin5210/notebook-dockerfiles**][notebook-dockerfiles]）．

```docker:Dockefile
FROM izumin5210/iruby-notebook
```

基本はこれだけ．なんらかのRubygemsを利用したい場合は，Dockerfileに`gem install`を記述していく．

```docker:Dockefile
FROM izumin5210/iruby-notebook

RUN gem install rails
```

ローカルにGemfileを用意しておいて，それをCOPYし`bundle install`するのでもOK:ok_woman: 

```ruby:Gemfile
source 'https://rubygems.org'

gem 'rails'
```

```docker:Dockerfile
FROM izumin5210/iruby-notebook

ADD Gemfile .
RUN bundle install
```

あとはこのDockerfileをビルドして起動すればJupyter Notebookが利用できる．

```
$ docker build -t=iruby-notebook .
$ docker run -p 8888:8888 -v "$(pwd):/notebooks" iruby-notebook
```

毎回`docker run`のオプションを書くのが面倒な人は，`docker-compose.yml`を書いておき`docker-compose up`を叩くようにすると幸せになれそう．

```yaml:docker-compose.yml
iruby-notebook:
  build: .
  ports:
    - 8888:8888
  volumes:
    - .:/notebooks
```

## References
* [Project Jupyter | Home][jupyter]
* [Docker Toolbox | Docker][toolbox]
* [Jupyterがすごい勢いでやってくるからお前ら備えとけ（IPython Notebook + R） - Qiita][qiita]
* [Railsエンジニアに役立つJupyter NotebookとiRuby - クックパッド開発者ブログ][cookpad1]
* [現代のエンジニアのための強力なメモ帳 Jupyter notebookのすゝめ - クックパッド開発者ブログ][cookpad2]

[jupyter]: http://jupyter.org/
[toolbox]: https://www.docker.com/docker-toolbox
[qiita]: http://qiita.com/tanemaki/items/7c74b35505dc372bc9c6
[cookpad1]: http://techlife.cookpad.com/entry/201510-jupyter-and-rails
[cookpad2]: http://techlife.cookpad.com/entry/write-once-share-anywhare

[notebook-dockerfiles]: https://github.com/izumin5210/notebook-dockerfiles
[iruby-notebook]: https://hub.docker.com/r/izumin5210/iruby-notebook/
[ielixir-notebook]: https://hub.docker.com/r/izumin5210/ielixir-notebook/