From 8ab71587a7fe532785950ed9dbc2bcfa1acdfcc4 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sat, 21 Dec 2019 00:37:07 +0000 Subject: chore(erlang-presentation): Prepare for depot merge --- .gitignore | 1 - presentation.md | 222 ------------------------ presentation.pdf | Bin 1777976 -> 0 bytes presentations/erlang-2016/presentation.md | 222 ++++++++++++++++++++++++ presentations/erlang-2016/presentation.pdf | Bin 0 -> 1777976 bytes presentations/erlang-2016/src/hello.erl | 5 + presentations/erlang-2016/src/hello1.erl | 5 + presentations/erlang-2016/src/hello2.erl | 11 ++ presentations/erlang-2016/src/hello_server.erl | 12 ++ presentations/erlang-2016/src/hello_server2.erl | 36 ++++ presentations/erlang-2016/src/hello_sup.erl | 24 +++ src/hello.erl | 5 - src/hello1.erl | 5 - src/hello2.erl | 11 -- src/hello_server.erl | 12 -- src/hello_server2.erl | 36 ---- src/hello_sup.erl | 24 --- 17 files changed, 315 insertions(+), 316 deletions(-) delete mode 100644 .gitignore delete mode 100644 presentation.md delete mode 100644 presentation.pdf create mode 100644 presentations/erlang-2016/presentation.md create mode 100644 presentations/erlang-2016/presentation.pdf create mode 100644 presentations/erlang-2016/src/hello.erl create mode 100644 presentations/erlang-2016/src/hello1.erl create mode 100644 presentations/erlang-2016/src/hello2.erl create mode 100644 presentations/erlang-2016/src/hello_server.erl create mode 100644 presentations/erlang-2016/src/hello_server2.erl create mode 100644 presentations/erlang-2016/src/hello_sup.erl delete mode 100644 src/hello.erl delete mode 100644 src/hello1.erl delete mode 100644 src/hello2.erl delete mode 100644 src/hello_server.erl delete mode 100644 src/hello_server2.erl delete mode 100644 src/hello_sup.erl diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 1ef2775ff8..0000000000 --- a/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.beam \ No newline at end of file diff --git a/presentation.md b/presentation.md deleted file mode 100644 index 526564b882..0000000000 --- a/presentation.md +++ /dev/null @@ -1,222 +0,0 @@ -slidenumbers: true -Erlang. -====== - -### Fault-tolerant, concurrent programming. - ---- - -## A brief history of Erlang - ---- - -![](https://www.ericsson.com/thinkingahead/the-networked-society-blog/wp-content/uploads/2014/09/bfW5FSr.jpg) - - -^ Telefontornet in Stockholm, around 1890. Used until 1913. - ---- - -![](https://3.bp.blogspot.com/-UF7W9yTUO2g/VBqw-1HNTzI/AAAAAAAAPeg/KvsMbNSAcII/s1600/6835942484_1531372d8f_b.jpg) - -^ Telephones were operated manually at Switchboards. Anyone old enough to remember? I'm certainly not. - ---- - -![fit](https://russcam.github.io/fsharp-akka-talk/images/ericsson-301-AXD.png) - -^ Eventually we did that in software, and we got better at it over time. Ericsson AXD 301, first commercial Erlang switch. But lets take a step back. - ---- - -## Phone switches must be ... - -Highly concurrent - -Fault-tolerant - -Distributed - -(Fast!) - -![right 150%](http://learnyousomeerlang.com/static/img/erlang-the-movie.png) - ---- - -## ... and so is Erlang! - ---- - -## Erlang as a whole: - -- Unique process model (actors!) -- Built-in fault-tolerance & error handling -- Distributed processes -- Three parts! - ---- - -## Part 1: Erlang, the language - -- Functional -- Prolog-inspired syntax -- Everything is immutable -- *Extreme* pattern-matching - ---- -### Hello Joe - -```erlang -hello_joe. -``` - ---- -### Hello Joe - -```erlang --module(hello1). --export([hello_joe/0]). - -hello_joe() -> - hello_joe. -``` - ---- -### Hello Joe - -```erlang --module(hello1). --export([hello_joe/0]). - -hello_joe() -> - hello_joe. - -% 1> c(hello1). -% {ok,hello1} -% 2> hello1:hello_joe(). -% hello_joe -``` - ---- -### Hello Joe - -```erlang --module(hello2). --export([hello/1]). - -hello(Name) -> - io:format("Hello ~s!~n", [Name]). - -% 3> c(hello2). -% {ok,hello2} -% 4> hello2:hello("Joe"). -% Hello Joe! -% 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. -``` - ---- - -## [fit] Some issues with that ... - -- What about unused messages? -- What if the server crashes? - ---- - -## [fit] Part 2: Open Telecom Platform - -### **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 *Erlang the Movie* -* (soon!) Join the Oslo BEAM meetup group - ---- - -# [fit] Questions? - -`@tazjin` diff --git a/presentation.pdf b/presentation.pdf deleted file mode 100644 index ec8d996704..0000000000 Binary files a/presentation.pdf and /dev/null differ diff --git a/presentations/erlang-2016/presentation.md b/presentations/erlang-2016/presentation.md new file mode 100644 index 0000000000..526564b882 --- /dev/null +++ b/presentations/erlang-2016/presentation.md @@ -0,0 +1,222 @@ +slidenumbers: true +Erlang. +====== + +### Fault-tolerant, concurrent programming. + +--- + +## A brief history of Erlang + +--- + +![](https://www.ericsson.com/thinkingahead/the-networked-society-blog/wp-content/uploads/2014/09/bfW5FSr.jpg) + + +^ Telefontornet in Stockholm, around 1890. Used until 1913. + +--- + +![](https://3.bp.blogspot.com/-UF7W9yTUO2g/VBqw-1HNTzI/AAAAAAAAPeg/KvsMbNSAcII/s1600/6835942484_1531372d8f_b.jpg) + +^ Telephones were operated manually at Switchboards. Anyone old enough to remember? I'm certainly not. + +--- + +![fit](https://russcam.github.io/fsharp-akka-talk/images/ericsson-301-AXD.png) + +^ Eventually we did that in software, and we got better at it over time. Ericsson AXD 301, first commercial Erlang switch. But lets take a step back. + +--- + +## Phone switches must be ... + +Highly concurrent + +Fault-tolerant + +Distributed + +(Fast!) + +![right 150%](http://learnyousomeerlang.com/static/img/erlang-the-movie.png) + +--- + +## ... and so is Erlang! + +--- + +## Erlang as a whole: + +- Unique process model (actors!) +- Built-in fault-tolerance & error handling +- Distributed processes +- Three parts! + +--- + +## Part 1: Erlang, the language + +- Functional +- Prolog-inspired syntax +- Everything is immutable +- *Extreme* pattern-matching + +--- +### Hello Joe + +```erlang +hello_joe. +``` + +--- +### Hello Joe + +```erlang +-module(hello1). +-export([hello_joe/0]). + +hello_joe() -> + hello_joe. +``` + +--- +### Hello Joe + +```erlang +-module(hello1). +-export([hello_joe/0]). + +hello_joe() -> + hello_joe. + +% 1> c(hello1). +% {ok,hello1} +% 2> hello1:hello_joe(). +% hello_joe +``` + +--- +### Hello Joe + +```erlang +-module(hello2). +-export([hello/1]). + +hello(Name) -> + io:format("Hello ~s!~n", [Name]). + +% 3> c(hello2). +% {ok,hello2} +% 4> hello2:hello("Joe"). +% Hello Joe! +% 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. +``` + +--- + +## [fit] Some issues with that ... + +- What about unused messages? +- What if the server crashes? + +--- + +## [fit] Part 2: Open Telecom Platform + +### **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 *Erlang the Movie* +* (soon!) Join the Oslo BEAM meetup group + +--- + +# [fit] Questions? + +`@tazjin` diff --git a/presentations/erlang-2016/presentation.pdf b/presentations/erlang-2016/presentation.pdf new file mode 100644 index 0000000000..ec8d996704 Binary files /dev/null and b/presentations/erlang-2016/presentation.pdf differ diff --git a/presentations/erlang-2016/src/hello.erl b/presentations/erlang-2016/src/hello.erl new file mode 100644 index 0000000000..56404a0c5a --- /dev/null +++ b/presentations/erlang-2016/src/hello.erl @@ -0,0 +1,5 @@ +-module(hello). +-export([hello_joe/0]). + +hello_joe() -> + hello_joe. diff --git a/presentations/erlang-2016/src/hello1.erl b/presentations/erlang-2016/src/hello1.erl new file mode 100644 index 0000000000..ca78261399 --- /dev/null +++ b/presentations/erlang-2016/src/hello1.erl @@ -0,0 +1,5 @@ +-module(hello1). +-export([hello_joe/0]). + +hello_joe() -> + hello_joe. diff --git a/presentations/erlang-2016/src/hello2.erl b/presentations/erlang-2016/src/hello2.erl new file mode 100644 index 0000000000..2d1f6c84c4 --- /dev/null +++ b/presentations/erlang-2016/src/hello2.erl @@ -0,0 +1,11 @@ +-module(hello2). +-export([hello/1]). + +hello(Name) -> + io:format("Hey ~s!~n", [Name]). + +% 3> c(hello2). +% {ok,hello2} +% 4> hello2:hello("Joe"). +% Hello Joe! +% ok diff --git a/presentations/erlang-2016/src/hello_server.erl b/presentations/erlang-2016/src/hello_server.erl new file mode 100644 index 0000000000..01df14ac57 --- /dev/null +++ b/presentations/erlang-2016/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/presentations/erlang-2016/src/hello_server2.erl b/presentations/erlang-2016/src/hello_server2.erl new file mode 100644 index 0000000000..24bb934ee5 --- /dev/null +++ b/presentations/erlang-2016/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/presentations/erlang-2016/src/hello_sup.erl b/presentations/erlang-2016/src/hello_sup.erl new file mode 100644 index 0000000000..7fee0928c5 --- /dev/null +++ b/presentations/erlang-2016/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]}. diff --git a/src/hello.erl b/src/hello.erl deleted file mode 100644 index 56404a0c5a..0000000000 --- a/src/hello.erl +++ /dev/null @@ -1,5 +0,0 @@ --module(hello). --export([hello_joe/0]). - -hello_joe() -> - hello_joe. diff --git a/src/hello1.erl b/src/hello1.erl deleted file mode 100644 index ca78261399..0000000000 --- a/src/hello1.erl +++ /dev/null @@ -1,5 +0,0 @@ --module(hello1). --export([hello_joe/0]). - -hello_joe() -> - hello_joe. diff --git a/src/hello2.erl b/src/hello2.erl deleted file mode 100644 index 2d1f6c84c4..0000000000 --- a/src/hello2.erl +++ /dev/null @@ -1,11 +0,0 @@ --module(hello2). --export([hello/1]). - -hello(Name) -> - io:format("Hey ~s!~n", [Name]). - -% 3> c(hello2). -% {ok,hello2} -% 4> hello2:hello("Joe"). -% Hello Joe! -% ok diff --git a/src/hello_server.erl b/src/hello_server.erl deleted file mode 100644 index 01df14ac57..0000000000 --- a/src/hello_server.erl +++ /dev/null @@ -1,12 +0,0 @@ --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 deleted file mode 100644 index 24bb934ee5..0000000000 --- a/src/hello_server2.erl +++ /dev/null @@ -1,36 +0,0 @@ --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 deleted file mode 100644 index 7fee0928c5..0000000000 --- a/src/hello_sup.erl +++ /dev/null @@ -1,24 +0,0 @@ --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]}. -- cgit 1.4.1