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
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
### **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
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
^ 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…
	
	Add table
		Add a link
		
	
		Reference in a new issue