Kishima's Hateda log

はてなダイアリー記事の保管庫

Mac上で、Android向けにmrubyをビルドする

まずNDKをダウンロードしてくる。
http://developer.android.com/sdk/ndk/index.html
こちらを参考に、ndk-buildでビルドしてみようとしたのですが、見に行くパスが変な感じになってしまい、追うのがちょっと面倒そうなので、直にビルドした。
たぶんやり方はあるのだと思う。

make: *** No rule to make target `/Users/kishima/Develop/android-ndk-r8/sources/cxx-stl/stlport/../../tools/mruby/mruby.c', needed by `/Users/kishima/Develop/mruby/ndk_mruby2/jni/mruby/android/obj/local/armeabi/objs/mruby/__/__/tools/mruby/mruby.o'. Stop.

android-ndk-rX/toolchains 以下のコンパイラを使ったり、android-ndk-rX/platforms 以下のヘッダとライブラリをパスに加えれば、特に難しいことはないのだけど、いくつか個別にオブジェクト(crtbegin_dynamic.o, crtend_android.o)が必要なのと、ビルドの途中でmrbcが必要になるのでそこは注意しないといけなかった。

mrbcが必要な理由は、下記の説明が詳しい。
http://www.oki-osk.jp/esc/mruby-oa/02.html

mrblib/ の下には Ruby 言語で書かれたクラス定義とモジュール定義が array.rb 等のファイルとして置かれている。 まず,これらをすべて連結して1本のファイル mrblib/mrblib.rbtmp を作成する。

Ruby 言語で書かれた mrblib/mrblib.rbtmp を -B オプション付きの bin/mrbc で中間言語コンパイルし,C 言語配列として表現された中間言語コードへと変換する。 -B オプションの引数は C 言語配列名,-o オプションの引数は出力ファイル名である。 そうして得られた出力ファイル mrblib/mrblib.ctmp を mrblib/init_mrblib.c と連結して1本の mrblib/mrblib.c を作成する。 mrblib/init_mrblib.c には C 言語配列で表現された中間言語仮想マシンに読み込ませて実行する C 言語関数が書かれている。

エミュレータ上で動かしてみると

# ./mirb
mirb - Embeddable Interactive Ruby Shell

This is a very early version, please test and report errors.
Thanks :)

> puts "Hello World"
Hello World
=> nil

単にRuby動かしたいだけなら、(リソースに余裕があれば)Android上で普通のCRubyでも動かせられる*1ので、libmruby.a をどんな風に使うかがmrubyのポイントかと思う。
リソースが無い環境も一つのポイントだけど、そういう環境でどこまでmrubyが使えるものなのかは、追ってもう少し調べてみたいところ。最近は組み込みと言っても広いので人によって思うところがずれがちなので、必要リソースをきちんと定義できればいいなと思う。

mrubyとluaのバイナリサイズ

寝る前にちょっと調べてみた。

比較対象とか

  • mruby

commit 85901e05469d644e2bb63700fbd1bbc80934dc0d
Author: Yukihiro Matsumoto
Date: Sun Jun 10 21:44:57 2012 +0900
で作ったbin/mrubyをstripしたもの

lua-5.2.0
http://www.lua.org/ftp/
で作ったsrc/luaをstripしたもの

gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)

結果

size
mruby 458,212 byte
lua 199,088 byte


mrubyが500KB切ってluaに近づいてる。
5/17版のmrubyで、904,920 byteだったので、約半分になってる。
オブジェクトファイル見た感じだとやはりパーサが特に大きい。

次はメモリの消費具合を調べてみるつもり。あと何に適用していくのが良いのか。

いつの間にかxcodeのプロジェクトファイルが含まれてた。@masuidrive さんもバリバリ開発されているようだ。

Panda boardでAndroidを動かす。


先日、Panda board(無印)が届いたので、とりあえずAndroidを動かしてみた。Beagle boardの時はなかなか上手く行かなかったのでどんなものかと思ったけれど、すんなり動いてくれました。
Beagle boardのときはSDカードが不安定だった反省を生かして、実績のありそうなSanDisk SDHC 8GB class6 を準備しました。

