SlideShare a Scribd company logo
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? ❔

More Related Content

What's hot

Metrics-Driven Engineering
Metrics-Driven EngineeringMetrics-Driven Engineering
Metrics-Driven Engineering
Mike Brittain
 
PowerShell: Through the SharePoint Looking Glass
PowerShell: Through the SharePoint Looking GlassPowerShell: Through the SharePoint Looking Glass
PowerShell: Through the SharePoint Looking Glass
Brian 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 = Amazing
Jay 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 WebAssembly
Jay 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 ugly
Nikhil 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 Glass
Brian Caauwe
 
Rust, Redis, and Protobuf - Oh My!
Rust, Redis, and Protobuf - Oh My!Rust, Redis, and Protobuf - Oh My!
Rust, Redis, and Protobuf - Oh My!
Nell Shamrell-Harrington
 
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
Puppet
 
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
Colin O'Dell
 
Web Operations101
Web Operations101Web Operations101
Web Operations101
Nell Shamrell-Harrington
 
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
DevOpsDays Tel Aviv
 
KISS Automation.py
KISS Automation.pyKISS Automation.py
KISS Automation.py
Iakiv Kramarenko
 

What's hot (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 to DC |> Elixir Meetup - Going off the Rails into Elixir - Dan Ivovich

ES6: The Awesome Parts
ES6: The Awesome PartsES6: The Awesome Parts
ES6: The Awesome Parts
Domenic Denicola
 
Web Scraping
Web ScrapingWeb Scraping
Web Scraping
jameswilkerson
 
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
Ken Collins
 
Cheap frontend tricks
Cheap frontend tricksCheap frontend tricks
Cheap frontend tricks
ambiescent
 
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 minutes
Konrad 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 Engine
Andy McKay
 
ECMAScript 6
ECMAScript 6ECMAScript 6
ECMAScript 6
偉格 高
 
Express Presentation
Express PresentationExpress Presentation
Express Presentation
aaronheckmann
 
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
Fabio Akita
 
Intro to Asynchronous Javascript
Intro to Asynchronous JavascriptIntro to Asynchronous Javascript
Intro to Asynchronous Javascript
Garrett Welson
 
Revoke-Obfuscation
Revoke-ObfuscationRevoke-Obfuscation
Revoke-Obfuscation
Daniel Bohannon
 
JVMLS 2016. Coroutines in Kotlin
JVMLS 2016. Coroutines in KotlinJVMLS 2016. Coroutines in Kotlin
JVMLS 2016. Coroutines in Kotlin
Andrey Breslav
 
RubyMotion
RubyMotionRubyMotion
RubyMotion
Mark
 
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 examples
Alan 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 2017
Agustin Ramos
 
Working With Canvas
Working With CanvasWorking With Canvas
Working With Canvas
Diogo Antunes
 
Sprockets
SprocketsSprockets

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

More from SmartLogic

Writing Game Servers with Elixir
Writing Game Servers with ElixirWriting Game Servers with Elixir
Writing Game Servers with Elixir
SmartLogic
 
All Aboard The Stateful Train
All Aboard The Stateful TrainAll Aboard The Stateful Train
All Aboard The Stateful Train
SmartLogic
 
Monitoring Your Elixir Application with Prometheus
Monitoring Your Elixir Application with PrometheusMonitoring Your Elixir Application with Prometheus
Monitoring Your Elixir Application with Prometheus
SmartLogic
 
Going Multi-Node
Going Multi-NodeGoing Multi-Node
Going Multi-Node
SmartLogic
 
Kubernetes and docker
Kubernetes and dockerKubernetes and docker
Kubernetes and docker
SmartLogic
 
Serializing Value Objects-Ara Hacopian
Serializing Value Objects-Ara HacopianSerializing Value Objects-Ara Hacopian
Serializing Value Objects-Ara Hacopian
SmartLogic
 
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
SmartLogic
 
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
SmartLogic
 
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 Language
SmartLogic
 
Effective ActiveRecord
Effective ActiveRecordEffective ActiveRecord
Effective ActiveRecord
SmartLogic
 
An Introduction to Reactive Cocoa
An Introduction to Reactive CocoaAn Introduction to Reactive Cocoa
An Introduction to Reactive Cocoa
SmartLogic
 
