SlideShare uma empresa Scribd logo
1 de 88
Baixar para ler offline
Shoulders of giants
Fault Tolerance
Fault Tolerance
Parallelism
Actors/Processes
Observer
Supervisors
Fault Tolerance
Hot Code Swapping
Parallelism
Fault Tolerance
Hot Code Swapping
Distribution
Parallelism
Fault Tolerance
Performance
Hot Code Swapping
Distribution
Parallelism
Fault Tolerance
Performance
Hot Code Swapping
Distribution
Functional Programming
Parallelism
Fault Tolerance
Performance
Hot Code Swapping
Distribution
Functional Programming
Parallelism
If somebody came to me and wanted to pay me a lot of
money to build a large scale message handling system that
really had to be up all the time, could never afford to go
down for years at a time, I would unhesitatingly choose
Erlang to build it in.
Tim Bray
(Director of Web Technologies Sun Microsystems - 2008)
2 Million Websocket Connections
2 Million Websocket Connections
Great Company
Elixir and Phoenix
fast, concurrent and explicit
Tobias Pfeiffer
@PragTob
pragtob.info
Elixir and Phoenix
fast, concurrent and explicit
Tobias Pfeiffer
@PragTob
pragtob.info
defmodule MapDemo do
  @doc """
  iex> MapDemo.map [1, 2, 3, 4], fn i -> i + 1 end
  [2, 3, 4, 5]
  """
  def map(list, function) do
    Enum.reverse(do_map([], list, function))
  end
  defp do_map(acc, [], _function) do
    acc
  end
  defp do_map(acc, [head | tail], function) do
    do_map([function.(head) | acc], tail, function)
  end
end
defmodule MapDemo do
  @doc """
  iex> MapDemo.map [1, 2, 3, 4], fn i -> i + 1 end
  [2, 3, 4, 5]
  """
  def map(list, function) do
    Enum.reverse(do_map([], list, function))
  end
  defp do_map(acc, [], _function) do
    acc
  end
  defp do_map(acc, [head | tail], function) do
    do_map([function.(head) | acc], tail, function)
  end
end
Ruby-like Syntax
defmodule MapDemo do
  @doc """
  iex> MapDemo.map [1, 2, 3, 4], fn i -> i + 1 end
  [2, 3, 4, 5]
  """
  def map(list, function) do
    Enum.reverse(do_map([], list, function))
  end
  defp do_map(acc, [], _function) do
    acc
  end
  defp do_map(acc, [head | tail], function) do
    do_map([function.(head) | acc], tail, function)
  end
end
First Class Functions
defmodule MapDemo do
  @doc """
  iex> MapDemo.map [1, 2, 3, 4], fn i -> i + 1 end
  [2, 3, 4, 5]
  """
  def map(list, function) do
    Enum.reverse(do_map([], list, function))
  end
  defp do_map(acc, [], _function) do
    acc
  end
  defp do_map(acc, [head | tail], function) do
    do_map([function.(head) | acc], tail, function)
  end
end
Pattern Matching
defmodule Patterns do
  def greet(%{name: name, age: age}) do
    IO.puts("Hi there -{name}, what's up at -{age}?")
  end
  def greet(%{name: "Emily"}) do
    IO.puts("Thanks for running Øredev for so long!")
  end
  def greet(%{name: name}) do
    IO.puts("Hi there -{name}")
  end
  def greet(_) do
    IO.puts("Hi")
  end
end
Pattern Matching
defmodule Patterns do
  def greet(%{name: name, age: age}) do
    IO.puts("Hi there -{name}, what's up at -{age}?")
  end
  def greet(%{name: "Emily"}) do
    IO.puts("Thanks for running Øredev for so long!")
  end
  def greet(%{name: name}) do
    IO.puts("Hi there -{name}")
  end
  def greet(_) do
    IO.puts("Hi")
  end
end
%{name: "Tobi", age: 30, something: :else}
defmodule Patterns do
  def greet(%{name: name, age: age}) do
    IO.puts("Hi there -{name}, what's up at -{age}?")
  end
  def greet(%{name: "Emily"}) do
    IO.puts("Thanks for running Øredev for so long!")
  end
  def greet(%{name: name}) do
    IO.puts("Hi there -{name}")
  end
  def greet(_) do
    IO.puts("Hi")
  end
