this is aaronland

Thick like “vegannaise”

pmPDF 0.3

I've released pmPDF.php 0.3 with fresh and minty support for variable paper sizes (thanks again to Theis P. Hansen for the patch) and fixes for the arbitraty positioning of images.

In addition to positioning, the library will also resize images based the available space on the page relative to the image's starting point. The tarball contains both example code and a sample PDF file illustrating the idea.

Here's a screenshot of a more complex version; one which has been touched on in earlier posts :

This one-page booklet was generated from a text file containing names and addresses of bakeries in Paris that was read by a script which plotted the addresses using Google's geocoder API and then fetched various maps using Yahoo's map image API. For bonus points, it squirted in a variety of QR codes and then laid it all out in handy PocketMod format.

By which I mean to say : When do we get APIs for My Maps ?

The PaperFS

The Joker

Like everyone else, I laughed when Google announced their Gmail Paper service, on April 1.

The thing about the joke, though, is that it's a really good idea.

Sooner or later everyone starts to think about generating a paper dump of their 4-billion email messages or their weblog posts. No one does it, but everyone thinks about it.

The Armchair Quarterback

I had an 80/20 slide in the presentation I did at SXSW, this year. 20% of the slide was just an excuse to wrap the phrase computer nets in a pink <blink> tag. The other 80% was to point out an idea that has remained popular since it was first written around the time the Internets were being loosed from Universityland :

History and geography are what's being thrown away. ... What is geography to Harmony or Pony or Davidson, who speak to people all over the planet every day all at once on their computer nets and modems? Or what is history to Mei-Lin or Gaia, who receive seventy-five channels on their families' dish-TV systems? . . . my friends are better prepared mentally for the future that is actually going to arrive.

Douglas Coupland

The quote was a setup and the punch-line was : This is wrong.

Geography has never not been important and I think this is one of the reasons why people have responsed so positively to Dopplr. Going some place still means something because there is more to human relations than action items and emoticons. We still live in a world where we are subject to physical constraints — mostly the constant tension involving the weather and individual temperaments — and we can't all be in the same place at the same time.

Also : Drinking with people in virtual environments is a pale shadow of the real thing.

To succeed on Hudson Bay, the Inuit needed to know everything about their immediate surroundings: the landmarks, the animals’ travel and migration routes, the location of fresh-water springs, berries, bird eggs and willow-worm cocoons to dip into seal fat for dinner. Describing the land’s natural features with lyrical precision, McGrath emphasizes that the harsh physical realities of this place shaped not only how the Inuit lived but also their personalities, making a strong case that psychology is destiny. At one time, expressing rage, lust or ambition were considered so threatening to Inuit group survival that persistent offenders were banished.

Elizabeth Royte

Geography is how we frame the moment and we should enjoy the still nascent ability to both easily communicate and travel long distances while it is still morally and economically sustainable.

History is what gives a moment its nuance and it is tempting to imagine it as, or becoming, a black and sexy William Gibson-esque carbonite bag-of-holding but we all know that's a crock of shit. Paper is not without its flaws but the evidence is pretty overwhelming that it remains the best 80/20 archiving system we've developed to date.

And the first person to jump up and down yelling Fire at Alexandria! Fire at Alexandria! can shove it up their 5 1/2 inch floppy drive. Or their Zip drive, SCSI or parralel; take your pick. Or that DVD you bought yesterday for 0.15 $ which is probably already corrupted.

There's a reason that Google is busying themselves with optical character recoginition (OCR) software. After all, written languages are just barcodes that humans happen to understand.

The Storyteller

Enter user-defined places, aka the fantastically badly named MyMaps. Complete with a print button.


The very kind Theis P. recently sent me a patch to allow for variable page sizes in my Papernet/Pocketmod libraries. If I were a better person I would applied it by now. Instead, I got Series 60 Python hacking on the brain last week so on the mornings when I could do more than stare vaccantly at my coffee I cobbled together a couple quick and dirty applications.


