Closing Time

I'm reminded of the Semisonic song Closing Time today, and the quote "Every new beginning comes from some other beginning's end".

Today was my last day with my current employer, and I will soon begin not only a new job but also the process of relocating to Colorado. We're not moving right away, but today is a major milestone.

It has been fun, and I will miss many aspects of my experience here, but my family and I are excited about the future.

But on this day, it is important to keep perspective. This new beginning comes from some other beginning's end.

Google Disrupts Another Industry

Google announced plans to release a turn-by-turn GPS Navigation application for the new Motorola Android 2.0 (Droid) phone. This is significant enough, but CNET also reports:
However, Google is working with Apple on bringing it to the iPhone, and it's not ruling out licensing the software to makers of portable navigation devices used in cars throughout the world, said Gundotra, vice president of engineering at Google for mobile and developers.
This could be a major disruptive force to Tom Tom, Garmin, and the entire mobile navigation industry. There is nothing like a free alternative to a $99 iPhone Application (US Version) to shake things up, let alone the impact on the automotive manufacturers and their in-dash software needs.

Microsoft and Apple are obviously concerned about Google, but Google's impact may be greater in less obvious market areas.

Signing AIR Applications: How AIR's Certificate Requirement Complicates Open Source Development

Adobe AIR is the desktop runtime environment for deploying Flex applications. The main difference between a Flex application and an AIR application is that AIR applications are installed locally and have additional access to local resources, including the local file system, while a Flex application runs in the browser and is 'sandboxed'.

I've been developing an AIR version of my iTunes Export open source application. The original version was developed in .Net, making it Windows only. The AIR version will work across Windows and OS X, and will replace the existing .Net GUI.

As I prepare to release the first Beta I ran into the question of how to sign my AIR application. All Adobe Air applications must be signed using a digital certificate. There are a few companies that sell certificates that are recognized by Windows and OS X by default, and they charge $300/year and up. That is pocket change for any company selling an application but a pretty significant cost for an open source application that produces no revenue.

You can self-sign a certificate, but you are then presented with this dialog box:

If you want to avoid this dire warning, you must buy a certificate from one of the Root Certificate Authorities.

So what do I do? I'm tempted to release it using a self-signed certificate. The warning is annoying, but I've been releasing the .Net version unsigned for years, and it had as much or more 'destructive capability'. However, the users also were not faced with this warning dialog.

It would be nice if there was an 'Open Source' Certificate Authority (CA), that allowed open source projects access to free certificates, but the costs involved in becoming a Root CA and managing the issuance of certificates would require a very generous patron.

If you are looking for step by step instructions on HOWTO sign an AIR application, check out this tutorial.

Parsing PList files in ActionScript

The PList format is not one of my favorites. I've complained about it before, but Apple continues to use it for its iTunes library information, so I continue to parse it.

I've been exploring the option of porting the iTunesExport project to Flex (Air) to provide a cross platform version. The current version is written in .Net and therefore not usable on OS X. As such I needed to parse the PList file using ActionScript. I adopted the Java PList Parser written by Christoffer Lerno for his XMLWise project.

The dynamic nature of ActionScript resulted in a much smaller implementation (although I did skip over 'REAL' and 'DATA' types), and makes it easy to consume.

You can view or download my version here, released under the MIT license.

Here is a snapshot of how it is used:
var parser:PListParser = new PListParser();
var pList:Object = parser.parsePList(xml);

playlists = pList.Playlists.filter(filterPlaylists);
The last line accesses the Playlist array (dynamically created when the PList is parsed), and filters it using the specified filterPlaylists method, returning a filtered list of the playlists from the original XML file.

It provides easy structured access to an XML file that would otherwise be difficult to access in a rational manner.

iTunes Export 1.6 Released

A new version of my iTunes Export utility is available.

iTunes Export exports your iTunes playlists as M3U, WPL, ZPL, and now also MPL files, allowing you to setup playlists in iTunes and use them with other software or devices.

This release adds several fixes and enhancements that have build up in the last few months. They include:

Improved the logic for music copying. It can now handle duplicate songs and an arbitrary number of songs in a playlist (removed the 999 song limit) and handles duplicate files gracefully. Thanks to Simon Hyde for submitting the patch.

Added support for MPL playlists, used by Centrafuse ( Car PC. Thanks for Stavros Glezakos for submitting the patch.

The new version can be downloaded from the project homepage:

There have been several requests for improved file copying approaches to handle the many different usage scenarios. I have begun work on a 2.0 version and am planning to include a revamped approach to file copying in that release. Thanks for all the feedback.

Please email me with new features or bug fixes (