Add the rest of the damn presentation
This commit is contained in:
parent
6c456a06c7
commit
fac2474ac6
5 changed files with 164 additions and 6 deletions
|
@ -114,16 +114,102 @@ hello(Name) ->
|
|||
% ok
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## [fit] Hello ~~world~~ Joe is boring!
|
||||
## [fit] Lets do it with processes.
|
||||
|
||||
---
|
||||
### Hello Server
|
||||
|
||||
```erlang
|
||||
-module(hello_server).
|
||||
-export([start_server/0]).
|
||||
|
||||
start_server() ->
|
||||
spawn(fun() -> server() end).
|
||||
|
||||
server() ->
|
||||
receive
|
||||
{greet, Name} ->
|
||||
io:format("Hello ~s!~n", [Name]),
|
||||
server()
|
||||
end.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Drag & Drop images
|
||||
## [fit] Some issues with that ...
|
||||
|
||||
### Simply *drop an image onto the Deckset window* and the Markdown you need to display the image is automatically created and *copied to the clipboard.*
|
||||
- What about unused messages?
|
||||
- What if the server crashes?
|
||||
|
||||
---
|
||||
|
||||
* This works with both local files and web images
|
||||
* You don’t _need_ to drag the file, you can also type the Markdown yourself if you know how
|
||||
## [fit] Part 2: Open Telecom Platform
|
||||
|
||||
![left,filtered](http://deckset-assets.s3-website-us-east-1.amazonaws.com/colnago1.jpg)
|
||||
### **It's called Erlang/OTP for a reason.**
|
||||
|
||||
---
|
||||
|
||||
# OTP: An Application Framework
|
||||
|
||||
- Supervision - keep processes alive!
|
||||
|
||||
- OTP Behaviours - common process patterns
|
||||
|
||||
- Extensive standard library
|
||||
|
||||
- Error handling, debuggers, testing, ...
|
||||
|
||||
- Lots more!
|
||||
|
||||
^ Standard library includes lots of things from simple network libraries over testing frameworks to cryptography, complete LDAP clients etc.
|
||||
|
||||
---
|
||||
|
||||
# Supervision
|
||||
|
||||
![inline](http://erlang.org/doc/design_principles/sup6.gif)
|
||||
|
||||
^ Supervision keeps processes alive, different restart behaviours, everything should be supervised to avoid "process" (and therefore memory) leaks
|
||||
|
||||
---
|
||||
|
||||
# OTP Behaviours
|
||||
|
||||
* `gen_server`
|
||||
* `gen_statem`
|
||||
* `gen_event`
|
||||
* `supervisor`
|
||||
|
||||
^ gen = generic. explain server, explain statem, event = event handling with registered handlers, supervisor ...
|
||||
|
||||
---
|
||||
|
||||
`gen_server`
|
||||
|
||||
---
|
||||
|
||||
## [fit] Part 3: BEAM
|
||||
|
||||
### Bogdan/Bjørn Erlang Abstract machine
|
||||
|
||||
---
|
||||
|
||||
## A VM for Erlang
|
||||
|
||||
* Many were written, BEAM survived
|
||||
* Concurrent garbage-collection
|
||||
* Lower-level bytecode than JVM
|
||||
* Very open to new languages
|
||||
(Elixir, LFE, Joxa, ...)
|
||||
|
||||
---
|
||||
|
||||
## What next?
|
||||
|
||||
* Ole's talk, obviously!
|
||||
* Learn You Some Erlang!
|
||||
www.learnyousomeerlang.com
|
||||
* Watch out for the Oslo BEAM meetup group
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
-export([hello/1]).
|
||||
|
||||
hello(Name) ->
|
||||
io:format("Hello ~s!~n", [Name]).
|
||||
io:format("Hey ~s!~n", [Name]).
|
||||
|
||||
% 3> c(hello2).
|
||||
% {ok,hello2}
|
||||
|
|
12
src/hello_server.erl
Normal file
12
src/hello_server.erl
Normal file
|
@ -0,0 +1,12 @@
|
|||
-module(hello_server).
|
||||
-export([start_server/0, server/0]).
|
||||
|
||||
start_server() ->
|
||||
spawn(fun() -> server() end).
|
||||
|
||||
server() ->
|
||||
receive
|
||||
{greet, Name} ->
|
||||
io:format("Hello ~s!~n", [Name]),
|
||||
hello_server:server()
|
||||
end.
|
36
src/hello_server2.erl
Normal file
36
src/hello_server2.erl
Normal file
|
@ -0,0 +1,36 @@
|
|||
-module(hello_server2).
|
||||
-behaviour(gen_server).
|
||||
-compile(export_all).
|
||||
|
||||
%%% Start callback for supervisor
|
||||
start_link() ->
|
||||
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
|
||||
|
||||
%%% gen_server callbacks
|
||||
|
||||
init([]) ->
|
||||
{ok, sets:new()}.
|
||||
|
||||
handle_call({greet, Name}, _From, State) ->
|
||||
io:format("Hello ~s!~n", [Name]),
|
||||
NewState = sets:add_element(Name, State),
|
||||
{reply, ok, NewState};
|
||||
|
||||
handle_call({bye, Name}, _From, State) ->
|
||||
io:format("Goodbye ~s!~n", [Name]),
|
||||
NewState = sets:del_element(Name, State),
|
||||
{reply, ok, NewState}.
|
||||
|
||||
terminate(normal, State) ->
|
||||
[io:format("Goodbye ~s!~n", [Name]) || Name <- State],
|
||||
ok.
|
||||
|
||||
%%% Unused gen_server callbacks
|
||||
code_change(_OldVsn, State, _Extra) ->
|
||||
{ok, State}.
|
||||
|
||||
handle_info(_Info, State) ->
|
||||
{noreply, State}.
|
||||
|
||||
handle_cast(_Request, State) ->
|
||||
{noreply, State}.
|
24
src/hello_sup.erl
Normal file
24
src/hello_sup.erl
Normal file
|
@ -0,0 +1,24 @@
|
|||
-module(hello_sup).
|
||||
-behaviour(supervisor).
|
||||
-export([start_link/0, init/1]).
|
||||
|
||||
%%% Module API
|
||||
|
||||
start_link() ->
|
||||
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
|
||||
|
||||
%%% Supervisor callbacks
|
||||
|
||||
init([]) ->
|
||||
Children = [hello_spec()],
|
||||
{ok, { {one_for_one, 5, 10}, Children}}.
|
||||
|
||||
%%% Private
|
||||
|
||||
hello_spec() ->
|
||||
#{id => hello_server2,
|
||||
start => {hello_server2, start_link, []},
|
||||
restart => permanent,
|
||||
shutdown => 5000,
|
||||
type => worker,
|
||||
module => [hello_server2]}.
|
Loading…
Reference in a new issue