Slide 1

Slide 1 text

Pinball Elixir with Adrian P. Dunston

Slide 2

Slide 2 text

@bitcapulet Purpose To get you excited about Elixir. 2

Slide 3

Slide 3 text

@bitcapulet Purpose To get you excited about Elixir. So you’ll be more powerful. 3

Slide 4

Slide 4 text

@bitcapulet Purpose To get you excited about Elixir. So you’ll be more powerful. So your companies will start using it. 4

Slide 5

Slide 5 text

@bitcapulet Purpose To get you excited about Elixir. So you’ll be more powerful. So your companies will start using it. So my friends and I have more Elixir jobs available. 5

Slide 6

Slide 6 text

@bitcapulet Purpose To get you excited about Elixir. So you’ll be more powerful. So your companies will start using it. So my friends and I have more Elixir jobs available. Because I'm excited about Elixir. 6

Slide 7

Slide 7 text

@bitcapulet Story Time! 7

Slide 8

Slide 8 text

@bitcapulet Story Time! Kevin McAbee 8

Slide 9

Slide 9 text

@bitcapulet

Slide 10

Slide 10 text

@bitcapulet

Slide 11

Slide 11 text

@bitcapulet

Slide 12

Slide 12 text

@bitcapulet Story Time! Kevin McAbee 12

Slide 13

Slide 13 text

@bitcapulet13

Slide 14

Slide 14 text

@bitcapulet14

Slide 15

Slide 15 text

@bitcapulet15

Slide 16

Slide 16 text

@bitcapulet16

Slide 17

Slide 17 text

Adrian P. Dunston [email protected] @bitcapulet 17 joinpapa.com

Slide 18

Slide 18 text

18 Adrian P. Dunston [email protected] @bitcapulet 18 joinpapa.com

Slide 19

Slide 19 text

@bitcapulet What is essential? 19

Slide 20

Slide 20 text

@bitcapulet State complexity clearly. Steal from telephony. 20

Slide 21

Slide 21 text

@bitcapulet Elixir does two things very well. 21

Slide 22

Slide 22 text

@bitcapulet If you state your complexity clearly, it's easier to solve complex problems. 22

Slide 23

Slide 23 text

@bitcapulet If you state your complexity clearly, it's easier to solve complex problems. Distributed systems = complex problems 23

Slide 24

Slide 24 text

@bitcapulet If you state your complexity clearly, it's easier to solve complex problems. Functional programming forces this. 24

Slide 25

Slide 25 text

@bitcapulet If you state your complexity clearly, it's easier to solve complex problems. This is what ELIXIR brings to the table. 25

Slide 26

Slide 26 text

@bitcapulet Rob those phone companies blind! 26

Slide 27

Slide 27 text

@bitcapulet Rob those phone companies blind! 16 years of searching and building. 27

Slide 28

Slide 28 text

@bitcapulet Rob those phone companies blind! 16 years of searching and building. THEN 20 years of open-source improvements. 28

Slide 29

Slide 29 text

@bitcapulet Rob those phone companies blind! 16 years of searching and building. THEN 20 years of open-source improvements. 29 Now a fresh new language built on top!

Slide 30

Slide 30 text

@bitcapulet State complexity clearly. 30

Slide 31

Slide 31 text

@bitcapulet State complexity clearly. Steal from telephony. 31

Slide 32

Slide 32 text

@bitcapulet Magic Matching State complexity clearly. 32

Slide 33

Slide 33 text

@bitcapulet33

Slide 34

Slide 34 text

@bitcapulet34

Slide 35

Slide 35 text

@bitcapulet35

Slide 36

Slide 36 text

@bitcapulet36

Slide 37

Slide 37 text

@bitcapulet37

Slide 38

Slide 38 text

@bitcapulet38

Slide 39

Slide 39 text

@bitcapulet39

Slide 40

Slide 40 text

@bitcapulet40

Slide 41

Slide 41 text

@bitcapulet41

Slide 42

Slide 42 text

@bitcapulet42

Slide 43

Slide 43 text

@bitcapulet 42 43

Slide 44

Slide 44 text

@bitcapulet 'a' 44

Slide 45

Slide 45 text

@bitcapulet [1,2] 45

Slide 46

Slide 46 text

@bitcapulet :ok 46

Slide 47

Slide 47 text

@bitcapulet :ok ? 47

Slide 48

Slide 48 text

@bitcapulet :ok :oj :ol 48

Slide 49

Slide 49 text

@bitcapulet :ok :oj :ol :error :erroq :erros :adrian :adriam :adriao 49

Slide 50

Slide 50 text

@bitcapulet50

Slide 51

Slide 51 text

@bitcapulet51

Slide 52

Slide 52 text

@bitcapulet Plunger 52

Slide 53

Slide 53 text

@bitcapulet Plunger 53

Slide 54

Slide 54 text

@bitcapulet Plunger Playfield 54

Slide 55

Slide 55 text

@bitcapulet Plunger Playfield 55

Slide 56

Slide 56 text

@bitcapulet Plunger Playfield 56

Slide 57

Slide 57 text

@bitcapulet Plunger Playfield Drain 57

Slide 58

Slide 58 text

@bitcapulet Plunger Playfield Drain 58

Slide 59

Slide 59 text

@bitcapulet def run(ball) do ball end 59

Slide 60

Slide 60 text

@bitcapulet def run(ball) do ball; end 60

Slide 61

