I'll leave for Wacken Open Air in about an hour. There's some nice bands on the billing, I can't wait to see Legion of the Damned (again), Arch Enemy and Amon Amarth :D I'll write about how the festival has been going when I'm back on sunday.

In other news, I've written a Ruby extension to read and write vorbis comments since all of the existing vorbis extensions only have read-only support. I'll use it to synchronize vorbis comments with MusicBrainz.

*Update:

Wacken 2006 was cool. We were camping with/near friends of a co-worker of my friend, and some of them are nice guys :D

Weird enough, we also met some guys that were camping with us last year, by chance. wtf, there's only 50.000 people in Wacken or something. Cheers to Alex, who even still knew my name \o/

Opeth is cool, especially Mikael Åkerfeldt. In Extremo and Arch Enemy are good live. Yay for Legion of the Damned. Amon Amarth = disappointing. Too lazy to write more now.

Wow. I wrote most of Ruby-EFL (that's everything but Ruby-EET :P) in summer 2004, when I knew close to nothing about Ruby's internals and its C api. It shows. I recently started writing another application with it, and noticed that you couldn't even inherit from Ecore::Evas::SoftwareX11, for example. That's because I implemented Class.new for all of the classes instead of writing a proper initialize method. Fixing that up led to some great code cleanup, and I'm very happy with the codebase now. These changes are fully backwards compatible, too.

The API has changed for Ecore::EventHandler. You now add event handlers like this:

Ecore::EventHandler.new(Ecore::SignalExitEvent) { |ev| ... }

ie you just pass the event class instead of a stupid constant :)

The next thing I poked at is the Evas::Smart API. Not sure what I was thinking when I wrote the Ruby class back then...

Now it works like this:

# Inherit from Evas::Smart
# Done :D

The name for the smart class will be generated from the class path of the Ruby class. That way you cannot customize it but I don't think anyone would want to do so anyway.

Sorry 'bout the API b0rkage, but I think you'll agree that it's mucho better now :)

Update

Whoops, I forgot to write about how it's now possible to define Ecore events in Ruby :)

Debugging Ruby extensions with Valgrind is a tedious task, because Valgrind doesn't like Ruby's garbage collector much. Valgrind will print a lot of errors and warnings, which are mostly bogus. This makes it hard to spot the real errors you're looking for.

One way to deal with this is to create a suppression file for Valgrind. Suppression files are used to tell Valgrind to ignore certain errors. For every bogus error, the suppression file has to be extended. Although Valgrind can generate suppression files itself, and I've spend some time on generating a suppression file, I never got a perfect one which made Valgrind shut up about Ruby.

So I wrote a patch for Ruby that tells Valgrind that the memory locations the GC uses are safe to read, which makes it stop bitching about all those bogus errors. The patch is tiny, yet efficient:

A few days ago, Daniel Brockman announced event-loop, his Ruby package that implements signal handling, IO events, timers and of course a main loop. He also uploaded a gem, so I removed mine from http://code-monkey.de/files.