SlideShare una empresa de Scribd logo
1 de 118
Descargar para leer sin conexión
Going off the Rails into
Elixir
Dan Ivovich
DC |> Elixir
March 19, 2019
Why the dev team wants to
❗
AND
Why they should
Who Am I?
Who Am I?
• Software Developer
Who Am I?
• Software Developer
• Director of Development at SmartLogic
Who Am I?
• Software Developer
• Director of Development at SmartLogic
• Rails developer for 12 years
Who Am I?
• Software Developer
• Director of Development at SmartLogic
• Rails developer for 12 years
• Elixir convert since Summer 2016
Who Am I?
• Software Developer
• Director of Development at SmartLogic
• Rails developer for 12 years
• Elixir convert since Summer 2016
• Organizer of the Baltimore Elixir and Erlang
Meetup
Why Devs Love
Elixir
https://unsplash.com/photos/FoKO4DpXamQ
New!
https://unsplash.com/photos/CqKNkmNNLnI
Shiny!
https://unsplash.com/photos/nmUwlzQeQ
Fun!
https://unsplash.com/photos/TVfVo1pga9s
Compiled
https://xkcd.com/303/
But More Seriously
https://unsplash.com/photos/heyiNKAAJWc
Pattern Matching
https://unsplash.com/photos/vdbG0z6YDwM
Pattern Matching
> [1, b, 4] = [1, 5, 4]
[1, 5, 4]
> b
5
> [head | tail] = [1, 2, 3]
[1, 2, 3]
> head
1
> tail
[2, 3]
Pattern Matching
> [1, b, 4] = [1, 5, 4]
[1, 5, 4]
> b
5
> [head | tail] = [1, 2, 3]
[1, 2, 3]
> head
1
> tail
[2, 3]
Pattern Matching
> [1, b, 4] = [1, 5, 4]
[1, 5, 4]
> b
5
> [head | tail] = [1, 2, 3]
[1, 2, 3]
> head
1
> tail
[2, 3]
Pattern Matching
> [1, b, 4] = [1, 5, 4]
[1, 5, 4]
> b
5
> [head | tail] = [1, 2, 3]
[1, 2, 3]
> head
1
> tail
[2, 3]
Pattern Matching
> [1, b, 4] = [1, 5, 4]
[1, 5, 4]
> b
5
> [head | tail] = [1, 2, 3]
[1, 2, 3]
> head
1
> tail
[2, 3]
Pattern Matching
def execute({:ok, value}) do
IO.puts "Execute: #{value}"
end
def execute({:error, reason}) do
IO.puts "Error: #{reason}"
end
> execute({:ok, "Well Done!"})
Execute: Well Done!
> execute({:error, "Fail!"})
Error: Fail!
Pattern Matching
def execute({:ok, value}) do
IO.puts "Execute: #{value}"
end
def execute({:error, reason}) do
IO.puts "Error: #{reason}"
end
> execute({:ok, "Well Done!"})
Execute: Well Done!
> execute({:error, "Fail!"})
Error: Fail!
Pattern Matching
def execute({:ok, value}) do
IO.puts "Execute: #{value}"
end
def execute({:error, reason}) do
IO.puts "Error: #{reason}"
end
> execute({:ok, "Well Done!"})
Execute: Well Done!
> execute({:error, "Fail!"})
Error: Fail!
Pattern Matching
def execute({:ok, value}) do
IO.puts "Execute: #{value}"
end
def execute({:error, reason}) do
IO.puts "Error: #{reason}"
end
> execute({:ok, "Well Done!"})
Execute: Well Done!
> execute({:error, "Fail!"})
Error: Fail!
Pattern Matching
def execute({:ok, value}) do
IO.puts "Execute: #{value}"
end
def execute({:error, reason}) do
IO.puts "Error: #{reason}"
end
> execute({:ok, "Well Done!"})
Execute: Well Done!
> execute({:error, "Fail!"})
Error: Fail!
Pattern Matching
case HTTP.get(url) do
{:ok, %HTTP.Resp{status: 200, body: body}} ->
IO.puts body
{:ok, %HTTP.Resp{status: 404}} ->
IO.puts "Not found!"
{:ok, %HTTP.Resp{status: status}} ->
IO.puts "HTTP Status: #{status}"
{:error, %HTTP.Error{reason: reason}} ->
IO.inspect reason
_ ->
IO.puts "Some other error"
end
Pattern Matching
case HTTP.get(url) do
{:ok, %HTTP.Resp{status: 200, body: body}} ->
IO.puts body
{:ok, %HTTP.Resp{status: 404}} ->
IO.puts "Not found!"
{:ok, %HTTP.Resp{status: status}} ->
IO.puts "HTTP Status: #{status}"
{:error, %HTTP.Error{reason: reason}} ->
IO.inspect reason
_ ->
IO.puts "Some other error"
end
Pattern Matching
case HTTP.get(url) do
{:ok, %HTTP.Resp{status: 200, body: body}} ->
IO.puts body
{:ok, %HTTP.Resp{status: 404}} ->
IO.puts "Not found!"
{:ok, %HTTP.Resp{status: status}} ->
IO.puts "HTTP Status: #{status}"
{:error, %HTTP.Error{reason: reason}} ->
IO.inspect reason
_ ->
IO.puts "Some other error"
end
Pattern Matching
case HTTP.get(url) do
{:ok, %HTTP.Resp{status: 200, body: body}} ->
IO.puts body
{:ok, %HTTP.Resp{status: 404}} ->
IO.puts "Not found!"
{:ok, %HTTP.Resp{status: status}} ->
IO.puts "HTTP Status: #{status}"
{:error, %HTTP.Error{reason: reason}} ->
IO.inspect reason
_ ->
IO.puts "Some other error"
end
Pattern Matching
case HTTP.get(url) do
{:ok, %HTTP.Resp{status: 200, body: body}} ->
IO.puts body
{:ok, %HTTP.Resp{status: 404}} ->
IO.puts "Not found!"
{:ok, %HTTP.Resp{status: status}} ->
IO.puts "HTTP Status: #{status}"
{:error, %HTTP.Error{reason: reason}} ->
IO.inspect reason
_ ->
IO.puts "Some other error"
end
Pattern Matching
case HTTP.get(url) do
{:ok, %HTTP.Resp{status: 200, body: body}} ->
IO.puts body
{:ok, %HTTP.Resp{status: 404}} ->
IO.puts "Not found!"
{:ok, %HTTP.Resp{status: status}} ->
IO.puts "HTTP Status: #{status}"
{:error, %HTTP.Error{reason: reason}} ->
IO.inspect reason
_ ->
IO.puts "Some other error"
end
Pattern Matching
case HTTP.get(url) do
{:ok, %HTTP.Resp{status: 200, body: body}} ->
IO.puts body
{:ok, %HTTP.Resp{status: 404}} ->
IO.puts "Not found!"
{:ok, %HTTP.Resp{status: status}} ->
IO.puts "HTTP Status: #{status}"
{:error, %HTTP.Error{reason: reason}} ->
IO.inspect reason
_ ->
IO.puts "Some other error"
end
Pipe Operator
three = add(1, 2)
six = add(three, 3)
ten = add(six, 4)
ten = add(add(add(1, 2), 3), 4)
ten =
1
|> add(2)
|> add(3)
|> add(4)
Pipe Operator
three = add(1, 2)
six = add(three, 3)
ten = add(six, 4)
ten = add(add(add(1, 2), 3), 4)
ten =
1
|> add(2)
|> add(3)
|> add(4)
Pipe Operator
three = add(1, 2)
six = add(three, 3)
ten = add(six, 4)
ten = add(add(add(1, 2), 3), 4)
ten =
1
|> add(2)
|> add(3)
|> add(4)
Pipe Operator
three = add(1, 2)
six = add(three, 3)
ten = add(six, 4)
ten = add(add(add(1, 2), 3), 4)
ten =
1
|> add(2)
|> add(3)
|> add(4)
Ecto
Changesets
Ecto
Changesets
• Ever try and run just some ActiveRecord
validations depending on the current user?
Ecto
Changesets
• Ever try and run just some ActiveRecord
validations depending on the current user?
• Ever have a set of validations dependent on
data state?
Ecto
Changesets
def edit_self_changeset(user, params  %{}) do
user
|> cast(params, [:name, :age])
|> validate_required([:name])
|> validate_inclusion(:age, 18..100)
end
def admin_edit_changeset(user, params  %{}) do
user
|> cast(params, [:name, :email, :age])
|> validate_required([:name, :email])
|> validate_format(:email, ~r/@/)
|> validate_inclusion(:age, 18..100)
|> unique_constraint(:email)
end
Ecto
Changesets
def edit_self_changeset(user, params  %{}) do
user
|> cast(params, [:name, :age])
|> validate_required([:name])
|> validate_inclusion(:age, 18..100)
end
def admin_edit_changeset(user, params  %{}) do
user
|> cast(params, [:name, :email, :age])
|> validate_required([:name, :email])
|> validate_format(:email, ~r/@/)
|> validate_inclusion(:age, 18..100)
|> unique_constraint(:email)
end
Ecto
Changesets
def edit_self_changeset(user, params  %{}) do
user
|> cast(params, [:name, :age])
|> validate_required([:name])
|> validate_inclusion(:age, 18..100)
end
def admin_edit_changeset(user, params  %{}) do
user
|> cast(params, [:name, :email, :age])
|> validate_required([:name, :email])
|> validate_format(:email, ~r/@/)
|> validate_inclusion(:age, 18..100)
|> unique_constraint(:email)
end
Ecto
Changesets
def edit_self_changeset(user, params  %{}) do
user
|> cast(params, [:name, :age])
|> validate_required([:name])
|> validate_inclusion(:age, 18..100)
end
def admin_edit_changeset(user, params  %{}) do
user
|> cast(params, [:name, :email, :age])
|> validate_required([:name, :email])
|> validate_format(:email, ~r/@/)
|> validate_inclusion(:age, 18..100)
|> unique_constraint(:email)
end
Phoenix
Param Matching
def show(conn, %{"user_params" => user_params} = params) do
end
def show(conn, %{"admin_params" => admin_params} = params) do
end
Phoenix
View Code
Phoenix
View Code
• Not a pile of global namespace helpers
Phoenix
View Code
• Not a pile of global namespace helpers
• Good encapsulation of presentation logic
Gen Server
No need for external workers
GenServer.cast(MyWorker, {:process, this_thing})
def handle_cast({:process, this_thing}, state) do
# do work
{:noreply, state}
end
Gen Server
No need for external workers
GenServer.cast(MyWorker, {:process, this_thing})
def handle_cast({:process, this_thing}, state) do
# do work
{:noreply, state}
end
Gen Server
No need for external workers
GenServer.cast(MyWorker, {:process, this_thing})
def handle_cast({:process, this_thing}, state) do
# do work
{:noreply, state}
end
Management should support
Elixir
https://unsplash.com/photos/FoKO4DpXamQ
All that cool tech didn't
convince you!?!
https://unsplash.com/photos/FO7JIlwjOtU
What does Elixir bring?
What does Elixir bring?
• Ruby-inspired syntax
What does Elixir bring?
• Ruby-inspired syntax
• Meta programming
What does Elixir bring?
• Ruby-inspired syntax
• Meta programming
• Polymorphism via protocols
What does Elixir bring?
• Ruby-inspired syntax
• Meta programming
• Polymorphism via protocols
• Great tooling
What does Elixir bring?
• Ruby-inspired syntax
• Meta programming
• Polymorphism via protocols
• Great tooling
• Better code organization facilities than Erlang
What does Elixir bring?
• Ruby-inspired syntax
• Meta programming
• Polymorphism via protocols
• Great tooling
• Better code organization facilities than Erlang
• Erlang functions can be called from Elixir
What does Elixir bring?
What does Elixir bring?
• Lightweight and isolated concurrency
What does Elixir bring?
• Lightweight and isolated concurrency
• Shared nothing concurrent programming
What does Elixir bring?
• Lightweight and isolated concurrency
• Shared nothing concurrent programming
• Lazy and async collections
What does Elixir bring?
• Lightweight and isolated concurrency
• Shared nothing concurrent programming
• Lazy and async collections
• Pattern matching
What does Elixir bring?
• Lightweight and isolated concurrency
• Shared nothing concurrent programming
• Lazy and async collections
• Pattern matching
• Unicode support and UTF-8 strings
Scaleable and Fault-tolerant
Scaleable and Fault-tolerant
• Isolation means each process is garbage
collected independently
Scaleable and Fault-tolerant
• Isolation means each process is garbage
collected independently
• This means less system wide pauses.
Scaleable and Fault-tolerant
• Isolation means each process is garbage
collected independently
• This means less system wide pauses.
• Things go wrong. Especially with network or
disk activity.
Scaleable and Fault-tolerant
• Isolation means each process is garbage
collected independently
• This means less system wide pauses.
• Things go wrong. Especially with network or
disk activity.
• Supervisor processes are instructed in how to
maintain your application
Stable and Extensible
Stable and Extensible
• Only 1 planned language deprecation for 2.0
Stable and Extensible
• Only 1 planned language deprecation for 2.0
• No planned timeline for 2.0
Stable and Extensible
• Only 1 planned language deprecation for 2.0
• No planned timeline for 2.0
• The core team believes all the right
fundamentals are in place
Speed (Throughput)
Speed (Throughput)
• Sure, it isn't C
Speed (Throughput)
• Sure, it isn't C
• For a Rails shop, that isn't the benchmark
Speed (Throughput)
• Sure, it isn't C
• For a Rails shop, that isn't the benchmark
• Multi-thread by default, no global lock
Speed (Throughput)
• Sure, it isn't C
• For a Rails shop, that isn't the benchmark
• Multi-thread by default, no global lock
• Fast garbage collection
Speed (Throughput)
• Sure, it isn't C
• For a Rails shop, that isn't the benchmark
• Multi-thread by default, no global lock
• Fast garbage collection
• All means high throughput web apps
Used by Big Names
Used by Big Names
• Discord
Used by Big Names
• Discord
• Pagerduty
Used by Big Names
• Discord
• Pagerduty
• Bleacher Report
Used by Big Names
• Discord
• Pagerduty
• Bleacher Report
• Square Enix
Used by Big Names
• Discord
• Pagerduty
• Bleacher Report
• Square Enix
• Motorola
Used by Big Names
• Discord
• Pagerduty
• Bleacher Report
• Square Enix
• Motorola
• https://elixir-companies.com/browse
Costs
All of the items we've discussed have a real impact on:
Costs
All of the items we've discussed have a real impact on:
• Development pace, build from pure functions
Costs
All of the items we've discussed have a real impact on:
• Development pace, build from pure functions
• Developer focus, cognitive load of functions over
objects
Costs
All of the items we've discussed have a real impact on:
• Development pace, build from pure functions
• Developer focus, cognitive load of functions over
objects
• Ease of implementing new features
Costs
All of the items we've discussed have a real impact on:
• Development pace, build from pure functions
• Developer focus, cognitive load of functions over
objects
• Ease of implementing new features
• Test quality and speed
Costs
All of the items we've discussed have a real impact on:
• Development pace, build from pure functions
• Developer focus, cognitive load of functions over
objects
• Ease of implementing new features
• Test quality and speed
• Bug rates
Costs
All of the items we've discussed have a real impact on:
• Development pace, build from pure functions
• Developer focus, cognitive load of functions over
objects
• Ease of implementing new features
• Test quality and speed
• Bug rates
• Maintainability
Staffing
Staffing
• Innovative tech attracts innovative developers
Staffing
• Innovative tech attracts innovative developers
• Syntax is approachable
Staffing
• Innovative tech attracts innovative developers
• Syntax is approachable
• Resources are plentiful
Staffing
• Innovative tech attracts innovative developers
• Syntax is approachable
• Resources are plentiful
• Training is easy, and fun
Paradigm Shift?
Functional Programming
Paradigm Shift?
Functional Programming
• Might take some adjustment
Paradigm Shift?
Functional Programming
• Might take some adjustment
• Fits your use case more than you expect, it is
about the data
Paradigm Shift?
Functional Programming
• Might take some adjustment
• Fits your use case more than you expect, it is
about the data
• Makes writing great tests easy
Paradigm Shift?
Functional Programming
• Might take some adjustment
• Fits your use case more than you expect, it is
about the data
• Makes writing great tests easy
• Makes writing fast tests easy
Ecosystem and Resources
https://unsplash.com/photos/FzrjgIId6NU
Mix and IEx
Mix - A great build tool for dependency
management and other tasks
IEx - An interactive shell
Docs, Tests, and DocTests
Documentation - a first class citizen in the
Elixir ecosystem
Tests - Testing libraries built into the language
with ExUnit
DocTests - A hybrid of testing and documentation
What is Next
https://unsplash.com/photos/FoKO4DpXamQ
Getting Started
See my other talks
https://www.danivovich.com/other
Resources - Books
Programming Elixir
https://pragprog.com/book/elixir16/programming-elixir-1-6
Programming Phoenix
https://pragprog.com/book/phoenix14/programming-phoenix-1-4
Metaprogramming Elixir
https://pragprog.com/book/cmelixir/metaprogramming-elixir
Functional Web Development with Elixir, OTP, and Phoenix
https://pragprog.com/book/lhelph/functional-web-development-with-
elixir-otp-and-phoenix
Resources - Newsletters
Elixir Radar
http://plataformatec.com.br/elixir-radar
Elixir Weekly
https://elixirweekly.net/
Elixir Digest
https://elixirdigest.net
Resources - Conferences
ElixirConf EU (April 8-10, Prague)
http://www.elixirconf.eu/
EMPEX NYC (May 18, NYC)
http://empex.co/nyc
ElixirConf (August, Colorado)
https://elixirconf.com/
Resources - Podcasts
Smart Software with SmartLogic (First Season on Elixir in
Production)
https://podcast.smartlogic.io/
Elixir Outlaws Podcast
https://elixiroutlaws.com/
ElixirTalk Podcast
http://elixirtalk.com/
Elixir Mix Podcast
https://devchat.tv/elixir-mix
Resources - Meetups
DC
https://www.meetup.com/DC-Elixir/
Baltimore
https://www.meetup.com/Baltimore-Elixir-and-
Erlang-Meetup/
Resources - Others
Elixir Status Twitter
https://twitter.com/elixirstatus
Elixir Slack
http://elixir-slackin.herokuapp.com/
Elixir Forum
https://elixirforum.com
❤
We hope you will too
Questions? ❔