まずは動作確認。
http://pandaboard.org/content/resources/troubleshooting
こちらのイメージで基本機能をチェックできます。

特に問題無し。

そしてAndroidのビルドを。ICSがビルドできる環境はあらかじめ準備しておきます。
Solaさんが公開されている手順でAndroid4.0.4をビルドしてみます。毎回お世話になります。
http://blog.sola-dolphin-1.net/archives/4199002.html
Core i7 2600 4コア(8スレッド) メモリ16GB で4時間かかりました。

特に修正することなく動いてくれました。
タッチパネル、無線LAN、キーボード、それぞれ問題ないようです。動きもそんなに遅くないです。

4.0端末も持っていないので、今後はこちらをベースにフレームワークいじったりする実験台にしていこうと思います。

mrubyとMobiRuby

MobiRuby支援ってことで、Matt AimonettiさんのmrubyとMobiRubyについての記事を翻訳してみました。
英語力不足で文意が汲めてない部分があるかもしれませんが、何かあればご指摘頂ければ嬉しいです。*1
Apr 20th, 2012 "Mruby and MobiRuby"
http://matt.aimonetti.net/posts/2012/04/20/mruby-and-mobiruby/


2012/4/20
今日、二つの大きなRubyのニュースが日本でありました。

私がMacRubyプロジェクトに参加してるためか、このニュースについてどう思うかと聞かれることがありました。

mruby

mrubyは新しいプロジェクトではなくて、RiteVMに基づいたものです。これは経産省の援助*2と、Rubyの作者であるまつもとゆきひろ(Matz)氏によって主導されたもので、詳しくはMatzのRubyConf2010の基調講演で説明されたものです。
2011年11月にもmrubyについてMatzは述べています。そのときの話は記録されています。そこで彼は、現在のRubyのエコシステムについて、そしてなぜmrubyなのか、ということについて詳しく述べています。

mrubyの主な目的は、組み込み適用可能で、そのためにより小さなフットプリントを持ち、別のアプリケーションの中に入るようにコンパイル、リンクできるRubyを作ることであると、述べられています。

なかむらひろし氏はmrubyについてとても良い1行の定義を与えてます。

mrubyは、ゲーム開発者(Luaを使うのではなくて)、組み込みアプリケーション開発者(デバイス、TV、携帯)、少ないメモリフットプリントのサーバアプリケーション(インスタンスとしてJSを使うのではなくて)、をターゲットとしています。
私が個人的にmrubyについてとてもワクワクしています。それはまだここにはなく、そしてプロジェクトの価値を達成するためにやるべきことがまだたくさんありますが、これはまさしく正しい方向への大きな一歩です。このプロジェクトのもうひとつ本当に良い点は、我々皆が貢献でき、企業もそれぞれの必要性に基づいて実装を発展させることを許すOSSライセンスでリリースされていることです。

まとめ

mrubyはまだ発展途上ですが、前途有望なプロジェクトです。もう一つのRuby実装であることに加えて、ターゲットの利用者とプロジェクトのスコープはしっかり定められており、Rubyの制作者の先導と日本政府の援助があるという事実は、プロジェクトが成功することを信じるに足るものにしてくれます。Luaはシンプルな言語であり、その対象とするマーケットですでによく実装されていると述べていることから、Matzと彼のチームと日本政府は、この新しい技術を推奨し擁護していく計画をきっと持っています。彼らの幸運を祈ります。そして私も継続して注意深くこのプロジェクト見守っていくつもりです。

追記:mrubyの導入ガイドを書きました。
http://matt.aimonetti.net/posts/2012/04/25/getting-started-with-mruby/

MobiRuby

MobiRubyはJSでネイティブのiOSAndroidアプリを書くことができるTitaniumプラットフォームで有名なAppceleratorで働く増井雄一郎氏によって開発されています。
MobiRubyは、Matz新実装に触発された開発者が行うmrubyの上に築かれた最初のデモンストレーションとなるものです。mrubyとよく似て、MobiRubyはOSSライセンスでリリースされますが、ライセンスとしてはApacheライセンスが選択されています。
これまでのところ、アナウンスされたのはコードサンプルとスクリーンショットです。これはHackersNewsのトップページを飾るに十分でした。作者はここ数ヶ月にうちに最初のバージョンをリリースすることを予定してるそうです。

