Ubuntu 16.04.2 + Jupyter Notebook (+ bash_kernel + nbextensions)

Ubuntu 16.04.2 (Server install image)にJupyter Notebookをインストールします。また、Jupyter Notebookにbash_kernelとnbextensionsをインストールし機能追加します。まずは、環境構築のためVirtualBoxにUbuntuをインストールしていきます。

# VirtualBoxにUbuntuをインストール

ubuntu-16.04.2-server-amd64.isoをダウンロードし、VirtualBox上にインストールします。
※あとでリモートからWebアクセスできるよう、「設定」→「ネットワーク」→「アダプター1」で、割当を「ブリッジアダプター」とします。

インストールは画面の指示に従うだけですが、「HTTPプロキシ」と「ソフトウェアの選択」について、今回は以下の通り設定しています。

　HTTPプロキシ：なし　（プロキシ環境下ではないので）
　ソフトウェアの選択：「standard system utilities」、「OpenSSH server」をチェック

プロキシ環境下でインストール作業を行っている場合は、この段階でHTTPプロキシ設定しておくのがおすすめです。

# ゲストOSの設定

ここからはゲストOSの設定です。ユーザ名の箇所は${user_name}としています。構築環境に合わせ読み替えてください。

## ネットワーク設定

IPアドレスをDHCPから固定に変更します。IPアドレスが変わっても問題なければDHCPのままで構いません。変更方法は以下のサイトを参考にしました。

 [[Ubuntu]ローカルIPアドレスを固定にする](https://jyn.jp/ubuntu-localip-static/)


まず、「/etc/network/interfaces」を開きます。

```bash:bash
$ sudo vim /etc/network/interfaces
```

ファイル内の「iface enp0s3 inet dhcp」をコメントアウトし、代わりに以下を追加します。

```vim:vim
iface enp0s3 inet static
address 192.168.xxx.xxx
netmask 255.255.255.0
gateway 192.168.xxx.xxx
dns-nameservers 192.168.xxx.xxx
```

最後にゲストOSを再起動します。

```bash:bash
$ sudo reboot
```

## パッケージの更新

各パッケージを最新状態にアップデートします。


```bash:bash
$ sudo apt update
$ sudo apt upgrade
```

## Jupyter Notebookインストール

ここからが本番です。Jupyter NotebookをインストールするためにAnacondaを使います。
Anacondaはpythonと、よく利用されるpythonパッケージを包含したパッケージです。
Jupyter NotebookもAnacondaの中に含まれています。具体的なインストール方法は以下に記載されています。

[Installing Jupyter Notebook](http://jupyter.readthedocs.io/en/latest/install.html)

以下はAnaconda3-4.4.0を用いたインストール方法です。ホームディレクトリにAnacondaをインストールしていきます。

```bash:bash
$ cd ~/
$ wget https://repo.continuum.io/archive/Anaconda3-4.4.0-Linux-x86_64.sh
$ bash Anaconda3-4.4.0-Linux-x86_64.sh 
```

メッセージにしたがってインストールすると、.bashrcにJupyter NotebookのPATHが追加されます。
PATHが追加されなかった場合は、.bashrcか.bash_profileに手作業でPATHを追加してください。

```bash:bash
$ export PATH=$PATH:/home/${user_name}/anaconda3/bin
```

設定の反映もお忘れなく。

```bash:bash
$ source .bash_profile　(or source .bashrc)
```

このあと、jupyter-notebookと打つとJupyter Notebookが起動します([Ctrl] + cで終了)。


```bash:bash
$ jupyter-notebook &
```

## Jupyter Notebookへのリモートアクセス設定

ここまでで、Jupyter Notebookのインストールが完了しました。ただし、現時点ではローカル環境でしかJupyter Notebookを利用できません。今度はリモートからWebアクセスできるよう設定変更します。設定方法は以下を参考にしました。

[ipython notebook(jupyter)をリモートから使う](http://qiita.com/shimaken/items/b411de87b00c051e6697)

まずはjupyter_notebook_config.pyファイルを作成します。

```bash:bash
$ jupyter-notebook --generate-config
Writing default config to: /home/${user_name}/.jupyter/jupyter_notebook_config.py
```

次にパスワードのハッシュ値を生成します。

```bash:bash
$ ipython3

In [1]: from notebook.auth import passwd

In [2]: passwd()
Enter password:
Verify password:
Out[2]: 'sha1:d1414e6ac5ff:369c16e757d9b49f15d3fad7d6399934ebad4a53'
```

最後に、jupyter_notebook_config.pyファイルを編集します。

```bash:bash
$ vim ~/.jupyter/jupyter_notebook_config.py
```
ファイルの最下部に以下を追加してください。

```vim:vim
c.IPKernelApp.pylab = 'inline'
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888
c.NotebookApp.password = u'sha1:d1414e6ac5ff:369c16e757d9b49f15d3fad7d6399934ebad4a53'
```

最終行の「u'sha:xxxx...'」は先程求めたハッシュ値が入ります。

これで、リモートからアクセスできる状態になりました。改めてjupyter-notebookを起動してみてください。

```bash:bash
$ jupyter-notebook &
[1] 1388
$ [W 05:52:52.450 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
[I 05:52:52.458 NotebookApp] Serving notebooks from local directory: /home/${user_name}
[I 05:52:52.458 NotebookApp] 0 active kernels 
[I 05:52:52.458 NotebookApp] The Jupyter Notebook is running at: http://[all ip addresses on your system]:8888/
[I 05:52:52.459 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
```

「http://[all ip addresses on your system]:8888/」からアクセスできるようになっています。

## bash_kernelインストール

bash_kernelを使うと、bashコマンド実行用のnotebookを作成できるようになります。notebook上でbashコマンドを使う方法は他にもありますが、bashコマンドだけを使いたい場合はこちらを使うと便利です。インストール方法は以下を参照しました。

https://github.com/takluyver/bash_kernel

一度Jupyter Notebookプロセスを終了し、以下手順でインストールします。

```bash:bash
$ pip install bash_kernel
$ python -m bash_kernel.install
$ jupyter-notebook &
```

## nbextensionsのインストール

nbextensionsをインストールすると、Jupyter Notebookにいろいろな機能を追加できるようになります。私はToC(Table of Contents)機能を使いたいのでnbextensionsをインストールしています。今回はAnacondaのJupyter Notebookを利用しているので、以下を参照してインストールしました。

[AnacondaのJupyter notebookでnbextensionsを使う](http://qiita.com/SaitoTsutomu/items/1326e05eb992a8aa849d)

```bash:bash
$ conda install -y -c conda-forge jupyter_contrib_nbextensions
```


以上でインストール作業は終了です。bash_kernelとToCを用いたnotebookは以下のようになります。

![Screenshot from 2017-07-17 07-33-39.png](https://qiita-image-store.s3.amazonaws.com/0/180164/bd7960c6-0274-7817-6d66-fd19fb11f877.png)