ゼロから始めるデータ分析のための環境構築

最近流行りの機械学習やディープラーニングを自分で試したい、またコンピュータビジョン・画像処理にも興味があるので、合わせて色々実験したいということで、自分だけの開発環境を構築したいと思います。

僕はPCでWindowsを使用しているのですが、Jupyter NotebookのTerminalが使用できかったり、TensorflowのWindowsバージョンが出てまだ日も浅かったり、また自分のPCにいろいろインストールするのが嫌なので、GMOクラウドALTUSで仮想サーバーを立てて、仮想サーバー上でデータ解析や画像処理できるようにしたいと思います。

##実現すること
1. 機械学習やディープラーニング、画像処理のためのツールをインストールする。インストールするものは以下の通り。

- pyenv
- Anaconda（Python 2.Xと3.X）
- R
- Tensorflow
- Chainer
- OpenCV 3.1.0

2. Jupyter NotebookからNumpy、Scipy、Scikit-Learn、TensorFlow、Chiner、OpenCV、Rを実行できるようにする。

3. Jupyter Notebookにはパスワード認証を掛けて、HTTPSで通信するようにする。


##環境
Ubuntu 16.0.4 LTS

## pyenvのインストール
```
# Githubからpyenvをチェックアウト
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

# 環境変数(PYENV_ROOT)を設定する
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile

# PYENV_ROOTをPATHに追加する
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile

# shimsコマンドや自動補完を実行できるようシェルに「pyenv init」を追加
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

# 
source ~/.bash_profile

$ PATHの変更を適用するため、シェルを再起動
exec $SHELL

# インストールできるAnacondaのバージョンを確認
$ pyenv install -l | grep anaconda

# インストール済みのバージョンを確認
$ pyenv versions

# 2017/3/30で最新のAnaconda3-4.3.0をインストール
$ pyenv install anaconda3-4.3.0

# 設定を反映
$ pyenv rehash

# 特定のディレクトリ配下のみではなく、全体で利用するPythonのバージョンをAnaconda3-4.3.0に変更
$ pyenv global anaconda3-4.3.0

# 現在のPythonのバージョンを確認
$ pyenv version

# jupyter notebookを起動
$ jupyter notebook
```

jupyter notebookのURLをTerminalに表示するので、ブラウザから接続できることを確認する。
Jupyter NotebookのNewメニューをクリックして、「Python 3」があること、「Python 3」をクリックして、「Python 3」のノートブックを開いて、Python 3のプログラムを実行できることを確認する。