いくらかの驚きがあったかもしれません。MacRubyといくつかの部分で競合するものですが、それでも私はこのような類のプロジェクトとまみえることを喜ばしく思ってます。

これは二つのことを示しています。

  • モバイル機器でRubyを内部に持つことについて強い興味があること
  • 技術的にこのようなことが可能であること

これはどちらも新しいことではありません。しばらく前からLua言語でiOSアプリを書くことは可能ですが、依然としてObjetice-Cを使っているのがiOS開発者の多数派です。Objective-Cを置き換えるため、実装に際した課題は何でしょうか?

置き換えた言語がCocoaのデザインと合わないかもしれない

iOS/OS Xアプリを開発するということは、あなたが提供されたライブラリ(Apple用語ではframeworksと呼ぶ)を使うのに時間を費やすということです。これらのframeworksは特有のパターン、しっかり定義された文法を持ち、通常とても一貫性がある/制約された方法で動作します。または、あなたの言語はかなり似ていて(Rubyのように)、そして移行は簡単です。そうでなければ、あなたはメンテナンスするためのラッパーを書き始める必要があるでしょう(titanium)。

ブリッジランタイム

2つのラインタイムを同時に持つのは、野心的ですが、効果的ではありません。これは、MacRubyについて、ブリッジであるRubyCocoaからの移行とObjective-Cランタイムで動作するRuby実装を持つことを、なぜAppleが後押ししたのかの理由のひとつです。これは他のことも認めることになります。MacRubyにおいて全てのオブジェクトは実際にObjective-Cオブジェクトであり、これはRubyコードから展開されたCocoaAPIなどを変換する必要がないことを意味しています。

サポート

これは多くの人にとって重要なことです。よい支援、サポートがない技術に基づく大きな次のプロジェクトを受け持つことを望まないことはしばしばあることです。もし異なる代替の実装を用いてあなたのアプリをビルドすることになり、突然開発者がうんざりして、異動または転職してしまうならば、何が起きるでしょう? Apple/Googleが行うプラットフォームのアップデートに求められているようなアップデートについてはどうでしょうか? これは代替を選ばない最も良い理由ではないと思われますが、"安全" を求める会社にとっては理解できる理由です。

Cocoa

iOS/OX Xアプリケーションを書くときに、Cocoa APIはその課題のおよそ90%を占めてます。強力で効果的なAPIですが、学習して使えるようになるのは、しばしば大変なことです。
誰かが参考書を書き、かつまたは大量の文章を変換し、メンテナンスすることが求められているおり、あなたはObjective-Cのみの事例たちとドキュメントテーションの課題を抱えています。
また、Appleから提供されている全てのツールを持っていても、それらのツールチェインを使っていないことがあるため、ツールのすべてを使うことができません。
率直に言って、MacRubyを使って何年も過ぎた後、このようなプロジェクトの実際の価値は簡単な文法ではなく、むしろ、繰り返し作業周りのラッパーと上位レベルのインタフェースの生成を簡単に行えることなのではないかと考えています。上手くデザインされたDSLのMIXを持ちつつも、なおかつネイティブオブジェクトへのアクセスはとても強力なものです。

Objective-C は発展している

Objective-Cは発展しており、ARCの導入でメモリ管理はとても簡単になりました。clangの最新版はObjective-Cでは、新しいリテラルとオブジェクトによる添字記法によって、文法がより便利になっています(詳しくはこちら)。実は、Objective-C の文法はますますRubyのものに近づいてきているのです。代替案を使うという選択肢を選ぶことはますます難しいものとなっています。

// character literals.
NSNumber *theLetterZ = @'Z';          // equivalent to [NSNumber numberWithChar:'Z']

// integral literals.
NSNumber *fortyTwo = @42;             // equivalent to [NSNumber numberWithInt:42]