Más contenido relacionado

La actualidad más candente

Metrics-Driven Engineering
Metrics-Driven EngineeringMetrics-Driven Engineering
Metrics-Driven EngineeringMike Brittain
 
PowerShell: Through the SharePoint Looking Glass
PowerShell: Through the SharePoint Looking GlassPowerShell: Through the SharePoint Looking Glass
PowerShell: Through the SharePoint Looking GlassBrian Caauwe
 
Build a bot workshop async primer - php[tek]
Build a bot workshop  async primer - php[tek]Build a bot workshop  async primer - php[tek]
Build a bot workshop async primer - php[tek]Adam Englander
 
Cheffing Etsy - Do too many cooks spoil the soup?
Cheffing Etsy - Do too many cooks spoil the soup?Cheffing Etsy - Do too many cooks spoil the soup?
Cheffing Etsy - Do too many cooks spoil the soup?Jon Cowie
 
APIdays Helsinki 2019 - API Versioning with REST, JSON and Swagger with Thoma...
APIdays Helsinki 2019 - API Versioning with REST, JSON and Swagger with Thoma...APIdays Helsinki 2019 - API Versioning with REST, JSON and Swagger with Thoma...
APIdays Helsinki 2019 - API Versioning with REST, JSON and Swagger with Thoma...apidays
 