end
%{name: "Emily"}
defmodule Patterns do
  def greet(%{name: name, age: age}) do
    IO.puts("Hi there -{name}, what's up at -{age}?")
  end
  def greet(%{name: "Emily"}) do
    IO.puts("Thanks for running Øredev for so long!")
  end
  def greet(%{name: name}) do
    IO.puts("Hi there -{name}")
  end
  def greet(_) do
    IO.puts("Hi")
  end
end
%{name: "Tadeáš"}
defmodule Patterns do
  def greet(%{name: name, age: age}) do
    IO.puts("Hi there -{name}, what's up at -{age}?")
  end
  def greet(%{name: "Emily"}) do
    IO.puts("Thanks for running Øredev for so long!")
  end
  def greet(%{name: name}) do
    IO.puts("Hi there -{name}")
  end
  def greet(_) do
    IO.puts("Hi")
  end
end
["Mop"]
defmodule MapDemo do
  @doc """
  iex> MapDemo.map [1, 2, 3, 4], fn i -> i + 1 end
  [2, 3, 4, 5]
  """
  def map(list, function) do
    Enum.reverse(do_map([], list, function))
  end
  defp do_map(acc, [], _function) do
    acc
  end
  defp do_map(acc, [head | tail], function) do
    do_map([function.(head) | acc], tail, function)
  end
end
Docs
defmodule MapDemo do
  @doc """
  iex> MapDemo.map [1, 2, 3, 4], fn i -> i + 1 end
  [2, 3, 4, 5]
  """
  def map(list, function) do
    Enum.reverse(do_map([], list, function))
  end
  defp do_map(acc, [], _function) do
    acc
  end
  defp do_map(acc, [head | tail], function) do
    do_map([function.(head) | acc], tail, function)
  end
end
Doctests
defmacro plug(plug, opts  []) do
  quote do
    @plugs {unquote(plug), unquote(opts), true}
  end
end
Meta Programming
defprotocol Blank do
  def blank?(data)
end
defimpl Blank, for: List do
  def blank?([]), do: true
  def blank?(_), do: false
end
defimpl Blank, for: Map do
  def blank?(map), do: map_size(map) -= 0
end
Polymorphism
defprotocol Blank do
  def blank?(data)
end
defimpl Blank, for: List do
  def blank?([]), do: true
  def blank?(_), do: false
end
defimpl Blank, for: Map do
  def blank?(map), do: map_size(map) -= 0
end
Polymorphism
defprotocol Blank do
  def blank?(data)
end
defimpl Blank, for: List do
  def blank?([]), do: true
  def blank?(_), do: false
end
defimpl Blank, for: Map do
  def blank?(map), do: map_size(map) -= 0
end
Polymorphism
@spec all?(t) -: boolean
@spec all?(t, (element -> as_boolean(term))) -: boolean
def all?(enumerable, fun  fn x -> x end)
def all?(enumerable, fun) when is_list(enumerable) and is_function(fun, 1) do
  do_all?(enumerable, fun)
end
Implemented in itself!
@spec all?(t) -: boolean
@spec all?(t, (element -> as_boolean(term))) -: boolean
def all?(enumerable, fun  fn x -> x end)
def all?(enumerable, fun) when is_list(enumerable) and is_function(fun, 1) do
  do_all?(enumerable, fun)
end
Optional Typespecs
defmodule Plug do
  @type opts -: tuple | atom | integer | float | [opts]
  @callback init(opts) -: opts
  @callback call(Plug.Conn.t(), opts) -: Plug.Conn.t()
end
“Interfaces”
defmodule Plug do
  @type opts -: tuple | atom | integer | float | [opts]
  @callback init(opts) -: opts
  @callback call(Plug.Conn.t(), opts) -: Plug.Conn.t()
end
“Interfaces”
defmodule Plug.Head do
  @behaviour Plug
  alias Plug.Conn
  def init([]), do: []
  def call(%Conn{method: "HEAD"} = conn, []) do
    %{conn | method: "GET"}
  end
  def call(conn, []), do: conn
