From fac2474ac66cd9a561844b1a6a8f9a91aa45e160 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Thu, 22 Sep 2016 15:37:17 +0200 Subject: [PATCH] Add the rest of the damn presentation --- presentation.md | 96 ++++++++++++++++++++++++++++++++++++++++--- src/hello2.erl | 2 +- src/hello_server.erl | 12 ++++++ src/hello_server2.erl | 36 ++++++++++++++++ src/hello_sup.erl | 24 +++++++++++ 5 files changed, 164 insertions(+), 6 deletions(-) create mode 100644 src/hello_server.erl create mode 100644 src/hello_server2.erl create mode 100644 src/hello_sup.erl diff --git a/presentation.md b/presentation.md index b61d68911..dfc914f3e 100644 --- a/presentation.md +++ b/presentation.md @@ -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 diff --git a/src/hello2.erl b/src/hello2.erl index 42406919e..2d1f6c84c 100644 --- a/src/hello2.erl +++ b/src/hello2.erl @@ -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} diff --git a/src/hello_server.erl b/src/hello_server.erl new file mode 100644 index 000000000..01df14ac5 --- /dev/null +++ b/src/hello_server.erl @@ -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. diff --git a/src/hello_server2.erl b/src/hello_server2.erl new file mode 100644 index 000000000..24bb934ee --- /dev/null +++ b/src/hello_server2.erl @@ -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}. diff --git a/src/hello_sup.erl b/src/hello_sup.erl new file mode 100644 index 000000000..7fee0928c --- /dev/null +++ b/src/hello_sup.erl @@ -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]}.