Mac用 Nix、nix-darwin、home-manager セットアップ完全手順 (2024年6月改訂版)

## 前提条件
- ARM系チップ搭載のMac
- macOS Sonoma (14.0) 以上

## 1. Nixのインストール

1. ターミナルを開き、以下のコマンドを実行:

```bash
sh <(curl -L https://nixos.org/nix/install)
```

2. インストール完了後、新しいターミナルを開くか、以下のコマンドで環境を更新:

```bash
source /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
```

3. Nixのインストールを確認:

```bash
nix --version
```

## 2. 環境変数の設定

以下のコマンドで必要な環境変数を設定します：

```bash
export DARWIN_USER=$(whoami)
export DARWIN_HOST=$(hostname -s)
```

これらの環境変数を永続化するには、`.zshrc`や`.bash_profile`に追加することをおすすめします。

## 3. Flakes機能の有効化

Nix設定ファイルを作成または編集:

```bash
mkdir -p ~/.config/nix
echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf
```

## 4. プロジェクトの設定

1. プロジェクトディレクトリを作成:

```bash
mkdir ~/nixconfig
cd ~/nixconfig
```

2. `flake.nix`ファイルを作成:

```nix
{
  description = "Darwin system flake";
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    nix-darwin = {
      url = "github:LnL7/nix-darwin";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };
  outputs = { self, nixpkgs, nix-darwin, home-manager }: 
    let
      darwinUser = builtins.getEnv "DARWIN_USER";
      darwinHost = builtins.getEnv "DARWIN_HOST";
      
      mkDarwinSystem = { hostname, username }: nix-darwin.lib.darwinSystem {
        system = "aarch64-darwin";
        modules = [
          ./configuration.nix
          home-manager.darwinModules.home-manager
          {
            networking.hostName = hostname;
            users.users.${username}.home = "/Users/${username}";
            home-manager.useGlobalPkgs = true;
            home-manager.useUserPackages = true;
            home-manager.users.${username} = { pkgs, lib, ... }: 
              import ./home.nix { inherit pkgs lib username; };
          }
        ];
        specialArgs = { 
          inherit (nixpkgs) lib; 
          inherit username; 
        };
      };
    in {
      darwinConfigurations.${darwinHost} = mkDarwinSystem {
        hostname = darwinHost;
        username = darwinUser;
      };
    };
}
```

3. `configuration.nix`ファイルを作成:

```nix
{ pkgs, ... }:
{
  # システムにインストールするパッケージ
  environment.systemPackages = with pkgs; [
    vim
    git
  ];

  # Nixデーモンの自動アップグレードを有効化
  services.nix-daemon.enable = true;
  nix.package = pkgs.nix;

  # zshの設定
  programs.zsh.enable = true;

  # 非自由パッケージを許可
  nixpkgs.config.allowUnfree = true;

  # Finder設定
  system.defaults.finder = {
    # 全てのファイル拡張子を表示: trueにすると、すべてのファイルの拡張子が表示されます。
    # ファイルタイプを一目で確認できるため、ファイル管理が容易になります。
    AppleShowAllExtensions = true;

    # 隠しファイルを表示: trueにすると、通常は非表示のファイル（.で始まるファイル）も表示されます。
    # 開発作業や詳細な設定を行う際に便利ですが、通常使用では不要なファイルも表示されるため注意が必要です。
    AppleShowAllFiles = true;

    # デスクトップアイコンの非表示: falseにすると、デスクトップ上のアイコンが非表示になります。
    # クリーンな作業環境を好む場合や、デスクトップの整理を強制する場合に有用です。
    CreateDesktop = false;

    # 拡張子変更時の警告を無効化: falseにすると、ファイル拡張子を変更する際の警告が表示されなくなります。
    # 頻繁にファイル拡張子を変更する作業を行う場合、作業効率が向上します。
    FXEnableExtensionChangeWarning = false;

    # パスバーを表示: trueにすると、Finderウィンドウの下部にファイルパスが表示されます。
    # 現在の位置を把握しやすくなり、ディレクトリ間の移動が容易になります。
    ShowPathbar = true;

    # ステータスバーを表示: trueにすると、Finderウィンドウの下部に選択したアイテムの情報が表示されます。
    # ファイル数や容量などの情報を素早く確認できるため、ファイル管理に役立ちます。
    ShowStatusBar = true;
  };

  # Dock設定
  system.defaults.dock = {
    # Dockの自動非表示: trueの場合、Dockを自動で隠します。
    # これを有効にすると画面を広く使えるため、作業スペースが拡大します。
    autohide = true;

    # 最近使用したアプリケーションの非表示: falseにすると、Dockに最近のアプリが表示されなくなります。
    # プライバシーを重視する場合や、Dockをシンプルに保ちたい場合に有用です。
    show-recents = false;

    # Dockアイコンのサイズ: ピクセル単位でアイコンサイズを設定します。
    # 50pxは中程度のサイズで、見やすさと省スペースのバランスが取れています。
    tilesize = 50;

    # Dockアイコンの拡大機能: trueにすると、マウスオーバー時にアイコンが拡大表示されます。
    # アイコンの識別が容易になり、特に多くのアプリがDockにある場合に便利です。
    magnification = true;

    # 拡大時のアイコンサイズ: マウスオーバー時のアイコンサイズをピクセル単位で設定します。
    # 64pxは適度な拡大サイズで、アイコンの詳細が見やすくなります。
    largesize = 64;

    # Dockの位置: "bottom"、"left"、"right"のいずれかを指定できます。
    # 画面下部に配置すると、一般的なmacOSの外観に近くなります。
    orientation = "bottom";

    # ウィンドウ最小化エフェクト: "scale"は縮小エフェクトを使用します。
    # このエフェクトは視覚的に分かりやすく、システムの応答が速く感じられます。
    mineffect = "scale";

    # アプリケーション起動時のアニメーションを無効化: falseにすると、起動アニメーションが表示されなくなります。
    # システムの応答が速く感じられ、特に低スペックのマシンで有用です。
    launchanim = false;
  };

  # 下位互換性のため（変更時はchangelogを確認）
  system.stateVersion = 4;

  # ターゲットプラットフォーム
  nixpkgs.hostPlatform = "aarch64-darwin";
}
```