RxJS + Redux + React = Amazing
RxJS + Redux + React = AmazingRxJS + Redux + React = Amazing
RxJS + Redux + React = AmazingJay Phelps
 
APIdays Helsinki 2019 - Specification-Driven Development of REST APIs with Al...
APIdays Helsinki 2019 - Specification-Driven Development of REST APIs with Al...APIdays Helsinki 2019 - Specification-Driven Development of REST APIs with Al...
APIdays Helsinki 2019 - Specification-Driven Development of REST APIs with Al...apidays
 
React, Powered by WebAssembly
React, Powered by WebAssemblyReact, Powered by WebAssembly
React, Powered by WebAssemblyJay Phelps
 
APIs - the good, the bad & the ugly
APIs - the good, the bad & the uglyAPIs - the good, the bad & the ugly
APIs - the good, the bad & the uglyNikhil Bendre
 
Akka persistence webinar
Akka persistence webinarAkka persistence webinar
Akka persistence webinarpatriknw
 
SPSSTL - PowerShell - Through the SharePoint Looking Glass
SPSSTL - PowerShell - Through the SharePoint Looking GlassSPSSTL - PowerShell - Through the SharePoint Looking Glass
SPSSTL - PowerShell - Through the SharePoint Looking GlassBrian Caauwe
 
An In-Depth Introduction to the Puppet Enterprise Console - PuppetConf 2014
An In-Depth Introduction to the Puppet Enterprise Console - PuppetConf 2014An In-Depth Introduction to the Puppet Enterprise Console - PuppetConf 2014
An In-Depth Introduction to the Puppet Enterprise Console - PuppetConf 2014Puppet
 
