Your SlideShare is downloading. ×
0
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Using Java from Ruby with JRuby IRB
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Using Java from Ruby with JRuby IRB

5,811

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

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,811
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
28
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

×