# Macの初期設定をなるべく自動化するためにしたこと

# Macの故障

先日仕事で使用していたMabBookPro 15inch(2018)の電源がつかなくなってしまい、Apple修理センターにドナドナされていった。 修理に出す前に行った対処は下記のページを参考に。

Macの電源が入らない場合
MacのSMCをリセットする方法
MacでNVRAMまたはPRAMをリセットする

どれをやってもだめだったので、サポートに連絡し、集荷手続きをお願いした。 症状からするにロジックボードの交換になるだろう旨と、ストレージが暗号化されていない場合、データが全部初期化されることなどを説明された。
この時点で見積もり金額は税込みで¥96,000ほどで、故障箇所によってはもっと金額が上乗せされることも説明してもらった。

# 返ってきたMac

Apple似修理を出すと、診断内容が書かれた書類がAppleのクリアファイルに入れられて同梱されてくる。このクリアファイルをもらったのはThunderbolt Displayを修理に出したとき以来だ。

今回の修理内容は下記の通り。

  • ロジックボード(ソリッドステートドライブ一体型)、Touch IDの交換をして、OSを再インストール
  • トップケース(キーボード、バッテリー一体型)の交換

OSは初期状態になり、キーボード周りも新品になって返ってきた。 Time Machineで復元すればいいやと軽い気持ちで考えていたが、Time Machine から復元することができなかった。 数回繰り返してみたが、なんどやっても、画面に「?」が浮かぶばかりでOSを起動することができなかった。

真っさらなOSになったのと、9連休前にMacが戻ってきたことも重なり、せっかくなので一からセットアップしていくことにした。

# dotfilesリポジトリの作成をする

一からセットアップしていくとはいえ、必要なアプリをダウンロードして、ボタンをポチポチして...という作業をし続けるのは骨が折れるのでなるべく自動化することにした。 幸いにも昔使っていたMabBookPro 13inch(2015)が手元にあり、こちらの端末もちょくちょくメンテナンスをしていたので、こちらの端末を使って準備をすすめることにした。

今回は、dotfilesというリポジトリを作成し、これをgithubなどで管理する。新しい端末にgitを入れて(MacならCommand line tools for Xcodeを入れればついてくる)該当リポジトリをダウンロードし、

シェルを実行すれば、必要なアプリなどがインストールされている状態を目指す。必要なアプリの選定については、それぞれ違うと思うので、各々で追加・削除していってもらいたい。

自分の場合はユーザホームディレクトリ直下に配置した。~/dotfiles
このあたりは好きな場所で問題ないのでパスは読み替えていただければと。

$ mkdir -p ~/dotfiles
$ git init

で、ディレクトリ構造は下記の通り

.
├── .editorconfig
├── .gitignore
├── .vimrc
├── .zshrc
├── README.md
├── bin
│   └── setup.sh # 今回メインとなるファイルで各種インストールの自動化ファイル
└── utils # 便利系のシェルを入れておく
    

見て分かる通り、.vimrc.zshrcの設定も管理している。こうしておけば新しい環境でもすぐに前の環境と同じように作業ができるようになる。

# setup.shの作成

homebrewを使いたいので、最初にCommand Line Tools for Xcodeをダウンロードしておく。

# Command Line Tools for Xcodeをインストール

$ xcode-select --install

# homebrewをインストール

homebrew 参照

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

# mas-cliをインストール

mas-cliは、AppStoreの操作を、CUIでできるようにするためのするためのもの。 mas-cli

$ brew install mas

インストールが終わったら、mas listを実行すると、AppStoreからダウンロードしているアプリのIDと名前が出力されるので、IDを控えておく。

$ mas list

XXXXXXXXX Xcode(11.6)
XXXXXXXXX Pages(10.1)
XXXXXXXXX Dispaly Menu (2.2.3)
~~~

XXXXXXXXX部分がID。

方針としては、

1.brew caskでインストールできるものに関しては、brew caskを使ってインストールする。
2. brew caskにないものはmasでインストールする。
3. それ以外は手動でインストールする。

注意点として、brew caskmasでインストールしても、GUIでアップデートや、アップグレードしてしまうとbrew caskmasの管理から外れてしまうので アップデートや、アップグレードもbrew caskmasコマンドを使う。

dotfiles/bin/setup.shを下記のように記述する。

#!bin/bash

# homebrewがinstallされていなかったら、homebrewをinstall
if [ ! -e /usr/local/bin/brew ]; then
  /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
else
  printf '\033[33m%s\033[m\n' 'homebrew is already installed'
fi

brew install mas # AppStoreの操作をCUIでできるようにする
brew install curl
brew instal wget
brew install git # Appleのgitではなく、最新版のgitを使いたいので
brew install nodebrew # Node.jsのバージョン管理したいので
brew install python # pythonも最新版を
brew install tree # ディレクトリ構造をターミナルで表示する
brew install hub # github command line tools
brew install gibo # gitignoreの作成をCUIで
brew install vim # 世界最強のエディタ
brew install cocoapods # FlutterやiOSアプリの開発しないならいらない

brew tap homebrew/cask-fonts # FireCodeのinstallに必要

