title: JRuby: Ready for Action gradient: dark blue black
Charles Oliver Nutter and Thomas Enebo @ Prague, EuRuKo 2008
The JRuby Guys, Sun Microsystems
(Adapted S9 Version from Original Slide Deck)
- 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!
- 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
- 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
- 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
- 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???
- "The answer is Java. What is the Question?"
- 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 |
- Fantastic Garbage Collectors
- Compacting
- Concurrent
- Many tunables and choices
- 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
- 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
- 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
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
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
class ProfligacyDemo
import javax.swing.*
include Profligacy
def initialize
layout = "[<translate][*input][>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
- 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
...
- 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
- Oracle's Mix – digg-like social customer site
- Sun's MediaCast – file distribution portal
- ThoughtWorks' Mingle – collaborative project mgmt
- Sonar – code/project analysis tool
- More on the way!
- 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
- "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!
- Main JRuby page: www.jruby.org
- JRuby Wiki: wiki.jruby.org
- Charles Nutter
- charles.nutter AT sun.com
- headius.blogspot.com
- Tom Enebo
- thomas.enebo AT sun.com
- www.bloglines.com/blog/ThomasEEnebo

