【2024年末最新版レシピ】MacBookで攻めた環境構築【Rust製ツール】

## 最新ツールは浪漫

古くて枯れた技術。それもまた浪漫。ハードボイルド。
だが最新の尖ったツールはやはり浪漫である。

この記事では、2024年末時点での最新かつ効率的なMac開発環境の構築方法を紹介します。特に以下の特徴を持つ環境を目指します：

- ⚡️ 高速な起動と動作
- 🛠 Rust製ツールによる安定性と性能
- 🔧 統一的な環境管理
- 💻 クロスプラットフォーム対応

![スクリーンショット 2024-12-19 16.14.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215371/fb3f4732-2cb5-06d3-87f0-83057104576c.png)

### 開発環境の全体像

構築する環境の概要図は以下の通りです：

```mermaid
graph TD
    A[WezTerm] --> B[Zsh]
    B --> C[Starship]
    B --> D[Mise]
    D --> E[言語環境管理]
    D --> F[ツール管理]
```

### 使用するツールと役割


| カテゴリ | ツール名 | 役割 | 選定理由 |
|----------|----------|------|----------|
| ターミナル | WezTerm | 端末エミュレータ | GPUレンダリングによる高速な描画 |
| シェル | Zsh | コマンドライン環境 | macOSデフォルト、POSIX互換 |
| プロンプト | Starship | シェルプロンプト | 高機能、高カスタマイズ性 |
| 環境管理 | Mise | 統合環境管理 | 高速、asdf互換 |

## ツール選定の理由

### ターミナル選定

- iTerm2
  - 長所: 安定性、機能の豊富さ
  - 短所: 起動速度、メモリ使用量

- Alacritty
  - 長所: 高速、軽量
  - 短所: 設定の複雑さ

- WezTerm ✅
  - 長所: GPU活用、Lua設定、クロスプラットフォーム
  - 短所: 比較的新しいツール

### シェル環境選定

- Zsh ✅
  - POSIX互換
  - macOSデフォルト
  - 豊富なプラグイン
  - 広いエコシステム
- Fish:
  - 優れた補完機能
  - 設定の容易さ
  - POSIX非互換
  - 一部ツールの互換性問題

MacbookにおいてはmacOS Catalinaからzshが標準になっています。
補完などの補助機能の優秀さでfishが人気ではありますが、fishはPOSIX準拠ではありません。

bash, zsh, shはPOSIX準拠で共通した構文が使えますが、fishは構文が異なり、個別の設定が必要であったり一部のツールが使えないなどの問題があります。

そこで今回はzshのpluginやプロンプトを使ってfish同様の利便性を追い求めていきます。

### バージョン管理ツール

nvmやnodeenv、rubyenv、anyenvなどバージョン管理ツールは数多存在し、無ければ困るものでありながら管理が厄介で困るものでもあります。

一括管理系としてaqua、asdf、miseが有名ですので比較してみたいと思います。

<details><summary>一括管理ツールの比較</summary>

#### 1. aqua

aquaはCLIツールのバージョン管理に特化したツールです。

- 長所：
    - 高速なインストールと実行
    - GitHub Releasesからの直接インストールをサポート
    - YAMLベースの設定ファイルで管理が容易
- 短所：
    - プログラミング言語のバージョン管理には適していない
    - miseやasdfほど汎用的ではない

#### 2. asdf

asdfは広く使われている多言語バージョン管理ツールです。

- 長所：
    - 多くの言語やツールをサポート
    - 大きなコミュニティと豊富なプラグイン
    - 設定が簡単
- 短所：
    - シェルスクリプトで書かれているため、動作が遅い場合がある
    - メモリ使用量が比較的多い

#### 3. mise

miseは比較的新しいバージョン管理ツールで、asdfの後継として開発されています。

- 長所：
    - 高速な動作
    - Rustで書かれており、メモリ安全性が高い
    - asdfとの互換性がある
- 短所：
    - 比較的新しいため、コミュニティのサポートがまだ限定的
    - プラグインの数がasdfほど多くない

</details>

結果としてパフォーマンスを重視してmiseとしました。

## 手順

### brew install

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

Homebrewインストール後、以下のコマンドを実行してパッケージを更新します：

```bash
brew update && brew upgrade
```

これにより、Homebrewとインストールされたパッケージが最新の状態に更新されます。

https://brew.sh/

### brewでまとめてツール導入1（前提系）

```bash
brew install --cask google-chrome
brew install --cask karabiner-elements
brew install --cask mos
```

#### Chrome

1. Chromeを起動
1. 誘導にしたがって「デフォルトのWebブラウザ」でChromeを選択
    1. 誘導が出ない場合はシステム設定から以下のように設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215371/2f7cb876-496d-b2c5-c071-3924560a3890.png)

