**********************************************************************
基調講演
テーマ:Nerves Project: Performant, Scaleable, and Fault Tolerant Embedded Systems
講師:Justin Schneck (Nerves Project)
日時:2019/9/4 13:20?14:40
参加人数: (終了時)約160人
**********************************************************************

-------------------------------------
高瀬 英希 氏と 山崎 進 氏から
ElixirとNervesについての事前知識解説
-------------------------------------

◆Elixirについて
Erlang 電話交換機のために開発された言語で高い並列性を持ち、プロセスが軽量かつ頑強。
ElixirはErlang VMの上で動く。このため、Erlangのこれらのメリットを継承している。

Erlangは関数型言語なのでやや習得が難しい。
ElixirはRubyの記法を参考にした言語設計のため、記述容易性と習得容易性を継承している。

Webフレームワーク Phoenix:
ChannelでPub/Subの通信を容易に実現できる。
WebUIのレンダリングをリアルタイムかつ高速に行えるライブラリLiveViewの開発が進んでいる。

Elixirプログラミングの気持ちよさ=Zen:本質美 
プログラミングの本質の1つであるデータ変換のプログラミングを追求する
Enumマップとパイプラインによって表すスタイル。

変数がイミュータブル(破壊的更新が伴わない)
加算などをするときに元のデータを更新するのではなく新たに作ってそちらを参照する。
古いものは破棄する。
そうすることで排他制御を行わなくてよい。
排他制御をバグがないようにやるのは大変でパフォーマンスが落ちる。

バイナリのパターンマッチを行って対応する関数を呼び出すため条件分岐の記述が要らない。

デバイスドライバに相当するものを書ける。 従来のI/O操作は同期排他制御が必要だった。
ElixirではI/O操作を行うプロセスを1つに集約する。
他のプロセスからI/Oを操作したいときはプロセス間通信を行い排他制御はしないでよい。


◆Nervesの紹介

Nervesは Elixir で組込みデバイスを容易に開発できるようにするためのフレームワーク。
要素はPlatform、Framework、Toolingの3つ

platform:
バイナリとして、ブートローダ、rootファイルシステム、ErlangのVM、Elixirのアプリ
ケーションがまとめられている。サイズはおよそ30MB。
大きいように見えるがErlangのVMやLinuxのカーネルも最小セットとして動いていると
考えると非常に小さい。

Framework:ライブラリ
各種通信プロトコルを利用できるElixir Circuitsがある。
また、IoTモジュール向けライブラリもあり、一般的なElixirライブラリを連携して使用
できる。例えば、webサーバとPub/Subの通信でデバイスとサーバを容易につなげられる。

Tooling:
mixというプロジェクト管理のコマンドが使える。
プロジェクトの新規作成や依存関係の定義など。
つまり、Elixirアプリの開発方法をデバイスの開発でも同じように使える。

ファームのアプリについて
SDカードライタを使ってSDカードに書くことも、仮想イーサネット経由でSSHでアップ
ロードすることもできる。
また、NervesHubという仕組みが提供されている。
クラウドサーバ経由でデバイスのファームウェアをアップロードする仕組みで、手元の
開発環境でコンパイルしたものを、どこにあるデバイスでもアプリを動かしながらアップ
デートできる。


----------------------------------------------
ここから Justin Schneck 氏の講演
----------------------------------------------

◆組込みとウェブ開発では同じような要件がある

・Resilient   しなやかな障害性(耐障害性)
あるプロセスがクラッシュしてもシステムが全体として落ちずに、プロセスの再起動を
個別に柔軟に行いたい。
・Reproduceble 再現性
昨日コンパイルしたものを今日コンパイルしても同じような挙動をしてほしい。
・Reasonable リーズナブル  
組込みの分野ではメモリ容量などの要件が厳しいため、必要なものだけ備えるように
したい。

Nervesは、これらの要件を全て兼ね備えたIoT開発フレームワークである。


◆Nervesでの開発のデモンストレーション

Raspberry Pi Zeroを利用

