サイズやコストは可能性で決めるな。必要性・必然性で決めろ。
Advent Calendar 2022 32日目1の記事です。
I'm looking forward to 12/25,2022
私のAdvent Calendar 2022 一覧。
はじめに
Elixirを楽しんでいますか
2022/02/01(火)は
「BEAM/OTP対話」#10
が開催されました。
そのレポートです。
ワクワクとドキドキを興奮そのままに、
$\huge{愛と感動}$
を余すことなくお伝えします。
惜しくも参加できなかった方は雰囲気をつかんでつかんでいただいて、ぜひ次回はご参加ください。
参加した方は振り返りや復習のお供に加えていただければ幸いです。
18:00
Zoomでの開催です。
everyone, onlineでenjoyです。
18:00参加予定7名のうち4名が定刻通りそろっています。
少しだけ待ちました。
18:02になると、7人全員が参加しています!
Let's get started
レコーディング開始です。
つまりのちほどYouTubeに動画を公開してくださるとのことです!
進行スタイル
司会進行は、
北九州市立大学の@zacky1972 先生です。
@Gsann さんが進行についての意見や質問を出しながら、それに@zacky1972 先生が答えていくというスタイルです。
あたかも「論語」の成立過程をみているようです。
「BEAM/OTP対話」においては、その中身はErlangを取り扱っています。
現代に蘇る、プログラミング言語を題材とした「論語」の成立過程に
$\huge{刮目せよ!}$
『論語』は、孔子とその高弟の言行を、弟子が記録した書物である。
(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で軽く性能評価してみました」です。
続いて、「The Erlang Runtime System」を読み進めて行きます。
英語で書かれています。
本日は、3.7. The Process Dictionaryからスタートです。
英語を@zacky1972 先生が日本語に訳してくださって、解説を加えながら丁寧に説明をしていただきました。
ありがとうございます!
@Gsann さんは日本語訳を書きためていっているそうです。
まさしく、やはり、すべからく「論語」スタイルです。
「論語」の成立過程を彷彿とさせます。
和訳を公開することに関して、原著者の許可は@zacky1972 先生がとっていらっしゃるとのことです。
3章が終わったあとは、@Gsann さんの意見により4章を飛ばして5章へと進みました。
5章のキリがよいところまで進んで本日は終了となりました。
ここまでの内容はのちほどYouTubeに公開されるそうです。
$\huge{ありがとうございました!}$
質疑応答 19:10-19:20
一旦、レコーディングは止めて、参加者からの質疑応答の時間が設けられました。
内容は
$\huge{ムフフ💜💜💜}$
です。
とてもここには書けません。
ぜひ、次回の「BEAM/OTP対話」に参加して、あなた自身で体験してみてください!!!
Wrapping up
Enjoy Elixir
$\huge{Enjoy\ Elixir🚀}$
今回惜しくも参加できなかった方は、ぜひ次回はご参加ください。
Elixirを支えるErlangと仲良くなれる勉強会です。
ElixirがErlangの存在を意識しなくて済むように巧みに言語設計がされていますが、その源流に触れてみて理解をすることは、あなたのElixirスキルを一段高いステージへときっと押し上げてくれることでしょう2。
匠になれることでしょう。
次回の「BEAM/OTP対話」の開催予定日は、
$\huge{3月吉日!?}$
です。
Coming soon!!!
Don't miss it!!!
elixir.jp slackの#pelemay_zeam
チャンネルにて案内があります。
「BEAM/OTP対話」動画集
過去のイベントはすべて動画で公開されています。
ぜひご覧になってください!
Pelemayチャンネルに登録、とうろく〜!!!
「BEAM/OTP対話」 #1
「BEAM/OTP対話」 #2
「BEAM/OTP対話」 #3
「BEAM/OTP対話」 #4
「BEAM/OTP対話」 #5
「BEAM/OTP対話」 #6
「BEAM/OTP対話」 #7
「BEAM/OTP対話」 #8
Pelemayをふりかえる
「BEAM/OTP対話」 #9
「BEAM/OTP対話」 #10
編集後記
編集後記です。
そういうコーナーを作って、思い出を書きます。
ある意味、役得です。
「BEAM/OTP対話」のきっかけ
@Gsann さんがElixirの並列処理を知りたいということをTwitterでつぶやかれていたことがきっかけなのだそうです。
@zacky1972 先生が目指しているものは最終的に一つの座標に集まるとのことです。
上記YouTubeは、@zacky1972 先生が「BEAM/OTP対話」のことを語っていらっしゃるポイントのリンクを貼っています。
聞き手は、nakoさん(@nako_sleep_9h)です。
ぜひお聞きになってみてください。
先生が途中で離脱!!!
@zacky1972 先生は外から参加されていたためネットワーク不調のため、
- 18:11 zacky先生がZoomから離脱してしまう
- 18:12 zacky1972 先生復帰
なんてことが途中ありました。
参加者一同、ソワソワしていました。
@Gsann さんが、間をつないでくださいました。
なんで有料ではないのだろう?
大学の先生に無料で教えていただけるのはとてもありがたいです。
まさしくこれです。
$\huge{ありがたや〜🙏}$
一昨日の #tokyoex に出れなかったんで、 @torifukukaiou さんのログコラム、ありがたやー🙇♂️https://t.co/BMD8yj2rLd
— piacere (love Elixir&Gravity+仮想世界創造機構) (@piacere_ex) January 31, 2022
Elixirコミュニティで学べる内容って、
「なんで有料で無いんだろう?」
ってのがポコポコ出てくるんで恐ろしいね😅@ohrdev さんスライド、2016年以来、お世話になってます😉
Elixirで書いてみる
5章の「5. The Erlang Virtual Machine: BEAM」のErlangプログラムをElixirで書いてみよう! という検討がありました。
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
上記をElixirで書いてみると以下のような感じになります。
世俗派関数型言語3 ーー ふんわりとなんとなく知らない間に「ワタシ、関数型言語でプログラミングしちゃってました」 てな具合にプログラミングを楽しめます。
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で書いたプログラムは、次のバージョンで動作することを確認しています。
- elixir: 1.13.1-otp-24
- erlang: 24.2
付録
以下、付録です。
Elixirの誕生日は、2012年5月24日です。
そのため、今年の2022年5月24日は10周年を迎えます。
iex> Date.diff(~D[2022-05-24], ~D[2022-02-01])
112
そうそう!
2月24日発売予定のWEB+DB PRESSで、ElixirとPhoenixの特集がでますよ〜
次号のWEB+DB PRESSでElixirとPhoenix特集が出ます!お楽しみに!!1 pic.twitter.com/d4hIfhIfZ1
— 栗林健太郎 (@kentaro) January 18, 2022
Elixir
最後の最後に、Elixirについて紹介します。
- |>でスイスイ、プログラミングしていくことができる素敵なプログラミング言語です
- さっそくプログラムの例を示します
-
Qiita APIを使わせていただいて、
Elixir
タグがついた最新の記事を20件取得しています - ここでは雰囲気をつかんでいただければ大丈夫です
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アプリケーションを楽しむなら
IoTを楽しむなら
AIを楽しむなら
もっとElixirのことを知りたい方へオススメの書籍
- プログラミングElixir(第2版) -- オーム社
- Elixir実践ガイド -- インプレス
- アルケミスト − 夢を旅した少年 -- KADOKAWA
コミュニティ
-
elixir.jp Slack workspaceに参加してみてください
- マヂ、やさしい人ばっかりのコミュニティ
- あなたの困ったをきっと解決してくれるでしょう
- NervesJP Slack workspaceでは、NervesやIoTが好きな愉快なfolksたちがあなたの訪れを歓迎します
- たくさんのコミュニティがあります
(EDI/fukuoka.ex/kokura.ex & LiveView JP の @piacerex さん作 )
Elixirコミュニティに初めて接する方は下記がオススメです
Elixirコミュニティ の歩き方 -国内オンライン編-
https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian
(piyopiyo.ex & エリジョ の nakoさん(@nako_sleep_9h) 作、素敵な資料)
I organize autoracex.
And I take part in NervesJP, fukuoka.ex, EDI, tokyo.ex, Pelemay.
I hope someday you'll join us.
We Are The Alchemists, my friends!
-
@kaizen_nagoya さんの「「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 1日目 Most Breakthrough Generator」から着想を得て、模倣いたしました。 ↩
-
私はいまはErlangは書けません。「いま」書けないと言っているだけです。そのうちペラペラにはなっています。ですから現時点においては、何目線で言っているのかは甚だあやしいのですが、書けないからこその憧れを持っておりまして、わかるようになったときにはきっと確実に一段階ステップアップしているだろうという予感はひしひしと感じています。と、いうような根拠のない自信はもっておりまして、得てしてこうした根拠のない自信は物事を推し進める原動力となります。なんちゃって。 ↩
-
@kikuyuta 先生の「世俗派関数型言語 Elixir を関数型言語風に使ってみたらやっぱり関数型言語みたいだった」より。Elixirはコワくないですよ〜。 ↩