Or : If you think that you've already seen this done before in, you'd be right.

Nick has written an excellent piece of code complete with the hooks to write log files, take pictures and squirt GPS data directly in the EXIF headers. Unfortunately it didn't Just Work when I ran it on my 3rd Edition phone and I was too lazy to start digging through someone else's code to find out why.

The other problem with trying to write any kind of camera application on 3rd edition phones is that the devices all have lense coverings whose hardware is set to launch the camera application as soon as they are opened. I gather that you can get around this, or define your own triggers, if you are writting programs in C++ or Java but no such love exists in Python land.

And all I wanted was something that would sit in the background talking to a Bluetooth GPS device recording a latitude, a longitude and a timestamp. So that's all it does, writing tab-delimted values to text files (stuff is grouped by year-month-day) for transfer and processing at the time of your choosing.


I also wanted something that was light and simple which could be easily used in other applications; by which I mean to say I need to further pull things apart to have a generic s60-simplegpsrecorder library, but one thing at a time...

For example, the nice people at have a whole set of reverse-geocoding API methods that are keyed off latitude and longitude. This is fantastic because it means you can establish an actual context for a location beyond data-points which, while useful, aren't the kind of stories that speak to the heart.

Mercifully, in a world where Nokia still hates XML the geonames people also elected to make JSON a response format so you can use it with Series60 Python.

(Dan Catt's discussion of mushing together geonames, triplr and JSON is very much related, in a twisty maze kind of way, and definitely worth a read.)

Which is all good since it means that maybe I can change the elevator version of the talk I gave as part of Dan's mapping panel at SXSW to be just doom... doom... doom... instead of DOOM! DOOM!! DOOM!!!

Speaking of JSON-based APIs, that brings us to :


No, really.

This one just sits around asking Twitter for new posts via the public timeline API and then reads aloud them using Python's audio hooks. You know, sort of like :

perl -e 'while (1) { system("/usr/bin/say 9"); }'

It is just as annoying as it sounds. Actually, you can't really imagine how annoying it sounds until you've heard the default Text-To-Speech voice that ships with 3rd Edition phones. But it remains : AWESOME!

Especially when it says Matt Jones.

I expect to see twitteradio in a dance remix, near you, soon enough.

There is a special place in Hell for the likes of you.

I've bundled up each application as a semi-standalone SIS file for easy installation but they still require that you have a recent copy of Series 60 Python installed on your phone. I will get around to building proper standalone applications shortly.

As with most Series 60 Python apps, whether or not the SIS file will work on your phone is a bit of a crap shoot, especially if you are using a newer 3rd edition device. I've included the source for the bored, courageous and frustrated. All I can tell you is : They work for me.

GPSRecorder should work on both 2nd and 3rd Edition phones.

Twitteradio requires a 3rd Edition phone running Series 60 Python 1.3.14, or higher.


Automagic twittervision posting. I'm just saying.


By which I mean to say : Here's a rough around the edges application that does almost everything described above. It doesn't record anything for later processing but hangs around and asks the BT/GPS device for a latitude and longitude and then asks geonames where that point actually is.

Then the information is printed on the screen which is little like checking the Internets to find out the weather outside but all I can is that it was a proof of concept. A more interesting thing to do, maybe, would be to pass the latitude and longitude to the Yahoo! Map Image API and display a pretty map. This is on the list.

Instead, I added a Tell Twitter menu item. As in :

I've also updated the code-y bits such that if you are trying to run this on the desktop with the PyS60 emulation libraries it will do the BT/GPS dance assuming you've also installed the excellent Lightblue Bluetooth libraries.

These should be both be considered betaware and all the usual caveats apply. Once they've been given a little more polish I will give them a permanent home...

Because information wants to tell you what it's doing. By which I mean to say : Once I've gotten Log::Dispatch::Jabber working again, I will probably be forced to write Log::Dispatch::Twitter...