end
“Interfaces”
defmodule Plug.Head do
  @behaviour Plug
  alias Plug.Conn
  def init([]), do: []
  def call(%Conn{method: "HEAD"} = conn, []) do
    %{conn | method: "GET"}
  end
  def call(conn, []), do: conn
end
“Interfaces”
defmodule Plug.Head do
  @behaviour Plug
  alias Plug.Conn
  def init([]), do: []
  def call(%Conn{method: "HEAD"} = conn, []) do
    %{conn | method: "GET"}
  end
  def call(conn, []), do: conn
end
“Interfaces”
Functional Programming?
Not Me
Me
2.6.5 :001 > [1, 2, 3, 4].map { |i| i + 1 }
-> [2, 3, 4, 5]
iex(2)> Enum.map [1, 2, 3, 4], fn i -> i + 1 end
[2, 3, 4, 5]
vs
Where to call functions
Separate State & Behaviour
Transformation
of Data
Pipe
people = DB.find_customers
orders = Orders.for_customers(people)
tax = sales_tax(orders, 2019)
filing = prepare_filing(tax)
filing = DB.find_customers
-> Orders.for_customers
-> sales_tax(2019)
-> prepare_filing
Pipe
filing =
prepare_filing(sales_tax(
Orders.for_cusstomers(DB.find_customers), 2019))
Pipe
filing =
prepare_filing(sales_tax(
Orders.for_cusstomers(DB.find_customers), 2019))
Pipe
filing = DB.find_customers
-> Orders.for_customers
-> sales_tax(2019)
-> prepare_filing
Pipe
person = Person.new(attributes)
do_something(person)
insert_in_db(person)
Immutable Data
person = Person.new(attributes)
person = do_something(person)
insert_in_db(person)
Immutable Data
Principles vs Power
Same Input,
Same Output
Readability
Refactoring++
Testing++
connection
-> router
-> controller
-> model
-> view
Transformation
defmodule DemoWeb.Router do
  use DemoWeb, :router
  scope "/", DemoWeb do
    pipe_through :browser
    get "/", PageController, :index
    resources "/users", UserController
    resources "/posts", PostController
  end
end
Router
defmodule DemoWeb.UserController do
  use DemoWeb, :controller
  
  def show(conn, %{"id" -> id}) do
    user = Accounts.get_user!(id)
    render(conn, "show.html", user: user)
  end
end
Controller
defmodule DemoWeb.UserController do
  use DemoWeb, :controller
  
  def show(conn, %{"id" -> id}) do
    user = Accounts.get_user!(id)
    render(conn, "show.html", user: user)
  end
end
Context
defmodule Demo.Accounts do
  def get_user!(id) do
    Repo.get!(User, id)
  end
end
Context
defmodule Demo.Accounts.User do
  use Ecto.Schema
  schema "users" do
    field :age, :integer
    field :name, :string
    has_many(:posts, Blogging.Post)
    timestamps()
  end
end
Schema
defmodule DemoWeb.UserController do
  use DemoWeb, :controller
  
  def show(conn, %{"id" -> id}) do
    user = Accounts.get_user!(id)
    render(conn, "show.html", user: user)
  end
end
Controller
defmodule DemoWeb.UserView do
  use DemoWeb, :view
  def display(user) do
    "-{user.name} (-{user.age})"
  end
end
<h1>Show User-/h1>
<ul>
  <li>
    <strong>Name:-/strong>
    <%= @user.name %>
  -/li>
  <li>
    <strong>Age:-/strong>
    <%= @user.age %>
  -/li>
-/ul>
def new_changeset(model, params  %{}) do
  model
  -> cast(params, ~w(name username), [])
  -> unique_constraint(:username)
  -> validate_length(:username, min: 1, max: 20)
end
def registration_changeset(model, params) do
  model
  -> new_changeset(params)
  -> cast(params, ~w(password), [])
  -> validate_length(:password, min: 6, max: 100)
  -> put_pass_hash()
end
Changesets
def new_changeset(model, params  %{}) do
  model
  -> cast(params, ~w(name username), [])
  -> unique_constraint(:username)
  -> validate_length(:username, min: 1, max: 20)
