@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
@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
@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!
@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
@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
@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")
@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
@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