iPython notebookで研究開発生活


PythonのWebインタフェースであるiPython notebookを使って，自宅やスターバックスにこもりつつ作業するためのメモです．気が向いたときに更新していきます．


## リモートサーバ上のnotebookにアクセスできるようにする
職場のワークステーション上でnotebookを起動しておけば，いつでもスターバックスで研究開発ができるようになります．導入にあたっては，<a href="http://akiniwa.hatenablog.jp/entry/2013/11/25/001805" target="_blank">ここ</a>を参考にします．```c.IPKernelApp.pylab = 'inline'``` がとりわけ重要で，これをしておくことで，matplotlibで描画したものがnotebook上で表示できるようになります．

+ スターバックスで無料Wi-fiを利用する場合は<a href="http://starbucks.wi2.co.jp/pc/index_jp.html" target="_blank">こちら</a>
+ スターバックスの美味しいコーヒーが飲める店舗は<a href="http://www.starbucks.co.jp/store/search/result_store.php?reserve_flg=1" target="_blank">こちら</a>

## プログラムを実行する
テストごとに新しいnotebookを作るようにすると混乱しなくなります．
デバッグの際には以下のCell magicが便利です．

#### ```%time``` 時間を測る
![kobito.1408941894.251522.png](https://qiita-image-store.s3.amazonaws.com/0/69/c8843291-5197-0b29-c152-3e77c8b65124.png "kobito.1408941894.251522.png")

#### ```%prun``` プロファイリングする
![kobito.1408941924.757006.png](https://qiita-image-store.s3.amazonaws.com/0/69/02e0d016-631b-2b73-c5ac-61acc6cebb0f.png "kobito.1408941924.757006.png")

#### ```%debug``` デバッガを起動する
プログラムがエラーでとまった後に，適当なCellで```%debug```を実行するとipdbが起動します



## 並列計算する
いくつか方法があります．<a href="http://nbviewer.ipython.org/github/vals/scilife-python-course/blob/master/parallel%20python.ipynb" target="_blank">この辺</a>も参考になります．

####1 ```multiprocessing.Pool```
<a href="http://docs.python.jp/2.6/library/multiprocessing.html" target="_blank">このあたり</a>を参考に，

```py
from multiprocessing import Pool

p = Pool(n_cores)
p.map(func, [arg list])
p.close()
```

こんな感じで並列計算できます．注意すべき点としては，並列計算を回している途中で![kobito.1408940334.347506.png](https://qiita-image-store.s3.amazonaws.com/0/69/1461469f-0ba1-0986-0431-7a8f0e745f23.png "kobito.1408940334.347506.png") ここの中断ボタンやリスタートボタンを押してしまうと，大概ワーカがゾンビ化してしまいます．その場合は，```pkill Python```などでいったん全部殺してからもう一度notebookを立ち上げるようにしています．

####2 ```IPython.parallel```

iPython自体に並列計算のためのフレームワークがありますので，それを使うのも一つの手です．まず，iPython notebookを起動して最初に現れるダッシュボードからClustersタブを選択し，
![kobito.1408941346.713972.png](https://qiita-image-store.s3.amazonaws.com/0/69/644c90d2-3304-59bf-0022-908c0c827ed6.png "kobito.1408941346.713972.png")
ここの# of enginesに所望のワーカ数を入力し，startします．
プログラム上では，以下のように書きます．

```py
from IPython.parallel import Client

def test(x):
	u'''
	並列計算される関数
	'''
    return x **2

cli = Client()
dv = cli[:]
x = dv.map(test, range(100))
result = x.get()
```

#### 3 プログラム自体を並列で走らせる
引数を変えつつ同じ関数を並列で複数走らせたい場合は1や2の方法が有効ですが，大きめのプログラムを並列で走らせたい場合，シェルスクリプトでバックグラウンド処理にして並列化させる方が簡単です．つまり，```python program.py arg1 arg2... &```を複数書いたシェルスクリプトを実行しましょう．
「ここまでiPython notebookの話をしていたのに結局はシェルか！」というあなた，```%%bash ```コマンドを使うことで，notebookのCell上でbashスクリプトを走らせることもできます．たとえば，
![kobito.1408943333.067115.png](https://qiita-image-store.s3.amazonaws.com/0/69/5623f751-b67d-7232-6545-d329a822185c.png "kobito.1408943333.067115.png")

これをちょっと変更すると，
![kobito.1408943371.767258.png](https://qiita-image-store.s3.amazonaws.com/0/69/e611b9d4-1b3b-3915-800c-24132c266ba6.png "kobito.1408943371.767258.png")

こんな感じで簡単に（？）並列化できますね．Pythonでコマンドライン引数を使いたい場合，```if(__name__ == '__main__'):```ブロックを作り，```sys.argv```から読み出します．



## ChromeからSSHを叩けるようにする
小規模なプログラムならiPython notebook上でも書けなくはないですが，プログラムがごつくなってくるとやはりちゃんと.pyファイルにした方が良いので，必然的にSSHでワークステーションに潜る必要が出てきます．僕はSecure Shell (<a href="https://chrome.google.com/webstore/detail/secure-shell/pnhechapfaindjhompbnflcldabbghjo?hl=ja" target="_blank">link</a>) を使っています．

+ 作業を中断できるように，端末多重化（たとえば<a href="http://tmux.sourceforge.net/" target="_blank">tmux</a>）も使えるようにしておくと便利
+ <a href="https://github.com/davidhalter/jedi-vim" target="_blank">gedi-vim</a>か<a href="https://github.com/klen/python-mode" target="_blank">python-mode</a>を入れておくと便利
	+ いずれもvim / emacs両方のバージョンがあるはず
	+ gediを推す人が多い気がしますが，天邪鬼なのでpython-modeを使っています．変数のリネームや補完，PEP8に沿わない部分を勝手に直してくれる機能あたりが便利．

## pythonのパッケージを管理する
僕は<a href="https://www.enthought.com/products/canopy/" target="_blank">Canopy</a>を使ってます．OpenCVもワンクリックで入れられて便利．```enpkg```コマンドを使うと，ターミナルからパッケージ管理ができます（<a href="https://support.enthought.com/entries/22415022-Using-enpkg-to-update-Canopy-EPD-packages" target="_blank">link</a>）．Mac使いはキーチェインの問題でハマることがあるので，<a href="http://stackoverflow.com/questions/14719731/keychain-issue-when-trying-to-set-up-enthought-enpkg-on-mac-os-x" target="_blank">こちら</a>もチェック．