OSX Yosemiteの環境をコマンド一発でセットアップできるようにしてみた

## TL;DR
`rebuild <ユーザー名>/dotfiles`と打つと、コマンドラインツールを自動でインストールしてdotfilesをcloneしてインストールスクリプトを走らせてくれる[rebuild gem](https://github.com/k0kubun/rebuild)を作りました

### [k0kubun/rebuild](https://github.com/k0kubun/rebuild)

## はじめに
エディタやシェルなどのツールは`~/.*`に設定ファイルが配置されることが多いです。
そこで、多くの人がそれらの`.`で始まるファイル群をGitHubでdotfilesというリポジトリ名で管理しています。 [★](http://dotfiles.github.io/)

ですが、せっかく設定ファイルをちゃんと管理していても、Yosemiteをアップグレードインストールすると環境が壊れ、無限に余計な作業が発生したりします。[★]((http://qiita.com/naoya@github/items/8793fe9227f2b144b1ff))
なら、**クリーンインストールした状態から一発で元の環境を再現**できたら、`/usr/local`を退避させる必要もなく、すごく便利ではないでしょうか？

## Command Line Tools
まず、まっさらな状態では`git`が使えません。
なので、「GitHubからリポジトリのアーカイブをダウンロードして解凍し、セットアップスクリプトを走らせることで解決している人もいます。[★](https://github.com/r7kamura/dotfiles) [★](https://github.com/mathiasbynens/dotfiles)

ですが、`curl -LSfs https://raw.githubusercontent.com/***/dotfiles/master/install.sh | bash` 
とか `cd; curl -#L https://github.com/***/dotfiles/tarball/master | tar -xzv --strip-components 1 --exclude={README.md,bootstrap.sh,LICENSE-MIT.txt}` 
とかって、ブラウザを開いてコピペするのも自分で打ち込むのも面倒ではないでしょうか？

### `rebuild`を叩くだけ
ターミナルを開いたら`sudo gem install rebuild && rebuild`と打ち込んでください。
AppleScriptによるGUIスクリプティングにより、**マウスに触らずにgitやgccが使えるようになります**。 (一度は利用規約読んでる人向けです)

そして、`rebuild`ではなく`rebuild <ユーザー名>/dotfiles`と打てば、リポジトリルートにある`*.sh`を自動で走らせるところまでやってくれます。
これにより、**gitの有無や自身のcloneを気にせずセットアップスクリプトを書くことができます**。

## セットアップ全自動化

あとはあなたの環境セットアップスクリプトに足りない自動化スクリプトを追加するだけです。
そのために便利なスニペットを紹介します。

なお、`rebuild`の実行は冪等性が保証されており、実行するスクリプトも何度叩いても同じ状況が保てるように工夫しておくと、普段の環境の更新にも便利です。

### `~/.*`へのsymlink

そもそもdotfilesは`.`で始まるファイルを管理するものなので、これがなければ始まりません。
たとえばあなたのdotfilesルートディレクトリにある`.*`をすべて`~/.*`にsymlinkを貼るスクリプトは以下のようになります。

```bash
repository_root=`cd $(dirname $0); pwd`

for dotfile in `ls -A ${repository_root} | grep "^\."`; do
  from="${repository_root}/${dotfile}"
  to="${HOME}/${dotfile}"

  if [ ! -e $to ]; then
    ln -s $from $to
  fi
done
```

`.*`なファイルを追加するだけでよく、スクリプトの保守に手間がかかりません。

### Homebrew
`brew bundle`は死にました。Brewfileはなくても、以下のようにすれば管理に手間はかからないはずです。

```bash
if ! which -s brew; then
  ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
fi

BREW_PACKAGES="
  go
  openssl
  rbenv
  readline
  reattach-to-user-namespace
  ruby-build
  tmux

  peco/peco/peco
  motemen/ghq/ghq
  caskroom/cask/brew-cask
"

for package in $BREW_PACKAGES; do
  if brew list -1 | grep -q "^$(basename $package)"; then
    echo "Skip: brew install ${package}"
  else
    brew install $package
  fi
done
```

`brew tap peco/peco; brew install peco`とかやめて`brew install peco/peco/peco`にしましょう

### Homebrew Cask
手でdmgを落としてきてインストールする時代は終わりました

```bash
CASK_PACKAGES="
  alfred
  google-chrome
  google-japanese-ime
  iterm2
  karabiner
  yorufukurou
  dropbox
"

for package in $CASK_PACKAGES; do
  if brew cask list -1 | grep -q "^${package}"; then
    echo "Skip: brew cask install ${package}"
  else
    brew cask install $package
  fi
done
```

### キーバインド
[Karabiner](https://pqrs.org/osx/karabiner/index.html.ja)(元KeyRemap4MacBook)は非常に便利で、キーバインドで困ったらこれでほぼ解決することができます。
これをシェルからセットアップする方法も共有します。

```bash
if ! pgrep -q Karabiner; then
  sql="
    INSERT OR REPLACE INTO access
    VALUES('kTCCServiceAccessibility','org.pqrs.Karabiner-AXNotifier',0,1,0,NULL);
  "
  sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "${sql}"
  open -a Karabiner.app
fi

# /Applications/Karabiner.app/Contents/Library/bin/karabiner export > karabiner.sh
# を事前にしておく
source karabiner.sh
```

Macは **セキュリティ>プライバシー>アクセシビリティ** にあたるデータはsqliteで管理していて、そこに上記のSQLを流すことによってKarabiner_AXNotifierの設定を省略できます。
また、Karabinerは一度起動すると自分でlaunchdに登録してくれるので、一度起動してしまうだけでセットアップはオッケーです。

肝心の設定は、`/Applications/Karabiner.app/Contents/Library/bin/karabiner export`が**現在の設定を再現するシェルスクリプトを吐き出す**ので、これを利用します。

### その他
他にも自動化したら逐次追記します

## 感想
自動化楽しい！！！！！！！！！！！！