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

jRuby para sua diversão e lucro

jRuby para sua diversão e lucro

Por que é relevante saber um pouco sobre jRuby? Alguns exemplos práticos do uso de jRuby no dia-a-dia de um programador Java, porque usar jRuby pode ser divertido e ainda lucrativo.

Kristopher Murata

November 24, 2012
Tweet

More Decks by Kristopher Murata

Other Decks in Programming

Transcript

  1. •jRuby é Ruby compilado para Bytecode que roda na JVM

    •jRuby está na versão 1.7 •jRuby tem +10 anos (começou em 2001) Saturday, November 24, 12
  2. PHP <?php echo "<textarea name='mydata'>\n"; echo htmlspecialchars($data)."\n"; echo "</textarea>"; for

    ($i = 1; $i <= 10; $i++) { echo "<p>YAY Tô no loop \o/</p>"; } ?> Saturday, November 24, 12
  3. Assembly mov cx, 0 ; cx stores number of characters

    mov bx, offset message ; store address of message in bx begin: cmp byte ptr [bx], 0 ; is this end of string? je fin ; if yes goto Finished inc cx ; cx = cx + 1 inc bx ; bx points to next character jmp begin Saturday, November 24, 12
  4. Assembly mov cx, 0 ; cx stores number of characters

    mov bx, offset message ; store address of message in bx begin: cmp byte ptr [bx], 0 ; is this end of string? je fin ; if yes goto Finished inc cx ; cx = cx + 1 inc bx ; bx points to next character jmp begin int stringlength = string.length(); Java Saturday, November 24, 12
  5. Recursividade public class Fibonacci { public static long fib(int n)

    { if (n <= 1) return n; else return fib(n-1) + fib(n-2); } public static void main(String[] args) { int N = Integer.parseInt(args[0]); for (int i = 1; i <= N; i++) System.out.println(i + ": " + fib(i)); } } Saturday, November 24, 12
  6. require 'java' java_hashmap = java.util.HashMap.new java_hashmap.put(:foo, "bar") puts java_hashmap.get(:foo) #

    => bar puts java_hashmap[:foo] # => bar puts java_hashmap.java_class # => java.util.HashMap Saturday, November 24, 12
  7. require "java" java_import javax.swing.JFrame java_import javax.swing.JButton java_import javax.swing.JOptionPane class HelloWorld

    < JFrame def initialize super "Example" setSize(150, 100) setDefaultCloseOperation(JFrame::EXIT_ON_CLOSE) setLocationRelativeTo(nil) button = JButton.new("Say Hello") add(button) button.addActionListener do |e| JOptionPane.showMessageDialog(nil, "Hello World") end setVisible(true) end end Saturday, November 24, 12
  8. def fib(n) n < 2 ? n : fib(n-1) +

    fib(n-2) end start = Time.now 1.upto(10).map do |n| " Thread.new do " " puts "Thread #{n}: #{fib(32)}" " end end puts "Time: #{Time.now - start}" Saturday, November 24, 12
  9. class MyMath def sum(a, b) puts a + b end

    end Saturday, November 24, 12
  10. class MyMath def sum(a, b) puts a + b end

    end jrubyc --javac ~/dev/jruby/rubyj/ my_math.rb Saturday, November 24, 12
  11. class MyMath def sum(a, b) puts a + b end

    end jrubyc --javac ~/dev/jruby/rubyj/ my_math.rb ~> ls ~/dev/jruby/rubyj MyMath.class MyMath.java my_math.rb Saturday, November 24, 12
  12. class MyMath def sum(a, b) puts a + b end

    end jrubyc --javac ~/dev/jruby/rubyj/ my_math.rb ~> ls ~/dev/jruby/rubyj MyMath.class MyMath.java my_math.rb java -cp ~/.rvm/rubies/jruby-1.7.0/ lib/jruby.jar:. MyMath Saturday, November 24, 12
  13. public Object sum(Object a, Object b) { IRubyObject ruby_a =

    JavaUtil.convertJavaToRuby(__ruby__, a); IRubyObject ruby_b = JavaUtil.convertJavaToRuby(__ruby__, b); IRubyObject ruby_result = RuntimeHelpers.invoke( __ruby__.getCurrentConte xt(), this, "sum", ruby_a, ruby_b); return (Object)ruby_result.toJava(Object.class); } Saturday, November 24, 12
  14. require 'java' java_require 'my_math' class MyMath java_signature 'void sum(int, int)'

    " def sum(a, b) puts a + b end end static { __ruby__.getLoadService().lockAndRequire("my_math"); ... } public void sum(int a, int b) { ... } Saturday, November 24, 12
  15. require 'java' java_require 'my_math' class MyMath java_signature 'void main(String[])' def

    self.main(args) sum(args[0], args[1]) end java_signature 'void sum(int, int)' def self.sum(a, b) puts a + b end end Saturday, November 24, 12
  16. require 'java' java_require 'my_math' class MyMath java_signature 'void main(String[])' def

    self.main(args) sum(args[0], args[1]) end java_signature 'void sum(int, int)' def self.sum(a, b) puts a + b end end Saturday, November 24, 12
  17. require 'java' java_require 'my_math' class MyMath java_signature 'void main(String[])' def

    self.main(args) sum(args[0], args[1]) end java_signature 'void sum(int, int)' def self.sum(a, b) puts a.to_i + b.to_i end end Saturday, November 24, 12
  18. Nosso próximo projeto será em Ruby on Rails, porque é

    10x mais produtivo que Java! Saturday, November 24, 12
  19. A equipe precisa de treinamento, a curva de aprendizagem é

    alta e o prazo é curto. Isso é inviável. Saturday, November 24, 12
  20. Ok, então vamos contratar uma nova equipe de Rails Rockstars

    (Jedis, Ninjas, Milagreiros...) e você vai ficar alocado na equipe Rails. Saturday, November 24, 12
  21. Programador, lembra do SysJava? Precisamos daqueles relatórios no nosso outro

    projeto SysRails. Deve ser coisa rápida, só copiar. Depois de um mês... Saturday, November 24, 12
  22. •Portar toda a lógica do SysJava para o SysRails. •Fazer

    uma API (REST/SOA) no SysJava Saturday, November 24, 12
  23. •Portar toda a lógica do SysJava para o SysRails. •Fazer

    uma API (REST/SOA) no SysJava •jRuby for the rescue! Saturday, November 24, 12
  24. Can we has Cloud? •Heroku (Buildpack) •EngineYard (Trinidad) •OpenShift (Torquebox)

    •CloudBees (Warbler) •Google AppEngine Saturday, November 24, 12