[詳細版] Google Compute Engine (Ubuntu 16.04) で快適なPython環境作り

# 概要
本記事では，GCEのUbuntuにおいて，Python環境を作ります．
（vimの設定等は適宜ご自身で行ってください．）
具体的にやることは以下です．

+ サービスアカウント→ユーザーアカウントに変更
+ zshを入れる
+ Pythonを入れる
+ Powerline-shellでカスタマイズ
+ Jupyter notebookを使えるようにする
+ Stackdriver Monitoring Agentを入れる．

## 初期設定
初期状態では，サービスアカウントが内部で使われます．
色々と面倒なので，自分のユーザーアカウントでログインしておくことを推奨します．

```zsh
gcloud init
```
色々聞かれるので，言われたとおりに認証して，verification codeを貼ります．

## zshの導入
まず，zshをinstallします．

```zsh
sudo apt-get install zsh -y
```

その後，デフォルトのshellをzshにしたいのですが，パスワードがわからないため， `chsh`コマンドが動きません．（やり方あったら教えて欲しい）
そのため，

```zsh
vim ~/.bashrc
```

などでbashrcを開いて，末尾に

```zsh
exec /usr/bin/zsh
```

を挿入します．これでデフォルトのshellがzshになりました．

### oh-my-zshを入れる
続いて，oh-my-zshを入れます．
（個々人のこだわりがあるかと思うので，こだわりのあるかたは [Python環境の構築](## Python環境の構築) までスキップしてください．）

```zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
```

デフォルトのシェルを変えるかみたいなこと聞いてきますが当然 `no` にしてください．

外部プラグインとして，以下を入れます．

+ zsh-syntax-highlight
+ zsh-autosuggest
+ zsh-history-substring-search
+ zsh-completions

```zsh
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-history-substring-search ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-history-substring-search
git clone https://github.com/zsh-users/zsh-completions ${ZSH_CUSTOM:=~/.oh-my-zsh/custom}/plugins/zsh-completions
```

一旦ここで，zshrcを変更しましょう．

```zsh:~/.zshrc
export ZSH="${HOME}/.oh-my-zsh"
ZSH_THEME="candy"
plugins=(
  git pip pyenv virtualenv zsh-syntax-highlighting zsh-autosuggestions history-substring-search zsh-completions
)
source $ZSH/oh-my-zsh.sh
```

編集したら，一旦読み込みます．

```zsh
source ~/.zshrc
```

## Python環境の構築
pyenvとvirualenvを使ったよくある仮想環境構築を行います．
まずは，pyenvとvirtualenvをインストールします．

```zsh
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshenv
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshenv
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.zshenv
source ~/.zshenv
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshenv
source ~/.zshenv
```

好きなバージョンのPythonをインストールします．
例えばこのような感じ．

```zsh
pyenv install 3.6.5
pyenv virtualenv 3.6.5 default_env
pyenv global default_env
```

### powerline-shellのインストール
ここもこだわりがある人はSkipしてください．
まず，現在の仮想環境にpowerline-shellを入れます．

```zsh
pip install powerline-shell
```

その後，再びzshrcを以下のように編集してください．

```zsh:~/.zshrc
export ZSH="${HOME}/.oh-my-zsh"
ZSH_THEME="candy"

function powerline_precmd() {
    PS1="$(powerline-shell --shell zsh $?)"
}
function install_powerline_precmd() {
  for s in "${precmd_functions[@]}"; do
    if [ "$s" = "powerline_precmd" ]; then
      return
    fi
  done
  precmd_functions+=(powerline_precmd)
}
if [ "$TERM" != "linux" ]; then
    install_powerline_precmd
fi

plugins=(
  git pip pyenv virtualenv zsh-syntax-highlighting zsh-autosuggestions history-substring-search zsh-completions
)
source $ZSH/oh-my-zsh.sh

export LC_ALL="en_US.UTF-8"
export LANG=ja_JP.UTF-8

#---------------------- 以下，私的設定なので割愛してください ----------------------#
#historyファイル指定
HISTFILE=$HOME/.zsh-history
HISTSIZE=1000
SAVEHIST=10000

#コマンドじゃなければ cd する
setopt auto_cd
# 補完候補を一覧表示
setopt auto_list
# TAB で順に補完候補を切り替える
setopt auto_menu
# カッコの対応などを自動的に補完
setopt auto_param_keys
# ディレクトリ名の補完で末尾の / を自動的に付加し、次の補完に備える
setopt auto_param_slash
# コマンドミスった時のcorrect
setopt correct
# 補完候補一覧でファイルの種別をマーク表示
setopt list_types
# 明確なドットの指定なしで.から始まるファイルをマッチ
setopt globdots
# ファイル名の展開でディレクトリにマッチした場合 末尾に / を付加
setopt mark_dirs
# 語の途中でもカーソル位置で補完
setopt complete_in_word
# カーソル位置は保持したままファイル名一覧を順次その場で表示
setopt always_last_prompt
# ビープを鳴らさない
setopt nobeep
# vcs有効化
setopt prompt_subst
# #以降をコメントとして扱う
setopt interactive_comments
# ヒストリの共有
setopt share_history
# ヒストリに追加されるコマンドが古いものと同じなら古いものを削除
setopt hist_ignore_all_dups
```

更にカスタマイズします．

```zsh
mkdir -p ~/.config/powerline-shell && powerline-shell --generate-config > 
```

以下の2ファイルを作成します．

```python:~/.config/powerline-shell/original_color.py
from powerline_shell.themes.default import DefaultColor
​
​
class Color(DefaultColor):
    USERNAME_FG = 15
    USERNAME_BG = 4
    USERNAME_ROOT_BG = 1
​
    HOSTNAME_FG = 15
    HOSTNAME_BG = 10
​
    HOME_SPECIAL_DISPLAY = False
    PATH_FG = 15
    PATH_BG = 70
    CWD_FG = 231
    SEPARATOR_FG = 0
​
    READONLY_BG = 1
    READONLY_FG = 7
​
    REPO_CLEAN_FG = 14
    REPO_CLEAN_BG = 0
    REPO_DIRTY_FG = 3
    REPO_DIRTY_BG = 0
​
    JOBS_FG = 4
    JOBS_BG = 8
​
    CMD_PASSED_FG = 255
    CMD_PASSED_BG = 136
    CMD_FAILED_FG = 255
    CMD_FAILED_BG = 1
​
    SVN_CHANGES_FG = REPO_DIRTY_FG
    SVN_CHANGES_BG = REPO_DIRTY_BG
​
    VIRTUAL_ENV_BG = 31
    VIRTUAL_ENV_FG = 231
​
    AWS_PROFILE_FG = 7
    AWS_PROFILE_BG = 2
​
    TIME_FG = 255
    TIME_BG = 246
```

```python:~/.config/powerline-shell/config.json
{
    "segments": [
        "virtual_env",
        "aws_profile",
        "ssh",
        "cwd",
        "git",
        "git_stash",
        "jobs",
        "read_only",
        "newline",
        "set_term_title",
        "svn",
        "time",
        "exit_code"
    ],
    "cwd": {
        "max_depth": 4,
        "max_dir_size": 10,
        "full_cwd": 1
    },
    "mode": "patched",
    "theme": "~/.config/powerline-shell/original_color.py"
}
```

**<font color='red'>注意**

+ 仮想環境内にpowerline-shellがないとおかしくなりますので毎回 `pip install` してください．
+ 文字化けする場合は，以下を参考にフォントを入れるとなおります．（自分は`Roboto Mono for Powerline`を使ってます）
    + https://github.com/powerline/fonts

## Jupyter Notebookの設定
そのままだとJupyterが使えないので設定します．
以下のサイトの**jupyterの設定**以降を行えばJupyterを使えます．
参考：https://rf00.hatenablog.com/entry/2018/01/01/160820

※**sshが切れるとJupyterが落ちちゃうので，tmuxを立ててその中でJupyterを使うことを推奨します．**

## Stack Driver Monitoring Agentを入れる
GCEのリソース監視に[Stack Driver Monitoring Agent](https://cloud.google.com/monitoring/agent?hl=ja)をお勧めします．
入れると詳しいメモリー使用率などが[こちら](https://app.google.stackdriver.com/instances?)の右上のHOSTタブの隣のAgentタブから確認できるようになります．
（ただし，別途課金がかかるので注意）

[公式](https://cloud.google.com/monitoring/agent/install-agent?hl=ja)の通りにインストールします．
デフォルトだと1分ごとにデータを送信しますが，課金量が気になるので3分毎にデータを送信するように変更します．

```zsh
sudo vim /etc/stackdriver/collectd.conf
```

```conf:/etc/stackdriver/collectd.conf
Interval 180  # Interval 60から変更

# 以下変更なし
```

```zsh
sudo service stackdriver-agent restart
```