end
def registration_changeset(model, params) do
  model
  -> new_changeset(params)
  -> cast(params, ~w(password), [])
  -> validate_length(:password, min: 6, max: 100)
  -> put_pass_hash()
end
Changesets
def new_changeset(model, params  %{}) do
  model
  -> cast(params, ~w(name username), [])
  -> unique_constraint(:username)
  -> validate_length(:username, min: 1, max: 20)
end
def registration_changeset(model, params) do
  model
  -> new_changeset(params)
  -> cast(params, ~w(password), [])
  -> validate_length(:password, min: 6, max: 100)
  -> put_pass_hash()
end
Changesets
def new_changeset(model, params  %{}) do
  model
  -> cast(params, ~w(name username), [])
  -> unique_constraint(:username)
  -> validate_length(:username, min: 1, max: 20)
end
def registration_changeset(model, params) do
  model
  -> new_changeset(params)
  -> cast(params, ~w(password), [])
  -> validate_length(:password, min: 6, max: 100)
  -> put_pass_hash()
end
Changesets
The right tool
Liveview!
  def handle_info(:tick, socket) do
    game = Game.update(socket.assigns.game)
    case game.state do
      :ok ->
        socket = schedule_tick(socket)
        {:noreply, assign(socket, game: game)}
      :end ->
        {:noreply, assign(socket, game: game)}
    end
  end
  def handle_event("keydown", _key, socket) do
    game = socket.assigns.game
    case game.state do
      :ok -> {:noreply, assign(socket, game: Game.flap(game))}
      _ -> {:noreply, new_game(socket)}
    end
   end
Liveview!
  <div id="bird"
style="left:<%= @game.bird.x %>vw;
top:<%= @game.bird.y %>vh;
transform: rotate(<
%= if @game.bird.velocity > 0, do: -25, else: 25 %>deg);">
    <img src="bird.png"->
  -/div>
  <%= for pipe -- @game.pipes do %>
    <div class="pipe"
style="left:<%= pipe.x %>vw; top:<%= pipe.y %>vh;">
      <img src="pipe.png"->
    -/div>
  <% end %>
Liveview!
  <div id="bird"
style="left:<%= @game.bird.x %>vw;
top:<%= @game.bird.y %>vh;
transform: rotate(<
%= if @game.bird.velocity > 0, do: -25, else: 25 %>deg);">
    <img src="bird.png"->
  -/div>
  <%= for pipe -- @game.pipes do %>
    <div class="pipe"
style="left:<%= pipe.x %>vw; top:<%= pipe.y %>vh;">
      <img src="pipe.png"->
    -/div>
  <% end %>
Liveview!
Demo!
So we all go and do Elixir
and Phoenix now?
Baggage
An exciting land
Thank you!
Tobias Pfeiffer
@PragTob
pragtob.info
Photo Attribution
●
CC BY-ND 2.0
– https://www.flickr.com/photos/mmmswan/8918529543/
●
CC BY 2.0
– https://flic.kr/p/eKGRRJ
●
CC BY-NC 2.0
– https://www.flickr.com/photos/-jule/2728475835/
– https://flic.kr/p/emoKPd
●
CC BY-NC-ND 2.0
– https://flic.kr/p/eyC7ZT
– https://www.flickr.com/photos/75487768@N04/14029339573/
– https://flic.kr/p/bG2r2D
●
CC BY-SA 2.0
– https://commons.wikimedia.org/wiki/File:Heckert_GNU_white.svg
– https://flic.kr/p/cEJDC3

Mais conteúdo relacionado

Semelhante a Elixir & Phoenix – Fast, Concurrent and Explicit

SiriusCon 2015 - Breathe Life into Your Designer!
SiriusCon 2015 - Breathe Life into Your Designer!SiriusCon 2015 - Breathe Life into Your Designer!
SiriusCon 2015 - Breathe Life into Your Designer!
melbats
 
FredMcLainResumeB
FredMcLainResumeBFredMcLainResumeB
FredMcLainResumeB
Fred McLain
 