Automating Your Workflow with Gulp.js - php[world] 2016
Automating Your Workflow with Gulp.js - php[world] 2016Automating Your Workflow with Gulp.js - php[world] 2016
Automating Your Workflow with Gulp.js - php[world] 2016Colin O'Dell
 
The unsung glory of internal tools - Gil Zellner - DevOpsDays Tel Aviv 2018
The unsung glory of internal tools - Gil Zellner - DevOpsDays Tel Aviv 2018The unsung glory of internal tools - Gil Zellner - DevOpsDays Tel Aviv 2018
The unsung glory of internal tools - Gil Zellner - DevOpsDays Tel Aviv 2018DevOpsDays Tel Aviv
 

La actualidad más candente (19)

Metrics-Driven Engineering
Metrics-Driven EngineeringMetrics-Driven Engineering
Metrics-Driven Engineering
 
PowerShell: Through the SharePoint Looking Glass
PowerShell: Through the SharePoint Looking GlassPowerShell: Through the SharePoint Looking Glass
PowerShell: Through the SharePoint Looking Glass
 
Build a bot workshop async primer - php[tek]
Build a bot workshop  async primer - php[tek]Build a bot workshop  async primer - php[tek]
Build a bot workshop async primer - php[tek]
 
Cheffing Etsy - Do too many cooks spoil the soup?
Cheffing Etsy - Do too many cooks spoil the soup?Cheffing Etsy - Do too many cooks spoil the soup?
Cheffing Etsy - Do too many cooks spoil the soup?
 
APIdays Helsinki 2019 - API Versioning with REST, JSON and Swagger with Thoma...
APIdays Helsinki 2019 - API Versioning with REST, JSON and Swagger with Thoma...APIdays Helsinki 2019 - API Versioning with REST, JSON and Swagger with Thoma...
APIdays Helsinki 2019 - API Versioning with REST, JSON and Swagger with Thoma...
 
RxJS + Redux + React = Amazing
RxJS + Redux + React = AmazingRxJS + Redux + React = Amazing
RxJS + Redux + React = Amazing
 
APIdays Helsinki 2019 - Specification-Driven Development of REST APIs with Al...
APIdays Helsinki 2019 - Specification-Driven Development of REST APIs with Al...APIdays Helsinki 2019 - Specification-Driven Development of REST APIs with Al...
APIdays Helsinki 2019 - Specification-Driven Development of REST APIs with Al...
 
React, Powered by WebAssembly
React, Powered by WebAssemblyReact, Powered by WebAssembly
React, Powered by WebAssembly
 
APIs - the good, the bad & the ugly
APIs - the good, the bad & the uglyAPIs - the good, the bad & the ugly
APIs - the good, the bad & the ugly
 
Akka persistence webinar
Akka persistence webinarAkka persistence webinar
Akka persistence webinar
 
Reliable acceptance testing
Reliable acceptance testingReliable acceptance testing
Reliable acceptance testing
 
SPSSTL - PowerShell - Through the SharePoint Looking Glass
SPSSTL - PowerShell - Through the SharePoint Looking GlassSPSSTL - PowerShell - Through the SharePoint Looking Glass
SPSSTL - PowerShell - Through the SharePoint Looking Glass
 
Rust, Redis, and Protobuf - Oh My!
Rust, Redis, and Protobuf - Oh My!Rust, Redis, and Protobuf - Oh My!
Rust, Redis, and Protobuf - Oh My!
 
An In-Depth Introduction to the Puppet Enterprise Console - PuppetConf 2014
An In-Depth Introduction to the Puppet Enterprise Console - PuppetConf 2014An In-Depth Introduction to the Puppet Enterprise Console - PuppetConf 2014
An In-Depth Introduction to the Puppet Enterprise Console - PuppetConf 2014
 
Automating Your Workflow with Gulp.js - php[world] 2016
Automating Your Workflow with Gulp.js - php[world] 2016Automating Your Workflow with Gulp.js - php[world] 2016
Automating Your Workflow with Gulp.js - php[world] 2016
 
Web Operations101
Web Operations101Web Operations101
Web Operations101
 
The unsung glory of internal tools - Gil Zellner - DevOpsDays Tel Aviv 2018
The unsung glory of internal tools - Gil Zellner - DevOpsDays Tel Aviv 2018The unsung glory of internal tools - Gil Zellner - DevOpsDays Tel Aviv 2018
The unsung glory of internal tools - Gil Zellner - DevOpsDays Tel Aviv 2018
 
Code smells in PHP
Code smells in PHPCode smells in PHP
Code smells in PHP
 
KISS Automation.py
KISS Automation.pyKISS Automation.py
KISS Automation.py
 

Similar a DC |> Elixir Meetup - Going off the Rails into Elixir - Dan Ivovich

Free The Enterprise With Ruby & Master Your Own Domain
Free The Enterprise With Ruby & Master Your Own DomainFree The Enterprise With Ruby & Master Your Own Domain
Free The Enterprise With Ruby & Master Your Own DomainKen Collins
 
Cheap frontend tricks
Cheap frontend tricksCheap frontend tricks
Cheap frontend tricksambiescent
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasminePaulo Ragonha
 
Akka persistence == event sourcing in 30 minutes
Akka persistence == event sourcing in 30 minutesAkka persistence == event sourcing in 30 minutes
Akka persistence == event sourcing in 30 minutesKonrad Malawski
 
Cross Domain Web
Mashups with JQuery and Google App Engine
Cross Domain Web
Mashups with JQuery and Google App EngineCross Domain Web
Mashups with JQuery and Google App Engine
Cross Domain Web
Mashups with JQuery and Google App EngineAndy McKay
 
Express Presentation
Express PresentationExpress Presentation
Express Presentationaaronheckmann
 
SEMAC 2011 - Apresentando Ruby e Ruby on Rails
SEMAC 2011 - Apresentando Ruby e Ruby on RailsSEMAC 2011 - Apresentando Ruby e Ruby on Rails
SEMAC 2011 - Apresentando Ruby e Ruby on RailsFabio Akita
 
Intro to Asynchronous Javascript
Intro to Asynchronous JavascriptIntro to Asynchronous Javascript
Intro to Asynchronous JavascriptGarrett Welson
 
JVMLS 2016. Coroutines in Kotlin
JVMLS 2016. Coroutines in KotlinJVMLS 2016. Coroutines in Kotlin
JVMLS 2016. Coroutines in KotlinAndrey Breslav
 
RubyMotion
RubyMotionRubyMotion
RubyMotionMark
 
Build web application by express
Build web application by expressBuild web application by express
Build web application by expressShawn Meng
 
Ultimate Node.js countdown: the coolest Application Express examples
Ultimate Node.js countdown: the coolest Application Express examplesUltimate Node.js countdown: the coolest Application Express examples
Ultimate Node.js countdown: the coolest Application Express examplesAlan Arentsen
 
From Elixir to Akka (and back) - ElixirConf Mx 2017
From Elixir to Akka (and back) - ElixirConf Mx 2017From Elixir to Akka (and back) - ElixirConf Mx 2017
From Elixir to Akka (and back) - ElixirConf Mx 2017Agustin Ramos
 

