Questions

GUADEC is cool, and is resulting in people asking lots of questions. When will the latest XGL server be committed so we can switch desktops by rotating a cube? Will GNOME make 10x10? (10% installed base by 2010). Will the N770 be an amazing success, or a product only used by geeks just because it runs Linux? Will the weather be nice, instead of too hot or too wet? Will Jeff ever stop bleeding?

The people demand answers, but only time can tell.

15:29 Monday, 30 May 2005 [#] [computers/guadec6] (0 comments)

GUADEC 6

I'm here!

10:30 Sunday, 29 May 2005 [#] [computers/guadec6] (0 comments)

Summer Photos

The combination of Spring and working from home is a nice combination. I've taken quite a few photos of our rather small garden and when I've made Tate work again I'll put them online, but here is one to keep you going.

Vicky titled it A Bee's Feast.

18:04 Friday, 27 May 2005 [#] [life] (0 comments)

Friday Linkage

I can't be bothered to blog much today as it's far too hot for that sort of thing (disclaimer: it's only 29 degrees, but I'm still ill), so I'll provide a few links instead.

My local cinema is one of the 209 to be selected for a grant to go digital. Very cool, and as part of the deal they've agreed to show more non-Hollywood movies, which is always good news.

LinuxDevices.com has the presentation Nokia gave at LinuxWorld NY. Pretty interesting reading for anyone after every bit of information about the super-cool 770.

NP: Simple Things, Zero 7

16:10 Friday, 27 May 2005 [#] [life] (0 comments)

Unexpected Guest

Whilst doing my best to shake off my nasty cold, an unexpected guest flew past me in the garden.

Apparently that is a Holly Blue, also known as Celastrina argiolus. Sadly that is not a scaled image, but is just cropped. I think I need a macro lens...

15:30 Thursday, 26 May 2005 [#] [life] (0 comments)

WiFi Madness

I've finally got my new D-Link DWL-G650+ wifi card working on my laptop. I have revision B.1 of this card, which makes a big difference, the earlier revisions use a different chip. This card has an ACX111 chip inside, which is somewhat supported by Linux, but its not trivial.

Hoary comes with the acx_pci module builtin, and a collection of firmware. However, the module will try and load TIACX111.BIN to the card, which is wrong. It will successfully load, but the card won't work. The trick on Hoary is to steal FwRad16.bin from the driver CD and put it in /lib/hotplug/firmware, and then delete TIACX111.BIN from the same location. Only then will the right firmware be uploaded.

Sid is more fun, the module has to be built yourself (there is a package which makes this very easy using module-assistant), but don't do what the guides suggest and install acx111-firmware. Take FwRad16.bin and move it to /lib/firmware/TIACX111.BIN. Unlike the earlier versions the module in Sid will not fall back onto other firmware images.

Now that it is working, I've just got wait for the performance to increase: in a side-by-side test my cheapo Actiontec Orinoco PCMCIA card is transferring files 100Kb/s faster.

NP: Wrath Of The Math, Jeru The Damaja

12:00 Thursday, 26 May 2005 [#] [computers] (3 comments)

Maemo

Silly name, great idea. Nokia have just announced the Nokia 770 Internet Tablet, a frankly gorgeous hand-held tablet which just happens to be based on Debian, GTK+, GStreamer and DBus.

Update: of course this announcement wasn't a complete surprise considering I work for Opened Hand, who have been working with Nokia on this for the last two years.

15:40 Wednesday, 25 May 2005 [#] [computers] (0 comments)

New Toys

Today was a good day for toys.

My LinkStation is now booting Debian Unstable, and have finally put a decent version of Samba on it so I can mount drives with CIFS. Apart from being a nice small network storage device, now that it's Debian I can do Interesting Things with it. My first hack will be to add a USB sound card, so that I can play Internet radio streams into my hifi.

Then those nice people from CityLink arrived and gave me a Canon Ixus 400 we bought off eBay. As much as I love the 300D, it's not exactly a pub camera. The Ixus is far smaller and I'll probably be bringing it to GUADEC.

My final toy was a Velbon MAXi 343 tripod. For a bargain price of £50 this is a pretty good tripod, it's very small when packed (45cm) but expands to 155cm+30cm, which is plenty for most people. It's full of little nice features like rubber feet which screw in to reveal spikes, legs which expand by flicking a switch, and an all-metal head.

In other news, I'm developing a snotty cold. I hope it will go before GUADEC...

NP: 100th Window, Massive Attack

13:05 Tuesday, 24 May 2005 [#] [life] (0 comments)

Coprophagia

(I hope I didn't upset anyone eating whilst reading there)

So Micke, Richard, Glynn, and Jeff (!) all think that my sweet and all-so-good cookie looks like, well, poo.

I dread to think what they'll make of my lunch today...

NP: Mezzanine, Massive Attack

12:50 Friday, 20 May 2005 [#] [life] (0 comments)

Completed Plans

Not only does Bonobo now use approximately 130Kb less memory (as measured by pmap) thanks to the work of Alex and co, but my EDS leak patch finally got approved. Hooray!

NP: Keep it Solid Steel, Mr Scruff

12:19 Friday, 20 May 2005 [#] [computers] (0 comments)

Brain Food

As a child I was often told that fish is brain food. Something to do with it being a good source of protein. Well, I love fish, but it doesn't seem to help me when I need it, for example when chasing a bizarre memory corruption bug. However, I did find that this was useful to me when chasing memory leaks in Evolution:

That is brain food my friends.

Oh, and sorry for spamming the various planets this morning. The server's software RAID had a bit of a kerfuffle last night and although everything was recovered (props to Thom and Paul) the mtimes were all changed...

NP: Across A Wire, Counting Crows

12:21 Thursday, 19 May 2005 [#] [life] (0 comments)

It's Nice When A Plan Comes Together

It's really nice when, after a week or so of poking, prodding, and getting confused, that the right 2-line change can have a large effect.

Before:
Massif chart
Note how evolution-data-server has leaked 800K in 25 seconds whilst running a test application.

After:
Massif chart
Much better. As I said, it's nice when a plan comes together.

NP: Groove Salad, Soma FM

16:55 Monday, 16 May 2005 [#] [computers] (3 comments)

Public Perception of Immigration

The excellent Observer Blog has an interesting post about a recent MORI survey:

Regular readers of different papers were asked 'what percentage of the British population do you think are immigrants to this country?'

The highest bid came from Daily Star and Sun readers - 26 per cent. Next up, Daily Mirror on 25 per cent, then in order, The Express - 21 per cent; Mail - 19 per cent; Telegraph - 13 per cent; Guardian - 11 per cent; Times 10 - per cent; The Indie - 9 per cent; FT - 6 per cent.

The UK average guess is 21 per cent. And the actual figure? That would be 7 per cent. So as a nation we're only 3 times out of proportion on this one.

Daily Star, Mirror, and Sun readers think that more than 1 in 4 of the country are immigrants? It's interesting both how the more right-wing papers give the impression of more immigration, and how almost everyone over-estimates to some degree.

NP: Entroducing....., DJ Shadow

13:15 Thursday, 12 May 2005 [#] [life] (4 comments)

Asynchronous DBus Calls

This week I have been mostly playing with asynchronous calls in the DBus GLib bindings. DBus is inherently an asynchronous system, but the present GLib bindings wrap that with the GProxy object into a quite simple asynchronous interface, a simple synchronous interface, and a tool to generate incredibly simple bindings.

The synchronous interface is trivial: dbus_g_proxy_invoke. This will make a call with arguments, specified as addresses for arguments to send and locations to put return values in. It blocks until a reply is returned, and works well.

char **names;
dbus_g_proxy_invoke (proxy, "ListNames", error, G_TYPE_INVALID, G_TYPE_STRV, &names, G_TYPE_INVALID);

The asynchronous interface is pretty simple. First call dbus_g_proxy_begin_call() to send the message. This returns a DBusGPendingCall object, on which you call dbus_g_pending_call_set_notify to set a function which is called when a reply is received. Inside the callback, dbus_g_proxy_end_call will get the return arguments.

static void callback(DBusGPendingCall *call, DBusGProxy *proxy) {
  GError *error = NULL;
  char **name_list;
  int name_list_len, i;

  if (!dbus_g_proxy_end_call (proxy, call, &error,
                              DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
                              &name_list, &name_list_len,
                              DBUS_TYPE_INVALID)) {
      g_printerr ("Failed to complete ListNames call: %s\n", error->message);
      g_error_free (error);
      g_main_loop_quit (loop);
  }

  g_print ("Names on the message bus:\n");
  for (i = 0; i < name_list_len; ++i) {
      g_print ("  %s\n", name_list[i]);
  }
  g_strfreev (name_list);

  dbus_g_pending_call_unref (call);
  g_main_loop_quit (loop);
}

int main (int argc, char **argv) {
  DBusGConnection *connection;
  GError *error = NULL;
  DBusGProxy *proxy;
  DBusGPendingCall *call;
  
  g_type_init ();
  loop = g_main_loop_new (NULL, TRUE);

  connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
  proxy = dbus_g_proxy_new_for_name (connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);

  call = dbus_g_proxy_begin_call (proxy, "ListNames", DBUS_TYPE_INVALID);
  dbus_g_pending_call_set_notify(call, (DBusGPendingCallNotify)callback, proxy, g_object_unref);
  g_main_loop_run (loop);
  return 0;
}

Asynchronous method calls are possible in the GLib bindings, but are not wrapped by the bindings generator at the moment. As an example, this is the prototype for the generated binding of the ListNames call:

gboolean org_freedesktop_DBus_list_names (DBusGProxy *proxy, char *** OUT_names, GError **error);

Where OUT_names is a pointer to a string array. Now, wouldn't it be nice if the bindings could generate asynchronous wrappers too:

static void callback (char **names, GError *error, gpointer userdata) {
  char **i;
  g_print ("Names on the message bus:\n");
  for (i = names; *i; i++) {
    g_print ("  %s\n", *i);
  }
}
...
org_freedesktop_DBus_list_names_async (proxy, callback, NULL);

That was copied from working code by the way. Hopefully it will pass the Havoc test and get into CVS!

NP: Means of Production, Aim

11:50 Thursday, 12 May 2005 [#] [computers] (2 comments)

Devil's Pie "Can't Join Them? Beat Them" 0.10

Devil's Pie (everyone favourite window manipulation tool) 0.10 is finally out. This release is very special as it actually compiles with GNOME 2.10, many thanks to Crispin Flowerday for the final patch to complete this.

Downloads are in the usual place. I'll have Debian Sid and/or Ubuntu Hoary packages shortly.

21:23 Wednesday, 04 May 2005 [#] [computers/devilspie] (11 comments)

India Photos

It's rather late, but I finally put the photos from our trip to India and Nepal online. Enjoy!

NP: Protection, Massive Attack

17:30 Wednesday, 04 May 2005 [#] [life] (0 comments)

Vendor Branches in Subversion

Subversion vendor branches are something I've always ignored. Over the years I've developed a healthy fear of branching and merging, although it is common in developing Sound Juicer. Systems like Arch make it less scary as it keep track of atomic changesets, so making it harder to loose half of a change, but I'm using Subversion at the moment until Bazaar or bzr-ng is convincing enough (and well documented enough) for me to switch. Of course, at some point I knew I I'd need to use vendor branches but I put off learning exactly how they work (beyond "you branch and merge and it works") until I needed to. That point happened last week.

I read the Subversion book, which confused me a bit and pointed me towards svn_load_dirs, which has both a man page and a README, neither of which make a great deal of sense. So here I presume my summary, titled Vendor Branches In Subversion Without The Scary Details You Don't Need To Know.

Step 1 is to grab a copy of the upstream source. If you are taking snapshots from CVS use cvs export and not cvs checkout, otherwise you'll be committing the CVS/ directories into Subversion.

$ cvs export -r HEAD -d foo-20050504 foo

This will grab a copy the foo module from the tip, and put it into a directory called foo-20050504. As this is an exported copy of the source and not a checkout you cannot run any CVS commands on it, but that is not a problem as it will be deleted again in a few minutes.

If the upstream source is a tarball, extract it and make sure these is nothing hanging around which should not be in Subversion (such as generated files). Now to import it into Subversion.

$ svn_load_dirs svn+ssh://svn/repos/foo/ -t upstream/foo-20050504 upstream/current foo-20050504/

This needs some explaining. The first argument is the location of the repository, I assume that this has already been created. The second argument specifies that this import should be tagged upstream/foo-20050504, the third argument specifies the location to import the source too (upstream/current), and the forth and final argument is the path locally to import. Running this command will result in it asking a few questions to verify the tags, and then will churn for a few minutes as it does the import.

You'll want to import into a vaguely named directory such as current so that Subversion keeps a history of the upstream changes. Creating a tag for each version imported is essential for sanity: it will be used later on and if anything breaks it is trivial to extract known-good versions.

Now that the source is imported, it is time to create a local branch.

$ svn copy svn+ssh://svn/repos/foo/upstream/foo-20050504 svn+ssh://svn/repos/foo/trunk -m "Bring foo-20050504 into main branch"

This makes a copy of the imported source into /trunk/, which you can happily hack away on.

time passes...

Now it's the 1st June, and there is a new copy of Foo to be imported. Again, get a pristine copy and repeat the svn_load_dirs.

$ svn_load_dirs svn+ssh://svn/repos/foo/ -t upstream/foo-20050601 upstream/current foo-20050601/

This is where the magic really happens. svn_load_dirs will grab the current copy of current and compare it with the new drop. If there are any deleted or added files it will show them to you, so you can identify any file renames (thus both preserving history and saving space). It will then commit the new files into Subversion, and create a new tag. Then you can go into your working copy of trunk and merge the upstream changes with your own.

$ svn merge svn+ssh://svn/repos/foo/upstream/foo-20050504 svn+ssh://svn/repos/foo/upstream/current

This command will get the changes made in inbetween the 20050504 drop and the latest drop, and apply them to the current working directory. There are bound to be a few conflicts so resolve those, and then commit.

$ svn commit -m "Merged foo 200601 into trunk"

All done. Now you should go back and read the Subversion book and svn_load_dirs manual page, and I can ensure you they'll make a lot more sense this time.

NP: If You Can't Join Them, Beat Them, DJ Format

13:55 Wednesday, 04 May 2005 [#] [computers] (6 comments)

Holy Cow

Sarge just froze. Woohoo! Let's hope that Etch is a little speedier...

21:30 Tuesday, 03 May 2005 [#] [computers] (0 comments)

Look Into My Eyes...

I just received some spam with the subject Pay attention to the email. Is this a request? Are they hoping that I'll be sublimely influenced and start buying weight loss pills? I wonder what is next...

To: ross@burtonini.com
From: foo@bar.com
Subject: Look into my eyes not around the eyes into my eyes three two one
 you're under.  Give us your credit card details and buy our useless weight
 loss pills.  [click] and you're back.

Weight Loss Pills!! Amazing Low Price!!!

http://www.dodgyweightlosspills.com
      

20:50 Tuesday, 03 May 2005 [#] [life] (4 comments)