Slide 61 text

@bitcapulet def run(ball) do return ball; end 61

Slide 62

Slide 62 text

@bitcapulet def run(ball) do ball end Drain 62

Slide 63

Slide 63 text

@bitcapulet63

Slide 64

Slide 64 text

@bitcapulet64

Slide 65

Slide 65 text

@bitcapulet65

Slide 66

Slide 66 text

@bitcapulet66

Slide 67

Slide 67 text

@bitcapulet def run(a,b,c,d) do # ummm... end 67

Slide 68

Slide 68 text

@bitcapulet def run(a,b,c,d) do [d,c,b,a] end 68

Slide 69

Slide 69 text

@bitcapulet69

Slide 70

Slide 70 text

@bitcapulet def run(a,b,c,d) do [d,c,b,a] end 70

Slide 71

Slide 71 text

@bitcapulet71

Slide 72

Slide 72 text

@bitcapulet72

Slide 73

Slide 73 text

@bitcapulet73

Slide 74

Slide 74 text

@bitcapulet [ , , , ] 74

Slide 75

Slide 75 text

@bitcapulet [ , , , ] a b c d 75

Slide 76

Slide 76 text

@bitcapulet [ , , , ] a b c d def get_odd(list) do a = Enum.at(list, 0) c = Enum.at(list, 2) [a, c] end 76

Slide 77

Slide 77 text

@bitcapulet77

Slide 78

Slide 78 text

@bitcapulet [a, b, c, d] [ , , , ] 78

Slide 79

Slide 79 text

@bitcapulet [ , , , ] [ , , , ] 79

Slide 80

Slide 80 text

@bitcapulet [ , , , ] [ , , , ] 80

Slide 81

Slide 81 text

@bitcapulet [ , , , ] [ , , , ] 81

Slide 82

Slide 82 text

@bitcapulet [ , , , ] [ , , , ] 82

Slide 83

Slide 83 text

@bitcapulet [ , , , ] a b c d def get_odd(list) do a = Enum.at(list, 0) c = Enum.at(list, 2) [a, c] end 83

Slide 84

Slide 84 text

@bitcapulet [ , , , ] a b c d def get_odd(list) do [a, b, c, d] list [a, c] end 84

Slide 85

Slide 85 text

@bitcapulet [ , , , ] a b c d def get_odd(list) do [a, _, c, _] list [a, c] end 85

Slide 86

Slide 86 text

@bitcapulet [ , , , ] a b c d def get_odd(list) do [a, _b, c, _d] list [a, c] end 86

Slide 87

Slide 87 text

@bitcapulet Captive Ball 87

Slide 88

Slide 88 text

@bitcapulet Multiball!! 88

Slide 89

Slide 89 text

@bitcapulet Kicker 89

Slide 90

Slide 90 text

@bitcapulet90

Slide 91

Slide 91 text

@bitcapulet91

Slide 92

Slide 92 text

@bitcapulet %{name: "Adrian"} 92

Slide 93

Slide 93 text

@bitcapulet %{name: "Adrian"} jsObject = {"name": "Adrian"} 93

Slide 94

Slide 94 text

@bitcapulet Map map = new HashMap(); map.put("name","Adrian"); 94

Slide 95

Slide 95 text

@bitcapulet %{name: "Adrian"} 95

Slide 96

Slide 96 text

@bitcapulet %{ name: "Adrian", age: 40, fav_capt: "Picard" } 96

Slide 97

Slide 97 text

@bitcapulet human = %{ name: "Adrian", age: 40, fav_capt: "Picard" } 97

Slide 98

Slide 98 text

@bitcapulet human = %{ name: "Adrian", age: 40, fav_capt: "Picard" } 98

Slide 99

Slide 99 text

@bitcapulet human = %{ name: , age: , fav_capt: } 99

Slide 100

Slide 100 text

@bitcapulet human 100

Slide 101

Slide 101 text

@bitcapulet %{name: var} human 101

Slide 102

Slide 102 text

@bitcapulet %{name: var} human 102

Slide 103

Slide 103 text

@bitcapulet %{name: var} human 103

Slide 104

Slide 104 text

@bitcapulet %{name: var} human 104

Slide 105

Slide 105 text

@bitcapulet %{name: var} "Adrian" human 105

Slide 106

Slide 106 text

@bitcapulet def get_name(map) do %{name: var} map var end 106

Slide 107

Slide 107 text

@bitcapulet def get_name(map) do %{name: var} map var end get_name(%{}) 107

Slide 108

Slide 108 text

@bitcapulet get_name(%{}) 108

Slide 109

Slide 109 text

@bitcapulet get_name(%{}) %{} 109

Slide 110

Slide 110 text

@bitcapulet %{} Cookie Monster CONFIRMED!! 110

Slide 111

Slide 111 text

@bitcapulet %{ } Cookie Monster CONFIRMED!! 111

Slide 112

Slide 112 text

@bitcapulet %{0} Cookie Monster CONFIRMED!! 112

Slide 113

Slide 113 text

@bitcapulet %{} Cookie Monster CONFIRMED!! 113

Slide 114

Slide 114 text

@bitcapulet %{*} Cookie Monster CONFIRMED!! 114

Slide 115

Slide 115 text

@bitcapulet %{} Cookie Monster CONFIRMED!! 115

Slide 116

Slide 116 text

@bitcapulet %{.} Cookie Monster CONFIRMED!! 116