Similar a DC |> Elixir Meetup - Going off the Rails into Elixir - Dan Ivovich (20)

ES6: The Awesome Parts
ES6: The Awesome PartsES6: The Awesome Parts
ES6: The Awesome Parts
 
Web Scraping
Web ScrapingWeb Scraping
Web Scraping
 
Free The Enterprise With Ruby & Master Your Own Domain
Free The Enterprise With Ruby & Master Your Own DomainFree The Enterprise With Ruby & Master Your Own Domain
Free The Enterprise With Ruby & Master Your Own Domain
 
Cheap frontend tricks
Cheap frontend tricksCheap frontend tricks
Cheap frontend tricks
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
 
Akka persistence == event sourcing in 30 minutes
Akka persistence == event sourcing in 30 minutesAkka persistence == event sourcing in 30 minutes
Akka persistence == event sourcing in 30 minutes
 
Having Fun with Play
Having Fun with PlayHaving Fun with Play
Having Fun with Play
 
Cross Domain Web
Mashups with JQuery and Google App Engine
Cross Domain Web
Mashups with JQuery and Google App EngineCross Domain Web
Mashups with JQuery and Google App Engine
Cross Domain Web
Mashups with JQuery and Google App Engine
 
ECMAScript 6
ECMAScript 6ECMAScript 6
ECMAScript 6
 
Express Presentation
Express PresentationExpress Presentation
Express Presentation
 
SEMAC 2011 - Apresentando Ruby e Ruby on Rails
SEMAC 2011 - Apresentando Ruby e Ruby on RailsSEMAC 2011 - Apresentando Ruby e Ruby on Rails
SEMAC 2011 - Apresentando Ruby e Ruby on Rails
 
Intro to Asynchronous Javascript
Intro to Asynchronous JavascriptIntro to Asynchronous Javascript
Intro to Asynchronous Javascript
 
Revoke-Obfuscation
Revoke-ObfuscationRevoke-Obfuscation
Revoke-Obfuscation
 
JVMLS 2016. Coroutines in Kotlin
JVMLS 2016. Coroutines in KotlinJVMLS 2016. Coroutines in Kotlin
JVMLS 2016. Coroutines in Kotlin
 
RubyMotion
RubyMotionRubyMotion
RubyMotion
 
Build web application by express
Build web application by expressBuild web application by express
Build web application by express
 
Ultimate Node.js countdown: the coolest Application Express examples
Ultimate Node.js countdown: the coolest Application Express examplesUltimate Node.js countdown: the coolest Application Express examples
Ultimate Node.js countdown: the coolest Application Express examples
 
From Elixir to Akka (and back) - ElixirConf Mx 2017
From Elixir to Akka (and back) - ElixirConf Mx 2017From Elixir to Akka (and back) - ElixirConf Mx 2017
From Elixir to Akka (and back) - ElixirConf Mx 2017
 
Working With Canvas
Working With CanvasWorking With Canvas
Working With Canvas
 
Sprockets
SprocketsSprockets
Sprockets
 

Más de SmartLogic

Writing Game Servers with Elixir
Writing Game Servers with ElixirWriting Game Servers with Elixir
Writing Game Servers with ElixirSmartLogic
 
All Aboard The Stateful Train
All Aboard The Stateful TrainAll Aboard The Stateful Train
All Aboard The Stateful TrainSmartLogic
 
Monitoring Your Elixir Application with Prometheus
Monitoring Your Elixir Application with PrometheusMonitoring Your Elixir Application with Prometheus
Monitoring Your Elixir Application with PrometheusSmartLogic
 
Going Multi-Node
Going Multi-NodeGoing Multi-Node
Going Multi-NodeSmartLogic
 
Kubernetes and docker
Kubernetes and dockerKubernetes and docker
Kubernetes and dockerSmartLogic
 
Serializing Value Objects-Ara Hacopian
Serializing Value Objects-Ara HacopianSerializing Value Objects-Ara Hacopian
Serializing Value Objects-Ara HacopianSmartLogic
 
Guide to food foraging by SmartLogic's Kei Ellerbrock
Guide to food foraging by SmartLogic's Kei EllerbrockGuide to food foraging by SmartLogic's Kei Ellerbrock
Guide to food foraging by SmartLogic's Kei EllerbrockSmartLogic
 
Introduction to Type Script by Sam Goldman, SmartLogic
Introduction to Type Script by Sam Goldman, SmartLogicIntroduction to Type Script by Sam Goldman, SmartLogic
Introduction to Type Script by Sam Goldman, SmartLogicSmartLogic
 
How SmartLogic Uses Chef-Dan Ivovich
How SmartLogic Uses Chef-Dan IvovichHow SmartLogic Uses Chef-Dan Ivovich
How SmartLogic Uses Chef-Dan IvovichSmartLogic
 
A Few Interesting Things in Apple's Swift Programming Language
A Few Interesting Things in Apple's Swift Programming LanguageA Few Interesting Things in Apple's Swift Programming Language
A Few Interesting Things in Apple's Swift Programming LanguageSmartLogic
 
Effective ActiveRecord
Effective ActiveRecordEffective ActiveRecord
Effective ActiveRecordSmartLogic
 
An Introduction to Reactive Cocoa
An Introduction to Reactive CocoaAn Introduction to Reactive Cocoa
An Introduction to Reactive CocoaSmartLogic
 
iOS Development Methodology
iOS Development MethodologyiOS Development Methodology
iOS Development MethodologySmartLogic
 
CSS Preprocessors to the Rescue!
CSS Preprocessors to the Rescue!CSS Preprocessors to the Rescue!
CSS Preprocessors to the Rescue!SmartLogic
 
Deploying Rails Apps with Chef and Capistrano
 Deploying Rails Apps with Chef and Capistrano Deploying Rails Apps with Chef and Capistrano
Deploying Rails Apps with Chef and CapistranoSmartLogic
 
From Slacker to Hacker, Practical Tips for Learning to Code
From Slacker to Hacker, Practical Tips for Learning to CodeFrom Slacker to Hacker, Practical Tips for Learning to Code
From Slacker to Hacker, Practical Tips for Learning to CodeSmartLogic
 
The Language of Abstraction in Software Development
The Language of Abstraction in Software DevelopmentThe Language of Abstraction in Software Development
The Language of Abstraction in Software DevelopmentSmartLogic
 
Android Testing: An Overview
Android Testing: An OverviewAndroid Testing: An Overview
Android Testing: An OverviewSmartLogic
 
Intro to DTCoreText: Moving Past UIWebView | iOS Development
Intro to DTCoreText: Moving Past UIWebView | iOS DevelopmentIntro to DTCoreText: Moving Past UIWebView | iOS Development
Intro to DTCoreText: Moving Past UIWebView | iOS DevelopmentSmartLogic
 
Logstash: Get to know your logs
Logstash: Get to know your logsLogstash: Get to know your logs
Logstash: Get to know your logsSmartLogic
 

Más de SmartLogic (20)

Writing Game Servers with Elixir
Writing Game Servers with ElixirWriting Game Servers with Elixir
Writing Game Servers with Elixir
 
