M1 Macが届いたので触ってみた

[PONOS Advent Calendar 2020](https://qiita.com/advent-calendar/2020/ponos) の16日目の記事です。
昨日は@lovericeさんの [Stateパターンを使ってみる](https://qiita.com/loveRice/items/6f458776f9a7c886280d) でした。

## はじめに

流行りのM1搭載MacBook Airを購入しました。🎁
メモリを増やしたりUSキーボードにしたら出荷が遅くなって、届いたのはつい数日前です。

ここまで試したり設定したことを書いておきます。

### 所感

予想よりも遥かにRosetta2が優秀です。
全然違和感なく使えてて凄い。

インストール済みのアプリだと、GitHub DesktopやDiscordあたりがIntel版バイナリだったんですが、今調べるまで気づかなかったくらいです。
特に、Discordはカメラとかマイクのハードウェアを使うのに、普通に使えてるの凄い。


## CPUアーキテクチャ周りのTips

### アプリごとのアーキテクチャ切り替え

アプリケーション情報で「種類」欄を見れば、どのタイプか分かります。
「Universal」は、Intel版もArm版も両方のバイナリを同梱しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/95b7d0a6-41b8-b833-d943-9530635a97ac.png)

(スクショでかいな・・・:sweat_smile:)
「Rosettaを使用して開く」にチェックを入れると、Intel版として動きます。
Intel版しかないアプリについては、このチェックボックスは出てきません。（暗黙的にRosettaを使用する。）



### アプリがどのアーキテクチャに対応しているか調べる

`lipo`コマンドで、アプリ内にどのアーキテクチャ用のバイナリが含まれているかを調べることができます。
参考: [ユニバーサルバイナリ再登板ということは「lipo」の出番かも](https://news.mynavi.jp/article/osxhack-268/)

```
$ lipo -info /usr/local/bin/fish
Architectures in the fat file: /usr/local/bin/fish are: x86_64 arm64

$ lipo -info /usr/bin/vim
Architectures in the fat file: /usr/bin/vim are: x86_64 arm64e

$ lipo -info /Applications/GitHub\ Desktop.app/Contents/MacOS/GitHub\ Desktop
Non-fat file: /Applications/GitHub Desktop.app/Contents/MacOS/GitHub Desktop is architecture: x86_64
```
上の例だと、GitHub DesktopはIntel版しか入ってないみたいですね。


### シェルが動いているアーキテクチャを調べる

`uname -m`もしくは'arch'をオプション無しで叩くことで調べられます。

``` sh
# Rosetta2(Intel)で動いているとき
$ uname -m
x86_64
$ arch
i386

# ネイティブ(ARM)で動いているとき
$ uname -m
arm64
$ arch
arm64
```

### アーキテクチャを切り替えて実行

archコマンドで、アーキテクチャを指定して実行できます。

```
$ arch -x86_64 bash
```

`man arch`を見てみると、指定できるのはIntel系のアーキテクチャだけみたいです。

> The arch_name argument must be one of the currently supported architectures:
      i386     32-bit intel
      x86_64   64-bit intel
      x86_64h  64-bit intel (haswell)

ので、ネイティブで実行しているシェルから、Intel版バイナリを使いたいときに使用できます。（逆は駄目。）



## fish

ログインシェルは[fish](https://fishshell.com/)を使っています。
fish自体も[M1 Mac対応](https://fishshell.com/apple-silicon.html)していて、特に違和感なく使えています。

### プロンプトにアーキテクチャを表示

当面の間はアーキテクチャを切り替え・意識して使うことが多そうなので、プロンプトに表示するようにしました。

[honeniq/shellder/fish_prompt.fish](https://github.com/honeniq/shellder/blob/master/fish_prompt.fish)

``` sh
function prompt_arch -d "Display current CPU architecture."
    switch (uname -m)
    case arm64
        prompt_segment white cyan "arm"
    case x86_64
        prompt_segment cyan white "x64"
    end
end
```
fishのテーマをちょっといじって、「arm」とか「x64」と表示するようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/2ca8025a-2d74-8ffa-c165-34acb10abf59.png)
かわいい。🐠


## Homebrew

パッケージマネージャとして[Homebrew](https://brew.sh/index_ja)を使っています。
公式サイトによると、[バージョン2.6.0](https://brew.sh/2020/12/01/homebrew-2.6.0/)からM1 Mac対応も始まっているようです。

> macOS Homebrew running natively on M1/Apple Silicon/ARM has partial functionality. We recommend installing into /opt/homebrew and forbid installing into /usr/local (to avoid clashing with the macOS Intel install and allow their usage side-by-side). We currently recommend running Homebrew using Intel emulation with Rosetta 2.

とはいえ、まだIntel版をRosetta2経由で使うことを推奨　との事。

ARM版を使う場合は、Intel版とかち合わないよう、Homebrewで管理するパッケージは /opt/homebrew に入れるのが推奨です。
（デフォルト設定だと、推奨通り /opt/homebrew にインストールされます。）

### Intel版を使うように強制

推奨通り、当面はIntel版だけを使うことにしました。
シェルがARMで動いているときもIntel版を使えるように、fish functionで`brew`コマンドをラップしてみました。

[honeniq/dotfiles/.config/fish/functions/brew.fish](https://github.com/honeniq/dotfiles/blob/master/.config/fish/functions/brew.fish)

``` sh
## wrap 'brew' command on M1 Mac
function brew
  if test (uname -s) = "Darwin"
    and test (uname -m) = "arm64"
    command arch -x86_64 brew $argv
  else
    command brew $argv
  end
end
```

問題なく動いてそう。
しばらくこの形で使ってみます。

------

明日は @nisei275 さんです！