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

# はじめに
同じタイトルで記事を書き始めて5度目になりました。

昨年同様、ETロボコンに限らず汎用的に使える内容にしましたので、ETロボコン参加者以外のmrubyユーザーさんにも参考にしていただけると幸いです。

これを書くにあたって[去年の記事](https://qiita.com/yamanekko/items/5d6fe00b704c2fa8e710)を読み返してみました。去年は私自身が情報収集に苦労しましたが、今年は中四国地区に１年間継続して関わらせていただき、気づきがたくさんありました。これらについては、今後の活動に反映させていきたいと思います。

# 今年のふりかえり
## mruby参加チーム
今年のmruby参加チームは、私の把握できている限りで5チーム（東京1, 関西1, 中四国2, 九州北1）ありました。
2チームが初参加, 使用するmrubyを変えたチームが1、他2チームは昨年度からの継続使用です。東京、九州北がアドバンスト、それ以外はプライマリーに出場だったようです。[^5]

## 使用されたEV3RT用mruby
### [mruby on EV3RT+TECS](https://www.toppers.jp/tecs.html#mruby_ev3rt)
TOPPERSのTECS WGで作成されています。TECSコンポーネントを使用して作られています。
東京と関西のチームが使用していたようです。

### [mruby-toppers-ev3rt](https://github.com/mimaki/mruby-toppers-ev3rt)
軽量Rubyフォーラムの中の人が作成したものです。SCSKさんのチーム(アドバンスト)が毎年使用されているようです。

### [yamanekko mruby-ev3rt](https://github.com/yamanekko/mruby-ev3rt)
私たちyamanekkoが作成しました。今年は中四国の２チームが最終的に選択してくれました。[^6]
今年はバイトコードにして使う方法を教えてしまいましたが、よくよく考えると、いちいちバイトコードにビルドしなくても、Rubyスクリプト(*.rbのファイル[^3])を読み込んで実行する方法が手間がかからなくて良かったかなと思いました。
ETロボコン以外の競技で使用したい場合で、書き込むプログラムが１つだけという制限がある場合、ある程度動作するまではRubyスクリプトを実行する方法で作成し、だいたい動くようになってからバイトコードに変換する（1つの実行ファイルにまとめられます）と良いと思います。

## 教材について
### 技術教育(ETロボコン限定の話題)
昨年度から技術教育資料（参加者限定）にmruby版を導入しました。
~~大人の事情で~~ 昨年度はmruby on EV3RT+TECS版を作成してみましたが、利用報告がなかったことと、今年度、中四国地区で全国初mrubyでの技術教育を実施する予定だったことからyamanekko版を作成しました。
残念ながら技術教育2自体が豪雨で中止となり、後日超短縮授業となったため、本来予定していた内容を実施することはできませんでした。

### 独自勉強会
中四国地区では、春、夏、秋の３回独自勉強会を実施しています。秋は地区大会後に実施するので大会へ向けての教育に使えるのは春、夏２回となります。
私自身がmruby担当として呼ばれてはいたもの、TOPPERSプロジェクトにもお世話になっているので、開発言語に関係ないTOPPERSに関する話題と、mruby独自の話題の配分には気を配りました。
他の方のエントリーを読むとmrubyに限らずTOPPERS関連の資料探しにも苦戦されているようだったので、反省も込めて独自勉強会で使った資料を改変して（技術教育教材に言及していたところをすべて公開サンプルコードで解説するように書き直しました）置いておきま~~す~~した。~~（12/24公開予定）~~

- 春に実施した[mrubyとEV3RTの紹介](https://www.slideshare.net/yamanekko/ev3rt-and-mrubyev3rt-2018ver-126582367) （非mrubyユーザもEV3RT部分が参考になると思います）
- 夏に実施した[ざっくりした要望から仕様を確定し、モデルを作成しコードに落とす](https://www.slideshare.net/yamanekko/model2code-mruby-2018) (解答例はmrubyですが、他の言語でも参考になると思います)



## yamanekko mrubyについて

これまで自分たちでは[Sessalet](https://www.youtube.com/watch?v=KB_ipS9CxIo)をはじめ、いくつかのプロダクトを作成していましたが、第三者に使用していただいたのはおそらくはじめてだったかと思います。改めてありがとうございました！

### API一覧
[yamanekko版mruby-ev3rtのAPIリファレンス](https://qiita.com/yamanekko/items/b5c8f6fcbd61daa40307) 突貫工事ですね！というレベルのものです :sweat_drops: 

### shared memoryの追加
タスク間で変数を受け渡ししたいという要望があったので、ひとまず数値のみ対応しました。

# 来年度向け情報

## mruby 2.0
無事mruby 2.0が公開されましたね。
まだ日が浅いので何か潜んでいる可能性もないとは言えませんが、とりあえず12/1の記事(TOD0:サンプルコードの動作確認)は動作するようです。

[変更点は軽量Rubyフォーラムのサイト](http://forum.mruby.org/download/index9.html)に記載されています。
ここではEV3RTで使う場合に気をつけることをお伝えしようと思います。（ETロボコン限定ではなく、TOPPERSのOSを使う場合に適用されます）


### バイトコードの変更
mrubyの変更として一番大きいのはこれじゃないでしょうか。
ただ、ユーザーとしては、古いmrubyでビルドしたバイトコードは実行できませんよ、新しいmrubyでビルドし直したら（その他の変更箇所と関係していない限り、基本的には）使えますよ、というだけの話です。
EV3RTユーザーとしては以下にあげたものが関係するかもしれません。

### mruby-sleepは使えない

間違って使ってしまいそうな人が出て来かねないなと思ったので、いちおうあげておきます。

mruby-sleepというmrbgemが標準配布物に含まれるようになりましたが、 **EV3RT版のmrubyの場合、このmrbgemは使ってはいけません**。
**sleep関数相当のものはどのEV3RT用のmrubyにも必ず実装されているので、そちら（OSの機能を使ったもの）を利用してください。**

### mrubyコンパイラ (mrbc)に`--remove-lv`オプション追加
（どうでもいい話ですが）RubyKaigi 2019の発表ネタのうちの一つです。無事採用されてよかったです。
これはRAMの小さいボードで使用すること想定で作ったもので、EV3で使いたくて作ったものではない（EV3で動かす分には必要ない）ものであることに注意してください。（ただ、TOPPERSのタスクを大量に作ると mrubyのVMがタスクの数分作成されることになるので地味な削減が効くケースもありうるかもしれませんが・・・）

身もふたもない言い方をすると、EV3RT上で使う分には毒にも薬にもならない感じですかね・・・。

### メタプログラミング機能のmrbgem化
一部のメソッドがmruby-metaprogというmrbgemに移動しています。
自分で使っていなくても、利用しているmrbgemやmrubyのメソッドなどの中で使用されている場合があります。その場合はbuild_config.rb(yamanekkoの場合はbuild_config_ev3rt.rb)でmruby-metaprogを追加してください。

```
conf.gem :core => "mruby-metaprog"
```
こんな感じで。

該当するメソッドについては[軽量Rubyフォーラムのサイトの  2. メタプログラミング機能のmrbgem化](http://forum.mruby.org/download/index9.html)を参照してください。

参考）
これに該当する場合は、ビルドに失敗しますが、エラーメッセージの内容からは予測が難しい気がします。
なんか全然わからんエラーになった（悩）というときは、これを疑ってみるのもよいかもしれません。

ぶっちゃけ、もともとついていたものが外れたものなので、よくわからなかったら、とりあえずつけておく。という策もありかもしれませんね。



## yamanekko mruby
~~やるやる詐欺にならないよう~~来年度に向けて春までに実装しておくものを挙げておきます。

- Bluetooth経由でのテキスト送信（リモートスタートができない状態でした、すみませんでした）
- カラーセンサーの色判定メソッド[^1]（プライマリーで不要なので~~さぼっていました~~未実装でした）

上記２つがあれば、プライマリー、アドバンストともに今年の競技で必要なものは揃うはずです。
もし、来年度新しい何かが必要になれば、判明し次第実装する心づもりです。
あといくつか考えているものがありますが、それはできてからのお楽しみ。
もし、あったら嬉しいAPIなどあったら教えてください。
というわけで、ぜひyamanekkoのご利用をご検討くださいませ！

## ETロボコン向け情報

来年度も中四国地区で活動を続けられそうです。来年こそお天気に恵まれ、mrubyでの技術教育を実現したいです。
教材はC++版が完成してからの移植になるので、どうしてもリリースが遅くなってしまいます。中四国地区合わせで作成すると思うので、他の地区の方で使用したい方がいましたらコメント欄にてお知らせください。[^2]

# 最後に

ちょうど一年前、「かなりの工数がかかる割には利用者がいないのでmruby版も作成するかどうかは悩ましいところ」なんて書いて矢先、思いがけず中四国地区からお声がけいただき、 ~~やらざるを得ない状況になってしまい、正直時間的に辛かったですが、~~ 最終的に2チームも採用していただけるという yamanekko mruby にとって、とても嬉しい出来事がありました。

難所に関しては私の方では手が回っていない状況です。特に、階段、シーソーあたりでC/C++とmrubyで違いが出るのかあたりを試すことができていません。
難所の実験を手伝っていただける方がいれば、お声がけいただけるととても有難いです。

また、ETロボコンに限らず、使ってみたいという方がいらしたら教えてください。ご意見、ご質問、ご要望等あればコメント欄、メール、Twitterなどでお知らせください。

Rubyで楽しく開発をしていきましょう！



[^1]: ただTOPPERSのAPIを呼ぶだけだと微妙な気がしているので一工夫必要かなと
[^2]: とはいっても他の地区ではmrubyで技術教育を受講はできなさそうですが
[^3]: 厳密に言うと拡張子は関係ないのですが、ここはRubyコードが書かれたファイルという意味でとらえてください
[^5]: 要するに継続参加のチーム＝アドバンストとも言えますね
[^6]: 決して誘導したわけじゃないですよ、念のため