Semelhante a Elixir & Phoenix – Fast, Concurrent and Explicit (20)

Netcomposer
NetcomposerNetcomposer
Netcomposer
 
SiriusCon 2015 - Breathe Life into Your Designer!
SiriusCon 2015 - Breathe Life into Your Designer!SiriusCon 2015 - Breathe Life into Your Designer!
SiriusCon 2015 - Breathe Life into Your Designer!
 
Heroku @ Toyota Motor Europe: Platform As A Factory As A Service
Heroku @ Toyota Motor Europe: Platform As A Factory As A ServiceHeroku @ Toyota Motor Europe: Platform As A Factory As A Service
Heroku @ Toyota Motor Europe: Platform As A Factory As A Service
 
C:\Alon Tech\New Tech\Embedded Conf Tlv\Prez\Sightsys Embedded Day
C:\Alon Tech\New Tech\Embedded Conf Tlv\Prez\Sightsys Embedded DayC:\Alon Tech\New Tech\Embedded Conf Tlv\Prez\Sightsys Embedded Day
C:\Alon Tech\New Tech\Embedded Conf Tlv\Prez\Sightsys Embedded Day
 
Painless DevSecOps: Building Security Into Your DevOps Pipeline
Painless DevSecOps: Building Security Into Your DevOps PipelinePainless DevSecOps: Building Security Into Your DevOps Pipeline
Painless DevSecOps: Building Security Into Your DevOps Pipeline
 
Devcon2上海 参加報告
Devcon2上海 参加報告Devcon2上海 参加報告
Devcon2上海 参加報告
 
Software and the Concurrency Revolution : Notes
Software and the Concurrency Revolution : NotesSoftware and the Concurrency Revolution : Notes
Software and the Concurrency Revolution : Notes
 
Native i os, android, and windows development in c# with xamarin 4
Native i os, android, and windows development in c# with xamarin 4Native i os, android, and windows development in c# with xamarin 4
Native i os, android, and windows development in c# with xamarin 4
 
Tnt 2020-jf-james
Tnt 2020-jf-jamesTnt 2020-jf-james
Tnt 2020-jf-james
 
A case study why Zoominfo uses Terraform Cloud in high-scale environment.
A case study why Zoominfo uses Terraform Cloud in high-scale environment. A case study why Zoominfo uses Terraform Cloud in high-scale environment.
A case study why Zoominfo uses Terraform Cloud in high-scale environment.
 
From Duke of DevOps to Queen of Chaos - Api days 2018
From Duke of DevOps to Queen of Chaos - Api days 2018From Duke of DevOps to Queen of Chaos - Api days 2018
From Duke of DevOps to Queen of Chaos - Api days 2018
 
Net remoting
Net remotingNet remoting
Net remoting
 
Overview Of Parallel Development - Ericnel
Overview Of Parallel Development -  EricnelOverview Of Parallel Development -  Ericnel
Overview Of Parallel Development - Ericnel
 
Xenit diary dev con 2018
Xenit diary dev con 2018Xenit diary dev con 2018
Xenit diary dev con 2018
 
Nelson: Rigorous Deployment for a Functional World
Nelson: Rigorous Deployment for a Functional WorldNelson: Rigorous Deployment for a Functional World
Nelson: Rigorous Deployment for a Functional World
 
FredMcLainResumeB
FredMcLainResumeBFredMcLainResumeB
FredMcLainResumeB
 
Solving Cybersecurity at Scale
Solving Cybersecurity at ScaleSolving Cybersecurity at Scale
Solving Cybersecurity at Scale
 
What's new and next for mobile development with .NET
What's new and next for mobile development with .NETWhat's new and next for mobile development with .NET
What's new and next for mobile development with .NET
 
Journey to the Modern App with Containers, Microservices and Big Data
Journey to the Modern App with Containers, Microservices and Big DataJourney to the Modern App with Containers, Microservices and Big Data
Journey to the Modern App with Containers, Microservices and Big Data
 
16 greg hope_com_wics
16 greg hope_com_wics16 greg hope_com_wics
16 greg hope_com_wics
 

Mais de Tobias Pfeiffer

Mais de Tobias Pfeiffer (20)

