Matthew Rudy Jacobs
August 12, 2015
150

# Elixir - Part 1

A talk about Elixir and OTP given at Codeaholics in Hong Kong on August 12th 2015

August 12, 2015

## Transcript

1. Real-time Apps
With Elixir
Matthew Rudy Jacobs
@ Codeaholics HK

2. THE PROBLEM SPACE

3. Line
100s of millions of
online users
Can’t lose a message
Don’t want downtime

4. Uber
100,000s online
users
Can’t lose a message
Don’t want downtime

5. GoGoVan
? online users
Can’t lose a message
Don’t want
downtime

6. THE SOLUTION?

7. Erlang
The Movie

8. Ericsson (in 1998)
99.9999999% UPTIME
32MS / YEAR

9. Ericsson (in 1998)
99.9999999% UPTIME
< 1SECOND / 20 YEARS

10. Whatsapp
64 billion messages per day
700 million monthly active users
1000 servers doing the work

11. 4 Parts

12. Erlang
Elixir
OTP
Phoenix

13. Part 1
Erlang

14. WHAT IS ERLANG?

15. Erlang
• functional
• concurrent
• realtime

16. Erlang
• pattern matching
• message passing
• actors

17. -module(roman).
-export([to_roman/1]).
to_roman(0) -> [];
to_roman(X) when X >= 1000 -> [\$M | to_roman(X - 1000)];
to_roman(X) when X >= 100 ->
digit(X div 100, \$C, \$D, \$M) ++ to_roman(X rem 100);
to_roman(X) when X >= 10 ->
digit(X div 10, \$X, \$L, \$C) ++ to_roman(X rem 10);
to_roman(X) when X >= 1 -> digit(X, \$I, \$V, \$X).
digit(1, X, _, _) -> [X];
digit(2, X, _, _) -> [X, X];
digit(3, X, _, _) -> [X, X, X];
digit(4, X, Y, _) -> [X, Y];
digit(5, _, Y, _) -> [Y];
digit(6, X, Y, _) -> [Y, X];
digit(7, X, Y, _) -> [Y, X, X];
digit(8, X, Y, _) -> [Y, X, X, X];
digit(9, X, _, Z) -> [X, Z].
Complex?
Ugly?

18. Part 2
OTP

19. OTP IS A FRAMEWORK

20. OTP IS A SET OF
CONVENTIONS

“AGENTS” AND “STATE MACHINES”
KEPT ALIVE BY A COMPLICATED TREE OF SUPERVISORS

22. Part 3
Elixir

23. Jose Valim

24. #4 Rails
Contributor

25. Creator of
Devise

26. Creator of
Elixir

27. “I felt the same
way I felt when I
first saw Ruby.”

28. ERLANG AND RUBY HAD A BABY

29. %%% erlang
-module(recursve).
-export([fac/1]).
fac(N) when N == 0 -> 1;
fac(N) when N > 0 -> N*fac(N-1).
# Ruby
module Recursive
def fac(n)
return 1 if n == 0
fail ArgumentError unless n > 0
n*fac(n-1)
end
end

30. # Elixir
defmodule Recursive do
def fac(n) when n == 0, do: 1
def fac(n) when n > 0 do
n*fac(n-1)
end
end

31. # Elixir - with tail call
defmodule Recursive do
def fac(0), do: 1
def fac(n) when n > 0 do
fac(n, 1)
end
defp fac(1, acc), do: acc
defp fac(n, acc) do
fac(n-1, acc*n)
end
end

32. “str”<>”ings”

33. :atoms

34. "with #{:interpolation}"

35. [:list, “type”]

36. {:tuple, “type”}

37. [key: “word”, list: “…”]

38. %{map: “is”, like: “a hash”}

39. defmodule My.Module do
def exported() do
42
end
defp private() do
76
end
end

40. [head|tail] = [:a, :b, :c]

41. defmodule Math do
end
def sum_list([], acc) do
acc
end
end

42. bessy = %{
type: “cow”,
name: “bessy”
}
%{name: name} = bessy
name == “bessy”

43. fn x -> 2*x end

44. list = [1,3,3,7]
Enum.sum(
Enum.map(list, fn x -> x*x end)
)
# 68

45. [1,3,3,7]
|> Enum.map(fn x -> x*x end)
|> Enum.sum
# 68

46. > iex

47. Part 4
Phoenix

48. Elixir
on Phoenix

49. Phoenix
Ecto for the database
Plug for routing
Channels for websockets

50. mix phoenix.new
phoenix_play

51. MORE NEXT TIME

52. Appendix A
Thoughts

53. Gateway
Todos
Users
Auth
SERVICES OVER HTTP
Mailer
Search
•HTTP
•Ports
•Monitoring
•Scaling
•Logging
Issues

54. Gateway
Todos
Users
Auth
A SINGLE OTP SYSTEM
Mailer
Search
•HTTP
•Ports
•Monitoring
•Scaling
•Logging
Issues

55. Ruby people
finally with technology that can scale

56. PEPE
Postgres
Elixir
Phoenix
Ember

57. Appendix B