Jupyter に octave_kernel をインストール【追記あり】

## 前置き

某 [オンライン機械学習コース](https://www.coursera.org/learn/machine-learning "Machine Learning - Stanford University | Coursera") を受講するにあたって、自宅及び会社の Mac に [Octave](http://www.gnu.org/software/octave/ "GNU Octave") をインストールました。

で、[Jupyter](http://jupyter.org/ "Jupyter Project") に確か Octave のカーネルもあるはずだ、と探してついでにインストールしたのですが。
ちょっとだけハマったので、情報共有のために記録。

### 【2015/07/14 09:00 追記】

動作確認していて、日本語の扱いでハマったので、記事を加筆・修正しました。

## 環境

+ Mac OSX 10.8.5 / 10.9.5
+ Homebrew
+ Python 2.7.9 / 3.4.3[^4]
+ IPython 3.1.0 → 3.2.0[^1]

[^4]: メインの Python を 2.7.9 とし、3.4.3 を pyenv で共存インストールしてカーネル追加して両方動くようにしています。詳細は先日の記事（[Jupyter 環境設定補足 #pythontokai](http://qiita.com/antimon2/items/a8cd98257219773b9ef3 "Jupyter 環境設定補足 #pythontokai - Qiita")）参照のこと。
[^1]: IPython もバージョンアップしていたのでついでにアップデート。というか…↓参照

## Octave のインストール

Octave は、バイナリをダウンロードしてインストールすることもできるようですが、私は Homebrew でインストール。OSX のバージョンにほぼ依存せず同じ手順でインストールできたので（時間はかかりますが）。

```bash
$ brew update
$ brew tap homebrew/science
$ brew install octave
```

あと私の環境には Java は既に入っていたので起動も問題なく。

```bash
$ octave --version
GNU Octave, version 3.8.2
Copyright (C) 2014 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.

Octave was configured for "x86_64-apple-darwin13.4.0".

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/get-involved.html

Read http://www.octave.org/bugs.html to learn how to submit bug reports.
$ 
```

## octave_kernel のインストール

### 1. パッケージのインストール

Jupyter の Octave カーネルは、Python パッケージとして用意されている（[Package Index > octave_kernel](https://pypi.python.org/pypi/octave_kernel "octave_kernel 0.11.0 : Python Package Index")）ので、`pip` コマンドでインストールできます。

<ins>注意点として、日本語の扱いに問題が出ないように、Python3 の方にインストールします。</ins>（詳細後述）

```bash
$ pyenv shell 3.4.3
$ pip install pip --upgrade
$ pip install octave_kernel
```

依存関係も含めて複数のパッケージがインストールされます。
ちなみに `pip install octave_kernel --upgrade` とすると、依存パッケージが更新可能なときについでにアップグレードされる模様です[^3]。

[^3]: 実はこれで IPython が 3.1.0 から 3.2.0 に上がって「うぉっ」となりました(^-^;

インストール確認[^5]：

```bash
ls  ~/.pyenv/versions/3.4.3/lib/python3.4/site-packages/ | grep octave_kernel
octave_kernel-0.11.0-py3.4.egg
```

[^5]: Python2.7 にインストールしたときは、`imp.find_module('octave_kernel')` で確認できたのですが、Python3.4 ではこれで確認できなくなった（見つからないて言われた、謎）ので、ファイルが存在するかどうかだけ確認しています。

### 2. カーネルの設定

この手順は、**本来不要**です。インストールが成功すれば、カーネルの設定まで行われるはずなので[^2]。
先に次節の [3. 動作確認](#3-%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D) を試してみて「カーネルが見つからない」という旨のエラーが出たら、以下のカーネル手動設定を実施してください。

[^2]: カーネルの設定が自動で行われた場合、~/.ipython/kernels 内ではなく、 /usr/local/share/jupyter/kernels/ 内に設定ファイルが生成されるようです。以前にインストールした bash_kernel の設定はそこに存在しています。

カーネルの手動設定と言っても、やることは kernel.json ファイルを自分で作って適切な場所に配置すればOK。

```bash
$ cd ~/.ipython/kernels
$ mkdir -p octave_kernel && cd octave_kernel
$ vi kernel.json
```

kernel.json（サンプル）：

```json:kernel.json
{
    "argv": [
        "/path/to/user_home/.pyenv/versions/3.4.3/bin/python",
        "-m", "octave_kernel",
        "-f", "{connection_file}"
    ],
    "display_name": "Octave",
    "language": "octave",
    "name": "octave_kernel"
}
```

### 3. 動作確認

「カーネルが見つからない」といった旨のエラーが出たら、前節 [2. カーネルの設定](#2-%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A) に戻ってカーネルを手動（再）設定してください。

```bash
$ ipython console --kernel=octave_kernel
IPython Console 3.2.0

In [1]: printf("Hello, World!\n")
gnuplot 5.0 patchlevel 0
Out[1]:
Hello, World!


In [2]: # 終了は Ctrl+D
Do you really want to exit ([y]/n)?
```

ただ `printf` しようとしただけなのに gnuplot が動くのってどうなの？て感じですけれど(^-^;

## Jupyter で確認

ちゃんとカーネルが追加されています：

![kernels_20150704.png](https://qiita-image-store.s3.amazonaws.com/0/30400/e0604ff0-bd2d-28ce-c5ad-aeba6a371a81.png)

さっそく簡単に表示確認：

![IOctave_1st.png](https://qiita-image-store.s3.amazonaws.com/0/30400/1fad4d0e-1de1-00e0-86d7-b9cd55d69717.png)

因みにグラフは、SVG で描画されています。しかも セルの幅に合わせて自動サイズ調整。ブラウザの幅を変更するとリアルタイムでぐりぐりリサイズします。なんか楽しいｗ

→ [nbviewer で表示](https://nbviewer.jupyter.org/gist/antimon2/0f55b2e6189a451c9b65)

## 【追記：2015/07/14】注意点

Python2.7.x でも octave_kernel のインストールには成功しますが、日本語（というか Unicode文字列）の扱いがきちんとしていなくて、表示時に内部エラーが起きてしまう問題がありました。
少し調べたのですが、octave_kernel.py もしくは、その元になっている（`OctaveKernel` の super class である `MetaKernel` を定義している）[MetaKernel](https://pypi.python.org/pypi/metakernel "metakernel 0.9.0 : Python Package Index") 側の問題のようで[^6]、深追いするのをやめました。

その代わり、String が Unicode string と統合されている Python3 なら問題ないのでは？と試したら期待通り問題なく動作した、というわけです。
環境共存しておいて良かった(^-^)

ということで、OctaveKernel（およびその他 MetaKernel を利用したカーネル）の利用には、Python3 を使いましょう。

なお私は、結果的に 2.7.x で一度 octave_kernel をインストールして後から 3.x でもう一度インストールした形になりましたが、（/usr/local/share/jupyter/kernels 以下にカーネルが正常に設定される環境なら）カーネル設定は普通に上書きされました。問題なし。
手動設定した場合はパスを適宜修正する必要があります。

[^6]: ひょっとしたらソース先頭にマジックコメント（`# coding: utf-8`）を入れてもらうだけで解決する問題かも…。

## 参考

+ [OctaveをMac OS X Yosemiteへインストール](http://qiita.com/ykoga/items/614c81a9d679b86ca96a "OctaveをMac OS X Yosemiteへインストール - Qiita") （by @ykoga）
+ [How to install Octave via Homebrew in Mac OS X 10.10 Yosemite](https://kiskeyix.org/articles/605 "LEMS: How to install Octave via Homebrew in Mac OS X 10.10 Yosemite")