Nerves 好きな私が2024年にやったこと

今年もやってまいりました、 2024年12月が終わろうとしています。いかがお過ごしでしょうか！
[NervesJP](https://nerves-jp.connpass.com/) のポジローです。

今年を振り返りながら書いていきたいと思います。

---

Nervesアドベントカレンダーでは、これまで

- 「[Nerves 大好きな僕が2021年にしたこと](https://qiita.com/pojiro/items/30b6ef01c32882fc7c19)」
- 「[Nerves 大好きな僕が2022年にやったこと](https://qiita.com/pojiro/items/fee4b0bd45eb655613da)」
- 「[Nerves 大好きな私が2023年にやったこと](https://qiita.com/pojiro/items/e66c1082462b955e83d9)」

という記事を書いてきています。自分の中の振り返りになるので、今年も同じように書こうと思います。

今年も好きな Nerves に以下の活動をしてきました。

- 活用する
- コントリビュートする
- 布教（Nervesいいぜ！と紹介）する

まず、時系列で振り返って、そのあとで、個別ダイジェストを見ていけたらなと思います！

---

**※以下、メンションはさん付けを省略しています:pray:**

# 時系列できごと

以下のことをしてきました。

- 01月
  - [1/27 [現地開催]オープンソースカンファレンス2024 Osaka](https://ospn.connpass.com/event/302339/) に NervesJP で出展しました
    - 2024年は展示をやってみよう！「テーブルの垂れ幕も作りたい」ということで @myasu と @takasehideki で垂れ幕も作りました💪
    - セミナーをしました💪
- 02月
  - [Zenohex](https://github.com/biyooon-ex/zenohex) にコントリビュート🚀
    - [rustler](https://github.com/rusterlium/rustler) を用いることで Rust 製の [zenoh](https://github.com/eclipse-zenoh/zenoh) を Elixir から呼び出せるライブラリです
    - @takasehideki 、 @ShintaroHosoai と開発しています
- 03月
  - [Rclex](https://github.com/rclex/rclex)  にコントリビュート🚀
    - v0.10.0 のリリースにコントリビュートしました、従来の ROS 2 の msg ファイル群からの NIF の C ソースを生成する部分を書き直し、スーバーバイザツリーの見直しをしました
    - @takasehideki らと開発しています
- 04月 
  - [Rclex](https://github.com/rclex/rclex)  のパフォーマンス計測をしました
  - [SWEST](https://swest.toppers.jp/) の新デザインのウェブページ(Phoenix 製)をリリースしました🚀
    - デザインは @zacky1972 の研究室の方に作成いただき、私が tailwindcss を使って実装しました
- 05月
  - [NervesConf](https://nervesconf.us/) に行って、英語で発表してきました💪
    - [Introduction to relationship between Nerves and Linux](https://docs.google.com/presentation/d/1f83_V8lVeR9R1Y8YqByWAIyDGUeg31I5NrQUHs3EnI0/)
    - @mnishiguchi 、 @takasehideki がきっかけとサポートをしてくれました
  - [5/25 [現地開催]オープンソースカンファレンス2024 Nagoya](https://ospn.connpass.com/event/315363/) に NervesJP で出展しました
    - セミナーをしました💪
- 06月
  - 小水力発電所への Nerves を適用検討支援を開始！⛲
  - @kikuyuta 、 @myasu と取り組んでいます🚀
- 07月
  - [Nerves Web Kiosks](https://github.com/nerves-web-kiosk) の [kiosk_example](https://github.com/nerves-web-kiosk/kiosk_example) にコントリビュートしました🚀
    - weston と cog を使って、rpi4/rpi5 Nerves の HDMI に直接ブラウザをレンダリングすることができます
- 08月
  - 小水力発電所の Nerves 開発を開始！⛲
    - @kikuyuta 、 @myasu と取り組んでいます🚀
  - Elixir 製の MODBUS ライブラリの [modbuzz](https://github.com/tombo-works/modbuzz) を実装してリリースしました💪
    - 小水力発電所で使えます
    - `defprotocol` がうまく使えていると思います
- 09月
  - 03 月から参加させていただていた e ラーニングシステムのバックエンド開発（Phoenix & Liveview）が終了しました🙏
  - @zacky1972 より Nerves 移植のお仕事を受注しました🙏
- 10月
  - [10/18-19 Open Source Conference 2024 Online/Fall](https://ospn.connpass.com/event/329207/) でセミナーが動画として残りました！
    - 【動画】[関数型言語Elixirで組み込みLinux開発ができるNervesの紹介](https://www.youtube.com/watch?v=s_VnwOIpAd0) 
  - @kentaro の [mix_tasks_upload_hotswap](https://github.com/kentaro/mix_tasks_upload_hotswap) に [PR](https://github.com/kentaro/mix_tasks_upload_hotswap/pull/3) を作成しました
    - 内容はクラスターノードのモジュールに対して hotswap をしやすくする改良です
  - [10/26 【展示/ステージ】オープンソースカンファレンス2024 Tokyo/Fall](https://ospn.connpass.com/event/329251/) に NervesJP で出展しました
- 11月
  - [KEK](https://www.kek.jp/ja/) で使われている [STARS](https://stars.kek.jp/) の Elixir 製クライアント [ex_stars](https://github.com/tombo-works/ex_stars) を「デモ」用に実装しました
  - [SOLID for Raspberry Pi 4](https://solid.kmckk.com/SOLID/solid4rpi4) を Nerves 化できないか調査
- 12月
  - nerves_system_rpi4_solid を作成💪
    - [SOLID for Raspberry Pi 4](https://solid.kmckk.com/SOLID/solid4rpi4) が提供する Ghost には再配布の許諾がないため個人的に楽しんでいます

この時系列をふりかえりつつ、書いていきます。

# 活用する

昨年に引き続き

- Nerves のカスタム・移植
- Nerves を使った製品の運用

をしました。Nerves を継続してさわり続け、 Elixir も書き続けているので Nerves/Linux/Elixir に対する理解が深まっていっています。 yay!!

## Nerves のカスタム・移植

### カスタム

nerves_system_rpi4 をカスタムして、 nerves_system_rpi4_solid を作成しました。

[SOLID for Raspberry Pi 4](https://solid.kmckk.com/SOLID/solid4rpi4) は CPU のコアの２つを RTOS の SOLID-OS に、残り２つを Linux カーネルに割り当てます。 RTOS 側でハードリアルタイムな要求される処理をし、 Linux 側でネットワークや画面表示などを担わせることができます。 [10/26 【展示/ステージ】オープンソースカンファレンス2024 Tokyo/Fall](https://ospn.connpass.com/event/329251/) の TOPPERS ブースで KMC さんが展示をしており、資料をいただき nerves_system_rpi4_solid を構成できました。

その際にした以下のツイートを回収することができました。
（SOLID-OS は TOPPERS カーネルを採用しています。）

https://x.com/pojiro3/status/1850025053200822752

（実は [４年前のたわごと](https://qiita.com/pojiro/items/99a60dc8a4427b79ddc7#faq) も回収しています。）

SOLID for Raspberry Pi 4 のライセンスの都合、公開はできませんが、自分の電気・物理の学習・実験に活用できそうなのでライセンスを守って RTOS を勉強して使っていくつもりです。楽しみです。

### 移植

@zacky1972 から KD240 への Nerves の移植を発注いただきました！
AMD Zilinx の KR260/KV260 の兄弟ボードです。 RS485 の有効化に苦労しましたがまとめ上げています。

https://github.com/zeam-vm/nerves_system_kd240

xmutil のコマンド群を使って、 PL を書き換えることができます。

ボードの価格帯はホビーとしてはちょっと高いですが、調べてみると KR260 や KV260 はホビーでも使っている情報を発信している人は少なくないようです。実は KR260 の Nerves も過去に移植しています。

https://github.com/b5g-ex/nerves_system_kr260

## Nerves を使った製品の運用

[PocketLANcher](https://www.pocket-lancher.com/) は積極的に営業もしておらず特筆すべきことはないです。が、安定稼働していてます。自身もよく使っています。

https://www.pocket-lancher.com/

# コントリビュートする

## 時間

[Nerves Web Kiosks](https://github.com/nerves-web-kiosk) の [kiosk_example](https://github.com/nerves-web-kiosk/kiosk_example) にコントリビュートしました。組み込み Linux や Windows でやりたくなるのがアプリケーションのみの画面出力機能だと思います。例えば、回転寿司の注文用タブレットみたいなのであったり、サイネージなどです。英語圏ではこの機能をキオスクモードというようです。

Nerves での画面描画は Scenic を使う方法が以前からありますが、組み込み用ブラウザを全画面表示してそこに Phoenix を描画することができると、 Phoenix の開発つまり HTML/CSS/Liveview で開発ができるようになり Scenic で作るより楽に感じられるはずです。

それをできるのが [kiosk_system_rpi4](https://github.com/nerves-web-kiosk/kiosk_system_rpi4) / [kiosk_system_rpi5](https://github.com/nerves-web-kiosk/kiosk_system_rpi5) です。 nerves_system_rpi4/5 の kiosk 向けのカスタムされたシステムです。ブラウザが入るのでファームウェアサイズは大きくなりますが、上述の利点を得ることができます。 

[kiosk_example](https://github.com/nerves-web-kiosk/kiosk_example) はその kiosk 向けシステム上で kiosk アプリケーションを作るならたとえばこんな感じになるよということを示すリポジトリです。以下は [kiosk_example](https://github.com/nerves-web-kiosk/kiosk_example) を rpi4 で HDMI 画面に出力した例です。クラゲがふよふよしていて可愛いですね！
（クラゲの CG は https://akirodic.com/p/jellyfish/ です。）

![IMG_3281.GIF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369713/1d40ea21-1aec-ea5a-a871-218dde2d2a29.gif)

ちょっとしたサイネージなら簡単に作ることができそうなので興味がありましたら試してみてください！

---

その他に、 Nerves に限った話ではないのですが、 Nerves で使えるということで、 

- Zenohex へのコントリビュート
- Rclex へのコントリビュート
- modbuzz のリリース

をしました。いずれも Elixir がバチッとハマる通信ライブラリです。

[Zenohex](https://github.com/biyooon-ex/zenohex) は [rustler](https://github.com/rusterlium/rustler) で Rust 製の Zenoh をラップしています。

Zenoh は v1.0.0 がリリースされ（直近 v1.1.0 も！）、 ROS 2 でも DDS の代わりに使うことができ（[rmw_zenoh](https://github.com/ros2/rmw_zenoh)）、今後伸びていくことが期待される通信ライブラリです。その Elixir ラッパーが Zenohex です。ラッパーとして zenoh を呼び出すこと、Elixir の良さを生かしスーバーバイザツリーにより、堅牢でスケールしやすい構成をとることができるはずです。
※現時点では Zenoh の v1.0.0, v1.1.0 には未対応です。今後に期待です🚀

https://github.com/biyooon-ex/zenohex

[Rclex](https://github.com/rclex/rclex) は ROS 2 の .msg ファイルを NimbleParsec を使ってパースし、 C の NIF コードを生成します。 ROS 2 はメッセージ型をいくつも持っているので都度 C を書くことはできない（しんどい）のでこのようになっています。（Rclex のこの手法は @takasehideki らの研究によって確立されました）

このケースに限らず C で NIF を書く一つの方法として、「機械的に生成する」というのはエンバグする可能性を低くする一つの手だと思います。 

Rclex は海外のコントリビュータやユーザのフィードバッグを受け良いライブラリになりつつあります。

https://github.com/rclex/rclex

Zenohex, Rclex ともに今後もよくなっていくはずですので期待です。
やれることはいっぱいあるはずですね💪💪💪 @takasehideki 

---

最後に [modbuzz](https://github.com/tombo-works/modbuzz) です。産業用途でバス通信に使われる MODBUS というプロトコルがあります。 Elixir 製ライブラリとしては [modbus](https://github.com/samuelventura/modbus/) や [modbux](https://github.com/valiot/modbux) が存在します。

modbuzz はその後発ライブラリとして作成しました。以下の点がアピールポイントです。

- Application にし使いやすい API を用意したこと
- defprotocol で MODBUS のファンクションコードの追加をしやすくしたこと
- TCP/RTU の両対応ができており、それらのゲートウェイも構成できること

https://github.com/tombo-works/modbuzz

今年、 @GeekMasahiro が M5Stack CoreMP135 への Nerves 移植として、 [nerves_system_m5stack_core_mp135](https://github.com/masahiro-999/nerves_system_m5stack_core_mp135) をリリースしました🎉🎉🎉 が、これは Ether ポートが２つ、 RS485 が一つあるそうなので、 modbuzz と組み合わせることで DIN レールに取り付けられる簡易 MODBUS ゲートウェイにすることができると思います。そうできたら使いやすそうです。

以上、紹介した三点すべてが通信系のライブラリですが、 Elixir が通信系ライブラリを書くことに向いていることを実感しました。2024 年はライブラリを書く能力がぐっとついたような気がしています💪

## お金

2023 年同様、 Open Collective の Nerves Project の Backer を継続しています。

「目指せ Sponsor」は未達で、月50ドルを維持です。

https://opencollective.com/nerves-project

いろんな貢献方法がありますが、もし好きな、推しの OSS プロジェクトがあったら Github スポンサーなども視野に入れていただけたらと思います。プロジェクトは取り組む人が中心ですが、「持続可能な」プロジェクトには利用と応援の両方をしてくれる人が必要なはずです。

## Nerves いいぜ！を紹介する

今年は展示をしよう❗と思い、 OSC に３回（大阪、名古屋、東京）出展しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369713/5c1fbb6c-2651-ad1d-4e46-05be8777cbc9.png)


この３回の出展でどれだけ Nerves ファンを増やせたかは分かりませんが、展示に参加することで人のつながりができたり、アイデアや刺激を得たりしました。あと単純に NervesJP のメンバーでやるので楽しかったです（東京は一人だったけど！）。

特に良かったことは OSC でオンラインのセミナーを行ったことで Nerves の紹介動画を作成いただけたことです（OSC のオンラインセミナーは動画を Youtube に残してもらえます）。 **Nerves に興味がある方、興味を持っていただけそうな方が回りにいましたらぜひこの動画を紹介いただけたら嬉しいです。** （割とちゃんと喋れていると思います笑

<iframe width="560" height="315" src="https://www.youtube.com/embed/s_VnwOIpAd0?si=RH4zPLUE9bvY1noS" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# 2024 年の Nerves 大賞 といえば！

完全に主観で毎年発表してますが、今年は英語を頑張って45分話したので「私」でも良いでしょうか。良いんじゃないでしょうか！！頑張りました。（以下の写真を見て下さい、まったくにこやかではありません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369713/5a6cd3a7-899e-5bde-07bf-26ca9cb4672f.png)

発表したスライドは、 [Introduction to relationship between Nerves and Linux](https://docs.google.com/presentation/d/1f83_V8lVeR9R1Y8YqByWAIyDGUeg31I5NrQUHs3EnI0/) で、内容は「Nerves はうまく組み合わせて作られている Linux ディストロのようなものなんだよ」ということを主張しています。このスライドを作った契機は、「 "Nerves" が結局のところ何であるかを知っておくことは、一歩踏み込んで使う時に必ず必要になることなのでそれを説明する資料は意義があるはずだ」というようなことだったと思います。

Nerves Conf では、 Frank さん、Jon さん、Eric さん、 Alex さん、 Todd さんに会えて非常に嬉しかったです。英語の壁を感じて凹みもしましたが、総じて行って発表してよかったです。CfP に出してみたらと背中を押してくださった @mnishiguchi と @takasehideki にあらためて感謝です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369713/284181a9-e8d8-c60b-c7b9-7d56917ef06a.png)

アメリカの地で２人と楽しく過ごせたことは私にとってかけがえのない経験になりました。
※この写真は到着日で翌日に発表があるので私だけビールを控えています。
（でも、まだにこやかですね笑

# 2025 年に向けて

## 取り組み

2024 年も幸いにも [職業錬金術師](https://qiita.com/pojiro/items/e4a724934feae93180b0) としてコードを書き続けることができました。お仕事をいただけたことに感謝しています。:pray:

2024 年はあっというまでした。発表、展示、仕事なんかをしてでワーっと過ぎていきました。

今年できたなという実感があるのは、

- tailwindcss が苦なく使えるようになったこと
- ライブラリ作成の感覚がつかめたこと
- defprotocol の使いどころが分かったこと
- スーバーバイザツリーの設計がある程度できるようになったこと（本当の堅牢性にはまだ精進が必要

今年（頭の隅でやりたいとおもっていたけれど）できなかったことは

- プロパティベーステスト
- e2e テスト
- マクロ、AST の習得

です。

2025 年は引き続き以下の課題と向き合いつつ、自分に出せる価値を磨いていく所存です🦾

- 営業（発表、展示）
- プログラミング、表現力の向上
- 高負荷（通信・処理）に耐える実装
- モデリング
- 運用

来年は年齢の節目でして、上記に加え、お金にはならないけれどやりたいことであった「物理学」をやっていきたいと思っています。実際に現象を見て理解を深めたいので、まずは「電磁気」を実験しながら学びたいです。プログラミング（ Elixir, Nerves ）と物理学をからめてやれたらベストです。楽しみです。（欲を言うと、 Rust と低レイヤもやりたい！！と思っています。

## 貢献の輪の中で

昨年以下のことを書きました。

> 私は Nerves が素晴らしい技術だと認識しています。なので、 Nerves を使った開発、展示、運用、貢献に持続的に取り組みたいです。そのために、何が必要かも分かっています。

> 一度輪っかになったものは中々止まらないという話をどこかでした気がしますが、 「貢献の輪の中と外を繋ぐ輪を作る必要がある」 と思うようになりました。とりとめがなく、あえて伝わるように書いていないですが、私はそう思ったぞ！とここに宣言しておきます。

見返していいこと言ってる！と思いました。そして、少しはできているような気がしました。 Elixir や Nerves の既に回っている輪っかと日本の社会のコミュニティやビジネスなどの輪っかの「間」で価値を出していければ思います。（もがいていますけど）

2025 年は Elixir、 Nerves & 「物理」 やっていくぞー🦾🦾🦾
※年明けは早速 @kikuyuta @myasu と小水力発電所の現場に向けてやっていきます！

おしまい！