どうしてもMacじゃないとできない仕事をいただいて、2月に久しぶりにMacBook Proを買いました。以前、iPadアプリをつくる仕事をしていることがしばらくあって(今回のお仕事もその派生なのですが)、その時もMacBook Proでした。だけど、Intel Macだったんですよね。でも、いまはM1 Macの時代。
いちおう、何かの時のためにMac miniを書斎に置いていることはあって、それがM1初体験だったわけですが、やっぱり普段持ち歩くノートPCじゃないと環境構築熱が上がらないので、あまりきちんと構築した感じではなく、これといったTipsもたまりませんでした。
それが、今回はMacBook Proの14インチモデルで、仕事ですぐに必要だったこともありカスタマイズはしませんでしたが、吊るしの中では最上位のM1 Pro 10コア、メモリ16GB、SSD 1TBというモデル。まぁ、数年は使えるだろうというものですね。細かいことをいえば、メモリとSSDはもうちょっと欲しかったとか、JISキーボードじゃなくてUSキーボードの方が良いかなとかはあるのですが、コロナ禍の影響でここ最近のMacBook Proの入手性は極めて悪く、いまはどうやらApple Storeに行ってもすぐには買えないようで、まだ2月だったからすぐ買えて良かったなというくらいで。
だから、今後もし仕事でガリガリと使っている時にMacが壊れて、修理に出しても1週間とかで、すぐに必要となったら、結局吊しのJISキーボードモデルにならざるを得ないわけですよ。自分の経験上、Macでそういう羽目になったこともあるので。だったら、もう吊るしを使いこなすのが仕事としては一番良いのかも・・・。
それはさておき、Tipsです。
Pythonをどうするのか?
iPadアプリをつくる仕事については、M1 Macでもあまり困ることはないのです。やっぱりAppleの中の話なので。
ただ、最近はPythonを書く仕事が多くて、ふつうにM1 Mac上にPythonをインストールして既存プロジェクトのリポジトリをcloneして、いざ、pip install -r requirements.txt
とやると、エラーになることがあるのです。私の場合、uwsgiのビルドができないというハマリ方。
いろいろM1 MacのTipsを漁ったところ、肝はIntel環境とARM環境の使い分けにあるらしい。M1 MacにRosetta 2というAppleが提供するツールを入れると、Intel CPU向けのアプリやライブラリ類をM1 Mac上で動かすことができるようになります。そこで、Intel CPU向けのPythonをRosetta 2の入っているM1 Macで動かせば、互換性はバッチリでしょう・・・というわけです。
Rosetta 2はなんだかんだで入っていることが多いと思うのですが、下記のコマンドでも導入できます。
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
後は、下記のようなコマンドでArm64環境とX86_64環境の切り替えができます。_
arch -arch arm64e
arch -arch x86_64
ただ、このような切替をいちいち行うこともあるのですが、ターミナルを立ち上げたときに自動で切り替えたり、どっちのアーキテクチャで動いているかによってターミナルの見た目を変えると便利だったりします。そこで、iTerm 2というターミナルアプリを導入しました。
brew install --cask iterm2
ちなみに、HomebrewはARM環境とIntel環境の両方に入れています。Intel環境のPython用にパッケージをビルドする際にIntel環境のライブラリが必要になることがあるからです。
そこで、ARM環境とIntel環境のそれぞれで、下記のコマンドを実行してHomebrewを導入します。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
ARM環境のHomebrewは/opt/homebrew
配下、Intel環境では/usr/local
配下を使うように設定されるので、共存可能です。
また、ARM環境でシェルを使っている場合は、ARM用のHomebrew→Intel用のHomebrewの順に導入したアプリが読み込まれるようにして、Intel環境のシェルではその逆になるように設定しています。
そういったことをまとめた.zshrc
は、下記のようなものになりました。
alias x64='exec arch -x86_64 /bin/zsh --login'
alias a64='exec arch -arm64e /bin/zsh --login'
ARCH=$(uname -m)
if [[ $ARCH == x86_64 ]]; then
(){echo -e "\033]1337;SetProfile=Intel\a"}
eval "$(/opt/homebrew/bin/brew shellenv)"
eval "$(/usr/local/bin/brew shellenv)"
alias brew='PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin brew'
eval "$(anyenv init -)"
else
(){echo -e "\033]1337;SetProfile=Default\a"}
eval "$(/usr/local/bin/brew shellenv)"
eval "$(/opt/homebrew/bin/brew shellenv)"
alias brew='PATH=/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin brew'
. /opt/homebrew/opt/asdf/libexec/asdf.sh
fi
(){echo -e "\033]1337;SetProfile=Intel\a"}
というのは、コマンドでiTerm 2のプロファイルを変えるもので、Intel環境用にIntelという名前のプロファイルを作り、背景色を青っぽくしています。一方、ARM環境で使う場合はDefaultという名前のプロファイルで、これの背景色は黒のままです。
また、iTerm 2はプロファイルを指定してウィンドウやタブを立ち上げた際に、実行するコマンドを指定できます。Intel環境のプロファイルには、/usr/bin/arch -arch x86_64 /bin/zsh --login
というコマンドを実行するようにしています。これでIntel環境に切り替えているわけです。Defaultプロファイルはそのような指定をしていないので、ARM環境で使うことになります。
かなり雑多に書いてしまっていますが、この.zshrc
の見どころはもう1つあって、Pythonをはじめとするプログラミング言語のバージョン管理にARM環境はASDF、Intel環境はanyenvを使っています。どちらも同じものにする方法もあると思いますが、Intel Macを使っていた際はanyenvばかり使っていたので、それはそのまま使うことにして、ARM環境では最近の流行りらしいASDFを使うことで頭を切り替えてみようかと。ちょうど、使うパスも別々になるので好都合です。
と、いうわけで、結局、ARM環境とIntel環境の使い分けに関するTipsを書いただけで力尽きそうですが、まずはここを乗り切らないと先に進めないわけです。新しいアーキテクチャのマシンを使うと壁にぶつかることばかりで、それだけTipsもたまっていくので、今後も書いていきたいと思います。