Ruby e Erlang
de mãos dadas

     Éverton Ribeiro
    nuxlli@gmail.com
Quem?
Quem?

• Desenvolvedor web
• Ex Administrador de redes
• Desenvolvedor e Pesquisador Abril
• http://nuxlli.com.br
• @nuxlli
O que queremos?

Criar uma arquitetura que junte as duas
  linguagens de forma que uma possa
   favorecer a outra e tentar...
Agenda

• Linguagens: Vantagens e
  Desvantagens
• Onde usamos
• Erlang distribuída
• Lib para facilitar a vida
• Futuro d...
Erlang - Vantagens

• Suporte à concorrência (no threads)
• Hot Swapping Code nativo
• Distribuída
• Feita para ambientes ...
Erlang - Desvantagens

• Curva de aprendizado muito alta
  (paradigma funcional)
• Dificuldade para criação de
  framework ...
Ruby - Vantagens


• Curva de aprendizado baixa
• Menos é mais
• Comunidade de desenvolvedores
  grande
Ruby - Desvantagens


• Desempenho
• Pouca aceitação no mundo EE
• Complexidade para desenvolver
 aplicações distribuídas
O que elas ganham?
• Erlang
 • Produtividade
 • Facilidade em escrever testes
• Ruby
 • Performance
 • Programação distrib...
na prática - live
Mas antes
Programação distribuída
      com Erlang
• Clusters
• Todo interpretador rodando é um nó.
• Um nó confia plenamente no outr...
Exemplo
-module(math).
-export([start/0,add/2]).

start() ->
    register(?MODULE, spawn(fun() -> loop() end)).

add(X,Y) ...
Exemplo
                          Primeiro nó
