iOSでMacRubyを使う–RubyMotionとは?

2012年5月3日、RubyMotionがリリースされました。

RubyMotionは、Objective-Cに代わる最高の選択肢です。

RubyMotionはMacRubyをベースにしており、iOSでのアプリ開発をターゲットにしています。

MacRubyでは、iOSを開発する事はできませんでした。なぜなら、MacRubyはObjective-CのGarbage Collectorに依存しており、それはiOSでは用いる事ができなかったからです。

新しいランタイムは軽量で効率的でなかればなりませんでした。さらに、コードがiOS上で動くだけではなく、コンパイラーとやり取りできたり、デバッグやパッケージを作成したりするツールが必要でした。

RubyMotionがすばらしい製品であることは、誰も疑わないでしょう。しかし考えるべきなのは、「資金や時間や労力を投じてまで、Appleの言語やツールに取って変えるだけの価値があるのだろうか」ということです。

この記事では、良い点とそうではない点を、できる限りバランスよく紹介して、RubyMotionについての理解を深めてもられればと思います。


RubyMotionの長所


Rubyであるということ


Objective-Cもよい言語だと思います。日々改良されてきました。でも、それはRubyではないんです。ヘッダーが必要ですし、Xcodeの設定に縛られながらコンパイルが必要で、テストが面倒で、構文がくどいんです。それにくらべてRubyは柔軟性があり、Mixinを使ってコードを再利用できたり、簡単にクラスを再利用できたり、、。


MacRuby


RubyMotionはMacRubyをベースにしています。ですので、MacRubyに投じてきた時間やエネルギーを、RubyMotionでも生かす事ができるのです。ネイティブAPIについてのワークアラウンドを探しまわる必要もないですし、RubyオブジェクトはObjective-cオブジェクトなので、パフォーマンスも良いです。AppleがMacRubyをiOS向けに採用していないことが残念です。


REPL/インタラクティブシェル


RubyMotionは現状ではデバッガーを備えていません。しかし、Objecgtive-C開発者には使えない、REPLというシミュレーターが使えます。これはアプリケーションのデバッグを簡単に行えますし、Cocoa API を学ぶのにも良いでしょう。ビジュアルで要素をクリックでき、編集するとターミナルウィンドウの中でリアルタイムに反映されていきます。html/cssを編集するのにfirebugを初めて使った時のようなあの感動がよみがえってきます。


Xcodeに依存しない


XcodeはObjective-Cを書くためにはとてもよいのですが、よくクラッシュしますし、UIが複雑で、Objective-CとRubyが異なる要素を必要とするので、MacRubyの開発でうまく動いたためしがありません。それに、Xcodeはオープンソースではありません。完全にAppleのコントロール化にあり、サードパーティ製のAPIも使えません。


メモリー管理


ARCはObjective-Cの開発においてメモリ管理を容易にしてくれますが、RubyMotionを使えば、そもそもメモリの心配をする必要がありません。Objective-Cでは未だに自動でメモリ管理をしてくれないのですが、RubyMotionでは自動でメモリ管理をしてくれるCoreFoundationが含まれています。メモリ管理はとても明快で、たいてい素晴らしい働きをしてくれます。



RubyMotionの短所


Rubyであるということ

Rubyが完璧で、唯一の選択肢という訳ではありません。例えば、低レベルなAPIを用いる時や、C++とやり取りしなければならない時などは、とても重いということがあります。救いなのは、同じプロジェクト内で、Objective-CとRubyMotionを共存させることができるということです。他にも少々悩まされていることとしては、iOS向けにRubyのコードを書いていると、引数のタイプを強制することができないので、Clangで提供されるObjective-C向けの機能が利用できないということです。そのうち実装されることを夢見ていますが、それは別問題ですね。

Rubyを使う上で他のネガティブな要素としては、Rubyの開発者はすべての標準的なライブラリが、RubyMotionで利用できると思い込むだろうということです。RubyMotionではRubyの構文が使えるだけだということを覚えておかなければなりません。率直に言って、ほとんどの標準的なRubyのライブラリは、iOSのアプリを作る上では役に立ちません。
MacRubyでアプリを作るときでさえも、ノンブロッキングやマルチスレッドの環境向けに作られたライブラリはほとんど役に立ちません。大抵はObjective-Cのライブラリを使います。


Cocoa Touch


