#Popcorn Erlang Factory @SF_Bay 2013
-
Upload
marc-campbell -
Category
Technology
-
view
365 -
download
3
Transcript of #Popcorn Erlang Factory @SF_Bay 2013
![Page 1: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/1.jpg)
Saturday, March 23, 13
![Page 2: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/2.jpg)
Brought to You By
Martin HaldMarc Campbell
Thanks Fernanado!Saturday, March 23, 13
![Page 3: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/3.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
2013-‐03-‐20 15:49:06.243 [info] <0.2780.0>@tt_account:came_online:457 Account came online: c2a8c653-‐d4c2-‐4d3d-‐ad2s-‐bd488cd9ec81/
e5e752ef-‐79ae-‐4e26-‐9b6b-‐654e9926c56e
Saturday, March 23, 13
![Page 4: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/4.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Live Demo
Saturday, March 23, 13
![Page 5: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/5.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Concepts
Saturday, March 23, 13
![Page 6: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/6.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Lager
Whats in a Log Entry?
• Timestamp• Severity• Log Text
• Module• Function• Line Number• Process ID
Saturday, March 23, 13
![Page 7: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/7.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Lager
Whats in a Log Entry?
• Timestamp• Severity• Log Text
• Module• Function• Line Number• Process ID
• Role• Node• Version
• Caller Information • App Metrics• Env Metrics
Popcorn
Coming Soon
Saturday, March 23, 13
![Page 8: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/8.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
88 2013-‐03-‐16 08:29:46.781 [info] <0.362.0>@avatar:req_handler:123 Starting
avatar rendering
Lager Log Messages
Saturday, March 23, 13
![Page 9: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/9.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
88 2013-‐03-‐16 08:29:46.781 [info] <0.362.0>@avatar:req_handler:123 Starting #customer_request (avatar rendering) for
@mhald
Popcorn Log Message
Saturday, March 23, 13
![Page 10: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/10.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
LogMessage Alert
• Error• Warning• Critical• Crash• #identified_topic
From Log Entry to Alert
Saturday, March 23, 13
![Page 11: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/11.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Alerts Groups Critical Log Entries
Alert
#login_failed for @fearing, returning #404
#login_failed for @ga, returning #404
#login_success for @bhatia, returning #200
Saturday, March 23, 13
![Page 12: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/12.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Address Scheme
XMPP v2.0.15 user_auth : 54Role Version Module Line Number
Saturday, March 23, 13
![Page 13: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/13.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
http_hander:404 Bad request <<“error”>>
http_hander:404 Bad request <<“api/v2”>>
http_hander:404 Bad request ********
0fc4cf26168b2a4b959d914682c10bc3
Crashes have no line number
Auto
Associa
tive
Memory
Saturday, March 23, 13
![Page 14: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/14.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
• Identity
• Topic
Data Stream
• Role
• Node
• Version
• Severity
Structured Unstructured
Saturday, March 23, 13
![Page 15: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/15.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Acme Calculators
Saturday, March 23, 13
![Page 16: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/16.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Build Popcorngit clone [email protected]:marccampbell/popcorn.gitcd popcorn./rebar get-‐deps./rebar compile
lessc apps/popcorn/priv/css/popcorn.less > \ apps/popcorn/priv/css/popcorn.css
./rebar generate -‐f
Saturday, March 23, 13
![Page 17: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/17.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Configure Popcorn
{http_auth_users, [{<<"admin">>, <<"password">>}]}, {outbound_notifiers, [ {new_alert, outbound_mailer, [{options, [{retries, 3}, {relay, "smtp.gmail.com"}, {username, "[email protected]"}, {password, "PASSWORD"}]}, {from, "[email protected]"}, {recipients, ["[email protected]"]}, {subject, "New Alert at {{product}} {{version}}"} ]},
app.config
Saturday, March 23, 13
![Page 18: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/18.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
{deps, [ ... {lager_popcorn_backend, ".*", {git,
"[email protected]:marccampbell/lager_popcorn_backend.git", "master" }}
...]}.
Calculator app rebar.config
Hook in Popcorn
Saturday, March 23, 13
![Page 19: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/19.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
%% Lager config {lager, [ {handlers, [ {lager_console_backend, none}, {lager_file_backend, [ {"log/error.log",
error, 104857600, "$D0", 5} ]}, {lager_popcorn_backend, [ {level, debug}, {popcorn_host, "127.0.0.1"}, {popcorn_port, 9125}, {node_role, "Calculator"}, {node_version, "1.0.7"} ]} ]}
Calculator application sys.config
Hook in Popcorn
Saturday, March 23, 13
![Page 20: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/20.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
curl -v -X POST --data-urlencode "2 4 /" \http://calculator.logwithpopcorn.com/api/calculator
http://demo.logwithpopcorn.com/
DemoUsing the Calculator HTTP API
See and try Popcorn at
1 5 +9 3 /5 2 -2 2 *
(will cause crash)
Saturday, March 23, 13
![Page 21: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/21.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Customers
Support
Saturday, March 23, 13
![Page 22: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/22.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Customers
Support
Saturday, March 23, 13
![Page 23: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/23.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Customers
Support
• Identify edge case bugs
• Real-time alerting
• Logs as data streams
Saturday, March 23, 13
![Page 24: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/24.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Popcorn Design
Saturday, March 23, 13
![Page 25: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/25.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Ingesting
Storage
Rendering
Saturday, March 23, 13
![Page 26: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/26.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
UDP or TCP or ...
Connectionless Dropped packets
Quick No acknowledgements
Out of order
Saturday, March 23, 13
![Page 27: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/27.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Ingesting Architecture
Client (lager)
Client (winston)
Client (log4j)
Client (...)
udp_listener (gen_server)
node_fsm
node_fsm
node_fsm
node_fsm (...)
Saturday, March 23, 13
![Page 28: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/28.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Storage Architecture
popcorn_app (application)
storage_sup (supervisor)
storage_monitor (gen_server)
storage_worker (gen_server)
storage_worker (gen_server)
storage_worker (gen_server)
Saturday, March 23, 13
![Page 29: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/29.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
init([]) / init([worker])
gen_server:handle_call/3
gen_server:handle_cast/2
Storage gen_server behaviour
Saturday, March 23, 13
![Page 30: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/30.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
handle_call{counter_value, Count}{is_known_node, Node_Name}{get_alert, Key}{get_alerts, Severity, Sort}{get_alert_keys, Type}{get_release_module_link, Role, Version, Module}{search_messages, {...}}{get_alert_timestamps, Severities}
Saturday, March 23, 13
![Page 31: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/31.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
handle_cast{expire_logs_matching, Timestamp}{send_recent_log_lines_matching, Pid, Count, Filters}{new_log_message, #log_message}{new_release_scm, Record}{new_alert, Key, #alert}{new_alert_timestamp, Key, Severity, #alert}{new_alert_key, Type, Key}{new_release_scm_mapping, Record}{delete_counter, Counter}{increment_counter, Counter, Increment_By}{increment_counters, Counters}{add_node, #popcorn_node}
Saturday, March 23, 13
![Page 32: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/32.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Server Sent Events
Browser ServerSSE
HTTP Post
alert: {key: “001A”, seen:10}
node: {key: “xmpp@con8”, log_msgs:324}
Saturday, March 23, 13
![Page 33: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/33.jpg)
SSE Events in JS $(function() { var streamSource = new EventSource("/dashboard/stream/{{stream_id}}");
streamSource.addEventListener( 'update_counters', function(event) { var counters = JSON.parse(event.data) // ... });
streamSource.addEventListener( 'new_node', function(event) { var counters = JSON.parse(event.data) // ... });
Saturday, March 23, 13
![Page 34: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/34.jpg)
SSE Erlang Designhttp_stream_handler.erl-behavior(cowboy_http_handler).
init
handle handlepath
nodeNew
Req
uest
Pro
cess
fsm
One FSM per SSE client
RegisterEvents
Wait in receive loop
Saturday, March 23, 13
![Page 35: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/35.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
server { listen 80; server_name popcorn.logwithpopcorn.com;
access_log /var/log/nginx/popcorn_access.log; error_log /var/log/nginx/popcorn_error.log;
location / { proxy_pass http://localhost:9125; proxy_redirect off; proxy_buffering off; proxy_cache off; proxy_set_header Host $host; proxy_set_header X-‐Real-‐IP $remote_addr; proxy_set_header X-‐Forwarded-‐For $proxy_add_x_forwarded_for; proxy_read_timeout 420; }}
Saturday, March 23, 13
![Page 36: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/36.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Wire ProtocolStandards & Efficiency
Saturday, March 23, 13
![Page 37: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/37.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
erlang:iolist_to_binary([ protobuffs:encode(1, 1, uint32), %% Packet version protobuffs:encode(2, atom_to_list(Node), string), protobuffs:encode(3, Node_Role, string), protobuffs:encode(4, Node_Version, string), protobuffs:encode(5, lager_util:level_to_num(Severity), uint32), protobuffs:encode(6, Message, string), protobuffs:encode(7, opt(Module, <<"">>), string), protobuffs:encode(8, opt(Function, <<"">>), string), protobuffs:encode(9, opt(Line, <<"">>), string), protobuffs:encode(10, opt(Pid, <<"">>), string) ]).
Protobuffs
Saturday, March 23, 13
![Page 38: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/38.jpg)
JSONencode_json_packet(Node) -‐> jiffy:encode({[ {packet_version, 1}, {node, list_to_binary(Node)}, {role, <<"calculator">>}, {version, <<"0.0.1">>}, {severity, 128}, {message, <<"Calculator request 5 * 4">>}, {module, <<"http_calculator">>}, {function, <<"rpn">>}, {line, <<"58">>}, {pid, <<"">>} ]}).
Saturday, March 23, 13
![Page 39: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/39.jpg)
Bits and Bytes
^H^A^[email protected]^Zcalculator"^E0.0.1(^A2^XCalculator request 5 * 4:^Ohttp_calculatorB^CrpnJ^B58R^@
{"packet_version":1, "node":"[email protected]", "role":"calculator", "version":"0.0.1", "severity":128, "message":"Calculator request 5 * 4", "module":"http_calculator", "function":"rpn","line":"58","pid":""}
Saturday, March 23, 13
![Page 40: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/40.jpg)
Processing TimeOver 1,000,000 Requests on Apple Air with R16B
0 us
3 us
6 us
9 us
12 us
Encoding Decoding
JSON Protobuffs
Saturday, March 23, 13
![Page 41: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/41.jpg)
Memory
0 bytes
100 bytes
200 bytes
300 bytes
400 bytes
Memory
JSON Protobuffs
3x Less Memory
Saturday, March 23, 13
![Page 42: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/42.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Rendering Architecture
D3Crossfilter
Used only for grouping
streaming data, destroyed every
few seconds
Rendering
Plain Old Javascript
Store the grouped data from
Saturday, March 23, 13
![Page 43: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/43.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
countsByPeriod
severitiesByPeriod rolesByPeriod nodesByPeriod
Saturday, March 23, 13
![Page 44: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/44.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Scaling Popcorn
Saturday, March 23, 13
![Page 45: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/45.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Scalability Goal
Handle n log messages per second
10 50 500 5000
Saturday, March 23, 13
![Page 46: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/46.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Let’s Get Some Tools
Saturday, March 23, 13
![Page 47: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/47.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
statsd & graphiterps (mhald)
Saturday, March 23, 13
![Page 48: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/48.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
dtop statsd graphiteredbugChrome Activity Monitor
Saturday, March 23, 13
![Page 49: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/49.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Mnesia
UDP Receiving
Client (Browser)
Saturday, March 23, 13
![Page 50: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/50.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Issue: Mnesia
Saturday, March 23, 13
![Page 51: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/51.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Saturday, March 23, 13
![Page 52: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/52.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Saturday, March 23, 13
![Page 53: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/53.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Saturday, March 23, 13
![Page 54: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/54.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Saturday, March 23, 13
![Page 55: #Popcorn Erlang Factory @SF_Bay 2013](https://reader034.fdocuments.in/reader034/viewer/2022042700/5591f2881a28abeb278b47aa/html5/thumbnails/55.jpg)
#POPCORN ERLANG_FACTORY @SF_BAY - 2013
Issue: The Browser
Executing on the server (Erlang)
Executing in the browser (Javascript)vs
Saturday, March 23, 13