RubyMineでRubyMotion事始め・余談

RubyMotionのAdvent CalendarでRubyMineでRubyMotion事始めを投稿したんだけどその余談。

せっかくなのでRubyMineを使ってRubyMotionの何かiOSプロジェクトを作ってみようとした。目的がAdvent Calendarへの投稿だったのでRubyMotionのAdvent Calendar(RSS)を表示しようと考えた。Twitter APIに認証が必要になってしまった今ではこれくらいがサンプルプロジェクトとして、勉強としてちょうど良いだろう。

RubyMotionは基本的にiOS SDKのwrapperであり、Rubyのgem資産は活用できない。RubyMotion用のgemは存在する。その中でも便利ライブラリである BubbleWrap を使ってみた。

BubbleWrapにRSS Parserクラスがあった。RubyMotion Tutorialを読んでTableViewなどView関連の使い方はだいたい分かったので余裕だと思っていた。この考えは浅はかだった。

RSS ParserクラスでQiitaのRSSをパースしても何も表示されない。何故だ。RSS Parserクラスの中身をを見たらSAXで item 要素を読み込んでいる。つまりAtomFeedに対応していない。ただ /feed/entry/ を読むようにパッチを当てればすれば済む話だった。

僕はiOSでXMLの扱いが面倒だったのを忘れていた。いや、たとえ覚えていてもだからこそRubyMotionでスマートに解決しようとしたかもしれない。xpathなんかでサクッと実装しようとしてしまった。

まず、普通にREXMLを使おうとした。motion-bundler という魔法があったのでそれを使おうとした。結論からいうとmotion-bundlerを使ってxml/documentをrequireしようとしてもできなかった。以下のような問題に遭遇したが解決できなかった。

How do I parse XML data in RubyMotion?
https://groups.google.com/forum/#!topic/rubymotion/b5Wk3HTyVB4

もともとmotion-bundlerは強引なドリブルだと認識していたので諦めた。

次にhpple-motionを使おうとした。hpple-motionはRubyMotion用のgemでxpathを使うことができる。しかし何故か動かなかった。使い方を間違えていたのかもしれない。hpple-motionは実はRubyで実装されているのではなくHppleというCocoaPodのwrapperである。そのため原因を特定しようとするとObjective-Cレイヤー(CocoaPod)のデバッグが必要になりRubyMotionまったく関係ないので特定するのは諦めた。

結局 RSS ParserにモンキーパッチをあててAtomFeedを読めるようにした。

朝からエントリーを書いていて文章は大体出来ていたのでに出社までに投稿できると思っていたが、XMLのパースという本質的じゃないところにハマッたせいでサンプルプロジェクトが完成せず、結局投稿するのは夜になった。

RubyMotionはやはりiOS SDKのWrapperだ。Objective-Cの代わりにRubyが使えるがiOS SDKの機能的な不足部分をRubyで補う魔法のツールではない。Rubyのライブラリが使えないことは認識していたがやはり一度痛い目にあってみないと学ばない。良い勉強になった。

サンプルプロジェクトはこちら
makotokw/MotionAdventCalendar