Translation Nightmare

I just got a new bug titled Very weird translation template, need comments in .pot file to clarify, and giggled to myself. I was wondering how long it would be for this bug to be filed. The problem is that whilst most of the translatable strings in Tasks are pretty boring: "Tasks", "today", "Priority" and so on, all of a sudden the template goes a bit mental:

"^(?<task>.+) (?:by|due|on)? (?<month>\\w+) (?<day>\\d{1,2})(?:st|nd|rd|th)?$"

Apparently the average translator doesn't think that learning PCRE-style regular expressions, and reading the source that uses this string to understand how it is to be used, is appropriate. [note: this is sarcasm]

Maybe I should have added some translator comments to clarify exactly what I meant by this. These monster strings (all in koto-date-parser.c) are GRegex regular expressions which are used to parse the user's input to try and extract meaningful date information. To translate these strings you'll need to have a basic understanding of regular expressions: if you don't then skip them and hopefully someone who does will finish the translation. If you know regular expressions then translating these strings is easy, honest.

The golden rule is to never translate the words which look like this: (?<foo>. These are markers which identify portions of the input (such as task or month) and need to remain in English, although they can be moved around if required. The rest of the strings are translatable. I'll give an example using the French translation by Stéphane Raimbault. First, the string in English and a worked example:

"^(?<task>.+) (?:by|due|on)? (?<day>\\d{1,2})(?:st|nd|rd|th)? (?<month>\\w+)$"

First, we have a sequence of any characters identified as task, which magically expands to be as many as possible. This is optionally followed by one of the words "by", "due" or "on". This is followed by one or two digits identified as day followed by "st", "nd", "rd" or "th". Finally a sequence of characters which is identified as month. If the user had entered "pay bills on 2nd june" then task would be "pay bills", day would be "2", and month would be "june". Tasks can then turn "june" into a month number through other translations, and it now knows what date the user entered. In French, this translates as follows:

"^(?<task>.+) (?:pour|prévu|pour le)? (?<day>\\d{1,2})(?:er|e)? (?<month>\\w+)$"

See, I said it was easy! All I need now is a legion of translators who understand regular expressions enough to correctly translate the new Tasks... [this, again, is sarcasm] Luckily, plans are afoot to move the Tasks source to the GNOME Subversion server, so the full fury of the GNOME translation team can attack this.

NP: Trailer Park, Beth Orton

21:17 Wednesday, 01 Oct 2008 [#] [computers] (9 comments)

Tasks 0.14

It's been nearly 10 months after the previous Tasks release, for which I profusely apologise. I wanted to fix one final bug before releasing, which sadly took five months to get around too... I eventually fixed it last night, so here is Tasks 0.14.

The most interesting change in this release is the magic date parser, which first landed back in March. This lets you use Google Calendar style descriptive tasks such as "release tasks today", "do shopping next tuesday" or "pay bills on 2nd". There are many patterns that are matched but I need two things from any users of Tasks.

  1. Translations. At the moment there are only English and French translations for the strings, which are critical for the parser to work. Translators, please update the translations!
  2. Feedback. The parser handles all of the natural language expressions that I thought would be useful. There are probably plenty more which are not handled, so if you find one which isn't handled (or is handled incorrectly) then please file a bug.

Oh, and one last thing. The OpenMoko and Maemo ports have likely bitrotted. New functionality has been added to the platform abstraction and I don't think those ports were updated. If someone actively uses Tasks on either Maemo or OpenMoko and is willing to test builds before release, please contact me.

08:45 Monday, 29 Sep 2008 [#] [computers] (2 comments)

Sound Juicer "Why Should You Know Better By Now" 2.24.0

Sound Juicer "Why Should You Know Better By Now" 2.24.0 has been released. Tarballs are available on burtonini.com, or from the GNOME FTP servers.

13:41 Sunday, 21 Sep 2008 [#] [computers/sound-juicer] (1 comments)

Sound Juicer "Stab Stab Stab! This Is More Than A Message" 2.23.3

Sound Juicer "Stab Stab Stab! This Is More Than A Message" 2.23.3 has been released. Tarballs are available on burtonini.com, or from the GNOME FTP servers.

11:01 Monday, 08 Sep 2008 [#] [computers/sound-juicer] (0 comments)

Sound Juicer "I Don't Know What You Heard But It's Mandatory" 2.23.2

Sound Juicer "I Don't Know What You Heard But It's Mandatory" 2.23.2 has been released. Tarballs are available on burtonini.com, or from the GNOME FTP servers. Lots of fixes from the Amazing Matthew Martin:

14:59 Monday, 18 Aug 2008 [#] [computers/sound-juicer] (0 comments)

Sound Juicer "We're Singing In Tune But Now It's Over" 2.23.1

Sound Juicer "We're Singing In Tune But Now It's Over" 2.23.1 has been released. Tarballs are available on burtonini.com, or from the GNOME FTP servers. Nothing that amazing here, sorry:

20:33 Monday, 04 Aug 2008 [#] [computers/sound-juicer] (0 comments)

GUADEC

Hmm, so I never did blog a GUADEC roundup. In two words: it rocked. Congratulations to Baris and everyone else who organised it!

In other late GUADEC news I finally reviewed the rest of my GUADEC photos and uploaded them to Flickr. I'll try and not take a month to upload next time, honest!

21:40 Tuesday, 29 Jul 2008 [#] [computers] (0 comments)

OH Wares

I've just been informed that Rob Bradford has one large "I3<OH" left. If you want one, then find him fast! The grapevine also says that there is a crack team of rouge OH Men on the loose, so watch out!

14:14 Friday, 11 Jul 2008 [#] [computers] (0 comments)

GUPnP Action

Action around GUPnP has been really hotting up recently. Jorn is back from the dead studying and demonstrating that he hasn't lost his touch by refactoring the various audio/visual widgets spread around our toy projects into libowl-av, adding Vala bindings, and then writing a MediaRenderer implementation on top of that. This means we now have reference implementations of the full media specification in the form of gupnp-media-server (server), gupnp-av-cp (control), and gupnp-media-renderer (playback).

Also Johan Kristell posted to the list for the first time with an implementation of the Digital Security Camera specifications, both server and client. GUPnP Network Camera currently only supports still images, but as it is based on GStreamer video can't be far away.

14:00 Monday, 30 Jun 2008 [#] [computers] (1 comments)

Erm...

case "$1" in
        *.sh)
                # Source shell script for speed.
                (
                        trap - INT QUIT TSTP
                        scriptname=$1
                        shift
                        . $scriptname
                )
                ;;
        *)
                "$@"
                ;;
  esac

OPTIMISATION FAIL.

NP: Roseland NYC Live, Portishead

18:00 Monday, 23 Jun 2008 [#] [computers] (5 comments)

Zebu 0.1

As one of the maintainers of debian.o-hand.com I use the always wonderful pbuilder and cowbuilder to rebuild packages originally build for Debian Sid for Debian Etch, Ubuntu Gutsy, Hardy, and so on. Continually typing the commands to update the cowbuilders can get tiresome fast so last week I scratched the itch and produced Zebu.

Zebu

As of version 0.1 it is barely functional but it does let you update or login to a cowbuilder. It requires that the cowbuilders are named /var/cache/pbuilder/*.cow and doesn't support "traditional" pbuilder rootstraps yet, but that is planned. Anyway, cowbuilders are the future.

If anyone else thinks this could be useful there is a tarball and a Bazaar repository. I must also thank the wonderful Ulisse Perusin for the rocking icon he created.

NP: Cosmos, Murcof

14:20 Sunday, 22 Jun 2008 [#] [computers] (4 comments)

Wanted: Icon

I'm hacking on a small tool at the moment and need an icon for the launcher. A simple icon of a cow's head would be perfect: anyone know of something like this, or willing to quickly draw one for me?

09:40 Wednesday, 18 Jun 2008 [#] [computers] (11 comments)

Postr 0.12.2

Another point release of Postr which should fix Flickr authentication for good this time. Also the file size limit has been increased to 20Mb to match the new Flickr limits.

The tarball is here, and packages for Debian are being worked on next.

15:10 Sunday, 15 Jun 2008 [#] [computers/postr] (9 comments)

UPnP in Epiphany

One of the more useful features of the UPnP specification is that devices have a standard way of specifying a "presentation URL", a human-readable web page representing the device. For example, my SoundBridge has a web page which shows the currently playing music and lets me switch radio station, whilst my router's presentation URL is the administration page.

Useful, but not exposed anywhere. Until now...

GUPnP in Epiphany

This is a small Epiphany extension which adds all presentation URLs it finds to the Nearby Sites menu, just like the URLs discovered using Avahi. It needs a bit more work as it doesn't yet handle being unloaded or devices disappearing, but it is certainly usable now.

If anyone else wants to have a go with it, the source can be fetched using Bazaar from here. Watch out for the currently hard-coded paths...

22:10 Thursday, 12 Jun 2008 [#] [computers] (6 comments)

GUPnP Documentation

What started off as a quick tutorial to writing a service using GUPnP turned into a week of reviewing and writing more GUPnP documentation. It's all landed in our Subversion repository now but if anyone wants to see how to write a UPnP client, implement the UPnP networked light bulb service, or just browse the beginnings of the glossary, then I have a local copy of the latest documentation online.

NP: Aerial, 2562

17:15 Tuesday, 10 Jun 2008 [#] [computers] (0 comments)

Sound Juicer "Harder Now With Higher Speed" 2.23.0

Sound Juicer "Harder Now With Higher Speed" 2.23.0 has finally been released.. Tarballs are available on burtonini.com, or from the GNOME FTP servers. Hot new features!

I really need some heavy testing on the GIO rewrite, so please try and extract tracks to as many different targets as possible. Although I expect confirmation that using an unmounted remote location currently fails, it should be possible to use this to write to Samba, OBEX-FTP, and so on.

13:34 Thursday, 05 Jun 2008 [#] [computers/sound-juicer] (2 comments)

Postr 0.12.1

I just made a quick Postr 0.12.1 release to fix authentication with non-trivial HTTP handler strings. If you can't login to Flickr with Postr, then this release should fix it for you.

The tarball is here, and packages for Debian are being built now.

In other news postr.dev has seen a lot of development and is looking pretty damn neat at the moment.

10:00 Tuesday, 27 May 2008 [#] [computers/postr] (5 comments)

GUPnP Bindings Generation

I've now finished the first draft of the bindings generation tool for GUPnP, which is now part of libgupnp itself. I've added both blocking and non-blocking wrappers, so if you wanted to get the external IP there is the choice of this for blocking calls:

char *ip;
GetExternalIPAddress (proxy, &ip, &error);

Or this for non-blocking calls:

static void
external_ip_cb (GUPnPServiceProxy *proxy, char * ip,
                GError *error, gpointer userdata)
{
  // ...
}
...
  GetExternalIPAddress_async (proxy, external_ip_cb, NULL);

I've ported my test applications to use the bindings, which are available in this Bazaar repository. It appears to work quite well, I just need to test it against all of the official service descriptions and add a few small features.

16:40 Friday, 23 May 2008 [#] [computers] (0 comments)

GUPnP Autogeneration

The problem with GUPnP is that (like DBus) when programming from C you need to specify the types of each argument when making a method call:

gupnp_service_proxy_send_action (proxy,
                                   "AddPortMapping", &error,
                                   /* In arguments */
                                   "NewRemoteHost", G_TYPE_STRING, "",
                                   "NewExternalPort", G_TYPE_UINT, external_port,
                                   "NewProtocol", G_TYPE_STRING, "TCP",
                                   "NewInternalPort", G_TYPE_UINT, internal_port,
                                   "NewInternalClient", G_TYPE_STRING, internal_host,
                                   "NewEnabled", G_TYPE_BOOLEAN, TRUE,
                                   "NewPortMappingDescription", G_TYPE_STRING, desc,
                                   "NewLeaseDuration", G_TYPE_UINT, 0,
                                   NULL,
                                   /* Out arguments */
                                   NULL);

Now, that really is quite tiresome. It basically means that you need to have the service reference to hand when coding, because you need to know the name and type of each argument. Luckily for DBus part of dbus-glib is a binding tool which can create type-safe wrappers so that making method calls is much easier. Wouldn't it be nice if there was something similar for GUPnP, which generated inline functions with prototypes like this:

static inline gboolean
AddPortMapping (GUPnPServiceProxy *proxy,
                char * in_NewRemoteHost,
                unsigned int in_NewExternalPort,
                char * in_NewProtocol,
                unsigned int in_NewInternalPort,
                char * in_NewInternalClient,
                gboolean in_NewEnabled,
                char * in_NewPortMappingDescription,
                unsigned int in_NewLeaseDuration,
                GError **error);

Well, now there is. I've put the initial code here but will be moving this into GUPnP itself shortly. The next task is to add asynchronous wrappers just as in dbus-glib, but that shouldn't be too hard.

16:25 Thursday, 22 May 2008 [#] [computers] (0 comments)

Anjuta+Poky Integration

Yesterday I tested and rolled a new release of the Poky integration plugin for Anjuta, created by our fearless Sir Bradford. This is a very special piece of magic which lets you use a Poky SDK in Anjuta to cross-compile binaries without any pain, and will even deploy, execute and debug the binaries in a QEMU for testing. As part of the release process I had to test it, so I'll step through what I did as a brief tutorial on how to use Anjuta with Poky.

The prerequisites are Anjuta, the Anjuta Poky SDK plugin, and QEMU. These are all available for installation from our Debian repository for Debian/Ubuntu users, everyone else will have to build from source, sorry! You'll also need a Poky ARM SDK and QEMU ARM images from the Poky web site. The SDK is a tarball which contains a cross compiler with base libraries (glibc, GTK+, and so on) and should be extracted onto your machine (it extracts the SDK into /usr/local/poky). The QEMU image consists of a kernel and a ext3 file system which will boot Poky inside QEMU.

To start I fetched a checkout of Tasks and loaded up Anjuta. I don't have an existing Anjuta project for Tasks, so I used File → New → Project From Existing Sources to create a project using the checkout. At this point I could do native development using Build → Run Configure and Build → Build Project to configure and compile the source, but we want to cross-compile.

To activate cross compiling go to Edit → Preferences → General → Installed Plugins and enable the Poky SDK plugin. This will add a new page Poky SDK to the preferences dialog. We're using an external toolchain so set the SDK root to /usr/local/poky/eabi-glibc/arm and the toolchain triplet to arm-poky-linux-gnueabi. We're also using QEMU instead of a real device so set the paths to the kernel and root filesystem (remembering to uncompress the filesystem). We're now done configuring, so the preferences dialog can be closed. However notice that if you switch from using a SDK to building with a full Poky tree you can use the cross-compiler it produces directly, and you can also use an external device instead of QEMU: the only requirement is that you can SSH into it.

Now to do the build. Use Build → Run Configure to configure Tasks, passing any extra options you want. Note that if you want to debug your build in the future you'll need to enter CFLAGS=-g here to disable optimisation (autoconf sets -O2 -g by default, which isn't useful for debugging). The configure script is then ran with the right environment and options for cross compiling, and with any luck will successfully configure. Then hit Build → Build Project and watch the cross-compiler do its thing. When that has worked, you can prove to yourself that the right thing has happened.

$ file tasks
  tasks: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.14, dynamically linked (uses shared libs), not stripped

We have an ARM binary, ready for deployment. Start the virtual machine with Tools → Start QEMU (this may ask for your root password to configure networking) and once it has booted you can install the project into the VM with Tools → Deploy. This will run make install to a temporary directory and then rsync it to the VM. Now you can either interact with the VM directly (if the application installed a new desktop file, then it should appear on the desktop), or use Tools → Run Remote to execute a binary directly: entering tasks will execute the freshly installed Tasks. Neat, huh?

For the final trick there is even GDB integration. Tools → Debug Remote will let you specify a local binary (to extract debug symbols from, say src/gtk/tasks) and a remote binary to run, and then start a GDB on the VM and connect to it. The binary will be initially running but paused at the entrypoint, so you can add breakpoints and then continue execution.

Hopefully this post has been a good overview of the integration available between Poky and Anjuta. In the future I hope to see Nemiver integrated into Anjuta, and gdbserver support in Nemiver, which would be a killer combination for Poky integration.

NP: One On Twoism, Various

17:40 Tuesday, 20 May 2008 [#] [computers] (5 comments)

Gypsy and Geoclue in Fedora

Thanks to Peter Robinson, both Gypsy and Geoclue are scheduled for addition to Fedora 9 Updates. Thanks Peter!

10:50 Monday, 19 May 2008 [#] [computers] (2 comments)

Today's Second Geohack

I managed to wangle a Fire Eagle invitation this morning, so over lunch I grabbed the Python API Kit and threw it at the sample Gypsy client.

$ ./gypsy-fireeagle.py 00:0B:0D:88:A4:A3
got 51.861145 0.156275
Updated FireEagle

The first line is me running my script (this one is 64 lines, but it is half whitespace), telling it where my GPS is. The second line is the current position that my rather cheap and nasty GPS determined. The third line tells me that Fire Eagle has been updated with those coordinates.

Suffice to say I'm very impressed with Yahoo's geocoding software. My GPS never settles to an accurate reading and will happily jitter around a 20 metre wide circle for hours, but the location Fire Eagle is reporting me at is two doors away. I'm not exaggerating: it says number 9 on my street when it should be number 5. That is some incredibly accurate mapping they have.

15:15 Tuesday, 13 May 2008 [#] [computers] (0 comments)

Today's Geohack

Following hot on the heels of Yahoo's announcement of their Internet Location Platform, I wrote a quick 20-line Python hack to convert from latitude and longitude to a place name. Because the ILP doesn't yet expose the ability to go from a position to a WOEID we have to ask the Flickr web services to do this first (as Flickr is owned by Yahoo this is using the same backend). Once we have the WOEID, it can be then be looked up on the ILP and useful information obtained. Example speak more than words:

$ python geohack.py 
Using position 51.872330 0.161950
Got WOEID 12775
Got town Bishop's Stortford

Now to write a GeoClue provider which will fill in the locality information from the position. Long-term grand plans involve integrating all of this geo magic into Postr, somehow.

NP: Third, Portishead

10:50 Tuesday, 13 May 2008 [#] [computers] (4 comments)

Fire Eagle Invitation?

Does anyone out there on the Intarwebs work for Yahoo, or have a friend who works at Yahoo? I'd really like to give this Fire Eagle thing a go, specifically integrating Gypsy and GeoClue with Fire Eagle, but it's invitation only at the moment...

Update: I now have an account!

21:50 Monday, 12 May 2008 [#] [computers] (3 comments)

GUPnP Basics, Part 1

For the last few days I've been learning more about UPnP and testing it with the few devices I have around the house. One of these is a cheap ADSL router, which apparently has the lamest UPnP stack on in existence. It does however support the WAN IP Connection interface, so you can use UPnP to get the external IP address and manipulate the port mapping. I'll skip over the horrific security violations this involves, because it's a useful demonstration that the majority of people will be able to test.

Today we'll start simple and get our external IP address using GUPnP. The first thing to be done is to create a Control Point, which in the UPnP model handles discovery of resources, be them devices or services (a device can have multiple services). When creating a control point you can specify the URN of the resource you want to target. In this case we want all services providing WANIPConnection so we'd use urn:schemas-upnp-org:service:WANIPConnection:1. If you want to browse for all services then use ssdp:all (SSDP being the Simple Service Discovery Protocol).

static GMainLoop *main_loop;

int
main (int argc, char **argv)
{
  GError *error = NULL;
  GUPnPContext *context;
  GUPnPControlPoint *cp;
  
  /* libsoup requires threading, so we have to initialise it */
  g_thread_init (NULL);
  g_type_init ();

  /* Default GLib context, default host IP, default port */
  context = gupnp_context_new (NULL, NULL, 0, &error);
  if (error) g_error (error->message);

  /* Create a control point targeting WAN IP Connection services */
  cp = gupnp_control_point_new
    (context, "urn:schemas-upnp-org:service:WANIPConnection:1");
  /* The service-proxy-available signal is emitted when any services which match
     our target are found */
  g_signal_connect (cp,
		    "service-proxy-available",
		    G_CALLBACK (service_proxy_available_cb),
		    NULL);
  
  /* Tell the control point to start searching */
  gssdp_resource_browser_set_active (GSSDP_RESOURCE_BROWSER (cp), TRUE);

  /* Enter the main loop */
  main_loop = g_main_loop_new (NULL, FALSE);
  g_main_loop_run (main_loop);

  /* Clean up */
  g_main_loop_unref (main_loop);
  g_object_unref (cp);
  g_object_unref (context);
  
  return 0;
}

static void
service_proxy_available_cb (GUPnPControlPoint *cp,
                            GUPnPServiceProxy *proxy)
{
  /* ... */
}

Now we have an application which searches for the service we specified and calls service_proxy_available_cb for each one it found. Now, to get the external IP address we need to invoke the GetExternalIPAddress action. This action takes no in arguments, and has a single out argument called "NewExternalIPAddress". Yes, the naming scheme is stupid. GUPnP has a set of methods to invoke actions -- which will be very familiar to anyone who has used dbus-glib -- where you pass a NULL-terminated varargs list of (name, type, value) tuples for the in arguments, then a NULL-terminated varargs list of (name, value, return location) tuples for the out arguments. A simple implementation would be as follows.

static void
service_proxy_available_cb (GUPnPControlPoint *cp,
                            GUPnPServiceProxy *proxy)
{
  GError *error = NULL;
  char *ip = NULL;
  
  gupnp_service_proxy_send_action (proxy,
				   /* Action name and error location */
				   "GetExternalIPAddress", &error,
				   /* IN args */
				   NULL,
				   /* OUT args */
				   "NewExternalIPAddress",
				   G_TYPE_STRING, &ip,
				   NULL);
  
  if (error == NULL) {
    g_print ("External IP address is %s\n", ip);
    g_free (ip);
  } else {
    g_printerr ("Error: %s\n", error->message);
    g_error_free (error);
  }
  g_main_loop_quit (main_loop);
}

Note that _send_action blocks until the service has replied. If you need to make non-blocking calls then use gupnp_service_proxy_begin_action which takes a callback.

So, that is searching for services and invoking actions in GUPnP. Next time I'll cover subscribing to state variables, and routers which can't count.

NP: Folk But Not Folk, Various

12:50 Monday, 12 May 2008 [#] [computers] (0 comments)

EphyDeli 0.3

EphyDeli is a Python extension for Epiphany that adds Post To Delicious menu and toolbar items for posting the current page to Del.icio.us. I know of several people who use it frequently and the last release was in 2006, so I've obviously mastered the Unix philosophy well here! This release was caused by those mean old Epiphany developers changing the API, many thanks to Thibauld Nion for noticing this and sending a patch.

To download it you can either grab the tarball or fetch the bzr tree.

20:12 Tuesday, 29 Apr 2008 [#] [computers] (1 comments)

It's Bubbling Hot

$ cat /proc/acpi/thermal_zone/*/temperature
temperature:             84 C
temperature:             90 C

Maybe it's time to get a dedicated build machine, my poor laptop gets quite toasty when building Poky. Then again it seems happy enough, so maybe I should just use an external keyboard to avoid boiling my hands.

NP: Oneric, Boxcutter

17:47 Thursday, 24 Apr 2008 [#] [computers] (6 comments)

Postr 0.12

A quick Postr 0.12 release, mainly to fix an annoying bug but there are some neat new features here too.

The tarball is here, and packages for Debian have been uploaded.

10:30 Wednesday, 23 Apr 2008 [#] [computers/postr] (6 comments)

Postr 0.11

I finally got around to fixing the very annoying text wrapping problem in postr.dev, I thought I best release Postr 0.11:

The tarball is here, and packages for Debian have been uploaded.

16:50 Sunday, 20 Apr 2008 [#] [computers/postr] (3 comments)

No Iain, I Am Luis Villa

Iain, you are clearly an imposter. And this perfect-sighted intruder, whoever he is, should be hunted down, because I am Luis Villa!

I Am Luis!

14:40 Thursday, 17 Apr 2008 [#] [computers] (0 comments)

We're Hiring!

Here at OpenedHand Towers we've just announced some more job openings, so if you have skills in any of the kernel, X.org, GTK+, Clutter or OpenEmbedded then please have a look. We're also after user interface/interaction designers, junior designers (print/web/UI), and have an student internship for a programmer. Pretty much something for everyone!

14:45 Wednesday, 16 Apr 2008 [#] [computers] (0 comments)

GNOME Mobile Moduleset

I just committed to JHBuild three new modulesets, mobile-2.24, pimlico and matchbox, so that GNOME people wanting to develop against the GNOME Mobile platform can use tools they know to build everything they need.

mobile-2.24

This changes GConf and EDS to use the DBus ports, and provides meta-mobile-platform which builds the complete platform.

pimlico

This builds Contacts, Dates and Tasks, providing meta-pimlico.

matchbox

This builds Matchbox Panel, Matchbox Desktop, Matchbox Keyboard and Matchbox Window Manager, providing meta-matchbox.

Also, Poky is building images nightly with the complete platform in, which will let you build and test software in a PDA-style environment with QEMU, running on x86 or a number of ARM-based devices (such as Nokia N800, Sharp Zaurus or OpenMoko).

Last week at the Collaboration Summit in Austin (which I couldn't attend for personal reasons) there was a day-long GNOME Mobile meeting, as a result of which there is now a long list of packages which need to be considered for addition to the Platform (such as HAL, Gypsy and Geoclue), and a few changes (such as replacing gnome-vfs with gvfs). I hope to review the proposals fairly shortly, so that we can hopefully make an initial GNOME Mobile 2.24 platform release alongside the Desktop release in September.

In other news, this is exactly what the Internet is for.

NP: Blue Moon Station, Solar Fields

16:10 Tuesday, 15 Apr 2008 [#] [computers] (0 comments)

Dear Interwebs: Secure SMTP Relay Wanted

I'm looking for a basic SMTP relay which supports SMTP AUTH, TLS, supports the sendmail interface, and has a local mail queue, so that I can send mail from my laptop in Evolution (to localhost, or calls sendmail) and the shell (calling sendmail) when online or offline.

I need SMTP AUTH and TLS, which means nbsmtp, masqmail, and nullmailer are out. I want a local queue for when I'm not online which means esmtp, ssmtp, msmtp, and nullmailer are out (I'm not convinced that msmtp's queue scripts are reliable enough). Surely there must be a simple SMTP relay which will reliably manage a queue if the mail cannot be sent! If not, does anyone know of a good guide to configuring Postfix or Exim to do this?

14:22 Sunday, 30 Mar 2008 [#] [computers] (15 comments)

New Gypsy Release

Coding Legend Iain has just released Gypsy 0.6, the all-new GPS multiplexing daemon which focuses on being lean and easy to use, and not on, erm, putting your GPS on the Internet or something weird.

Because I'm fairly lame there are not matching Debian packages yet, but I'll get around to that tomorrow. In other news, a very nice man called Ian Lawrence wrote a buzzword-compliant tutorial where he uses Gypsy to talk to a Bluetooth GPS, tests it with my Gypsy Status 10-minute hack, and then uses Django to redirect the user to the relevant geohash.org page.

NP: Remembranza, Murcof

16:00 Thursday, 27 Mar 2008 [#] [computers] (4 comments)

EDS and Memory

I was going to reply to Philip's post, but Federico did a wonderful job before I could start.

That said, I still haven't forgiven you for some of the finer details of libecal Federico. :)

21:20 Wednesday, 19 Mar 2008 [#] [computers] (2 comments)

Dear Intertron: Emacs Help Please?

I recently switched to Emacs from XEmacs, and have pretty much got it working how I like. There are just two problems remaining.

  1. I'm using emacsclient, and when I close the last frame Emacs quits. With XEmacs when in server mode the process continues when the last frame is closed, anyone know how I can get Emacs to do this too?
  2. Emacs appears to be moving the mouse pointer when I open a new frame. This is totally frustrating not only because I use sloppy focus, but also because its moving the point to the wrong frame. How can I turn this off?

Help greatly appreciated!

10:40 Wednesday, 19 Mar 2008 [#] [computers] (6 comments)

Traits of the Common and Generally Mythical Evolution Data Server Replacement

When not writing media centres or GL toolkits, it appears that the latest trend in open source is to write Evolution Data Server replacements. There is a fairly common pattern forming.

First, implementation details will be announced as a major, if not the main, feature. The shining example is "based on DBus". Yes, DBus is great. Yes, ORBit is a dying technology for something as simple as transfering a few strings between two processes. But this is an implementation detail. I'd prefer a project using DBus instead of another incredibly complicated IPC, but implementation details are typically not something to get excited about.

Often this first point gets out of control and suddenly the point of the project is to design a DBus interface, not to write real working code. Of course, an interface without any code behind it, without any reference implementation, without several applications and different users, is bound to be broken somewhere. But you'll never know until it is too late and you've labelled the interface as STABLE. Learn from DBus itself, anyone who followed the project before 1.0 knows that the core concepts were rewritten several times before it was finally marked as stable.

Spreading basic FUD is fairly common too. "EDS is not efficient concerning network bandwidth" doesn't make sense, because EDS is a local daemon. When it does talk over the network, it's fairly sensible. The LDAP (and Groupwise/Exchange I believe) backend maps EDS searches to native searches so that only the requested items are fetched. Backends such as WebCal have no option but to fetch the entire file, because that is how they work. "EDS is not efficient concerning memory usage" is rather vague, and if you interpret it as "private dirty memory usage is unreasonably high when in use" then in my opinion that is untrue and I have Massif logs to back me up.

If these points were true, they'll generally be fixable within EDS. The default local calendar backend is implemented as an iCalendar file on disk, which is parsed into memory in its entirety on startup. This certainly works well for a basic implementation but should be replaced with a database of some sort, a simple one which stores a hash of UID to event would reduce memory usage for large calendars. Add to that a cache of start and end times to optimise that common case and the end result is probably both faster and uses less memory, for a few days work.

Occasionally complaints are spot-on, but EDS isn't immutable and whilst starting a new project from scatch may be more fun, please think of everyone else. EVCard is over-complicated and yet tragically crippled, whilst EContact tries to be clever but generally gets in the way. Luckily we can write a new contact object which is easier to use. The query language is limited, but Milan Crha of Red Hat fame has been chipping away and now it's more flexible without breaking existing applications. Maybe someone can come up with a good replacement language, and the old language deprecated.

I'll summarise what I'm trying to say.

NP: Kharah System, Hereill

17:00 Tuesday, 18 Mar 2008 [#] [computers] (8 comments)

Testers Wanted

Over the weekend I hacked on a clone of Marco Polo for GNOME. The idea is that you define a set of contexts, such as "work", "in meeting" or "home". The current context is determined by a set of rules, for example being on the "Burton" wireless network means I'm in the "home" context, the time being between 09:00 and 18:00 means the "daytime" context, and so on. Finally, when entering or leaving a context actions can be executed, such as muting the sound card, mounting a remote drive, or changing the default printer. So far I have sources for the time of day and wireless network name, and actions to run a command and set a GConf key.

Now that the basics are in place, I'm looking for other alpha-testers. Experience with Python is a requirement at the moment as there is no UI or configuration file yet. That said, if this application sounds like it could be useful to you then please email me.

NP: !K7, Various

11:00 Tuesday, 18 Mar 2008 [#] [computers] (7 comments)