1 hour dive into erlang
DESCRIPTION
A 1 hour introduction to Erlang and OTPTRANSCRIPT
![Page 1: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/1.jpg)
1 hour dive into Erlang/OTP
@jvalduvieco @jordillonch
![Page 2: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/2.jpg)
Problem domain
![Page 3: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/3.jpg)
Lots of users
![Page 4: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/4.jpg)
Lots of users
![Page 5: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/5.jpg)
24x7x365
![Page 6: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/6.jpg)
24x7x365
![Page 7: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/7.jpg)
Lots of critical concurrent transactions
![Page 8: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/8.jpg)
Lots of critical concurrent transactions
![Page 9: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/9.jpg)
Hardware or softwarebreaks
![Page 10: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/10.jpg)
Hardware or softwarebreaks
![Page 11: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/11.jpg)
Lots of code changes
![Page 12: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/12.jpg)
Lots of code changes
![Page 13: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/13.jpg)
UnscalableUnmaintainable } code
![Page 14: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/14.jpg)
UnscalableUnmaintainable } code
![Page 15: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/15.jpg)
Maintenance/Debugin
production system
![Page 16: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/16.jpg)
Maintenance/Debugin
production system
![Page 17: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/17.jpg)
Does it sound to you?
![Page 18: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/18.jpg)
The Erlang solution
![Page 19: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/19.jpg)
Simplicity...
![Page 20: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/20.jpg)
Minimize defensive programming
![Page 21: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/21.jpg)
Typeless variables
![Page 22: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/22.jpg)
Develop by contract
![Page 23: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/23.jpg)
t-shirt function size
If����������� ������������������ a����������� ������������������ function����������� ������������������ does����������� ������������������ not����������� ������������������ fit����������� ������������������ on����������� ������������������ your����������� ������������������ t-shirt����������� ������������������ it����������� ������������������ is����������� ������������������ too����������� ������������������ long!
![Page 24: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/24.jpg)
Single responsibility principle
![Page 25: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/25.jpg)
No shared state between entities
![Page 26: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/26.jpg)
High Concurrency
![Page 27: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/27.jpg)
High ConcurrencyHigh concurrency
![Page 28: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/28.jpg)
Light threads
![Page 29: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/29.jpg)
Light threadshundreds of thousands of threads in one
machine with a good cpu scheduler
![Page 30: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/30.jpg)
Light threadshundreds of thousands of threads in one
machine with a good cpu scheduler
Lt
Lt
Lt
![Page 31: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/31.jpg)
Lt
Message passing
Lt
Lt
![Page 32: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/32.jpg)
Lt
Message passingA shared nothing architecture that
communicates through message passing
Lt
Lt
![Page 33: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/33.jpg)
Lt
Message passingA shared nothing architecture that
communicates through message passing
Lt
Lt
![Page 34: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/34.jpg)
Lt
Process Mailbox
Lt
Lt
![Page 35: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/35.jpg)
Lt
Process MailboxEvery process has a mailbox with incoming
messages, process take on convenience
Lt
Lt
![Page 36: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/36.jpg)
Lt
No shared state
Lt
LtS
S
S
![Page 37: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/37.jpg)
Lt
No shared stateEvery process its own internal state stored in
a variable avoiding lock contention
Lt
LtS
S
S
![Page 38: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/38.jpg)
Soft realtime
![Page 39: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/39.jpg)
Soft realtime
You have no strict guarantees on latency but language is designed
to have low latency
![Page 40: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/40.jpg)
High availability
![Page 41: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/41.jpg)
High availabilityHigh availability
![Page 42: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/42.jpg)
Pa
Supervised processes
Pb
![Page 43: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/43.jpg)
Pa
Supervised processesprocesses can be monitored by other
processes, handling its termination
Pb
![Page 44: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/44.jpg)
Pb
Fail early
Pa
S
![Page 45: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/45.jpg)
Pb
Fail earlyFail as soon as possible and let someone handle bad data, someone will restart you
Pa
S
![Page 46: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/46.jpg)
Fail earlyFail as soon as possible and let someone handle bad data, someone will restart you
Pa
Pb2
S
![Page 47: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/47.jpg)
Hot code update
Pa v1
S
Pb
Pc
![Page 48: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/48.jpg)
Hot code updateprocesses code and data can be replaced
without loosing service
Pa v1
S
Pb
Pc
![Page 49: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/49.jpg)
Hot code updateprocesses code and data can be replaced
without loosing service
Pa v1Pa v2
S
Pb
Pc
![Page 50: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/50.jpg)
P
Distribution
Node
P
PP
P
Node
P
P
P
PP PP
![Page 51: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/51.jpg)
P
DistributionProcesses run on nodes and can be located
wherever they are
Node
P
PP
P
Node
P
P
P
PP PP
![Page 52: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/52.jpg)
How does it look like?
![Page 53: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/53.jpg)
![Page 54: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/54.jpg)
Show me the code!
![Page 55: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/55.jpg)
Demo 1
![Page 56: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/56.jpg)
Hands on
![Page 57: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/57.jpg)
The shell
![Page 58: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/58.jpg)
Type on your console:
erl
![Page 59: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/59.jpg)
You should see:Erlang R16B (erts-5.10.1) [source] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Eshell V5.10.1 (abort with ^G)1>
![Page 60: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/60.jpg)
Variables
![Page 61: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/61.jpg)
Variables start Uppercase
![Page 62: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/62.jpg)
Variables are immutable
![Page 63: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/63.jpg)
Can contain any type
![Page 64: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/64.jpg)
You can do things like...
![Page 65: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/65.jpg)
1> Foo = 1.12> Foo = 2.** exception error: no match of right hand side value 2
![Page 66: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/66.jpg)
1> Foo = 1.12> Foo = 2.** exception error: no match of right hand side value 2
Foo����������� ������������������ is����������� ������������������ bounded����������� ������������������ to����������� ������������������ 1
![Page 67: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/67.jpg)
1> Foo = 1.12> Foo = 2.** exception error: no match of right hand side value 2
Foo����������� ������������������ is����������� ������������������ bounded����������� ������������������ to����������� ������������������ 1
Foo����������� ������������������ ==����������� ������������������ 2����������� ������������������ ?
![Page 68: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/68.jpg)
1> Foo = 1.12> Bar = 2.23> Foo = Bar.** exception error: no match of right hand side value 2
![Page 69: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/69.jpg)
This is GREAT!
![Page 70: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/70.jpg)
Now you have your basic error checking system implemented
![Page 71: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/71.jpg)
Advanced types
![Page 72: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/72.jpg)
[List]
![Page 73: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/73.jpg)
[1,2,3,4,5,6]
![Page 74: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/74.jpg)
You can do things like...
![Page 75: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/75.jpg)
Iterate sequentially
![Page 76: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/76.jpg)
1> MyList = [1,2,3,4].[1,2,3,4]2> [Head|Tail] = MyList.[1,2,3,4]3> Head.14> Tail.[2,3,4]
![Page 77: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/77.jpg)
1> MyList = [1,2,3,4].[1,2,3,4]2> [Head|Tail] = MyList.[1,2,3,4]3> Head.14> Tail.[2,3,4]
![Page 78: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/78.jpg)
1> MyList = [1,2,3,4].[1,2,3,4]2> [Head|Tail] = MyList.[1,2,3,4]3> Head.14> Tail.[2,3,4]
![Page 79: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/79.jpg)
Do something to all or some items on a list
(list comprehensions)
![Page 80: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/80.jpg)
1> MyList = [1, 2, 3, 4].[1,2,3,4]2> [X + 2 || X <- MyList, X > 2].[5,6]
![Page 81: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/81.jpg)
[Strings]
![Page 82: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/82.jpg)
A list
![Page 83: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/83.jpg)
You can do things like...
![Page 84: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/84.jpg)
1> MyString = "Erlang is not Ruby"."Erlang is not Ruby"
![Page 85: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/85.jpg)
1> MyString = "Erlang is not Ruby"."Erlang is not Ruby"2> [Head2|Tail2] = MyString."Erlang is not Ruby"3> Head2.694> Tail2."rlang is not Ruby"
ASC����������� ������������������ =����������� ������������������ “E”
![Page 86: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/86.jpg)
{Tuples}
![Page 87: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/87.jpg)
{1,2,3}
![Page 88: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/88.jpg)
Basic data container
![Page 89: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/89.jpg)
random access
![Page 90: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/90.jpg)
matcheable
![Page 91: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/91.jpg)
You can do things like...
![Page 92: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/92.jpg)
1> Mytuple = {1,2,3,4}.{1,2,3,4}2> A = 1.13> B = 2.24> {A,B,C,D} = {1,2,3,4}.{1,2,3,4}5> C.36> D.4
![Page 93: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/93.jpg)
1> Mytuple = {1,2,3,4}.{1,2,3,4}2> A = 1.13> B = 2.24> {A,B,C,D} = {1,2,3,4}.{1,2,3,4}5> C.36> D.4
A����������� ������������������ and����������� ������������������ B����������� ������������������ arebounded����������� ������������������ variables
![Page 94: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/94.jpg)
1> Mytuple = {1,2,3,4}.{1,2,3,4}2> A = 1.13> B = 2.24> {A,B,C,D} = {1,2,3,4}.{1,2,3,4}5> C.36> D.4
A����������� ������������������ and����������� ������������������ B����������� ������������������ arebounded����������� ������������������ variables
pattern����������� ������������������ matchingA==1?B==2?
![Page 95: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/95.jpg)
1> Mytuple = {1,2,3,4}.{1,2,3,4}2> A = 1.13> B = 2.24> {A,B,C,D} = {1,2,3,4}.{1,2,3,4}5> C.36> D.4
A����������� ������������������ and����������� ������������������ B����������� ������������������ arebounded����������� ������������������ variables
pattern����������� ������������������ matchingA==1?B==2?
C����������� ������������������ and����������� ������������������ D����������� ������������������ are����������� ������������������ unbounded����������� ������������������ variables
![Page 96: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/96.jpg)
functions
![Page 97: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/97.jpg)
functions are types
![Page 98: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/98.jpg)
single exit point
![Page 99: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/99.jpg)
You can do things like...
![Page 100: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/100.jpg)
foo_bar_func(Foo, Bar) -> Result = Foo + Bar, Result.
![Page 101: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/101.jpg)
foo_bar_func(Foo, Bar) -> Result = Foo + Bar, Result.
This����������� ������������������ is����������� ������������������ a����������� ������������������ arity����������� ������������������ 2����������� ������������������ function����������� ������������������ (2����������� ������������������ parameters)
![Page 102: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/102.jpg)
foo_bar_func(Foo, Bar) -> Result = Foo + Bar, Result.
This����������� ������������������ is����������� ������������������ a����������� ������������������ arity����������� ������������������ 2����������� ������������������ function����������� ������������������ (2����������� ������������������ parameters)
means����������� ������������������ that����������� ������������������ more����������� ������������������ code����������� ������������������ is����������� ������������������ to����������� ������������������ come
![Page 103: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/103.jpg)
foo_bar_func(Foo, Bar) -> Result = Foo + Bar, Result.
This����������� ������������������ is����������� ������������������ a����������� ������������������ arity����������� ������������������ 2����������� ������������������ function����������� ������������������ (2����������� ������������������ parameters)
means����������� ������������������ that����������� ������������������ more����������� ������������������ code����������� ������������������ is����������� ������������������ to����������� ������������������ come
means����������� ������������������ the����������� ������������������ function����������� ������������������ code����������� ������������������ has����������� ������������������ ended
![Page 104: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/104.jpg)
foo_bar_func(Foo, Bar) -> Result = Foo + Bar, Result.
Single����������� ������������������ exit����������� ������������������ pointReturns����������� ������������������ Result
This����������� ������������������ is����������� ������������������ a����������� ������������������ arity����������� ������������������ 2����������� ������������������ function����������� ������������������ (2����������� ������������������ parameters)
means����������� ������������������ that����������� ������������������ more����������� ������������������ code����������� ������������������ is����������� ������������������ to����������� ������������������ come
means����������� ������������������ the����������� ������������������ function����������� ������������������ code����������� ������������������ has����������� ������������������ ended
![Page 105: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/105.jpg)
1> FooBar = fun(Foo, Bar) ->1> Foo + Bar1> end.#Fun<erl_eval.12.82930912>2> Result = FooBar(1, 2).3
![Page 106: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/106.jpg)
atoms
![Page 107: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/107.jpg)
A constant with name
![Page 108: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/108.jpg)
lowercase
![Page 109: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/109.jpg)
You can do things like...
![Page 110: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/110.jpg)
1> ok.ok2> ko.ko3> ok =:= ko.false4> ok =:= ok.true
![Page 111: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/111.jpg)
1> MyFuncOK = fun() -> {ok, 33} end.#Fun<erl_eval.20.82930912>2> MyFuncFail = fun() -> {error, bad_arg} end.#Fun<erl_eval.20.82930912>
3> {ok, Result} = MyFuncOK().{ok,33}4> {ok, Result2} = MyFuncFail().** exception error: no match of right hand side value {error,bad_arg}
![Page 112: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/112.jpg)
1> MyFuncOK = fun() -> {ok, 33} end.#Fun<erl_eval.20.82930912>2> MyFuncFail = fun() -> {error, bad_arg} end.#Fun<erl_eval.20.82930912>
3> {ok, Result} = MyFuncOK().{ok,33}4> {ok, Result2} = MyFuncFail().** exception error: no match of right hand side value {error,bad_arg}
atoms
![Page 113: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/113.jpg)
1> MyFuncOK = fun() -> {ok, 33} end.#Fun<erl_eval.20.82930912>2> MyFuncFail = fun() -> {error, bad_arg} end.#Fun<erl_eval.20.82930912>
3> {ok, Result} = MyFuncOK().{ok,33}4> {ok, Result2} = MyFuncFail().** exception error: no match of right hand side value {error,bad_arg}
atoms
errorchecking}
![Page 114: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/114.jpg)
1> MyFuncOK = fun() -> {ok, 33} end.#Fun<erl_eval.20.82930912>2> MyFuncFail = fun() -> {error, bad_arg} end.#Fun<erl_eval.20.82930912>
3> {ok, Result} = MyFuncOK().{ok,33}4> {ok, Result2} = MyFuncFail().** exception error: no match of right hand side value {error,bad_arg}
atoms
errorchecking}
do����������� ������������������ they����������� ������������������ match?
![Page 115: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/115.jpg)
modules
![Page 116: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/116.jpg)
basic name spacing
![Page 117: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/117.jpg)
public/private functions
![Page 118: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/118.jpg)
You can do things like...
![Page 119: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/119.jpg)
-module(cool_func).
-export([foo_bar_func/2]).
foo_bar_func (Foo, Bar) -> Result = Foo + Bar, {ok, Result}.
On your ${EDITOR} create cool_func.erl
![Page 120: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/120.jpg)
On erlang shell type:
1> c("cool_module").{ok,cool_module}2> {ok, Result3} = cool_module:sum(33, 44).{ok,77}3> Result3.77
![Page 121: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/121.jpg)
Too easy?
Let’s add some pattern matching on parameters!
![Page 122: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/122.jpg)
area({square, Side}) -> {ok,Side * Side};area({circle, Radius}) -> % almost :-) {ok, 3 * Radius * Radius};area({triangle, A, B, C}) -> S = (A + B + C)/2, {ok, math:sqrt(S*(S-A)*(S-B)*(S-C))};area(Other) -> {error, invalid_object}.
![Page 123: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/123.jpg)
area({square, Side}) -> {ok,Side * Side};area({circle, Radius}) -> % almost :-) {ok, 3 * Radius * Radius};area({triangle, A, B, C}) -> S = (A + B + C)/2, {ok, math:sqrt(S*(S-A)*(S-B)*(S-C))};area(Other) -> {error, invalid_object}.
means����������� ������������������ that����������� ������������������ there����������� ������������������ is����������� ������������������ another����������� ������������������ matching����������� ������������������
posibility
![Page 124: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/124.jpg)
area({square, Side}) -> {ok,Side * Side};area({circle, Radius}) -> % almost :-) {ok, 3 * Radius * Radius};area({triangle, A, B, C}) -> S = (A + B + C)/2, {ok, math:sqrt(S*(S-A)*(S-B)*(S-C))};area(Other) -> {error, invalid_object}.
means����������� ������������������ that����������� ������������������ there����������� ������������������ is����������� ������������������ another����������� ������������������ matching����������� ������������������
posibility
mymodule:area({square, 10}).mymodule:area({circle, 10}).mymodule:area({triangle, 2, 2, 3.5}).
![Page 125: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/125.jpg)
Want more?
Let’s add some recursion!
![Page 126: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/126.jpg)
Want more?
Let’s add some recursion!
Erlang does not use loops
![Page 127: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/127.jpg)
factorial(0) -> 1;factorial(N) -> N * factorial(N-1).
![Page 128: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/128.jpg)
OTP
![Page 129: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/129.jpg)
Oh, This is Perfect!
![Page 130: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/130.jpg)
OTP is a set of rock solid architecture patterns, practices and tools
![Page 131: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/131.jpg)
Improves the design, fault tolerance and
deployment of your app
![Page 132: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/132.jpg)
Erlang is just a language, OTP makes it great for
the real world
![Page 133: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/133.jpg)
![Page 134: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/134.jpg)
Basic architecture patterns
![Page 135: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/135.jpg)
Supervisor
S
P P P S
P P
![Page 136: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/136.jpg)
Supervisor
S
P P P S
P P
![Page 137: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/137.jpg)
Supervisor spawns processes and handles its death
![Page 138: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/138.jpg)
gen_server
gs
P
P
P
![Page 139: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/139.jpg)
gen_server
gs
P
P
P
![Page 140: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/140.jpg)
Generic single threaded server
![Page 141: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/141.jpg)
gen_fsm
gf
P
P
P
{S}
![Page 142: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/142.jpg)
gf
gen_fsm
P
P
P
{S}
![Page 143: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/143.jpg)
Generic Finite State Machine
![Page 144: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/144.jpg)
gen_event
em
P
P
P
PP
P
![Page 145: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/145.jpg)
gen_event
em
P
P
P
PP
P
![Page 146: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/146.jpg)
Event handler, you can subscribe to events
![Page 147: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/147.jpg)
More on OTP...
• File hierarchy
• Applications
• Releases
• Basic abstraction libraries (logging, system...)
![Page 148: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/148.jpg)
Let’s see a gen_server in action!
![Page 149: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/149.jpg)
Introducing Simple Key Value Store
![Page 150: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/150.jpg)
A server that is able to store {Key,
Value} and retrieve them by Key
![Page 151: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/151.jpg)
Demo II
![Page 152: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/152.jpg)
ets
S
gsP
skvs diagram
![Page 153: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/153.jpg)
ets
S
gsP
skvs diagram
![Page 154: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/154.jpg)
Starting skvs
Go to skvs source directory
Compile./rebar compile
Start the Erlang nodeerl -pa ebin
Start the appapplication:start(skvs).
![Page 155: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/155.jpg)
Some commands
Set a value
skvs_server:set(“Key”,”Value”).
skvs_server:set(“Key2”,”Value2”).
Get a value
skvs_server:get(“Key2”).
![Page 156: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/156.jpg)
start_link() -> gen_server:start_link({local, skvs}, skvs_server, [], []).
get(Key) -> gen_server:call(skvs, {get, Key}).
set(Key,Value) -> gen_server:call(skvs, {set, Key, Value}).
set_fire_and_forget(Key,Value) -> gen_server:cast(skvs, {set, Key, Value}).
Code on client: skvs_server.erl
![Page 157: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/157.jpg)
start_link() -> gen_server:start_link({local, skvs}, skvs_server, [], []).
get(Key) -> gen_server:call(skvs, {get, Key}).
set(Key,Value) -> gen_server:call(skvs, {set, Key, Value}).
set_fire_and_forget(Key,Value) -> gen_server:cast(skvs, {set, Key, Value}).
Code on client: skvs_server.erl
start����������� ������������������ gen_server
![Page 158: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/158.jpg)
start_link() -> gen_server:start_link({local, skvs}, skvs_server, [], []).
get(Key) -> gen_server:call(skvs, {get, Key}).
set(Key,Value) -> gen_server:call(skvs, {set, Key, Value}).
set_fire_and_forget(Key,Value) -> gen_server:cast(skvs, {set, Key, Value}).
Code on client: skvs_server.erl
start����������� ������������������ gen_server
sync����������� ������������������ call����������� ������������������ to����������� ������������������ server(waits����������� ������������������ for����������� ������������������ reply)
![Page 159: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/159.jpg)
start_link() -> gen_server:start_link({local, skvs}, skvs_server, [], []).
get(Key) -> gen_server:call(skvs, {get, Key}).
set(Key,Value) -> gen_server:call(skvs, {set, Key, Value}).
set_fire_and_forget(Key,Value) -> gen_server:cast(skvs, {set, Key, Value}).
Code on client: skvs_server.erl
start����������� ������������������ gen_server
async����������� ������������������ call����������� ������������������ to����������� ������������������ server(fire����������� ������������������ &����������� ������������������ forget)
sync����������� ������������������ call����������� ������������������ to����������� ������������������ server(waits����������� ������������������ for����������� ������������������ reply)
![Page 160: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/160.jpg)
%% Client Callbacks on server%% Sync calls, expects responsehandle_call({set, Key, Value}, _From,State) -> {reply, set_value(Key,Value), State};handle_call({get, Key}, _From, State) -> {reply, get_value(Key), State}.
%% Async calls, do not expect responsehandle_cast({set, Key, Value}, State) -> set_value(Key,Value), {noreply, State}.
Callback code: skvs_server.erl
![Page 161: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/161.jpg)
%% Client Callbacks on server%% Sync calls, expects responsehandle_call({set, Key, Value}, _From,State) -> {reply, set_value(Key,Value), State};handle_call({get, Key}, _From, State) -> {reply, get_value(Key), State}.
%% Async calls, do not expect responsehandle_cast({set, Key, Value}, State) -> set_value(Key,Value), {noreply, State}.
Callback code: skvs_server.erl
return����������� ������������������ value
![Page 162: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/162.jpg)
%% Client Callbacks on server%% Sync calls, expects responsehandle_call({set, Key, Value}, _From,State) -> {reply, set_value(Key,Value), State};handle_call({get, Key}, _From, State) -> {reply, get_value(Key), State}.
%% Async calls, do not expect responsehandle_cast({set, Key, Value}, State) -> set_value(Key,Value), {noreply, State}.
Callback code: skvs_server.erl
return����������� ������������������ valueSurvives����������� ������������������ between����������� ������������������
requests
![Page 163: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/163.jpg)
%% Private functionsset_value(Key, Value) -> % Insert Key, Value into ETS. % Fail early {ok,Result}=case ets:insert(data_store,{Key,Value}) of true -> {ok, {Key,Value}}; {error, Reason} -> {error, Reason} end, Result.
Actual work...: skvs_server.erl
![Page 164: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/164.jpg)
%% Private functionsset_value(Key, Value) -> % Insert Key, Value into ETS. % Fail early {ok,Result}=case ets:insert(data_store,{Key,Value}) of true -> {ok, {Key,Value}}; {error, Reason} -> {error, Reason} end, Result.
Actual work...: skvs_server.erl
ETS����������� ������������������ is����������� ������������������ a����������� ������������������ Key����������� ������������������ value����������� ������������������ store����������� ������������������ in����������� ������������������ RAM
![Page 165: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/165.jpg)
Use cases
![Page 166: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/166.jpg)
Gaming Industry
![Page 167: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/167.jpg)
Gaming Industry
![Page 168: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/168.jpg)
Messaging / IM
![Page 169: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/169.jpg)
Messaging / IM
![Page 170: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/170.jpg)
Payments
![Page 171: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/171.jpg)
Payments
![Page 172: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/172.jpg)
Databases
![Page 173: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/173.jpg)
Databases
![Page 174: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/174.jpg)
Others
![Page 175: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/175.jpg)
Others
![Page 176: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/176.jpg)
Some day...
![Page 177: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/177.jpg)
Every highly interactive website? ;)
![Page 178: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/178.jpg)
Every highly interactive website? ;)
Hi
Hey
HelloPayOuch!
!BufNO!
Would you...
![Page 179: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/179.jpg)
Internet of things
![Page 180: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/180.jpg)
And now what?
![Page 181: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/181.jpg)
Install Erlang/OTP!
https://www.erlang-solutions.com/downloads/download-erlang-otp
![Page 182: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/182.jpg)
Use a great IDE• IntelliJ + Erlang (plugin)
• Sublime Text + SublimErl
• Emacs
![Page 183: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/183.jpg)
Read some books
![Page 184: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/184.jpg)
RTFM
• http://www.erlang.org/doc.html
• http://erldocs.com/
![Page 185: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/185.jpg)
Join mailing lists
• Official Erlang mailing list
• http://erlang.org/mailman/listinfo/erlang-questions
• Join Barcelona Erlang user group on google groups
![Page 186: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/186.jpg)
Find know-how
• Check http://www.erlang-factory.com/ videos
• Search for Erlang conferences on slideshare
• Pray for an http://erlangcamp.com/ near your city
![Page 187: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/187.jpg)
Read some code
![Page 188: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/188.jpg)
This is the result of 6 months of fun learning Erlang/OTP
![Page 189: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/189.jpg)
We are looking for awesome projects
http://es.linkedin.com/in/jllonch
http://es.linkedin.com/in/jvalduvieco
![Page 190: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/190.jpg)
Thank you!
https://github.com/jvalduvieco/betabeers_201303
![Page 191: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/191.jpg)
Thank you!
we����������� ������������������ hope����������� ������������������ you����������� ������������������ feel����������� ������������������ like����������� ������������������ him����������� ������������������ :)
(we����������� ������������������ did)
https://github.com/jvalduvieco/betabeers_201303
![Page 192: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/192.jpg)
Erlang, The Movie
http://www.youtube.com/watch?v=uKfKtXYLG78
![Page 193: 1 hour dive into erlang](https://reader034.vdocuments.net/reader034/viewer/2022042613/5491c4b3b47959c8078b472f/html5/thumbnails/193.jpg)
Images sourceshttp://diromero.wordpress.com/2011/10/07/home-automation/http://iffergan.com/http://technode.com/2012/05/14/internet-of-things-not-just-a-concept-for-fund-raising/http://modernherstory.wordpress.com/2011/05/18/open-minds-open-hearts/http://www.i-m.co/eviemouse/problemsolved/http://strategicsalesmarketingosmg.wordpress.com/2012/06/25/who-are-twitter-users/http://www.secureworks.com/it_security_services/advantage/soc/http://labourlist.org/2011/11/my-biggest-worry-about-labour%E2%80%99s-future/broken-chain/http://prothemedesign.com/how-to/why-you-should-keep-wordpress-and-your-plugins-up-to-date/attachment/matrix-code-update/http://thegapbetweentwoworlds.com/category/career-transitionhttp://www.wingweb.co.uk/Images/697/KC-10_Extender_SR-71_Blackbirdhttp://www.tonywoodtraining.com/2010/11/29/motivation-to-exercise-and-eat-right/http://portalmie.com/blog/6/2011/09/kushimoto-diving-park-tokushima-revista-no-7/http://www.bcsagroup.com/http://www.losemyaccent.com/tag/hand/http://articulo.mercadolibre.com.ar/MLA-450970296-cortaplumas-victorinox-huntsman-15-usos-navaja-origen-suizo-_JMhttp://openclipart.org/detail/4112/http://blog-en.coaching-go.com/2012/02/learn-to-say-no-and-know-how-to-say-yes/ok-2/http://en.wikipedia.org/wiki/File:We_Can_Do_It!.jpghttp://triniblog.wordpress.com/tag/laberintos/http://www.catskillsnyrealestate.com/Want-More-Info-Catskill-Real-Estate.phphttp://www.thelovelyplanet.net/lush-green-images-planet-earth/http://www.growthmax.com/how-exactly-does-growthmax-plus-make-you-grow-taller/http://www.ayurvedalive.in/keep-your-eyes-healthy-beautifulhttp://my.mmosite.com/510619/blog/item/lord_of_the_rings_online.htmlhttp://scifistorm.org/2010/03/24/lord-of-the-rings-blu-ray-review/http://www.123rf.com/photo_15612022_3d-cartoon-bug.htmlhttp://www.airliners.net/photo/1134244/L/http://www.muypymes.com/2009/12/04/moleskine-mucho-mas-que-una-agenda-personalhttp://learnyousomeerlang.com/the-hitchhikers-guide-to-concurrencyhttp://planetpooks.com/one-more-reason-to-love-hermiones-handbag/