参考：
[pyenv, virtualenvの仕組み](http://qiita.com/Neetless/items/160fcc126c17590b664a)
[Pythonの仮想環境構築(2017年版) pyenvとpyenv-virtualenvとvirtualenvとvirtualenvwrapperとpyvenvとvenv](http://qiita.com/maskedw/items/aaa2fd7abfd493cf2820)

[【随時更新】pyenv + Anaconda (Ubuntu 16.04 LTS) で機械学習のPython開発環境をオールインワンで整える](http://blog.algolab.jp/post/2016/08/21/pyenv-anaconda-ubuntu/)
[<Python> Jupyter Notebook データ分析専用サーバーを構築する](http://qiita.com/mshrwtnb/items/b3b4a961182928c8d10b)
[[Python]Anacondaで仮想環境を作る](http://qiita.com/supersaiakujin/items/50def6f33b79f9a61b18)
[データサイエンティストを目指す人のpython環境構築 2016](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c#linux%E3%81%AE%E5%A0%B4%E5%90%88)
[Jupyter notebookをセットアップする](http://kivantium.hateblo.jp/entry/2016/01/21/010059)
[How To Set Up a Jupyter Notebook to Run IPython on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-jupyter-notebook-to-run-ipython-on-ubuntu-16-04)
[pyenv](https://github.com/pyenv/pyenv)


## Python 2のカーネルを追加
Jupyter NotebookでPython 2のプログラムを記述できるようにPython 2のカーネルを追加します。

```
# インストールできるAnacondaのバージョンを確認
$ pyenv install -l | grep anaconda

# 2017/3/30で最新のanaconda2-4.3.0をインストール
$ pyenv install anaconda2-4.3.0

# 設定を反映
$ pyenv rehash

# インストール済みのバージョンを確認
$ pyenv versions

# 特定のディレクトリ配下のみではなく、全体で利用するPythonのバージョンをanaconda2-4.3.0に変更
$ pyenv global anaconda2-4.3.0

# 現在のPythonのバージョンを確認
$ pyenv version

# Jupyter notebookにPython 2のカーネルを追加
$ jupyter kernelspec install-self --user

# Anaconda3-4.3.0に戻す
$ pyenv global anaconda3-4.3.0

# 現在のPythonのバージョンを確認
$ pyenv version
```

Jupyter NotebookのNewメニューをクリックして、「Python 2」があること、そして「Python 2」をクリックして、「Python 2」のノートブックを開いて、Python 2のプログラムを実行できることを確認する。

参考：
[Jupyter で、Anaconda 2 と Anaconda 3 を共存 + おまけ(Julia)](http://qiita.com/utahkaA/items/ae14623ae81f85bea4f5)


## Rのインストール
```
# Ctrl + c(MacではCMD + C)でjupyter notebookを終了

# Ubuntuのバージョンを確認
# 「DISTRIB_CODENAME=******」を表示する。「******」を後程、利用する
$ cat /etc/lsb-release

# Rをダウンロードのリポジトリを追記するため、sources.listを開く
$ sudo vi /etc/apt/sources.list

```

```vim:/etc/apt/sources.list
# 「******」の部分にUbuntuのバージョンを確認した際のコードネームを入力する(今回は「xenial」)
# 以下を最終行に追記する
deb https://cran.ism.ac.jp/bin/linux/ubuntu ******/
```

```
# リポジトリの公開鍵を取得
$ gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys E084DAB9

# リポジトリの公開鍵を追加
$ gpg -a --export E084DAB9 | sudo apt-key add -

# パッケージを更新
$ sudo apt-get update

# Rをインストール
$ sudo apt-get install r-base

# インストールしたRのバージョンを確認
$ R --version

# Rで日本語を使用するためにフォントも必要なので、日本語のフォントもインストール
$ sudo apt-get install fonts-takao

# RをJupyter Notebookから利用できるようにするためにRにIRkernelパッケージをインストール
# RにIRkernelパッケージをインストールするために必要なライブラリをインストール①
$ sudo apt-get install libssl-dev

# RにIRkernelパッケージをインストールするために必要なライブラリをインストール②
$ sudo apt-get install libxml2-dev

# RにIRkernelパッケージをインストールするために必要なライブラリをインストール③
$ sudo apt-get install libcurl4-openssl-dev

# RにIRkernelパッケージをインストールするために必要なライブラリをインストール④
$ sudo apt-get install libcurl4-gnutls-dev

# Rを起動
$ R

# RをJupyter Notebookから利用できるようにするためにはRにIRkernelパッケージをインストール
> install.packages(c('rzmq','repr','IRkernel','IRdisplay', 'pbdZMQ', 'devtools'), repos = c('http://irkernel.github.io/', getOption('repos')))

# 
#$ install.packages(c('repr', 'pbdZMQ', 'devtools'))

# devtoolsパッケージを呼び出す
> library(devtools)

# PATHを取得
> get_path()

# RからpyenvにPATHを通す
> add_path("~/.pyenv/shims", after = 0)

# PATHを取得
> get_path()

# GithubからIRdisplayをインストール
> devtools::install_github('IRkernel/IRdisplay')

# GithubからIRkernelをインストール
> devtools::install_github('IRkernel/IRkernel')

# Rにカーネルを登録
> IRkernel::installspec()

# Rから抜ける
> q()

# jupyter notebookを起動
$ jupyter notebook
```

Jupyter NotebookのNewメニューをクリックして、「R」があること、そして「R」をクリックして、「R」のノートブックを開いて、Rのプログラムを実行できることを確認する。

参考：
[UbuntuにRをインストール](http://qiita.com/wonder_zone/items/c0cb4033c2a599b3d662)
[UbuntuにRをインストールするための手順](http://www.trifields.jp/install-r-in-ubuntu-1000)
[UBUNTU PACKAGES FOR R - Installation](https://cran.r-project.org/)
[Ubuntu16.04にJupyter NotebookとPython3とRをインストールする](http://sheepdogjam.cocolog-nifty.com/blog/2016/07/ubuntu1604jupyt.html)
[pyenv と　IRkernel　のメモ](http://cipron81.hatenablog.com/entry/2015/11/02/220657)
[IRkernel Installation](https://irkernel.github.io/installation/#linux-panel)
[IRkernel/IRkernel](https://github.com/IRkernel/IRkernel)


## 自己証明書の作成
現状のパスワードが未設定の状態では、トークンをURLに付加して接続しなければならないので、Jupyter Notebookにパスワードを設定し、さらにセキュリティ強化のために、パスワードを平文で通信しないように暗号化（HTTPS）します。

```
# 秘密鍵の作成(-aes128は暗号化の方式、2048は秘密鍵の長さで2048ビット以上を推奨)
$ openssl genrsa -aes128 2048 > server.key

# 公開鍵の作成
$ openssl req -new -key server.key > server.csr

# デジタル証明書の作成
$ openssl x509 -req -days 36500 -in server.csr -signkey server.key -out server.crt

# 今の状態で利用すると、起動するたびにパスフレーズを入力しなければならないので、暗号化した秘密鍵を復号化して使う。アプリケーションが利用できる形式への変換を行う。
$ openssl rsa -in server.key -out server.key
```

参考：
[SSLを利用するための自己証明書（オレオレ証明書）の設定メモ](http://qiita.com/clown0082/items/551d7c081ff6b41b1717)
[秘密鍵のパスフレーズを解除する](https://rms-digicert.ne.jp/howto/basis/decrypt_key.html)
[オレオレ証明書の作成](http://qiita.com/kawa123/items/81a71cb55db87cdbba4d)


## Jupyter Notebookの設定
パスワードを設定する

```
# jupyterコンソールを起動
$ jupyter console

In [1]: from notebook.auth import passwd <- パスワードを設定する機能をインポート

In [2]: passwd() <- パスワードを設定するメソッドを呼び出し
Enter password:  <- Jupyter Notebookに設定したいパスワードを入力
Verify password: <- 確認の為、再度入力
Out[2]: 'sha1:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' <- 暗号化したパスワードを出力するので、メモする

In [3]:exit() <- jupyter consoleを終了
```

設定ファイルを生成する

```
# jupyter_notebook_config.py(設定ファイル)を生成
$ jupyter notebook --generate-config

# jupyter_notebook_config.pyを編集
$ vi ~/.jupyter/jupyter_notebook_config.py
```

生成した設定ファイルを以下の通り編集する。

```vim:jupyter_notebook_config.py
c.NotebookApp.certfile = 'デジタル証明書の絶対パス'
c.NotebookApp.keyfile = '秘密鍵の絶対パス'
c.NotebookApp.ip = '*'
c.NotebookApp.password = 'sha1:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX（暗号化したパスワード）'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888
```

プロトコルをhttpsに変更してJupyter notebookにブラウザから接続すると、パスワードを入力する画面を表示するので、Jupyter notebookに設定したパスワードを入力してログインできることを確認する。

自己証明書で特に認証を受けたわけではないので、セキュリティの警告画面が出ると思いますが、特に頑張る部分ではないので、今回は対応しません。「Let's Encrypt(独自ドメインがあれば、商用利用も可能な SSL/TLS 証明書を無料で取得できる)」を利用すれば解決できるので、セキュリティの警告画面が嫌な場合は試すのも良いかもしれません。

参考：
[Let's Encrypt の使い方](https://letsencrypt.jp/usage/)


## Jupyter Notebook
仮想サーバーを再起動してもJupyter Notebookを自動で起動するように設定する。
TerminalをログアウトしてもJupyter Notebookは起動したままにしたいので、screenというアプリケーションをインストールして使用する。

```
# screenをインストール
#$ sudo apt-get install screen

# screenの設定ファイルを作成
$ sudo vi ~/.screenrc
```

```vim:~/.screenrc
autodetach on
bell_msg "^G"
defkanji utf-8
defencoding utf-8
encoding utf-8 utf-8
defscrollback 10000
escape ^Jj
startup_message off
vbell off
caption always "%{= wb} %-w%{=bu dr}%n %t%{-}%+w %= %{=b wk} [%l] %{=b wb}%y/%m/%d(%D) %{=b wm}%c"
bind n screen
bind h prev
bind j next
bind l windowlist
```

```
# screenを起動
$ screen

# 
$ screen -t jupyter

# jupyter notebookを起動
$ jupyter notebook

# 現在開いている仮想端末をサスペンド状態にして閉じる（デタッチ）
[Ctrl + j] + d

# Terminalからログアウト
exit

# ブラウザからJupyter notebookにアクセスできることを確認

# 仮想サーバーにログイン

# jupyter notebookを起動したままの状態に戻る
screen -r
```

参考：
[Set up Anaconda + IPython + Tensorflow + Julia on a Google Compute Engine VM](https://haroldsoh.com/2016/04/28/set-up-anaconda-ipython-tensorflow-julia-on-a-google-compute-engine-vm/)
[screenを初めて使うためのチュートリアル](http://wadap.hatenablog.com/entry/20080114/1200288402)
[もっとscreenを便利に使うためのチュートリアル](http://wadap.hatenablog.com/entry/20080119/1200728234)
[作業がグッと楽になる screen を使おう！](https://bacchi.me/linux/how-2-use-screen/)


## OpenCVのインストール
```
# 必要なライブラリをインストール
$ sudo apt-get install libgtk2.0-0

# OpenCV3をインストール
$ conda install -c https://conda.anaconda.org/menpo opencv3

# Pythonを起動
$ python

# OpenCVをインポートしてエラーが発生しないことを確認
>>> import cv2
```
参考
[Installing libgtk-x11-2.0.so.0 in Ubuntu 15.04](http://askubuntu.com/questions/761589/installing-libgtk-x11-2-0-so-0-in-ubuntu-15-04)
[AWS EC2でjupyter + opencv(Ipython notebook + opencv)](http://qiita.com/f-akazawa/items/9398772d59139de07dbe)


## Tensorflowのインストール

```
# Tensorflowをインストール
$ pip install tensorflow

# Pythonを起動
$ python

# Tensorflowの動作確認（「Hello, TensorFlow!」が表示できることを確認）
>>> import tensorflow as tf
>>> message = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(message))
b'Hello, TensorFlow!'
>>> exit()
```

The TensorFlow library wasn't compiled to use SSE3 instructions, but these are available on your machine and could speed up CPU computations.

参考：
https://deepage.net/tensorflow/2017/01/17/how-to-install-tensorflow.html


## Chinerのインストール

```
# chainerをインストール
$ pip install chainer
```


## 最後に
データ分析・深層学習のための環境は整いました。以下のリンクには科学や数学など様々な分野のJupyter Notebooksのギャラリーがあるので、参考にして、自分だけのデータ分析ライフをお楽しみ下さい。

[A gallery of interesting Jupyter Notebooks](https://github.com/jupyter/jupyter/wiki/A-gallery-of-interesting-Jupyter-Notebooks#mathematics)