すでにiOSやOS Xの開発をしておられるならお分かりだと思いますが、言語の構文がハードルになるのではなくて、Cocoa APIが問題になるのです。これらのAPIはアプリとのやり取りをする上で必要になってきます。Cocoa APIは他のPythonやRubyやJavaと比べて簡単に思われがちです。確かにCocoa APIはとても一貫性があるのですが、学ぶのは容易ではありません。iOSでアプリを作るには、Rubyを知っていたとしても、やはりCocoaも学ぶ必要があります。


Xcode/IDEがない


IDEは新しいAPIを学ぶ上でとてもためになります。コードを完成させ、素早くドキュメントにアクセスでき、デバックし、インターフェースを作り、再構築する際に、Objective-CからRubyに移行した人は苦労するでしょう。もしRubyやCocoaを知らないのであれば、RubyMotionを始めるのは非常に難しいですので、まだやめた方がいいと思います。


UIの作成


もしかするとUIを作成するのが簡単になるかもしれません。DSL上でLaurentを動かせるなら、UIの作成が簡単になるので、そうできるようになる事を期待しています。しかし今はまだ、Cocoa APIの複雑さもあり、それは非常に面倒な作業でしょう。Xcodeのインタフェースビルダーやストーリーボードで、RubyMotionの開発ができるようになることを皆が望んでいます。


デバッガーがない


デバッガーがないことは、現状ではやはり問題になります。分かりやすいバグではない場合、特にそうです。


だれをターゲットにしているのか明確ではない


明確なターゲットが存在しない事を、新しい製品に対して責めても仕方ないのですが、開発者としては、「どんなときにRubyMotionを使えばいいのか、どんな弱みがあるのか」という疑問がやはり生じます。RubuMotionを使えば、素早いプロトタイプを作れるようになるのでしょうか、それとも、プロトタイプが不要になるのでしょうか。それともFlash Liteアプリケーションに取って代わるものなのでしょうか。新しいアプリを作るために時間を割くべき価値があるのでしょうか。Titaniumで作ったアプリを書き換えるべきなのでしょうか。Objective-Cの代わりにいつもRubyMotionを使うべきなのでしょうか。

まずはRubyMotionで作ったアプリがAppストアに並んで、それらを試してみるまで、様子を見たいところだと思います。


ドキュメント


すべてのiOS向けのドキュメントはObjective-Cで書かれており、Appleが提供しているAPIやサンプルコードは
すべてObjective-Cです。幸い、2つほどMacRubyの本が書かれておりますが、RubyMotionに関しては、初心者向けのドキュメントとは言えません。じきに増えてくると思うんですがね。


独占的なソリューション


RubyMotionはオープンソースではなく、Laurentという1人の男にかかっています。もし彼が辞めてしまったら、またアプリケーションをObjective-Cに書き直さなければなりません。RubyMotionを本格的な製品に使うには、リスクが伴います。

私はオープンソースが好きですが、iOSのアプリを作る上ではいつもそれが可能という訳ではありません。いまは選択肢がないのです。LaurentがRubyMotionをオープンソースで運営してもマネタイズできることを願っております。でももし一攫千金したら心が変わってしまうかもしれないですけどね。


結論


RubyMotionをとりあえず試してみる事を強くお勧めいたします。アプリを作る上で何時間も節約できる事は保証できます。モバイル開発をステップアップしたくてもリスクが気になる方は、金銭的なメリットがあることを考えると動かされるかもしれません。

RubyMotionは私の中で、Objective-Cに代わる選択肢です。しかし、まだリリースから48時間しか経っていないので、何とも言えません。言語の壁を超えられるでしょうか、そしてPython,PHP,Java,Objective-C,Javascriptの開発者を引きつけるだけのものがあるでしょうか。RubyMotionアプリの魅力はなんでしょうか。ネイティブアプリとWebアプリの競争に影響を与えるでしょうか。より大勢の人をiOSの開発に誘うものとなるでしょうか。時が経たねば分かりません。

あなたはどう思いますか?


http://merbist.com/2012/05/04/macruby-on-ios-rubymotion-review/(出典)

Java(.jar)エラー「Could not find the main class. Program will exit.」

拡張子が.jarのファイルを実行しようとすると、コマンドプロンプトの画面が一瞬出て、すぐに消えてしまうというエラーが生じることがあります。

エラーの内容を見てみると、

Could not find the main class. Program will exit.

というエラーが吐き出されています。

その場合、jarの拡張子とjavaプログラムの関連付けを疑ってみるのは1つの方法です。

.jarファイルが、java.exeファイルに関連づけられているなら、
javaw.exeに関連付けて実行してみると、問題なく動作する場合があります。