（備忘録）M1 Macにおけるpyenvを用いたPython環境構築

# はじめに
本稿では表題のとおり、M1 Macにおいてpyenvを用いたPython環境構築の方法を解説する。
筆者が用いたPCのスペックは下記のようである。
* MacBook Pro (14インチ、2021)
* チップ Apple M1 Pro
* メモリ 32 GB
* OS macOS Monterey

# なぜ本稿を書くに至ったのか
上記の新しいMacBook Proを購入する以前は、MacBook Air (Early 2015?) を使っていた。データをまるまる新しいMacBook Proに移すことも可能であったが、今回は新しいPCの環境を一から作り直したいという思いがあったので、データ移行は行わなかった。
新MacBook Proを起動、大学のインターネット接続、Proxy設定、VPN接続、Chromeのインストール、セキュリティソフトウェアのインストール……などの設定は滞りなく進んだ。
筆者はPythonユーザーであるため （筆者の他の記事をぜひご覧ください）、新しいMacbookにおいてもPython環境を構築しておきたかった。しかし、ここで今まで出くわすことのなかった新しい<b>問題</b>に突き当たった。今後自分が新しいパソコンを買った際への備忘録として、あるいは私と同じ状況に出くわす可能性のある方のために、本稿を書くことに決めた。
# Pyenvを用いたPython環境構築のフローチャート
1. Xcode Command Line Toolsのインストール
2. Homebrewのインストール
3. Homebrew経由でPyenvインストール、パスを通す
4. minicondaのインストール
5. condaで種々のパッケージのインストール

### 0. そもそもPyenvとは (Homebrewとは)
Pyenvとは、Pythonのバージョン (Python2系とPython3系、また異なるディストリビューション (Python, Anaconda, Miniconda, Miniforge, Pypy....)) の管理を行うパッケージである。噛み砕いて説明すると、一言に「Python」といっても色々な種類 (ディストリビューション) があり、目的によって違う種類のPythonを使い分ける必要があるのだが、それを管理してくれるのがPyenvである。

