RubyMotionに入門してみる

RugyKaigi2015で、@lrzさんの[RubyMotionのセッション](http://rubykaigi.org/2015/presentations/lrz)で、FlappyBirdならぬFlappySushi、自由に飛び回るSUSHIを見て感動して、どうしても一度触ってみたかったのでこの機会に軽く入門してみたいと思います。


## 公式サイト


http://www.rubymotion.com/

## RubyMotion Tutorial

http://rubymotion-tutorial.com/

僕はここから初めてみました。




## 手順

### ダウンロード && インストール

RubyMotionをダウンロードして、インストールします。公式サイトからダウンロードできます。メールアドレスを登録して、届いたメールに従ってダウンロード && インストールします。

http://www.rubymotion.com/


バージョンは4.6でした。

```
$ motion --version
4.6
```

RubyMotionで一番人気のありそうなTutorialを見つけたので、それで入門してみようと思います。

http://rubymotion-tutorial.com/


### プロジェクト作成・ビルド

早速、HelloMotionという新しいプロジェクトを作成してみます。以下のようにして作成します。

```
$ motion create HelloMotion
```

いろいろファイルが生成されました。GemfileとかRakefileとか、Rubyistにとっては親しみのあるものばかり。


![Screenshot 2015-12-22 06.19.28.png](https://qiita-image-store.s3.amazonaws.com/0/37676/1e33eed4-592b-fb5a-4d48-1aac47ab1e69.png "Screenshot 2015-12-22 06.19.28.png")


`motion`コマンドは、railsコマンドのようにプロジェクト自体で何かしらのタスクを実行するのによく使うコマンドのようです。

Rakefileから見ていきます。


```ruby
# $ cat Rakefile
# -*- coding: utf-8 -*-
$:.unshift("/Library/RubyMotion/lib")
require 'motion/project/template/ios'

begin
  require 'bundler'
  Bundler.require
rescue LoadError
end

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

最初の一行でRubyMotionのライブラリを置いてあるパスをrequireのロードパスに追加しています。そのあと、`.setup`メソッドに渡しているブロック内で、アプリの基本的な設定をしています。

ということで、このrakeタスクを実行してみます！

```
$ rake
```

ビルド・コンパイルの出力のあとにiPhoneのsimulatorが立ち上がりました！！すげーーー

![Screenshot 2015-12-22 06.28.30.png](https://qiita-image-store.s3.amazonaws.com/0/37676/15748186-ce9a-6b49-b49d-a64e1037ef71.png "Screenshot 2015-12-22 06.28.30.png")


チュートリアルは情報が遅れているようで、初期で以下のような画面が出てきました。

![Screenshot 2015-12-22 06.52.35.png](https://qiita-image-store.s3.amazonaws.com/0/37676/232fc914-ac9c-a714-9f89-df1dac7ed228.png "Screenshot 2015-12-22 06.52.35.png")



`app_delegate.rb`の中身にすでにコードが少し書かれてます。


```ruby
class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    rootViewController = UIViewController.alloc.init
    rootViewController.title = 'HelloMotion'
    rootViewController.view.backgroundColor = UIColor.whiteColor

    navigationController = UINavigationController.alloc.initWithRootViewController(rootViewController)

    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
    @window.rootViewController = navigationController
    @window.makeKeyAndVisible

    true
  end
end
```

UIViewControllerクラスのインスタンスを生成して、titleやbackgroundColorといった属性を指定。

UINavigationControllerのインスタンスも生成して、最後に`@window`というインスタンス変数にUIWindowのインスタンスを使って、実際のViewの配置を行っています。

RubyMotionの大きな特徴は、Rubyのシンタックスを使うのですがcocoaのクラスたちと仲良くする、ということでしょうか。こんな風に、違う言語で同じことを実装するのってなんか新しいcocoaの一面を見る気がして発見があって面白いなと思いました。

Obj-Cと同様にswiftでもキーワード引数が導入されていてiOSのプログラミングにおいてこれってかなり重要な要素です(と勝手に思ってます)が、昔のRubyにはキーワード引数の機能がなくて、RubyMotionでは独自にこの機能を実装していたようです。Ruby2.0からキーワード引数が導入されたため、今はネイティブの機能を使っているのかな？(RubyMotionで使われているRubyのバージョンを調べる方法がわかりませんでした...><)

_追記 at 2015/12/22_

Twitterでつぶやいてみたら、@watson1978 さんから回答いただきました(わーい)

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr"><a href="https://twitter.com/totzyuta">@totzyuta</a> Ruby 1.9.2互換です。</p>&mdash; watson (@watson1978) <a href="https://twitter.com/watson1978/status/679361565955493888">December 22, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


ということでRubyMotionはRuby 1.9.2互換のものを使っているようです。

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr"><a href="https://twitter.com/totzyuta">@totzyuta</a> objcのキーワード引数にマッチするように手を入れてます</p>&mdash; watson (@watson1978) <a href="https://twitter.com/watson1978/status/679627278121209856">December 23, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


とのことで実際はRuby 1.9.2に互換性を持たせながら独自に拡張しているようでした。


## おわり

と、こんな感じで動かすだけ動かしてみましたが、RubyMotionよい感じです。Rubyを書いているなら手に馴染んだツールばかり触ってる感覚でiOSを開発できそうです。

何かiOSで実現したい軽めのアプリのアイディアが思いついたら、次はRubyMotionを使って開発してみるのもありかもーー。