ConnectingJava and RubyNick Sieger :: December 14, 2010To begin at 10 AM Pacific.Audio or visual issues?Call 24/7 WebEx Tec...
ConnectingJava and RubyNick Sieger :: December 14, 2010
JRuby: Bridge Between Two Worlds                 http://www.flickr.com/photos/hb2/288721287/
Bridges facilitate...                 Cross-Movement                      Collaboration   Trading                pollination
Bridge from Ruby to Javahttp://www.flickr.com/photos/orbitaljoe/4038901965/   http://www.flickr.com/photos/the_rev/2295096211/
Bridge from Java to Ruby             http://www.flickr.com/photos/design-dog/1268749868/
Bridge from Enterprise to Cloud http://www.flickr.com/photos/nzdave/347532488/   http://www.flickr.com/photos/ancawonka/6592...
Bridge from Legacy to Greenfield http://www.flickr.com/photos/cobalt/318394059/   http://www.flickr.com/photos/13010608@N02/2...
RubyDynamic language of the cloud
A word about scripting...   It’s for kiddies.
Ruby: Dynamic,   Object-Orientedhttp://www.flickr.com/photos/listenmissy/4869202176/
Ruby: Duck-Typingdef area(width = 10, height = 2 * width)  width * heightendp   area           #   =>   200p   area 5     ...
Ruby: Duck-Typingp area "10", 4 # => "10101010"# From Ruby API docs:#   String#*(num)##   Returns a new String containing ...
Ruby: Flexible Syntaxdef set_options(env, opts)endset_options(:production, {"caching" => "on", "debug" => "false"})set_opt...
Ruby: Blocks         list = [1, 2, 3, 4]         list.each {|n| puts n }  Ruby         list.each do |n|           puts n  ...
Ruby: Blocks         list.shuffle!           # => [3, 1, 4, 2]  Ruby         p list.sort {|a, b| b <=> a }           # => ...
Ruby: Blocks         File.open(__FILE__) do |file|           file.each_line do |line|  Ruby       puts line           end ...
Ruby: Open Classes     msg = "Scramble this so you cant read it!"     msg.rot13!       # => NoMethodError: undefined metho...
Ruby: Open Classes     class String       def rot13!         0.upto(length - 1) do |i|           case self[i]           wh...
Ruby: Open Classes       puts msg.rot13!         # => "Fpenzoyr guvf fb lbh pnag ernq vg!"       puts msg.rot13!         #...
Ruby: Interactive   $ irb   irb(main):001:0> list = [1, 2, 3, 4]   => [1, 2, 3, 4]   irb(main):002:0> list.shuffle.map {|x...
Ruby: Interactive   irb(main):004:0> require irb/completion   => true   irb(main):005:0> list.<TAB>   Display all 138 poss...
Ruby: Developer Happiness               =
RubyGems
Testing in RubyRSpechttp://rspec.info/   http://cukes.info/
Ruby: Summary                      • Organize code the way you want   Dynamic and Open   • Associate behavior with the cor...
RailsDynamic framework of the cloud
Rails: Opinionated Framework              Request-     Convention    Defaults  Place for               based          over...
Rails: Place for All Your Code                           application code                          configuration & environm...
Rails: Request-based MVC   Request   Routing    Controller                                        Model              Actio...
Rails: Convention over Configuration  URL          GET /people               resources :people  Routing                 #=>...
Rails: Defaults with Choices                       Default        Alternatives                                      DataMa...
Why Rails?              COMPARING JVM WEB                 FRAMEWORKS                                 Matt Raible          ...
Why Rails?Consider...              Information                  Available Project                    Development          ...
Installing Rails INSTALL   gem install rails
Rails: New Application$ rails new coolapp -m http://jruby.org      create      create README      create Rakefile      ...
Rails: Dependencies with Bundler $ cd coolapp $ bundle install Fetching source index for http://rubygems.org/ Using rake (...
Rails: Generate Scaffolding$ rails generate scaffold person email:string password:string      invoke active_record      cr...
Rails: Migrate Database$ rake db:migrate(in /Users/nicksieger/Projects/rails/coolapp)== CreatePeople: migrating ==========...
Rails: Start Dev Server$ rails server=> Booting WEBrick=> Rails 3.0.3 application starting in development on http://0.0.0....
Rails: First Page
Rails: Console$ rails consoleLoading development environment (Rails 3.0.3)irb(main):001:0> Person.create :email => "nsiege...
Real-world  Rails
https://joindiaspora.com/                            https://github.com/diaspora/diaspora
Routes         # config/routes.rb (abbreviated)         Diaspora::Application.routes.draw do           # ...           res...
Rails: RESTful RoutesVerb        Path               Action    Used for                                         display a l...
Rails: RESTful RoutesVerb        Path                   Action    Used for                                             dis...
Controller # app/controllers/photos_controller.rb (abbr.) class PhotosController < ApplicationController   respond_to :htm...
Model # app/models/photo.rb (abbreviated) class Photo < Post   include MongoMapper::Document   require carrierwave/orm/mon...
View       Rendering photo list
HAML View  -# app/views/people/show.html.haml (abbr.)  .span-15.last    %h4      = t(_photos)    = render photos/index, :p...
Rendered HTML View<div class=span-15 last>  <h4>    photos  </h4>  <div class=span-15 last id=thumbnails>    <a href="/pho...
Rails: Summary                             • No wasting time deciding where to put something    Place for Everything &    ...
Dynamic toolkit of the cloud
Getting JRuby  OS                   How to get                       •http://jruby.org/download  All                  •Rub...
Using JRuby $ jruby script.rb      Run a standalone script $ jruby -S gem ...     Run Rubygems, IRB, or an installed      ...
Access Java from JRuby   require java   require rubygems   require flying_saucer   java_import org.xhtmlrenderer.pdf.IText...
Access Java from JRuby  $ jruby saucer.rb
Access Java from JRuby                require java                                 Loads Java Integration
Access Java from JRuby           require rubygems           require flying_saucer                 Loads Flying Saucer clas...
Access Java from JRuby java_import org.xhtmlrenderer.pdf.ITextRenderer                           Imports ITextRenderer class
Access Java from JRuby  Ruby   renderer = ITextRenderer.new  Java   ITextRenderer renderer = new ITextRenderer();         ...
Access Java from JRuby  Ruby   renderer.set_document_from_string document  Java   renderer.setDocumentFromString(document)...
Access Java from JRuby        File.open("doc.pdf", "wb") do |out|          ...          renderer.create_pdf out.to_outputs...
Integrating into Rails         Mime::Type.register application/pdf, :pdf                               Register PDF mime t...
Integrating into Railsclass PhotosController  private  def pdf_to_string    io = StringIO.new    content = render_to_strin...
Integrating into Railsclass PhotosController  def index    @photos = Photos.all    respond_to do |format|      format.html...
Integrating into Rails  http://example.com/photos       HTML view of photo listing  http://example.com/photos.pdf   Inline...
Rails 3 and JRubyhttp://weblog.rubyonrails.org/2010/8/29/rails-3-0-it-s-done
http://ci.jruby.org/
Rails Performancehttp://github.com/wycats/rails-simple-benches                   rails-simple N = 10,000                  ...
JRuby Deployment Ruby servers      WAR files       PaaS  WEBrick          GlassFish   EY AppCloud  GF Gem            Tomcat...
Warbler               INSTALL     gem install warbler• Create a Java EE .war file from a Rails application• “Looks like Jav...
JRuby-Rack Servlet Filter                                            /home.jsp:                               Servlet     ...
Hybrid Rails/Java Webapp                      ActionDispatch      Rails      MVC       ActionController/ActionView        ...
Tools                           http://www.jetbrains.com/ruby/http://redcareditor.com/                                    ...
Enterprise    SoftwareEvolving and adapting long-running  projects with legacy codebases
http://en.wikipedia.org/wiki/File:Sagrada_Familia_01.jpgSagrada Família, Barcelona, Spain
http://www.flickr.com/photos/mgrenner57/263392884/                                           1970s   early 2000shttp://www....
http://www.flickr.com/photos/koocheekoo/38407225/                                                                          ...
http://en.wikipedia.org/wiki/File:Ryugyong_Hotel_October_2010.jpg               2010         Ryugyuong Hotel,         Nort...
http://en.wikipedia.org/wiki/File:ExteiorShearTruss.jpg                                                                   ...
http://en.wikipedia.org/wiki/File:Szkieleteor_in_krakow.JPG                                                               ...
Built Environment Metaphor   Metaphor          Use Ruby, JRuby, and Rails to...                     • Build a new facade f...
JRuby Stories: LinkedIn Signal• High-volume social networking application• http://www.infoq.com/articles/linkedin-scala-jr...
JRuby Stories: Tracker• Protecting the world from terrorists!• Export Control workflow system• Used by US State dept. and o...
JRuby Events               • JRubyConf 2009                  • free event following RubyConf                  • ~200 atten...
Using JRuby
JRuby on AppCloud                     JRuby +                    AppCloud
Resources• Contact me: Nick Sieger – nsieger@engineyard.com• These slides: http://j.mp/ey-jruby-connecting• JRuby.org – ht...
Zero to Rails 3Virtual TrainingJanuary 24-27, 2011 http://www.eventbee.com/view/zero-to-rails-3training@engineyard.comImme...
Upcoming SlideShare
Loading in...5
×

Connecting the Worlds of Java and Ruby with JRuby

5,527

Published on

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

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,527
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
74
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Connecting the Worlds of Java and Ruby with JRuby

  1. 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. 2. ConnectingJava and RubyNick Sieger :: December 14, 2010
  3. 3. JRuby: Bridge Between Two Worlds http://www.flickr.com/photos/hb2/288721287/
  4. 4. Bridges facilitate... Cross-Movement Collaboration Trading pollination
  5. 5. Bridge from Ruby to Javahttp://www.flickr.com/photos/orbitaljoe/4038901965/ http://www.flickr.com/photos/the_rev/2295096211/
  6. 6. Bridge from Java to Ruby http://www.flickr.com/photos/design-dog/1268749868/
  7. 7. Bridge from Enterprise to Cloud http://www.flickr.com/photos/nzdave/347532488/ http://www.flickr.com/photos/ancawonka/65927497/
  8. 8. Bridge from Legacy to Greenfield http://www.flickr.com/photos/cobalt/318394059/ http://www.flickr.com/photos/13010608@N02/2441101211/
  9. 9. RubyDynamic language of the cloud
  10. 10. A word about scripting... It’s for kiddies.
  11. 11. Ruby: Dynamic, Object-Orientedhttp://www.flickr.com/photos/listenmissy/4869202176/
  12. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 23. Ruby: Developer Happiness =
  24. 24. RubyGems
  25. 25. Testing in RubyRSpechttp://rspec.info/ http://cukes.info/
  26. 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. 27. RailsDynamic framework of the cloud
  28. 28. Rails: Opinionated Framework Request- Convention Defaults Place for based over with everything MVC Configuration Choices
  29. 29. Rails: Place for All Your Code application code configuration & environments routes (URL structure) database migrations static assets (images, stylesheets, javascript) tests
  30. 30. Rails: Request-based MVC Request Routing Controller Model Action Action ActiveRecord Dispatch Controller View Database Response ActionView
  31. 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. 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. 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. 34. Why Rails?Consider... Information Available Project Development Books, skilled maturity speed Docs developers
  35. 35. Installing Rails INSTALL gem install rails
  36. 36. Rails: New Application$ rails new coolapp -m http://jruby.org create create README create Rakefile ...
  37. 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. 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. 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. 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. 41. Rails: First Page
  42. 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. 43. Real-world Rails
  44. 44. https://joindiaspora.com/ https://github.com/diaspora/diaspora
  45. 45. Routes # config/routes.rb (abbreviated) Diaspora::Application.routes.draw do # ... resources :photos, :except => [:index] #... root :to => home#show end
  46. 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. 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. 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. 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. 50. View Rendering photo list
  51. 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. 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. 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. 54. Dynamic toolkit of the cloud
  55. 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. 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. 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. 58. Access Java from JRuby $ jruby saucer.rb
  59. 59. Access Java from JRuby require java Loads Java Integration
  60. 60. Access Java from JRuby require rubygems require flying_saucer Loads Flying Saucer classes from Rubygems
  61. 61. Access Java from JRuby java_import org.xhtmlrenderer.pdf.ITextRenderer Imports ITextRenderer class
  62. 62. Access Java from JRuby Ruby renderer = ITextRenderer.new Java ITextRenderer renderer = new ITextRenderer(); Create new ITextRenderer
  63. 63. Access Java from JRuby Ruby renderer.set_document_from_string document Java renderer.setDocumentFromString(document); Set up the document
  64. 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. 65. Integrating into Rails Mime::Type.register application/pdf, :pdf Register PDF mime type in Rails
  66. 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. 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. 68. Integrating into Rails http://example.com/photos HTML view of photo listing http://example.com/photos.pdf Inline PDF of photo listing
  69. 69. Rails 3 and JRubyhttp://weblog.rubyonrails.org/2010/8/29/rails-3-0-it-s-done
  70. 70. http://ci.jruby.org/
  71. 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. 72. JRuby Deployment Ruby servers WAR files PaaS WEBrick GlassFish EY AppCloud GF Gem Tomcat AppEngine Trinidad JBoss SteamCannon
  73. 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. 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. 75. Hybrid Rails/Java Webapp ActionDispatch Rails MVC ActionController/ActionView ActiveModel Java JDBC SOAP POJOs DataSource interface
  76. 76. Tools http://www.jetbrains.com/ruby/http://redcareditor.com/ http://netbeans.org/
  77. 77. Enterprise SoftwareEvolving and adapting long-running projects with legacy codebases
  78. 78. http://en.wikipedia.org/wiki/File:Sagrada_Familia_01.jpgSagrada Família, Barcelona, Spain
  79. 79. http://www.flickr.com/photos/mgrenner57/263392884/ 1970s early 2000shttp://www.flickr.com/photos/gonzalvo/4257293127/
  80. 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. 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. 82. http://en.wikipedia.org/wiki/File:ExteiorShearTruss.jpg seismic retrofithttp://en.wikipedia.org/wiki/File:ExtReenfDetail.jpg
  83. 83. http://en.wikipedia.org/wiki/File:Szkieleteor_in_krakow.JPG Szkieletor, Kraków, Poland http://www.flickr.com/photos/bazylek/3194294047/
  84. 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. 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. 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. 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. 88. Using JRuby
  89. 89. JRuby on AppCloud JRuby + AppCloud
  90. 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. 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
  1. A particular slide catching your eye?

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

×