Connecting the Worlds of Java and Ruby with JRuby

  • 4,330 views
Uploaded on

Slides from Engine Yard/Terremark sponsored webinar "Connecting the worlds of Java and Ruby with JRuby".

Slides from Engine Yard/Terremark sponsored webinar "Connecting the worlds of Java and Ruby with JRuby".

More in: Technology
  • 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
4,330
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
72
Comments
0
Likes
4

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. ConnectingJava and RubyNick Sieger :: December 14, 2010To begin at 10 AM Pacific.Audio or visual issues?Call 24/7 WebEx Tech Support (866) 229-3239Slides: http://j.mp/ey-jruby-connecting
  • 2. ConnectingJava and RubyNick Sieger :: December 14, 2010
  • 3. JRuby: Bridge Between Two Worlds http://www.flickr.com/photos/hb2/288721287/
  • 4. Bridges facilitate... Cross-Movement Collaboration Trading pollination
  • 5. Bridge from Ruby to Javahttp://www.flickr.com/photos/orbitaljoe/4038901965/ http://www.flickr.com/photos/the_rev/2295096211/
  • 6. Bridge from Java to Ruby http://www.flickr.com/photos/design-dog/1268749868/
  • 7. Bridge from Enterprise to Cloud http://www.flickr.com/photos/nzdave/347532488/ http://www.flickr.com/photos/ancawonka/65927497/
  • 8. Bridge from Legacy to Greenfield http://www.flickr.com/photos/cobalt/318394059/ http://www.flickr.com/photos/13010608@N02/2441101211/
  • 9. RubyDynamic language of the cloud
  • 10. A word about scripting... It’s for kiddies.
  • 11. Ruby: Dynamic, Object-Orientedhttp://www.flickr.com/photos/listenmissy/4869202176/
  • 12. Ruby: Duck-Typingdef area(width = 10, height = 2 * width) width * heightendp area # => 200p area 5 # => 50p area 5, 20 # => 100p area "10", 4 # => ?
  • 13. Ruby: Duck-Typingp area "10", 4 # => "10101010"# From Ruby API docs:# String#*(num)## Returns a new String containing num copies of# the receiver.## "Ho! " * 3 #=> "Ho! Ho! Ho! "area true, false # => NoMethodError: undefined method `* for # true:TrueClass
  • 14. Ruby: Flexible Syntaxdef set_options(env, opts)endset_options(:production, {"caching" => "on", "debug" => "false"})set_options(:production, "caching" => "on", "debug" => "false")set_options :production, {"caching" => "on", "debug" => "false"}set_options :production, "caching" => "on", "debug" => "false"
  • 15. Ruby: Blocks list = [1, 2, 3, 4] list.each {|n| puts n } Ruby list.each do |n| puts n end List<Integer> list = Arrays.asList(1, 2, 3, 4); Java for (Integer n : list) { System.out.println(n); }
  • 16. Ruby: Blocks list.shuffle! # => [3, 1, 4, 2] Ruby p list.sort {|a, b| b <=> a } # => [4, 3, 2, 1] Collections.shuffle(list); Collections.sort(list, new Comparator<Integer>() { public int compare(Integer a, Integer b) { Java return b > a ? 1 : (b < a ? -1 : 0); } }); System.out.println(list);
  • 17. Ruby: Blocks File.open(__FILE__) do |file| file.each_line do |line| Ruby puts line end end BufferedReader file = new BufferedReader(new FileReader("Blocks.java")); try { String line; while ((line = buf.readLine()) != null) { Java System.out.println(line); } } finally { file.close(); }
  • 18. Ruby: Open Classes msg = "Scramble this so you cant read it!" msg.rot13! # => NoMethodError: undefined method `rot13! for # "Scramble this so you cant read it!":String
  • 19. Ruby: Open Classes class String def rot13! 0.upto(length - 1) do |i| case self[i] when ?a..?z self[i] = ?a + ((self[i] - ?a) + 13) % 26 when ?A..?Z self[i] = ?A + ((self[i] - ?A) + 13) % 26 end end self end end
  • 20. Ruby: Open Classes puts msg.rot13! # => "Fpenzoyr guvf fb lbh pnag ernq vg!" puts msg.rot13! # => "Scramble this so you cant read it!"
  • 21. Ruby: Interactive $ irb irb(main):001:0> list = [1, 2, 3, 4] => [1, 2, 3, 4] irb(main):002:0> list.shuffle.map {|x| x + rand(10)}.sort => [6, 7, 11, 13] irb(main):003:0> list => [1, 2, 3, 4]
  • 22. Ruby: Interactive irb(main):004:0> require irb/completion => true irb(main):005:0> list.<TAB> Display all 138 possibilities? (y or n) irb(main):005:0> list.d<TAB> list.delete list.delete_at list.delete_if list.detect list.display list.drop list.drop_while list.dup
  • 23. Ruby: Developer Happiness =
  • 24. RubyGems
  • 25. Testing in RubyRSpechttp://rspec.info/ http://cukes.info/
  • 26. Ruby: Summary • Organize code the way you want Dynamic and Open • Associate behavior with the correct class • No more “Util” classes • Express code intent succinctly Flexible • Strip away unnecessary ceremony • Try out code and get instant feedback Interactive • Learn by doing • Productivity gains lead to increased pleasure Happy • Enjoy crafting clean code
  • 27. RailsDynamic framework of the cloud
  • 28. Rails: Opinionated Framework Request- Convention Defaults Place for based over with everything MVC Configuration Choices
  • 29. Rails: Place for All Your Code application code configuration & environments routes (URL structure) database migrations static assets (images, stylesheets, javascript) tests
  • 30. Rails: Request-based MVC Request Routing Controller Model Action Action ActiveRecord Dispatch Controller View Database Response ActionView
  • 31. Rails: Convention over Configuration URL GET /people resources :people Routing #=> people#index # app/controllers/people_controller.rb class PeopleController < ApplicationController def index Controller @people = Person.all end end # app/models/person.rb Model class Person < ActiveRecord::Base end View app/views/people/index.html.erb
  • 32. Rails: Defaults with Choices Default Alternatives DataMapper, MongoMapper,ORM ActiveRecord Sequel, Any object with ActiveModel HAML, Builder XML,View Templates ERb Markaby, RedCloth (Textile), BlueCloth (Markdown)JavaScript Framework Prototype jQuery MySQL, PostgreSQL, Oracle,Database SQLite3 more via JRuby + JDBCTest Framework Test::Unit RSpec, Cucumber
  • 33. Why Rails? COMPARING JVM WEB FRAMEWORKS Matt Raible http://raibledesigns.com Images by Stuck in Customs - http://www.flickr.com/photos/stuckincustoms © 2010, Raible Designs © 2010 Raible Designs http://j.mp/raible-jvm-frameworks
  • 34. Why Rails?Consider... Information Available Project Development Books, skilled maturity speed Docs developers
  • 35. Installing Rails INSTALL gem install rails
  • 36. Rails: New Application$ rails new coolapp -m http://jruby.org create create README create Rakefile ...
  • 37. Rails: Dependencies with Bundler $ cd coolapp $ bundle install Fetching source index for http://rubygems.org/ Using rake (0.8.7) Using abstract (1.0.0) ... Using rails (3.0.3) Your bundle is complete!
  • 38. Rails: Generate Scaffolding$ rails generate scaffold person email:string password:string invoke active_record create db/migrate/20101214020707_create_people.rb create app/models/person.rb invoke test_unit create test/unit/person_test.rb create test/fixtures/people.yml route resources :people ...
  • 39. Rails: Migrate Database$ rake db:migrate(in /Users/nicksieger/Projects/rails/coolapp)== CreatePeople: migrating ===========================-- create_table(:people) -> 0.0040s -> 0 rows== CreatePeople: migrated (0.0040s) ==================
  • 40. Rails: Start Dev Server$ rails server=> Booting WEBrick=> Rails 3.0.3 application starting in development on http://0.0.0.0:3000=> Call with -d to detach=> Ctrl-C to shutdown server[2010-12-13 20:11:28] INFO WEBrick 1.3.1[2010-12-13 20:11:28] INFO ruby 1.8.7 (2010-12-10) [java][2010-12-13 20:11:28] INFO WEBrick::HTTPServer#start: pid=21022 port=3000
  • 41. Rails: First Page
  • 42. Rails: Console$ rails consoleLoading development environment (Rails 3.0.3)irb(main):001:0> Person.create :email => "nsieger@engineyard.com", :password => "rails"=> #<Person id: 1, email: "nsieger@engineyard.com", password: "rails", created_at:"2010-12-14 02:21:11", updated_at: "2010-12-14 02:21:11">
  • 43. Real-world Rails
  • 44. https://joindiaspora.com/ https://github.com/diaspora/diaspora
  • 45. Routes # config/routes.rb (abbreviated) Diaspora::Application.routes.draw do # ... resources :photos, :except => [:index] #... root :to => home#show end
  • 46. Rails: RESTful RoutesVerb Path Action Used for display a list of allGET /photos index photos return an HTML form forGET /photos/new new creating a new photoPOST /photos create create a new photoGET /photos/:id show display a specific photo return an HTML form forGET /photos/:id/edit edit editing a photoPUT /photos/:id update update a specific photoDELETE /photos/:id destroy delete a specific photo
  • 47. Rails: RESTful RoutesVerb Path Action Used for display a list of allGET /photos index :except => [:index] photos return an HTML form forGET /photos/new new creating a new photoPOST /photos create create a new photoGET /photos/:id show display a specific photo return an HTML form forGET /photos/:id/edit edit editing a photoPUT /photos/:id update update a specific photoDELETE /photos/:id destroy delete a specific photo
  • 48. Controller # app/controllers/photos_controller.rb (abbr.) class PhotosController < ApplicationController respond_to :html respond_to :json, :only => :show def show @photo = current_user.find_visible_post_by_id params[:id] # ... respond_with @photo end end
  • 49. Model # app/models/photo.rb (abbreviated) class Photo < Post include MongoMapper::Document require carrierwave/orm/mongomapper mount_uploader :image, ImageUploader key :caption, String key :status_message_id, ObjectId belongs_to :status_message validate :ownership_of_status_message before_destroy :ensure_user_picture end
  • 50. View Rendering photo list
  • 51. HAML View -# app/views/people/show.html.haml (abbr.) .span-15.last %h4 = t(_photos) = render photos/index, :photos => @posts -# app/views/photos/_index.html.haml (abbr.) #thumbnails.span-15.last - for photo in photos = link_to photo.url(:thumb_medium), photo_path(photo)
  • 52. Rendered HTML View<div class=span-15 last> <h4> photos </h4> <div class=span-15 last id=thumbnails> <a href="/photos/4d0694d..."><img src="/uploads/images/..." /></a> <a href="/photos/4d06949..."><img src="/uploads/images/..." /></a> <a href="/photos/4d068b2..."><img src="/uploads/images/..." /></a> </div></div>
  • 53. Rails: Summary • No wasting time deciding where to put something Place for Everything & • Shared conventions get team members up to Conventions speed quickly • No wasted effort getting started Defaults with Choices • Easy to add/change components later • Development: “code and reload” Environments • Test: disposable data • Production: cache and optimize • Mature framework, frequent updates Community • Rich catalog of plugins • Rails programmers are in-demand
  • 54. Dynamic toolkit of the cloud
  • 55. Getting JRuby OS How to get •http://jruby.org/download All •Ruby Version Manager (RVM) http://rvm.beginrescueend.com/ Windows •Installer from http://jruby.org/download Mac OS X •Homebrew - brew install jruby •MacPorts - port install jruby Ubuntu/Debian •apt-get install jruby (may not be up-to-date, may need multiverse) Fedora/RHEL/Centos •yum install jruby (may not be up-to-date) Gentoo •emerge dev-java/jruby (may be old) http://wiki.jruby.org/JRubyDistributions
  • 56. Using JRuby $ jruby script.rb Run a standalone script $ jruby -S gem ... Run Rubygems, IRB, or an installed gem (e.g, rake or rails) $ jruby -J-Xmx1G ... Pass arguments to the JVM $ jruby --help Get help $ jruby --properties
  • 57. Access Java from JRuby require java require rubygems require flying_saucer java_import org.xhtmlrenderer.pdf.ITextRenderer document = <<-HTML <html><body><h1>Hello Flying Saucer!</h1></body></html> HTML File.open("doc.pdf", "wb") do |out| renderer = ITextRenderer.new renderer.set_document_from_string document renderer.layout renderer.create_pdf out.to_outputstream end system("open doc.pdf") Tip: jruby -S gem install flying_saucer to try this example.
  • 58. Access Java from JRuby $ jruby saucer.rb
  • 59. Access Java from JRuby require java Loads Java Integration
  • 60. Access Java from JRuby require rubygems require flying_saucer Loads Flying Saucer classes from Rubygems
  • 61. Access Java from JRuby java_import org.xhtmlrenderer.pdf.ITextRenderer Imports ITextRenderer class
  • 62. Access Java from JRuby Ruby renderer = ITextRenderer.new Java ITextRenderer renderer = new ITextRenderer(); Create new ITextRenderer
  • 63. Access Java from JRuby Ruby renderer.set_document_from_string document Java renderer.setDocumentFromString(document); Set up the document
  • 64. Access Java from JRuby File.open("doc.pdf", "wb") do |out| ... renderer.create_pdf out.to_outputstream end Create PDF with explicit conversion from Ruby IO to Java OutputStream
  • 65. Integrating into Rails Mime::Type.register application/pdf, :pdf Register PDF mime type in Rails
  • 66. Integrating into Railsclass PhotosController private def pdf_to_string io = StringIO.new content = render_to_string renderer = ITextRenderer.new renderer.set_document_from_string(content) renderer.layout renderer.create_pdf(io.to_outputstream) io.string endend
  • 67. Integrating into Railsclass PhotosController def index @photos = Photos.all respond_to do |format| format.html format.pdf do send_data pdf_to_string, :filename => pdf_name + ".pdf", :type => application/pdf, :disposition => inline end end endend
  • 68. Integrating into Rails http://example.com/photos HTML view of photo listing http://example.com/photos.pdf Inline PDF of photo listing
  • 69. Rails 3 and JRubyhttp://weblog.rubyonrails.org/2010/8/29/rails-3-0-it-s-done
  • 70. http://ci.jruby.org/
  • 71. Rails Performancehttp://github.com/wycats/rails-simple-benches rails-simple N = 10,000 rails-simple N = 10,00015000 120000 ruby 1.9.2 ruby 1.9.212500 jruby-head client 100000 jruby-head client10000 jruby-head server 80000 jruby-head server7500 600005000 400002500 20000 0 0 partial_100 coll_100 uniq_100 diff_100 ad x 1 al 10 10 de e_ rti _ ll_ he at al pa in co er rti pl ov pa m te
  • 72. JRuby Deployment Ruby servers WAR files PaaS WEBrick GlassFish EY AppCloud GF Gem Tomcat AppEngine Trinidad JBoss SteamCannon
  • 73. Warbler INSTALL gem install warbler• Create a Java EE .war file from a Rails application• “Looks like Java” to the ops staff deploy Rails warble app.war to java app appserver
  • 74. JRuby-Rack Servlet Filter /home.jsp: Servlet JSP dispatch pass-thru /home.jsp /home/index: JRuby-Rack 404 RackFilter doFilter On 404: /home/index Rails or any /home/index: Rack-based Rails application Home- Controller
  • 75. Hybrid Rails/Java Webapp ActionDispatch Rails MVC ActionController/ActionView ActiveModel Java JDBC SOAP POJOs DataSource interface
  • 76. Tools http://www.jetbrains.com/ruby/http://redcareditor.com/ http://netbeans.org/
  • 77. Enterprise SoftwareEvolving and adapting long-running projects with legacy codebases
  • 78. http://en.wikipedia.org/wiki/File:Sagrada_Familia_01.jpgSagrada Família, Barcelona, Spain
  • 79. http://www.flickr.com/photos/mgrenner57/263392884/ 1970s early 2000shttp://www.flickr.com/photos/gonzalvo/4257293127/
  • 80. http://www.flickr.com/photos/koocheekoo/38407225/ http://www.flickr.com/photos/27649557@N07/5000528445/ passion facade nativity facade scaffolded interior http://www.flickr.com/photos/gpaumier/446059442/ http://www.flickr.com/photos/ilm/12831049/
  • 81. http://en.wikipedia.org/wiki/File:Ryugyong_Hotel_October_2010.jpg 2010 Ryugyuong Hotel, North Korea 2005http://en.wikipedia.org/wiki/File:Ryugyong_Hotel_-_May_2005.JPG
  • 82. http://en.wikipedia.org/wiki/File:ExteiorShearTruss.jpg seismic retrofithttp://en.wikipedia.org/wiki/File:ExtReenfDetail.jpg
  • 83. http://en.wikipedia.org/wiki/File:Szkieleteor_in_krakow.JPG Szkieletor, Kraków, Poland http://www.flickr.com/photos/bazylek/3194294047/
  • 84. Built Environment Metaphor Metaphor Use Ruby, JRuby, and Rails to... • Build a new facade faster with modern technology Sagrada Familia • Scaffold portions of the application during refactoring • Revive a languishing project by putting a new face on it Ryugyong Hotel • Reinforce business rules with a DSL Seismic retrofit • Harden security around an existing application Szkieletor • Find novel uses for otherwise abandoned code
  • 85. JRuby Stories: LinkedIn Signal• High-volume social networking application• http://www.infoq.com/articles/linkedin-scala-jruby-voldemort• http://blog.linkedin.com/2010/09/29/linkedin-signal/
  • 86. JRuby Stories: Tracker• Protecting the world from terrorists!• Export Control workflow system• Used by US State dept. and other countries• JRuby, Rails and legacy Java• http://trackernet.org• Making the World Safe For Democracy • David Bock, Arild Shirazi • http://vimeo.com/16270284
  • 87. JRuby Events • JRubyConf 2009 • free event following RubyConf • ~200 attendees • JRubyConf 2010 • standalone conference • 150 attendees • JRuby meetups in SF Bay Area • http://www.meetup.com/SF-Bay- Area-JRuby-Meetup/
  • 88. Using JRuby
  • 89. JRuby on AppCloud JRuby + AppCloud
  • 90. Resources• Contact me: Nick Sieger – nsieger@engineyard.com• These slides: http://j.mp/ey-jruby-connecting• JRuby.org – http://jruby.org/• JRubyConf 2010 videos • http://j.mp/jrubyconf-2010-videos• EY Blog: Resources for Getting Started with Ruby on Rails • http://j.mp/ey-getting-started-rails• Rails for Zombies • http://railsforzombies.org/
  • 91. Zero to Rails 3Virtual TrainingJanuary 24-27, 2011 http://www.eventbee.com/view/zero-to-rails-3training@engineyard.comImmediately following (optional):Engine Yard AppCloud Demowith Danish Khan15-20 minute overview of AppCloud