title: JRuby: Ready for Action gradient: dark blue black h1. JRuby: Ready for Action Charles Oliver Nutter and Thomas Enebo @ Prague, EuRuKo 2008 The JRuby Guys, Sun Microsystems Adapted S6/S9[1] Version from "Original Slide Deck":http://dist.codehaus.org/jruby/talks/EuRuKo%202008.odp
fn1. ("Source":http://slideshow.rubyforge.org/svn/samples/jruby.textile) *Slide Show Keyboard Controls (Help)* | Action | Key | | Go to next slide | Space Bar, Right Arrow, Down Arrow, Page Down | | Go to previous slide | Left Arrow, Up Arrow, Page Up | | Toggle between slideshow and outline view (Ø) | T | | Show/hide slide controls (Ø « ») | C, Move mouse to bottom right corner | h1. Agenda * JRuby overview * JRuby enhancements and additions * Swing programming * Demo: Swing in Ruby * Web applications * Demo: JRuby on Rails * Graphics and applets (that don't suck) * Demo: Pretty graphics! h1. The JRuby Guys * Charles Oliver Nutter and Thomas Enebo * Longtime Java developers (10+ yrs each) * Engineers at Sun Microsystems for 1 yr * Full-time JRuby developers * Also working on JVM dynlang support * Wide range of past experience ** C, C++, C#, Perl, Python, Delphi, Lisp, Scheme ** Java EE and ME, JINI, WS h1. JRuby * Java implementation of Ruby language ** "It's just Ruby!" * Started in 2002, open source, many contributors ** Ola Bini, Marcin Mielzinsky, Nick Sieger, Bill Dortch, Vladimir Sizikov, MenTaLguY * Aiming for compatibility with current Ruby version ** Ruby 1.8.6 patchlevel 111 (114 was just released) * Improvements on Ruby ** Native threading, better performance, many libraries h1. JRuby 1.1 Released! * Announced today: JRuby 1.1 is finished! * Massive improvements over 1.0 ** Full compiler for Ruby code to JVM bytecode ** Performance is many times better across the board ** New Regexp impl with full Oniguruma features ** New rewritten IO subsystem to parallel Ruby behavior ** Reduced memory footprint ** Best compatibility level ever * Ready for production use (and already being used) * Quick series of maintenance releases coming h1. Compatibility * Applications are king ** Rails, Rubygems, Rake, Rspec, ... * Testing rulez (~42,000 expectations/assertions) ** Prevents regressions ** Helps to better define Ruby * Prevents fragmenting a community ** Like Sapphire or ...Sapphire??? h1. Java == A Dirty Word * "The answer is Java. What is the Question?" h1. Java != A Dirty Word !jruby-javapie.png! h1. Java != A Dirty Word * Fantastic Virtual Machine ** Tuned for over a decade by an army ** Runs on virtually all os/hardware combos ** Dynamic optimizations (Hotspot) ** Keeps getting faster: | | Java 5 | Java 6 | | | Rexml | 10.9s | 7.41s | %32 | | Hpricot | 4.06s | 2.59s | %36 | h1. Java != A Dirty Word * Fantastic Garbage Collectors ** Compacting ** Concurrent ** Many tunables and choices h1. Java != A Dirty Word * Native threading * Tools ** IDEs (refactoring, debugging) ** Profilers (instrumenting, sampling) ** JMX (ask VM for stats) * Libraries ** Anything you can think of... ** Write image_science in 60 lines of Ruby using Java 2D h1. Where is JRuby being used? * Swing GUI development ** Makes Swing much nicer to use, easier to handle * Ruby on Rails ** Better deployment options, better performance * Tooling for IDEs ** JRuby's parser enables NetBeans, Eclipse, IntelliJ * Graphics ** Ruby + Processing = cool demos h1. Swing GUI Programming * Swing API is very large, complex ** Ruby magic simplifies most of the tricky bits * Java is a very verbose language ** Ruby makes Swing actually fun * No consistent cross-platform GUI library for Ruby ** Swing works everywhere Java does (everywhere) * No fire-and-forget execution ** No dependencies: any script works on any JRuby install DEMO: Swing in Ruby h1. Option 1: Direct approach {{{ import javax.swing.JFrame import javax.swing.JButton frame = JFrame.new("Swing is easy now!") frame.set_size 300, 300 frame.always_on_top = true button = JButton.new("Press me!") button.add_action_listener do |evt| evt.source.text = "Don't press me again!" evt.source.enabled = false end frame.add(button) frame.show }}} h1. Option 2: Cheri (builder approach) {{{ include Cheri::Swing frame = swing.frame("Swing builders!") { |form| size 300, 300 box_layout form, :Y_AXIS content_pane { background :WHITE } button("Event binding is nice") { |btn| on_click { btn.text = "You clicked me!" } } } frame.visible = true }}} h1. Option 3: Profligacy (targeted fixes) {{{ class ProfligacyDemo import javax.swing.* include Profligacy def initialize layout = "[result]" @ui = Swing::LEL.new(JFrame, layout) {|cmps, ints| cmps.translate = JButton.new("Translate") cmps.input = JTextField.new cmps.result = JLabel.new translator = proc {|id, evt| original = @ui.input.text translation = MyTranslator.translate(original) @ui.result.text = translation } ints.translate = {:action => translator} } end end }}} h1. Option 4: MonkeyBars (tool-friendly) * GUI editor friendly (e.g. NetBeans "Matisse") * Simple Ruby MVC-based API * Combines best of both worlds MonkeyBars Controller: {{{ class RssController < Monkeybars::Controller set_view "RssView" set_model "RssModel" close_action :exit add_listener :type => :mouse, :components => ["goButton", "articleList"] def go_button_mouse_released(view_state, event) model.feed_url = view_state.feed_url content = Kernel.open(model.feed_url).read @rss = RSS::Parser.parse(content, false) model.articles = @rss.items.map {|art| art.title} model.article_text = CGI.unescapeHTML(@rss.items[0].description) update_view end ... }}} h1. Web applications * Classic Java web dev is too complicated ** Modern frameworks follow Rails' lead * Over-flexible, over-configured ** Conventions trump repetition and configuration * Rails deployment is still a pain ** You shouldn't need N processes! * Rails performance should be better ** JRuby has potential to be much faster DEMO: GlassFish Gem h1. Production JRuby on Rails * Oracle's Mix – digg-like social customer site ** "mix.oracle.com":http://mix.oracle.com * Sun's MediaCast – file distribution portal ** "mediacast.sun.com":http://mediacast.sun.com * ThoughtWorks' Mingle – collaborative project mgmt ** "mingle.thoughtworks.com":http://mingle.thoughtworks.com * Sonar – code/project analysis tool ** "sonar.hortis.ch":http://sonar.hortis.ch * More on the way! h1. JRuby Enables Tooling * JRuby's parser used by most Ruby IDEs ** NetBeans Ruby Support ** Eclipse RDT/RadRails/Aptana, DLTK, 3rd Rail ** IntelliJ ** Jedit * Roman Strobl's NetBeans session at 13:00 !jruby-tooling.png! h1. Graphics with Processing * "Processing is an open source programming language and environment for people who want to program images, animation, and interactions." ** Basically a cool Java library for 2D graphics * Ruby-Processing wraps Processing with JRuby ** Cool, rubified 2D graphics environment for you ** Eye-candy demos for us ** Thanks to Jeremy Ashkenas for putting these together DEMO: Pretty Graphics! h1. Thank you! * Main JRuby page: "www.jruby.org":http://www.jruby.org * JRuby Wiki: "wiki.jruby.org":http://wiki.jruby.org * Charles Nutter ** charles.nutter AT sun.com ** "headius.blogspot.com":http://headius.blogspot.com * Tom Enebo ** thomas.enebo AT sun.com ** "www.bloglines.com/blog/ThomasEEnebo":http://www.bloglines.com/blog/ThomasEEnebo