**********************************************************************
セッション  :s5a
テーマ    :Nervesでなにつくろ?
コーディネータ:高瀬 英希(京都大学/JSTさきがけ/NervesJP)
パネラ    :山崎 進(北九州市立大学)
日時     :2020/08/21(金) 15:10~16:20
参加人数   :13名
**********************************************************************


■ やりたいコト
・「ナウでヤングなcoolな」Nervesを思い出そう or 新しく知ってみよう!
・こんなことがいいかも?の使いどころをつかもう!
・じゃあこんなものに使えるんじゃね?のアイディアを語り合おう


■ アジェンダ
1. アイスブレイク(自己紹介) [5min]
2. Elixir/Nervesの紹介 [20min]
3. アイディアソン進め方の説明 [5min]
4. Nervesでなにつくろ? [30min]
5. わかちあい・まとめ [10min]


■ 1. アイスブレイク(自己紹介)
Googleスプレッドシートを用いて各自以下を書き込みして自己紹介を実施.
 1. お名前は?ニックネームでもOK!
 2. どんなことしてます?作ってます?
 3. 普段よく使う言語は?
 4. Elixir/Nervesは使ったことある?


■ 2. Elixir/Nervesの紹介
● Elixirについて
・Elixirとは...Zenである!! Zen言語ではない."禅"を指すので注意.
・Elixirは,Erlangの良さとRubyの書きやすさを併せ持った言語
 −電話交換機向けに作られた言語:Erlang
  Erlangは30年ぐらい前からある言語であり,このErlangのVM上で動く
  Erlangを書きやすくメタプログラミングした言語とも言う人もいる
 −Erlangは文法的に堅くて書きにくい所がある.これをRubyを基に書きやすくした
・Elixirの採用例
 → Discord,ペプシコーラのeコマース,ロマサガのオンラインゲームほか
・ElixirはなぜZen(禅)なのか?
 −関数にデータを流す為にパイプ演算子を多用する.
 −シェルスクリプトのパイプと同じ概念
 −プログラム構造をスッキリかける=Elixirは禅である
・Elixirの気持ちよさ
 −色々あるので省略.
 −1つだけ述べると...組込み/IoTのデバイス開発に使う場合,各プロセスの生死の監視,
  復帰処理が容易に実現できる
  → 結果,Elixir使うと高い堅牢性を持つシステムが作れるのでは?

● Nervesについて
・Nervesは以下の3つの特色を持つ
 → Platform / Framework / Tooling
・Platformについて
 −ファームウェアが小さい
  Nervesの下回りは組込みLinux.
  ブートローダ+rootfs+Erlang OTP+Elixirアプリ → 1つのファームウェアとして捉える
  このファームが小さい.大きくても30MB以下(実際は15~16MB程度で実現できる事が多い)
 −ブートローダ及びファイルシステムが二重化している
  → 片方(A)の領域で障害が起こっても,もう片方(B)の領域に切り替えてAの障害を復旧する.
   といった事が可能
・Frameworkについて
 −IoTデバイス向けのライブラリが充実
  ・GPIO, I2C, SPI, UARTのライブラリは,Elixir Circuitsとしてオープンソースで提供されている
  ・ネットワーク関係のライブラリも充実.設定ファイルを書くだけでインターネットに繋がる
 −ElixirはWebアプリで活躍している
  → ElixirのWebアプリ向けの有益なライブラリをNerves上で動かすことが可能
・Toolingについて
 −通常のElixirアプリと同じように開発ができる
  ベアメタルな部分はクロスコンパイラが裏で走る
 −SDカードで書き込んで読み込むほか,VirtualEthernet経由での書き込みが可能
 −NervesHubが非常に強力
  → Hostで開発したファームウェアを遠くにあるデバイスへリモートデプロイする為の仕組みがある
・ターゲットデバイス
 RaspberryPiとbeagleboneシリーズが主要デバイス
 これら以外のSoCやシングルボードでもカスタマイズすれば動作可能

● 山崎進が思うNervesの使いどころ(3つ)
 ① ネットワーク越しのアップデートを行えるIoT機器
 ② LANとインターネットを繋ぐゲートウェイとして
 ③ 即応性を持った計算集約資源として

● 実際,Nervesでできたモノの事例紹介
・Nerves Weather Forecast
 → NervesからLivedoor天気情報を取得してTwitterに投稿するシステム
・Elixirでラズパイカメラ(オムニアイ)
 → QRコード読み込み,画像のリサイズ・エフェクト,映像のストリーミング配信などが可能
・Nerves Kiosk System
 → ラズパイ3+タッチスクリーンでリアルタイムWebUIを実現
・実製品への採用事例 → LeTote, Hop, FarmBot


■ 3. アイディアソン進め方の説明
・ブレイクアウトルームを使って小グループに分けれて実施.
 この時点でMTGルームは12名.パネラ陣を除くと9名 → 3人1グループで実施
・グループごとにアイディアソン → 最後にわかちあい という流れ
・アイディアソンのお題は3つ
 ①どんなIoTのお困りごとがある?こんなことを解決したい!みんなでいろいろ挙げてみよう!
  どの課題を深堀りするか,最後に選ぼう!
 ②こんなIoTシステムを作ればいいのかも?選んだ課題の解決策を考えてみよう!
 ③それElixir/Nervesでできたら素敵じゃない?Nervesの気持ちよさがどう活きるかな!?


■ 4. Nervesでなにつくろ?
・3グループに分かれて実施(30分間)


■ 5. わかちあい・まとめ
※.◎をつけた課題が①で選択した深堀りする課題

