「BEAM/OTP対話」#10レポート（2022/02/01）

**サイズやコストは可能性で決めるな。必要性・必然性で決めろ。**

Advent Calendar 2022 32日目[^1]の記事です。
I'm looking forward to 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:

2022/02/01(火)は

https://pelemay.connpass.com/event/237323/

**「BEAM/OTP対話」#10**
が開催されました。
そのレポートです。

ワクワクとドキドキを興奮そのままに、
<font color="purple">$\huge{愛と感動}$</font>
を余すことなくお伝えします。

惜しくも参加できなかった方は雰囲気をつかんでつかんでいただいて、ぜひ次回はご参加ください。

参加した方は振り返りや復習のお供に加えていただければ幸いです。



# 18:00

Zoomでの開催です。
**everyone, onlineでenjoyです。**
18:00参加予定7名のうち4名が定刻通りそろっています。
少しだけ待ちました。
18:02になると、**7人全員が参加しています!**
**Let's get started**:rocket:
レコーディング開始です。
つまりのちほどYouTubeに動画を公開してくださるとのことです!

# 進行スタイル

司会進行は、
[北九州市立大学](https://www.kitakyu-u.ac.jp/env/faculty/d-media/introduction/susumu-yamazaki.html)の@zacky1972 先生です。
@Gsann さんが進行についての意見や質問を出しながら、それに@zacky1972 先生が答えていくというスタイルです。

あたかも「**論語**」の成立過程をみているようです。
「BEAM/OTP対話」においては、その中身は[Erlang](https://www.erlang.org/)を取り扱っています。
現代に蘇る、プログラミング言語を題材とした「**論語**」の成立過程に
<font color="purple">$\huge{刮目せよ！}$</font>


> 『論語』は、孔子とその高弟の言行を、弟子が記録した書物である。

(https://ja.wikipedia.org/wiki/%E8%AB%96%E8%AA%9E)


# 18:03-19:10 本会

前回から少し間があいてしまったとのことで、ふりかえりから開始されました。
ふりかえりに使った資料は、
「[Erlang VMのprocess_flagのmessage_queue_dataのon_heapとoff_heapで軽く性能評価してみました](https://qiita.com/zacky1972/items/fc10dc46f241ab94f50a)」です。

https://qiita.com/zacky1972/items/fc10dc46f241ab94f50a

続いて、「[The Erlang Runtime System](https://blog.stenmans.org/theBeamBook/)」を読み進めて行きます。
英語で書かれています。

https://blog.stenmans.org/theBeamBook/

本日は、[3.7. The Process Dictionary](https://blog.stenmans.org/theBeamBook/#_the_process_dictionary)からスタートです。
英語を@zacky1972 先生が日本語に訳してくださって、解説を加えながら丁寧に説明をしていただきました。
ありがとうございます!

@Gsann さんは日本語訳を書きためていっているそうです。
まさしく、やはり、すべからく「**論語**」スタイルです。
「**論語**」の成立過程を彷彿とさせます。
和訳を公開することに関して、原著者の許可は@zacky1972 先生がとっていらっしゃるとのことです。


3章が終わったあとは、@Gsann さんの意見により4章を飛ばして5章へと進みました。
5章のキリがよいところまで進んで本日は終了となりました。

ここまでの内容はのちほどYouTubeに公開されるそうです。

<font color="purple">$\huge{ありがとうございました！}$</font>


# 質疑応答 19:10-19:20

一旦、レコーディングは止めて、参加者からの質疑応答の時間が設けられました。
内容は
<font color="purple">$\huge{ムフフ💜💜💜}$</font>
です。

とてもここには書けません。
ぜひ、次回の[「BEAM/OTP対話」](https://pelemay.connpass.com/)に参加して、あなた自身で体験してみてください！！！

---

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

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


今回惜しくも参加できなかった方は、**ぜひ次回はご参加ください。**

[Elixir](https://elixir-lang.org/)を支える[Erlang](https://www.erlang.org/)と仲良くなれる勉強会です。
[Elixir](https://elixir-lang.org/)が[Erlang](https://www.erlang.org/)の存在を意識しなくて済むように巧みに言語設計がされていますが、その源流に触れてみて理解をすることは、あなたの[Elixir](https://elixir-lang.org/)スキルを一段高いステージへときっと押し上げてくれることでしょう[^2]。
匠になれることでしょう。

[^2]: 私はいまはErlangは書けません。「いま」書けないと言っているだけです。そのうちペラペラにはなっています。ですから現時点においては、何目線で言っているのかは甚だあやしいのですが、書けないからこその憧れを持っておりまして、わかるようになったときにはきっと確実に一段階ステップアップしているだろうという予感はひしひしと感じています。と、いうような根拠のない自信はもっておりまして、得てしてこうした根拠のない自信は物事を推し進める原動力となります。なんちゃって。


次回の[「BEAM/OTP対話」](https://pelemay.connpass.com/)の開催予定日は、
<font color="purple">$\huge{3月吉日!?}$</font>
です。
Coming soon!!!
Don't miss it!!!

[elixir.jp slack](https://join.slack.com/t/elixirjp/shared_invite/zt-ae8m5bad-WW69GH1w4iuafm1tKNgd~w)の`#pelemay_zeam`チャンネルにて案内があります。

# 「BEAM/OTP対話」動画集

過去のイベントはすべて動画で公開されています。
ぜひご覧になってください!


[Pelemay](https://www.youtube.com/channel/UCUTHJhKDmRPTgiR4jWKR6dA/featured)チャンネルに登録、とうろく〜!!!

## 「BEAM/OTP対話」 #1

<iframe width="766" height="431" src="https://www.youtube.com/embed/c_vmeBptczk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 「BEAM/OTP対話」 #2

<iframe width="766" height="431" src="https://www.youtube.com/embed/R9x1hiTJ9as" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 「BEAM/OTP対話」 #3

<iframe width="716" height="544" src="https://www.youtube.com/embed/p0zRehHDigg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 「BEAM/OTP対話」 #4

<iframe width="766" height="431" src="https://www.youtube.com/embed/JJCBqMpFsDo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 「BEAM/OTP対話」 #5

<iframe width="766" height="431" src="https://www.youtube.com/embed/3TEOnaA2mAE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## 「BEAM/OTP対話」 #6

<iframe width="766" height="431" src="https://www.youtube.com/embed/dEnXnBIPu74" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## 「BEAM/OTP対話」 #7

<iframe width="766" height="431" src="https://www.youtube.com/embed/WjUIvvsJwRY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 「BEAM/OTP対話」 #8

<iframe width="766" height="431" src="https://www.youtube.com/embed/u34TMuudPpE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## [Pelemayをふりかえる](https://qiita.com/zacky1972/items/fabfbc651ef21ad81ae4)

<iframe width="766" height="383" src="https://www.youtube.com/embed/QW8kvYn-VxE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 「BEAM/OTP対話」 #9

<iframe width="766" height="479" src="https://www.youtube.com/embed/5YnqmkVge5Y" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 「BEAM/OTP対話」 #10

<iframe width="766" height="383" src="https://www.youtube.com/embed/eFQWVQPhikw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



---

# 編集後記

編集後記です。
そういうコーナーを作って、思い出を書きます。
ある意味、役得です。

## [「BEAM/OTP対話」](https://pelemay.connpass.com/)のきっかけ

https://qiita.com/zacky1972/items/fabfbc651ef21ad81ae4#%E3%81%82%E3%82%89%E3%81%99%E3%81%98

@Gsann さんがElixirの並列処理を知りたいということをTwitterでつぶやかれていたことがきっかけなのだそうです。
@zacky1972 先生が目指しているものは最終的に一つの[座標](https://dic.pixiv.net/a/%E5%BA%A7%E6%A8%99%28%E9%80%B2%E6%92%83%E3%81%AE%E5%B7%A8%E4%BA%BA%29)に集まるとのことです。

https://www.youtube.com/watch?v=QW8kvYn-VxE&t=4172s

上記YouTubeは、@zacky1972 先生が[「BEAM/OTP対話」](https://pelemay.connpass.com/)のことを語っていらっしゃるポイントのリンクを貼っています。
聞き手は、nakoさん(@nako_sleep_9h)です。
ぜひお聞きになってみてください。


## 先生が途中で離脱!!! :sweat_smile: 

@zacky1972 先生は外から参加されていたためネットワーク不調のため、

- 18:11 zacky先生がZoomから離脱してしまう
- 18:12 zacky1972 先生復帰

なんてことが途中ありました。
参加者一同、ソワソワしていました。
@Gsann さんが、間をつないでくださいました。

## なんで有料ではないのだろう？

大学の先生に無料で教えていただけるのはとてもありがたいです。
まさしくこれです。
<font color="purple">$\huge{ありがたや〜🙏}$</font>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">一昨日の <a href="https://twitter.com/hashtag/tokyoex?src=hash&amp;ref_src=twsrc%5Etfw">#tokyoex</a> に出れなかったんで、 <a href="https://twitter.com/torifukukaiou?ref_src=twsrc%5Etfw">@torifukukaiou</a> さんのログコラム、ありがたやー🙇‍♂️<a href="https://t.co/BMD8yj2rLd">https://t.co/BMD8yj2rLd</a><br><br>Elixirコミュニティで学べる内容って、<br><br>「なんで有料で無いんだろう？」<br><br>ってのがポコポコ出てくるんで恐ろしいね😅<a href="https://twitter.com/ohrdev?ref_src=twsrc%5Etfw">@ohrdev</a> さんスライド、2016年以来、お世話になってます😉</p>&mdash; piacere (love Elixir&amp;Gravity＋仮想世界創造機構) (@piacere_ex) <a href="https://twitter.com/piacere_ex/status/1487960294467186688?ref_src=twsrc%5Etfw">January 31, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



## Elixirで書いてみる

5章の「[5. The Erlang Virtual Machine: BEAM](https://blog.stenmans.org/theBeamBook/#CH-BEAM)」のErlangプログラムを[Elixir](https://elixir-lang.org/)で書いてみよう！　という検討がありました。

### Erlang

硬派です。
無骨な感じがします。

```erlang
compile(String) ->
    [ParseTree] = element(2,
			  erl_parse:parse_exprs(
			    element(2,
				    erl_scan:string(String)))),
    generate_code(ParseTree).

generate_code({op, _Line, '+', Arg1, Arg2}) ->
    generate_code(Arg1) ++ generate_code(Arg2) ++ [add];
generate_code({op, _Line, '*', Arg1, Arg2}) ->
    generate_code(Arg1) ++ generate_code(Arg2) ++ [multiply];
generate_code({integer, _Line, I}) -> [push, I].

interpret(Code) -> interpret(Code, []).

interpret([push, I |Rest], Stack)              -> interpret(Rest, [I|Stack]);
interpret([add     |Rest], [Arg2, Arg1|Stack]) -> interpret(Rest, [Arg1+Arg2|Stack]);
interpret([multiply|Rest], [Arg2, Arg1|Stack]) -> interpret(Rest, [Arg1*Arg2|Stack]);
interpret([],              [Res|_])            -> Res.

1> stack_machine:interpret(stack_machine:compile("8 + 17 * 2.")).
42
```

### [Elixir](https://elixir-lang.org/)

上記を[Elixir](https://elixir-lang.org/)で書いてみると以下のような感じになります。
世俗派関数型言語[^3] ーー ふんわりとなんとなく知らない間に「ワタシ、関数型言語でプログラミングしちゃってました」 てな具合にプログラミングを楽しめます。

[^3]: @kikuyuta 先生の「[世俗派関数型言語 Elixir を関数型言語風に使ってみたらやっぱり関数型言語みたいだった](https://qiita.com/kikuyuta/items/afa4c264720eb29d9760)」より。[Elixir](https://elixir-lang.org/)はコワくないですよ〜。

```elixir
defmodule StackMachine do
  def compile(string) do
    [parse_tree] = :erl_scan.string(string)
                   |> elem(1)
                   |> :erl_parse.parse_exprs()
                   |> elem(1)
    generate_code(parse_tree)
  end

  def generate_code({op, _line, :+, arg1, arg2}) do
    generate_code(arg1) ++ generate_code(arg2) ++ [:add]
  end

  def generate_code({op, _line, :*, arg1, arg2}) do
    generate_code(arg1) ++ generate_code(arg2) ++ [:multiply]
  end

  def generate_code({integer, _line, i}) do
    [:push, i]
  end

  def interpret(code) do
    interpret(code, [])
  end

  def interpret([:push, i |rest], stack) do
    interpret(rest, [i|stack]);
  end
  def interpret([:add     |rest], [arg2, arg1|stack]) do
    interpret(rest, [arg1+arg2|stack]);
  end
  def interpret([:multiply|rest], [arg2, arg1|stack]) do
    interpret(rest, [arg1*arg2|stack])
  end
  def interpret([],              [res|_]), do: res
end

StackMachine.compile('8 + 17 * 2.') |> IO.inspect() |> StackMachine.interpret() |> IO.inspect()
```

上記の[Elixir](https://elixir-lang.org/)で書いたプログラムは、次のバージョンで動作することを確認しています。

- elixir: 1.13.1-otp-24
- erlang: 24.2










---

# 付録

以下、付録です。





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

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


そうそう！
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>


---


# [Elixir](https://elixir-lang.org/)

最後の最後に、[Elixir](https://elixir-lang.org/)について紹介します。

- [|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)でスイスイ、プログラミングしていくことができる素敵なプログラミング言語です
- さっそくプログラムの例を示します
- [Qiita API](https://qiita.com/api/v2/docs)を使わせていただいて、`Elixir`タグがついた最新の記事を20件取得しています
- ここでは雰囲気をつかんでいただければ大丈夫です

```elixir
Mix.install [{:req, "~> 0.2.1"}]

"https://qiita.com/api/v2/items?query=tag:Elixir"
|> URI.encode()
|> Req.get!(finch_options: [pool_timeout: 50000, receive_timeout: 50000])
|> Map.get(:body)
|> Enum.map(& Map.take(&1, ["title", "url"]))

```

## Webアプリケーションを楽しむなら
- [Phoenix](https://www.phoenixframework.org/)

## IoTを楽しむなら
- [Nerves](https://www.nerves-project.org/)

## AIを楽しむなら
- [Nx](https://github.com/elixir-nx/nx) + [Livebook](https://github.com/livebook-dev/livebook)

## もっと[Elixir](https://elixir-lang.org/)のことを知りたい方へオススメの書籍 :books: 
- [プログラミングElixir（第2版）](https://www.ohmsha.co.jp/book/9784274226373/) -- オーム社
- [Elixir実践ガイド](https://book.impress.co.jp/books/1120101021) -- インプレス
- [アルケミスト − 夢を旅した少年](https://www.kadokawa.co.jp/product/199999275001/) -- KADOKAWA

## コミュニティ
- [elixir.jp](https://join.slack.com/t/elixirjp/shared_invite/zt-ae8m5bad-WW69GH1w4iuafm1tKNgd~w) Slack workspaceに参加してみてください
    - マヂ、やさしい人ばっかりのコミュニティ
    - あなたの**困った**をきっと解決してくれるでしょう
- [NervesJP Slack](https://join.slack.com/t/nerves-jp/shared_invite/zt-9vteokip-iVAqi8TkT0ID_uK9dSqVHA) workspaceでは、NervesやIoTが好きな愉快なfolksたちがあなたの訪れを歓迎します :tada:
- たくさんのコミュニティがあります
![FCOvBkAUYAE6mL8.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/a277d0ea-2780-d9a3-4062-66d38b175125.jpeg)
([EDI／fukuoka.ex／kokura.ex](https://fukuokaex.connpass.com/) ＆ [LiveView JP](https://liveviewjp.connpass.com/) の @piacerex さん作 :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5:)



# <u><b>Elixirコミュニティに初めて接する方は下記がオススメです</b></u>

**Elixirコミュニティ の歩き方 －国内オンライン編－**<br>
https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155423/f891b7ad-d2c4-3303-915b-f831069e28a4.png)](https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian)
([piyopiyo.ex](https://piyopiyoex.connpass.com/) ＆ [エリジョ](https://elijo.connpass.com/) の nakoさん(@nako_sleep_9h) 作、素敵な資料:clap::clap_tone1::clap_tone2::clap_tone3::clap_tone4::clap_tone5:)



---

I organize [autoracex](https://autoracex.connpass.com/).
And I take part in [NervesJP](https://nerves-jp.connpass.com/), [fukuoka.ex](https://fukuokaex.connpass.com/), [EDI](https://fukuokaex.connpass.com/), [tokyo.ex](https://beam-lang.connpass.com/), [Pelemay](https://pelemay.connpass.com/).
I hope someday you'll join us.

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