来年のETロボコンにmrubyで参加しようと思ってるひとへ(2014年版)

これは、[ETロボコン Advent Calendar 2014 - Adventar](http://www.adventar.org/calendars/614)の23日目のエントリーです。

"ETロボコン Advent Calendarで事前に枠を確保するのは誕生日の法則"が局地的にあったようですが、このエントリーは残念ながら？違います。
昨年の今日、mrubyのAdvent Calendarに記事を書きました。今年はmrubyがなかったのでこちらに書かせてもらうことにしました。毎年どこかにmrubyの話を書き続けられたらいいなあ・・・。そんな気持ちでこのエントリーを書いています。

私はmrubyの中の人ではありませんが、mrubyが一般公開された直後からずっと細々とやってます。
最近は"yamanekko"というユニットで活動しています。直近ではEclipaeとGDBを使ったmrubyのDebuggerについてRubyConfで発表したりしてました。という程度のmruby使いなのですが、EV3になってmrubyでもできるのでは？という声も少なからずあるようなので、"いちmruby使い"として考察してみました。

# mrubyでETロボコン
さて、mrubyを使ってETロボコンに出るには、どうしたらいいでしょう？

## mrubyはどれにする？
実はmrubyと一言でいってもいろいろあります。

ETロボコンで使う想定で、メジャーなものを挙げてみました。
長くなり過ぎるの各々の紹介は省略しますが、いろいろありますね。

* 本家といわれてるもの
https://github.com/mruby/mruby

* 軽量Rubyフォーラム版
http://forum.mruby.org/download/index3.html

* IIJ私家版
(軽量Rubyフォーラム版に既知のバグの修正commitを定期的に追加されています(ただしVer1.0.0のみ))
https://github.com/iij/mruby/releases


* mruby on asp+tecs (TECSがmruby対応している例であげましたが、こちらはEV3対応は現時点ではされていないので注意。)
https://www.toppers.jp/tecs.html#mruby_asp
https://www.toppers.jp/ に「2014-11-18【会員向け】mruby on asp+tecs for ev3パッケージの早期リリース版を公開しました。 」とあるので、来年度使えるかもしれませんね。

* monami-ya.mrb
https://bitbucket.org/monami_ya_mrb/monami-ya.mrb/
機器組込み向けの拡張を行ったものだそうです。(EV3対応はしなさそうですが、試行錯誤してると天から声が聞こえてきそうです;))
詳細については、簡潔にまとまった説明が以下のページにあるので、そちらをご覧ください。
http://www.monami-ya.jp/product/monami-ya.mrb/about/index.html

基本的には「本家」と呼ばれてるもののある時点のバージョンを切り出したり、それに必要な拡張を入れたりしたものになります。
拡張後にバージョンを固定してしまってるもの、本家のバージョンアップに追随していってるもの様々ですので、その点も注意しながら選択するのがよいと思います。

どれを使ってみてもいいと思いますが、私がやるとしたら本家を使って必要ならば改変するかも？というところです。が、実はmonami-ya.mrbも気になっています。
気力体力時間があれば、使い比べてみたいです。

ドキュメントについては、海外の人からmrubyは英語の資料がないからわかんない。とよく言われるんですが、日本語の資料もないですね。なので、ドキュメントが充実してるかどうかを基準で選択するのは無理でしょう（2014.12月現在）。

## OSはどうする？
さて、mruby単体で動かす(いわゆるBare metal)こともできないことはないですが、OSはある方がいいですね。
Linuxという選択肢もありますが、それならmrubyじゃなくてRubyでいいんじゃね？という気がしないでもないですし、ETロボコンの規約という制約がかかると、現状ではTOPPERSの上で動かすのが無難じゃないでしょうか。
と思って調べてみたら、TOPPERSはEV3対応するようですね。

> NPO 法人 TOPPERS プロジェクトでは、LEGO Mindstorms EV3 向けのソフトウェアプラットフォーム（SPF）である EV3RT の開発を進めてきましたが、この度、TOPPERS プロジェクト会員向けの早期リリースを開始することになりました。また、来年の早い時期には、オープンソースソフトウェアとして一般公開する予定です。
https://www.toppers.jp/press/release3-1411.pdf

## 実装は？
TOPPRESの上で動かすとなると、TOPPERSでタスクとしてmrubyを動かしつつ、mruby側からTOPPERSの機能を使う為にはmrbgemでRuby用の拡張を作ればよさそうです。と書くと一見簡単そうに聞こえるかもしれませんが、ここがキモなんじゃないかと感じています。
(mrbgemで実装する)Rubyのクラス設計はRubyのセンスが問われるところです。
Rubyの特長を活かしたクラスが用意されていないと、せっかくmrubyを使っても難しくなってしまうかもしれません。
(私はRubyは得意じゃないので、mrbgemのクラス設計はRubyistに手伝ってもらっています。)
また、場合によってはmrbgemだけではなく、mruby本体にも手を入れた方がいいかもしれません。

もしもmrbgemを実行委員側で用意するとしたら、走行よりもモデリング教育に耐えうる設計にしたいですね。
そうすれば、技術教育の初心者向けモデリング講座はわかりやすくなるんじゃないかなと思ったりしています。

(余談ですが、こういう使い方をしてるとGDB上でCもRubyも一緒にデバッグできると便利なのです。)

私の場合、走行体を持っていないので、試走会あたりでダミーカー使わせてもらうのが現実的なところかなと思います。
もし、走行体を持ってるので試してみてあげてもいいよという奇特な方がいらっしゃいましたらご一報いただけると幸いです。
mrubyに関しては、組込み機器で実際に動かしてみた事例について、詳しく公開されているものがあまりありません。オープンな場所でデータを取って公開できるのはmruby方面からすると貴重な場だと思うので、ぜひやってみたいところです。


# まとめ

思いつくままつらつらと書いてみましたが、一言で言うなら、来年度は、とりあえず試行錯誤が必要な年になりそうです。そして来年それなりのmruby環境ができれば、再来年以降は"Rubyでたのしいプログラミング"と"下回りをチューニングする楽しさ"が共存できていろんな領域の人が楽しめるんじゃないかと思います。
（Rubyは初心者向けにオブジェクト指向モデリングを教えるにもいいですね）

さて、来年mrubyでやってみたいなーと思っていた方はがっかりさせてしまったかもしれませんが、このエントリーを見てmrubyでやってみたくなったという方はぜひ一緒にチャレンジしてみませんか。
そうじゃなければ、来年度は様子見をして、再来年あたりからmrubyにするのがいいんじゃないかなあ・・・。

(GUI開発環境の話はまたの機会に :blush: )