On Sunday there were mostly talks at the second European Ruby
Conference, which I’d like to summarize here.
First, James Britt gave his talk about ruby-doc.org that was
scheduled for Saturday, recycling his slides from the
Fourth International Ruby Conference (hey, no bad thing!).
To start, he gave an overview of the site and showed what it provides: all
kind of Ruby documentation, ranging from the core documentation
made using RDoc and the standard library to various additional
stuff like videos from Euruko 2003 (none made
this year, sorry) and translations of various Ruby tutorials
to languages like German and French to pictures of this year’s
Euruko (I hope, at least :-)).
He went on talking about the more technical details of the site,
about how the site works and what different interfaces it provides.
For example, you can query the ri
documentation via RESTful
HTTP, like this: http://www.ruby-doc.org/find/pickaxe/Array/.
After an short excursion on the history of the site and it’s various
stages, he started showing some problems of ruby-doc.org, among them
the broken ri
support (ruby-doc.org still uses the “old” 1.6 ri
,
as it changed significantly for Ruby 1.8). Also, searching the site
is still a problem, googling seems to be the best way to get what you
want.
Another problem is that there is some kind of data duplication needed
if you want to add new material to the site, making it harder to
maintain all the stuff currently available online.
James freely admitted that he is lazy (not essentially a bad thing
for a programmer ;-)), so he will be going to automate everything.
That is: no handcoded pages, no duplicate information and—to me,
very interesting—his requirements to blogging systems that empower
the site. He wants some kind of automatic categorization based on
XFML and explained a bit about how it is supposed to be. This was
the most important aspect of the talk to me; I’ll definitely need to
spend some time on the concepts of XFML and faceted metadata.
The new ruby-doc.org will therefore be using categorization by tags
and XFML. He went on talking about aspects of post-modern blogging,
the core of which he dubbed annoted view. Basically, this means
to generate pages dynamically based on queries by the user and
incooperate feeds and external data. Post-modern blogs
also support multiple output formats, for example XHTML, RSS, XTM,
XFML, and Atom. It is quite logical that such blogs will be accessed
by RESTful queries.
Writing the software behind ruby-doc.org, he tries to keep parts of it
general purpose libraries so they can be used for other stuff too; he
prefers lightweight frameworks to tightly coupled classes (Don’t we all?).
At the end of his talk he asked what people want from ruby-doc.org,
but I don’t think he got lots of new ideas, so ruby-doc.org seems to do
it’s job pretty well.
The first talk on this Sunday ended with the rhetorical question on
how to handle community input without getting big, bloated and hard to
manage.
After this, Kingsley Hendrickse presented his website tool
Staticweb in a very short talk.
He gave a quick overview of the project, which is to generate some
static pages quickly and he showed us interactively how to add new pages
and how the templating works.
Kingsley actually wrote that software in two hours while he was sick
and couldn’t work, and it was quite impressive for that. A funny
thing about the code is that he named all classes after his
ex-girlfriends. Whether this improves understanding of the code is
questionable, but it’s a nice idea, no? :-)
The next talk was by Armin Roehrl titled Small World in year 2.
He calls Small World—a collaborative distributed contact and
knowledge management system—an Eierlegende Wollmichsau—a thing
that is supposed to simply do everything.
The special thing about this talk was that Armin didn’t use slides to
present his application; instead, he showed a mindmap drawn by
FreeMind, and browsed it during his talk. This was a very nice
way of presentation, because you always had an overview of the talk
and what he currently talked about.
Armin made Small World to keep knowledge among members inside a
company that are distributed all over the world. He explained
that Small World consists of lots of available software
used together in a flexible way and he told that the key to Small
World was not a revolution, but heavy development.
Small World is not only used to share knowledge and coordinate projects
but also to keep customer contacts and information about them.
There were “too many interesting things to do” with it, he told. :-)
The general problem addressed by Small World is the problem of getting
information. Armin can’t use a shared filesystem, and he is known
for being “messy and lazy”. Versioning and backup of data is a
problem too.
The primary path to find the information you want is not to get the
information directly, but know people that know the information (or
other people that may know it…).
He showed a few ways on how to find data, ranging from a simple grep
-r
over collecting feedback from individuals and the mass (he gave
the Amazon book recommendations as an example) and monitoring for
changes up to complex search engines like Clusty and Google.
Although Small World can be used for a personal semantic web, it
benefits a lot from the network by making use of the “network effect”
as seen on Wikis, for example.
He explained that there are very different types of information
ranging from short-term information like email over forums and blogs
to files published on the net, which are used for long-time storage
mostly. All these kinds of informations need to be managed.
Small World features trivial text classification and collaborated
knowledge.
In order to build Small World, Armin explained that he needed only
some things, the most important being cheap harddisk and standing on
the shoulder of giants, by making use of existing programs like
Samizdat, Squish, Estraier, Graphviz, Wikipedia,
Freemind, and, of course, Ruby.
He went on with a list of things to do to improve Small World in the
future: Writing RDoc documentation, adding a WebDAV interface,
building a better search-engine, providing RSS with smart filtering,
having better content annotating and so-called multiblogs, which
really are blogs of blogs (I think this is comparable to Planets).
Unfortunately, Armin hasn’t yet released any code yet, since the
project is still very much being developed and they also are
exploring business strategies using it.
After this, Mathieu Bouchard presented some hacks using
MetaRuby, for example the InstanceVariableHash
which is best
described using a short example:
h # => {}
@foo = 42
h # => {"@foo" => 42}
h["@bar"] = :mumble
h = {"@foo" => 42, "@bar" => :mumble}
@bar # => :mumble
He also showed the UndoableArray
that provides a undo
-method to
revert changes to the Array.
An example of SubArray
followed:
a # => [1,2,3,4,5]
b = a.part(1,2)
b # => [2,3]
b[1] = 42
a # => [1,2,42,4,5]
MetaRuby was written in 2001, and Mathieu didn’t yet have a chance
to update it to Ruby 1.8, so the code only runs with 1.6.8 for now.
The memorable quote about this presentation was the answer on whether
he wanted to distribute his own version of Ruby: At least not yet.
,
he told us. ;-)
The turn was now up to Claudius Link who presented
rake
—Ruby make.
rake
is used for build automation, that is creation of executables
for multiple configurations, creation of documentation, and building
and running tests.
He compared rake
to other systems like make
and
ant
and explained that these other systems are limited to a
static description of build rules or a special structure, which
rake
is not. In fact, rake
scripts are “usual” ruby programs, so
you have the full flexibility and power of ruby at your fingertips.
rake
basically is a Ruby framework and provides utilities for building.
This was followed by a “Getting started” section that included a
simple Rakefile to which dependencies were added in the second step.
He showed how you can easily do file tasks that do a timestamp check
to see if the task needs to be run. A generalization of this are
expression rules or even complex rules whose values can be computed
using lambda {}
.
Advanced rake
users often define new tasks or inherit from existing
tasks to do new things and simplify the Rakefiles. If this is done
correctly, the Rakefile is written in a domain specific language and
even non-programmers (or programmers that don’t know Ruby) can write
and adapt Rakefiles easily.
As a final example, Claudius showed how rake
is used at his company.
They have a quite complex build system there that needs to interact
with Rational Rose Real-Time to do Model-Driven Architecture. (I don’t
want to say what I think about this
, he told us.) The build code
needs to support multiple platforms. Additionally, he needs to
automate running unit tests and publish their results.
Having used rake
in such a complex situation, he discovered some
issues with it, among them the lack of “lazy dependencies”, which are
expanded only if the given task is actually to be run (I showed him
how to do that quite easily, though), multiple dependencies and a
more structured error handling. Other problems included lacking
parallel and distributed builds, and last but not least the “shaky”
documentation, as he put it.
The next—and last—talk was given by Mathieu Bouchard
again, this time about RubyX11.
He started comparing RubyX11 to other implementations and their sizes:
Xlib, the original and most used C library to speak to X servers, is
about 3000kb of sources, which Mathieu thinks is much too much for a
“rather simple” protocol like X11. A part of the reason is that it
has a lot of comments, and also many shortcuts to the protocol.
Then he showed CLX, a Common Lisp implementation of
Xlib which has 800kb, but still is too lowlevel code. To paraphrase
him: “I thought all Common Lisp programmers were good programmers.”
He mentioned the GNU Smalltalk X11 implementation with 400kb source
code and the Perl module X11::Protocol which is 160kb large, but
uses numbered parameters ($_[1]
), and makes heavy use of pack
and
unpack
, therefore being confusing and unreadable. All these
alternatives—and RubyX11 too—do not depend on Xlib.
Now, he got to RubyX11, which is only 85kb in size and consists of
three parts: 20kb implement RPC and marshalling code, 50kb reimplement
xlib.h
, and 15kb are mostly keyname data.
He gave an example of RubyX11 which was a nice screensaver that
rendered nice curves using a iterated function system (IFS).
Then he focused on the implementation of RubyX11. He simplified some
calls to X11 because they would take 11 arguments in Xlib and it
would be nearly impossible to remember their order. :-)
RubyX11 basically works by defining a domain specific language inside
Ruby to describe the binary protocols, then X11 would be defined on
top of that.
Mathieu also pointed out some performance issues that still exist.
While he used an generic encoder up to RubyX11 0.5, which basically was
a big function that would format a string, he uses a “compiler” now in
the CVS version. It will generate some code on the first run that is
getting eval
ed into a method which can be called then. RubyX11
therefore is a general example for generating code at runtime using a
domain specific language. This made a large performance improvement,
but Mathieu could even imagine generating C code at installation
time…
The Sunday ended with some discussion, and people split up in groups
to talk together. They would leave the conference place shortly
after, and everyone would be trying to come next year again…