holiday season sickness

No, I'm not sick of the holidays, just plain sick. I think it's bronchitis (but no, I don't smoke). Been like this for over a week, now. Meanwhile I entertain myself playing Neverwinter Nights 2, reading, and watching some tv series.


Sun & Novell vs Microsoft

Regarding the recent events regarding Sun & Novell, we could observe the following recent events:
  1. Sun settles with Microsoft and "moved to a new phase of legal and technical cooperation with longtime foe Microsoft", in a deal that involves transfer of money to Sun;
  2. 2,5 years later, Sun open sources Java;
  3. Novell and Microsoft sign a deal, with money transferred to Novell.
Looking at the Sun example, it really doesn't sound like this deal with Microsoft will be harmful to their open source efforts. At least I hope I'm right... :-P


last.fm: concerts in your area!

last.fm was already cool. Now I discovered something that makes it even cooler: you can give it your location and let last.fm give you relevant events around your location, such as concerts and festivals! Since last.fm already knows what kind of music you like, it can filter effectively and just show you the gigs you're potentially interested in. And it is distributed. There is no staff (AFAIK) working to create these events; instead, it is the users that must create the events. For instance, I created an event describing the forthcoming concert of :Of:The Wand And The Moon: in Portugal.


Gajim Passwords

After my recent contribution, Gajim now stores passwords in GnomeKeyring. Now that my passwords are safe in an encrypted file, I can start logging in to GTalk again, as gjcarneiro@gmail.com. Looks like Gajim 0.11 will be one mighty release.. :-)


gajim song notifications

So now the PyGTK based open source Jabber client Gajim has song notifications, thanks to yours truly ;-)
Unfortunately my MSN gateway doesn't convert the status message from Jabber to MSN, so only my Jabber contacts (all two of them) can see what music I'm playing right now :P


Mesh Networks vs Adhoc Networks

The concept, or wording, of mesh networks is only recently emerging, or at least given major focus, so there is not official and clear definition yet of what distinguishes mesh networks from adhoc networks. Interesting that the wikipedia mesh networks article has recently been enhanced with a clarification of the differences between adhoc and mesh networks. According to the (anonymous) modifications, mesh networks are adhoc networks in which "the component parts [...] generally are not mobile". Another possible definition would be that mesh networks are adhoc networks, but in L2 rather than L3.

Personally, I would rather go with a modification of the first definition, though. For me, mesh networks are adhoc networks in which most or all the component parts are infrastructure nodes, mobile or not, as opposed to classical adhoc networks in which all nodes are terminals. In other words, mesh network nodes are dedicated exclusively to routing traffic from outside the network, while adhoc network nodes are primarily terminals that are also willing to route traffic from other terminals nearby. In both cases, however, the topology of nodes is expected to be more or less dynamic, and could even use the same protocols.


reading, numexp, phd

Reading: finished Miles Errant of the Vorkosigan Saga. Fortunately, there are still 3 more books to read in this excellent SciFi series. But first I have three more books in line: one of Honor Harrington series (David Weber), one more Juliet Marillier dark fantasy book (dark mirror), and another dark fantasy book by Anne Bishop, the second one of the dark ring series.

gNumExp: is a bit more polished now:
  • one can control startup modules from gnumexp and have numexp-client honor these settings;
  • gnumexp now is able to manually spawn numexp-kernel if bonobo-activation fails to find it for some reason. A nice side-effect of this is that one can see numexp-kernel stdout in the shell that launches gnumexp, when the kernel is manually launched, so I just might one day make this method the default and redirect kernel output for better debugging.
PhD: my first year PhD report is beginning to take shape, and is proving a good exercise to settle down ideas and force me to search for citations that support the facts I think I already know. Plus, I hope I can reuse this text when I start writing my thesis in two and half years, so it is not wasted work and it makes me write the text more carefully, like in a paper.



Using www.gmap-pedometer.com, I decided to track my running sessions.

This one is my favorite lap, near home. This is another favorite route. Another one, taken only once so far.

Yet another popular route is this one, which I take right before leaving the gym where I work out in Famalic√£o. Sometimes this one instead; they both start just outside the gym. Only once I did this route. There are other routes that I take less often, of course.


gNumExp almost ready for a release

This is it. After todays' commit, gNumExp's port to goocanvas and gtk+ 2.10 (for printing) is more or less complete, and we have feature parity with the 0.10 release made about one year and a half ago.

So, code-wise the hardest part is done, but I'd like to do some polish first, before the release:
  1. Include a copy of goocanvas and pygoocanvas;
  2. Don't rely on bonobo-activation to startup numexp-kernel, instead do our own custom activation, using a hardcoded path to the binary discovered during configure state;
  3. [Maybe] stop using libgnome*, use only gtk2, libxml2, and gnomevfs.