Slide 117

Slide 117 text

@bitcapulet %{} Cookie Monster CONFIRMED!! 117

Slide 118

Slide 118 text

@bitcapulet %{} Me love it! 118

Slide 119

Slide 119 text

@bitcapulet119

Slide 120

Slide 120 text

@bitcapulet def get_name(map) do %{name: var} map var end get_name(%{}) 120

Slide 121

Slide 121 text

@bitcapulet def get_name(map) do %{name: var} map var end get_name(%{}) ** (MatchError) no match of right hand side value: %{} 121

Slide 122

Slide 122 text

@bitcapulet %{} What you mean let process fail?! 122

Slide 123

Slide 123 text

@bitcapulet123

Slide 124

Slide 124 text

@bitcapulet124

Slide 125

Slide 125 text

@bitcapulet def get_name(map) do %{name: var} map var end get_name(%{}) ** (MatchError) no match of right hand side value: %{} 125 Not just for getting values!

Slide 126

Slide 126 text

@bitcapulet %{name: _, age: _, fav_capt: _ } my_map 126

Slide 127

Slide 127 text

@bitcapulet %{"name" => _, "age" => _, "fav.capt." => "Picard" } my_map %{name: _, age: _, fav_capt: "Picard" } my_map 127

Slide 128

Slide 128 text

@bitcapulet128

Slide 129

Slide 129 text

@bitcapulet %{"name" => _, "age" => _, "fav.capt." => "Picard" } my_map %{name: _, age: _, fav_capt: "Picard" } my_map 129

Slide 130

Slide 130 text

@bitcapulet %{"name" => _, "age" => _, "fav.capt." => "Picard" } my_map [ %{fav_capt: "Kirk"}, %{fav_capt: "Picard"}, %{fav_capt: "Sisko"}, %{fav_capt: "Janeway"}, ] list_of_maps 130

Slide 131

Slide 131 text

