俺の環境構築　Xcodeのインストールからpipenvとpyenvで仮想環境構築し，Jupyter Notebookを使うまで

#はじめに
よくmacでの環境構築方法を忘れてしまうので，メモ程度で書いておきます．流れとしては新品もしくは初期化状態からの説明を書いていくつもりです．

#環境
MacBook Pro (2020), Catalina 10.15.7

#Homebrewとは
macOS上でパッケージの管理をするシステムのこと．環境構築をする時や，パッケージのインストールなどに使う．

##Xcodeのインストール
まずHomebrewをインストールする際に必要なXcodeからインストールします．以下のコードをTerminalで実行するだけでインストールされます．

```
$ xcode-select --install
```
たまに原因不明(おそらくmacOSとXcodeのヴァージョンの不一致)で上手くXcodeをインストールできない時があり，下記のようになるが，，，

```
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```
この場合は↓の記事で解決方法を書いたのでそれを参照してください．
[Xcodeをインストールできなかった時の対策](https://qiita.com/bobi/items/cdbc95661f828b09674f#%E5%AF%BE%E7%AD%96%E3%81%A8%E6%89%8B%E9%A0%86)

##Homebrewのインストール
以下のコードをTerminalで実行する．

```
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

###Homebrewのパッケージのインストール
```ruby
$ brew install pyenv      # pyenvパッケージのインストール   
$ brew install pipenv     # pipenvパッケージのインストール
```

##pipenvとpyenvでの環境構築

###まずはpythonのインストール
```
$ pyenv install 3.8.2
```
3.8.2のところは自分の入れたいpythonのヴァージョンを指定してください．3.9.0だとPytorchが入らなかったので以前のパソコンで使っていた3.8.2を入れました．

###シェルの設定
macOSはCatalinaからデフォルトのシェルはzshになっているので.zprofileに書き込みます（ちなみにbashでもできる）．

```terminal
$ nano ~/.zprofile    #.zprofileを開くコマンド
```
下記の内容をコピペして貼り付ける．

```:.zprofile
export PYENV_ROOT=${HOME}/.pyenv
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
fi
```
書き込んだら，control + x　→　y　→　returnで戻れる．
次に下のコマンドで先程書き込んだ内容を反映させる．

```
$ source ~/.zprofile
```

###ディレクトリを作り仮想環境を作る
とりあえずディレクトリの名前をhogehogeとして作ります．

```
$ mkdir hogehoge
```
次にhogehogeに移動する．

```
$ cd hogehoge
```
pythonのヴァージョンを指定する．

```terminal:hogehoge
$ pyenv local 3.8.2    #3.8.2の所は自分の使うpythonのヴァージョンを指定してください
```
pythonのヴァージョンを確認．

```:hogehoge
$ pyenv version
3.8.2 (set by /Users/ホームディレクトリ名/hogehoge/.python-version)
```
python 3.8.2の仮想環境を作る．

```:hogehoge
$ pipenv --python 3.8.2
Virtualenv already exists!
Removing existing virtualenv...
Warning: the environment variable LANG is not set!
We recommend setting this in ~/.profile (or equivalent) for proper expected behavior.
Creating a virtualenv for this project...
Pipfile: /Users/ホームディレクトリ名/hogehoge/Pipfile
Using /Users/ホームディレクトリ名/.pyenv/versions/3.8.2/bin/python3.8 (3.8.2) to create virtualenv...
⠏ Creating virtual environment...created virtual environment CPython3.8.2.final.0-64 in 547ms
  creator CPython3Posix(dest=/Users/ホームディレクトリ名/.local/share/virtualenvs/hogehoge--aKlzNkT, clear=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/Users/ホームディレクトリ名/Library/Application Support/virtualenv)
    added seed packages: pip==20.2.4, setuptools==50.3.2, wheel==0.35.1
  activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator

✔ Successfully created virtual environment! 
Virtualenv location: /Users/ホームディレクトリ名/.local/share/virtualenvs/hogehoge--aKlzNkT
Creating a Pipfile for this project...
```
上の様になれば上手くいってます．

###仮想環境に入る
このコマンドで仮想環境に入ります．

```:hogehoge
$ pipenv shell
Launching subshell in virtual environment...
 . /Users/ホームディレクトリ名/.local/share/virtualenvs/hogehoge--aKlzNkT/bin/activate       
~/hogehoge:  . /Users/ホームディレクトリ名/.local/share/virtualenvs/hogehoge--aKlzNkT/bin/activate
(hogehoge) $  
```
一番下の行の一番左に（hogehoge）があれば仮想環境に入れてます．
ちなみに仮想環境を出るときはexitと打てば出れます．

##pythonのライブラリのインストール
まずnumpyを入れてみる．

```:(hogehoge)
(hogehoge) $ pipenv install numpy
Installing numpy...
Adding numpy to Pipfile's [packages]...
✔ Installation Succeeded 
Pipfile.lock not found, creating...
Locking [dev-packages] dependencies...
Locking [packages] dependencies...
Building requirements...
Resolving dependencies...
✔ Success! 
Updated Pipfile.lock (456e4b)!
Installing dependencies from Pipfile.lock (456e4b)...
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
```
入っているか確認してみます．

```:(hogehoge)
(hogehoge) $ cat pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
numpy = "*"

[dev-packages]

[requires]
python_version = "3.8"
```
packagesのところを見るとnumpyが入ってることを確認．
こーゆー感じでライブラリを入れていきます．

##Jupyter Notebookを使う
###Jupyter Notebookの導入と立ち上げ
さっそくjupyter notebookをインストール．

```:(hogehoge)
(hogehoge) $ pipenv install jupyter notebook
Installing jupyter...
Adding jupyter to Pipfile's [packages]...
✔ Installation Succeeded 
Installing notebook...
Adding notebook to Pipfile's [packages]...
✔ Installation Succeeded 
Pipfile.lock (456e4b) out of date, updating to (b58be4)...
Locking [dev-packages] dependencies...
Locking [packages] dependencies...
Building requirements...
Resolving dependencies...
✔ Success! 
Updated Pipfile.lock (b58be4)!
Installing dependencies from Pipfile.lock (b58be4)...
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
```
上の様になれば成功です．
次にJupyter Notebnookを立ち上げます．

```:(hogehoge)
(hogehoge) $ jupyter notebook
```
立ち上げるとブラウザが開き下図が表示されます．右側に見えるNewをクリックしPython3を選んでください．
![Screen Shot 2020-11-13 at 0.51.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502866/5e9e88ff-71ef-7508-1a36-d368ecd65199.png)

Numpyが使えるか確認してみる．
![Screen Shot 2020-11-13 at 0.54.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502866/a3a01f0c-bde2-fef1-bad6-fa3431a731cf.png)

しっかり使えてます．これで一通り環境構築は終わりです．あとは自分の使うライブラリをインストールしていってください．終了のさせかたはググってください笑

#最後に
初心者にもわかりやすく伝わるように書いたつもりです．なにか修正点や追記したほうが良いことなどがあれば教えて下さい．ちなみに自分はJupyter LabよりJupyter Notebook派です（一応どっちも入れてる）．理由はコマンドでタブの移動ができるという点だけなんですけど．でもJupyter Notebookは開発が終わり，Jupyter Labに移行すると公式が発表してるらしいのでJupyter Labに切り替えた方が良いのかなと思ったりします．Jupyter Labの入れ方はググれば結構記事が出てくるので，Jupyter Labを使いたい人はそっちを参考にしてください．この記事の**pythonのライブラリのインストール**までは手順は一緒で大丈夫です．

環境構築に関しては[@gabe-ds](https://qiita.com/gabe-ds)に色々教えてもらったり，手伝ってもらったりしたので，こっちのqiitaも読んでみてください．Mac系の便利な記事があります．

#おまけ
###コマンド一覧
```terminal
$ pyenv install x.x.x    # 任意のpythonのヴァージョンを入れる
$ pyenv global x.x.x    # system全体のpythonヴァージョンを変更する
$ pyenv local x.x.x    # pythonのヴァージョンを指定する
$ pyenv version    # ディレクトリで使用しているpythonのヴァージョンを確認する
$ pyenv versions    # ディレクトリで使用できるpythonのヴァージョンを確認する
```

###ライブラリを一気にインストールする
```
$ pipenv install numpy pandas matplotlib ...
```
上の様に一括でインストールできるが，Jupyter Notebookの様に間にスペースが入るやつを入れると失敗するので気をつけてください．

###毎回pipenv shellをしないでディレクトリ移動時に自動で仮想環境に入る
.zprofileに下のやつを書き込んでください．すると毎回自動で仮想環境に入ってくれます．

```:.zprofile
# run pipenv shell automatically
function auto_pipenv_shell {
    if [ ! -n "${PIPENV_ACTIVE+1}" ]; then
        if [ -f "Pipfile" ] ; then
            pipenv shell
        fi
    fi
}

function cd {
    builtin cd "$@"
    auto_pipenv_shell
}

auto_pipenv_shell
```