Going Staff
Going StaffGoing Staff
Going Staff
 
Stories in Open SOurce
Stories in Open SOurceStories in Open SOurce
Stories in Open SOurce
 
Metaphors are everywhere: Ideas to Improve Software Development
 Metaphors are everywhere: Ideas to Improve Software Development  Metaphors are everywhere: Ideas to Improve Software Development
Metaphors are everywhere: Ideas to Improve Software Development
 
Stories in Open Source
Stories in Open SourceStories in Open Source
Stories in Open Source
 
Functioning Among Humans
Functioning Among HumansFunctioning Among Humans
Functioning Among Humans
 
Functioning Among Humans
Functioning Among HumansFunctioning Among Humans
Functioning Among Humans
 
Do You Need That Validation? Let Me Call You Back About It
Do You Need That Validation? Let Me Call You Back About ItDo You Need That Validation? Let Me Call You Back About It
Do You Need That Validation? Let Me Call You Back About It
 
Stop Guessing and Start Measuring - Benchmarking in Practice (Lambdadays)
Stop Guessing and Start Measuring - Benchmarking in Practice (Lambdadays)Stop Guessing and Start Measuring - Benchmarking in Practice (Lambdadays)
Stop Guessing and Start Measuring - Benchmarking in Practice (Lambdadays)
 
Where do Rubyists go?
 Where do Rubyists go?  Where do Rubyists go?
Where do Rubyists go?
 
It's About the Humans, Stupid (Lightning)
It's About the Humans, Stupid (Lightning)It's About the Humans, Stupid (Lightning)
It's About the Humans, Stupid (Lightning)
 
Stop Guessing and Start Measuring - Benchmarking Practice (Poly Version)
 Stop Guessing and Start Measuring - Benchmarking Practice (Poly Version) Stop Guessing and Start Measuring - Benchmarking Practice (Poly Version)
Stop Guessing and Start Measuring - Benchmarking Practice (Poly Version)
 
Code, Comments, Concepts, Comprehension – Conclusion?
Code, Comments, Concepts, Comprehension – Conclusion?Code, Comments, Concepts, Comprehension – Conclusion?
Code, Comments, Concepts, Comprehension – Conclusion?
 
How fast is it really? Benchmarking in Practice (Ruby Version)
How fast is it really? Benchmarking in Practice (Ruby Version)How fast is it really? Benchmarking in Practice (Ruby Version)
How fast is it really? Benchmarking in Practice (Ruby Version)
 
How fast ist it really? Benchmarking in practice
How fast ist it really? Benchmarking in practiceHow fast ist it really? Benchmarking in practice
How fast ist it really? Benchmarking in practice
 
Introducing Elixir the easy way
Introducing Elixir the easy wayIntroducing Elixir the easy way
Introducing Elixir the easy way
 
Elixir & Phoenix – fast, concurrent and explicit
Elixir & Phoenix – fast, concurrent and explicitElixir & Phoenix – fast, concurrent and explicit
Elixir & Phoenix – fast, concurrent and explicit
 
What did AlphaGo do to beat the strongest human Go player?
What did AlphaGo do to beat the strongest human Go player?What did AlphaGo do to beat the strongest human Go player?
What did AlphaGo do to beat the strongest human Go player?
 
Elixir & Phoenix – fast, concurrent and explicit
Elixir & Phoenix – fast, concurrent and explicitElixir & Phoenix – fast, concurrent and explicit
Elixir & Phoenix – fast, concurrent and explicit
 
What did AlphaGo do to beat the strongest human Go player?
What did AlphaGo do to beat the strongest human Go player?What did AlphaGo do to beat the strongest human Go player?
What did AlphaGo do to beat the strongest human Go player?
 
What did AlphaGo do to beat the strongest human Go player? (Strange Group Ver...
What did AlphaGo do to beat the strongest human Go player? (Strange Group Ver...What did AlphaGo do to beat the strongest human Go player? (Strange Group Ver...
What did AlphaGo do to beat the strongest human Go player? (Strange Group Ver...
 

Último

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 

Último (20)

Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 

Elixir & Phoenix – Fast, Concurrent and Explicit