クラスタ計算機にpythonをインストールする

# 概要
クラスタ計算機にpython3系をインストールする方法を確立したのでシェアします。

## 備考
この記事は研究室用のドキュメントとして作成したものとなります。研究室外の方は、「クラスタ計算機」や後述の「大学のVPN」を適宜読み替えてください。
また、基本的にはローカルのmacであっても同じコマンドでpythonをインストールできます。

### メモ
クラスタ計算機の変更点としては、git v2系、openssl v1.1系をインストールしたことです。

### 参考文献
* [opensslのアップデート](https://qiita.com/Esfahan/items/4e2002f4a24589b2d0bf)
* [gitのアップデート](https://qiita.com/noraworld/items/8546c44d1ec6d739493f)
* [opensslのフルパスを指定してpythonをインストールする方法](https://qiita.com/ksugawara61/items/ba9a51ebfdaf8d1a1b48)

## 要約
python 3.8.5をインストールする場合の手順のまとめです。
※ここで話している```zsh```、```bash```について不安があるひとは「手順」の章から順に進めていってください。

* ```zsh```のひと

```zsh
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
$ source ~/.zshrc
$ CONFIGURE_OPTS="--with-openssl={{openssl へのパス}}" pyenv install 3.8.5
$ source ~/.zshrc
$ pyenv global 3.8.5
$ python --version
```

* ```bash```のひと

```bash
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ 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
$ CONFIGURE_OPTS="--with-openssl={{openssl へのパス}}" pyenv install 3.8.5
$ source ~/.bash_profile
$ pyenv global 3.8.5
$ python --version
```


# 手順
1. 環境構築
2. pyenvのインストール
3. pyenvのパスを通す
4. pyenvでpythonのインストール
5. pythonのバージョン変更

## 1. 環境構築
まずは大学のVPNに接続します。そしてmacのターミナルを開き、クラスタ計算機にsshし、シェルの確認をします。```{{username}}```には自分のクラスタ計算機のユーザー名を代入してください。```{{ip}}```にはクラスタ計算機のIPアドレスを代入してください。

```zsh
$ ssh -Y {{username}}@{{ip}}
$ echo $SHELL
```
おそらく```/bin/tcsh```が返ってくると思います。シェルはmacと揃えておいたほうがmacの環境をそのままクラスタ計算機に移すことができて便利だと思います。したがって、macのシェルが```zsh```ならクラスタ計算機も```zsh```、macが```bash```ならクラスタ計算機も```bash```にするのが良いと思います。
※個人的にはmacもクラスタ計算機も```zsh```にするのが良いと思います。```zsh```のほうが簡単だし、便利です。

というわけで、クラスタ計算機のシェルの変更をします。```zsh```の人は```{{shell}}```のところに、```zsh```、```bash```の人は```{{shell}}```のところに、```bash```を代入してください。

```zsh
$ chsh -s /bin/{{shell}}
```

シェルの変更には一旦ログアウトしなければならないため、ログアウトします。

```zsh
$ exit
```
再度クラスタ計算機にログインし、シェルの確認をします。先程変更したシェルとなっていればOKです。

```zsh
$ ssh -Y {{username}}@{{ip}}
$ echo $SHELL
```

## 2. pyenvのインストール
git cloneするだけです。

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

## 3. pyenvのパスを通す
シェルによって手順が異なるので、自分のシェルが```zsh```、```bash```のどちらであるかを確認した上で以降の手順を行ってください。

* ```zsh```のひと

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

* ```bash```のひと

```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
```

これは共通の手順です。念の為、pyenvがちゃんとインストールされているか確認します。何かしらのバージョン番号が返ってくればOKです。

```zsh
$ pyenv --version
```


## 4. pyenvでpythonのインストール
openssl1.1系でないとpythonのインストールが正常に行われないらしいので、openssl1.1系のフルパスを指定した上でpythonをインストールします。```{{version}}```のところには、インストールしたいpythonのバージョンを代入してください。

```zsh
$ CONFIGURE_OPTS="--with-openssl=/usr/local/openssl-1.1.1/" pyenv install {{version}}
```

以降はシェルによって手順が異なるので、自分のシェルが```bash```、```zsh```のどちらであるかを確認した上で以降の手順を行ってください。

* zshのひと

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

* bashのひと

```bash
$ source ~/.bash_profile
```


## 5. pythonのバージョン変更
最後にpythonのバージョンを変更し、インストールしたバージョンとなっているかを確認します。```{{version}}```のところは先程インストールしたpythonのバージョンを代入してください。

```zsh
$ pyenv global {{version}}
$ python --version
```

無事インストールしたバージョンが返ってくればインストールは成功です。お疲れさまでした。

## トラブルシュート
### 証明書エラーが発生した場合
下記のようなエラーが発生した場合は以下のように設定します。

```
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]
```

1. 証明書関連のライブラリをインストールします。
    ```
    $ pip install certifi
    ```
2. パスを通します。
    - `zsh` のひと
       
       ```
       $ echo export SSL_CERT_FILE="$HOME/.pyenv/versions/3.8.5/lib/python3.8/site-packages/certifi/cacert.pem" >> ~/.zshrc
       ```
    - `bash` のひと
       
       ```
       $ echo export SSL_CERT_FILE="$HOME/.pyenv/versions/3.8.5/lib/python3.8/site-packages/certifi/cacert.pem" >> ~/.bash_profile
       ```