The Third Annual International Ruby Conference was in Austin Texas this
year, November 14-16. I’m going to put down a rundown of the
conference and some of the after hours activities.
Its Friday morning in Austin Texas, and the 3rd Annual International Ruby
conference is just beginning. David Black welcomed everyone to the
conference. He spoke a few words about RubyCentral, Inc, the organization
that sponsors the conference.
Working in the Garden: Web Apps with Borges (Eric Hodel)
At last year’s conference, Avi Bryant demostrated an unusual web
application framework that allowed linear programming to be applied to the
rather non-linear web. Avi’s ruby framework was a partial port of his
Smalltalk framework, Seaside. Seaside uses continuations to allow a user to
return the application to an arbitrary earlier point in the program and to
make a different decision.
Eric Hodel has done a complete port of Seaside to Ruby. The result is named
"Borges". Eric demoed Borges by modeling SushiNet, a sales cart
style application for ordering raw fish.
The Seaside/Borges model for web applications is really interesting. It
seems to be a good fit for certain types of applications, especially for
those that lead the user through a certain set of pages (e.g. the checkout
pages for a web shopping site). Now if I could just get my head wrapped
The State of XML Processing in Ruby (James Britt)
James points out that using XML these days is much like using ASCII, you
really don’t care about the exact representation. You just use the
APIs without worrying so much about the gory details. James gave us a
survey of the currently available XML tools for Ruby, noting whether they
were pure Ruby or C library based, whether they were streaming or DOM like,
and gave a summary of there use. I’m not going go through his entire
list, it was quite long. If fact, I was a bit surprised at the length of
Object-relational mapping with Lafcadio (Francis Hwang)
Lafcadio is a OO mapping tool, allowing one to deal with objects in their
Ruby code while accessing a relational database. Francis wrote Lafcadio for
his own use, but appears to be fairly complete.
Lafcadio is specifically designed to support unit testing. Francis uses an
interesting mechanism for flexibly controlling singletong instantiation in
Here are a couple of notes
I would like to see Lafcadio support more databases. Francis indicated that
it would not be hard to add DBI support, but currently MySql is the only
supported out of the box.
Francis talked about better abstractions for queries, but wasn’t
aware of Ryan Pavlik’s Criteria library (see my Leaky
Abstractions writeup. I think this would be a good match for Lafcadio.
I asked Francis later about the origin of the name "Lafcadio". He
indicated that it came from a children’s book by Shel
Silverstein about a lion of the same name. Lafcadio the lion grew up in
the jungle, but was transplanted into the world of men. Lafcadio longed for
the jungle, but was unable to return after becoming acclimated to his new
world. Lafcadio becomes a metaphor for the strange between world of objects
coming from a database, but living in the world of objects.
Ruby World: Implemented (Steve Tuckner)
Steve intended to talk about the implementation his Ruby World project, but
implementation of Ruby World was delayed. Since David Black (one of the
conference organizers) wouldn’t let him back out of speaking, Steve
decided to talk about using Ruby in a commercial project.
And that’s a good thing. Steve’s company is developing a fax
device controller and Steve is using Ruby to write the PC-based scheduling
and control software for outbound faxes. This is a native windows
application that will actually ship with the product (the fax controller is
not yet shipping).
It was refreshing to hear about a Ruby project that is product related.
Some random notes:
Uses: Ruby, Vruby/Swin, win32ole, exerb
Threads on windows are problematic and can suck 100% of the CPU. There was
some discussion of how to solve this problem using separate ruby processes
and allowing them to communicate within the box.
Exerb will occasionally GP when built on certian machines. This problem has
not reoccured since switching to Ruby 1.8.
As a wrap up, Steve shared some techniques for testing GUI code.
Generating Code in Ruby (Jack Herrington)
Jack is the author of Code
Generation in Action. Jack talks about using code generation for
anything from small one-liners to large MDA-style generators.
Some advice from Jack:
First hand write the code that you will eventually generate.
Generate only what you understand (avoid the wizard syndrome).
Maintain the generator as part of the build process.
I only disagreed with Jack on one point. Jack seemed in favor of guarded
blocks in generated code. Guarded blocks are areas where developers are not
allowed to edit. I personally have a great dislike for guarded blocks and
would rather have the generated code be in a completely separate file, but
that’s just me.
I don’t have much details here, buts that’s probably because I
was doing more listennig than note taking at that point in time.
Roundtable with Matz
Chad Fowler introduced Matz and opened the floor for questions. Matz set
the ground rules in that he will talk about Rite and Ruby 2.0 tomorrow
night. So no Ruby 2/Rite questions for tonight.
The following is very paraphrased and greatly shortened. I captured
what I could from the talk as best I could. I apologize for any
inaccuracies and errors.
Question: When is Ruby getting static typing?
Matz: Ummmmm .… I’m actually thinking about optional
typing in Ruby 2.0, but based on signature rather than classes.
Comment: Strong Duck Typing?
Question: What is that status of a packaging system for Ruby? I know
you are a benevolent dictator, but perhaps this is a where we need less
benevolence and more dictator.
Matz: I maintain Ruby itself but do not implement
Comment: But perhaps you are the right person to choose an
implementation or the person to work on it.
Matz: Perhaps we can setup a Wiki and gather requirements.
Aside: This packaging question turns out to be one of the more
significant questions asked during the roundtable. It caused a handful of
us to lose a great deal of sleep over the weekend. More on this later.
Question: Can you explain the reasoning behind the proc and Proc.new
There is a lengthy discussion about the difference. In the end, Matz agrees
to deprecate "proc" in favor of "lambda" in order to
differentiate block vs method argument semantics.
Aside: I’m not sure I’m happy with this. I tend to
use proc much more often than lambda, but I guess I can
adjust. I suppose this shows what can happen when you can bend Matz’s
Question: What is the news about the Ruby language specification?
Matz defered to Rich Kilmer who talked about the possibility of using a
stand-alone parser to be the arbitor of syntax.
Question: Is the C API considered part of Ruby?
Matz: No, new versions might not support the current API, but I hope
to provide some kind of backward compatibility.
Question: Is there someway we can get more of the Japanese web pages
translated to english?
Matz: I don’t know.
Comment: I’ve had good luck with Babelfish.
Comment: I have the a copy of the Ruby Hackers guide. Its in
Japanese. It’s a great book, I haven’t read it.
Question: What are you doing as the author of Ruby to ensure that
Ruby doesn’t change and break are existing code?
Matz: Ruby 2.0 will be different from Ruby 1.8 and there will be
some incompatibilities between the two, but Ruby 1.8 will remain as it is.
Ruby 1.9 will generate warnings for future incompatibilities.
Comment: There are some advantages to being small and having a
smaller installed base in that we can evolve the language
Question: What is being done to improve Ruby on the Win32 platform?
Matz: The Win32 folks are working on issues to make the platform
better. Perhaps we need to get away from standard IO on that platform.
Question: Is Ruby going to follow Perl 6’s lead in regular
Matz: I have no plan to follow Perl6 in regular expressions, however
if someone can convince me of a need for a particular feature I might
change my mind. Ruby 1.9 will have a new regular expression engine that
will unencumber it from license problems and gives better performance.
Question: Would it be possible to optimize string and regex
interpolations when the interpolated data is static?
Matz: Ruby optimization is very difficult. I have considered many
things and I have rejected many things. If you have some good ideas, I
would like to consider them.
Question: What is the status of the local / block variable issue?
Matz: In Ruby 2.0, all block variables will be local to the block.
Question: Do you get bored working on Ruby for 10 years?
Matz: I’m not bored yet.
Question: What was the motiviation for using "#" for both
comments and string interpolation?
Matz: Ummm … I don’t remember.
Question: People at work ask me why they should use Ruby instead of
Perl. What should I tell them?
Matz: I’m not the right person to answer that because I am not
a Perl programmer.
Comment: It’s like the Matix. No one can tell what Ruby is,
you have to experience it.
At this point people started sharing Ruby stories in the workplace. Matz
closed by saying that we will review changes for Ruby 2.0 tomorrow evening.
Post Meeting Talks
The package question that came up during the roundtable touched a nerve
with a number of us. Rich Kilmer, Chad Fowler, Paul Brannan and I (Jim
Weirich) headed for the hotel (Club Max) and setup our laptops in a corner
(near an outlet). Chad had a cellular internet connection so we were able
to pull down a number of packages and previous attempts for review. We
finally decided we would hijack the RubyGems project started by Ryan
Leavengood. Ryan presented RubyGems at the very first Ruby conference in
2001 and got a favorable reception. Unfortunately the work was never
continued and the project languished. So, Ryan, if you are out there, we
hope you don’t mind.
We setup the following rough goals:
Single File, System Independent Distribution Format
Explicit versioning, possibly multiple version installed at the same time.
Easy downloading, something like apt-get.
I don’t recall enumerating the goals in this form, but they evolved
from the discussions as the night progressed. In particular, we waffled on
installing gems or loading files directly from gems. We finally decided on
going through an installation because shared native libraries
couldn’t be loaded directly from a gem file.
That first night, Rich and Paul attacked the package format and metadata
required for a gem. Chad and I started looking at compression libraries and
packaging techniques. Zlib is now packaged with Ruby 1.8, so it will be
easy to compress the individual files. Standard zip files were considered,
especially when we found a zip file library in the RAA. But eventually we
decided on a self-extracting format that begins with a Ruby script to do
By the end of the evening my mind was turning to mush. Fortunately the bar
began turning out lights at 2:00 am. I headed off to bed, but I’m
pretty sure Rich kept going for a bit beyond that.