blog.tmp.tokyo

No Promises Await at Journey's End

iPhone で Ruby がコーディング & 実行できるアプリを作る!(5)

島根県松江市は台風の東側に位置しているみたいで、雨はあまり降っていませんが風が強いです。今朝はコンビニで買ったビニール傘が自宅を出て数分で大破しました。これはとても悲しいことです。

さて、例の mruby.tmp とかいうアプリをそろそろ次のステップへ進めるべくいろいろいじっていたのですが、ちょっと最近問題が起きていました。

tomohiko37-i.hatenablog.jp

ええと、

puts "Hello, World"

みたいな通常のコードなら普通に Ruby のコードを iPhone 上で実行できるのですが、ちゃんと間違っていた時は間違った情報を出したいのでエラー処理とかをいろいろ実装した上で実行していたら、

put "Hello, World"

という感じに putsput になった場合で実行するとアプリが落ちるようになりました。実はこの間の土曜日に出雲空港MacBook Air を持って行ったのもこれを暇な時に調べようと思って Xcode をちょろっと動かそうと思ったからです。外で実機につなぐのは面倒なのでシミュレータで試せばいいやと思ってやってみたら、シミュレータでは正常にエラー情報が表示できました。その他の文法誤りの場合も同じ。どうやら mrubyRuby のコードを渡しているところが怪しい気がしてきたので調べていたのですが、ようやく謎が解けました。

github.com

この爽やかなおじさんのサイトでやっている mruby のビルド方法を使っていたのですが、英語なのでインストール方法以外はロクに読まずにいました。ちゃんと読んでいたら注意書きがあるということに気づきました。

mruby is new and changing constantly, don't be surprised if this project doesn't build.

mruby はコンスタントに新しく変化していくからビルドが失敗することがあってもびっくりしないでね(テヘペロ)。

まあこれは仕方ない。まあいいや。問題は次の。

Currently you can't use the mruby compiler while embedded in an arm7 device. That is why you need to pre-compile the code using mrbc. It will work on the simulator but don't let that fool you into thinking it will work on a device. An app created to compile code would almost certainly have other issues.

現状、arm7 デバイスで mruby コンパイラが使えんよ。それが mrbc を使ってプリコンパイルしてる理由さ。でもシミュレータでは動くけど(以下省略)

おい。ちゃんと読めよ。

まあ arm7 デバイスというのは iPhone 3GS/4/4s の機種なんですが、これらじゃヤヴァいということのようです。iPhone 6+ は arm64 なのでまあ似たような問題があるのでしょう。というか同じだし。

これで解決方法がわかりました。

今までは直接 Ruby のコードを mruby に食わせていたのですが、mruby でプリコンパイルして実行すればいいってことで。今夜やってみたいと思います。