見出し画像

研究用途の「M1 Mac」環境整備

※2021.12.15:個人サイト(https://yutakashoji.netlify.app)から移動しました。内容はほとんど購入当時(2021年4月)に書いたものですが、今の状況に合わせて多少修正してます。


M1 MacBook Proを購入したので研究・開発環境の整備についてメモ.

Homebrew

なにはともあれHomebrew。自分の購入タイミング(4月)では既にM1チップに正式対応済みだったので公式にあるワンライナーでインストール可能だった。

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

intel版の/usr/local以下ではなく/opt/homebrew/に入る。

$ which brew
/opt/homebrew/bin/brew

arch -x86_64 /bin/bash -c ~ としてintel版を共存させることもできるみたいだけど今のところpandocが使えないくらいなので入れていない。 pandocもいつの間にかarm対応してました。

dotfiles

.bashrcや.vimrcなど、設定ファイルはdotfilesとしてGitLabにあげているのでgit cloneするだけ。

ただし、大学のLinux機にも頻繁にsshする都合上macとLinuxで同じdotfilesを展開しているので、それぞれのローカル設定は ".hoge.local" みたいなのを用意していて、それを本体 (".hoge")で読み込むようにしている。
時間あったら.vimrc, .tmux.conf, シェルの設定ファイルとかについても書きます。

シェル(fish)

シェルはfishユーザー。brewでインストール。
以下のような設定ファイルを置いてプロンプトにカレントシェルのアーキテクチャを表示するようにした。
(今のところx86で動かすことほぼないけど)

~/.config/fish/functions/fish_prompt.fish
(上記のmac, Linux機共通部分)

function fish_prompt --description 'Write out the prompt'

  echo -n \n

  # read local config file if exist
  if test -f ~/.config/fish/functions/fish_prompt.fish.local
    source ~/.config/fish/functions/fish_prompt.fish.local
  end

  set_color blue
  echo -ns "$USER"
  if test -n "$SSH_CONNECTION"
    echo -ns '@' (prompt_hostname)
  end
  echo -ns '[' (prompt_pwd) ']'
  set_color yellow
  printf '%s' (fish_git_prompt)

  set_color normal
  echo -ns \n '$ '

end

~/.config/fish/functions/fish_prompt.fish.local
(macローカル設定, armかx86か表示)

switch (uname -m)
  case arm64
    set_color green
    echo -ns "(arm) "
  case x86_64
    set_color cyan
    echo -ns "(x86) "
end

この設定だと、プロンプトはこんな感じ

(arm) yshoji[~/.c/f/functions]
$

fishをデフォルトシェルにしてはいけない

M1関係ないですけど、fishをchshでログインシェルに設定してしまうとfishとbash、zsh等に完全な互換性がないため問題が起きることがあります。
以前CentOS(7か8か忘れた)でログインシェルをfishにしたらログイン画面でループしてしまう現象に陥った。sshでは入れたので事なきを得たけどssh設定前だったら詰んでた。
ログインシェルはデフォルトから変えずに以下の処理を.bashrcなどに書いてexec fishしましょう。

# call fish shell
if type fish >/dev/null 2>&1; then
  # interactive shell only
  case $- in
    *i*)
      exec fish;;
    *)
      return;;
  esac
else
  echo "fish is NOT installed (.zshrc)"

Python

いままでconda環境でPython環境を構築していたがAnaconda/Miniconda公式はM1未対応公式MinicondaもM1対応していた。純粋にライセンスによって公式かforgeか選べばいいと思います。

Anacondaのコミュニティ版であるconda-forgeからminiforgeをインストール。
homebrewからインストールできる。

$ brew install miniforge

普通 "conda init $SHELL" がインストール時に実行されると思うんですが、上のexec fishの影響で$SHELLにzshが入ってるからかうまくいってなかったので手動で実行。

$ conda init fish

以下が "~/.config/fish/config.fish" に追記されるので、これを "~/.config/fish/config.fish.local" (ローカル設定用)に移動。

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
eval /opt/homebrew/Caskroom/miniforge/base/bin/conda "shell.fish" "hook" $argv | source
# <<< conda initialize <<<

余談ですが、 pyenv + conda でPython環境作ってる例をたまに見かけるんですが、condaで環境管理しないでpyenvでやるメリットがよくわからないので詳しい方教えて下さい。
pyenvを一度試した時は、tmuxで新しくセッション作る度に読み込みラグが起きて超ストレスでした(anyenvをlazy loadするみたいなTipsも試してみたけどあんまり…)。tmux使いはpyenv向かないということでしょうか。

R

RはすでにM1対応済み。homebrewからインストール可能。
RStudioは未対応armネイティブではないけどintel形式で動くよう。
図の作成とかインタラクティブに使いたい時は当面 jupyter lab からR使おうと思います。

Rをjupyter labから使うための準備

install.packages("devtools")
devtools::install_github("IRkernel/IRkernel")
IRkernel::installspec()

はじめintall.packages("devtools")がエラーだったんですけど、brewでlibgit2をインストールすることで解決した。

LaTeX

TeX Live2021からユニバーサルバイナリになったので、ネイティブでMacTexでもなんでもインストールできます。(最近ではoverleafとかcloud latexとか使う人のほうが多い?)

Docker

Docker DesktopのM1対応版が2021.04.15にリリースされました。
OpenFOAM(数値流体OSS)のdocker環境試してみたけどちゃんと動きました。

Adobe CC

図を作るときにillustrator使ったりするので一応書いておきますが、Adobe系もほとんど今ではほぼユニバーサルバイナリになっています。

まとめ

購入当時の4月で発売からおよそ半年でしたが、その時点でかなりApple Silliconには対応してました。今となっては研究用途でもApple Silliconで困ることってほとんど無いのではないでしょうか。それよりバッテリーの持ちが神とか、放熱ファンの音ほとんど聞いたこと無いとか、いいところのほうが大きいと思います。

M1 Maxと14インチ画面ほしー


この記事が気に入ったらサポートをしてみませんか?