技術メモ

プログラミングとか電子工作とか

Elixir入門(第二十二章 Erlang libraries)

f:id:ysmn_deus:20190122112104p:plain

どうも、靖宗です。
今回はErlang librariesとのことで、ErlangVM上で走ってるElixirならではといったところでしょうか。
ただ、ライブラリの紹介なんてのはドキュメントを見れば良いので、あまり深入りはせずサクッと終わらせます。

ここで紹介する以上のもの知りたければErlangのドキュメントを見るのがよさそうです。

erlang.org

全体的にそうなんですが、Erlangのライブラリを使用したモジュール名はアトムっぽくなってます。

The binary module

Stringモジュールとはちょっと違うやつ。

iex> String.to_charlist "Ø"
[216]
iex> :binary.bin_to_list "Ø"
[195, 152]

たぶん6章で悩んだ奴。
UTF-8エンコードすると[216]だけど、実際は[195, 152]として文字コードは扱われてるよって感じだったと思います。文字コードに詳しくないので間違ってたらすんません・・・
まぁ、とりあえずそういう奴を取り扱うモジュール。

Formatted text output

なんかprintfっぽいやつ。

iex> :io.format("Pi is approximately given by:~10.3f~n", [:math.pi])
Pi is approximately given by:     3.142
:ok
iex> to_string :io_lib.format("Pi is approximately given by:~10.3f~n", [:math.pi])
"Pi is approximately given by:     3.142\n"

変数なんかをフォーマットして文字列に変換したいときとかに使う。

The crypto module

ハッシュ化とかのモジュール?

iex> Base.encode16(:crypto.hash(:sha256, "Elixir"))
"3315715A7A3AD57428298676C5AE465DADA38D951BDFAC9348A8A31E9C7401CB"

なんかデフォルトのモジュールじゃないらしく、使用する際にはmix.exsに下記を追記する必要があるとのこと。

def application do
  [extra_applications: [:crypto]]
end

mixもまだ習ってないので「ふーん」ぐらいで終わらす。

The digraph module

('ω')。o(????????????)
たぶん、有向非巡回グラフ(DAG)のこと?よくわかんない・・・
深入りしないと決めたのでスルー

Erlang Term Storage

これ後でETSとして出てきてるっぽいのでスルー。

The math module

名前でなんとなく分かりますが数学系のモジュールでしょう。

iex> angle_45_deg = :math.pi() * 45.0 / 180.0
iex> :math.sin(angle_45_deg)
0.7071067811865475
iex> :math.exp(55.0)
7.694785265142018e23
iex> :math.log(7.694785265142018e23)
55.0

The queue module

いわゆるキューの処理(先入れ先出しとか)を実現する為のモジュール。
並列処理とかの時にも使うかも?

iex> q = :queue.new
iex> q = :queue.in("A", q)
iex> q = :queue.in("B", q)
iex> {value, q} = :queue.out(q)
iex> value
{:value, "A"}
iex> {value, q} = :queue.out(q)
iex> value
{:value, "B"}
iex> {value, q} = :queue.out(q)
iex> value
:empty

The rand module

乱数生成のモジュール。シード値を与えたりできるっぽい。

iex> :rand.uniform()
0.8175669086010815
iex> _ = :rand.seed(:exs1024, {123, 123534, 345345})
iex> :rand.uniform()
0.5820506340260994
iex> :rand.uniform(6)
6

The zip and zlib modules

zipファイルを読み込んだり書き込んだり展開したりするモジュール?
内部に含まれてるファイル数のカウントの例があります。

iex> :zip.foldl(fn _, _, _, acc -> acc + 1 end, 0, :binary.bin_to_list("file.zip"))
{:ok, 633}

あとは圧縮したり、展開したり。

iex> song = "
...> Mary had a little lamb,
...> His fleece was white as snow,
...> And everywhere that Mary went,
...> The lamb was sure to go."
iex> compressed = :zlib.compress(song)
iex> byte_size song
110
iex> byte_size compressed
99
iex> :zlib.uncompress(compressed)
"\nMary had a little lamb,\nHis fleece was white as snow,\nAnd everywhere that Mary went,\nThe lamb was sure to go."

この章はあとで見直す用でしょうか?
やはりそのうちErlangを学ぶ必要がありそうな・・・