そしてHomebrewはパッケージ管理ソフトウェアである。例えば新しいアプリが欲しいときは、MacユーザーであればApp Storeに行くことがあると思うが、Homebrewを用いればApp Storeで提供されていないツールをインストールすることができる。
(公式サイトでも平易に説明されている https://brew.sh/index_ja 2022年7月28日 アクセス)

### 1. Xcode Command Line Toolsのインストール
Homebrewをインストールするためには、あらかじめXcode Command Line Toolsをインストールする必要がある。
ターミナルを開いて下記コマンドを実行
```XcodeCommandLineTools.sh
xcode-select --install
```
### 2. Homebrewのインストール
Homebrewのインストールは公式サイトにも説明があるとおり (https://brew.sh/index_ja 2022年7月28日アクセス)ターミナルにて下記のおまじないコマンドを実行する。
```brew.sh
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
このままだとおそらくパスが通っていない。しかしご親切に下記のような表示があると思うので、そのまま実行する。
```brewresult
==> Next steps:

Add Homebrew to your PATH in /Users/hoge/.zprofile:
echo 'eval $(/opt/homebrew/bin/brew shellenv)' >> /Users/hoge/.zprofile
eval $(/opt/homebrew/bin/brew shellenv)
```
echo... と、eval... のコマンドをそのままコピペ、実行する (上記のコマンドをコピペするのではなく、ご自身のターミナルにでたものをコピペして実行すること)。
ちなみに筆者が大学のネットワークからHomebrewをインストールしようとしたところ、なぜかGithubに接続をすることができなかった (おそらくプロキシの問題?)。筆者は別のネットワークを利用することでインストールを達成したが、皆様も同じ問題に遭遇した場合は、zsh/bashのプロキシ設定を行うか、別のネットワーク (テザリングや自宅のWifi) を利用するといった方法を試していただきたい。

### 3. Homebrew経由でPyenvインストール、パスを通す
ターミナルにて下記コマンドを実行
```pyenvinstall.sh
brew install pyenv
```
pyenvのパスを通す必要があるので、.zshrcファイルに下記のコマンドを追記
.zshrcはホームディレクトリの下にあるので、
1)Finderを開いて、Command + Shift + . を入力して隠しファイルを表示し、テキストエディタで編集する
2)ターミナルからvimなりを起動して編集 (CUIの知識がある人向け)
のいずれかを実行すること。
```pyenvpath.sh
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```
その後、下記コマンドを実行し、pyenvがインストールされ、パスが通っていることを確認する。
```pyenv_comfirm.sh
pyenv -v
```

### 4. minicondaのインストール
(参考 https://insilico-notebook.com/anaconda-vs-miniconda/ 2022年7月28日アクセス) 
#### 4-1. Anaconda
科学計算のためのPtyhonのディストリビューションとして、Anacondaが有名である。Anacondaをインストールすると:
・ Python
・ 科学計算向けのパッケージ (numpy, pandas, Matplotlib, Scikit-leranなどたくさん) 
・ Pythonのパッケージマネージャ (conda) 
・ R
・ Anaconda Navigator
など、確実に必要なものから、使う可能性の低いものまで、大量にインストールしてくれる (勝手にする)。
<b>===これだけでOK! 初心者向け金魚飼育フルセット ¥9,800===</b>
みたいな感じである。

#### 4-2. Miniconda
一方Minicondaはその名前の通り、小さいAnacondaで:
・ Python
・ Conda
・ 最小限のパッケージ
のみをインストールしてくれる。
<b>===金魚水槽単品 ¥1,500===</b>
みたいな感じである。

Anacondaをインストールすると色々ついてくるので楽であるが、その分容量が大きく、また要らないものまで入れられるのが好きではないので、筆者は今回はminicondaをインストールし、必要なパッケージはその都度自分で入れていくことにした (自分の環境に何があるのか自分で把握できて、好み)。
さて下記コマンドでminocondaの最新バージョンをインストールしようとしたのだが、<b>ここで問題が生じた</b>。
```pyenv_minoconda.sh
pyenv install miniconda3-4.7.12
```
次のようなエラ－を吐かれてしまった。
```error
ERROR: The binary distribution of Miniconda is not available for MacOSX-arm64.
```
見たこともないエラーだったので、こちらの文章のまま検索してみると、どうやら
「arm64に対応していないライブラリがあるため、M1 Macにおいてはpyenv経由でminicondaをインストールすることはきない」様である (どうやらAnacondaも? https://moromisenpy.com/m1-mac-anaconda/ 2022年7月28日アクセス) (なんでだ！)。
しかしインストールできないなら仕方がないので、解決方法を調べていると、どうやらminiforgeならM1 Macでも動くらしい。miniforgeは、ざっくり言うと、利用するリポジトリがデフォルトで conda-forge になっているminicondaのようである。そこで下記のように最新版のminiforgeをインストールした。
```pyenv_miniforge.sh
pyenv install miniforge3-4.10.3-10
```
するとうまくいった。miniforgeのパッケージマネージャはcondaなので、筆者はminicondaを使っていた頃と全く同じ感覚で使用することができている (<b>何かminicondaの使用方法との違いをご存知の方がいたらご教示願いたい</b>)。

### 5. condaで種々のパッケージのインストール
condaさえ手に入ってしまえばこちらものなので、下記コマンドで次々と必要なパッケージをインストールしていった。
```conda_install.sh
pyenv global miniforge3-4.10.3-10
conda install package_name
```
* numpy
* pandas
* matplotlib
* seaborn
* jupyter notebook
* umap-learn
* scikit-learn
* python-docx
* openpyxl

### おまけ -pyenvコマンド-
|コマンド|目的|
|-----|-----|
|pyenv install --list|インストールできるバージョンの一覧|
|pyenv install hogehoge|特定のPythonのインストール|
|pyenv versions|インストール済みのバージョンの表示|
|pyenv global hogehoge|利用するバージョンの変更 (全てのディレクトリで使用される)|
|pyenv local hogehoge|利用するバージョンの変更 (カレントディレクトリでのみ)|
|pyenv uninstall hogehoge|インストール済みのバージョンをアンインストール|

# おわりに
今回新しくM1 Macにおいて、pyenvを用いたPython環境の構築を行なったが、その過程においてチップの種類の違いはプログラミング言語の実行にも影響があると言うことを初めて知った。
もし古いMacBook Airからデータをそのまま移そうとしていたら、minicondaは新しいPCで動いたのだろうか……？
なにはともあれ、新しいパソコンは、良い。