AppleScript & Xcodeで カラオケしつつGet Wild And Buildする

[GetWild Advent Calendar 2016](http://qiita.com/advent-calendar/2016/getwild) 23日目担当の[@SatoshiN21](https://twitter.com/satoshin21)です。

皆さん、楽しくGet Wildしてますか？
ひとりで解けない愛のパズルを抱いているんじゃないでしょうか。
僕は毎日チープなスリルに身をまかせています。

## ビルド時間に おびえていたよ
普段僕はiOSのアプリを開発をメインにお仕事をしているのですが、
普段Xcodeで開発していて最も無駄な時間は**長過ぎるビルド時間**です。
iOS系勉強会やQiitaにも都度ビルド時間改善の話が持ち上がり、
swiftになってからは更に顕著になりました。
Embedded Frameworkを用いて差分ビルドを最適化したり、Swiftの型推論によって伸びたビルド時間を細かく調整したりと、
皆さんいろいろ苦心しているかと思います。

今回は、そんなエンジニアにとっての無駄な時間を~~誤魔化す~~GetWildするTipsを紹介します。

*※先に言っておくと、今回の内容を実践したところで1msもビルド時間は早くなりませんのでご注意下さい*

## カラオケで歌えるのなら 何も 怖くはない
一番テンションが上がるのはいつでしょうか？
そう、**Get Wildカラオケ**している時ですよね。
今回は、Xcodeのビルド実行しつつ、iTunesでGet Wildを再生し、Notificationでカラオケするscriptを作りました。

完成形はこちらです

<blockquote class="twitter-video" data-lang="ja"><p lang="ja" dir="ltr">
<a href="https://t.co/FU2w7hmGF2">pic.twitter.com/FU2w7hmGF2</a></p>&mdash; SatoshiN21 (@SatoshiN21) <a href="https://twitter.com/SatoshiN21/status/808939148354600960">2016年12月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

Scriptを実行すると、
1. Xcodeの最前面に表示しているプロジェクトをビルド
2. iTunesでGet Wild再生
3. Notificationで歌詞を表示
4. ビルド完了後、再生をストップ
これらの処理を実行します。

## チープなScriptに身をまかせていても
今回はiTunesなどを簡単に操作できる[AppleScript](http://qiita.com/tags/AppleScript)で書きました。
実行環境は以下の通りです

* macOS Sierra 10.12.2
* Xcode 8.2
* iTunes 12.5

まずは、おもむろに以下のアプリを立ち上げます。

`/Applications/Utilities/Script Editor.app`

New Documentを選択後、エディタに以下のScriptを入力します。

```javascript
-- Xcodeの最前面に開いているプロジェクトをビルド
tell application "Xcode"
	try
		set actionResult to build workspace document 1
	on error errorMes
		return
	end try
end tell

-- Get Wild
tell application "iTunes"
	stop track
	play track "Get Wild"
end tell

-- 経過時間を保持
set currentTime to 0

repeat
	--  一定間隔でビルドの終了を判定する
	tell application "Xcode"
		if completed of actionResult is true then
			exit repeat
		end if
	end tell
	
	delay 0.1
	
	-- iTunesから経過時間を取得
	tell application "iTunes"
		set trackTime to player position as integer
	end tell
	
	-- 経過時間が更新された時に歌詞情報を取得
	if currentTime is not trackTime then
		set lyric to getWildAndTough(trackTime)
		display notification lyric
	end if
	set currentTime to trackTime
	
end repeat

-- ビルドに失敗した場合、アクシデントを再生
tell application "Xcode"
	set resultStatus to status of actionResult
	if resultStatus is failed then
		tell application "iTunes" to play track "アクシデント"
	else
		tell application "iTunes" to stop track
	end if
end tell

-- 経過時間から歌詞を取得
on getWildAndTough(trackTime as integer)
	
	if trackTime = 29 then
		return "アスファルト タイヤを切りつけながら"
	else if trackTime = 33 then
		return "暗闇 走り抜ける"
	else if trackTime = 36 then
		return "チープなスリルに身をまかせても"
	else if trackTime = 40 then
		return "明日におびえていたよ"
	else if trackTime = 44 then
		return "It's your pain or my pain or somebody's pain"
	else if trackTime = 48 then
		return "誰かのために生きられるなら"
	else if trackTime = 51 then
		return "It's your dream or my dream or somebody's dream"
	else if trackTime = 54 then
		return "何も こわくはない"
        (* 続きの歌詞を入力... *)
	end if
	return ""
end getWildAndTough
```

`⌘ + R`で実行すれば、右上に歌詞が表示され
思う存分カラオケを楽しむことができます。
逆に差分ビルドが走ってビルド時間が短いと、最後まで歌いきれない為に少しさびしい気分になります。
ちなみに、**ビルドに失敗するとTM NETWORK「アクシデント」が再生されます。**ビルドに失敗したことがいち早くわかり、最高ですね！

[AppleScript](http://qiita.com/tags/AppleScript)はmacOS上の様々なアプリとの連携が可能です。

`tell application “Xcode” to build workspace 1`

で最前面に表示されているXcodeのプロジェクトをビルドすることが可能です。
このコマンドはビルドの完了を待たずに処理が終わるので、

```applescript
set actionResult to build workspace document 1

repeat
	if completed of actionResult is true then
		exit repeat
	end if
	
	delay 1
end repeat
```
このような形でビルドの完了をリピート文で待つ必要があります。

iTunesでは、音楽の再生、停止、及び経過時間の取得を行っています。

```applescript
tell application "iTunes"
	set trackTime to player position as integer
end tell
```

iTunesアプリからは`player position` プロパティで現在の経過時間をreal値で取得できます。
後は、経過時間に合わせた歌詞を`display notification {lyric}`で出すだけです。

## 君だけがまとめられるものがどこかにあるさ
正直、AppleScript練習の為のネタスクリプトになってしまいました。
個人的には、mac上で動いているアプリと連携して様々な事ができるので、
何かしら業務効率化用スクリプトを作るのであれば、一つの選択肢として考えてもいいかと思います。

ただ、今回Xcodeとの連携では、AppleScriptと連携するにはリファレンスに情報が足りない部分もあるし、
呼び出し方が明記されていないものもあったので
もしAppleScript上でXcodeと連携してゴニョゴニョやる時は
素直に`xcodebuild`を`do shell script`で呼び出して使った方がいいかもしれません。

Get Wild And Script!!