// floating point literals.
NSNumber *piDouble = @3.1415926535;   // equivalent to [NSNumber numberWithDouble:3.1415926535]

// BOOL literals.
NSNumber *yesNumber = @YES;           // equivalent to [NSNumber numberWithBool:YES]

// Container literals
NSArray *array = @[ @"Hello", NSApp, [NSNumber numberWithInt:42] ];
id value = array[idx];

NSDictionary *dictionary = @{
  @"name" : NSUserName(),
  @"date" : [NSDate date],
  @"processInfo" : [NSProcessInfo processInfo]
};
id oldObject = dictionary[key];
dictionary[key] = newObject; // replace oldObject with newObject
性能

バイスがどんどん強力になっているとはいえ、性能はしばしば重要な問題となります。Appleは彼らの言語のためのソリューションの性能を最適化しました。もしTitaniumアプリを開発してきたならば、性能は問題とすべき事柄の一つであり、優れた性能を得るためには回避策を探す必要がある場合があることを知っていると思います。

まとめ

MobiRubyがリリースされると、これらのことに基づいてよりよい判断をすることができると思います。しかしこれまでの経験から、封を開けたばかりの状態でのMobiRubyの文法と性能については非常に心配しています。ですが結果は時間が教えてくれるものですし、問題は常に改善されていくでしょう。Ruby on iOS/Android はエキサイティングです。ファーストベータを試すことを楽しみにしています。

*1:id:naohaq さんコメントありがとうございます

*2:経済産業省の地域イノベーション創出研究開発事業 http://www.meti.go.jp/policy/local_economy/tiikiinnovation/22fy_inoberd.html

軽量Rubyの状況まとめ

4/28追記:まだ正式ではないけど公開されたよ! https://github.com/mruby/mruby

神よ 未だ生まれぬ神よ
御身への想い押さえがたきに
我が身は今やはりさけぬ
古橋秀之ブライトライツ・ホーリーランド

そろそろ軽量Rubyが公開されるらしい、との話なので、現状見つかる情報を調べてみました。
ほんとは2月の東京Rubyプレゼンテーション2012に行けていれば色々分かったと思うのですが、行けなかったのでネットにある情報を検索してみた次第です。
以前は"Armadillo9でRubyを動かす。"とかやってたりしたこともあり、組み込みスクリプト言語には色々期待してるので、楽しみ。
公開されたら色々遊んでみる予定。

構成

  • mruby

 コンパイラ、RiteVM、ライブラリなどを含めた総称

  • RiteVM

 YARVに相当する部分

 VM自体をハードウェア化するのではなく、性能的に重要な機能をエンハンスするもの。(例:ハッシュ、GC)必須という訳ではない。

ターゲット

OSは選ばず動作するように、各種のシステムコールには依存せずC99の範囲で実装されている。Linux、μITRONVxWorksなどで動く。
対象領域としては、まつもとさんの発言によれば、

  • 携帯電話
  • ロボット
  • TV

など、とのこと。
ハードウェアリアルタイムな制御まで行うことは想定していないようなので、比較的高級な組み込み機器への適用を想定しているように見えます。なのでロボット制御とかには向いてなさそうですが…。

こちらの動画を見ると、RubyのソースをC言語へ静的変換しているようです。どういう関係なのだろう。(ETロボコンの開発環境の一つとして検討されているようです)
こちらの資料だと、まずは産業向けの通信装置として使うことをとっかかりにしていきたいとあります。
μITRONのタスク間通信などはどんな感じに実現されるのだろうか?

特徴

mruby

  • RiteVM
  • parser
  • code generator
  • mruby Ruby lib
  • mruby C lib
  • binary I/O

RiteVM

  • 32bit word machine
  • incremental GC
  • single thread
  • register machine
  • 必要なメモリは数MB程度

機能

  • 省メモリ
  • ブロック,Proc,lambda、例外など対応
  • 割り込みには非対応
  • evalはライブラリとして提供されるコンパイラを組み込むことで、実現可能