iOS Development Methodology
iOS Development MethodologyiOS Development Methodology
iOS Development Methodology
SmartLogic
 
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 Capistrano
SmartLogic
 
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
SmartLogic
 
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
SmartLogic
 
Android Testing: An Overview
Android Testing: An OverviewAndroid Testing: An Overview
Android Testing: An Overview
SmartLogic
 
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
SmartLogic
 
Logstash: Get to know your logs
Logstash: Get to know your logsLogstash: Get to know your logs
Logstash: Get to know your logs
SmartLogic
 

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

Recently uploaded

De mooiste recreatieve routes ontdekken met RouteYou en FME
De mooiste recreatieve routes ontdekken met RouteYou en FMEDe mooiste recreatieve routes ontdekken met RouteYou en FME
De mooiste recreatieve routes ontdekken met RouteYou en FME
Jelle | Nordend
 
Multiple Your Crypto Portfolio with the Innovative Features of Advanced Crypt...
Multiple Your Crypto Portfolio with the Innovative Features of Advanced Crypt...Multiple Your Crypto Portfolio with the Innovative Features of Advanced Crypt...
Multiple Your Crypto Portfolio with the Innovative Features of Advanced Crypt...
Hivelance Technology
 
Strategies for Successful Data Migration Tools.pptx
Strategies for Successful Data Migration Tools.pptxStrategies for Successful Data Migration Tools.pptx
Strategies for Successful Data Migration Tools.pptx
varshanayak241
 
Understanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSageUnderstanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSage
Globus
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
Matt Welsh
 
How Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptxHow Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptx
wottaspaceseo
 
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Globus
 
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
Juraj Vysvader
 
Into the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdfInto the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdf
Ortus Solutions, Corp
 
Software Testing Exam imp Ques Notes.pdf
Software Testing Exam imp Ques Notes.pdfSoftware Testing Exam imp Ques Notes.pdf
Software Testing Exam imp Ques Notes.pdf
MayankTawar1
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
abdulrafaychaudhry
 
Quarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden ExtensionsQuarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden Extensions
Max Andersen
 
top nidhi software solution freedownload
top nidhi software solution freedownloadtop nidhi software solution freedownload
top nidhi software solution freedownload
vrstrong314
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
Globus
 
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Globus
 
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume MontevideoVitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke
 
Designing for Privacy in Amazon Web Services
Designing for Privacy in Amazon Web ServicesDesigning for Privacy in Amazon Web Services
Designing for Privacy in Amazon Web Services
KrzysztofKkol1
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
takuyayamamoto1800
 
2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx
Georgi Kodinov
 

Recently uploaded (20)

De mooiste recreatieve routes ontdekken met RouteYou en FME
De mooiste recreatieve routes ontdekken met RouteYou en FMEDe mooiste recreatieve routes ontdekken met RouteYou en FME
De mooiste recreatieve routes ontdekken met RouteYou en FME
 
Multiple Your Crypto Portfolio with the Innovative Features of Advanced Crypt...
Multiple Your Crypto Portfolio with the Innovative Features of Advanced Crypt...Multiple Your Crypto Portfolio with the Innovative Features of Advanced Crypt...
Multiple Your Crypto Portfolio with the Innovative Features of Advanced Crypt...
 
Strategies for Successful Data Migration Tools.pptx
Strategies for Successful Data Migration Tools.pptxStrategies for Successful Data Migration Tools.pptx
Strategies for Successful Data Migration Tools.pptx
 
Understanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSageUnderstanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSage
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
 
How Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptxHow Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptx
 
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...
 
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
 
Into the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdfInto the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdf
 
Software Testing Exam imp Ques Notes.pdf
Software Testing Exam imp Ques Notes.pdfSoftware Testing Exam imp Ques Notes.pdf
Software Testing Exam imp Ques Notes.pdf
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
 
Quarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden ExtensionsQuarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden Extensions
 
top nidhi software solution freedownload
top nidhi software solution freedownloadtop nidhi software solution freedownload
top nidhi software solution freedownload
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
 
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
 
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume MontevideoVitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume Montevideo
 
Designing for Privacy in Amazon Web Services
Designing for Privacy in Amazon Web ServicesDesigning for Privacy in Amazon Web Services
Designing for Privacy in Amazon Web Services
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
 
2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx
 

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