Vagrant + Ubuntu + VirtualBoxでPythonの環境構築したった

## 環境  
  
MacOS: High Sierra(10.13.2)
Vagrant: 2.1.2
Ubuntu: 16.04
VirtualBox: 5.2.14r123301
MySQL: 5.7.22-0ubuntu0.16.04.1 (Ubuntu)
Python: 3.6.4
Django: 2.0.2
mysqlclient: 1.3.12
psycopg2: 2.7.4
PyMySQL: 0.8.0
pytz: 2018.4
uWSGI: 2.0.17

その他
anyenv
pyenv

## 大まかな流れ

- Gitインストール
- リポジトリからプロジェクトをクローン
- MySQLインストール
    - mysql-server
    - mysql-client
- anyenvインストール
- anyenvのパスを通す
- パッケージインストール
    - curl
    - llvm
    - sqlite3
    - libssl-dev
    - libbz2-dev
    - libreadline-dev
    - libsqlite3-dev
    - libncurses5-dev
    - libncursesw5-dev
    - python-tk
    - python3-tk
    - tk-dev
    - pyenv-pip-rehash
    - pyenv-virtualenv
    - ccache
    - pyenv-pip-update
- pyenvインストール
- pyenvのパスを通す
- pythonインストール

仮想環境をvenvで作成する場合はここでストップ
[venvでDjangoの環境を作成してみたった(Python3.3以降)](https://qiita.com/taaaaak/items/bc06c45158b42b6450ba)

---

- pipインストール
- pythonのバージョンの切り替え
- mysqlclient関連パッケージインストール
    - python-dev
    - libmysqlclient-dev
- Djangoインストール
- mysqlclientインストール
- psycopg2インストール
- PyMySQLインストール
- pytzインストール
- uWSGIインストール
- CREATE DATABASE mydb;
- python manage.py makemigrations
- python manage.py migrate
- python manage.py runserver

## つまづいたところ

### パスを通し忘れた

#### anyenv

~/.bashrcに以下を記述
（「よしなにやっとけや！」と心の中で突っ込むことを忘れずに！）

```
if [ -d $HOME/.anyenv ]
then
    export PATH="$HOME/.anyenv/bin:$PATH"
    eval "$(anyenv init -)"
fi
```
> https://qiita.com/SUZUKI_Masaya/items/51366be1510f7fde7cdf

#### pyenv

~/.bashrcに以下を記述

```
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```
※（2019/1/27追記）たぶんanyenvの設定より上に書かないとまずい？
もし下に書いた場合、$PYENV_ROOTのパスがanyenvを通らない。

```sh
echo $PYENV_ROOT # => /home/vagrant/.pyenv ではなく、/home/vagrant/.anyenv/envs/pyenvが正しい
```

### 必要なパッケージを入れていなかった

パッケージを入れまくった
（何を入れたのか理解していない）

```
sudo apt install curl llvm sqlite3 libssl-dev libbz2-dev libreadline-dev libsqlite3-dev libncurses5-dev libncursesw5-dev python-tk python3-tk tk-dev
```

> https://qiita.com/SUZUKI_Masaya/items/7ba3fef9eb7c9603762a

### MySQLの起動の仕方がわからなかった

mysql.server startとかやった、、、
当然NGだったので以下を実行

```
sudo systemctl start mysql
```

### python -vしたらコンソールを閉じられなくなった

Python初心者キラーに殺されかけた
`Ctrl+D`で抜けられた

### pipがない

以下を実行

```
curl -kL https://bootstrap.pypa.io/get-pip.py | sudo python3
```

> https://qiita.com/TatchNicolas/items/ca6b8007d914bdef3662

### pythonのバージョンがデフォルトだった

以下を実行

```
pyenv local 3.6.4
```

### mysqlclientが入らない

以下を実行

```
apt-get install python-dev libmysqlclient-dev
```

### マイグレーションファイルが作成できない

`django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: NO)")`

データベースがなかった
settings.pyの設定にしたがってデータベースを作成する

```
CREATE DATABASE mydb;
```

#### モジュールが足りない（2019/01/29追記）

`ModuleNotFoundError: No module named 'requests'`

```sh
pip install requests
```

`ModuleNotFoundError: No module named 'bs4'`

```sh
pip install bs4
```

### データが作成できなかった

以下のようなエラーになった
`OperationalError - 1366: "Incorrect string value ... "`

以下を実行する

```
DROP DATABASE mydb;
CREATE DATABASE mydb CHARACTER SET utf8;
```

migrateする


```
python manage.py migrate
```

> http://motomichi-works.hatenablog.com/entry/2015/01/03/015337

### アクセスするIPアドレスとポートがわからない

以下を参考にしたが、結局わからなかった
最終的にいろいろ試しまくったら
`192.168.33.10:9080`
で落ち着いた

> http://kinokoru.jp/archives/1188

## その他

### 2019/01/27追記

pyenv installコマンドが使えなくなっていた。

以下のコマンドで解決

```sh
cd ~/.anyenv/envs/pyenv/plugins/python-build/
sudo ./install.sh
```

> https://qiita.com/Soh1121/items/68f231d759a76de8c471

### 2019/01/29追記

`sudo pip install requests`すると`sudo: pip: command not found`

sudoはいらない

```sh
pip install requests
```

## 参考にした

https://qiita.com/SUZUKI_Masaya/items/51366be1510f7fde7cdf

https://qiita.com/SUZUKI_Masaya/items/7ba3fef9eb7c9603762a

http://ksino.hatenablog.com/entry/2016/11/17/232619

http://p15.jp/2014/04/17/000137

https://qiita.com/TatchNicolas/items/ca6b8007d914bdef3662

https://qiita.com/twipg/items/75fc9428e4c33ed429c0

http://www.python.ambitious-engineer.com/archives/818

https://qiita.com/1000ch/items/93841f76ea52551b6a97

http://umatomakun.hatenablog.com/entry/2014/04/25/223240

https://stackoverflow.com/questions/24462007/how-to-deal-with-this-error-1049-unknown-database-users-ohyunjun-work-astra

http://kinokoru.jp/archives/1188

http://gonulates.com/emre/blog/2017/04/27/solving-operationalerror-1366-incorrect-string-value-mysql-error-django/

http://motomichi-works.hatenablog.com/entry/2015/01/03/015337