/var/log/messages

May 17, 2019 - 1 minute read - Comments - programming

プログラミング Elixir (30)

別場所にあった queue な課題をパクッて実装。

以下なカンジで動きました。

$ iex Stack.ex
Erlang/OTP 21 [erts-10.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]

Interactive Elixir (1.7.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> Stack.start_link
{:ok, #PID<0.106.0>}
iex(2)> Stack.stack
[]
iex(3)> Stack.push(1)
:ok
iex(4)> Stack.stack  
[1]
iex(5)> Stack.push(2)
:ok
iex(6)> Stack.stack  
[2, 1]
iex(7)> Stack.push(3)
:ok
iex(8)> Stack.stack
[3, 2, 1]
iex(9)> Stack.pop
3
iex(10)> Stack.stack
[2, 1]
iex(11)> Stack.pop  
2
iex(12)> Stack.stack
[1]
iex(13)> Stack.pop  
1
iex(14)> Stack.stack
[]
iex(15)> Stack.pop  
nil

May 15, 2019 - 1 minute read - Comments - programming

プログラミング Elixir (29)

昨日エントリの Chain な実装、色々ナチュラルに忘却の彼方なナニがありました。ポイントとしては以下。

  • create_process が始点
  • Enum.reduce が戻すのは accumulator の最後の値
  • accumulator の初期値は最初に起動されるプロセス
  • spawn の戻りは起動されたプロセス
  • Enum.reduce に渡される手続きオブジェクトの第二引数は accumulator
  • Enum.reduce に渡される手続きオブジェクトの戻りが accumulator の値

May 14, 2019 - 1 minute read - Comments - programming

プログラミング Elixir (28)

週末確認したドキュメントでは OTP と k8s はいくつかの懸念があるけれど、統合する方向に進んでいるとのこと。これは楽しみ。

とりあえず、14 とか 15 のあたりはつまみ食いですすめます。

14.2 プロセスのオーバーヘッド

以下をでっちあげてみたのですが色々意味がわかっておらず。

defmodule Chain do
  def counter(next_pid) do
    receive do
      n ->
        send next_pid, n + 1
    end
  end

  def create_processes(n) do
    last = Enum.reduce 1..n, self(),
             fn (_, send_to) ->
               spawn(Chain, :counter, [send_to])
             end
    send last, 0
    
    receive do
      final_answer when is_integer(final_answer) ->
        "Result is #{inspect(final_answer)}"
    end
  end

  def run(n) do
    IO.puts inspect :timer.tc(Chain, :create_processes, [n])
  end
end