0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IntelからARMへ開発環境の移行と互換設定

Last updated at Posted at 2024-08-04

M3 Macへの買い替えに伴って環境構築をしつつ、いつも同じようなことを調べているなと思い、今回はプロセッサ考慮の要素も増えたため、覚えている範囲で備忘録を残します。

前提

Processor OS (Ver)
Apple M3 Pro macOS (Sonoma 14.1)

※ 移行アシスタントは使わず、クリーンインストール状態からのセットアップを想定

システム設定

defaults コマンドによる設定

# すべてのファイルの拡張子を表示
defaults write NSGlobalDomain AppleShowAllExtensions -bool true

# 隠しファイルの表示/非表示を設定(表示)
defaults write com.apple.finder AppleShowAllFiles TRUE

# デスクトップに表示する項目:ハードディスク(表示)
defaults write com.apple.finder ShowHardDrivesOnDesktop -bool true

# デスクトップに表示する項目:外部ディスク(表示)
defaults write com.apple.finder ShowExternalHardDrivesOnDesktop -bool true

# デスクトップに表示する項目:接続中のサーバ(表示)
defaults write com.apple.finder ShowMountedServersOnDesktop -bool true

killall Finder

GUIからの設定

macOS Sonoma から実装されたテキスト入力時にカーソル下に表示される青いバルーン(インジケータ)を消す

下記それぞれを実行後、OSを再起動。
参考:macOS Sonomaのかな漢字変換で表示される吹き出しを消す方法

sudo mkdir -p /Library/Preferences/FeatureFlags/Domain
sudo /usr/libexec/PlistBuddy -c "Add 'redesigned_text_cursor:Enabled' bool false" /Library/Preferences/FeatureFlags/Domain/UIKit.plist

ターミナル環境の分岐設定

M1 MacでARMとIntelのターミナルを切り替えて使う (Homebrew 3以降の場合) を参考に、ネイティブ(ARM)とRosetta 2(x86_64互換)でターミナル環境を分離する。

目的としては、バージョン管理ツールで降ってくるアーキテクチャごとのビルドを棲み分けるためで、動作的には、参考記事の通りARM版ターミナルでは/opt/homebrew/bin 以下に、Intel版ターミナルでは/usr/local/bin 以下に、keg(Formulaのインストール先の実体)のシンボリックリンクが振り分けられる。

ARM側環境にHomebrewでツールをインストール

brew_formulae=(
  "gpg"
  "git"
  "git-lfs"
  "gh"
  "mysql"
  "nvm"
  "docker-compose"
  "zellij"
  "rbenv"
  "pyenv"
  "fzf"
  "mkcert"
  "sheldon"
  "zsh-autosuggestions"
  "zsh-syntax-highlighting"
  "mas"
  "blackhole-2ch"
)

for it in "${brew_formulae[@]}"; do
  brew install "$it"
done

今回から移行・導入したツール

sheldon

Oh-My-Zsh から移行。Zsh, Bashに対応のRust製のシェルプラグインマネージャー。
powerlevel10k など諸々セットアップがサクッとできて便利だった。

zellij(ゼリージュ)

tmux から移行。ターミナルマルチプレクサや、ターミナルワークスペース系ツールの一種。
機能面でtmuxとの互換性があり、移行による学習コストはそこまで高くない。

tmux は多機能かつ柔軟である一方、自分はセッションやペインの利用がメインで機能を持て余していたことや、tmux-resurrect などの管理がやや手間であった為、移行に至った。

現状で便利だと感じた特徴は下記の通り。

  • デフォルトでキーバインドが表示されているなど、UIがユーザーフレンドリーである
  • デフォルトでセッション保存・復元など最低限の機能が備わっているなど、ゼロコンフィグでも結構使える
  • tmuxの主要機能である、Window, Session, Pane が、zellijでは、Tab, Session, Pane のように近い使い勝手となっている

コマンドのイメージ

# セッション開始
zellij
# セッション復元
zellij attach <session-name>
# セッション名変更
zellij action rename-session <new-name>

ちなみに名前はアラビア語の「幾何学模様のタイルスタイル」という意味のゼリージュが由来となっていそうだった。

CaskでGUIアプリケーションをインストール

