Using Java from Ruby with JRuby IRB

  • 5,486 views
Uploaded on

Slides to my talk at Richmond JUG + Central Virginia Ruby Enthusiasts' Group on June 14, 2011.

Slides to my talk at Richmond JUG + Central Virginia Ruby Enthusiasts' Group on June 14, 2011.

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
5,486
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
25
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Using Java from Ruby with JRuby IRB Hiro Asari Engine YardTuesday, June 14, 2011 1
  • 2. Why JRuby? • Interactive shell for looking around (without writing lots of code) • Testing frameworks • Ruby on RailsTuesday, June 14, 2011 2
  • 3. Assumptions • JRuby 1.6.2 (or 1.7.0.dev) • Java 6 (5 or later; 7 support in the works) • Ruby 1.8Tuesday, June 14, 2011 3Ruby syntax will be introduced as we go along.We do not use tricky syntax for this presentation
  • 4. Starting IRB jruby -S irb http://jruby.org/tryjrubyTuesday, June 14, 2011 4-S tells jruby to look for a script thus named in certain locations (in predefined order) andexecute it. (of course, the usual semantics re: scripts hold here.)"tryjruby" has some limitations w.r.t. Java integration (obviously)
  • 5. Loading Java support require javaTuesday, June 14, 2011 5Like Javas "import"
  • 6. Finding Java libraries # shell export CLASSPATH=… jruby -J-cp <classpath> … jruby -I lib … # in ruby $: << File.join(File.dirname(__FILE__), lib)Tuesday, June 14, 2011 6Java way, or Ruby way$: is the global for load paths where Ruby looks for libraries__FILE__ is a shorthand for "this file"
  • 7. Loading Java Library require foo.jar $CLASSPATH << foo.jarTuesday, June 14, 2011 7
  • 8. Importing Java class Bazz = Java::foo.bar.Bazz java_import foo.bar.Bazz java_import java.lang.SystemTuesday, June 14, 2011 8Ruby Class names are separated by namespaces, which is delimited by double colons.Javas built-in classes dont need to be referred to via a StringRuby class names are constants, the name of which must start with a capital letter.
  • 9. Referring to Java class bazz = Java::foo.bar.Bazz.new bazz = Bazz.new # Bazz is already importedTuesday, June 14, 2011 9No parentheses are necessary for Ruby methods, unless ambiguous otherwise
  • 10. Implementing Java interface class Foo include java.lang.Runnable def run puts "foo" end endTuesday, June 14, 2011 10JRuby works hard to make this simpler, but you get the idea
  • 11. Calling static methods Bazz.method(arg1, arg2) java.lang.System.currentTimeMillisTuesday, June 14, 2011 11This is similar to calling Rubys class methods
  • 12. Accessing static fields java.lang.System.out java.util.logging.Level::INFOTuesday, June 14, 2011 12Here, "." and "::" are interchangeable
  • 13. Type conversion object.to_java(foo.bar.Bazz) "Hello, Richmond!".to_java 5.to_java(java.lang.Double)Tuesday, June 14, 2011 13For the most part, JRuby converts types for you behind the scenes, so you don’t need toworry about this; but when you do, you can use this.Cannot be used for casting to primitives. Sorry.
  • 14. Invoking overloaded method // you need a cast in Java… java.lang.System.out.println((char)70) java.lang.System.out.java_send :println, [Java::char], 70Tuesday, June 14, 2011 14:println is an example of a Ruby symbol. It is a uniquely identifiable object within the Rubyruntime. "abc" and "abc" maybe two different Strings, but :abc is always unique.Notice how we specify the Java primitive "char"
  • 15. Complex example with Akka http://akka.io “ Akka is the event-driven, the nextand generation platform for scalable fault-tolerant architectures on the JVM ”Tuesday, June 14, 2011 15
  • 16. Akka tutorial Compute π using the Madhava-Leibniz seriesTuesday, June 14, 2011 16http://akka.io/docs/akka/1.1.2/intro/getting-started-first-java.html
  • 17. π = 4(1-1/3+1/5-1/7+1/9-1/11+1/13+…) = 4(1-1/3+1/5-1/7) + 4(1/9-1/11+1/13-1/15) + 4(1/17-1/19+1/21-1/23) +…Tuesday, June 14, 2011 17http://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80Does not converge very fast
  • 18. How does it work? Pi Calculate Work Work Master PiRouter Worker Result ResultTuesday, June 14, 2011 18Red: ActorsGreen: Messages (POJO)Akka actors invoke onReceive(Object) method when a message is sent. A router routesmessages between actors.
  • 19. Akka tutorial Code reading and demo Java source: http://bit.ly/lTClmr Ruby source: https://gist.github.com/1013227 (Without comments) (See also) https://gist.github.com/1013217Tuesday, June 14, 2011 19See handout
  • 20. Directory layout akka-tutorial-first ├── akka-reference.conf ├── akka.conf ├── lib/ │ ├── akka/ │ │ ├── akka-actor-1.1.2.jar │ │ ├── akka-actor-tests-1.1.2.jar │ │ ├── akka-http-1.1.2.jar │ │ ├── akka-remote-1.1.2.jar │ │ ├── akka-slf4j-1.1.2.jar │ │ ├── akka-stm-1.1.2.jar │ │ ├── akka-testkit-1.1.2.jar │ │ ├── akka-typed-actor-1.1.2.jar │ │ ├── aopalliance-1.0.jar │ │ ├── aspectwerkz-2.2.3.jar │ │ ├── commons-codec-1.4.jar │ │ ├── commons-io-2.0.1.jar │ │ ├── dispatch-json_2.9.0-0.8.1.jar │ │ ├── guice-all-2.0.jar │ │ ├── h2-lzf-1.0.jar │ │ ├── jackson-core-asl-1.7.1.jar │ │ ├── jackson-mapper-asl-1.7.1.jar │ │ ├── jsr250-api-1.0.jar │ │ ├── jsr311-api-1.1.jar │ │ ├── multiverse-alpha-0.6.2.jar │ │ ├── netty-3.2.3.Final.jar │ │ ├── objenesis-1.2.jar │ │ ├── protobuf-java-2.3.0.jar │ │ ├── sjson_2.9.0-0.11.jar │ │ └── slf4j-api-1.6.0.jar │ └── scala-library.jar ├── pi.pdf ├── pi.rb └── pi2.rb 2 directories, 31 filesTuesday, June 14, 2011 20http://akka.io/downloads/http://akka.io/downloads/akka-actors-1.1.2.zipMove config/* up 1 directory level
  • 21. Maven integration $ jruby -S gem install mvn:org.clojure:clojure -v 1.2.1 Successfully installed mvn:org.clojure:clojure-1.2.1-java 1 gem installedTuesday, June 14, 2011 21n.b.: artifacts with uncommon versions may not be found
  • 22. Maven integration require rubygems require java require maven/org.clojure/clojure java_import clojure.lang.Atom Atom.new(nil)Tuesday, June 14, 2011 22https://gist.github.com/660804"require maven/foo.bar/bazz.jar" doesnt work the first time.
  • 23. Testing frameworks in Ruby • RSpec • CucumberTuesday, June 14, 2011 23
  • 24. RSpec describe Game do describe "#score" do it "returns 0 for all gutter game" do game = Game.new 20.times { game.roll(0) } game.score.should == 0 end end endTuesday, June 14, 2011 24http://relishapp.com/rspec
  • 25. Cucumber # language: en Feature: Addition In order to avoid silly mistakes As a math idiot I want to be told the sum of two numbers Scenario Outline: Add two numbers Given I have entered <input_1> into the calculator And I have entered <input_2> into the calculator When I press <button> Then the result should be <output> on the screen Examples: | input_1 | input_2 | button | output | | 20 | 30 | add | 50 | | 2 | 5 | add | 7 | | 0 | 40 | add | 40 |Tuesday, June 14, 2011 25http://cukes.infohttps://github.com/cucumber/cucumber/blob/master/examples/i18n/en/features/addition.feature
  • 26. IDE • RubyMine • NetBeans (separate Ruby plugin for 7.0) • EclipseTuesday, June 14, 2011 26
  • 27. Other stuff • Ant integration • warbler (generate WAR files) • Ruboto (JRuby on Android)Tuesday, June 14, 2011 27
  • 28. Sponsored plug • JRuby on Rails hosting now available on Engine Yards AppCloudTuesday, June 14, 2011 28
  • 29. JRubyConf 2011 Washington, DC August 3-5 http://jrubyconf.comTuesday, June 14, 2011 29
  • 30. Thank you! @hiro_asari hasari@engineyard.com asari.ruby@gmail.com http://github.com/banzaimanTuesday, June 14, 2011 30
  • 31. Door prizes!Tuesday, June 14, 2011 31
  • 32. Door prizes!Tuesday, June 14, 2011 32