All Aboard The Stateful Train
All Aboard The Stateful TrainAll Aboard The Stateful Train
All Aboard The Stateful Train
 
Monitoring Your Elixir Application with Prometheus
Monitoring Your Elixir Application with PrometheusMonitoring Your Elixir Application with Prometheus
Monitoring Your Elixir Application with Prometheus
 
Going Multi-Node
Going Multi-NodeGoing Multi-Node
Going Multi-Node
 
Kubernetes and docker
Kubernetes and dockerKubernetes and docker
Kubernetes and docker
 
Serializing Value Objects-Ara Hacopian
Serializing Value Objects-Ara HacopianSerializing Value Objects-Ara Hacopian
Serializing Value Objects-Ara Hacopian
 
Guide to food foraging by SmartLogic's Kei Ellerbrock
Guide to food foraging by SmartLogic's Kei EllerbrockGuide to food foraging by SmartLogic's Kei Ellerbrock
Guide to food foraging by SmartLogic's Kei Ellerbrock
 
Introduction to Type Script by Sam Goldman, SmartLogic
Introduction to Type Script by Sam Goldman, SmartLogicIntroduction to Type Script by Sam Goldman, SmartLogic
Introduction to Type Script by Sam Goldman, SmartLogic
 
How SmartLogic Uses Chef-Dan Ivovich
How SmartLogic Uses Chef-Dan IvovichHow SmartLogic Uses Chef-Dan Ivovich
How SmartLogic Uses Chef-Dan Ivovich
 
A Few Interesting Things in Apple's Swift Programming Language
A Few Interesting Things in Apple's Swift Programming LanguageA Few Interesting Things in Apple's Swift Programming Language
A Few Interesting Things in Apple's Swift Programming Language
 
Effective ActiveRecord
Effective ActiveRecordEffective ActiveRecord
Effective ActiveRecord
 
An Introduction to Reactive Cocoa
An Introduction to Reactive CocoaAn Introduction to Reactive Cocoa
An Introduction to Reactive Cocoa
 
iOS Development Methodology
iOS Development MethodologyiOS Development Methodology
iOS Development Methodology
 
CSS Preprocessors to the Rescue!
CSS Preprocessors to the Rescue!CSS Preprocessors to the Rescue!
CSS Preprocessors to the Rescue!
 
Deploying Rails Apps with Chef and Capistrano
 Deploying Rails Apps with Chef and Capistrano Deploying Rails Apps with Chef and Capistrano
Deploying Rails Apps with Chef and Capistrano
 
From Slacker to Hacker, Practical Tips for Learning to Code
From Slacker to Hacker, Practical Tips for Learning to CodeFrom Slacker to Hacker, Practical Tips for Learning to Code
From Slacker to Hacker, Practical Tips for Learning to Code
 
The Language of Abstraction in Software Development
The Language of Abstraction in Software DevelopmentThe Language of Abstraction in Software Development
The Language of Abstraction in Software Development
 
Android Testing: An Overview
Android Testing: An OverviewAndroid Testing: An Overview
Android Testing: An Overview
 
Intro to DTCoreText: Moving Past UIWebView | iOS Development
Intro to DTCoreText: Moving Past UIWebView | iOS DevelopmentIntro to DTCoreText: Moving Past UIWebView | iOS Development
Intro to DTCoreText: Moving Past UIWebView | iOS Development
 
Logstash: Get to know your logs
Logstash: Get to know your logsLogstash: Get to know your logs
Logstash: Get to know your logs
 

Último

Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsArshad QA
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about usDynamic Netsoft
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideChristina Lin
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfCionsystems
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendArshad QA
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...kellynguyen01
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfkalichargn70th171
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackVICTOR MAESTRE RAMIREZ
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 

Último (20)

Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about us
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
 
Exploring iOS App Development: Simplifying the Process
Exploring iOS App Development: Simplifying the ProcessExploring iOS App Development: Simplifying the Process
Exploring iOS App Development: Simplifying the Process
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdf
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and Backend
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStack
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 

