新規マシン導入前の下準備 - 産技高専における macOS 環境の構築(1)

macOSSetting macOS Homebrew 2019年 5月 23日

はじめに

研究に使っていた 15inch MacBook Pro (Retina, Mid 2012) が12月にオブソリュート製品の仲間入りした. SSD は 750GB あるし,RAM の 16GB あるので,未だに現役で使えるものではある(研究室の iMac 4K よりも使い勝手がよい). これはこれで余生の使い道はありそうだが,やはりメインマシンは修理ができるマシンにしておきたいということで,15inch の MacBook Pro (2019) を購入させていただいた.

これまで研究用マシンと研究室のメインマシンを分けていたため,ファイルの管理が面倒であった.そのため,今回購入した MacBook Pro は研究用と研究室メインマシンを兼ねる運用をすることにする.

MacBook Pro は大学に行く時には持参するので,研究室の教職員VLANに接続できるマシンは一台残す必要がある(出張先でも校務支援システムのトラブル対応を行うことがあるためである). そこで,場所を取る iMac 4K の代わりに,以前使っていた Mac mini (Late 2012) を引っ張り出してセッティングする(iMac 4K はもったいないが学生へのお下がりに).

セッティングに使うもの

MacBook Pro の発注はしたもののしばらくは届かないので,先に Mac mini の設定をやってしまう. Mac mini は ssh さえ動けばよいのだが,万一 MacBook Pro にトラブルがあった時の代替にも使えるよう同じ環境はセッティングしておくべきだろう. MacBook Pro が届いた時にセッティングが速やかに終わるように,Mac mini でリハーサルを行うことにする.

参考にしたのは dotfiles類をbrew bundleを使ってきれいにするのにやったこと および macOSでの開発環境を全部Docker化したらリストア時間が1時間半になった である. 以前,Brewfile は一度潰れかけた気がしたのだが,最近プラグインの形で使えるようになっているとのことらしい. これまでやっていた ansible での設定よりも簡単にできそうな感じなので,こちらに乗り換えてみる. 現状では研究用 MacBook Pro (以下,rMBP) の方はそれなりに環境が揃っているので,この環境を Mac mini (以下,mini) 側に適用できるように 前者のリンクの dotfiles を構築してみる.

dotfiles リポジトリの作成

