(macOS) Vagrant + CentOS + pyenv + anaconda でホストOSから jupyter notebookを使う

macOSをクリーンインストールする度に再設定するのでメモ

### 環境
以下の環境で動作確認済み

* ホスト
  * macOS 10.14.3
  * VirtualBox 6.0.2
  * Vagrant 2.2.3

* ゲスト
  * CentOS 7.6 (1810)  
  * pyenv 1.2.9
  * anaconda 3-5.3.1
  * Python 3.7.2

---
### VirtualBoxのインストール

* [公式サイト(https://www.virtualbox.org/wiki/Downloads) ](https://www.virtualbox.org/wiki/Downloads) からmaxOS用のインストーラをダウンロード
* ダウンロードしたdmgファイルをダブルクリックし、インストール実行
* terminalに以下のコマンドを入力し、バージョン確認  

```Bash
$ VBoxManage -v
6.0.2r128162
```

### Vagrantのインストール

* [公式サイト(https://www.vagrantup.com/downloads.html)](https://www.vagrantup.com/downloads.html) からmaxOS用のインストーラをダウンロード
* ダウンロードしたdmgファイルをダブルクリックし、インストール実行
* terminalに以下のコマンドを入力し、バージョン確認  

```bash
$ vagrant --version
Vagrant 2.2.3
```

### Vagrantの設定

Vagrant用ディレクトリを作成し、ボックスの作成・初期化  (box addは不要)

```bash
 # ホームディレクトリから開始
$ cd ~
 # Vagrantディレクトリを作成
$ mkdir Vagrant
 # Vagrantに移動
$ cd Vagrant
 # Vagrantの下にcentOSディレクトリを作成
$ mkdir centOS
 # centOSに移動
$ cd centOS
 # vagrant init 実行
$ vagrant init centos/7
```

### Vagrantfileの編集
```vagrant init```を実行すると、カレントディレクトリ（ここではcentOSディレクトリ）にVagrantfileができているのでテキストエディタで開き、以下の２行をアンコメント（'#'を削除してコメントアウトを取り消し）

```text
# config.vm.network "forwarded_port", guest: 80, host: 8080
 <中略>
# config.vm.network "private_network", ip: "192.168.33.10"
```
　↓

```text
config.vm.network "forwarded_port", guest: 80, host: 8080
 <中略>
config.vm.network "private_network", ip: "192.168.33.10"
```

### ゲストOSの立ち上げ
以下のコマンドでCentOS7を起動

```bash
$ vagrant up
```

### CentOSにssh接続
起動に成功したらsshでログイン

```bash
$ vagrant ssh
```

### pyenvとAnacondaのインストール

ログインしたら最初にyumの更新とgitインストール

```bash
$ sudo yum -y update
$ sudo yum -y install git
```

pyenvをgitから取得

```bash
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```

pyenvの環境変数を設定

```bash
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

> **memo**
*環境変数を.bashrcに書き込むと、bashが正常に動かなく(コマンドが全て`command not found` に)なったので
.bash_profileに書き込んだところ正常に動作した*

anacondaのインストール

```bash
 # anacondaのバージョン一覧確認
$ pyenv install -l | grep ana
 # 最新版インストール（少し時間がかかる）
$ pyenv install anaconda3-5.3.1
$ pyenv rehash
 # anacondaのPythonをデフォルトに設定
$ pyenv global anaconda3-5.3.1
 # anacondaの環境変数を設定
$ echo 'export PATH="$PYENV_ROOT/versions/anaconda3-5.3.1/bin/:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
 # Pythonのバージョン確認
$ pyenv versions
  system
* anaconda3-5.3.1 (set by /home/vagrant/.pyenv/version)
 # condaのアップデート
$ conda update conda
# 下記が表示されたら'y'を入力してEnter
Proceed ([y]/n)?
```

## jupyter notebookの起動
jupyter notebookはanacondaに同梱されているので、ここではそのまま使う
（anacondaで仮想環境を作る場合は別途設定）

```bash
 # jupyter notebookを起動
$ jupyter notebook --no-browser --ip=0.0.0.0
 # 下記が表示されたらtoken(xxxxxxxxxxxxxxxxxxxxxxxxxの部分)をコピーしておく
    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://(localhost.localdomain or 127.0.0.1):8080/?token=xxxxxxxxxxxxxxxxxxxxxxxxx
```

## jupyter notebookへアクセス
ホストOSに戻り、ブラウザで以下のURLを開く

http://192.168.33.10:8080

初回アクセス時にtokenの入力とパスワード設定を聞かれるので、コピーしておいたtokenを入力し、
パスワードを設定する

```500 : Internal Server Error```が表示された場合は、ゲストOSのterminalに戻り
[⌃C]でjupyter notebookを一旦終了し、再度起動する


---
以下の記事、サイトを参考にさせて頂きました
https://qiita.com/sk427/items/9f215931c8249ada75cd
https://qiita.com/1000ch/items/93841f76ea52551b6a97
https://qiita.com/N-K-Kota/items/a36902d43c48d054bb6f
https://qiita.com/supersaiakujin/items/50def6f33b79f9a61b18
https://mashi-prog.hatenablog.com/entry/2018/06/09/105911