mix nerves.newでmyappというプロジェクトを作る。
必要なファイルが生成され依存ライブラリが自動でダウンロードされる。
myappに移動
$MIX_TARGET に rpi0 を指定
mix firmwareでNervesランタイム全てのビルド
mix burnでSDカードに書き込む
SDカードをRasPi0に差し込んで、ファームとアプリを起動する


◆Elixir Circuitsの紹介 クイックスタートのデモ

ファームウェアをダウンロードしてSDカードに書き込みRasPiに差し込むだけで、簡単に
デモを扱えることを紹介。
LEDライトの点灯と消灯。
また、モーションセンサーのデータをとって重力を記録。


◆NervesHub について

ウェブ経由でファームウェアをアップデートする。

セキュリティについて
SSAの通信でセキュアに担保できている。
MicroChipの暗号用モジュールを利用してセキュリティを担保するNervesKeyという回路を
自作して提供している
RasPiの裏にハンダ付けして装着する。

Remote Console
NervesHubウェブブラウザからデバイスのインタラプタを起動し、ウェブ経由でデバイスの
情報をとってきたりデバイスの操作ができる。
デバッグにも利用できる。リアルタイムにログインしてデバイス状態を監視できる。

NervesHubのウェブサーバは100%オープンソース
いくつか制限はあるが、Nervesプロジェクトが提供しているNervesHubサーバでは、
トライアルアカウントを利用できる。
自分のサーバにオープンソースを持ってきて展開できる。ただし、セキュリティに関しては
自己責任となる。


◆Nervesの利用

既に様々な企業で採用されている。
講師のJustinは家庭菜園の水やりに実際の製品で利用しているという例を紹介。


◆Resilientの証明のデモンストレーション

分散コンピューティングの例
RasPi 3でスネークゲームをする様子をRasPi 0を9つ利用して分割して描画。
RasPi 3とRasPi 0はphoenixのPub/Sub通信で繋がっている。

RasPi 0のうち1つをweb経由で白黒反転させる。
→ 複数のデバイスのファームウェアを1つのコマンドで同時にアップデートする。

古いファームウェアを削除して新しいファームウェアをNervesHubのサーバにアップロード。
ファームウェアのアップデートを検知して全てのデバイスがNervsHubからファームウェアを
ダウンロードする。

会場のWi-Fiが遅かったのでこの部分のデモは中止。


◆謝辞:共同開発者や協賛企業・サポータの募集


-----------
質疑応答
-----------

Q: NervesKeyの規格が公開されているか。また、価格はどのくらいか。
A: 実物とRasPiを見せて紹介。
 暗号化のチップ自体は60セント 基盤に付けた状態でアメリカのWebサイトで7?8ドル 
 はんだ付けでRasPiに付けられる。
 各々のチップにシリアル番号で暗号化する秘密鍵が入っている。
 日本からでも通販で買えるようにしたが、送料はそれなりにかかる。

Q: RasPi 以外のデバイスをサポートする予定はあるか。
 どういう条件でのデバイスならサポートされるか。
A: 基本的にEmbedded Linuxの上で動く  
 プロジェクトのリソースとしてはRasPiを集中的にサポートしているだけである。
 RasPi/Nervesに限らない、他にElixirを動かす取り組みとしてAtomVMというのがある。
 これは esp32 をサポートしている。クロスコンパイルなど様々な最適化が必要で、
 まだまだ開発途中。
 Erlang OTPの最新バージョンは22であるが,AtomVMではまだ21しかサポートしていない

Q: GRiSP 2 はどうか
A: GRiSP 2 は Erlangを組込み環境で動かそうというプロジェクト
 ボード自体の設計もしていて、KickStarter Projectのファンドで集めていて、この
 ファンドは成功している
 プロセッサは NXP を使っていてErlang、VMの下はリアルタイムOS(RTEMS)が動作
 している
 個人的には、Giant ボードに注目している:RasPi Zeroくらいのサイズで低電力で動く為
 小型の組込みにちょうどいい。他にも、プロジェクトのオフィシャルではないものでも
 動いている例はある。詳細は明かせないが、サポート企業が自家製で設計したボードで
 動かしたこともある。