プロファイル

  • minimal

 最小構成

  • standard

 IEC/ISOの範囲

  • full

 CRuby

公開時期

2012年4月ごろgithub?で公開らしい。
こちらあたりで告知があるのかもしれない。

ライセンス

BSDライセンス、もしくはMITライセンスを検討するとニュース記事にはあったけど、最終的にはどうなるんだろうか?少なくとも制限が強いライセンスにはならないようだけど。

研究開発してるところ

その他

2012年のこと

抱負を書こうかと思っているうちに2ヶ月以上過ぎてしまった…。
昨年の10月あたりから久しぶりに開発的に忙しくなってきて色々その他のことがおろそかになってしまっていて、最近は流石に危機感があります。
昨年のことは結局あまりできてない。その理由に地震のあとに考えが色々ぐるぐる巡ってしまっていたのもあるし、仕事内容が変わってそちらの勉強に時間を割いたせいもある。その他の個人的な事情でも変化があった。
何がどう変わったかについては、個人的な話なので割愛するけれど、今まで正しいと思っていたことにもさらに一歩引いて考え直すようになったことが外部的な変化だと思う。良いかどうかも分からないけれど。

自分の力の無さは痛感しっぱなしなので、今年も力を溜めることは続けなきゃいけないし、単なる自己満足に終わらないですむようなやり方と、アウトプットの道筋を見いだしていきたい。
技術的な方向性ややりたいことについて、ちょっと迷いが生じているので、まずは方向性からです。

そのための余裕をもつにも目の前の仕事はもっとテキパキこなせるようにならんといかんですね。

TokyuRuby会議04に参加&お手伝いしてきました


肉の吉日10/29に開催されたTokyuRuby会議04に、スタッフとして参加してきました。
http://regional.rubykaigi.org/tokyu04

当日の雰囲気とかはTogetterなどを見ていただければ伝わるのではないかと思います。
http://togetter.com/li/197803

今回も、べろんべろんになりつつも、LTしたり、交流したり、独特の空間が生まれていました。Rubyのコミュニティにもっと触れてみたいという希望がある方にとっては、いろんなRubyistに酒に酔った勢いで交流できる良い機会なんではないかと思います。
Rubyに限る話ではないんですが、技術には興味を持ちつつも、あんまり勉強会などで幅を広げることに興味がない同僚などにも来てほしくて、そのためにはどうすればよいのか?というのは自分の最近の考え事だったりします。全くの初心者向けの導入をもっと気楽にやる方法ってなんだろう、という。
仕事からみだとRubyはほぼ関係ないので、Androidとかだとまだ関係がありそうなので、どうかなあ、とか。またそれは追々なのです。
いずれにせよ楽しい一日でした。関わった全ての方に感謝を。(Tシャツのデザイン素敵でした)

あみだくじ

何となく恒例になっているあみだくじによる抽選LTですが、毎回同じなのも芸がないので、今回はアニメーションを付けてみました。
で、何を使おうかと考えたところ、先日のHTML5とか勉強会で紹介されてたenchant.jsを採用してみることにしました。(Rubyと関係ないだろ、とか言わない)
enchant.jsとはUEIが公開している、Javascriptでゲームを作るためのエンジンのことです。JSなのにフレームレートを指定して、スプライトが使えるってあたりに、ぐっときて試してみたかったので、試してみました。BASICでスプライトとか触ってた人間にはたまらないです。
で、簡単ですがこんな感じでできあがりました。

サンプル。
そもそもJSに慣れてないのは差し引いて、ちょっとしたゲームを作るのはかなり簡単にできる印象です。また何か作って遊んでみたいですね。Rubyで同じくらい手軽に作れるとベストなんですが。
ソースは下記にupしてます。
https://github.com/kishima/Amida-js

ビール力の測定

以前、思いつきで作ったスクリプト(「TokyuRubyKaigi03におけるビール力の推定」)をリアルタイムに動かしてみたかったので、当日に作ってみました。
動かした結果が下記のような感じです。
http://silentworlds.info/beerpower.html
前回よりも多いビールパワーが観測されたようですね。