Jupyter 環境設定補足 #pythontokai

## 前置き

先日（2015/05/30）、[Python東海 第27回勉強会](http://connpass.com/event/14292/ "Python東海 第27回勉強会 - connpass")で、「[Jupyter + RISE による ライブデモ＆プレゼンテーション](https://nbviewer.jupyter.org/format/slides/gist/antimon2/2be8a00524deadb8e0a9)」という発表をしてきました。

[![JupyterRISE_cap.png](https://qiita-image-store.s3.amazonaws.com/0/30400/b2ceafab-bbf4-2fb5-88a4-4acd84b4f8f6.png "Jupyter + RISE による ライブデモ＆プレゼンテーション")](https://nbviewer.jupyter.org/format/slides/gist/antimon2/2be8a00524deadb8e0a9)

発表は、資料を Jupyter（IPython Notebook）で大枠を作り、RISE でリアルタイムスライド表示しながらその場で編集し、その場で Gist にアップ → nbviewer に登録 → nbviewer でのスライド表示、という流れで実施[^1]。上記の発表資料は最終的に nbviewer で公開したスライド（後で少しだけ再編集したもの）です。

で、スライド関係は良かったのですが、主にそれ以外の環境設定周りについて、短い発表時間の中でだいぶ端折ったり、発表資料も最低限のことしか書いていないので、自分がやったことを補足しておこうと思います。

なおこの記事は、先日の記事「[IPython + IJulia → Jupyter アップデート覚書](http://qiita.com/antimon2/items/e24b3fe14bab613d13aa "IPython + IJulia → Jupyter アップデート覚書 - Qiita")」の 補足＋後日談 的な位置づけでもあります。

### お品書き

+ [Python の共存インストール](#python-%E3%81%AE%E5%85%B1%E5%AD%98%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
+ [IPython への Python カーネル追加設定](#ipython-%E3%81%B8%E3%81%AE-python-%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E8%BF%BD%E5%8A%A0%E8%A8%AD%E5%AE%9A)
+ [Julia の共存インストール](#julia-%E3%81%AE%E5%85%B1%E5%AD%98%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
+ [おまけ：IRuby も入れてみた。](#%E3%81%8A%E3%81%BE%E3%81%91iruby-%E3%82%82%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%81%9F)

## Python の共存インストール

元々 Python は Homebrew でインストールして使用していたのですが、Python2 と Python3 の共存で問題が発生[^2]したので、[pyenv](https://github.com/yyuu/pyenv "yyuu/pyenv") に移行しました。
Homebrew でもインストールできたのですが、rbenv も直接 `git clone` で入れていたのでそっちで。

```bash
$ cd ~
$ git clone https://github.com/yyuu/pyenv.git .pyenv
$ vi .bash_profile
;;;《中略、最後に以下の3行を追記》
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

その後、Python2/Python3 をそれぞれインストール

```bash
$ pyenv install 2.7.9
$ pyenv install 3.4.3
$ pyenv local 2.7.9
$ pyenv versions
  system
* 2.7.9 (set by /path/to/user_home/.python-version)
  3.4.3
```

### 参考：「pyenvで幸せになろう」

私の発表の直前に、タイミング良く pyenv の発表もあったので、その資料も紹介しておきます[^3]。
[![PyenvDeBeHappy.png](https://qiita-image-store.s3.amazonaws.com/0/30400/2eed3a97-869e-480f-c6e4-3c9d127ff76d.png "Pyenvで幸せになろう.py")](http://www.slideshare.net/yoshitakatsubouchi/pyenvpy "Pyenvで幸せになろう.py")

## IPython への Python カーネル追加設定

まず、前節でインストールした Python2.7.9/3.4.3 それぞれで `pip install 'ipython[notebook]'` を実施。
より詳しく言うと、まずデフォルトの 2.7.9 で実施して、`pyenv shell 3.4.3` で一時的に Python3.4.3 環境にして、同じものをインストールして、`pyenv shell 2.7.9` で元に戻しました。

その後、デフォルトじゃない方（3.4.3）のカーネルを手動で追加。
設定内容の詳細はスライド参照。
参考にしたサイト↓を忘れていたので記しておきます。
[Jupyter Help - 1.4.2 Enable Python 3 kernel](http://jupyter.cs.brynmawr.edu/hub/dblank/public/Jupyter%20Help.ipynb#1.4.2-Enable-Python-3-kernel)

なお、Jupyter (IPython Notebook) を使う分には、起動した後で notebook ごとに kernel を選択出来るのでこれで良いのですが、ターミナル上の REPL として Python3 上の IPython を使いたいときは、毎回 `pyenv shell 3.4.3` した上で `ipython` と打つ必要があり、ちょっとだけ面倒です。
ので、SymbolicLink 張っちゃいました。

```bash
$ cd ~/bin
$ ln -s /path/to/user_home/.pyenv/versions/2.7.9/bin/ipython2
$ ln -s /path/to/user_home/.pyenv/versions/3.4.3/bin/ipython3
$ ~/bin/ipython3
Python 3.4.3 (default, May 13 2015, 22:15:16)
Type "copyright", "credits" or "license" for more information.

IPython 3.1.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: import sys

In [2]: sys.version_info
Out[2]: sys.version_info(major=3, minor=4, micro=3, releaselevel='final', serial=0)

In [3]:
```

## Julia の共存インストール

[前の記事](http://qiita.com/antimon2/items/e24b3fe14bab613d13aa "IPython + IJulia → Jupyter アップデート覚書 - Qiita")でも、簡単に「0.3.x はバイナリ、0.4.x はソースから」と書きましたが、今回 Jupyter に 0.3.x/0.4.x 両方のカーネルを追加したので、詳細を記します。

### Julia v0.3.x

+ [ダウンロードサイト](http://julialang.org/downloads/ "Julia Downloads")から環境に合った最新の Current Release (command line version) をダウンロード（私の場合、"Mac OS X Package (.dmg)"）。
+ 然るべき場所（/Application 内）に配置（コピーするだけ）。
+ シンボリックリンク設定：  

```bash
$ cd ~/bin
$ mv julia julia-0.3.z ; 古いバージョンへのシンボリックリンクを待避（削除してもOK）
$ ln -s /Applications/Julia-0.3.x.app/Contents/Resources/julia/bin/julia
$ ~/bin/julia --version
julia version 0.3.x
```

### Julia 0.4.0-dev

初回インストール時は、[homebrew-julia](https://github.com/staticfloat/homebrew-julia/ "staticfloat/homebrew-julia")の内容に従ってインストール：

```bash
$ brew update
$ brew tap staticfloat/julia
$ brew install julia --HEAD
$ which julia
/usr/local/bin/julia
$ julia --version
julia version 0.4.0-dev
```

アップデート時は、本家サイトや @chezou さんの記事「[homebrewでjuliaのHEADのインストールに失敗した時にするといいこと](http://qiita.com/chezou/items/136959635463a918b8be "homebrewでjuliaのHEADのインストールに失敗した時にするといいこと - Qiita")」を参考に：

```bash
$ brew update
$ ; 以下の2行は単純に brew reinstall julia --HEAD したときに失敗した場合のみ。
$ brew rm arpack-julia openblas-julia
$ brew install --build-from-source arpack-julia openblas-julia
$ ; 問題が無ければ↓以下の1行だけで行ける。
$ brew reinstall julia --HEAD --with-accelerate
```

### 0.3.x/0.4.x それぞれ IJulia のインストール

Julia はマイナーバージョンレベルで環境を分けてくれるので、それぞれで `Pkg.add("IJulia")` or `Pkg.update()` or `Pkg.build("IJulia")` するだけでOK。
それだけで、v0.3.x 用のカーネルと v0.4.x 用のカーネルがそれぞれ ~/.ipython/kernels/ 内に適切に設定されます。
また、例えばつい先日 Julia v0.3.9 が出たようなので、v0.3.8 から v0.3.9 にカーネルを変更しましたが、その手順も v0.3.9 の REPL で `Pkg.update()` or `Pkg.build("IJulia")` するだけ（v0.3.8 の時にインストールした IJulia がそのまま使えるので `Pkg.install()` 不要）。

## おまけ：IRuby も入れてみた。

資料には載せてないし、発表時にはちらっとしか触れていませんが、[IRuby](https://github.com/SciRuby/iruby "SciRuby/iruby")も1週間前に更新された v0.2.x から Jupyter に正式対応したので、ついでにインストールしています。
インストールでほんの少しハマったのでその情報共有も兼ねて。

### ZeroMQ（libzmq）のインストール

```bash
$ brew install zeromq --universal
```

### Ruby v2.2.x（最新版）のインストール

rbenv でインストールしていた ruby が少し古くて、デフォルトが 2.0.0 だったので、最新にアップ[^4]（参考：「[rbenvとruby-buildでRuby環境を最新に保つ](https://gist.github.com/mochiz/4736183 "rbenvとruby-buildでRuby環境を最新に保つ")」）：

```bash
$ cd ~/.rbenv
$ git pull origin master
$ cd plugins/ruby-build/
$ git pull origin master
$ rbenv install --list
 : 《略》
2.2.2
 : 《略》
$ brew link readline --force
$ export CFLAGS=-Wno-error=shorten-64-to-32
$ CONFIGURE_OPTS="--with-readline-dir=/usr/local --with-openssl-dir=`brew --prefix openssl`" RUBY_CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl`" rbenv install 2.2.2
$ brew unlink readline
$ cd ~
$ rbenv local 2.2.2 ;（ユーザホームディレクトリ内のデフォルトを 2.2.2 に設定）
$ gem install 〜 ;（必要に応じて最低限の gem をインストール）
```

### IRuby のインストール

pry を一緒に入れておくと色々便利。

```bash
$ gem install pry iruby
$ rbenv rehash
$ iruby --version
IRuby 0.2.2, Ruby 2.2.2
```

### IRuby の設定

iruby コマンドを1回実行すれば IPython へのカーネル設定してくれる。
なお、このときついでに IPython Console が Ruby カーネルで起動する。
ので、<kbd>Ctrl</kbd>+<kbd>D</kbd> で終了する[^5]。

```bash
$ rbenv rehash
$ iruby
IPython Console 3.1.0

In [1]: RUBY_VERSION # Rubyカーネルで IPython Console が動いている
Out[1]: "2.2.2"

In [2]: # 終了は Ctrl+D
Do you really want to exit ([y]/n)? 
$ 
```
### Jupyter + IRuby 動作サンプル

画面キャプチャのみ[^6]。

![IRubySample.png](https://qiita-image-store.s3.amazonaws.com/0/30400/13efb0f7-0924-24dc-8ed6-f4eee35e72e5.png)

## まとめ

意外と多くのことをやってるように思えてきた。
もっと小出しにして少しずつまとめていけば良かったかな。

これらが何かしらの参考になれば幸いです。

[^1]: @ssh0 さんの「[IPython 3.0.0-dev、IPython Notebookで"LIVE"なHTMLプレゼンテーション](http://qiita.com/ssh0/items/a67b84110c5d9e0adeda "IPython 3.0.0-dev、IPython Notebookで&quot;LIVE&quot;なHTMLプレゼンテーション - Qiita")」および「[nbviewerでスライド表示もできるようになった！【Jupyter】](http://qiita.com/ssh0/items/de6cc6aacd004a2e57dd "ipython_notebook - nbviewerでスライド表示もできるようになった！【Jupyter】 - Qiita")」の各記事を参考にさせて戴きました。この場を借りてお礼申し上げます。
[^2]: `pip3 install -U pip` したら Python3 環境が Python2 環境と棲み分けできなくなり `ipython3` で Python2 環境の IPython が起動してしまうようになった、等。
[^3]: ステマ。
[^4]: IRuby のドキュメントに Ruby >= 2.0.0 と記述がありますが、IRuby v0.2.2 以降は Ruby2.1 以降で追加された `Binding#local_variable_defined?` 等を利用しているため、Ruby2.0 では動作しません（ハマった。issue 投げてない…）。
[^5]: `exit` や `quit` で終了しようとすると「カーネルが死んだ」と言われてエラースタックが表示された上で「再起動するか？」と聞かれて<kbd>n</kbd>を入力しないと抜けられないし鬱陶しい。
[^6]: 本当は余裕があれば、その前日に開催された [Ruby東海勉強会](https://rubytokai.doorkeeper.jp/events/25308 "Ruby東海 第44回 勉強会 - rubytokai | Doorkeeper") で少し触れようとも思ってました（ステマその2）。