4. `home.nix`ファイルを作成:

```nix
{ pkgs, lib, username, ... }:

{
  home.packages = with pkgs; [
    ripgrep
    fd
    jq
  ];

  # ユーザー情報
  home.username = username;
  # lib.mkForceを使用しているのは、nix-darwinの既知のバグ（Issue #682）に対処するためです。
  # https://github.com/LnL7/nix-darwin/issues/682
  # このバグが修正されたら、単に "/Users/${username}" と設定できるようになる可能性があります。
  home.homeDirectory = lib.mkForce "/Users/${username}";

  # home-managerのバージョン（変更時は注意）
  home.stateVersion = "23.05";

  # home-managerの有効化
  programs.home-manager.enable = true;
}
```

## 5. システムの構築と適用

以下のコマンドでシステムを構築し適用します。`--impure`フラグを使用することで、環境変数を正しく読み取ることができます：

```bash
darwin-rebuild switch --flake . --impure
```

注意: `--impure`フラグは、ビルド中に環境変数にアクセスすることを許可します。これにより、`DARWIN_USER`や`DARWIN_HOST`などの環境変数を正しく読み取ることができます。

## 6. 確認

以下のコマンドで、パッケージが正しくインストールされたか確認:

```bash
which git
which vim
which fd
which rg
which jq
```

## 設定の更新と管理

- 設定変更後は、必ず`darwin-rebuild switch --flake . --impure`を実行して変更を適用してください。
- システムとパッケージの更新は以下のコマンドで行います：

```bash
nix flake update
darwin-rebuild switch --flake . --impure
```

- nix-darwinやhome-managerのアップデートの際は、各プロジェクトの変更ログを確認し、必要に応じて設定を調整してください。
- 定期的に設定ファイル（特に`configuration.nix`）内のコメントを確認し、記載されている設定の説明を参考に、必要に応じて設定をカスタマイズしてください。

## トラブルシューティング

設定適用時にエラーが発生した場合は、以下の手順を試してください：

1. 環境変数が正しく設定されているか確認します：
   ```bash
   echo $DARWIN_USER
   echo $DARWIN_HOST
   ```

2. Nixのキャッシュをクリアします：
   ```bash
   nix store gc
   ```

3. フラグを追加してビルドを再試行します：
   ```bash
   darwin-rebuild switch --flake . --impure --show-trace --verbose
   ```

4. 問題が解決しない場合は、エラーメッセージを注意深く読み、関連する設定ファイル（`flake.nix`, `configuration.nix`, `home.nix`）を確認します。

5. 最新のnix-darwinやhome-managerのドキュメントを参照し、設定方法に変更がないか確認します。

この手順で、M1 MacにNix、nix-darwin、home-managerの環境が整います。FinderとDockの設定に焦点を当てていますが、必要に応じて他の設定もカスタマイズできます。`--impure`フラグの使用により、環境変数を適切に扱うことができ、より柔軟な設定が可能になります。