● ルーム1
① どんなIoTのお困りごとがある?こんなことを解決したい!みんなでいろいろ挙げてみよう!
 ・IoT gateway装置(ゲートウェイ部分のみ)
 ◎遠隔監視 → (三密回避)
 ・顔認識によるセキュリティゲート(分散コンピューティング)
 ・{ドローン・ロボット?}の自立制御、多数で自動連係して捜索する・マップを作るなど
 ・Music player(ボツ)
 ・交通量調査デバイス(人用)

②こんなIoTシステムを作ればいいのかも?選んだ課題の解決策を考えてみよう!
 ・カメラによる人の認識、込み具合の把握、気象データ類(温度湿度・・・)の収集などができる
  ものを作れたらうれしいかも?

③それElixir/Nervesでできたら素敵じゃない?Nervesの気持ちよさがどう活きるかな!?
 ・なし

【ルーム1の議論まとめ】
人の密を遠隔監視で回避する.というテーマを深掘りテーマとして選択.
IoTシステム作る事を考え出すと情報が足りず.②までで時間切れになりました.

● ルーム2
①どんなIoTのお困りごとがある?こんなことを解決したい!みんなでいろいろ挙げてみよう!
 ・頼まれてつくったロギングモジュールのメンテナンスが難しい。
 ・拠点分散開発しているのでレビューが難しい
 ・MQTT-SN GWのメインテナンス後継者が必要。わかりやすい言語で再構築したい。
 ・デバイスの省電力化
 ・920MHz帯の通信の安定化

②こんなIoTシステムを作ればいいのかも?選んだ課題の解決策を考えてみよう!
 ・今はまだ個数が少なくて面倒なだけですが、結構似たようなものが今後も出そうです。
  人的リソースも少ない

③それElixir/Nervesでできたら素敵じゃない?Nervesの気持ちよさがどう活きるかな!?
 ・ノードの一発更新は魅力的です。ただ、Linuxベースなのでコスト的にまだ見合わない。

【ルーム2の議論まとめ】
様々なバックボーンのメンバであったので,IoTって何だろう?というディスカッションからスタートした.
関数型言語であるElixirはC/C++とかなり設計思想が異なるでは?と感じた.言語仕様が良くとも,それを
活かす設計思想やメソドロジーをどうやったら身に着けるべきか?が分からず.
もう少しElixirそのものの理解・深掘りをしていかないと議論がし辛いという印象を持った.

【コーディネータからコメント】
・Nervesのコミュニティでもコード書き方や設計のベストプラクティスを模索している段階
 今後,コミュニティ主体で拡充させていきたい.

【ルーム2メンバからの質問とパネラからの回答】
Q.説明の中であった「ファンクションの粒度」が分からない
A.まずElixirは,オブジェクト指向と手続き型のギャップに比べると小さいという印象を持っている.
 関数の粒度は,C言語の関数に比べると細かめになるかもしれない.この点は,オブジェクト指向に
 近しいと考える.結論,Exilirは関数型言語っぽくはないという所感を持っている.

● ルーム3
①どんなIoTのお困りごとがある?こんなことを解決したい!みんなでいろいろ挙げてみよう!
 ・ペットのウサギの自動餌やり&遠隔監視&温度管理
 ・除草剤を自動でまいて欲しい
 ◎隣の部屋の実験器具を借りて、ボードにさしに行く作業がいる。そのためだけに出社している
 ・賞味期限切れを警告してくれる冷蔵庫みたいな。

②こんなIoTシステムを作ればいいのかも?選んだ課題の解決策を考えてみよう!
 ・所在の管理(器具がどこにあるか把握したい)
 ・器具を使いたい人が使っている人へ通知
 ・本当に使っているかを確認したい(予約だけしていないか)
 ・接続を自動化したい

③それElixir/Nervesでできたら素敵じゃない?Nervesの気持ちよさがどう活きるかな!?
 ・機材と使用者(PC)が近くにいるかを調べる仕組みがあると、遊んでるかがわかる?
 ・センサは部屋かPCかについている
 ・ビーコンのIDをOTAでビジーなものだけ割り当てて監視(ID足りなくなる)

【ルーム3の議論まとめ】
とあるメンバが,業務の中である実験器具を借りて使用する場面があるが,実験器具へボードを刺す為だけに
出社する必要がある.というテーマを選定.このテーマの一番の解決策は,遠隔でボードを差す事であるが,
それはロボットがやる事なので割愛.

視点を変えて,出社した際に使用したい実験器具の位置の把握や,実験器具を使っている人の把握,また次に
実験器具を使いたい人を通知する仕組みがあると有益.など次点の解決策を探る為の情報整理を行った.

実験器具を誰がどこに持ち出しているか分かる事である程度の課題が解決できる為,まず貸し出す実験器具に
ビーコンを取り付ける.加えて使用者の持つPC等にビーコンを探索するセンサを取り付け,貸し出した実験器具の
ビーコンの反応を監視すれば,実験器具の使用中/未使用を判別できるのでは.と考えた.

また,この課題テーマは,実験器具を使いたい人が増減する.加えて,機器自体も買い足せばIDが増える事も
予想される為,扱うデータに変動が生じる.このようなデータもOTAで更新をかける事ができれば,有益であり
そこにElixirの強みが活かされるでは.と考えた.


● 最後に
・今回,コーディネータが,本セッションを企画した意図は以下の通り.
 「プラットフォームが好き.新しいモノを見つけると実行環境に目が行きがち.それで何を作る?
  という点が思いつかないタイプなので本セッションを企画した」
 → 結果として,皆さんからヒントが得られた!感謝!!
・NervesJPコミュニティの紹介
 https://nerves-jp.connpass.com/
・事前公開資料に,Nervesを勉強するには?といった内容を掲載しているのでご参照を
 → 日本語訳したpodcastなど紹介しています https://smartlogic.io/podcast/elixir-wizards/s4e13a-dojo/