cask_applications=(
  "appcleaner" # アプリケーションを関連ファイルごとアンインストールできる -> https://freemacsoft.net/appcleaner/
  "keka" # ファイルアーカイバ -> https://www.keka.io/ja/
  "google-japanese-ime"
  "mos" # マウススクロールを滑らかにできる -> https://mos.caldis.me/
  "caffeine" # メニューバーからスリープ切り替え等を制御できる -> https://www.caffeine-app.net/
  "lunar" # 外部ディスプレイの設定をコントロールできる -> https://lunar.fyi/
  "karabiner-elements"
  "cmd-eikana"
  "iterm2"
  "warp" # Rust製のモダンターミナル -> https://www.warp.dev/
  "cleanmymac" # クリーナー、パフォーマンス最適化(シェアウェア) -> https://cleanmymac.macpaw.com/21
  "cleanshot" # キャプチャツール(シェアウェア) -> https://cleanshot.com/
  "transmit"
  "obsidian"
  "notion"
  "visual-studio-code"
  "postman"
  "sequel-ace"
  "docker"
  "graphiql"
  "graphql-playground"
  "virtualbox"
  "parallels"
  "1password"
  "google-chrome"
  "firefox"
  "slack"
  "asana"
  "discord"
  "google-drive"
  "vlc"
  "audacity"
  "drawio"
  "figma"
  "adobe-creative-cloud"
  "adobe-acrobat-reader"
  "clipy"
  "microsoft-teams"
  "background-music" # サウンドミキサー -> https://github.com/kyleneideck/BackgroundMusic
  "zoom"
)

for it in "${cask_applications[@]}"; do
  brew install --cask "$it"
done

mas-cliでApp Storeのアプリケーションをインストール

mas_applications=(
  "539883307" # LINE
  "302584613" # Kindle
  "886882252" # Near Lock
  "497799835" # Xcode
)

for it in "${mas_applications[@]}"; do
  mas install "$it"
done

各種バージョン管理ツールの初期設定

前提

各言語のバージョンごとのアーキテクチャが混ざってしまうと困るケースとして、たとえばNode.jsが、アーキテクチャに対応していてもプロジェクトの環境次第では、ネイティブモジュールなどの依存が非対応であったりするケースが存在する。そうした場合に、環境変数の調整や各種引数での対応が可能であることも多いが、バージョン管理自体を棲み分けておくと対応がしやすいと感じたため、今回はこのようにした。

Node.js

nvmを使う場合の例

Rosetta 2のターミナルで実行

mkdir ~/.nvm_x64 && export NVM_DIR="$HOME/.nvm_x64"
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

ネイティブのターミナルで実行

mkdir ~/.nvm_arm64 && export NVM_DIR="$HOME/.nvm_arm64"
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

.zshrcに追記

# 実行アーキテクチャごとにディレクトリの読み先を変更
if [ "$(uname -m)" = "arm64" ]; then
  # arm64
  export NVM_DIR="$HOME/.nvm_arm64"
else
  # x86_64
  export NVM_DIR="$HOME/.nvm_x64"
fi

[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

# .nvmrc を検出して自動でバージョンを切り替える
autoload -U add-zsh-hook
load-nvmrc() {
  local node_version="$(nvm version)"
  local nvmrc_path="$(nvm_find_nvmrc)"

  if [ -n "$nvmrc_path" ]; then
    local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")

    if [ "$nvmrc_node_version" = "N/A" ]; then
      nvm install
    elif [ "$nvmrc_node_version" != "$node_version" ]; then
      nvm use
    fi
  elif [ "$node_version" != "$(nvm version default)" ]; then
    echo "Reverting to nvm default version"
    nvm use default
  fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc

各アーキテクチャ環境で、任意の同バージョンをインストールし、棲み分けができているか確認

node -p process.arch

php

ARM環境でのphpenv環境構築にやや苦戦したため、あまり時間をかけず下記ツールで解決とした。
phpは主にDocker上で動かすもののホストにも入れておきたい程度だった為。

phpenv-installer

python

pythonは先ほどの M1 MacでARMとIntelのターミナルを切り替えて使う (Homebrew 3以降の場合) の「pyenvの場合」を参考に分岐の設定を行った

shellやコマンド周りの設定

各コマンドのalias等

# pnpm
alias pn='pnpm'

# zellij
alias zlj='zellij'

git push時にリモートブランチ名を省略

git config --global push.default current

gpgの設定でcommitを署名付きとする

GitHubの新しい GPG キーを生成するを参考に設定を行う

アプリケーション設定

Safari

# Safariの「開発」メニューの表示/非表示を切り替え(表示)
defaults write com.apple.Safari IncludeDevelopMenu -bool true

コマンドで切り替わらない場合は、MacのSafariで「開発」メニューのデベロッパツールを使用する を参考にマニュアルで設定

Transmit

  • 接続情報の再設定

Xcode

  • ライセンス同意からシミュレータのインストールまで

その他

  • セキュリティソフトのディスクアクセスや必要に応じてFirewall設定
  • 画面収録の許可(zoomやmeet、キャプチャツール周り)

参考記事

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?