@bitcapulet %{"name" => _, "age" => _, "fav.capt." => "Picard" } my_map [ %{fav_capt: "Kirk"}, %{fav_capt: "Picard"}, %{fav_capt: "Sisko"}, %{fav_capt: "Janeway"}, %{fav_capt: ["Kirk", "Sisko"] ] list_of_maps_with_lists 131

Slide 132

Slide 132 text

@bitcapulet %{"name" => _, "age" => _, "fav.capt." => "Picard" } my_map [ %{fav_capt: "Kirk", age: var}, %{fav_capt: "Picard"}, %{fav_capt: "Sisko"}, %{fav_capt: "Janeway"}, %{fav_capt: ["Kirk", "Sisko"] ] list_of_maps_with_lists 132

Slide 133

Slide 133 text

@bitcapulet [ , , , ] [ , , , ] 133 VALUES!

Slide 134

Slide 134 text

@bitcapulet [ , , , ] [ , , , ] 134 VALUES!

Slide 135

Slide 135 text

@bitcapulet [ , , , ] [ , , , ] 135 VALUES!

Slide 136

Slide 136 text

@bitcapulet [ , , , ] [ , , , ] 136 VALUES!

Slide 137

Slide 137 text

@bitcapulet [ , , , ] [ , , , ] 137 VALUES!

Slide 138

Slide 138 text

@bitcapulet138 FORMATS!

Slide 139

Slide 139 text

@bitcapulet139 values in deep structures too!

Slide 140

Slide 140 text

@bitcapulet = 140

Slide 141

Slide 141 text

@bitcapulet >%{} Of course it equal sign! Everyone guess that! Why you use clipart in first place? 141

Slide 142

Slide 142 text

@bitcapulet {:ok, "Jean-Luc Picard"} = get_fav_capt(human) 142

Slide 143

Slide 143 text

@bitcapulet {:ok, "Jean-Luc Picard"} = get_fav_capt(human) 143

Slide 144

Slide 144 text

@bitcapulet cookie = "delicious" 144

Slide 145

Slide 145 text

@bitcapulet cookie = "delicious" %{} Okay. This me can get behind. 145

Slide 146

Slide 146 text

@bitcapulet case 2 + 2 4 -> "hurray" 3 -> "oops" end 146

Slide 147

Slide 147 text

@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" end 147

Slide 148

Slide 148 text

@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var -> "Got number: #{var}" end 148

Slide 149

Slide 149 text

@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var -> "Got number: #{var}" end 149

Slide 150

Slide 150 text

@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var -> "Got number: #{var}" [1, 2, 3] -> "123 list" end 150

Slide 151

Slide 151 text

@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var -> "got number: #{var}" [1, 2, 3] -> "123 list" end 151

Slide 152

Slide 152 text

@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var -> "got number: #{var}" [1, 2, 3] -> "123 list" end [ , , , ] 1 2 3 152

Slide 153

Slide 153 text

@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var -> "got number: #{var}" [1, 2, 3] -> "123 list" end [ , , , ] 1 2 3 153

Slide 154

Slide 154 text

@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var -> "got number: #{var}" [1, 2, 3] -> "123 list" end [ , , , ] 1 2 3 154

Slide 155

Slide 155 text

@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var -> "got number: #{var}" [1, 2, 3] -> "123 list" end 155

Slide 156

Slide 156 text

@bitcapulet case 4 -> "hurray" 3 -> "oops" var -> "got number: #{var}" [1, 2, 3] -> "123 list" end 156

Slide 157

Slide 157 text

@bitcapulet case 4 -> "hurray" 3 -> "oops" var -> "got number: #{var}" [1, 2, 3] -> "123 list" end 157

Slide 158

Slide 158 text

@bitcapulet case 4 -> "hurray" 3 -> "oops" var -> "got number: #{var}" [1, 2, 3] -> "123 list" end 158

Slide 159

Slide 159 text

@bitcapulet case 4 -> "hurray" 3 -> "oops" var -> "got number: #{var}" [1, 2, 3] -> "123 list" end 159

Slide 160

Slide 160 text

@bitcapulet case 4 -> "hurray" 3 -> "oops" var -> "got number: #{var}" [1, 2, 3] -> "123 list" end 160

Slide 161

Slide 161 text

@bitcapulet case 4 -> "hurray" 3 -> "oops" var -> "got number: #{var}" [1, 2, 3] -> "123 list" end 161

Slide 162

Slide 162 text

@bitcapulet case 4 -> "hurray" 3 -> "oops" var -> "got number: #{var}" [1, 2, 3] -> "123 list" end 162

Slide 163

Slide 163 text

@bitcapulet case 4 -> "hurray" 3 -> "oops" var -> "got number: #{var}" [1, 2, 3] -> "123 list" end 163

Slide 164

Slide 164 text

@bitcapulet case 4 -> "hurray" 3 -> "oops" var -> "got number: #{var}" [1, 2, 3] -> "123 list" end 164

Slide 165

Slide 165 text

@bitcapulet case 4 -> "hurray" 3 -> "oops" var -> [1, 2, 3] -> "123 list" end 165

Slide 166

Slide 166 text

@bitcapulet case 4 -> "hurray" 3 -> "oops" var -> [1, 2, 3] -> "123 list" end 166

Slide 167

Slide 167 text

@bitcapulet case 4 -> "hurray" 3 -> "oops" var -> [1, 2, 3] -> "123 list" end 167

Slide 168

Slide 168 text

@bitcapulet case 4 -> "hurray" 3 -> "oops" var -> [1, 2, 3] -> "123 list" end 168

Slide 169

Slide 169 text

@bitcapulet case 4 -> "hurray" 3 -> "oops" var -> [1, 2, 3] -> "123 list" end 169

Slide 170

Slide 170 text

@bitcapulet case 4 -> "hurray" 3 -> "oops" var -> [1, 2, 3] -> "123 list" end 170

Slide 171

Slide 171 text

@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var -> "got number: #{var}" [1, 2, 3] -> "123 list" end 171

Slide 172

Slide 172 text

@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var -> "got number: #{var}" [1, 2, 3] -> "123 list" end 172

Slide 173

Slide 173 text

@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" [1, 2, 3] -> "123 list" var -> "got number: #{var}" end 173

Slide 174

Slide 174 text

@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" [1, 2, 3] -> "123 list" var -> "got number: #{var}" end 174

Slide 175

Slide 175 text

@bitcapulet %{} That long section. 175

Slide 176

Slide 176 text

@bitcapulet %{} That long section. Me need break. 176

Slide 177

Slide 177 text

@bitcapulet177

Slide 178

Slide 178 text

@bitcapulet178

Slide 179

Slide 179 text

@bitcapulet179

Slide 180

Slide 180 text

@bitcapulet180

Slide 181

Slide 181 text

@bitcapulet181

Slide 182

Slide 182 text

@bitcapulet Beam Processes Steal from telephony. 182

Slide 183

Slide 183 text

@bitcapulet183

Slide 184

Slide 184 text

@bitcapulet184

Slide 185

Slide 185 text

@bitcapulet185

Slide 186

Slide 186 text

@bitcapulet186

Slide 187

Slide 187 text

@bitcapulet187

Slide 188

Slide 188 text

@bitcapulet188

Slide 189

Slide 189 text

@bitcapulet189

Slide 190

Slide 190 text

@bitcapulet190

Slide 191

Slide 191 text

@bitcapulet191

Slide 192

Slide 192 text

@bitcapulet192

Slide 193

Slide 193 text

@bitcapulet193

Slide 194

Slide 194 text

@bitcapulet 134 Million Processes 194

Slide 195

Slide 195 text

@bitcapulet 134 Million Processes 195

Slide 196

Slide 196 text

@bitcapulet 134 Million Processes 196

Slide 197

Slide 197 text

@bitcapulet 134 Million Processes 197

Slide 198

Slide 198 text

@bitcapulet 134 Million Processes 198

Slide 199

Slide 199 text

@bitcapulet 134 Million Processes 199

Slide 200

Slide 200 text

@bitcapulet 134 Million Processes 200

Slide 201

Slide 201 text

@bitcapulet 134 Million Processes 201

Slide 202

Slide 202 text

@bitcapulet 134 Million Processes 202

Slide 203

Slide 203 text

@bitcapulet 134 Million Processes 203

Slide 204

Slide 204 text

@bitcapulet defmodule MyModule def phil(state) do phil(state + 1) end end 204

Slide 205

Slide 205 text

@bitcapulet defmodule MyModule def phil(state) do receive do value -> IO.puts("count: " <> state) IO.puts("Phil got: " <> value) end phil(state + 1) end end 205

Slide 206

Slide 206 text

@bitcapulet Interactive Elixir (1.6.1) - press Ctrl+C to exit (type h() ENTER for help) iex(1)> 206

Slide 207

Slide 207 text

@bitcapulet Interactive Elixir (1.6.1) - press Ctrl+C to exit (type h() ENTER for help) iex(1)> IO.puts("Hello, world!") Hello, world! :ok iex(2)> 207

Slide 208

Slide 208 text

@bitcapulet iex(2)> pid = spawn(MyModule, :phil, 0) #PID<0.97.0> iex(3)> 208

Slide 209

Slide 209 text

@bitcapulet iex(2)> pid = spawn(MyModule, :phil, 0) #PID<0.97.0> iex(3)> Process.alive?(pid) true iex(4)> 209

Slide 210

Slide 210 text

@bitcapulet iex(2)> pid = spawn(MyModule, :phil, 0) #PID<0.97.0> iex(3)> Process.alive?(pid) true iex(4)> send(pid, "hello") count: 0 Phil got: hello "hello" iex(5)> 210

Slide 211

Slide 211 text

@bitcapulet iex(2)> pid = spawn(MyModule, :phil, 0) #PID<0.97.0> iex(3)> Process.alive?(pid) true iex(4)> send(pid, "hello") count: 0 Phil got: hello "hello" iex(5)> send(pid, "hello") count: 1 Phil got: hello "hello" 211

Slide 212

Slide 212 text

@bitcapulet spawn receive send 212 Built right into the language!

Slide 213

Slide 213 text

@bitcapulet A process is a recursive function that holds state and lives at an address with a mailbox. <0.194.0> 213

Slide 214

Slide 214 text

@bitcapulet >%{} We back in OO-land! 214

Slide 215

Slide 215 text

@bitcapulet >%{} We back in OO-land! How this not just uglier-Java?! 215

Slide 216

Slide 216 text

@bitcapulet216

Slide 217

Slide 217 text

@bitcapulet x x 217

Slide 218

Slide 218 text

@bitcapulet x x x x x x x x x x x x x x 218

Slide 219

Slide 219 text

@bitcapulet219

Slide 220

Slide 220 text

@bitcapulet220

Slide 221

Slide 221 text

@bitcapulet221

Slide 222

Slide 222 text

@bitcapulet222

Slide 223

Slide 223 text

@bitcapulet223

Slide 224

Slide 224 text

@bitcapulet224

Slide 225

Slide 225 text

@bitcapulet 225

Slide 226

Slide 226 text

@bitcapulet 226

Slide 227

Slide 227 text

@bitcapulet 227

Slide 228

Slide 228 text

@bitcapulet 228

Slide 229

Slide 229 text

@bitcapulet 229

Slide 230

Slide 230 text

@bitcapulet 230

Slide 231

Slide 231 text

@bitcapulet 231

Slide 232

Slide 232 text

@bitcapulet %{} Break time 232

Slide 233

Slide 233 text

@bitcapulet233

Slide 234

Slide 234 text

@bitcapulet234

Slide 235

Slide 235 text

@bitcapulet235

Slide 236

Slide 236 text

@bitcapulet236

Slide 237

Slide 237 text

@bitcapulet237

Slide 238

Slide 238 text

@bitcapulet Function Signatures State complexity clearly. 238

Slide 239

Slide 239 text

@bitcapulet def run(a,b,c,d) do [d,c,b,a] end 239

Slide 240

Slide 240 text

@bitcapulet def run(a,b,c,d) do [d,c,b,a] end 240 Uneven

Slide 241

Slide 241 text

@bitcapulet def run(list) do [a,b,c,d] = list [d,c,b,a] end 241

Slide 242

Slide 242 text

@bitcapulet def run(list) do [a,b,c,d] = list [d,c,b,a] end 242 What if > 4 items?

Slide 243

Slide 243 text

@bitcapulet run([1,2,3,4,5]) ** (MatchError) no match of right hand side value: [1, 2, 3, 4, 5] 243

Slide 244

Slide 244 text

@bitcapulet def run(list) do [a,b,c,d] = list [d,c,b,a] end 244 object?

Slide 245

Slide 245 text

@bitcapulet {tuple} 245

Slide 246

Slide 246 text

@bitcapulet quartet = {1,2,3,4} trio = {"one", 2, %{}} 246

Slide 247

Slide 247 text

@bitcapulet def run(tuple) do {a,b,c,d} = tuple {d,c,b,a} end 247

Slide 248

Slide 248 text

@bitcapulet def run(tuple) do {a,b,c,d} = tuple {d,c,b,a} end 248

Slide 249

Slide 249 text

@bitcapulet def run({a,b,c,d}) do {d,c,b,a} end 249

Slide 250

Slide 250 text

@bitcapulet def run(tuple = {a,b,c,d}) do IO.inspect(tuple) {d,c,b,a} end 250

Slide 251

Slide 251 text

@bitcapulet def run(tuple = {a,b,c,d}) do IO.inspect(tuple) {d,c,b,a} end 251 Now reverse 5!

Slide 252

Slide 252 text

@bitcapulet def run(tuple = {a,b,c,d}) do IO.inspect(tuple) {d,c,b,a} end def run(tuple = {a,b,c,d,e}) do IO.inspect(tuple) {e,d,c,b,a} end 252

Slide 253

Slide 253 text

@bitcapulet def run(tuple = {a,b,c,d}) do IO.inspect(tuple) {d,c,b,a} end def run(tuple = {a,b,c,d,e}) do IO.inspect(tuple) {e,d,c,b,a} end 253

Slide 254

Slide 254 text

@bitcapulet def run(tuple = {a,b,c,d}) do IO.inspect(tuple) {d,c,b,a} end def run(tuple = {a,b,c,d,e}) do IO.inspect(tuple) {e,d,c,b,a} end 254

Slide 255

Slide 255 text

@bitcapulet def run(tuple = {a,b,c,d}) do IO.inspect(tuple) {d,c,b,a} end def run(tuple = {a,b,c,d,e}) do IO.inspect(tuple) {e,d,c,b,a} end 255

Slide 256

Slide 256 text

@bitcapulet def run(tuple = {a,b,c,d}) do IO.inspect(tuple) {d,c,b,a} end def run(tuple = {a,b,c,d,e}) do IO.inspect(tuple) {e,d,c,b,a} end 256

Slide 257

Slide 257 text

@bitcapulet def run(tuple = {a,b,c,d}) do IO.inspect(tuple) {d,c,b,a} end def run(tuple = {a,b,c,d,e}) do IO.inspect(tuple) {e,d,c,b,a} end 257

Slide 258

Slide 258 text

@bitcapulet def run(tuple = {a,b,c,d}) do IO.inspect(tuple) {d,c,b,a} end def run(tuple = {a,b,c,d,e}) do IO.inspect(tuple) {e,d,c,b,a} end 258

Slide 259

Slide 259 text

@bitcapulet This is why Java has factories! 259

Slide 260

Slide 260 text

@bitcapulet GenServer Steal from telephony. 260

Slide 261

Slide 261 text

@bitcapulet A process is a recursive function that holds state and lives at an address with a mailbox. <0.194.0> 261

Slide 262

Slide 262 text

@bitcapulet A GenServer is like a Starfleet officer 262

Slide 263

Slide 263 text

@bitcapulet defmodule Phil do IO.puts("Phil got: " <> value) end 263

Slide 264

Slide 264 text

@bitcapulet defmodule Phil do use GenServer def init(_args), do: 0 def handle_cast(value, from, state) do IO.puts("Phil got: " <> value) {:noreply, state + 1} end end 264

Slide 265

Slide 265 text

@bitcapulet defmodule Phil do use GenServer def init(_args), do: 0 def handle_cast(value, from, state) do IO.puts("Phil got: " <> value) {:noreply, state + 1} end end 265

Slide 266

Slide 266 text

@bitcapulet defmodule Phil do use GenServer def init(_args), do: 0 def handle_cast(value, from, state) do IO.puts("Phil got: " <> value) {:noreply, state + 1} end end 266

Slide 267

Slide 267 text

@bitcapulet defmodule Phil do use GenServer def init(_args), do: 0 def handle_cast(value, from, state) do IO.puts("Phil got: " <> value) {:noreply, state + 1} end end 267

Slide 268

Slide 268 text

@bitcapulet defmodule Phil do use GenServer def init(_args), do: 0 def handle_cast(value, from, state) do IO.puts("Phil got: " <> value) {:noreply, state + 1} end def handle_call(:say_something, from, state) do {:reply, "something", state} end end 268

Slide 269

Slide 269 text

@bitcapulet {:ok, pid} = GenServer.start_link(Phil, "arg") def init(_args), do: 0 Spawn a GenServer 269

Slide 270

Slide 270 text

@bitcapulet Asynchronous requests def handle_cast(value, from, state) do IO.puts("Phil got: " <> value) {:noreply, state + 1} end GenServer.cast(pid, "a present") move_right_along() 270

Slide 271

Slide 271 text

@bitcapulet def handle_call(:say_something, from, state) do IO.puts("Phil got: " <> value) {:reply, "Thanks", state} end Synchronous requests reply = GenServer.call(pid, :say_something) 271

Slide 272

Slide 272 text

@bitcapulet Synchronous requests reply = GenServer.call(pid, :say_something) 272 PID passing gets old

Slide 273

Slide 273 text

@bitcapulet GenServer.start_link(Phil, "arg", name: :phil) Fee pid Registry 273

Slide 274

Slide 274 text

@bitcapulet GenServer.start_link(Phil, "arg", name: :phil) GenServer.cast(:phil, "a present with your name on it") Fee pid Registry 274

Slide 275

Slide 275 text

@bitcapulet GenServer.start_link(Phil, "arg", name: :phil) GenServer.cast(:phil, "a present with your name on it") pid = Process.whereis(:phil) Fee pid Registry 275

Slide 276

Slide 276 text

@bitcapulet Supervisors 276

Slide 277

Slide 277 text

@bitcapulet Supervisors 277

Slide 278

Slide 278 text

@bitcapulet defmodule CaptJoan do use Supervisor def init(_args) do children = [ {Phil, []} ] Supervisor.init(children, strategy: :one_for_one) end end 278

Slide 279

Slide 279 text

@bitcapulet defmodule CaptJoan do use Supervisor def init(_args) do children = [ {Phil, []} ] Supervisor.init(children, strategy: :one_for_one) end end 279

Slide 280

Slide 280 text

@bitcapulet defmodule CaptJoan do use Supervisor def init(_args) do children = [ {Phil, []} ] Supervisor.init(children, strategy: :one_for_one) end end 280

Slide 281

Slide 281 text

@bitcapulet defmodule CaptJoan do use Supervisor def init(_args) do children = [ {Phil, []}, {Phil, []}, {Phil, []} ] Supervisor.init(children, strategy: :one_for_one) end end 281

Slide 282

Slide 282 text

@bitcapulet defmodule CaptJoan do use Supervisor def init(_args) do children = [ {Phil, []}, {Phil, []}, {Phil, []} ] Supervisor.init(children, strategy: :one_for_one) end end 282

Slide 283

Slide 283 text

@bitcapulet 283

Slide 284

Slide 284 text

@bitcapulet 284

Slide 285

Slide 285 text

@bitcapulet 285

Slide 286

Slide 286 text

@bitcapulet defmodule CaptJoan do use Supervisor def init(_args) do children = [ {Phil, []}, {Phil, []}, {Phil, ["arg"]} ] Supervisor.init(children, strategy: :one_for_one) end end 286

Slide 287

Slide 287 text

@bitcapulet defmodule CaptJoan do use Supervisor def init(_args) do children = [ {Phil, []}, {Phil, []}, {Phil, ["arg"]} ] Supervisor.init(children, strategy: :one_for_all) end end 287

Slide 288

Slide 288 text

@bitcapulet defmodule AdmiralRavi do use Supervisor def init(_args) do children = [ {CaptJoan, []}, {CaptJoan, []}, {CaptJoan, []} ] Supervisor.init(children, strategy: :one_for_one) end end 288

Slide 289

Slide 289 text

@bitcapulet289

Slide 290

Slide 290 text

@bitcapulet290

Slide 291

Slide 291 text

@bitcapulet291

Slide 292

Slide 292 text

@bitcapulet292

Slide 293

Slide 293 text

@bitcapulet293

Slide 294

Slide 294 text

@bitcapulet294

Slide 295

Slide 295 text

@bitcapulet295

Slide 296

Slide 296 text

@bitcapulet296

Slide 297

Slide 297 text

@bitcapulet297

Slide 298

Slide 298 text

@bitcapulet298

Slide 299

Slide 299 text

@bitcapulet299

Slide 300

Slide 300 text

@bitcapulet300

Slide 301

Slide 301 text

@bitcapulet301

Slide 302

Slide 302 text

@bitcapulet302

Slide 303

Slide 303 text

@bitcapulet303

Slide 304

Slide 304 text

@bitcapulet #PID<0.96.0> <0.194.0> 304

Slide 305

Slide 305 text

@bitcapulet305 send(pid, "hello") GenServer.cast(:phil, "a present with your name on it")

Slide 306

Slide 306 text

@bitcapulet ◍ timeouts ◍ linking processes ◌ monitoring ◌ trapping exits ◍ error handling Other benefits 306

Slide 307

Slide 307 text

@bitcapulet defmodule AdmiralRavi do use Supervisor def init(_args) do children = [ {CaptJoan, []}, {CaptJoan, []}, {CaptJoan, []} ] Supervisor.init(children, strategy: :one_for_one) end end 307

Slide 308

Slide 308 text

@bitcapulet %{} ME WANT MORE BREAK! 308

Slide 309

Slide 309 text

@bitcapulet

Slide 310

Slide 310 text

@bitcapulet

Slide 311

Slide 311 text

@bitcapulet

Slide 312

Slide 312 text

@bitcapulet

Slide 313

Slide 313 text

@bitcapulet

Slide 314

Slide 314 text

@bitcapulet Function Pipeline State complexity clearly 314

Slide 315

Slide 315 text

@bitcapulet def fav_capt(:kirk) do {:error, "Are you kidding me?"} end def fav_capt(:picard) do {:ok, "You chose wisely."} end 315

Slide 316

Slide 316 text

@bitcapulet capt = :picard {:ok, message} = fav_capt(capt) IO.puts(message) 316

Slide 317

Slide 317 text

@bitcapulet capt = :kirk {:ok, message} = fav_capt(capt) IO.puts(message) ** (MatchError) no match of right hand side value: {:error, "Are you kidding me?"} 317

Slide 318

Slide 318 text

@bitcapulet capt = :kirk case fav_capt(capt) {:ok, msg} -> msg {:error, msg} -> Log.error("oops") end 318

Slide 319

Slide 319 text

@bitcapulet capt = :kirk case fav_capt(capt) {:ok, msg} -> msg {:error, _msg} -> Log.error("oops") end 319

Slide 320

Slide 320 text

@bitcapulet capt = :kirk case fav_capt(capt) {:ok, msg} -> msg {:error, _msg} -> Log.error("oops") {_, _msg} -> Log.error("What?!") end 320

Slide 321

Slide 321 text

@bitcapulet capt = :kirk case fav_capt(capt) {:ok, msg} -> msg {:error, _msg} -> Log.error("oops") {_, _msg} -> Log.error("What?!") _ -> Log.error("Oh dear.") end 321

Slide 322

Slide 322 text

@bitcapulet case fav_capt(capt) {:ok, msg} -> Log.info("That went well.") msg {:error, _msg} -> Log.error("oops") {_, _msg} -> Log.error("What?!") _ -> Log.error("Oh dear.") end 322

Slide 323

Slide 323 text

@bitcapulet def respond({:ok, msg}) do Log.info("That went well.") msg end def respond({:error, _msg}) do Log.error("oops") end 323

Slide 324

Slide 324 text

@bitcapulet respond(fav_capt(capt)) 324

Slide 325

Slide 325 text

@bitcapulet respond(fav_capt(capt)) capt |> fav_capt() |> respond() 325

Slide 326

Slide 326 text

@bitcapulet326

Slide 327

Slide 327 text

@bitcapulet capt |> fav_capt() |> respond() 327

Slide 328

Slide 328 text

@bitcapulet capt.fav_capt().respond() // This is constrained. 328

Slide 329

Slide 329 text

@bitcapulet capt |> fav_capt() |> respond() 329

Slide 330

Slide 330 text

@bitcapulet capt |> 330

Slide 331

Slide 331 text

@bitcapulet capt |> beam_to_planet() 331

Slide 332

Slide 332 text

@bitcapulet capt |> beam_to_planet() |> meet_aliens() 332

Slide 333

Slide 333 text

@bitcapulet capt |> beam_to_planet() |> meet_aliens() |> romance?() 333

Slide 334

Slide 334 text

@bitcapulet capt |> beam_to_planet() |> meet_aliens() |> romance?() |> case do {:ok, details} -> log(details) :error -> kill_off_extra() end 334

Slide 335

Slide 335 text

@bitcapulet capt |> beam_to_planet() |> meet_aliens() |> romance?() |> case do {:ok, details} -> log(details) :error -> kill_off_extra() end 335

Slide 336

Slide 336 text

@bitcapulet capt |> beam_to_planet() |> meet_aliens() |> romance?() |> case do {:ok, details} -> log(details) :error -> kill_off_extra() end 336

Slide 337

Slide 337 text

@bitcapulet [1, 2, 3] 337

Slide 338

Slide 338 text

@bitcapulet [1, 2, 3] |> Enum.map(fn i -> i + 1 end) # [2, 3, 4] 338

Slide 339

Slide 339 text

@bitcapulet [1, 2, 3] |> Enum.map(fn i -> i + 1 end) |> Enum.sum() # 9 339

Slide 340

Slide 340 text

@bitcapulet %{} It late. Wrap it up. 340

Slide 341

Slide 341 text

@bitcapulet341 GenServer.start_link(CircleKeeper,[], name: :circle_keeper) GenServer.cast(:circle_keeper, {:add, %Circle{radius: 3}) total_area = GenServer.call(:circle_keeper, :total_area)

Slide 342

Slide 342 text

@bitcapulet defmodule CircleKeeper do use GenServer def init(starting_circles), do: starting_circles def handle_cast({:add, circle}, _, circles), do: {:noreply, circles ++ circle} def handle_call(:total_area, circles), do: {:reply, sum_radii(circles), circles} defp sum_radii(circles) do circles |> Enum.map(fn c -> Circle.area(c.radius) end) |> Enum.sum() end end 342

Slide 343

Slide 343 text

@bitcapulet {} 343

Slide 344

Slide 344 text

@bitcapulet %{} 344

Slide 345

Slide 345 text

@bitcapulet %{} 345

Slide 346

Slide 346 text

@bitcapulet %{} 346

Slide 347

Slide 347 text

@bitcapulet %{} Me here to say something inspiring to end talk. 347

Slide 348

Slide 348 text

@bitcapulet %{} Language not really most important thing. 348

Slide 349

Slide 349 text

@bitcapulet %{} It matter you do job. 349

Slide 350

Slide 350 text

@bitcapulet %{} It matter you do job. And you happy with job you do. 350

Slide 351

Slide 351 text

@bitcapulet %{} It also matter you make lots of money. 351

Slide 352

Slide 352 text

@bitcapulet %{} This language not make more money. 352

Slide 353

Slide 353 text

@bitcapulet %{} This language not make more money. But maybe make more happy. 353

Slide 354

Slide 354 text

@bitcapulet %{} Adrian happy. 354

Slide 355

Slide 355 text

@bitcapulet %{} Adrian happy. He crazy. 355

Slide 356

Slide 356 text

@bitcapulet %{} Adrian happy. He crazy. But he happy. 356

Slide 357

Slide 357 text

@bitcapulet %{} He right about Elixir. It great. 357

Slide 358

Slide 358 text

@bitcapulet %{} Me hope you friends try it out. 358

Slide 359

Slide 359 text

@bitcapulet %{} 359

Slide 360

Slide 360 text

@bitcapulet %{} You know how you thank me. 360

Slide 361

Slide 361 text

@bitcapulet %{ } 361

Slide 362

Slide 362 text

@bitcapulet %{0} 362

Slide 363

Slide 363 text

@bitcapulet %{} 363

Slide 364

Slide 364 text

@bitcapulet %{*} 364

Slide 365

Slide 365 text

@bitcapulet %{} 365

Slide 366

Slide 366 text

@bitcapulet %{.} 366

Slide 367

Slide 367 text

@bitcapulet %{} 367

Slide 368

Slide 368 text

@bitcapulet %{} Bye! 368

Slide 369

Slide 369 text

@bitcapulet %{} 369

Slide 370

Slide 370 text

@bitcapulet %{} 370

Slide 371

Slide 371 text

@bitcapulet %{} 371

Slide 372

Slide 372 text

@bitcapulet %{} 372

Slide 373

Slide 373 text

@bitcapulet %{} 373

Slide 374

Slide 374 text

@bitcapulet %{} 374

Slide 375

Slide 375 text

@bitcapulet375

Slide 376

Slide 376 text

@bitcapulet Pinball Elixir Presentation template by SlidesCarnival 376 Adrian P. Dunston @bitcapulet [email protected] joinpapa.com