Elixir / Erlang

Linux 二段階認証

*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 School

Elixir入門 01: コードを書いて試してみる

Elixir 基礎文法最速マスター

最速で知る! 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が出てるのさ。

The Road to 2 Million Websocket Connections in Phoenix

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)"]

Taskを使ってプロセスで遊ぶ

Elixirで並行コマンド実行サーバーを作ったら感動した話

Elixirのプログラムの実行方法

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().

他に参考になりそうなもの。

wxErlang - Getting Started

debianだとerlang-devを入れるとwxが付いてくる。珍しくexamplesも付いてた(しかもコンパイル済の*.beamも同梱)。これをそのままFreeBSDに持ってきたら、無修正で動いた。バイナリーってOSを乗り越えるJavaみたいだな。暫く遊べそう。


This year's Index

Home