「Elixir実践入門」の所感（第16章〜第19章＋あとがき、まで）

日本国内のElixir界隈で活躍されている方々の共著として出版された「Elixir実践入門」が届いたので、読み進めていました。

https://gihyo.jp/book/2024/978-4-297-14014-4

第16章から第19章まで読み進めた（**そして読了した！**）ので、それぞれの章について所感を書いてみます。
ちなみに、今回の16章から19章は、いわゆる「**ElixirにおけるIoTの実践入門**」という位置付けで捉えておけば良いでしょう。

なお、ElixirでIoTと言えば……

そう、[Nerves](https://nerves-project.org/)です。

「**Nerves は Elixir の IoT でナウでヤングな cool なすごい ヤツ**」

一時期、Elixir界隈で流行った金言から始まる、Nervesです。


...とそんな前置きで、所感を記載していきます。


なお、1章から6章、7章から11章、12章から15章の所感については、先日Qiitaに投稿済みなので、興味があればあわせてお読みください。

https://qiita.com/MzRyuKa/items/11be87a3981eaab4e4e1

https://qiita.com/MzRyuKa/items/90f200aa1d43eb3e3278

https://qiita.com/MzRyuKa/items/7e454b35e46a112e60b1

また、自分はElixirを取り扱った技術同人誌を書いてたりもするので、自分の書いた内容との比較もしてたりしますが、それは、読者視点の他に（レベルは違えど）"書き手"という観点での考えもあり記載しています。




# 第16章:Nervesの概要

Nerves（ナーブスと読みます）は、Raspberry  Piを代表としたSingle  Board Computer上で動作する、IoT向けプラットフォームです。本章では。そのNervesの概要について記述されています。

本章で特筆すべきは、まず最初に「Nervesが解決すること」を持ってきています。
これはどう言うことか？
IoTデバイスおよび開発プラットフォームは、Nervesが出る以前からあります。
しかし、それらでは解決しない課題があり、それを解決するための策の一つとして、Nervesが生まれたと言う見方もできます。
Nervesが解決することとして挙がっているのは以下の4点です。
- リソース制約の厳しいデバイスへの対応
- 実世界とのインタラクティブなデータ処理
- 詳細なドメイン知識なしでのIoTデバイス開発
- さまざまなインターネット通信方式への対応

簡単に言えば、各種ライブラリ（センサー系との通信、取得したデータ変換、ネット通信などを行うもの）がすでに用意されているのに、実行時に必要になるメモリも少なく済むし、何より全体のイメージサイズが数十MB、的なことが書かれています。

また、「Nervesの特徴」として、どのようにして軽量化つ堅牢な実行環境を保てているのか、と言う点も書かれています。Buildrootを採用していること、通常OS向けと同じErlang VMで稼働できること、ブート領域とファイルシステムが2重化されていること、などについて、詳しく記載されています。

...と、ここまで、ごちゃごちゃと書いてきましたが、強く推したいことは一つ。

「*買ったはいいけど使っていないRaspberry Pi、持っていますよね？
押し入れの肥やしにするくらいなら、Nervesをインストールして
新しいおもちゃにして遊んでみませんか？*」

と言うことでしょうか。

# 第17章:Nervesでの開発の進め方

タイトル通りに、Nervesを利用してIoTデバイス開発を進める際の一連の流れが記載されています。

Nervesの開発には、ホストとなる開発環境が必要となります。
手軽なのはmacOSなので、macOSを前提としたホスト側の環境構築について触れられています。
環境構築については、[公式ドキュメント](https://hexdocs.pm/nerves/installation.html)にももちろん記載がありますが。日本語で書かれているので、読みやすいですね。

それと、ターゲットとなるIoTデバイス側についての記述があります。
この章では、Raspberry Pi4をターゲットデバイスとして、有線LAN接続で記載がされています。
加えて、ホストとNervesをインストールするターゲットとなるIoT機器とは、公開鍵認証によるSSH接続が用いられるので、鍵がなかった場合の作成方法についても触れられていました。

続いて、タイトルの通りに、基本的な開発の進め方について、実行コマンドが載った形で記載があります。コマンド例だけでなく、＋アルファの蘊蓄も記述されているのがGoodポイントだと思って自分は読んでいました。
- プロジェクトの作成
- ターゲットの設定
- インターネット接続の設定
- 依存ライブラリの取得
- ファームウェアのビルド

ファームウェアのビルドまで完了すれば、今度はそのデータを「microSDカード」に書き込みをして、実際にデバイス上で動かすことになります。
なお、書き込みの表現として「**ばーっん**」と表現していたのには、クスリとしました。ぱっとみた時、誤記？と思いもしました（笑

そして、ファームウェアの書き込みが完了すると、デバイスへのSSH接続ができるようになります。SSH接続をするとIExが起動しており、通常のPCと同じようにIExを触ることができます。
IExでの操作は、次の章でも利用するので、このタイミングで慣れておくと良いと思います。

なお、SSH接続が成立しているのであれば、Nervesではネットワーク越しにファームウェアを書き換えることも可能です。
本章の最後には、それを行う"mix upload"コマンドの実施方法が記載されています。

このように、環境構築部分の基礎が記載されていますので、慣れるまでは本章を読み直すことも増えるのではないかと思います。

ちなみに。
なお、本章ではファームウェアの更新は、IoTデバイスにセットされた上で有線LAN経由での実施で書かれていました。

しかし、microSDカードに直接書き込むこともできます。IoTデバイスについても、お手軽なRaspberry Pi Zero WH で動かしてみたい、と言う方もいらっしゃるのではないでしょうか。
そのやり方については、拙著「[Elixirへのいざない](https://www.amazon.co.jp/Elixir%E3%81%B8%E3%81%AE%E3%81%84%E3%81%96%E3%81%AA%E3%81%84-%E6%8A%80%E8%A1%93%E3%81%AE%E6%B3%89%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%88NextPublishing%EF%BC%89-%E5%B7%9D%E9%82%91-%E3%83%AA%E3%83%A5%E3%82%A6/dp/4844378805)」の「Nervesを体験する」で、microSDカードへのライター機器についての説明をしていますので、興味があればぜひお手に取ってみてください。Kindle版でセールしている時などがお買い得です。


# 第18章:Elixir  Circuitsによるモジュールの制御

IoTと言えば、センサーなどの情報取得モジュール装置との連携してこそ、本領発揮となります。
この章では、センサー／アクチュエータなどのモジュール装置を生業するライブラリである「**Elixir Circuits**」の概要とその使い方について記述がされています。

Elixir Circuits自体がカバーしている通信方式は、以下の4パターンです。
このうち、本章では「GPIO」と「I2C」について簡単に説明されています。
- GPIO
- I2C
- SPI
- UART

また、本章での動作確認をするのに、「[Groveモジュール](https://lab.seeed.co.jp/entry/2019/10/25/120432)」を必要とします。
本章で紹介されていたのは、以下の3つでした。2024年4月6日時点では、全部で1,300円程度で購入できるみたいです。
- [Grove LED](https://jp.seeedstudio.com/Grove-Red-LED.html)
- [Grove Button](https://jp.seeedstudio.com/Grove-Button.html)
- [Grove AHT20](https://jp.seeedstudio.com/Grove-AHT20-I2C-Industrial-grade-temperature-and-humidity-sensor-p-4497.html)

組み立てについても、簡単ではありますが、説明が書いてあります。
なお、参考情報ですが、Raspberry Piのピン配置については、以下が参考になります。


公式：GPIO and the 40-pin header
- https://www.raspberrypi.com/documentation/computers/os.html#gpio-and-the-40-pin-header

Raspberry Pi Pinout
- https://pinout.xyz/#

さて、ハードウェア側の設定が完了したら、今度はついに「Elixir Circuits」ライブラリの利用です。
mix.exsへの追加方法から、GPIOによるLEDの制御やボタンの入力検知、I2Cによるセンサからの情報取得方法について記述されています。
特にI2Cについては、関係する部分だけですが、丁寧に説明が書かれています。
読んでて、ちょっと試すためにAHT買おうかなーとか思っている自分がいました。

本章は、次の章「19章：実践的なIoTアプリケーションの開発」の礎ともなります。
IoTのデータを使って何かしたい、と考えている方には、ぜひともI2Cの操作を実際にやられてみることをお勧めします。


なお、またまた余談ですが、GPIOだけではありますが、拙著「**Elixirへのいざない2〜もっとNervesをさわる〜**」でも、GPIOを利用して「**7セグメントLED**」「**4桁7セグメントLED**」を操作してたりしました。懐かしいなぁ。

https://techbookfest.org/product/6213243525660672?productVariantID=5816396004982784

# 第19章:実践的なIoTアプリケーションの開発

本書の最後の章となります。
この章では、前章で書かれていたAHT20からのデータを、Nervesデバイスを通じて、Phoenix（＋LiveView）が動作しているサーバーにデータを送信する、といったIoTシステムの実装方法について書かれています。
Phoenixについては、7章でも触れられていましたね。
ある意味では、IoT＋Webの総仕上げともなる章です。

NervesデバイスとWebサーバ間はJSONで通信しています。
なので、JSONでデータ通信をする方法を確認するという点で、本章を読むというのもありでしょう。
自分は、Elixir間でのJSON通信部分は触ったことがなかったので、勉強になりました。

また、本書では「ボタン押下時にデータ測定とPOSTを行う」という機能を実装しています。
この機能は、**[GenServer](https://elixirschool.com/ja/lessons/advanced/otp_concurrency#genserver-0)ビヘイビア**を用いて実現されています。
もちろん、ご存じの方には何を何を今更なのですが、Nervesでのプログラミングには、GEnServerは重要な部分を占めています。ですので、この機能の実装を通じて、GenServerがなんたるかの理解がすすむのでは、とも思っています。

本章自体は十数ページの内容でしかないのですが、システム間連携という点でのポイントが詰まっている内容だと思います。もちろん、実際に実務という点では他に考慮する点が多々あるかもしれませんが、そこを説明するにはページが絶対的に足りなくなると思います。（笑


# 「あとがき」の所感と、まとめ。

1ページしかない「**あとがき**」ですが、本書の全編のレビューアーの方（[@piacerex氏](https://qiita.com/piacerex)）が推していたことが印象深かったので、さいごに紹介。

記載内容というよりは、全章を読み切った感想という感じもしますが。

「Elixir実践入門」という本書は、Elixirのポテンシャルとその可能性を示唆してくれた一冊であると感じています。もちろん、Elixirで全てが解決する訳でもないことは認識しています。

関数型言語としてはある意味で邪道な部分はあるし、WebフレームワークもRailsや他の言語のフレームワークほど情報／ライブラリがある訳でもなし、機械学習だってすでにPythonやJupyter Notebookによってつくらている情報が山のようにあるし、IoTだって細かいところをやろうとすればC言語や標準OSが載っているラズパイには及ばないこともあるでしょう。

ですが、それでもElixir（＝これはErlangVMが、とも言えますが）がこれらの領域に展開されているのは、それぞれの領域で生じている問題の解決の糸口になる要素を持っているからだという認識です。

Elixirは、堅牢性と並行性に優れたErlangVM上で動作します。Rubyのような書きやすさもあるし、副作用もある意味で許容しているし、PhoenixはそれこそRailsが苦手とする並行処理を補えるし、LiveViewを利用することで（ある意味で必要最低限な動作をさせるということで割り切ることで）過剰になりがちなJSの処理を簡略化できるし、機械学習においてはGPUなどで最適に動けるように基板側のEralngVMに手を入れたり、LivebookはElixirを動かす以外の場所も提供してくれるし、軽量＋自動復帰＋通信処理でIoTデバイスの課題にアプローチしています。

つまりは、完全に置き換える、ということではなく、こういう問題がある時の一つの選択肢として選択できる余地がある、ということを示しているのだと考えています。
そして同時に、すべてをElixirで代替できる可能性があるということは、Elixirのノウハウを持った要員をそのままシフトできるということです。

オールインワン Elixir。

言葉の意味があっているかわわかりませんが、意味は伝わるでしょうか。
アルケミストとしては、そんな未来に期待をしつつ、「Elixir実践入門」の所感（書評？）を締めたいと思います。
こちらの投稿を読んだ方が、「Elixir実践入門」や「Elixir」自体に興味を持ってくれると幸いです。

最後になりましたが、本書を執筆していただいた **栗林氏、大原氏、大聖寺谷氏、山内氏、齋藤氏、降藤氏、高瀬氏、およびレビューアーや関係するコミュニティの方々すべて** に対して、お礼を申し上げます。