RubyMine で RubyMotion 事始め


[RubyMotion 事始め](http://qiita.com/makoto_kw/items/1c92e8102763f81ab26f)を書いてから半年経つが **まるで成長していない。**

そういえばRubyMineがRubyMotion対応しているという話をRubyMotion Kaigiで聞いたことがある。ちょうどRubyMine 6がリリースされていたのでRubyMineでできることを調べれば勉強＆有識者にも情報になるのではと考えることにした。

## RubyMine のインストール

[RubyMine](http://www.jetbrains.com/ruby/) からダウンロードできる。 30日のトライアルがある。

## プロジェクトの作成

HTML5 BoilerplateやTwitter Bootstrapって何なんだぜ！？というツッコミを堪えつつ **Ruby Motion Application** を選択する。

![motion-create-new-project.png](https://qiita-image-store.s3.amazonaws.com/0/2435/a3ff1e3e-9c83-40b0-8fa4-ff49c699f5cc.png "motion-create-new-project.png")

作成すると **Ruby SDK** と **template** を選択できる。 **Use motion-calabash testing framewrok** にチェックを入れると Gemfile に ``gem 'motion-calabash’`` が追加される。テンプレートは ``motion`` コマンドで作成したものと同じものだったのでRubyMineが独自のテンプレートを持っているわけではない様子。

**Ruby SDK** は生成後にプロジェクトの設定から切り替えられたので得に慎重になる必要もない。

![rubymine_motion_tempalte.png](https://qiita-image-store.s3.amazonaws.com/0/2435/41857d17-1e43-2825-ad2e-0b9aa4e93316.png "rubymine_motion_tempalte.png")

テンプレートを選択するとプロジェクトが生成され、Bundle Install の実行が求められる。2回目以降のbundlerの実行は **Tools > Bundler** から実行できる。

![motion-bundle-install.png](https://qiita-image-store.s3.amazonaws.com/0/2435/c537c956-791b-78ff-e503-09f46e3b397e.png "motion-bundle-install.png")


## プロジェクトの実行

Bundlerの実行が終わるのを待つと、右上からプロジェクトのシミュレータ上での実行が可能。ショートカットは ``^R`` に割り当てられている。

![motion-run.png](https://qiita-image-store.s3.amazonaws.com/0/2435/5eac14db-1334-8005-20f8-570064c91302.png "motion-run.png")


実行するとシミュレータが立ち上がった。ビルドの結果や irb のプロンプトはIDEの画面下の実行エリアに表示される。

実行したのは ``rake simulator`` であり、simulator taskには以下のようなオプションがある。

```bash
rake simulator device_family=ipad
rake simulator retina=true
rake simulator target=6.1
```

RubyMineではrakeタスクの引数などを設定して保存しておくことができる。iPhone用とiPad用を分けたいときなどはsimulatorタスクを別々の名前で保存するなどができる。

![motion-rake-args.png](https://qiita-image-store.s3.amazonaws.com/0/2435/07afec1b-36ea-d095-43f0-63751d9a4bbb.png "motion-rake-args.png")

## テスト

デフォルトでは ``rake simulator`` の他に ``rspec`` タスクが用意されており、右上のタスクから選択して Run を実行するとテストが実行される。

結果は画面下にフローティングされたウインドウに表示される。


## コードの記述

コード補完もちゃんと動く。コードシンタックスハイライトも動作する。デフォルトのテーマは白背景だが、 **Appearance > Theme** で ``Darkura`` を選択すると黒背景になる。

![motion-code-syntax.png](https://qiita-image-store.s3.amazonaws.com/0/2435/10b67f40-e0f5-1a09-58e0-55c34c4dddf2.png "motion-code-syntax.png")

コード補完の動作確認。

| Library | 補完できるか |
|:-----------|:------------:|
|iOS SDK|○|
|gem(motion用)|○|
|gem(motion-bundler経由)|○|
|Pod(motion-cocoapods経由)|☓|

Rubyのソースは ``<project-dir>/vendor/install`` とプロジェクトディレクトリにあるので拾ってくれるような感じがする。CocoaPodsの場合についてはCのヘッダまでは面倒見てくれなかった、``<project-dir>/vendor/Pods/BuildHeaders`` にあるのでプラグイン作ればできそうな気も。

ただし、iOS SDKの部分も完全なわけではなくいろいろ細かい部分は気になる。例えば ``UIViewController.navigationController`` の型が ``UIViewController`` で返ってくるとか、 ``UITableViewController`` を継承したクラスで``UITableViewDataSource`` プロトコルを実装すると ``def tableView(tableView, numberOfRowsInSection: section)``などを定義するので ``tableView`` プロパティを使いたいときに ``tableView`` の補完が衝突するなど。Xcode並のコード補完を求めていけない。

## デバッグ

Breakpointを張っても止まらなかったり、プロセスの接続が切れたりどうもでうまく行かなかった。Xcode5だからダメなのかRubyMotion6との相性なのかよくわからない。

ただRubyMotion+RubyMineで開発しているときはあまりIDEのデバッガがなくても違和感がなかった。RubyMotionのコンパイルが速くなっているのでprint, irb, testなどを駆使し、デバッガは困ったときに使うのが良いのではないだろうか。

## 実機での実行

Rakefileにプロビジョニングプロファイルと証明書を指定する。配布するわけではないのでprofileはXcodeが作ってくれる ``iOS_Team_Provisioning_Profile.mobileprovision`` をプロジェクトディレクトリにコピー、証明書はキーチェーンアクセスを開いて名前をコピー。

```ruby:Rakefile
Motion::Project::App.setup do |app|
  # Use `rake config' to see complete project settings.
  app.name = 'RubyMineMotionSample'

  app.provisioning_profile = 'iOS_Team_Provisioning_Profile.mobileprovision'
  app.codesign_certificate = 'iPhone Developer: Makoto Kawasaki (xxxx)’
```

RubyMineでは **Tools > Run Rake task…** から任意のrakeタスクを実行できる。ショートカットは ``Option + R``に割り当てられている。

![motion-rake.png](https://qiita-image-store.s3.amazonaws.com/0/2435/4c826841-f52c-b5ce-dadb-dfb92ce17145.png "motion-rake.png")

task名はインクリメンタルサーチでき、説明も表示される。ここで ``device`` を選択する。

![motion-rake-device.png](https://qiita-image-store.s3.amazonaws.com/0/2435/be407fa5-5f83-228d-998f-134617f281e9.png "motion-rake-device.png")

実機にインストールされ、右上のタスクが変更された。実行したrake taskは設定が保存され、最後に実行したrakeタスクは ``^R`` ですぐに実行できる。

![motion-run-device.png](https://qiita-image-store.s3.amazonaws.com/0/2435/535a8285-22ed-5602-dd91-61a0f49c336c.png "motion-run-device.png")

実行中のタスクは下部にフローティングされた Run ウインドウで管理できる。実機で実行中のプロセスは停止ボタンを押せば止めることができる。

![motion-stop-run-device.png](https://qiita-image-store.s3.amazonaws.com/0/2435/d5f5d5e6-1819-0f7e-24d5-a95f30d21838.png "motion-stop-run-device.png")



## 既存のプロジェクトを開く

HipByteの[サンプルプロジェクト](https://github.com/HipByte/RubyMotionSamples)を開いてみたが ``^R`` でシミュレータで実行が可能だった。

RubyMineで新規に作成しなくてもRubyMotionプロジェクトだと判定してくれる。RubyMineプロジェクトファイルのコミットは必須ではなさそうだし、既存のプロジェクトをRubyMineで始めることも問題なさそうだ。

## まとめ

主にiOSアプリ開発でRubyMineを使って以下を確認した。

* プロジェクトの作成
* コード補完
* シンタックスハイライト
* シミュレータと実機による実行
* デバッグの開始（未確認)
* 既存のプロジェクトのオープン

最初はいろんな処理をIDEから実行することに違和感を感じたが、少しコードを書き始めると ``^R``で実行することにも徐々に慣れてきて、Xcodeもそうであると考えるとこれはこれで便利なのではと思い始めてきた。しばらくRubyMineとRubyMotionを試してみるつもり。


参考にしたもの

* [Getting Started with RubyMotion](http://confluence.jetbrains.com/display/RUBYDEV/Getting+Started+with+RubyMotion)
* [RubyMotion Project Management Guide](http://www.rubymotion.com/developer-center/guides/project-management/)

## おまけ

勉強がてらRubyMotion Advent Calendar 2013を表示するアプリを作成しました。motion-cocoapods、bubble-wrap、sugarcubeを少し利用。xpath使おうとmotion-bundlerやmotion-hppleを使おうとして心が折れる。手を広げていろいろ苦労したので後日談をブログにでも書こうかと思います。

https://github.com/makotokw/MotionAdventCalendar