$ erlc math.erl
$ erl -sname smath
(smath@localhost) 1> math:start().
true
(...
voltando ao live
Como fizemos




EPMD (Erlang Port Mapper Daemon)
Problemas identificados:

• Fora do padrão Erlang
• Manutenção, 3 pontos de mudança:
 • Nós Erlang
 • Servidor Erlang (API ...
Uma forma melhor




EPMD (Erlang Port Mapper Daemon)
Porque é melhor:


• É mantido o padrão Erlang
• Manutenção, 2 pontos de mudança:
 • Nós Erlangs
 • Aplicação Ruby on Rails
Mas como fazer?



    ?
rinterface

• http://github.com/nofxx/rinterface
• Lib de comunicação com nós erlang
• EPMD (Erlang Port Mapper Daemon)
• ...
Como funciona?
                 Em Erlang:

rpc:call(smath@localhost, math, add, [10, 20])


                 Em Ruby:

 E...
Status:
• O que faz:
  • Chamadas rpc aos nós erlang
  • Tratamento de tipos: inteiros, flutuantes, atoms,
     tuplas, lis...
Testes em Erlang
                        fib.erl
-module(fib).
-export([fib/1]).
-include_lib("eunit/include/eunit.hrl").

...
Teste com rinterface
           (atualmente)
                            fib_spec.rb
require 'minitest/unit'
require 'minit...
Teste com rinterface
                        fib_spec.rb
require 'minitest/unit'
require 'minitest/spec'
require 'rinterfac...
Futuro - Client Node

# Erlang::Node.new(:'node@localhost')
ServerFib = Erlang::Node.new(:sfib)
ServerFib.fib.fib(1) # 1

...
Futuro - Server Node

Erlang::Mod.new :math do
  def add x, y
    x + y
  end
end

module Fib
  def fib(n)
    n < 2 ? n :...
Perguntas?


http://github.com/nofxx/rinterface
        http://nuxlli.com.br
           Éverton Ribeiro
          nuxlli@g...
Ruby e Erlang de mãos dadas
Ruby e Erlang de mãos dadas
Upcoming SlideShare
Loading in...5
×

Ruby e Erlang de mãos dadas

1,197

Published on

Apresentação

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,197
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
6
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Ruby e Erlang de mãos dadas"

  1. 1. Ruby e Erlang de mãos dadas Éverton Ribeiro nuxlli@gmail.com
  2. 2. Quem?
  3. 3. Quem? • Desenvolvedor web • Ex Administrador de redes • Desenvolvedor e Pesquisador Abril • http://nuxlli.com.br • @nuxlli
  4. 4. O que queremos? Criar uma arquitetura que junte as duas linguagens de forma que uma possa favorecer a outra e tentar eliminar suas deficiências.
  5. 5. Agenda • Linguagens: Vantagens e Desvantagens • Onde usamos • Erlang distribuída • Lib para facilitar a vida • Futuro da lib
  6. 6. Erlang - Vantagens • Suporte à concorrência (no threads) • Hot Swapping Code nativo • Distribuída • Feita para ambientes Real Time • Libs de alta performance
  7. 7. Erlang - Desvantagens • Curva de aprendizado muito alta (paradigma funcional) • Dificuldade para criação de framework web • Code base complexo • Poucos desenvolvedores
  8. 8. Ruby - Vantagens • Curva de aprendizado baixa • Menos é mais • Comunidade de desenvolvedores grande
  9. 9. Ruby - Desvantagens • Desempenho • Pouca aceitação no mundo EE • Complexidade para desenvolver aplicações distribuídas
  10. 10. O que elas ganham? • Erlang • Produtividade • Facilidade em escrever testes • Ruby • Performance • Programação distribuída
  11. 11. na prática - live
  12. 12. Mas antes
  13. 13. Programação distribuída com Erlang • Clusters • Todo interpretador rodando é um nó. • Um nó confia plenamente no outro. • rpc call
  14. 14. Exemplo -module(math). -export([start/0,add/2]). start() -> register(?MODULE, spawn(fun() -> loop() end)). add(X,Y) -> ?MODULE ! {self(), add, X, Y}, receive {?MODULE, Response} -> Response end. loop() -> receive {From, add, X, Y} -> Sum = X + Y, From ! {?MODULE,Sum}, loop(); Any -> loop() end.
  15. 15. Exemplo Primeiro nó $ erlc math.erl $ erl -sname smath (smath@localhost) 1> math:start(). true (smath@localhost) 2> math:add(1, 2). 3 Segundo nó $ erl -sname cmath (cmath@localhost) 1> rpc:call(smath@localhost, math, add, [2, 3]). 4
  16. 16. voltando ao live
  17. 17. Como fizemos EPMD (Erlang Port Mapper Daemon)
  18. 18. Problemas identificados: • Fora do padrão Erlang • Manutenção, 3 pontos de mudança: • Nós Erlang • Servidor Erlang (API HTTP) • Aplicação Ruby on Rails
  19. 19. Uma forma melhor EPMD (Erlang Port Mapper Daemon)
  20. 20. Porque é melhor: • É mantido o padrão Erlang • Manutenção, 2 pontos de mudança: • Nós Erlangs • Aplicação Ruby on Rails
  21. 21. Mas como fazer? ?
  22. 22. rinterface • http://github.com/nofxx/rinterface • Lib de comunicação com nós erlang • EPMD (Erlang Port Mapper Daemon) • Criado por: Dave Bryson • Contribuição: nofxx e nuxlli
  23. 23. Como funciona? Em Erlang: rpc:call(smath@localhost, math, add, [10, 20]) Em Ruby: Erlang::Node.rpc(:smath,:math,:add, [10,20])
  24. 24. Status: • O que faz: • Chamadas rpc aos nós erlang • Tratamento de tipos: inteiros, flutuantes, atoms, tuplas, listas e strings • API simples para execução de chamadas • O que queremos: • Comportar como um nó Erlang • Facilities para rodar testes • DSL para chamadas e respostas
  25. 25. Testes em Erlang fib.erl -module(fib). -export([fib/1]). -include_lib("eunit/include/eunit.hrl"). fib(0) -> 1; fib(1) -> 1; fib(N) when N > 1 -> fib(N-1) + fib(N-2). fib_test_() -> [?_assert(fib(0) =:= 1), ?_assert(fib(1) =:= 1), ?_assert(fib(2) =:= 2), ?_assert(fib(3) =:= 3), ?_assert(fib(4) =:= 5), ?_assert(fib(5) =:= 8), ?_assertException(error, function_clause, fib(-1)), ?_assert(fib(31) =:= 2178309)].
  26. 26. Teste com rinterface (atualmente) fib_spec.rb require 'minitest/unit' require 'minitest/spec' require 'rinterface' MiniTest::Unit.autorun describe "Erlang Fib" do it "should " do assert_equal Erlang::Node.rpc(:sfib, :fib, :fib, [0]), [:ok, 1] assert_equal Erlang::Node.rpc(:sfib, :fib, :fib, [1]), [:ok, 1] assert_equal Erlang::Node.rpc(:sfib, :fib, :fib, [3]), [:ok, 3] assert_equal Erlang::Node.rpc(:sfib, :fib, :fib, [4]), [:ok, 5] assert_equal Erlang::Node.rpc(:sfib, :fib, :fib, [5]), [:ok, 8] assert_equal Erlang::Node.rpc(:sfib, :fib, :fib, [-1])[0], :badrpc assert_equal Erlang::Node.rpc(:sfib, :fib, :fib, [31]), [:ok, 2178309] end end
  27. 27. Teste com rinterface fib_spec.rb require 'minitest/unit' require 'minitest/spec' require 'rinterface/test' MiniTest::Unit.autorun describe "Erlang Fib" do before do FibMod = Erlang::Node.new(:sfib, :fib) end it "should " do assert_equal FibMod.fib(0), 1 assert_equal FibMod.fib(1), 1 assert_equal FibMod.fib(3), 3 assert_equal FibMod.fib(4), 5 assert_equal FibMod.fib(5), 8 assert_equal FibMod.fib(31), 2178309 assert_raises (Server::Badrpc) { assert_equal FibMod.fib(-1) } end end
  28. 28. Futuro - Client Node # Erlang::Node.new(:'node@localhost') ServerFib = Erlang::Node.new(:sfib) ServerFib.fib.fib(1) # 1 # Erlang::Node.new(:'node@localhost', :module) ModFib = Erlang::Node.new(:sfib, :fib) ModFib.fib(1) # 1
  29. 29. Futuro - Server Node Erlang::Mod.new :math do def add x, y x + y end end module Fib def fib(n) n < 2 ? n : fib(n-1) + fib(n-2) end end Erlang::Mod.new :fib => Fib
  30. 30. Perguntas? http://github.com/nofxx/rinterface http://nuxlli.com.br Éverton Ribeiro nuxlli@gmail.com
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×