Q: Resilientの説明の部分がよく分からなかった。1つのデバイスの中にOSが2つあって
 片方が生きてればもう片方を立ち上げるんじゃなくて、デモのようにNervesHubを介して
 デバイスの管理ができるという認識でよいか。
A: チップ上にOSが2つが動いているのではなくて、2つのファームとファイルシステムの
 イメージがあり、普段は片方がアクティブになっている。ファームウェアを NervesHub
 にアップロードすると、Nerves側で非アクティブな方にダウンロードを開始し、アクティブな
 方が動き続ける。ダウンロードやファームアップデートに失敗した場合は、アクティブな
 方が察知して再ダウンロードするようにする。ファームアップデートに成功してから
 ブートイメージを切り替えて再起動をかけて非アクティブだった方が起動する。

Q: カーネルとルートファイルが2種類あって切り替えをしているという理解でよいか。
A: その通り。
 mix firmware genscript ファームウェアアップロード用のスクリプトを自動生成。
 パーティションAとパーティションBがあって、デモではファームウェアをRasPiのBに
 インストールして動かした。
 動かなかったらフォールバックしてAで動かすということをしている。
 ルートファイルシステムをA、Bの二つ持っているため(再起動はかかるが)デバイスを
 動かしながらファームウェアをアップデートすることができる。

Q: Jetson Nanoをサポートしようとしていると聞いたことがあるが、Narvesはそのような
 GPUとかCUDAの環境をサポートする予定はあるのか。
A: そこを日米で協力してやろうという約束を交わしている。

Q: OpenCVなどの一般的なライブラリをサポートしているか。
A: 現状でも外部プロセスとして動かすことで動作可能。そのパフォーマンスを上げるために
 Jetson Nano等をサポートすることを考えている。
 カメラでOpenCVを使って物体検出するということをNervesのプロジェクトでやっている。

Q: Linuxカーネルにどのくらい依存しているか。デバイスドライバなど、Linuxの特殊な
 機能を必要とするか。
A: 一部のAPIには使っているがそこまで深く依存しているわけではない
 リアルタイムOSに載せるような動きもあり、Linuxでなければ動かせないということはない。
Q: UNIX系のカーネルだとユーザモードとスーパーバイザモードが分かれているが、
 スーパバイザモードのプログラムがどうしても必要というようなことはあるのか。
A: 基本的にはLinuxをブートしてErlang VMを起動してその上で動くのでユーザモードで動く。
 特権モードに深く突き刺さっているわけではない。

Q: Dockerコンテナはどのような役割を果たすか。Nervesの中からDockerコンテナを起動
 する利点は?
A: 今回のデモに関して言うとPostgreSQLを動かすのによかった。一般でいうとDockerを
 使うことでポータビリティが上がる。

Q: NervesHubでOTAのようなことをする際に、アプリケーションのアップデートのタイミング
 を管理するようなことはできるか
A: グルーピングしてアップデートすれば順番にアップデートされていって一斉にできる
 ということも考えているが、まだオフィシャルではない。来年くらいになる。

Q: ElixirはIoTなどの情報系組込み向けで制御系組込み向けではないという認識でよいか。
 メモリ管理が自動化されているとリアルタイム制御向けではないのではないか。
 ハードリアルタイムアプリケーションに利用できるか。
A: Elixirのメリットはスーパバイザプロセスがいてマイクロコントローラが別々の
 プロセスで動いていてそのリスタートが気持ちよくできるので、いろいろなIoTに利用
 できるだろう。
 ガベージコレクションが動いているので完全にリアルタイム性を保証できるものでは
 ないが、ソフトリアルタイムで広く利用できるだろう。
 LinuxだけでなくリアルタイムOSの上に移植しようという動きもあるのでそちらにも
 期待できる。
 Javaでは全体が止まってしまうようなガベージコレクションをしているが、Elixirの
 プロセスはメモリ管理が独立していて、1つ1つのプロセスで小さなガベージコレクション
 をしてるので全部止まるということはない。
 1つのメモリ領域がクラッシュすると,スーパーバイザが止めるという仕組みもあり、
 クリティカルな問題は起こらない。


以上。