- この記事は#NervesJP Advent Calendar 2020 の3日目です。
- 前日は、 @kentaro さんのウェブチカでElixir/Nervesに入門する(2020年12月版)です。
- すごくよい記事なのでオススメです!
- どのくらいよい記事なのかと言うと、
- 前の記事のおわりににあるようにたったの2週間での成果とのことです
- 私はなんとな〜くは1年以上Nervesを触っています
-
当然、必然といえばその通りなのですが、その2週間の間に完全に完璧に一気に追い抜かれた感を感じています
- 6号艇(緑)からの強まくり ← こんな感じ
- 6コースからの強まくり ← こんな感じ
- [予告!] @kentaro さんが作られたkentaro/mix_tasks_upload_hotswapを試してみますという記事をご本人が参加していらっしゃるアドベントカレンダー(12/12)で書きます!
はじめに
- @Nemesis さんのJavaで湯婆婆を実装してみるを拝見しまして、私はNervesでやってみようとおもいました
- 私はすでに以下の記事を書いてます
- NervesはElixir製のIoTフレームワークです
- 【毎日自動更新】湯婆婆 LGTMランキング! は、Nervesアプリとして作っておりまして、令和2年なのにいまだにRaspberry Pi 2しか持っていない私の虎の子のRaspberry Pi 2が定期的に自動更新をしています
- 下記を使っています
- elixir: 1.10.4-otp-23
- erlang: 23.0.1
- nerves_bootstrap-1.10.0
- えっ!? Raspberry Piをもっていないですって〜
- そんなあなたに素敵なイベントをご紹介します
- 2020/12/27(日) 14:00〜 【オンライン】豪華プレゼント付!Elixir/Nerves(ナーブス)体験ハンズオン!
- Seeed株式会社様からプレゼント!
- Nerves始めたい方は必見。ハンズオンに際して、ラズパイとか必要な一式まで提供してくださるという神がかった企画……!ヤバ過ぎる……!!
- もう参加枠埋まっている
今年のごくワタクシ的Nervesニュース
- Interface(インターフェース) 2021年 1 月号に @takasehideki 先生のお手伝いという形でいっしょに書かせていただいて、名乗るほどのものではない名前を載っけてもらいました!
-
TORIFUKUKaiou/hello_nerves
- ごった煮プロジェクトにいろいろと煮込み続けています
0. 準備
- まずはElixirをインストールしましょう
- 手前味噌な記事ですがインストールなどをご参照ください
-
asdf
でのインストールがオススメです
-
- Nervesを始めるにはもう少し準備が必要です
- 公式のInstallationがわかりやすいです
- 公式のInstallationに書いていないこととしては、SSHの鍵を作るところが書かれていません
- すでに
~/.ssh/id_rsa.pub
等がある場合はそれがそのまま使えます - そんなフォルダがそもそも無いよという場合は下記をご参照ください
- 日本語がお好みの方は下記の記事を参照するのがよいでしょう
1. プロジェクト作成
$ mix nerves.new yubaba
$ cd yubaba
$ export MIX_TARGET=rpi2
$ mix deps.get
- プロジェクトの雛形がつくられます
- いっぱいファイルができます
- Elixirがはじめての方はそんなものだと流してください
- 慣れるといつもの景色にみえてきます
- 私は
rpi2
を使っていますがその他のターゲットをお使いの方は、Targetsから値(TAG)を選んでください
2. プログラムを書く
Wi-Fi設定
- LANケーブルで接続する場合は、下記の変更は必要ではありません
- Wi-Fiで接続する場合には、下記を参考に、
"wlan0"
からはじまるタプル({...}
)のところにご利用のWi-Fi設定を書いてください - VintageNet Cookbook — WiFi
config/target.exs
config :vintage_net,
regulatory_domain: "US",
config: [
{"usb0", %{type: VintageNetDirect}},
{"eth0",
%{
type: VintageNetEthernet,
ipv4: %{method: :dhcp}
}},
{"wlan0",
%{
type: VintageNetWiFi,
vintage_net_wifi: %{
networks: [
%{
key_mgmt: :wpa_psk,
ssid: "your_ssid",
psk: "your_psk"
}
]
},
ipv4: %{method: :dhcp}
}}
]
Yubabaモジュール
lib/yubaba.ex
defmodule Yubaba do
def main do
name = IO.gets("契約書だよ。そこに名前を書きな。\n") |> String.trim()
IO.puts("フン。#{name}というのかい。贅沢な名だねぇ。")
new_name = String.codepoints(name) |> Enum.random()
IO.puts("今からお前の名前は#{new_name}だ。いいかい、#{new_name}だよ。分かったら返事をするんだ、#{new_name}!!")
end
end
-
|>
はPipe operatorと呼ばれるものでして、前の計算結果を次の関数の第一引数に入れて計算をしてくれます - 入力文字列から一文字を選ぶ(名前を奪う)ところは、String.codepoints/1関数で要素が1文字ずつのリストにして、そのリストの中から1要素を適当に選んでくれるEnum.random/1関数を使うことで
new_name
を求めています -
Module.function/1
なんていきなりさらっと書いていますが、/
のうしろは引数の数です- Elixir界でよくみる表記方法です
- カンの良い方はお気づきの通り、Elixirで湯婆婆を実装してみる で書いたコードと全く同じです
- IoTだからと書き方を変えないといけないということに出くわすことはほとんどありません(そこまで複雑なことをやったことがないという理由もあります)
3. 実行
$ mix firmware
- ↑このコマンドでファームウェアができます
- microSDカードをホスト(開発マシン)に差し込んでファームウェアをmicroSDカードにこんがり焼きます
$ mix burn
- こんがり焼き上がりましたら、Raspberry Pi 2に差し込んで電源ON !
- 少し待つと
ping nerves.local
が通るようになるとおもいます - このまま実行してもよいのですが、Elixirで湯婆婆を実装してみる と違うことをやってみましょう
- (この記事ではいろいろと繋いでいるもののことは一切説明しておりません)
4. プログラムを書く(その2)
-
Yubaba.main/0
の呼び出しをrootfs_overlay/etc/iex.exs
の末尾に追加します - こうしておくことで
ssh
接続したときに、すぐに湯婆婆
が動き(イゴキ)始めます
rootfs_overlay/etc/iex.exs
# Add Toolshed helpers to the IEx session
use Toolshed
if RingLogger in Application.get_env(:logger, :backends, []) do
IO.puts """
RingLogger is collecting log messages from Elixir and Linux. To see the
messages, either attach the current IEx session to the logger:
RingLogger.attach
or print the next messages in the log:
RingLogger.next
"""
end
Yubaba.main # add
5. ファームウェアアップデート
$ mix firmware
- Raspberry Pi 2からmicroSDカードを抜いて、ホスト(開発マシン)に差し込んで
mix burn
で焼き直すこともできますが、もっと便利な方法をご紹介します
$ mix upload
- このコマンドを使うことで、Raspberry Pi 2からmicroSDカードを差し込んだままでファームウェアのアップデートができるのです!
- これは文字だけでは伝わりにくいのですがけっこう便利です
6. 実行
- いよいよ実行します
-
mix upload
後少し待って、ping nerves.local
が通るようになったことを確認してください
$ ssh nerves.local
Interactive Elixir (1.10.4) - press Ctrl+C to exit (type h() ENTER for help)
Toolshed imported. Run h(Toolshed) for more info.
RingLogger is collecting log messages from Elixir and Linux. To see the
messages, either attach the current IEx session to the logger:
RingLogger.attach
or print the next messages in the log:
RingLogger.next
契約書だよ。そこに名前を書きな。
荻野千尋
フン。è»éåå°というのかい。贅沢な名だねぇ。
今からお前の名前はだ。いいかい、だよ。分かったら返事をするんだ、
-
ssh
したら湯婆婆から名前を聞かれます! - 文字化けしました
- 気を取り直して
$ ssh nerves.local
Interactive Elixir (1.10.4) - press Ctrl+C to exit (type h() ENTER for help)
Toolshed imported. Run h(Toolshed) for more info.
RingLogger is collecting log messages from Elixir and Linux. To see the
messages, either attach the current IEx session to the logger:
RingLogger.attach
or print the next messages in the log:
RingLogger.next
契約書だよ。そこに名前を書きな。
abc
フン。abcというのかい。贅沢な名だねぇ。
今からお前の名前はbだ。いいかい、bだよ。分かったら返事をするんだ、b!!
- アスキー文字ならうまく行きました
Wrapping Up
- だいぶ気が早いですがアドベントカレンダーネタを書きました
- 文字化けのところはたぶん、Buildrootでしたっけ!? それでサムシングをカスタマイズすると解決できるのだとおもいます
- 解決は他の方に任せるとしてこのへんで筆を置きます
- Enjoy Elixir !!!
- 4日目は、@pojiroさんのなぜ僕はNervesに期待するのか です。続けてお楽しみください。
- 熱い記事!!!