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

# はじめに
同じタイトルで記事を書き始めてもう6年目になりました。月日が経つのは早いものですね。

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

# 今年のふりかえり

## 中四国地区大会プライマリー部門でmrubyチーム（Cookie’s）が三冠 + IPA賞獲得
今年一番のニュースはこれじゃないでしょうか。
　所属の[出雲コアカレッジさんのサイトにも掲載](http://www.icc.core.ac.jp/)されてます。

[ETロボコン中四国大会 優勝 🎊＼(^o^)／👏『楽しくなければプログラミングではない』](http://www.icc.core.ac.jp/et%e3%83%ad%e3%83%9c%e3%82%b3%e3%83%b3%e4%b8%ad%e5%9b%9b%e5%9b%bd%e5%a4%a7%e4%bc%9a-%e5%84%aa%e5%8b%9d%e3%80%80%ef%bc%bco%ef%bc%8f%e3%80%8e%e6%a5%bd%e3%81%97%e3%81%8f%e3%81%aa%e3%81%91%e3%82%8c/)というブログエントリーも書かれています。

CS大会の結果は残念がっていらっしゃいましたが、倒立ではmrubyは不利とずっと言われ続けていた中で世間の思い込みを裏切る実績を見せてくれたことに感謝したいです。
今後の活躍が楽しみですね。

## mruby参加チーム
今年のmruby参加チームは、私の把握できている限りでは3チーム（関西1, 中四国1, 九州北1）だったようです。
中四国以外はすべてアドバンスト（非倒立系）でした。

## 使用されたEV3RT用mruby

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

### [yamanekko mruby-ev3rt](https://github.com/yamanekko/mruby-ev3rt)
私たちyamanekkoが作成しました。今年も中四国のチームが採用してくれました。
今年はマルチタスクや、sharedmemoryを使用したタスク間のデータの受け渡しにも挑戦したそうです。

関西のチームは不明です。[^1]

## 技術教育(ETロボコン限定の話題)

### 教材について
ETロボコンの技術教育は２回に分かれていて、去年までは2回目のみmruby対応していました。
今年は1回目の教材（サンプルコード含む）もmruby化したのですが、諸般の事情で全国展開できず、中四国地区限定配布となってしまいました。
2018年度参加チームの方でしたら、地区を問わず配布可能ですので、ご興味のある方はご連絡ください。（参加者MLに投稿した「ET&IoT Technology 2019 カンファレンスのご案内」というタイトルのメールの送信アドレス（gmail）宛に送っていただければOKです）[^4]

### 教育
昨年度はC/C++と教室を分けて実施を計画していましたが（豪雨で中止）、今年の中四国地区は言語に依存しない形での教育の実施を試みました。ただし、サンプルコードがC/C++またはmrubyのみ提供なので、実質C/C++またはmrubyでの受講という感じでしたが・・・[^2]

### 独自勉強会
中四国地区では、春、夏の2回独自勉強会を実施しました。

今年は地区内でmrubyチームが１つだけなこともあって、独自勉強会でのmrubyネタは控えました。[^3]
いちおうTOPPERSの中の人なこともあってRTOS(EV3RT)の話をしたり、[SESSAMEの状態マシン図設計セミナー](http://www.sessame.jp/seminar/Seminar2019_05/index.htm)(恒久的なページがないので以前の開催のページにリンクしておきます)で好評な「モデルレビュー」の体験などを実施しました。
私の時間はmrubyユーザーに限らず、参加者全員に知っておいてほしい内容にしました。


## yamanekko mrubyについて

### カラーセンサーAPIの追加

昨年度（当時理由は書けなかったけど）予告していたものです。マーカーが灰色から青色へ変更に伴い、青ラインを識別する必要が出てきたため追加したものになります。[^7]

#### color

colorメソッドはいちおう作っておきましたが、例えば、あなたが赤色だと思う色を読ませてもAPIは赤と返さない可能性があることに注意してください。これは、mrubyのメソッドの仕様ではなくて、内部で利用しているEV3RT、もっというとEV3RTが利用しているライブラリの仕様になります。レゴブロックの色判定ができる値になっているらしいという噂はありますが、ソースは未調査です。
環境にもよりますが、コースの緑色は緑と判定されないケースが多いようです。
一般的には、識別したい色だとするRGBの値の範囲を自分たちの測定結果を元に決めることが多いようですね。

#### rgb
RGBそれぞれの値を配列に入れて返します。

#### rgb_part

rgb_partというメソッドも追加しました。
必ずしもRGB全ての値が必要とは限らないよね？ということで、ほんの少しでも速度とメモリ使用量を減らすことができればうれしい人のために作ったものです。
こちらも他のAPI同様にEV3RTの関数を内部で呼んでいるのですが、カラーセンサー自体がRGB全て取得して返す仕様になっています。なので、そもそも論として、brightnessより時間がかかります。

ここで、内部で利用しているライブラリがRGB全て取得してから返してくるのに、なぜmrubyのメソッドをわけたの？という疑問がでてくるかもしれません。
mrubyでRGB３つの値を返そうとすると、arrayを利用する必要があります。一方、R or G or Bのどれか一つだけなら、arrayではなく、普通に値として返すことができます。
誤差の範囲かもしれませんが、読み書きにかかる時間短縮とメモリの節約を求める人のために作ったものです。詳細は後述しますが、EV3の場合はヒープやスタックの使用量はあまり気にする必要がありません。ただし、GCの対象物を減らすという意味では効果がないわけではありません。

言うまでもないですが、２つ以上の値を使うならrgbの方を使いましょう。
内部的に取得した値を保持したりしていないので、都度RGB全ての値を取得し直して、指定された値のみ返すということになってしまいます。

### serial受信APIの追加

コミットログから察してもらえたと思いたいのですが、リモートスタート用に１文字受信できるAPIを追加しました。こちらも昨年度予告していたものです。
とりあえず速度を考慮して、リモートスタート目的に最適化するという意味で、１文字固定にしています。
もっと長い文字列を送りたい要望がありましたら実装するので、その旨お知らせください。

### ヒープの増やし方

複数タスクを作っているとデフォルト設定ではヒープが足らなくなることがあります。
ヒープの増やし方はmruby特有の話ではなく、EV3RT共通の話なので、別途記載します(TODO)


# 来年度向け情報

## mruby 3.0

Ruby3.0対応以外にもいろいろ変わりそうですが、おそらく4月の時点では公開されてないと思いますし、もし出ていたとしてもリリース直後だと思うので、来年度は使わなくて良いかなと思います。
（CRubyとは関係なくmruby独自の変更点としては）内容的にも省メモリになる予定ですが、EV3にはほとんどメリットがないので…。

## mruby 2.1.0

2019年11月に2.1.0がリリースされました。
まだ私の方では動作検証できていないので、動かしてみて何かあれば4月ぐらいまでにはこちらに追記しておきます。
たぶんそのまま使えると思いますが、もし、先に試してみて動かなかったという場合があったとしたら、引数の数チェックが厳しくなったので、(Ex.宣言では引数3個としているのに、2個しか使ってなかった場合など)これまで動作してたものがエラーになってる場合は考えられます。[^8]

## minirakeはやめてRakeを使おう

時間がなくて詳しくは追えていないのですが、(EV3向けではなくmruby全般として)minirakeでビルドできない（エラーが起きる）ケースが時々見受けらるようです。
（私自身も別のマイコン向けのプロダクトですが、取り急ぎRakeに乗り換えてそのままになっていたことを思い出しました:open_mouth: :sweat_drops: ）

以前はRuby(CRuby)をインストールしてもRakeがインストールされないバージョンが存在していたので、Rakeがインストールされていない環境でも動作できるようにするためにminirakeが存在していました。
現時点ではメンテされているRuby(CRuby)にはRakeが同梱されていないバージョンが存在しなくなりました。なので、Rakeがない環境は考慮しなくて良いでしょうと考えました。

具体的にはMakefile内で

```
RAKE = ruby ./minirake
EV3RTの場合だと
RAKE=MRUBY_CONFIG=（mruby-ev3rtのパス）/mruby-ev3rt/build_config_ev3rt.rb ruby ./minirake
```

を

```
RAKE = rake
EV3RTの場合だと
RAKE=MRUBY_CONFIG=（mruby-ev3rtのパス）/mruby-ev3rt/build_config_ev3rt.rb rake
```

という感じに書き換えます。

mruby本体も先日更新されています。
https://github.com/mruby/mruby/commit/de17f63b4567cad3b02f1f1f9386eaf8dd704bbe#diff-b67911656ef5d18c4ae36cb6741b7965




## どれを使う？

以前はGitHubのリポジトリから最新をcloneしてくる方法を勧めていた時期もありますが、最近の状況を見ていると、使い慣れてない人はリリース版をおすすめします。
2.1.0か、去年使っていて問題なかった場合は2.0.1を使い続けても良いかなと思います。


## yamanekko版 mruby-ev3rt

HRP3対応は春までにしておきますが、来年度向けに機能追加は今のところ予定はありません。
もし、あったら嬉しいAPIなどあったら教えてください。 :smiley_cat: 

## 最後に

今年はETロボコン教材の完全mruby化など実施してみましたが、非公開モノの制作はその情報がほしい人に届けられないというジレンマと戦わなければなりません。

今年も初めて会う方からmrubyに関するお話を聞く機会に恵まれました。
やはり情報がほしいという声が多々あり、私自身もより多くの人に届くようにアウトプットしていくのが、私自身も含めてより多くの人が幸せになれるのではないかなと思います。

EV3に関する情報も、ETロボコン参加者以外の方にも興味を持ってくれる人が増えてきました。

なので、公開できるモノの優先度を高く設定することにしました。
というと、ETロボコン向けのサポートは手薄になるの？と不安に感じられたかもしれません。
今年1年間、いろいろ試しながら考えてきましたが、大丈夫そう(方針転換によってmrubyでETロボコンに参加してくれる人が困ることはないだろう)というのが私の結論です。

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

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



[^1]: yamanekko版の資料一式はお渡ししましたが、、、
[^2]: そもそもモデル(UML)教育なので、プログラミング言語に依存しなくて良いはずなのですよね
[^3]: 要望があれば是非やりたいんですけどね
[^4]: ルール上、参加者以外の方にお渡しできないので、参加者であることが証明しやすい方法として参加者MLの内容を提示しただけです。MLに登録できていない参加者の方はひとまずコメントください。
[^6]: ほんと、申し訳なかったです…。
[^7]: 実装をサボってたともいいますね…
[^8]: ミスってる気がします…