Myzone on Eee Keyboard
Asus had previously announced the Eee Keyboard, which isn't a keyboard but more a netbook with a full sized keyboard and wireless HDMI. The end result being that this is the ideal companion to your huge 1080p LCD television in the front room for light browsing and so on.
Now the Eee Keyboard also has a small touchscreen by the side of the keyboard, which had generally been shown displaing a calendar and the time. Fairly useful but nothing that interesting. However, they have recently demonstrated Moblin 2 running on the Eee, including the Myzone social desktop update thingy.
Now this is pretty neat. I don't know how the touchscreen is related to the main display, but a custom Moblin 2 panel and Myzone tailored to fill the touchscreen would be really cool. Now, where can I get an Eee Keyboard from...
NP: Arecibo Message, Boxcutter
Emacs Command of the Weekday
When Thomas talks about "us all" learning a new Vim command, he meant "us heretics". We pure and just people on the path of truth are far more interested in ecotd, Emacs Command of the Day, by our very own Neil.
Okay, I admit at times it looks like a parody, but honestly it isn't!
Sound Juicer "Bonnie and Clyde" 2.26.1
Sound Juicer "Bonnie and Clyde" 2.26.1 has been released. Tarballs are available on burtonini.com, or from the GNOME FTP servers. Some crashes have been fixes:
- Read the track artist instead of album artist in Musicbrain3
- Don't crash if the release date is unknown
- Read tracks when falling back to gvfs
Finally, a call for someone with deep LAME knowledge. The GStreamer LAME element is, well, lame because it sets a number of properties to default values that make it very difficult for LAME to work well. Someone who understands how all of the LAME settings operate needs to sit down, vet the settings and remove the pointless ones, unset most of the rest, leaving the 'preset' setting as the only one which has a default value. At the moment there are many contradictory default settings which mean LAME produces rather badly encoded files. Any takers?
Tasks 0.15
Just a small few fixes, translation updates, and little features in Tasks 0.15.
- Add --edit-task
- Use gtk_show_uri if available
- Lots of translation updates
- Add magic patterns "in x days" and "in x weeks"
As usual, download from the Pimlico Project.
Sound Juicer "Don't Go Back To Dalston" 2.26.0
Sound Juicer "Don't Go Back To Dalston" 2.26.0 has been released. Tarballs are available on burtonini.com, or from the GNOME FTP servers. Only translation updates this time, sorry.
Sound Juicer "I Call Out To You And You Don't Save Me?" 2.25.3
Sound Juicer "I Call Out To You And You Don't Save Me?" 2.25.3 has been released. Tarballs are available on burtonini.com, or from the GNOME FTP servers. I actually did some coding this time!
- Put the disc number in the file name
- Support multiple genres
- Use libcanberra for event sounds
- Handle custom patterns in the prefs dialog
- Remove Musicbrainz data if the track data is changed
- Fix disc number editing logic
- And lots of bug fixes by many people
Sound Juicer "I Should Be Crying, But I Just Can't Let It Show" 2.25.2
Sound Juicer "I Should Be Crying, But I Just Can't Let It Show" 2.25.2 has been released. Tarballs are available on burtonini.com, or from the GNOME FTP servers.
- Port to Brasero (Luis Medinas)
- Fix Solaris builds (Brian Cameron)
- Drop libgnome (Iain Holmes, Emilio Pozuelo Monfort)
- Fix conflicting mnemonics in the message area (Bastien Nocera)
- Fix mb3 backend (Bastien Nocera)
3G Woes
Has anyone out there used a recent Nokia phone (E65 to be precise) as a modem with Network Manager 0.7? I can't seem to get the magic right, and get one of two failures:
NetworkManager: <info> (ttyACM0): powering up... NetworkManager: <info> Registered on Home network an 15 10:50:04 blackadder NetworkManager: <info> Associated with network: +COPS: 0,2,"23415" NetworkManager: <WARN> dial_done(): Dialing timed out </WARN>
Or:
NetworkManager: <info> Activation (ttyACM0) Stage 1 of 5 (Device Prepare) complete. NetworkManager: <info> (ttyACM0): powering up... NetworkManager: <info> Registered on Home network NetworkManager: <info> Associated with network: +COPS: 0,2,"23415" NetworkManager: <info> Connected, Woo! NetworkManager: <info> Activation (ttyACM0) Stage 2 of 5 (Device Configure) scheduled.. . NetworkManager: <info> Activation (ttyACM0) Stage 2 of 5 (Device Configure) starting... NetworkManager: <info> (ttyACM0): device state change: 4 -> 5 NetworkManager: <info> Starting pppd connection NetworkManager: <debug> [1232015456.962700] nm_ppp_manager_start(): Command line: /usr/s bin/pppd nodetach lock nodefaultroute user web ttyACM0 noipdefault usepeerdns lcp-echo-failure 0 lcp-echo-interval 0 ipparam /org/freedesktop/NetworkManager/PPP/4 plugin /usr/lib/pppd/2.4.4/nm-pppd-plugin.so NetworkManager: <debug> [1232015456.964964] nm_ppp_manager_start(): ppp started with pid 29590 NetworkManager: <info> Activation (ttyACM0) Stage 2 of 5 (Device Configure) complete. pppd[29590]: Plugin /usr/lib/pppd/2.4.4/nm-pppd-plugin.so loaded. pppd[29590]: pppd 2.4.4 started by root, uid 0 NetworkManager: <WARN> pppd_timed_out(): Looks like pppd didn't initialize our dbus mod ule
Anyone know what the problem could be?
GUPnP Repositories
Zeeshan created a clone of the GUPnP repository at Gitorious today, so to any contributors to GUPnP: feel free to clone the repository there so that we can all benefit from a distributed version control system being used as it should be.
NP: Rendez-Vous (Mexico), Erik Truffaz featuring Murcof
Postr 0.12.3
A small point release to fix some small bugs before it's 2009...
- The Upload button now works
- Don't delete images if the upload fails
The tarball is here, and Debian packages are building now.
NP: Live at the Royal Albert Hall, The Cinematic Orchestra
SSH Tip Of The Day
Do you regularly ssh into machines which have dynamic IP addresses, and get really annoyed with OpenSSH warning that the IP's key doesn't match the host key? I certainly do, with machines announce their names using mDNS and a DHCP server in my router. Today I finally checked the documentation and found out how to skip this check.
The magic option is CheckHostIP, which you can set in .ssh/config on a per-host level. I've got this in my config:
Host *.local CheckHostIP no
Now all machines I ssh into using a .local domain won't have their IP's key checked against the host key, because the IP is dynamic. Sorted!
NP: Music Like Amon Tobin, Last.fm
All Hail Our Glorious New Maintainer
Or, Contact Lookup Applet 0.17 is now released. Some bug fixes and features thanks to the core widget being used in Nautilus Send-To:
- Pass future maintainership to Bastien Nocera
- Don't search unopened books
- Automatically detect sources (Bastien Nocera)
- Only error out if all the addressbooks failed to open (BN)
- Show one menu item for each e-mail address, and select by default in the contact details dialogue (BN)
The tarball is here: contact-lookup-applet-0.17.tar.gz.
Asynchronous Flickr Library, version 0.3
Finally, Flickrpc 0.3 is released. Some nice features that we all know and love from Postr here:
- Proxy support
- Add more upload arguments: safety, privacy, public/friends/private, search_hidden
- Cache the users full name, username and NSID (jcrosby)
- Fix UTF-8 encoding problems
- Verify our cached token before using it
Grab a tarball here or the Bazaar tree here.
Sound Juicer "Old Man Take A Look At My Life" 2.25.1
Sound Juicer "Old Man Take A Look At My Life" 2.25.1 has been released. Tarballs are available on burtonini.com, or from the GNOME FTP servers. Everyone's favourite Frockney did a huge amount of work on this, and I'm still talking to him after he admitted that the master plan is to replace Sound Juicer with Rhythmbox in Fedora!
- Chain the metadata lookups (Bastien Nocera)
- Finish the libmusicbrainz3 metadata fetcher (BN)
- Add a GVFS metadata fetcher as fallback (BN)
- Make libcdio option, as it breaks the GPL+Exception license (BN)
- Export ASIN, Discogs, Wikipedia in the internal metadata (BN)
- Lots of other cleanups to the metadata code (BN)
- Remove copy of the id3mux plugin, assume it exists now (BN)
- Remove Encoding field from desktop file (Pacho Ramos)
- Add Audio to desktop categories (Patryk Zawadzki)
- Correctly parse CDDA URLs (Matthew Martin)
- Don't free the option context
OfflineIMAP, ConsoleKit, GNOME Keyring
Over the weekend I finally got fed up with Evolution struggling to connect to work's "IMAP" server (Exchange 2007), and switched to using OfflineIMAP to sync the mail to a local Maildir. This as expected worked pretty well, and I'm now hidden from the nasty lag on the server. However, I've had to write my top secret Intel password into .offlineimaprc, which sucks. Then I had a cunning plan...
GNOME Keyring will store passwords in a pretty secure manner, so somehow I need to fetch the password from there. A quick look at the OfflineIMAP manual revealed that I can write Python functions which return the password, so I should be abe to hook into the keyring from OfflineIMAP. This should be fairly simple:
import gobject, gnomekeyring
# The keyring needs to know the application name
if gobject.get_application_name() is None:
gobject.set_application_name("offlineimap")
def keyring(user, host):
keys = gnomekeyring.find_network_password_sync(user=user, server=host, protocol="imap")
# First one will do nicely thanks
return keys[0]["password"]
...
remotepasseval = keyring("rburton", "imapmail.intel.com")
After writing a small tool to add the key to the keyring, to my surprise this worked first time. I bounced with glee, but ten minutes later I had error messages from OfflineIMAP running from cron in my inbox...
GNOME Keyring uses an environment variable to find the daemon, which isn't set in a cron environment. GNOME Keyring will fall back to using DBus to find the daemon, but the DBus session bus environment variable isn't set. DBus will fall back to reading the session bus address from the X root window, but DISPLAY isn't set so that doesn't work either... EPIC FAIL.
But, I thought, I upgraded to Network Manager 0.7 last week which bought in ConsoleKit. If I ask ConsoleKit for my sessions I should be able to find a session with has an X connection, then I can set DISPLAY appropriately and then the chain described above will work, and I'll have my password. Shockingly, this worked first time too:
import dbus, os
if not os.getenv("DISPLAY"):
# Get the ConsoleKit manager
bus = dbus.SystemBus()
manager_obj = bus.get_object('org.freedesktop.ConsoleKit', '/org/freedesktop/ConsoleKit/Manager')
manager = dbus.Interface(manager_obj, 'org.freedesktop.ConsoleKit.Manager')
# For each of my sessions..
for ssid in manager.GetSessionsForUnixUser(os.getuid()):
obj = bus.get_object('org.freedesktop.ConsoleKit', ssid)
session = dbus.Interface(obj, 'org.freedesktop.ConsoleKit.Session')
# Get the X11 display name
dpy = session.GetX11Display()
if dpy:
# If we have a display, set the environment variable
os.putenv("DISPLAY", dpy);
break
(man, I really with python-dbus had a better syntax for getting objects with a specific interface)
So there you go, integrating OfflineIMAP with the GNOME Keyring via ConsoleKit and DBus. Surprisingly this was pretty easy to do, thanks to DBus and the magic provided by ConsoleKit it is 100% hack free.
Tasks In GNOME SVN
Thanks to the heroic work of Olav and Thomas, Tasks (along with Contacts and Dates) is now in GNOME SVN. Translators, feel free to do your thing. Oh, and would it be possible to get Tasks added to Damned Lies?
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
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.
- Magic date parser when adding tasks
- Support libunique in the GTK+ port (Jonny Lamb)
- Support OWL window menus in the GTK+ port
- Save and restore the edit window size
- Add a clickable note icon (#548)
- Ellipsize the undo/redo menu items (#741)
- Make sure the date popup doesn't go off the screen (#752)
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.
- 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!
- 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.
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.
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.
- Don't crash when exiting
- Don't distribute full GFDL with docs
- Correctly parse CDDA URLs (#550131, thanks Matthew Martin)
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:
- Stop playback when the disc is re-read (Matthew Martin)
- Only eject the disc if tracks were ripped (MM)
- Don't try and move the non-existant temp file when skipping (MM)
- Free the option context (Pierre Benz)
- Don't block until n-c-b quits when copying discs
- Fix playback track switching (MM)
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:
- Fix play+pause+play (#523182, thanks Matthew Martin)
- Add %ay, album year (#522909, Juan F. Giménez Silva)
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!
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!
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.
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
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.
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
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?
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.
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...
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...
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
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!
- Port to GIO (Michael Terry)
- Update URL handling for New GIO World Order (Bastien Nocera)
- Fix display problems with the cluebar (Pekka Vuorela)
- Add audio preview when overwriting (Luca Cavalli)
- Use GtkVolmeButton instead of BaconVolume (MT)
- Fix crash when no profile is selected (Matthew Martin)
- Add []<> to the special character list (MM)
- Make the year and disc entries a11y (Patrick Wade)
- Fix error handling in CD playback (Tim-Philipp Müller)
- Require intltool 0.40
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.
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.
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.
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.
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
Gypsy and Geoclue in Fedora
Thanks to Peter Robinson, both Gypsy and Geoclue are scheduled for addition to Fedora 9 Updates. Thanks Peter!
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.