MacBookPro2015から2018への移行とパフォーマンス比較

MacBookPro2015を3年弱ほど使っていましたが、この度MacBookPro2018を手に入れることができたので、その際の移行作業を書きます。

それだけでは寂しいので、ちょっとしたパフォーマンス比較もやってみました。

## 移行前後のハードスペック紹介

### 移行前

- MacBook Pro (Retina, 13-inch, Early 2015)

|パーツ|型番|
|:--|:--|
|CPU| Intel Core i7-5557U @ 3.1 GHz (2 cores)|
|メモリ| 16 GB 1867 MHz DDR3|
|グラフィック| Intel Iris Graphics 6100 1536MB|
|ディスク| APPLE SSD SM0512G (500GB)|

### 移行後

- MacBook Pro (13-inch, 2018, Four Thunderbolt 3 Ports)

|パーツ|型番|
|:--|:--|
|CPU| Intel Core i7-8559U @ 2.7 GHz (4 cores) |
|メモリ| 16 GB 2133 MHz LPDDR3 |
|グラフィック| Intel Iris Plus Graphics 655 1536 MB |
|ディスク| APPLE SSD AP0512M (500GB) |

## 前提条件

- 綺麗な環境で作り直したいので移行アシスタントは使いません
- 基本的に以前の環境をそのまま移行したいので、ディレクトリ構造は同じになるようにします。そのため、ユーザー名は移行前と同じにします。

## アプリケーションの移行

基本的にHomebrewで管理しています。Homebrewにない場合のみAppStoreや公式サイトからダウンロードして直接インストールしています。

### Homebrew

1. 移行前のインストール済みアプリケーションのリスト作成

    移行前の環境で以下のコマンドを実行し、Homebrewのダンプファイル(Brewfile)を作成します

    ```bash
    $ brew bundle dump
    ```

