Slide 1

Slide 1 text

Elixir完全に理解した

Slide 2

Slide 2 text

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙✩)

Slide 3

Slide 3 text

2018/06/16

Slide 4

Slide 4 text

@ 秋葉原 東京

Slide 5

Slide 5 text

Erlang & Elixir Fest 2018

Slide 6

Slide 6 text

劃期的なグラフ現る

Slide 7

Slide 7 text

經驗

Slide 8

Slide 8 text

經驗 自信

Slide 9

Slide 9 text

經驗 自信 Elixir完全に理解した

Slide 10

Slide 10 text

經驗 自信 Elixir完全に理解した Elixir全然わからん

Slide 11

Slide 11 text

經驗 自信 Elixir完全に理解した Elixir全然わからん Elixirチョットデキル

Slide 12

Slide 12 text

Elixir完全に理解した

Slide 13

Slide 13 text

Erlang & Elixirで世界は、 チャットサーバーを作り(LINE、LoL - Riot Games、Discord、enza)、 大量メール配信システムを作り(ユミルリンク)、 ニコ生を作り、 課金APIサーバーを作り(gumi)、 廣告APIサーバーを作り (Dreevee)、 〜を作り…

Slide 14

Slide 14 text

Elixirを皆さんは、 完全に理解する。

Slide 15

Slide 15 text

Process Functional Macro

Slide 16

Slide 16 text

Process Functional Macro

Slide 17

Slide 17 text

Processes are parallel.

Slide 18

Slide 18 text

Task 1 Task 2 t Task 1 Task 2 t t Non-parallel (just concurrent) Parallel

Slide 19

Slide 19 text

Parallel computation has multiple timelines. Each processes has independent timelines.

Slide 20

Slide 20 text

How processes work. send/2 register/2 monitor/1

Slide 21

Slide 21 text

How processes work. send/2 register/2 monitor/1

Slide 22

Slide 22 text

send(宛て先, message) Process Process pid send(pid, msg) msg VM

Slide 23

Slide 23 text

How processes work. send/2 register/2 monitor/1

Slide 24

Slide 24 text

Process.register(pid, process_name) Process Process pid send(name, msg) msg VM Registry name → pid register(name, pid)

Slide 25

Slide 25 text

Erlang (Elixir) <> Go

Slide 26

Slide 26 text

VM Proc Proc go channel go channel Erlang uses 宛て先 Go uses channel

Slide 27

Slide 27 text

How processes work. send/2 register/2 monitor/1

Slide 28

Slide 28 text

Process.monitor(pid | process_name) Process monitor(pid) Process {:DOWN, process} VM monitor Process Process VM dead

Slide 29

Slide 29 text

Process.link(pid | process_name) Process link(pid) Process exit VM monitor Process Process VM dead monitor

Slide 30

Slide 30 text

Process.link(pid | process_name) Process link(pid) Process exit VM monitor Process Process VM monitor dead

Slide 31

Slide 31 text

(Parallel + send/2 + register/2 + monitor/1) makes ↓ GenServer (Easy process), Supervisor (Easy monitor), :gen_event (Event handler manager), :gen_statem (State machine process), :gen_tcp (Async TCP I/O), Task (Easy background & parallel task), Agent (Easy state), GenStage (Parallel workflow), Flow (Easy GenStage), Registry (Distributed process registry), :rpc (Call remote node with no-border)

Slide 32

Slide 32 text

Process Functional Macro

Slide 33

Slide 33 text

Functional programming (函數型programming)

Slide 34

Slide 34 text

Ruby JavaScript C++, Objective C, Swift C# are not (or partially) functional.

Slide 35

Slide 35 text

Programming languages that built on functional programming : Lisp (Emacs Lisp, Common Lisp, Scheme, Racket, Clojure…) ML (SML, OCaml, F#…) Markov algorithm (Pure, Mathematica…) Proof assistant (Coq, Agda, Idris, F*…) Concatenative (Joy, Factor, Kitten, …) Haskell, PureScript, Erlang, Scala, Lazy K, Elm, APL/J…

Slide 36

Slide 36 text

Programming languages that built on functional programming : Lisp (Emacs Lisp, Common Lisp, Scheme, Racket, Clojure…) ML (SML, OCaml, F#…) Markov algorithm (Pure, Mathematica…) Proof assistant (Coq, Agda, Idris, F*…) Concatenative (Joy, Factor, Kitten, …) Haskell, PureScript, Erlang, Scala, Lazy K, Elm, APL/J…

Slide 37

Slide 37 text

Recipe of Elixir : Clojure Erlang Ruby Elixir

Slide 38

Slide 38 text

Recipe of Elixir : Build Clojure (Lisp on JVM) in Ruby form on top of Erlang.

Slide 39

Slide 39 text

Elixir is functional. Higher-order function Immutable data No implicit state (except process & macro)

Slide 40

Slide 40 text

Elixir is functional. Higher-order function : Enum.map(1..42, &(&1 + 1))

Slide 41

Slide 41 text

Elixir is functional. Immutable data : data = update_in(data.a.b, &(&1 || 42))

Slide 42

Slide 42 text

Elixir is functional. No implicit state (except process & macro) : def get(key, state), do: {state[key], state}

Slide 43

Slide 43 text

Elixir is functional. Strong abstraction mechanism (See Haskell). Good debuggability. Good testability.

Slide 44

Slide 44 text

※Column Debugging tools for Elixir : :observer :observer_cli (3rd party) ReconTrace (3rd party wrapper of official :dbg) :fprof :eflame (3rd party)

Slide 45

Slide 45 text

Process Functional Macro

Slide 46

Slide 46 text

Recipe of Elixir : Build Clojure (Lisp on JVM) in Ruby form on top of Erlang.

Slide 47

Slide 47 text

Clojure & Ruby has nice meta-programming mechanism. Elixir has macro.

Slide 48

Slide 48 text

Macro is a function which convert a program to a program.

Slide 49

Slide 49 text

Use Case : GenServer To reduce boilerplate codes. defmodule Example do use GenServer End GenServer.start_link(Example, nil)

Slide 50

Slide 50 text

Use Case : Ecto To write declarative code (DSL). defmodule User do use Ecto.Schema schema “user” do field :name, :string, default: “ももんが” end end

Slide 51

Slide 51 text

Use Case : with_context (in our product) Implicit programming. card = with_context(context, get_card!(1))             ↑ {card, context} = get_card!(1, context) card

Slide 52

Slide 52 text

Elixir has Parallel process Functional Productive macro

Slide 53

Slide 53 text

Erlang & Elixir’s ecosystem : Web application (Phoenix, Ecto, Quantum) Bot (Hedwig) Web browser frontend (ElixirScript, Elchemy) IoT (Nerves, GRiSP) BlockChain (æternity) 3D modeling (Wings 3D) Message Queue (RabbitMQ, VerneMQ) DB (Riak, LeoFS)

Slide 54

Slide 54 text

Elixir完全に理解した