Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Tutorial Phoenix framework

Arthur
September 03, 2016

Tutorial Phoenix framework

Workshop realizado no evento Python sudeste no dia 03/09/2016.
Foram mostrados os conceitos básicos de programação funcional e o básico do Elixir como tipos de dados, condicionais e loops. Depois expliquei como funciona o framework Phoenix e fizemos juntos um pequeno aplicativo de chat usando channels.
Repositório do chat: https://github.com/arthurbragaa/phoenix-chat-pyse

Arthur

September 03, 2016
Tweet

More Decks by Arthur

Other Decks in Programming

Transcript

  1. 1ª parte: Elixir História Conceitos de programação funcional Pattern Matching

    Tipos de dados Módulos e funções nomeadas Condicionais Loops Mix 3
  2. 2ª parte: Phoenix Criação do projeto Estrutura de arquivos Rotas

    e pipeline Controllers, Models, Templates e Views Ecto Geradores Channels 4
  3. Teoria da Lógica combinatória - 1927. Base para o design

    das linguagens de programação funcionais. Higher-order functions. As linguagens funcionais Haskell, Brooks, Curry e o conceito currying foram homenagens a ele. Haskell Curry 7
  4. Teoria das funções recursivas - 1931. Considerado um dos mais

    importantes lógicos que já existiu. Kurt Gödel 8
  5. Teoria do cálculo lambda - 1936 Funções anônimas Influenciou o

    design do LISP e das linguagens de programação funcionais em geral. Conceitos de abstração. Linguagens de alto nível. Alonzo Church 9
  6. LISP foi criado no MIT em 1960 ISWIM em 1966

    SASL em 1973 Miranda e Erlang em 1986 Haskell em 1992 Primeiras Linguagens 10
  7. Criador da linguagem Fortran - 1950. Criada dentro da IBM.

    Primeira linguagem de alto nível. Dominou a área de programação. Continua sendo usada até hoje em super computadores. . John W. Backus 17
  8. John W. Backus Turing award em 1977. “Linguagens de programação

    convencionais estão ficando cada vez maiores, mas não mais fortes.” 18
  9. Brasileiro. Fez parte do core team do rails. Participou de

    muitos projetos open source. Decidiu criar a linguagem Elixir em 2013. José Valim 31
  10. Porque Erlang? Criado em 1986 para resolver problemas na área

    de telefonia. Altamente tolerante a falhas. Altamente concorrente. Fácil de escalar. 33
  11. Descobriu Elixir em 2013. Desenvolveu uma biblioteca de websockets. Viu

    a oportunidade de criar um framework com foco em produtividade no estilo do rails. Chris McCord 35
  12. Timeline Dezembro de 2013: Início do desenvolvimento do Phoenix. Setembro

    de 2014: José Valim entra para o Core Team. Agosto de 2015: Lançada versão 1.0 36
  13. É um paradigma de programação que trata a computação como

    uma avaliação de funções matemáticas e que evita estados ou dados mutáveis 38
  14. Imutabilidade Eshell V8.0.3 1> A = 10. 10 2> A

    = 20. ** exception error: no match of right hand side value 20 41
  15. Imutabilidade Interactive Elixir (1.3.2) iex(4)> a = 10 10 iex(5)>

    ^a = 20 ** (MatchError) no match of right hand side value: 20 45
  16. Imutabilidade iex(12)> soma = 25 25 iex(13)> func_soma = fn

    -> "A soma é #{ soma }" end #Function<20.52032458/0 in :erl_eval.expr/5> iex(14)> soma = 100 100 iex(17)> func_soma.() "A soma é 25" 47
  17. Funções anônimas São funções que podem ser tratadas como valores

    e que podem ser manipuladas ou retornadas por outras funções. 48
  18. Funções anônimas soma10 = fn (x) -> x + 10

    end soma10.(20) # => 30 multiplica = fn x,y -> x * y end multiplica.(10,10) # => 100 lista = [1,2,3,4,5] Enum.map(lista, soma10) [11, 12, 13, 14, 15, 16] 49
  19. Funções puras São aquelas que não causam efeitos colaterais, ou

    seja, não interagem com recursos externos. 50
  20. Higher-order functions lista = [1,2,3,4,5] [1, 2, 3, 4, 5]

    Enum.map(lista, fn x -> x * x end) [1, 4, 9, 16, 25] Enum.reduce(lista, 0, fn(x,y) -> x + y end) 15 Enum.reduce(lista, 0, &(&1 + &2)) 15 Enum.filter(lista, fn x -> x > 2 end) [3, 4, 5] 52
  21. Recursão defmodule Fatorial do def de(1), do: 1 def de(n)

    when n > 0 do n * de(n-1) end end 54
  22. Pattern Matching iex> {a, b, c} = {:hello, "world", 42}

    {:hello, "world", 42} iex> a :hello iex> b "world" iex> {a, _, c} = {:hello, "world", 42} {:hello, "world", 42} iex> a :hello iex> c 42 55
  23. Pattern Matching iex> {a, b, c} = {:hello, "world"} **

    (MatchError) no match of right hand side value: {:hello, "world"} 56
  24. Pattern Matching iex> {:ok, result} = {:ok, 13} {:ok, 13}

    iex> result 13 iex> {:ok, result} = {:error, :oops} ** (MatchError) no match of right hand side value: {:error, :oops} 57
  25. Pattern Matching iex> [head | tail] = [1, 2, 3]

    [1, 2, 3] iex> head 1 iex> tail [2, 3] 58
  26. Pattern Matching defmodule Math do def sum_list([head | tail], accumulator)

    do sum_list(tail, head + accumulator) end def sum_list([], accumulator) do accumulator end end IO.puts Math.sum_list([1, 2, 3], 0) #=> 6 59
  27. Pattern Matching - Pin operator iex> x = 1 1

    iex> ^x = 2 ** (MatchError) no match of right hand side value: 2 iex> {y, ^x} = {2, 1} {2, 1} iex> y 2 iex> {y, ^x} = {2, 2} ** (MatchError) no match of right hand side value: {2, 2} 60
  28. Pipe operator ( |> ) Transforma o valor anterior como

    primeiro argumento da próxima função. 61
  29. Operador Pipe (|>) other_function() |> new_function() |> baz() |> bar()

    |> foo() "Elixir rocks" |> String.upcase |> String.split ["ELIXIR", "ROCKS"] "elixir" |> String.ends_with?("ixir") true 63
  30. Tipos de dados iex> 1 # integer iex> 0x1F #

    integer iex> 1.0 # float iex> true # boolean iex> :atom # atom / symbol iex> "elixir" # string iex> 'elixir' # char list iex> [1, 2, 3] # list iex> {1, 2, 3} # tuple 65
  31. If iex> lang = "Elixir" "Elixir" ...> if lang do

    ...> IO.puts lang ...> end Elixir :ok iex> lang = "Phyton" "Phyton" iex> if lang == "Elixir" do ...> IO.puts lang ...> else ...> IO.puts "Não é elixir" ...> end Não é elixir :ok 67
  32. Unless iex> lang = "Elixir" "Elixir" ...> unless lang do

    ...> IO.puts lang ...> end nil :ok iex> lang = "Phyton" "Phyton" iex> unless lang == "Elixir" do ...> IO.puts lang ...> end Python :ok 68
  33. Cond iex> cond do ...> 2 + 2 == 5

    -> ...> "Falso" ...> 2 * 2 == 3 -> ...> "Falso" ...> 1 + 1 == 2 -> ...> "Verdadeiro" ...> true -> ...> "Se nada der certo chega aqui" ...> end "Verdadeiro" 69
  34. Case case {1, 2, 3} do {4, 5, 6} ->

    "Não vai dar match" {1, x, 3} -> "Vai dar match e o x vai receber o valor 2" _ -> "Essa clausula vai dar match em qualquer valor" end "Vai dar match e o x vai receber o valor 2" 70
  35. Case case {1, 2, 3} do {4, 5, 6} ->

    "Não vai dar match" {1, ^x, 3} -> "Vai dar match e o x vai receber o valor 2" _ -> "Essa clausula vai dar match em qualquer valor" end "Essa clausula vai dar match em qualquer valor" 71
  36. Case calcular = fn expressao -> case expressao do {:+,

    num1, num2} -> num1 + num2 {:-, num1, num2} -> num1 - num2 {:*, num1, num2} -> num1 * num2 {:/, num1, num2} -> num1 / num2 end end calcular.({:+, 2 ,2}) 4 calcular.({:-, 2 ,2}) 0 calcular.({:/, 2 ,0}) ** (ArithmeticError) bad argument in arithmetic expression :erlang./(2, 0) 72
  37. Módulos iex> defmodule Math do ...> def sum(a, b) do

    ...> a + b ...> end ...> end Math.sum(1,2) #=> 3 74
  38. Funções defmodule Math do def sum(a, b) do do_sum(a, b)

    end defp do_sum(a, b) do a + b end end IO.puts Math.sum(1, 2) #=> 3 IO.puts Math.do_sum(1, 2) #=> ** (UndefinedFunctionError) 75
  39. Guard clauses calcular = fn expressao -> case expressao do

    {:+, num1, num2} -> num1 + num2 {:-, num1, num2} -> num1 - num2 {:*, num1, num2} -> num1 * num2 {:/, num1, num2} when num2 != 0 -> num1 / num2 {:/, num1, num2} when num2 == 0 -> IO.puts "Não é possível dividir por 0" end end calcular.({:/, 2, 0}) Não é possível dividir por 0 :ok calcular.({:/, 2, 1}) 2.0 77
  40. Fatorial defmodule Fatorial do def de(1), do: 1 def de(n)

    when n > 0 do n * de(n-1) end end 78
  41. Fatorial defmodule Fatorial do def de(1, acc), do: acc def

    de(n, acc) when n > 0 do de(n-1, acc * n) end end 79
  42. Arquivos ex e exs .ex: Arquivos que serão compilados. .exs:

    Arquivos que serão interpretados. 82
  43. Arquivos ex e exs Se o arquivo precisar ser muito

    rápido, use o ex pois arquivo exs é compilado em tempo de execução. Os arquivos de teste normalmente utilizam .exs para não precisar compilar toda vez que os testes rodarem 83