Nerves.Runtime.revert を楽しんでみる (Elixir)

https://qiita.com/official-events/5cb794f7cb9ac194ed70

**知行合一**

Advent Calendar 2022 29日目[^1]の記事です。
I'm ready for 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
I'm looking forward to 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
I can't wait for 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
私の[Advent Calendar 2022 一覧](https://docs.google.com/spreadsheets/d/1HQvFjagQLRPjOYAjDVzWp9S4b8dKixxvvaz_TtbZWto/edit#gid=1723448955)。

[^1]: @kaizen_nagoya さんの「[「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 １日目　Most Breakthrough Generator](https://qiita.com/kaizen_nagoya/items/49ebebee3a0377f3b59b)」から着想を得て、模倣いたしました。 

---



# はじめに

[Elixir](https://elixir-lang.org/)を楽しんでいますか:bangbang::bangbang::bangbang:


<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Nerves Tip #18 - Revert to the previously loaded firmware<br><br>Run `Nerves.Runtime.revert` to go back to the previously loaded firmware.<a href="https://twitter.com/hashtag/NervesTips?src=hash&amp;ref_src=twsrc%5Etfw">#NervesTips</a> <a href="https://twitter.com/hashtag/MyElixirStatus?src=hash&amp;ref_src=twsrc%5Etfw">#MyElixirStatus</a></p>&mdash; Jon Jon (@JonCarstens) <a href="https://twitter.com/JonCarstens/status/1487093114858876937?ref_src=twsrc%5Etfw">January 28, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[Nerves.Runtime.revert/1](https://hexdocs.pm/nerves_runtime/Nerves.Runtime.html#revert/1)を試してみます。

[Nerves](https://www.nerves-project.org/)をやったことがある方に向けて書いています。
以下のコマンドを使ったことがあるくらいの知識で大丈夫です。

```
$ mix local.hex
$ mix local.rebar
$ mix archive.install hex nerves_bootstrap
$ mix nerves.new hello_nerves
$ cd hello_nerves
$ export MIX_TARGET=rpi4
$ mix deps.get
$ mix firmware
$ mix burn
```

# [Nerves.Runtime.revert/1](https://hexdocs.pm/nerves_runtime/Nerves.Runtime.html#revert/1)

[Nerves](https://www.nerves-project.org/)には、A面とB面がありまして2つのファームウェアを書き込むことができます。
どちらか一方がアクティブになります。
ふつうはOTA(Over the Air)でファームウェアを書き換えたときに、自動でアクティブ面が切り替わります。
[Nerves.Runtime.revert/1](https://hexdocs.pm/nerves_runtime/Nerves.Runtime.html#revert/1)を使うことで、任意のタイミングでアクティブな面を切り替えることができます。
[Jon Jon](https://twitter.com/JonCarstens/)さんの[ツイート](https://twitter.com/JonCarstens/status/1487093114858876937)で私ははじめて知りました。


# 実際に使ってみる :rocket::rocket::rocket:

[Nerves Livebook](https://github.com/livebook-dev/nerves_livebook)を使います。
以下に予めビルドされたファームウェアがあります。

https://github.com/livebook-dev/nerves_livebook/releases

私は、`nerves_livebook_rpi4.fw`をダウンロードして使いました。
[v0.5.1](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.1)と[v0.5.0](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.0)を焼いてみます。

以下の手順でやってみました。

1. `fwup`で、[Nerves Livebook](https://github.com/livebook-dev/nerves_livebook)の[v0.5.1](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.1)を焼く
1. `./upload.sh`で、[Nerves Livebook](https://github.com/livebook-dev/nerves_livebook)の[v0.5.0](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.0)
1. [Nerves Livebook](https://github.com/livebook-dev/nerves_livebook)の[v0.5.0](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.0)でグラフが動かないことを確認する
1. [Nerves.Runtime.revert/1](https://hexdocs.pm/nerves_runtime/Nerves.Runtime.html#revert/1) でB面の[v0.5.1](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.1)に切り替える
1. [v0.5.1](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.1)のため、グラフ表示ができることを確認する


ちなみに

- [v0.5.0](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.0)はグラフが表示できない不具合があります
- [v0.5.1](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.1)で解消しています

なにを隠そう、私が[Issue](https://github.com/livebook-dev/nerves_livebook/issues/156)を書いて、 @mnishiguchi さんが追試と解析をしてくれて、[v0.5.1](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.1)で解決しています。
<font color="purple">$\huge{その一歩は我々人類にとって大きな進撃になる！！}$</font>

バンドメンバを紹介します〜

![Screen Shot 2022-01-25 at 7.37.33 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/7de9421f-338c-9eb5-e8c3-2ee12a6ac495.png)

なんちゃって。
上記がグラフが表示できなくなってしまった問題の解決に立ち向かったメンバーです。


とまれ、[Nerves.Runtime.revert/1](https://hexdocs.pm/nerves_runtime/Nerves.Runtime.html#revert/1)を使ってみる話に戻します。
以下、詳細です。

## [Nerves Livebook](https://github.com/livebook-dev/nerves_livebook) [v0.5.1](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.1)を焼いて動かす

```
$ fwup nerves_livebook_rpi4.fw # v0.5.1
```

microSDカードを挿し込んでRun!
[v0.5.1](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.1)が動き始めます。

## upload.shをつくる

適当な[Nerves](https://www.nerves-project.org/)プロジェクトが必要です(たぶん:sweat_smile:)

```
$ export MIX_TARGET=rpi4
$ mix firmware.gen.script
```

## [Nerves Livebook](https://github.com/livebook-dev/nerves_livebook) [v0.5.0](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.0)をOTA(Over the Air)で焼く

```
$ ./upload.sh nerves.local nerves_livebook_rpi4.fw # v0.5.0
```

passwordは、`nerves`です。
さら〜っと書いていますが、
<font color="purple">$\huge{Over\ the\ Air🚀}$</font>
ですよ!、奥さん!

一度再起動がかかります。
10秒くらい待ちましょう。
焦りは禁物です。


## [Nerves Livebook](https://github.com/livebook-dev/nerves_livebook) [v0.5.0](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.0)でグラフが表示されないことを確認する

さきほどの手順で、[v0.5.0](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.0)が動いています。
この[v0.5.0](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.0)では、グラフ表示ができない問題があります。

![スクリーンショット 2022-01-29 23.25.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/93cc8413-0661-8af6-64ac-598f45d7ae1f.png)


うん、表示されないね :sob::sob::sob:

## ssh nerves.local


```
$ ssh nerves.local
```

passwordは、`nerves`です。
sshで[Nerves](https://www.nerves-project.org/)に接続できたら、あとは一生[Elixir](https://elixir-lang.org/)を楽しめます。

## [Nerves.Runtime.revert/1](https://hexdocs.pm/nerves_runtime/Nerves.Runtime.html#revert/1)

今日は、[Nerves.Runtime.revert/1](https://hexdocs.pm/nerves_runtime/Nerves.Runtime.html#revert/1)を**楽しんでみます**。

```
iex> Nerves.Runtime.revert
```

上記のコマンドで、[v0.5.0](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.0) => [v0.5.1](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.1)に変わります。
もちろん、一度再起動がかかります。
10秒ほどお待ちください。
焦りは禁物です。


## [Nerves Livebook](https://github.com/livebook-dev/nerves_livebook) [v0.5.1](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.1)でグラフが表示されることを確認する :tada:

さきほどの手順で、[v0.5.1](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.1)が動くようになりました。
この[v0.5.1](https://github.com/livebook-dev/nerves_livebook/releases/tag/v0.5.1)では、グラフ表示ができるはずです。
確かめてみます。

![スクリーンショット 2022-01-29 23.25.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/2cd2a37f-021b-c9d6-36c0-67bc5404a255.png)


表示されました!
:tada::tada::tada:



# Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:

Enjoy [Elixir](https://elixir-lang.org/):bangbang::bangbang::bangbang:
<font color="purple">$\huge{Enjoy\ Elixir🚀}$</font>

[Nerves.Runtime.revert/1](https://hexdocs.pm/nerves_runtime/Nerves.Runtime.html#revert/1)を使ってみました。
**楽しみました**。
デバッグでいろいろ使えそうです。

---
2022年に流行る技術予想 ーー それは、[Elixir](https://elixir-lang.org/)、[Phoenix LiveView](https://github.com/phoenixframework/phoenix_live_view)、[Livebook](https://github.com/livebook-dev/livebook)、[Nerves Livebook](https://github.com/livebook-dev/nerves_livebook)です:rocket::rocket::rocket:

[Elixir](https://elixir-lang.org/)の誕生日は、2012年5月24日です。
そのため、今年の2022年5月24日は10周年を迎えます。

```elixir
iex> Date.diff(~D[2022-05-24], ~D[2022-01-29])
115
```


そうそう！
2月24日発売予定の[WEB+DB PRESS](https://gihyo.jp/magazine/wdpress)で、[Elixir](https://elixir-lang.org/)と[Phoenix](https://www.phoenixframework.org/)の特集がでますよ〜

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">次号のWEB+DB PRESSでElixirとPhoenix特集が出ます！お楽しみに！！1 <a href="https://t.co/d4hIfhIfZ1">pic.twitter.com/d4hIfhIfZ1</a></p>&mdash; 栗林健太郎 (@kentaro) <a href="https://twitter.com/kentaro/status/1483308857019760640?ref_src=twsrc%5Etfw">January 18, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>






---

I organize [autoracex](https://autoracex.connpass.com/).
And I belong to [NervesJP](https://nerves-jp.connpass.com/), [fukuoka.ex](https://fukuokaex.connpass.com/), [EDI](https://fukuokaex.connpass.com/).
I hope someday you'll join us.

[We Are The Alchemists, my friends!](https://www.youtube.com/watch?v=04854XqcfCY)