Even next release won't be 1.0, I'd still like it to be more polished than usual.


unionfs and diskless linux

Back to work, today I helped my coworkers setup a diskless linux system. As usual, it mounts root over NFS. But in our case, there's a nice twist; each host nfs-mounts both a shared readonly filesystem and a private writable one. We then use unionfs to overlay the two filesystems. I actually spent most of the afternoon tweaking initramfs to accomplish this effect, but the result pays off. We now can instantly boot any machine we want just by configuring the DHCP server, and each PC can customize its own filesystem, or else just inherit from the shared one. We get the best of both worlds: installing software once on the server makes it available to all clients, but clients can still be easily customized (unlike, say, lessdisks).


Play time over

Alas, today is my last day of vacations. Tomorrow I'll have to get back to work, and start writing my first year Ph.D. report. Ugh..

Yesterday night went to see the fireworks of the "popular party" here where I live. I found them most impressive, better than I've ever seen here.

I won't have much hacking time from now on, but luckily gNumExp is well advanced already. Besides the boring but easy job of porting the scatter and parametric plot objects to the new canvas system, one of the things that had me most worried was to render MathML inside a goocanvas widget, in order to present it in the legend. Thankfully, that part has just been solved. :-) It wasn't easy; I had to fix a couple of pygobject bugs first, and do some coding in pygoocanvas to support subclassing from goocanvas.ItemSimple and goocanvas.ItemViewSimple, including access to most fields.


Got the legend layout and item size working, then went for making the legend movable. Alas, hit another bug in goocanvas. Looks like some numerical instability in goo_canvas_view_convert_to_item_space() is affecting the coordinates of motion-notify-events.
As a workaround, calling goo_canvas_view_convert_from_item_space() makes the coordinates sane again. In the end, the legend is almost working, only preserving relative position during window resizes and during load/save is to be done. Then of course there's the MathML part waiting... :P

As planned, went for some biking in the afternoon, then out dinner. In the evening, finished the legend parts described above, that had been left unfinished by the time I had to go biking.


Yesterday I had another wonderful day at the beach. Went out for dinner. Got home, read email, sent a couple of goocanvas patches.

Alas, looks like today the weather is not as good at the beach, so I'm staying home, try to finish the legend in gnumexp, although I have to fight goocanvas/cairo bugs first :| Planning to do some biking near the end of the afternoon...


Spent a couple of hours in the morning/early afternoon trying to figure out why calling get_bounds() on a goocanvas.Group returned -32768 and 32767 as min/max x and y. My instincts told me it must be a bug in goo_canvas_text_item_update, but as it turns out my instincts deceived me; the item that returns wrong bounds is actually a GooCanvasPath. So I've narrowed where the bug must be, but it could still be a bug not only in goocanvas but also in cairo. Didn't have time to pursue the matter further as it was time to head for the beach.

Had a wonderful afternoon at the beach: nice and warm sun, light breeze, and really nice water. As usual, enjoyed some more reading of Miles Errant.

Got home, went to the gym, then late dinner.

Made a gnome-python release. Unfortunately my mind was not sharp anymore and couldn't stand more hacking. Just watch some TV, then a bit of reading, then bed.


gNumExp and GooCanvas

During my vacations, I've been slowly trying to convert my pet project gNumExp to GooCanvas. Previously it was using libnxplot (which I created years before cairo was available) and a my own canvas system. So I've been helping Gian Mario Tagliaretti on python bindings for goocanvas, since I also need them for gnumexp.

goocanvas has some good things:
  • It is fast (for instance it looked much faster than ccc, last time I tried both);
  • It has builtin accessibility and keyboard navigation features (though I haven't yet tapped into these features in my program);
  • It has a rich set of basic shapes that you can use;
  • It is very much language bindings friendly due to extensive use of GObject properties;
Unfortunately I also found some flaws:
  • The model/view split adds too much complexity with very little gain;
  • It doesn't make it easy to draw your own custom shapes, due to 1. model/view split, mandatory use of GInterfaces, lack of signals for customizing the drawing;
  • And the #1 problem, it is difficult or impossible to do proper layout. For instance, I'm stuck in drawing the legend of plots because I do not know how much space a legend items will take, but need to know in order to size the legend rectangle correctly.
The first two problems I can cope with, but I need to solve the third problem. Either I missed something in the API, or I'll have to make myself a new API and submit a patch and hope Damon will accept it. So much work just for a legend *sigh*