SlideShare a Scribd company logo
PubNative Tracker
Andrew Djoga
Elixir is what would happen if Erlang, Clojure and
Ruby somehow had a baby and it wasn't an
accident.
Devin Torres
open source enthusiast
Immutability
animals = ["capybara", "apple", "lemur"]
List.delete(animals, "apple")
#=> ["capybara", "lemur"]
animals
#=> ["lion", "table", "bear"]
High-order functions
double = fn(i) -> i * 2 end
Enum.map([1, 2, 3], double)
#=> [2, 4, 6]
Pattern matching
[first, second, _] = [
:virginia,
:singapore,
:ireland,
]
first
#=> :virginia
second
#=> :singapore
Pattern matching
list = [1, 2, 3]
[1 | tail] = list
tail
#=> [2, 3]
[2 | _] = list
** (MatchError) no match of right hand side
value: [1, 2, 3]
Collections
Enum.any?(["foo", "bar", “hi"],
fn(s) -> len(s) == 2 end)
#=> true
File.read("path/to/unknown/file")
#=> {:error, "reason"}
map = %{:foo => "bar", :hello => "hi"}
map[:foo]
#=> “bar"
Functions
def square([]), do: []
def square([head | tail]) do
[head * head | square(tail)]
end
square([1, 2, 3])
#=> [1, 4, 9]
Enum.map([1, 2, 3], fn(x) -> x * x end)
#=> [1, 4, 9]
Composition
defmodule Math do
def sum(a, b) do
a + b
end
end
Math.sum(1, 2)
#=> 3
Concurrency
lightweight
isolation
message passing
Concurrent processes with no data sharing
provide a strong measure of fault isolation.
A software error in a concurrent process
should not influence processing in the other
processes in the system.
creator of Erlang
Joe Armstrong
Based on its designated behavior, the actor responds
to incoming messages by send new messages,
spawn new actors and/or changing its future behavior.
Each actor has its own mailbox and isolated state.
Supervisor
children = [
supervisor(Stats.Supervisor),
supervisor(Queue.KafkaSupervisor),
worker(Queue.SQSWorker, [period, []]),
supervisor(Queue.Supervisor),
supervisor(Cache.DBSupervisor),
Plug.Adapters.Cowboy.child_spec(:http, Router, [],
[port: port])
]
supervise(children,
strategy: :one_for_one,
max_restarts: 10,
max_seconds: 1
)
Worker
def handle_cast(:receive, state) do
case :sqs.receive(state.queue) do
[] -> Logger.info("no messages")
messages -> to_kafka(messages)
end
{:noreply, state}
end
def terminate(reason, _) when reason == :normal, do: :ok
def terminate(reason, state) do
Logger.error("#{reason}: #{inspect state}")
:ok
end
tooling
IEx
iex(1)> Weather
...(1)> |> where(city: "Berlin")
...(1)> |> order_by(:temp_lo)
...(1)> |> limit(10)
...(1)> |> Repo.all
Mix
mix new my_app
compile
test
deps.get
ExUnit
test "decodes a base64 without padding chars" do
assert Token.urlsafe_decode64("YWJjZA") == "abcd"
assert Token.urlsafe_decode64("YWJjZA=") == "abcd"
assert Token.urlsafe_decode64("YWJjZA==") == "abcd"
end
➜ tracker mix test test/tracker/api/token_test.exs --trace
Tracker.API.TokenTest
* decodes a base64 without padding chars (8.1ms)
* decodes a base64 in the URLEncoding mode defined in RFC 4648 (0.01ms)
* fixes a token with a double question mark (0.01ms)
* decrypts a token (15.2ms)
* returns error with a broken token (14.8ms)
Finished in 0.1 seconds (0.09s on load, 0.03s on tests)
5 tests, 0 failures
Type Specifications
@spec network(integer) :: {String.t, String.t} | :not_found
def network(id) do
case :ets.lookup(:db_networks, id) do
[{^id, name, url}] -> {name, url}
_ -> :not_found
end
end
Dialyzer is a static analysis tool that identifies software
discrepancies such as type errors, unreachable code,
unnecessary tests, etc in Erlang / Elixir applications.
$ iex --name console@127.0.0.1 --remsh tracker@127.0.0.1
etop
Erlang Top is a tool for presenting information about Erlang
processes similar to the information presented by "top" in
UNIX.
erlang.processes()
Returns a list of process identifiers corresponding to all
the processes currently existing on the local node.
erlang.memory()
Returns a list with information about memory dynamically
allocated by the Erlang emulator.
Built-In Term Storage
ETS tables are implemented as BIFs in the ets
module.
The main design objectives ETS had was to
provide a way to store large amounts of data in
Erlang with constant access time and to have
such storage look as if it were implemented as
processes in order to keep their use simple and
idiomatic.
http://learnyousomeerlang.com
http://elixir-lang.org
http://erlang.org/doc/design_principles/users_guide.html
http://ninenines.eu/docs/en/cowboy/1.0/guide

More Related Content

What's hot

Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at Stripe
MongoDB
 
From mysql to MongoDB(MongoDB2011北京交流会)
From mysql to MongoDB(MongoDB2011北京交流会)From mysql to MongoDB(MongoDB2011北京交流会)
From mysql to MongoDB(MongoDB2011北京交流会)
Night Sailer
 

What's hot (20)

Damn Fine CoffeeScript
Damn Fine CoffeeScriptDamn Fine CoffeeScript
Damn Fine CoffeeScript
 
Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9
 
Python postgre sql a wonderful wedding
Python postgre sql   a wonderful weddingPython postgre sql   a wonderful wedding
Python postgre sql a wonderful wedding
 
Lập trình Python cơ bản
Lập trình Python cơ bảnLập trình Python cơ bản
Lập trình Python cơ bản
 
The Magic Of Elixir
The Magic Of ElixirThe Magic Of Elixir
The Magic Of Elixir
 
Hidden treasures of Ruby
Hidden treasures of RubyHidden treasures of Ruby
Hidden treasures of Ruby
 
An (Inaccurate) Introduction to Python
An (Inaccurate) Introduction to PythonAn (Inaccurate) Introduction to Python
An (Inaccurate) Introduction to Python
 
Stop Guessing and Start Measuring - Benchmarking in Practice (Lambdadays)
Stop Guessing and Start Measuring - Benchmarking in Practice (Lambdadays)Stop Guessing and Start Measuring - Benchmarking in Practice (Lambdadays)
Stop Guessing and Start Measuring - Benchmarking in Practice (Lambdadays)
 
Parse Everything With Elixir
Parse Everything With ElixirParse Everything With Elixir
Parse Everything With Elixir
 
스위프트를 여행하는 히치하이커를 위한 스타일 안내
스위프트를 여행하는 히치하이커를 위한 스타일 안내스위프트를 여행하는 히치하이커를 위한 스타일 안내
스위프트를 여행하는 히치하이커를 위한 스타일 안내
 
Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at Stripe
 
7li7w devcon5
7li7w devcon57li7w devcon5
7li7w devcon5
 
Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at Stripe
 
Building Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at StripeBuilding Real Time Systems on MongoDB Using the Oplog at Stripe
Building Real Time Systems on MongoDB Using the Oplog at Stripe
 
Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014Groovy puzzlers по русски с Joker 2014
Groovy puzzlers по русски с Joker 2014
 
Investigating Python Wats
Investigating Python WatsInvestigating Python Wats
Investigating Python Wats
 
ES6: Features + Rails
ES6: Features + RailsES6: Features + Rails
ES6: Features + Rails
 
From mysql to MongoDB(MongoDB2011北京交流会)
From mysql to MongoDB(MongoDB2011北京交流会)From mysql to MongoDB(MongoDB2011北京交流会)
From mysql to MongoDB(MongoDB2011北京交流会)
 
[131]해커의 관점에서 바라보기
[131]해커의 관점에서 바라보기[131]해커의 관점에서 바라보기
[131]해커의 관점에서 바라보기
 
How fast ist it really? Benchmarking in practice
How fast ist it really? Benchmarking in practiceHow fast ist it really? Benchmarking in practice
How fast ist it really? Benchmarking in practice
 

Viewers also liked

Young Employee Award - Clare Bassett
Young Employee Award - Clare BassettYoung Employee Award - Clare Bassett
Young Employee Award - Clare Bassett
Clare Bassett
 

Viewers also liked (8)

LIArena_141014_9_8
LIArena_141014_9_8LIArena_141014_9_8
LIArena_141014_9_8
 
Proyecto 1-Aprendiendo sobre las TICs
Proyecto 1-Aprendiendo sobre las TICsProyecto 1-Aprendiendo sobre las TICs
Proyecto 1-Aprendiendo sobre las TICs
 
Young Employee Award - Clare Bassett
Young Employee Award - Clare BassettYoung Employee Award - Clare Bassett
Young Employee Award - Clare Bassett
 
Double award pitch
Double award pitchDouble award pitch
Double award pitch
 
2.2. luís gonçalo campos, paulo fernandes, margarida c. coelho
2.2. luís gonçalo campos, paulo fernandes, margarida c. coelho2.2. luís gonçalo campos, paulo fernandes, margarida c. coelho
2.2. luís gonçalo campos, paulo fernandes, margarida c. coelho
 
2.2. andré pedrosa, helena albuquerque, zélia breda
2.2. andré pedrosa, helena albuquerque, zélia breda2.2. andré pedrosa, helena albuquerque, zélia breda
2.2. andré pedrosa, helena albuquerque, zélia breda
 
Managing risk through change: charities
Managing risk through change: charitiesManaging risk through change: charities
Managing risk through change: charities
 
How to Determine CLIENT LIFETIME VALUE in Five Minutes
How to Determine CLIENT LIFETIME VALUE in Five MinutesHow to Determine CLIENT LIFETIME VALUE in Five Minutes
How to Determine CLIENT LIFETIME VALUE in Five Minutes
 

Similar to PubNative Tracker

What I learned from Seven Languages in Seven Weeks (IPRUG)
What I learned from Seven Languages in Seven Weeks (IPRUG)What I learned from Seven Languages in Seven Weeks (IPRUG)
What I learned from Seven Languages in Seven Weeks (IPRUG)
Kerry Buckley
 
Useful javascript
Useful javascriptUseful javascript
Useful javascript
Lei Kang
 
Scala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar ProkopecScala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar Prokopec
Loïc Descotte
 
An introduction to property-based testing
An introduction to property-based testingAn introduction to property-based testing
An introduction to property-based testing
Vincent Pradeilles
 

Similar to PubNative Tracker (20)

Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語Haskellで学ぶ関数型言語
Haskellで学ぶ関数型言語
 
Elm: give it a try
Elm: give it a tryElm: give it a try
Elm: give it a try
 
Elixir -Tolerância a Falhas para Adultos - GDG Campinas
Elixir  -Tolerância a Falhas para Adultos - GDG CampinasElixir  -Tolerância a Falhas para Adultos - GDG Campinas
Elixir -Tolerância a Falhas para Adultos - GDG Campinas
 
What I learned from Seven Languages in Seven Weeks (IPRUG)
What I learned from Seven Languages in Seven Weeks (IPRUG)What I learned from Seven Languages in Seven Weeks (IPRUG)
What I learned from Seven Languages in Seven Weeks (IPRUG)
 
Useful javascript
Useful javascriptUseful javascript
Useful javascript
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
 
Slides
SlidesSlides
Slides
 
Introducción a Elixir
Introducción a ElixirIntroducción a Elixir
Introducción a Elixir
 
CoffeeScript
CoffeeScriptCoffeeScript
CoffeeScript
 
Scala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar ProkopecScala presentation by Aleksandar Prokopec
Scala presentation by Aleksandar Prokopec
 
Brief tour of psp-std
Brief tour of psp-stdBrief tour of psp-std
Brief tour of psp-std
 
여자개발자모임터 6주년 개발 세미나 - Scala Language
여자개발자모임터 6주년 개발 세미나 - Scala Language여자개발자모임터 6주년 개발 세미나 - Scala Language
여자개발자모임터 6주년 개발 세미나 - Scala Language
 
An introduction to property-based testing
An introduction to property-based testingAn introduction to property-based testing
An introduction to property-based testing
 
ssh.isdn.test
ssh.isdn.testssh.isdn.test
ssh.isdn.test
 
Basics
BasicsBasics
Basics
 
Groovy puzzlers jug-moscow-part 2
Groovy puzzlers jug-moscow-part 2Groovy puzzlers jug-moscow-part 2
Groovy puzzlers jug-moscow-part 2
 
Erlang
ErlangErlang
Erlang
 
Towards Programming Languages for Reasoning.pptx
Towards Programming Languages for Reasoning.pptxTowards Programming Languages for Reasoning.pptx
Towards Programming Languages for Reasoning.pptx
 
Elixir cheatsheet
Elixir cheatsheetElixir cheatsheet
Elixir cheatsheet
 
Slaying the Dragon: Implementing a Programming Language in Ruby
Slaying the Dragon: Implementing a Programming Language in RubySlaying the Dragon: Implementing a Programming Language in Ruby
Slaying the Dragon: Implementing a Programming Language in Ruby
 

Recently uploaded

School management system project report.pdf
School management system project report.pdfSchool management system project report.pdf
School management system project report.pdf
Kamal Acharya
 
Hall booking system project report .pdf
Hall booking system project report  .pdfHall booking system project report  .pdf
Hall booking system project report .pdf
Kamal Acharya
 

Recently uploaded (20)

ONLINE CAR SERVICING SYSTEM PROJECT REPORT.pdf
ONLINE CAR SERVICING SYSTEM PROJECT REPORT.pdfONLINE CAR SERVICING SYSTEM PROJECT REPORT.pdf
ONLINE CAR SERVICING SYSTEM PROJECT REPORT.pdf
 
Introduction to Casting Processes in Manufacturing
Introduction to Casting Processes in ManufacturingIntroduction to Casting Processes in Manufacturing
Introduction to Casting Processes in Manufacturing
 
School management system project report.pdf
School management system project report.pdfSchool management system project report.pdf
School management system project report.pdf
 
Pharmacy management system project report..pdf
Pharmacy management system project report..pdfPharmacy management system project report..pdf
Pharmacy management system project report..pdf
 
Natalia Rutkowska - BIM School Course in Kraków
Natalia Rutkowska - BIM School Course in KrakówNatalia Rutkowska - BIM School Course in Kraków
Natalia Rutkowska - BIM School Course in Kraków
 
Construction method of steel structure space frame .pptx
Construction method of steel structure space frame .pptxConstruction method of steel structure space frame .pptx
Construction method of steel structure space frame .pptx
 
Arduino based vehicle speed tracker project
Arduino based vehicle speed tracker projectArduino based vehicle speed tracker project
Arduino based vehicle speed tracker project
 
Courier management system project report.pdf
Courier management system project report.pdfCourier management system project report.pdf
Courier management system project report.pdf
 
Hall booking system project report .pdf
Hall booking system project report  .pdfHall booking system project report  .pdf
Hall booking system project report .pdf
 
shape functions of 1D and 2 D rectangular elements.pptx
shape functions of 1D and 2 D rectangular elements.pptxshape functions of 1D and 2 D rectangular elements.pptx
shape functions of 1D and 2 D rectangular elements.pptx
 
Event Management System Vb Net Project Report.pdf
Event Management System Vb Net  Project Report.pdfEvent Management System Vb Net  Project Report.pdf
Event Management System Vb Net Project Report.pdf
 
Electrostatic field in a coaxial transmission line
Electrostatic field in a coaxial transmission lineElectrostatic field in a coaxial transmission line
Electrostatic field in a coaxial transmission line
 
Introduction to Machine Learning Unit-5 Notes for II-II Mechanical Engineering
Introduction to Machine Learning Unit-5 Notes for II-II Mechanical EngineeringIntroduction to Machine Learning Unit-5 Notes for II-II Mechanical Engineering
Introduction to Machine Learning Unit-5 Notes for II-II Mechanical Engineering
 
NO1 Pandit Amil Baba In Bahawalpur, Sargodha, Sialkot, Sheikhupura, Rahim Yar...
NO1 Pandit Amil Baba In Bahawalpur, Sargodha, Sialkot, Sheikhupura, Rahim Yar...NO1 Pandit Amil Baba In Bahawalpur, Sargodha, Sialkot, Sheikhupura, Rahim Yar...
NO1 Pandit Amil Baba In Bahawalpur, Sargodha, Sialkot, Sheikhupura, Rahim Yar...
 
KIT-601 Lecture Notes-UNIT-4.pdf Frequent Itemsets and Clustering
KIT-601 Lecture Notes-UNIT-4.pdf Frequent Itemsets and ClusteringKIT-601 Lecture Notes-UNIT-4.pdf Frequent Itemsets and Clustering
KIT-601 Lecture Notes-UNIT-4.pdf Frequent Itemsets and Clustering
 
Democratizing Fuzzing at Scale by Abhishek Arya
Democratizing Fuzzing at Scale by Abhishek AryaDemocratizing Fuzzing at Scale by Abhishek Arya
Democratizing Fuzzing at Scale by Abhishek Arya
 
Online resume builder management system project report.pdf
Online resume builder management system project report.pdfOnline resume builder management system project report.pdf
Online resume builder management system project report.pdf
 
BRAKING SYSTEM IN INDIAN RAILWAY AutoCAD DRAWING
BRAKING SYSTEM IN INDIAN RAILWAY AutoCAD DRAWINGBRAKING SYSTEM IN INDIAN RAILWAY AutoCAD DRAWING
BRAKING SYSTEM IN INDIAN RAILWAY AutoCAD DRAWING
 
HYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generationHYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generation
 
RESORT MANAGEMENT AND RESERVATION SYSTEM PROJECT REPORT.pdf
RESORT MANAGEMENT AND RESERVATION SYSTEM PROJECT REPORT.pdfRESORT MANAGEMENT AND RESERVATION SYSTEM PROJECT REPORT.pdf
RESORT MANAGEMENT AND RESERVATION SYSTEM PROJECT REPORT.pdf
 

PubNative Tracker

  • 2.
  • 3. Elixir is what would happen if Erlang, Clojure and Ruby somehow had a baby and it wasn't an accident. Devin Torres open source enthusiast
  • 4. Immutability animals = ["capybara", "apple", "lemur"] List.delete(animals, "apple") #=> ["capybara", "lemur"] animals #=> ["lion", "table", "bear"]
  • 5. High-order functions double = fn(i) -> i * 2 end Enum.map([1, 2, 3], double) #=> [2, 4, 6]
  • 6. Pattern matching [first, second, _] = [ :virginia, :singapore, :ireland, ] first #=> :virginia second #=> :singapore
  • 7. Pattern matching list = [1, 2, 3] [1 | tail] = list tail #=> [2, 3] [2 | _] = list ** (MatchError) no match of right hand side value: [1, 2, 3]
  • 8. Collections Enum.any?(["foo", "bar", “hi"], fn(s) -> len(s) == 2 end) #=> true File.read("path/to/unknown/file") #=> {:error, "reason"} map = %{:foo => "bar", :hello => "hi"} map[:foo] #=> “bar"
  • 9. Functions def square([]), do: [] def square([head | tail]) do [head * head | square(tail)] end square([1, 2, 3]) #=> [1, 4, 9] Enum.map([1, 2, 3], fn(x) -> x * x end) #=> [1, 4, 9]
  • 10. Composition defmodule Math do def sum(a, b) do a + b end end Math.sum(1, 2) #=> 3
  • 12. Concurrent processes with no data sharing provide a strong measure of fault isolation. A software error in a concurrent process should not influence processing in the other processes in the system. creator of Erlang Joe Armstrong
  • 13. Based on its designated behavior, the actor responds to incoming messages by send new messages, spawn new actors and/or changing its future behavior. Each actor has its own mailbox and isolated state.
  • 14. Supervisor children = [ supervisor(Stats.Supervisor), supervisor(Queue.KafkaSupervisor), worker(Queue.SQSWorker, [period, []]), supervisor(Queue.Supervisor), supervisor(Cache.DBSupervisor), Plug.Adapters.Cowboy.child_spec(:http, Router, [], [port: port]) ] supervise(children, strategy: :one_for_one, max_restarts: 10, max_seconds: 1 )
  • 15. Worker def handle_cast(:receive, state) do case :sqs.receive(state.queue) do [] -> Logger.info("no messages") messages -> to_kafka(messages) end {:noreply, state} end def terminate(reason, _) when reason == :normal, do: :ok def terminate(reason, state) do Logger.error("#{reason}: #{inspect state}") :ok end
  • 17. IEx iex(1)> Weather ...(1)> |> where(city: "Berlin") ...(1)> |> order_by(:temp_lo) ...(1)> |> limit(10) ...(1)> |> Repo.all
  • 19. ExUnit test "decodes a base64 without padding chars" do assert Token.urlsafe_decode64("YWJjZA") == "abcd" assert Token.urlsafe_decode64("YWJjZA=") == "abcd" assert Token.urlsafe_decode64("YWJjZA==") == "abcd" end ➜ tracker mix test test/tracker/api/token_test.exs --trace Tracker.API.TokenTest * decodes a base64 without padding chars (8.1ms) * decodes a base64 in the URLEncoding mode defined in RFC 4648 (0.01ms) * fixes a token with a double question mark (0.01ms) * decrypts a token (15.2ms) * returns error with a broken token (14.8ms) Finished in 0.1 seconds (0.09s on load, 0.03s on tests) 5 tests, 0 failures
  • 20. Type Specifications @spec network(integer) :: {String.t, String.t} | :not_found def network(id) do case :ets.lookup(:db_networks, id) do [{^id, name, url}] -> {name, url} _ -> :not_found end end Dialyzer is a static analysis tool that identifies software discrepancies such as type errors, unreachable code, unnecessary tests, etc in Erlang / Elixir applications.
  • 21. $ iex --name console@127.0.0.1 --remsh tracker@127.0.0.1 etop Erlang Top is a tool for presenting information about Erlang processes similar to the information presented by "top" in UNIX. erlang.processes() Returns a list of process identifiers corresponding to all the processes currently existing on the local node. erlang.memory() Returns a list with information about memory dynamically allocated by the Erlang emulator.
  • 22. Built-In Term Storage ETS tables are implemented as BIFs in the ets module. The main design objectives ETS had was to provide a way to store large amounts of data in Erlang with constant access time and to have such storage look as if it were implemented as processes in order to keep their use simple and idiomatic.