DC |> Elixir Meetup - Going off the Rails into Elixir - Dan Ivovich

  • 1. Going off the Rails into Elixir Dan Ivovich DC |> Elixir March 19, 2019
  • 2. Why the dev team wants to ❗ AND Why they should
  • 4. Who Am I? • Software Developer
  • 5. Who Am I? • Software Developer • Director of Development at SmartLogic
  • 6. Who Am I? • Software Developer • Director of Development at SmartLogic • Rails developer for 12 years
  • 7. Who Am I? • Software Developer • Director of Development at SmartLogic • Rails developer for 12 years • Elixir convert since Summer 2016
  • 8. Who Am I? • Software Developer • Director of Development at SmartLogic • Rails developer for 12 years • Elixir convert since Summer 2016 • Organizer of the Baltimore Elixir and Erlang Meetup
  • 16. Pattern Matching > [1, b, 4] = [1, 5, 4] [1, 5, 4] > b 5 > [head | tail] = [1, 2, 3] [1, 2, 3] > head 1 > tail [2, 3]
  • 17. Pattern Matching > [1, b, 4] = [1, 5, 4] [1, 5, 4] > b 5 > [head | tail] = [1, 2, 3] [1, 2, 3] > head 1 > tail [2, 3]
  • 18. Pattern Matching > [1, b, 4] = [1, 5, 4] [1, 5, 4] > b 5 > [head | tail] = [1, 2, 3] [1, 2, 3] > head 1 > tail [2, 3]
  • 19. Pattern Matching > [1, b, 4] = [1, 5, 4] [1, 5, 4] > b 5 > [head | tail] = [1, 2, 3] [1, 2, 3] > head 1 > tail [2, 3]
  • 20. Pattern Matching > [1, b, 4] = [1, 5, 4] [1, 5, 4] > b 5 > [head | tail] = [1, 2, 3] [1, 2, 3] > head 1 > tail [2, 3]
  • 21. Pattern Matching def execute({:ok, value}) do IO.puts "Execute: #{value}" end def execute({:error, reason}) do IO.puts "Error: #{reason}" end > execute({:ok, "Well Done!"}) Execute: Well Done! > execute({:error, "Fail!"}) Error: Fail!
  • 22. Pattern Matching def execute({:ok, value}) do IO.puts "Execute: #{value}" end def execute({:error, reason}) do IO.puts "Error: #{reason}" end > execute({:ok, "Well Done!"}) Execute: Well Done! > execute({:error, "Fail!"}) Error: Fail!
  • 23. Pattern Matching def execute({:ok, value}) do IO.puts "Execute: #{value}" end def execute({:error, reason}) do IO.puts "Error: #{reason}" end > execute({:ok, "Well Done!"}) Execute: Well Done! > execute({:error, "Fail!"}) Error: Fail!
  • 24. Pattern Matching def execute({:ok, value}) do IO.puts "Execute: #{value}" end def execute({:error, reason}) do IO.puts "Error: #{reason}" end > execute({:ok, "Well Done!"}) Execute: Well Done! > execute({:error, "Fail!"}) Error: Fail!
  • 25. Pattern Matching def execute({:ok, value}) do IO.puts "Execute: #{value}" end def execute({:error, reason}) do IO.puts "Error: #{reason}" end > execute({:ok, "Well Done!"}) Execute: Well Done! > execute({:error, "Fail!"}) Error: Fail!
  • 26. Pattern Matching case HTTP.get(url) do {:ok, %HTTP.Resp{status: 200, body: body}} -> IO.puts body {:ok, %HTTP.Resp{status: 404}} -> IO.puts "Not found!" {:ok, %HTTP.Resp{status: status}} -> IO.puts "HTTP Status: #{status}" {:error, %HTTP.Error{reason: reason}} -> IO.inspect reason _ -> IO.puts "Some other error" end
  • 27. Pattern Matching case HTTP.get(url) do {:ok, %HTTP.Resp{status: 200, body: body}} -> IO.puts body {:ok, %HTTP.Resp{status: 404}} -> IO.puts "Not found!" {:ok, %HTTP.Resp{status: status}} -> IO.puts "HTTP Status: #{status}" {:error, %HTTP.Error{reason: reason}} -> IO.inspect reason _ -> IO.puts "Some other error" end
  • 28. Pattern Matching case HTTP.get(url) do {:ok, %HTTP.Resp{status: 200, body: body}} -> IO.puts body {:ok, %HTTP.Resp{status: 404}} -> IO.puts "Not found!" {:ok, %HTTP.Resp{status: status}} -> IO.puts "HTTP Status: #{status}" {:error, %HTTP.Error{reason: reason}} -> IO.inspect reason _ -> IO.puts "Some other error" end
  • 29. Pattern Matching case HTTP.get(url) do {:ok, %HTTP.Resp{status: 200, body: body}} -> IO.puts body {:ok, %HTTP.Resp{status: 404}} -> IO.puts "Not found!" {:ok, %HTTP.Resp{status: status}} -> IO.puts "HTTP Status: #{status}" {:error, %HTTP.Error{reason: reason}} -> IO.inspect reason _ -> IO.puts "Some other error" end
  • 30. Pattern Matching case HTTP.get(url) do {:ok, %HTTP.Resp{status: 200, body: body}} -> IO.puts body {:ok, %HTTP.Resp{status: 404}} -> IO.puts "Not found!" {:ok, %HTTP.Resp{status: status}} -> IO.puts "HTTP Status: #{status}" {:error, %HTTP.Error{reason: reason}} -> IO.inspect reason _ -> IO.puts "Some other error" end
  • 31. Pattern Matching case HTTP.get(url) do {:ok, %HTTP.Resp{status: 200, body: body}} -> IO.puts body {:ok, %HTTP.Resp{status: 404}} -> IO.puts "Not found!" {:ok, %HTTP.Resp{status: status}} -> IO.puts "HTTP Status: #{status}" {:error, %HTTP.Error{reason: reason}} -> IO.inspect reason _ -> IO.puts "Some other error" end
  • 32. Pattern Matching case HTTP.get(url) do {:ok, %HTTP.Resp{status: 200, body: body}} -> IO.puts body {:ok, %HTTP.Resp{status: 404}} -> IO.puts "Not found!" {:ok, %HTTP.Resp{status: status}} -> IO.puts "HTTP Status: #{status}" {:error, %HTTP.Error{reason: reason}} -> IO.inspect reason _ -> IO.puts "Some other error" end
  • 33. Pipe Operator three = add(1, 2) six = add(three, 3) ten = add(six, 4) ten = add(add(add(1, 2), 3), 4) ten = 1 |> add(2) |> add(3) |> add(4)
  • 34. Pipe Operator three = add(1, 2) six = add(three, 3) ten = add(six, 4) ten = add(add(add(1, 2), 3), 4) ten = 1 |> add(2) |> add(3) |> add(4)
  • 35. Pipe Operator three = add(1, 2) six = add(three, 3) ten = add(six, 4) ten = add(add(add(1, 2), 3), 4) ten = 1 |> add(2) |> add(3) |> add(4)
  • 36. Pipe Operator three = add(1, 2) six = add(three, 3) ten = add(six, 4) ten = add(add(add(1, 2), 3), 4) ten = 1 |> add(2) |> add(3) |> add(4)
  • 38. Ecto Changesets • Ever try and run just some ActiveRecord validations depending on the current user?
  • 39. Ecto Changesets • Ever try and run just some ActiveRecord validations depending on the current user? • Ever have a set of validations dependent on data state?
  • 40. Ecto Changesets def edit_self_changeset(user, params %{}) do user |> cast(params, [:name, :age]) |> validate_required([:name]) |> validate_inclusion(:age, 18..100) end def admin_edit_changeset(user, params %{}) do user |> cast(params, [:name, :email, :age]) |> validate_required([:name, :email]) |> validate_format(:email, ~r/@/) |> validate_inclusion(:age, 18..100) |> unique_constraint(:email) end
  • 41. Ecto Changesets def edit_self_changeset(user, params %{}) do user |> cast(params, [:name, :age]) |> validate_required([:name]) |> validate_inclusion(:age, 18..100) end def admin_edit_changeset(user, params %{}) do user |> cast(params, [:name, :email, :age]) |> validate_required([:name, :email]) |> validate_format(:email, ~r/@/) |> validate_inclusion(:age, 18..100) |> unique_constraint(:email) end
  • 42. Ecto Changesets def edit_self_changeset(user, params %{}) do user |> cast(params, [:name, :age]) |> validate_required([:name]) |> validate_inclusion(:age, 18..100) end def admin_edit_changeset(user, params %{}) do user |> cast(params, [:name, :email, :age]) |> validate_required([:name, :email]) |> validate_format(:email, ~r/@/) |> validate_inclusion(:age, 18..100) |> unique_constraint(:email) end
  • 43. Ecto Changesets def edit_self_changeset(user, params %{}) do user |> cast(params, [:name, :age]) |> validate_required([:name]) |> validate_inclusion(:age, 18..100) end def admin_edit_changeset(user, params %{}) do user |> cast(params, [:name, :email, :age]) |> validate_required([:name, :email]) |> validate_format(:email, ~r/@/) |> validate_inclusion(:age, 18..100) |> unique_constraint(:email) end
  • 44. Phoenix Param Matching def show(conn, %{"user_params" => user_params} = params) do end def show(conn, %{"admin_params" => admin_params} = params) do end
  • 46. Phoenix View Code • Not a pile of global namespace helpers
  • 47. Phoenix View Code • Not a pile of global namespace helpers • Good encapsulation of presentation logic
  • 48. Gen Server No need for external workers GenServer.cast(MyWorker, {:process, this_thing}) def handle_cast({:process, this_thing}, state) do # do work {:noreply, state} end
  • 49. Gen Server No need for external workers GenServer.cast(MyWorker, {:process, this_thing}) def handle_cast({:process, this_thing}, state) do # do work {:noreply, state} end
  • 50. Gen Server No need for external workers GenServer.cast(MyWorker, {:process, this_thing}) def handle_cast({:process, this_thing}, state) do # do work {:noreply, state} end
  • 52. All that cool tech didn't convince you!?! https://unsplash.com/photos/FO7JIlwjOtU
  • 54. What does Elixir bring? • Ruby-inspired syntax
  • 55. What does Elixir bring? • Ruby-inspired syntax • Meta programming
  • 56. What does Elixir bring? • Ruby-inspired syntax • Meta programming • Polymorphism via protocols
  • 57. What does Elixir bring? • Ruby-inspired syntax • Meta programming • Polymorphism via protocols • Great tooling
  • 58. What does Elixir bring? • Ruby-inspired syntax • Meta programming • Polymorphism via protocols • Great tooling • Better code organization facilities than Erlang
  • 59. What does Elixir bring? • Ruby-inspired syntax • Meta programming • Polymorphism via protocols • Great tooling • Better code organization facilities than Erlang • Erlang functions can be called from Elixir
  • 61. What does Elixir bring? • Lightweight and isolated concurrency
  • 62. What does Elixir bring? • Lightweight and isolated concurrency • Shared nothing concurrent programming
  • 63. What does Elixir bring? • Lightweight and isolated concurrency • Shared nothing concurrent programming • Lazy and async collections
  • 64. What does Elixir bring? • Lightweight and isolated concurrency • Shared nothing concurrent programming • Lazy and async collections • Pattern matching
  • 65. What does Elixir bring? • Lightweight and isolated concurrency • Shared nothing concurrent programming • Lazy and async collections • Pattern matching • Unicode support and UTF-8 strings
  • 67. Scaleable and Fault-tolerant • Isolation means each process is garbage collected independently
  • 68. Scaleable and Fault-tolerant • Isolation means each process is garbage collected independently • This means less system wide pauses.
  • 69. Scaleable and Fault-tolerant • Isolation means each process is garbage collected independently • This means less system wide pauses. • Things go wrong. Especially with network or disk activity.
  • 70. Scaleable and Fault-tolerant • Isolation means each process is garbage collected independently • This means less system wide pauses. • Things go wrong. Especially with network or disk activity. • Supervisor processes are instructed in how to maintain your application
  • 72. Stable and Extensible • Only 1 planned language deprecation for 2.0
  • 73. Stable and Extensible • Only 1 planned language deprecation for 2.0 • No planned timeline for 2.0
  • 74. Stable and Extensible • Only 1 planned language deprecation for 2.0 • No planned timeline for 2.0 • The core team believes all the right fundamentals are in place
  • 77. Speed (Throughput) • Sure, it isn't C • For a Rails shop, that isn't the benchmark
  • 78. Speed (Throughput) • Sure, it isn't C • For a Rails shop, that isn't the benchmark • Multi-thread by default, no global lock
  • 79. Speed (Throughput) • Sure, it isn't C • For a Rails shop, that isn't the benchmark • Multi-thread by default, no global lock • Fast garbage collection
  • 80. Speed (Throughput) • Sure, it isn't C • For a Rails shop, that isn't the benchmark • Multi-thread by default, no global lock • Fast garbage collection • All means high throughput web apps
  • 81. Used by Big Names
  • 82. Used by Big Names • Discord
  • 83. Used by Big Names • Discord • Pagerduty
  • 84. Used by Big Names • Discord • Pagerduty • Bleacher Report
  • 85. Used by Big Names • Discord • Pagerduty • Bleacher Report • Square Enix
  • 86. Used by Big Names • Discord • Pagerduty • Bleacher Report • Square Enix • Motorola
  • 87. Used by Big Names • Discord • Pagerduty • Bleacher Report • Square Enix • Motorola • https://elixir-companies.com/browse
  • 88. Costs All of the items we've discussed have a real impact on:
  • 89. Costs All of the items we've discussed have a real impact on: • Development pace, build from pure functions
  • 90. Costs All of the items we've discussed have a real impact on: • Development pace, build from pure functions • Developer focus, cognitive load of functions over objects
  • 91. Costs All of the items we've discussed have a real impact on: • Development pace, build from pure functions • Developer focus, cognitive load of functions over objects • Ease of implementing new features
  • 92. Costs All of the items we've discussed have a real impact on: • Development pace, build from pure functions • Developer focus, cognitive load of functions over objects • Ease of implementing new features • Test quality and speed
  • 93. Costs All of the items we've discussed have a real impact on: • Development pace, build from pure functions • Developer focus, cognitive load of functions over objects • Ease of implementing new features • Test quality and speed • Bug rates
  • 94. Costs All of the items we've discussed have a real impact on: • Development pace, build from pure functions • Developer focus, cognitive load of functions over objects • Ease of implementing new features • Test quality and speed • Bug rates • Maintainability
  • 96. Staffing • Innovative tech attracts innovative developers
  • 97. Staffing • Innovative tech attracts innovative developers • Syntax is approachable
  • 98. Staffing • Innovative tech attracts innovative developers • Syntax is approachable • Resources are plentiful
  • 99. Staffing • Innovative tech attracts innovative developers • Syntax is approachable • Resources are plentiful • Training is easy, and fun
  • 101. Paradigm Shift? Functional Programming • Might take some adjustment
  • 102. Paradigm Shift? Functional Programming • Might take some adjustment • Fits your use case more than you expect, it is about the data
  • 103. Paradigm Shift? Functional Programming • Might take some adjustment • Fits your use case more than you expect, it is about the data • Makes writing great tests easy
  • 104. Paradigm Shift? Functional Programming • Might take some adjustment • Fits your use case more than you expect, it is about the data • Makes writing great tests easy • Makes writing fast tests easy
  • 106. Mix and IEx Mix - A great build tool for dependency management and other tasks IEx - An interactive shell
  • 107. Docs, Tests, and DocTests Documentation - a first class citizen in the Elixir ecosystem Tests - Testing libraries built into the language with ExUnit DocTests - A hybrid of testing and documentation
  • 109. Getting Started See my other talks https://www.danivovich.com/other
  • 110. Resources - Books Programming Elixir https://pragprog.com/book/elixir16/programming-elixir-1-6 Programming Phoenix https://pragprog.com/book/phoenix14/programming-phoenix-1-4 Metaprogramming Elixir https://pragprog.com/book/cmelixir/metaprogramming-elixir Functional Web Development with Elixir, OTP, and Phoenix https://pragprog.com/book/lhelph/functional-web-development-with- elixir-otp-and-phoenix
  • 111. Resources - Newsletters Elixir Radar http://plataformatec.com.br/elixir-radar Elixir Weekly https://elixirweekly.net/ Elixir Digest https://elixirdigest.net
  • 112. Resources - Conferences ElixirConf EU (April 8-10, Prague) http://www.elixirconf.eu/ EMPEX NYC (May 18, NYC) http://empex.co/nyc ElixirConf (August, Colorado) https://elixirconf.com/
  • 113. Resources - Podcasts Smart Software with SmartLogic (First Season on Elixir in Production) https://podcast.smartlogic.io/ Elixir Outlaws Podcast https://elixiroutlaws.com/ ElixirTalk Podcast http://elixirtalk.com/ Elixir Mix Podcast https://devchat.tv/elixir-mix
  • 115. Resources - Others Elixir Status Twitter https://twitter.com/elixirstatus Elixir Slack http://elixir-slackin.herokuapp.com/ Elixir Forum https://elixirforum.com
  • 116.
  • 117. We hope you will too