Elixir / Erlang
*BSD upgrade
巷ではウブの新しい版が来たと大騒ぎ(最近はそうでもないか)してるようだけど、一部マスコミの戦略なんでしょうな。そんなのを後目にあれですよ。
FreeBSD
4月の初旬に13.0がひっそりとリリースされた。少し寝かせて落ち着いた頃を見計らって12.2からupgradeしたよ。
root@fb:~ # uname -a FreeBSD fb 13.0-RELEASE FreeBSD 13.0-RELEASE #0 releng/13.0-n244733-ea31abc261f: Fri Apr 9 04:24:09 UTC 2021 root@releng1.nyi.freebsd.org:/usr/obj/usr/src/amd64.amd64/sys/GENERIC amd64
何が新しくなったのだろう? 確認もせずに新しくしただけ。BSD族には元祖NetBSD君も居るけど、そこまでは手が回らない。で、コンパクトなOpenBSDを愛用してるのさ。
OpenBSD
それに対して、こちらは予告が4月中旬には出てたけど、正式に告知されたのは5/1だった。
sysupgradeして、 pkg_add
-u ってのが、一連の工程。だけど、/usr/localに鎮座してるports群の垢を落とす事にした。入れてはみたものの余り使っていないものの峻別。とは言え、アプリそれぞれに使用カウンターが付いている訳ではないので、どうしよう。
それはね、キャッシュのクリアーですよ。そして必要になった時点でインストールするって方針で行ってみよう。 pkg_delete
-X で、潔くインストールした全てのportsを削除。それから、必須のアプリを入れた。emacs、gdbぐらいからのスタートです。
i386版のportsを入れようとしたら、日本には届いていなかった。日本人は金持ちなので今更i386って事は無いでしょうと言う事か。https://cdn.openbsd.org/pub/OpenBSD から入れたよ。
Erlang and elixir
7つの言語本を見てたら、erlangが目に止まった。prologを土台にして作ったとか。
Learn you some Erlang for great good! 日本語訳
確かに、prologの香りがする。色々ggしてる時、elixirなんてのも出てきた。化粧品の名前で、不老不死が語源らしい。歳を取るのは大敵ですから。
色々な言語で作ったWebサーバーが落ちて死ぬなんてのは、もっての他。そういう所に目を付けて、erlangを現代風にしたのがelixirだ。rubyがお手本。
最速で知る! ElixirプログラミングとErlang/OTPの始め方【第二言語としてのElixir】
emacsのalchemist-modeについての備忘録 and Elixir Tooling Integration Into Emacs
C-c a i i open IEx shell windows C-c a i b exec buffer
上記の長いキーバインドを使うのが嫌だなら、 quickrun って、手も有るぞ。
Phoenix
横浜市でコロナのワクチン接種予約にアクセスが殺到し、サーバーが落ちたと話題になってた。 何でも、1分間に200万のアクセスが集中したらしい。遅るべく、老人(今は75歳以上の後期高齢者)によるDoS攻撃。電話も殺到してて、年末年始のあけおめ攻撃状態みたいだし。自動応答電話も落ちたとか、阿鼻叫喚な様子だな。そんなに急がなくてもと、思ったり思わなかったり。
そんな時は、ElixirのWebフレームワークの出番ですよ。古くはC10K問題をapacheが解けるかと、颯爽と登場したnode.js君だったけど、扱いがとっても難しいらしい。
そんな事もあろうかと、erlangの並行実行を扱い易くまとめたElixir語によるWebが出てるのさ。
sample
下記は、複数のタスク(単にランダムな時間待ち)を、シーケンシャルに実行した場合と並行実行した場合の実行時間を計測するもの。タスク数は100個の例。
defmodule Worker do def random do :rand.uniform(1000) end def sleep(n) do IO.puts "sleep(#{inspect n}) started." :timer.sleep(n) IO.puts "sleep(#{inspect n}) ended." "result-sleep(#{inspect n})" end def exec_seq do IO.puts "===== Seq start =====" result = 1 .. 100 |> Enum.map(fn(_) -> random() end) |> Enum.map(fn(t) -> Worker.sleep(t) end) IO.puts "===== Seq result =====" result end def exec_con do IO.puts "===== Con start =====" result = 1 .. 100 |> Enum.map(fn(_) -> random() end) |> Enum.map(fn(t) -> Task.async(Worker, :sleep, [t]) end) |> Enum.map(fn(d) -> Task.await(d) end) IO.puts "===== Con result =====" result end end
実行結果
vbox$ elixirc worker.ex vbox$ time elixir -e Worker.exec_seq >/dev/null 0m52.10s real 0m00.43s user 0m00.43s system vbox$ time elixir -e Worker.exec_con >/dev/null 0m01.92s real 0m00.37s user 0m00.52s system
手動実行
iex(6)> c("worker.ex") iex(7)> Worker.exec_con Worker.exec_con ===== Con start ===== sleep(246) started. sleep(889) started. sleep(723) started. sleep(137) started. sleep(137) ended. sleep(246) ended. sleep(723) ended. sleep(889) ended. ===== Con result ===== ["result-sleep(246)", "result-sleep(889)", "result-sleep(723)", "result-sleep(137)"]
wxErlang
面白そうなので手を出してみる。
wx the erlang binding of wxWidgets
オライリーの Erlangプログラミングの wxErlang のチュートリアルを動かしてみたり
-include_lib("/usr/local/lib/erlang/lib/wx-1.8.7/include/wx.hrl").
FreeBSD erlang-wx では、上記のバージョンになってた。
[sakae@fb /tmp]$ erl Erlang/OTP 21 [erts-10.3.5.16] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [hipe] [dtrace] Eshell V10.3.5.16 (abort with ^G) 1> c(miniblog). miniblog.erl:13: Warning: export_all flag enabled - all functions will be exported {ok,miniblog} 2> miniblog:start().
他に参考になりそうなもの。
debianだとerlang-devを入れるとwxが付いてくる。珍しくexamplesも付いてた(しかもコンパイル済の*.beamも同梱)。これをそのままFreeBSDに持ってきたら、無修正で動いた。バイナリーってOSを乗り越えるJavaみたいだな。暫く遊べそう。