Why Nerves|>Nervesを使う理由探し

#はじめに
この記事は、[#NervesJP Advent Calendar 2019](https://qiita.com/advent-calendar/2019/nervesjp) の20日目です。

昨日は @Shintaro_Hosoai さんの[AtomVMでM5Stack向けのデバドラを書いてみる](https://qiita.com/Shintaro_Hosoai/items/213409d7a2af8c2080f9)でした。

- もうElixirに決めた!という人向けです。
- そもそもIoTでElixirを使う理由を探している方は、@kikuyutaさんの[Elixir を使うようになった経緯 〜電力システム制御の現場から〜](https://qiita.com/kikuyuta/items/96c3f91a850e9274b0e9)をおすすめします。
- Nerves Trainingを受けて、「で」Nervesの使い所って?となった方はご一読ください。
- 環境構築やコーディングには一切触れません。

[Elixir Advent Calendar 2019](https://qiita.com/advent-calendar/2019/elixir)の記事はこちら
[・Elixir Circuitsを使用してLEDを操作する](https://qiita.com/32hero/items/d71cd74713d4d975600e)

#お役立ちリンク

- [Nerves公式](https://nerves-project.org/)
- [とりあえず始めるなら　getting-started](https://hexdocs.pm/nerves/getting-started.html#content)
- [とりあえずやってみるにはelixir schoolのNervesのページ](https://elixirschool.com/ja/lessons/advanced/nerves/)
- [gitの方が詳しく書かれています　Nerves Project
:github](https://github.com/nerves-project/toolchains)
- 例えば、Nervesのnetworkの設定は、[nerves_network](https://github.com/nerves-project/nerves_network)を見ると幸せになれます。

#Nervesとは
[#NervesJP Advent Calendar 2019](https://qiita.com/advent-calendar/2019/nervesjp)より
「Nerves」は，関数型言語ElixirによるIoT開発フレームワークです。
RaspberryPiなどのIoTボード上で動作する最小構成のLinuxブートローダ＋Elixir実行環境＋各種デバドラのパッケージセットで，Elixir × IoTの文脈で最も活発なプロジェクトです。

を意訳すると

- BEAM VM上で直接動くBuildroot(組込Linux)派生のLinuxで動作します。
- 主だったデバイス上でElixirの実行環境がすぐに作れます。(そこまでの道のりは無視)
- [サポートされているターゲットとシステムはこちら](https://hexdocs.pm/nerves/targets.html)
    - 新しいターゲットハードウェアに採用することも可能ですが[Buildroot](https://buildroot.org/)が対象のハードウェアをサポートしている必要があります。しかもカスタマイズは難易度が高そうだ。。
    - [きっとこのあたりを使う。nerves/artifact.ex:github](https://github.com/nerves-project/nerves/blob/master/lib/nerves/artifact.ex)
- IoTの開発にモダンな開発手法を取り入れるにはNervesを採用すると良いよ。

#Nervesでなにができるの?
#####イミュータブルな環境の構築
- イミュータブルなデータ構造です(Elixirが)。~~ファイルシステムはイミュータブルです。~~
    -  [Elixirのイミュータブルなデータ構造って？](https://hoominkani.hatenablog.com/entry/2019/05/30/182750)
    - [Elixirでのimmutable](https://qiita.com/takpy/items/68421f843edd4fa5c457)

#####環境のコード化
- NervesはBuildrootをベースに各ハードウェア用のtoolchain(コンパイラやドライバ)を組み込んだArtifactを元にベースのイメージが作成されます。しかもこれがmix nerves.new hogeでサクッと作れる。
- mix.exsへの追記やネットワーク、環境の変更、アプリケーションの変更は全てコードに記述します。　

#####ネットワークデプロイの機能
- Nervesはネットワーク経由のデプロイが可能です。
- [NervesHub](https://www.nerves-hub.org/)を使用しホストからNervesHubにpushしたソースを、ネットワーク経由でグループ単位にデプロイすることが可能です。
- ハードウェアでの認証鍵(NervesKey)など、セキュアな環境が構築できます。

###運用を想定したモダンなIoT開発ができるフレームワーク　それが　「Nerves」です。


#どうですか、そろそろNervesをやりたくなったでしょ？\:kissing_closed_eyes: |>Nervesを導入するには
@nishiuchikazuma さんの記事でElixirの環境構築
[ElixirでラズパイのLEDをチカ〜RaspbianOSインストールから〜](https://qiita.com/nishiuchikazuma/items/cce6152430467cffba56)

@takasehideki さんの記事でNervesの環境構築
[ElixirでIoT#4.1：Nerves開発環境の準備（2019年12月版）](https://qiita.com/takasehideki/items/88dda57758051d45fcf9)

合わせて以下を参考にするととりあえずできます。
[getting-started](https://hexdocs.pm/nerves/getting-started.html#content)
[elixir schoolのNervesのページ](https://elixirschool.com/ja/lessons/advanced/nerves/)

#まとめ結局Nervesってどうよ
Elixirの可能性＋IoT開発にモダンな開発手法を取り入れるのにとても良いフレームワークです。
ただし、新しいハードへの展開、artifactを自分で作るにはハードルがありそうです。
いまからやっておくと幸せかも。

明日の[#NervesJP Advent Calendar 2019](https://qiita.com/advent-calendar/2019/nervesjp) 21日目の記事は、 @myasu さんの[Elixir Circuits I2CでLチカ](https://qiita.com/myasu/items/a4d033b5034cc3fb97c0)です。こちらもお楽しみに！