dotfiles については,以前からリポジトリ化をしていた.これまでは本当に dotfiles だけの同期のためだったが,今回は Homebrew, Homebrew cask, App Store までも含めて同期することにする. まずは,真似から始めるということで, bootstrap.sh を使わせていただく.直すのは8行目の dotfiles のパスだけでよさそう. 以下,作業手順を列記していく.

  1. rMBP 側で bootstrap.sh を記載し,実行権限を付加する.
    vi bootstrap.sh; chmod +x bootstrap.sh
  2. bitbucket に push する.
  3. 公開リポジトリでないと https でアクセスできないので,恥ずかしいが公開リポジトリにしてしまう.
  4. mini で以下のコマンドを実施する.
    bash -c "$(curl -L https://bitbucket.org/hkob/dotfiles/raw/HEAD/bootstrap.sh)"
  5. git clone のところでエラーがでた.コマンドラインツールが入っていないからだった.確かに何も入っていないマシンだった.以下のコマンドで先にコマンドラインツールをインストールしておく.
    xcode-select --install
  6. もう一度実行してみると,今度は clone できた.scripts/configure.sh がないと言われる.
  7. ikuwow 氏の configure.sh を見ると defaults コマンドの塊だった. ここは saboyutaka 氏と同じように自動化はしたくないと思っていた(マシンによって微妙に異なるし,OS が変わった時に対応できるか不安だから). ここは呼び出し部を 消してしまうことにする.
  8. 次は deploy.sh である.nvim, kyrat, iCloud の部分は要らないと感じたので,前半部分だけ利用した(そもそも自分で使っていたスクリプトとほぼ同じだった).
    #!/usr/bin/env bash
    
    DOTPATH="$HOME/dotfiles"
    
    if [ ! -e "$DOTPATH" ]; then
        echo "Error: Directory $DOTPATH does not exist."
        exit 1
    fi
    
    cd "$DOTPATH" || exit 1
    
    for file in .??*; do
        [[ "$file" = ".git" ]] && continue
        [[ "$file" = ".DS_Store" ]] && continue
        ln -fvns "$DOTPATH/$file" "$HOME/$file"
    done
    
    [[ -z $XDG_CONFIG_HOME ]] && XDG_CONFIG_HOME=$HOME/.config
    mkdir -p "$XDG_CONFIG_HOME"
  9. 先ほど git clone ができているので,~/dotfiles には bootstrap.sh がいるはずである.今後は,curl の呼び出しの代わりに以下のコマンドを実行すればよい.
    ~/dotfiles/bootstrap.sh
  10. deploy.sh が動くと,Homebrew 本体のインストールと,homebrew/bundle のタップが読み込まれる. ここまでは無事に成功した. brew bundle の実行において
    Error: No Brewfile found
    となって停止した.
  11. Brewfile は rMBP の方で作成する. rMBP の方には homebrew/bundle をタップしていなかったので,以下のコマンドでタップしておく.
    brew tap homebrew/bundle
  12. 以下のコマンドを実行することで,現在インストールされている homebrew のパッケージが Brewfile に dump される.
    brew bundle dump
  13. 作成された Brewfile から rbenv や pyenv などは削除した.これらは,今度 Docker を使ってシステムとは分離して開発したいと考えたためである. また,ikuwow 氏のものをみると mas を使って App Store のアプリを追加していた. 同様に試してみたが,mas の部分で失敗してしまった. コマンドライン環境でも試してみたが,先に進まなかったので,プロキシ環境だとダメなのかもしれない. 諦めかけていたところ,http_proxy を設定していなかったターミナルで実行したところ,問題なく mas が稼働した. 対策がわかれば対応は簡単で,mas の実行前後で proxy のオフ・オンを切り替えればよいはずである. bootstrap.sh の修正部分は以下のようになった.
    # homebrew and cask
    brew bundle
    echo
    
    # mas
    cd mas_only
    http_proxy_back=$http_proxy
    https_proxy_back=$https_proxy
    unset http_proxy
    unset https_proxy
    brew bundle
    export http_proxy=$http_proxy_back
    export https_proxy=$https_proxy_back
    unset http_proxy_back
    unset https_proxy_back
    cd ..
    echo
  14. Homebrew および cask の Brewfile はこんな感じにした.
    tap "buo/cask-upgrade"
    tap "homebrew/bundle"
    tap "homebrew/cask"
    tap "homebrew/core"
    tap "homebrew/services"
    tap "theseal/ssh-askpass"
    brew "mas"
    cask "1password"
    brew "mackup"
    cask "xquartz"
    brew "libyaml"
    brew "openssl"
    brew "python"
    brew "ansible"
    brew "gettext"
    brew "libtiff"
    brew "libevent"
    brew "openjpeg"
    brew "ffmpeg"
    brew "fish"
    brew "ghostscript"
    brew "gibo"
    brew "gnuplot"
    brew "graphviz"
    brew "netpbm"
    brew "ilmbase"
    brew "imagemagick"
    brew "jxrlib"
    brew "macvim"
    brew "mitmproxy"
    brew "nkf"
    brew "tmux"
    brew "overmind"
    brew "pandoc"
    brew "pdflib-lite"
    brew "plantuml"
    brew "telnet"
    brew "wget"
    brew "theseal/ssh-askpass/ssh-askpass"
    
    cask "adobe-acrobat-reader"
    cask "alfred"
    cask "aquaterm"
    cask "cd-to"
    cask "chromedriver"
    cask "cmd-eikana"
    cask "docker"
    cask "dropbox"
    cask "eclipse-java"
    cask "findings"
    cask "firefox"
    cask "google-chrome"
    cask "grandperspective"
    cask "java"
    cask "letterfix"
    cask "libreoffice"
    cask "logisim"
    cask "mactex"
    cask "maczip4win"
    cask "mendeley"
    cask "mysqlworkbench"
    cask "omnifocus"
    cask "omnigraffle"
    cask "omniplan"
    cask "osxfuse"
    cask "papers"
    cask "qlstephen"
    cask "skim"
    cask "sourcetree"
    cask "vlc"
    cask "vmware-fusion"
    cask "xmind"
  15. mas の Brewfile は mas_only/Brewfile に記載した. mas の場合には,id が必要なので,App Store のインストール済みのリンクから抽出した.
    mas "ibooks-author", id: 490152466
    mas "type2phone-bluetooth-keyboard", id: 472717129
    mas "hardwaregrowler", id: 475260933
    mas "growl", id: 467939042
    mas "ihex-hex-editor", id: 909566003
    mas "verve", id: 1436374224
    mas "quiver-take-better-notes", id: 866773894
    mas "reeder-3", id: 880001334
    mas "microsoft-remote-desktop-10", id: 1295203466
    mas "kindle", id: 405399194
    mas "slack", id: 803453959
    mas "imovie", id: 408981434
    mas "be-focused-pro-focus-timer", id: 961632517
    mas "tnefs-enough", id: 986621173
    mas "coteditor", id: 1024640650
    mas "apple-remote-desktop", id: 409907375
    mas "affinity-designer", id: 824171161
    mas "day-one", id: 1055511498
    mas "virus-scanner-plus", id: 595374522
    mas "notability", id: 736189492
    mas "spark", id: 1176895641
    mas "ithoughtsx-mindmap", id: 720669838
    mas "icircuit", id: 454347770
    mas "todoist", id: 585829637
    mas "Numbers", id: 409203825
    mas "Keynote", id: 409183694
    mas "Pages", id: 409201541
    mas "Xcode", id: 497799835
  16. 実行するといろんなものをインストールし始めた. ここまでで mackup の手前まで終了した. これ以降はまた明日設定する.本日はここまで.