SlideShare une entreprise Scribd logo
1  sur  88
Télécharger pour lire hors ligne
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

Contenu connexe

Similaire à 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
 

Similaire à 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
 

Plus de Tobias Pfeiffer

Plus 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...
 

Dernier

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
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Dernier (20)

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
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
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
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
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...
 
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
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 

Elixir & Phoenix – Fast, Concurrent and Explicit