#### karabiner-elements

https://karabiner-elements.pqrs.org/

USキーボードを購入した方はkarabiner-elementsを利用して日本語入力に対応させる必要があります。

Karabiner-Elementsをインストールした後、以下の手順で設定を行います：

1. アプリケーションを起動
2. システム環境設定から「セキュリティとプライバシー」を開き、Karabiner-Elementsに必要な権限を付与
3. Karabiner-Elementsの設定画面で、キーボードのカスタマイズを行う

日本語入力の設定はこちらから

https://misclog.jp/karabiner-elements/

#### MOS

https://mos.caldis.me/

Macでタッチパッドやマウスの設定を細かく出来るユーティリティアプリです。
私はタッチパッドとマウスで上下方向を逆にしているのと、マウスの加速を上げるために使っています。

### brewでツール導入2（IME）

標準の日本語入力よりも最近の日本語に強いGoogle日本語入力を採用しました。

そのままだと動作しないのでrosettaを利用します。

```bash
sudo softwareupdate --install-rosetta
brew install --cask google-japanese-ime
```

### brewでまとめてツール導入3（開発系）

ここからは開発環境の設定をまとめます。
最終的にできあがった設定は以下を参照してください。

https://github.com/kbkn3/dotfiles

```bash
brew install --cask visual-studio-code
brew install --cask cursor
brew install --cask wezterm
brew install git
brew install mise
```

### wezterm ✕ zsh ✕ git

https://zenn.dev/monicle/articles/59ff479ae51c66

この記事に触発されて攻めた環境構築を始めました。
この記事ではneovimを使用していますが、私はVSCodeを使用しています。

上記記事をまるごと再現する形でweztermとstarshipの導入、zshの設定まで済ませました。

#### 端末ごとの設定の切り替え

XDG Configに準拠させているので、そのままdot-filesとしてgit管理を始めました。
`~/.config`をgit管理してしまえば、全てのLinux/Mac環境で統一した環境をすぐに用意できます。

以下のようにして端末ごとの個別設定を読み出せるようにしています。
```.zshrc
# （前略）

# 端末ごとの設定を読み込み
# ホスト名を取得
local host_name="$(hostname)"

# ローカル設定ファイルが存在する場合は読み込む
local_conf="${XDG_CONFIG_HOME:-$HOME/.config}/zsh/conf.d/hosts/local.zsh"
if [ -f "$local_conf" ]; then
  source "$local_conf"
fi
```

また、`.gitignore`はホワイトリスト方式を採用することで、ごちゃつきを防いでいます

その他設定の参考資料

https://qiita.com/alpaca-honke/items/2041012ff5a0291bf084

https://zenn.dev/ryuu/articles/customize-your-terminal

### starshipの設定

https://starship.rs/

starshipはシェルプロンプトです。
`macbookair@hogehoge %`の`%`部分がシェルプロンプトですが、ここに情報を加えることで現在の状態を見やすくすることができます。

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215371/2e025818-6ea2-c217-fc59-881c64e204ab.gif)

イケてるターミナルを作るならstarshipの設定を追い込むのが重要です。
[preset](https://starship.rs/presets/)から選ぶだけでもかなりイケてます。

ちなみに麻雀らしいデザインを生成AIに作らせたらこうなりました。
あまりに 🇮🇹 だったので却下しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215371/e0d20892-ae03-9308-dd6f-7da878a3ec4f.png)

### mise

全エンジニア待望、一つのツールで環境が管理できるツールです。

例えば、私のFlutterのプロジェクトでは

```toml
[tools]
flutter = "3.24.5-stable"
dart = "3.5.4"
xcodes = "1.6.0"
```

またbunを使っているTypeScriptのプロジェクトでは

```toml
[tools]
bun = "latest"
```

といった形で管理しています。

あとは環境構築ドキュメントに
```
1. miseの導入 
    a. https://mise.jdx.dev/getting-started.html
2. `mise install`
```
と書いておけば済むのです。

リポジトリごとに`mise.toml`を置いておけばディレクトリを切り替えるだけで高速でツールが切り替わるので大変便利です。

## まとめ

この環境構築により得られるメリット：

1. 統一的な環境管理
   - 複数マシンでの一貫性
   - バージョン管理の簡素化
2. パフォーマンスの向上
3. 保守性の向上
   - dotfilesによる設定管理
   - ツール間の整合性確保

以上の手順で、MacBook上に最新かつ効率的な開発環境が構築されます。
この環境は2024年末の最新トレンド詰め合わせとなっていますので、必ずしも安定しているとは言えませんが、快適なエンジニアライフを手助けしてくれると思います。