Macの初期化→リストアを良い感じにする

`Brewfile`、`Mackup`、`Docker`、`Dropbox`を使って良い感じにリストアできる環境を作ったので、まとめます。

以下の記事をめちゃくちゃ参考にしました。
[macOSでの開発環境を全部Docker化したらリストア時間が1時間半になった](https://saboyutaka.hatenablog.com/entry/2018/08/23/023925)

## 使用する主なツール
- Brewfile
    - 必要なアプリをファイルに列挙して、コマンド一発で全部インストールできる。コマンドラインで使うツール、インストーラーを使ってインストールするアプリ、AppStoreからインストールするアプリ、全てコマンド1つ。最高。（[Brewfileを使う](https://qiita.com/d0ne1s/items/90974ad472c2d891e784)）
- Mackup
    - アプリなどの設定ファイルを抽出して、元々設定ファイルがあった場所にシンボリックリンクを貼ってくれる。（[設定ファイルをmackupで管理する](https://qiita.com/d0ne1s/items/8dec6a8f614802d310a2)）
- Dropbox
    - 重要なファイルやBrewfile、Mackupで抽出した設定ファイルを保存。ソースコードもここで保存する(当初はGitHubだけで良いと考えたけど、Git管理対象外のファイルもあるので）
- GoogleDrive
    - クラウド上のゴミ箱として。必要ないけど削除するのは嫌なファイルを保存
- Docker
    - 開発環境をDockerで作り、ローカルの言語やツールに依存しない状態を保つ
- Bitwarden
    - パスワードマネージャー



## 初期化(Total 1h)
### バックアップ
- 大切なファイルをDropboxに
- 大切ではないけど消すのは嫌なファイルをGoogleDriveに
- アプリの設定ファイルを`Mackup`でバックアップ
- 開発環境を全部Dockerで作っておく
    - ローカルに入ってる言語とかを使わない
- DBの接続情報（特にパスワード）をBitwardenにメモ
- 個別のバックアップ機能を持っているアプリの対応
    - Biscuitの設定をエクスポートしてDropboxに保存
    - Transmitの接続情報をエクスポートしてDropboxに保存(お気に入り→書き出し)。パスワードはBitwardenのメモで管理。

### 最新のOSにアップデート(30m)
念のため先にアップデート。
データ消去の後に何かのコマンドを押してると勝手に最新OSが入るみたいですが、押し忘れたりしたらしんどいので。

「りんごマーク」>「このMacについて」>「ソフトウェア・アップデート」

### リカバリーモードでmacを起動
シャットダウン → `コマンド + R`を押しながら起動

### データを完全削除
「macOSユーティリティ」→「ディスクユーティリティ」→「内蔵」→「Macintosh HD – Data」→「ボリューム>マイナスマーク」→「削除」→「Macintosh HD」→「削除」→「プラスマーク」→「Macintosh HDなどの名前で新規ボリュームを作成」

[[完全版]macOS Catalinaをクリーンインストールする方法](https://qiita.com/PaSeRi/items/59e9785580dbd518ac93)

### OSを再インストール(25m)
「macOSユーティリティ」→「macOSを再インストール」 

## リストア(Total 1.5h)
### システム設定を変える
システム環境をいじくって、トラックパッドやキーボードなどの設定を自分好みに変更します。
[Macのシステム設定まとめ](https://qiita.com/d0ne1s/items/133480e87af2da88752d)

### Bitwardenをインストール
AppStoreから。パスワードがわからないと何も始まらないので

### Chromeをインストール
グッバイSafari。Googleアカウントにログイン→同期して、ブックマークや拡張機能を復活させましょう。

### Dropboxをインストール
これでいろいろと復元できます。
インストールしたらすぐに環境設定を開き、
- Brewfile
- Mackupディレクトリ

以外を同期しないようにします。その他のディレクトリは一通り設定が終わったあとで一気に同期しましょう。
※PCの容量に困らない限り、スマートシンクは設定しない。
　
### Homebrewをインストール
```terminal
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

### Finderのサイドバーに表示する項目を整理する
- Dropbox
- ダウンロード
- ホームディレクトリ
- スクリーンショット
- iCloud Drive
- Macintosh HD

あたりを表示

### その他アプリを一括でインストール
```terminal
$ cd ~/Dropbox
$ brew bundle
```
<details><summary>Brewfile</summary><div>

```rb
cask_args appdir: "/Applications"
brew 'git'
tap 'heroku/brew'
brew 'heroku'
brew 'mackup'
brew 'mas'
brew 'nodenv'
brew 'rbenv'
brew 'ruby-build'

cask 'adobe-creative-cloud'
cask 'alfred'
cask 'biscuit'
cask 'docker'
cask 'tableplus'
cask 'transmit'
cask 'visual-studio-code'

# cask 'dropbox'
# cask 'google-chrome'
# cask 'karabiner-elements'

mas 'Kindle', id: 405399194
mas 'LINE', id: 539883307
mas 'Magnet', id: 441258766

# mas 'Bitwarden', id: 1352778147
```

</div></details>

Dropboxに保存してある`Brewfile`を元に必要なアプリを全て揃えます。

### 設定ファイルを復元
(2023/10/15追記)
mackupでエラーが出ました。
https://github.com/lra/mackup/pull/1949
このPRが取り込まれるまでは動かなそうなので、自分でScriptを組むことにしました。

```sh:setup-dotfiles.sh

```
```zsh:
$ ~/Dropbox/setup-dotfiles.sh
```
<details><summary>mackup使ってた時代のやり方(クリックで表示)</summary><div>

```terminal
$ cd ~/Dropbox
$ mackup restore
```
これでほぼ全てのアプリの設定が復元されます。`.vimrc`とか`.zshrc`とかも。
vscodeの拡張機能はデフォルトではサポートされていませんが、独自に定義して管理できるようにしています。

```~/.mackup/vsex.cfg
[application]
name = vsex

[configuration_files]
.vscode/extensions
```
</div></details>

### Dockを整理
- 不要なアプリを削除
- 必要なアプリを追加
- アイコンのサイズを小さめに
- 「Dock環境設定」>「Dockを自動的に表示/非表示」

### Dropboxの残りのファイルを同期
このあたりで、先ほど行った同期するディレクトリを制限する設定を解除しちゃいましょう。

### デフォルトのアプリを設定
`html`, `css`, `js`, `html.erb`, `csv`, `txt`, `Dockerfile`等を開くデフォルトのアプリをVSCodeに設定します。

```zsh
$ touch hoge.html hoge.css hoge.js hoge.html.erb hoge.csv hoge.txt
```

「Finder」>「ファイルを右クリック」>「情報をみる」>「このアプリケーションで開く」>「全てを変更」

### 各種アプリの動作確認
アプリがちゃんと動くか確かめます。
Mackupで設定を管理できないアプリもあるので、その場合は個別に設定をしましょう。

#### Adobe Creative Cloud
起動→ログインして
イラレとXDをインストール

#### Alfred
- Ctrlのダブルタップで起動できるように
- 検索バーの帽子マークを非表示（appearances>options>how he looks）
- 検索バーのショートカットを非表示（appearances>options>how he looks）
- メニューバーの帽子マークを非表示（appearances>options>how he looks）
- 出現場所をやや下に（appearance>options>図から変更）
- 起動時に入力モードを半角英数にする（appearances>options>Focusing>Compatibility mode
→advanced > force key board > abc）
- PowerpackメニューからPowerpackを有効化
- クリップボードの履歴を記録（features>clipbord history>keep plain text）
- clipboard履歴の初回利用時、アクセシビリティの設定変更を要求されるので従う

最初は同期の機能を使おうと思いましたが、うまく連携ができなくてやめました。大した設定していないので、手動でやります。

#### Biscuit
最初にエクスポートしておいた設定ファイルをインポート。

#### Docker for Mac
システムに実行の許可を出す。

#### GoogleChrome
常に表示する必要の無い拡張機能を隠す。Bitwardenをダークテーマに。

#### LINE
ログイン

#### Magnet
アクセシビリティ周りの設定。ログイン時に起動する設定。

#### TablePlus
接続先のパスワードはMackupで管理されていないよう。手動でパスワードを再入力する必要あり。

#### Todoist
Googleアカウントでログイン

#### Transmit
Mackupでは接続先の情報を管理できない。予め書き出して置いた移行用のファイルを実行。
また、こちらもパスワードは引き継がれないのでメモから復元

「お気に入り」>「読み込み」>「Transmit」

#### VScode
サイドバーからデバッグのマークを消す&並び替え

#### Orbstack
Brewfileでうまくインストールできなかったので、手動で

#### ZOOM
Brewfileでインストールするとエラーが発生するので、ブラウザから手動でインストール

### よく使うサイトにログイン
- Amazon
- GitHub
- Pocket
- Qiita
- Twitter
- はてな
- note

### sshキーのパーミッションを変更
```zsh
$ cd ~/Dropbox/Mackup
$ chmod 700 .ssh
$ cd .ssh
$ chmod 600 dir_name/id_rsa # 秘密鍵の数だけ繰り返す
```

### node.jsの設定
Dropboxに保存してあるnodenvの設定ファイル郡にシンボリックリンクを貼ります。

```zsh
$ rm -rf ~/.nodenv
$ ln -sf ~/Dropbox/settings/.nodenv ~/.nodenv
```
nodenvを使ってnode.jsをインストールします。

```zsh
$ nodenv install --list # インストールできるバージョンを確認
$ nodenv install 14.5.0 # 最新バージョンをインストール
$ nodenv rehash
$ nodenv global 14.5.0 # インストールしたバージョンをデフォルトに設定
$ nodenv versions # 利用できるバージョン一覧
```

### node modulesのインストール
```zsh
$ npm install -g yarn
$ yarn -v
$ npm install -g gatsby-cli
$ gatsby -v
```

### 開発環境のコンテナを作成
各プロジェクトのルートディレクトリに移動し

```terminal
$ docker-compose build
$ docker-compose up -d
```
```:RubyonRailsの場合
$ docker-compose exec <サービス名> /bin/bash
$ rails db:create
$ rails db:migrate
$ rails db:seed
```
[Railsアプリをcloneした後にDocker上で動かすまで](https://qiita.com/d0ne1s/items/23239c17ad2735728999)

### 運用中のサービスの開発環境のデータをローカルに反映
TablePlusでデータをCSVでダウンロードして、ローカルのDBにアップロード

## 日常的に気を付けること
- アプリのインストールはBrewfileを使う
- アプリを追加した時には、そのアプリの設定の管理方法を考える（Mackupで管理できないなら個別にバックアップ）
- 大切なファイルはDropboxで管理
- DBの接続先が増えた時、Bitwardenに記録
- FTPの接続先が増えた時、TransmitのバックアップをDropboxに保存+パスワードをBitwardenにメモ
- Biscuitで管理するアプリが増えたら、設定をエクスポートしてDropboxに保存

このあたりを意識していれば、いつPCがぶっ壊れても(データ的には)割と大丈夫。
そんなに大変じゃないはず。

## 注意点、ハマったところ
Mack up、すごく便利なのですが、最初は何がバックアップできていて何ができていないかがよくわからず苦労しました。
vscodeの拡張機能、preztoのプログラム本体、FTPやDBのパスワードなどはデフォルトではバックアップされません。
自分で設定をカスタマイズすることで、パスワード以外はバックアップすることができました。

めんどくさがらずに公式の[公式のドキュメント](https://github.com/lra/mackup/tree/master/doc)を読むとかなり理解が進みます。
英語ですがすごくわかりやすく説明されているので、ぜひ読んでみてください。

あと、スピードを追求する場合はDiskMaker Xとかで起動ディスクを作るともっと時間を短縮できるみたいです。

## 感想
`Brewfile`と`Mack up`がやばい。また`Docker`のありがたみも強く実感しました。
この環境を2018年に完成させていた@saboyutaka さんはまじでイケてると思う。

## 参考
- [macOSでの開発環境を全部Docker化したらリストア時間が1時間半になった](https://saboyutaka.hatenablog.com/entry/2018/08/23/023925)
- [lra/mackup](https://github.com/lra/mackup/tree/master/doc)