brew cask install adobe-creative-cloud # インストーラをダウンロードするだけなので、手動で実行して
brew cask install appcleaner # Appの関連ファイルまで削除してくれる
brew cask install bettertouchtool # トラックパッドやマジックマウスの機能拡張
brew cask install clipy # クリップボードの機能拡張
brew cask install docker
brew cask install docker-toolbox
brew cask install font-fira-code # コーディング用フォント
brew cask install firefox
brew cask install font-ricty-diminished # コーディング用フォント
brew cask install github
brew cask install google-chrome
brew cask install google-japanese-ime # Google日本語入力
brew cask install google-web-designer
brew cask install grandperspective # ファイル容量の可視化
brew cask install imageoptim # 画像圧縮
brew cask install intellij-idea # 統合開発環境
brew cask install macwinzipper # windowsとやりとりするときに便利な圧縮ツール
brew cask install mongodb-compass # mongoDB用GUI
brew cask install mysqlworkbench
brew cask install notion
brew cask install onyx
brew cask install postman # APIのデバッグに
brew cask install sequel-pro # mySQL接続用
brew cask install slack
brew cask install skype
brew cask install sourcetree
brew cask install vagrant
brew cask install virtualbox
brew cask install visual-studio-code # エディタ

# IDだけだとわからなくなりそうなので、右側にコメントアウトでアプリの名前を残すようにしている
mas install XXXXXXX # AppName

# ⌘英かな.appをinstall
# commandで英数と日本語入力を切り替えられるようにするためのアプリ(USキーボードを使用しているため)
if [[ ! -e /Applications/⌘英かな.app ]]; then
  wget -P ~/Desktop https://github.com/iMasanari/cmd-eikana/releases/download/v2.2.3/eikana-2.2.3.app.zip
  unzip ~/Desktop/eikana-2.2.3.app.zip -d ~/Desktop
  mv ~/Desktop/⌘英かな.app /Applications/
  rm -rf ~/Desktop/eikana-2.2.3.app.zip
else
  printf '\033[33m%s\033[m\n' '⌘英かな.app is already installed.'
fi

## ~/dotfile/.zshrcのシンボリックリンクを~/.zshrcに貼る
if [[ -e  ~/.zshrc ]]; then
  echo 'already exist .zshrc'
else
  ln -s ~/dotfiles/.zshrc ~/.zshrc
  printf '\033[33m%s\033[m\n' 'Please run "source ~/.zshrc"'
fi

## ~/dotfile/.vimrcのシンボリックリンクを~/.vimrc に貼る
if [[ -e ~/.vimrc ]]; then
  echo 'already exist .vimrc'
else
  ln -sf ~/dotfiles/.vimrc ~/.vimrc
  printf '\033[32m%s\033[m\n' 'symbolic link ~/dotfile/.vimrc'
fi

# nodebrewの設定と yarnのinstall
# node.jsは安定版をインストールする、その後、yarnのinstallも行う
if [[ ! -d ~/.nodebrew ]]; then
  /usr/local/opt/nodebrew/bin/nodebrew setup_dirs
  nodebrew install-binary stable
  nodebrew use stable

  npm -v
  node -v

  brew reinstall icu4c
  brew install yarn --ignore-dependencies

  yarn -v
fi

## caskとmasでinstlalしたものを最新にする
brew cask upgrade
mas upgrade


## Install Vim.Plug 
# Vimのプラグインをインストールする
function install_plug_vim() {
  if [ -d ~/.vim/autoload ]; then
    printf '\033[33m%s\033[m\n' 'plug.vim is already installed'
  else
    curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
  fi
}

install_plug_vim

このシェルを実行した後に、vimを起動して、:PlugInstallを叩くと各プラグインのインストールが開始される。 これで大体の初期設定は完了できるはず。

# .zshrcを作成する

Macの標準のログインシェルがzshになったので、.zshrcの設定をしていく。
このあたりは自分の好みで。

サンプルとして一部抜粋したものを掲載。

dotfiles/.zshrc

export PATH GIT_BASE_FOLDER = $HOME/git

# nodebrew
export PATH=$HOME/.nodebrew/current/bin:$PATH

# Git
#hub command
eval "$(hub alias -s)"

# Git alias
alias gb="git branch"
alias gbr="git branch -r"
alias gf="git fetch"
alias gfp="git fetch --prune"
# get diff
# 差分を取る関数
function get_diff() {
  local diff=""
  local h="HEAD"
  if [ $# -eq 1 ]; then
    if expr "$1" : '[0-9]*$' > /dev/null ; then
      diff="HEAD~${1} HEAD"
    else
      diff="${1} HEAD"
    fi
  elif [ $# -eq 2 ]; then
    diff="${2} ${1}"
    h=$1
  fi
  if [ "$diff" != "" ]; then
    diff="git diff --diff-filter=ACMR --name-only ${diff}"
  fi
  git archive --format=zip --prefix=root/ $h `eval $diff` -o archive.zip
}

# masterにmerge済みのbranch(masterとdevelop以外)を削除する
function delete_merged_branches {
  git branch --merged master |grep -vE '^\*|\<master\>|\<develop\>' | xargs -I % git branch -d %
}

# masterにmerge済みのremote branch(masterとdevelop以外)を削除する
function delete_merged_remote_branches {
  git branch -r --merged master | grep -v -e master -e develop | sed -e 's% *origin/%%' | xargs -I% git push --delete origin %
}

こんな感じ。

これをリモートリポジトリにpushしておく。

# 新しい端末ですべきこと

新しい端末では、

  1. Command Line Tools for Xcodeをインストール
  2. gitでdotfilesリポジトリをホームディレクトリ直下にクローンする
  3. sh ~/dotfiles/bin/setup.shを実行
  4. vimを起動して、:PlugInstallを実行

これで同じような環境ができあがる。
端末の細かい設定や、各アプリケーションの設定などはエクスポートしておくか、クラウドなどで管理しておくと良いかもしれない。