2. 移行先にHomebrewをインストール
[Homebrew(公式サイト)](https://brew.sh/index_ja)を参照

3. 移行先にアプリケーションを一括インストール
移行元で作成した`Brewfile`を移行先にコピーし、Homebrewに読み込ませて一括インストールします

```bash
$ brew bundle # Brewfileを配置したディレクトリで実行
```

**注意**

移行元にインストールした時には存在したが、もう存在しないものがあるかもしれないので、エラーが発生したら個別対応します。

ちなみに、私の場合は以下のエラーが発生しました。

- `Tapping homebrew/versions has failed!`
  - homebrew/coreに統合されたため不要となりました。Brewfileから`tap "homebrew/versions"`を削除しました。 [Homebrew(Versions)](https://docs.brew.sh/Versions)
- `Installing firefox-ja has failed!`, `Installing thunderbird-ja has failed!`
  - 日本語版が別パッケージになっていたがパッケージは一つになり、システムの言語設定を見るようになったらしいです。Brewfileの`cask "firefox-ja"`,`cask "thunderbird-ja"`を`cask "firefox"`,`cask "thunderbir"`に変更しました。

### Homebrew以外

AppStore, 個別サイトから一つずつインストールしました。

## 設定の移行

基本的にファイル、ディレクトリをそのまま移行します。

### シェル

- ~/.bash_homebrew
- ~/.bash_profile
- ~/.bashrc

### ssh(鍵も含む)

- ~/.ssh

### git

- ~/.git-completion.bash
- ~/.git-prompt.sh
- ~/.gitconfig
- ~/.gitignore_global

### vim

- ~/.vimrc

### Karabiner-Elements

- ~/.config/karabiner

#### 追記(2018/09/12)

Karabiner-Elements実行中にIntellijIDEAで`Command+F12`のようなファンクションキーありのショートカットを使おうとしてもうまく動かない状況がありました。具体的には、TouchBarにファンクションキーを表示させるために`fn`キーを使い、`fn+Command+F12`と押しても`F12`と認識される状況です(IntellijIDEAのPreferences-Keymap-Find Shortcutで確認)。これをちゃんと動くようにするためには、Karabiner-ElementsのDevices設定で以下の赤枠にチェックを入れる必要がありました。

<img width="379" alt="karabiner-elements-preference.png" src="https://qiita-image-store.s3.amazonaws.com/0/140617/5f5923fa-70bf-2a6e-ff81-5172f7823e7d.png">

[Karabiner-Elements Issues(#535)](https://github.com/tekezo/Karabiner-Elements/issues/535#issuecomment-350522019)

### iTerm2

iTerm2の設定をファイルに書き出すように設定しておき、そのファイルを移行します。(`Preferences`-`General`-`Preferences`の`load preferences from a custom folder or URL`にチェックを入れてディレクトリを指定)

### IntellijIDEA

IntellijIDEAの`ファイル`-`設定のエクスポート（インポート）`

## データの移行

### OneDrive

ほとんどのデータはOneDriveに同期していたので、OneDrive.appをインストールし、移行前と同じディレクトリパスを同期させるように設定すれば勝手に移行されました。

### Thunderbird

1. 移行元の`~/Library/Thunderbird/profiles.ini`にプロファイルのパスが書かれているのでそのディレクトリを移行先の同じディレクトリパスにコピーします
2. 移行先でThunderbird.appをインストールし、一度起動します
3. 新しいアカウントは作成せず終了します
4. 移行先の`~/Library/Thunderbird/profiles.ini`にプロファイルのパスが書かれているのでそれを移行元と同じになるように変更します

```ini:profile.ini(一部抜粋)
;Pathを絶対パスにする場合、IsRelativeは0にする
IsRelative=0
Path=/Users/hoge/path/to/thunderbird/Profiles/xxxxxx.yyyyyy
```    

### ParallelsDesktop

1. 移行前に全てのクライアントはシャットダウンしておきます（サスペンドではありません）
2. `~/Documents/Parallels`をそのまま移行します（移行先も同じディレクトリパスとなるようにします）

### Safariブックマーク、キーチェーンなどのiCloud関係

iCloudでの同期設定をしていれば、特に何もせず同期されました

## データ移行でハマったこと

- USBメモリを使って移行する場合
  - ファイルをそのままコピーするとファイルのパーミッションが変わってしまうのでzipなどに固めておいたほうがいいです。私は作業中のGitリポジトリをそのまま移行したらパーミッションが変わってしまい大量に更新扱いになってしまいました(もちろんやり直しました。。。）

    ```bash
    $ zip -r /Volumes/USBMEM/hoge hoge
    ```

  - 一つのファイルにするので4GB以上のファイルを扱えるように、USBメモリのフォーマットを`exFAT`にしないといけませんでした
- Macのファイル共有を使いネットワーク経由で移行する場合
  - cpコマンドだと大量のファイルをコピーするとどんどん遅くなっていったのと、途中で失敗した際の再開が面倒だったので`rsync`を使うようにしました

    ```bash
    $ rsync -avhP hoge /Volumes/移行先PC/
    ```

## パフォーマンス比較

移行方法を書いただけでは味気ないので実際に行ったパフォーマンス比較の結果も書いておきます。


### 1. CPUベンチマーク

[Geekbench4](https://www.geekbench.com/)を使ったベンチマークです。

|項目|結果(移行前)|結果(移行後)|差|
|:--|:--|:--|:--|:--|
|Single-Core Score|4107|5435|1.3倍|
|Multi-Core Score|7930.5|18639|2.6倍|

### 2. Diskベンチマーク

[Blackmagic Disk Speed Test](https://itunes.apple.com/jp/app/blackmagic-disk-speed-test/id425264550)を使ったベンチマークです。

|項目|結果(移行前)|結果(移行後)|差|
|:--|:--|:--|:--|:--|
|Read|1127.5MB/s|2566.78MB/s|2.3倍|
|Write|439.36MB/s|1667.38MB/s|3.8倍|

### 3. Docker for Mac上のPostgreSQLのpgbench

Docker for Mac上のPostgreSQL10のコンテナ(公式)のpgbenchです。

```bash
$ pgbench -U postgres -c 10 -t 1000 test
```

|項目|結果(移行前)|結果(移行後)|差|
|:--|:--|:--|:--|:--|
|tps|1109|1833|1.66倍|


### 4. 実作業によるパフォーマンス比較

ベンチマークだけだと実際にどのくらいかわかりにくいかなと思ったので、実際に私がやってるWebアプリの開発作業の処理時間を比較してみました。

#### 4-1. ビルド

JavaのWebアプリケーションのビルド時間です。約10000クラスのコンパイル、150MBのwarファイルの作成などを行います。

|項目|結果(移行前)|結果(移行後)|差|
|:--|:--|:--|:--|:--|
|ビルド|2分40秒|1分10秒|0.46倍|

#### 4-2. サーバー起動

アプリケーションサーバー(Tomcat)を起動し、Webアプリケーションが利用可能になるまでの時間です。

|項目|結果(移行前)|結果(移行後)|差|
|:--|:--|:--|:--|:--|
|サーバー再起動|1分29秒|31秒|0.35倍|


## 最後に

3年も違うから速くなるだろうなぁとは思っていましたが、実際にMacBookPro2018を使ってみると思った以上にサクサク動いて快適でした。仕事の関係上Windowsが必要で仮想環境で動かしていますが、MacBookPro2015だと動きがもっさりしていてイライラすることも多々ありましたが、MacBookPro2018ではキビキビ動いて実機で動かしてるのと変わらないんじゃないかと思ってしまうくらいで感動しました。やっぱりハードは新しくしないとダメですね。

ただ1点問題があるとすれば、やはりTouchBarですね。まだまだ慣れません。ファンクションキーを常に表示するようにもできますが、なんか負けた気がするのでしばらくはTouchBarとちゃんと付き合っていこうと思います