Archive for April, 2008

Weekend update to Newsbrew

A couple weeks ago, I blogged about a Google App Engine news aggregator I wrote called Newsbrew (original post). A few days later, Google announced the availability their RESTful feed API. Since the trickiest part of Newsbrew was the aggregation code, I decided to refactor the application to use Google’s new service.

Newsbrew still stores feed and post data, but rather than retrieving and parsing the feeds myself (a surprisingly complex and error-prone process), Newsbrew now uses Google’s REST feed API. All data, regardless of the underlying syndication format, is returned in a nice normalized JSON format.

With just a few hours of work, I was able to make Newsbrew much more robust, and because I no longer have code for parsing nine different formats of RSS and Atom, Newsbrew is much less error prone, and the code base is simpler.

I also added Ajaxian to the blogroll at the request of Dion Almaer. If you know of any other sites I should add, let me know.

The latest version of PixelPerfect (with screencast)

PixelPerfect is a simple AIR application for measuring things on your desktop. If you want to see how it works, check out this screencast. If you want to see the code, check out the PixelPerfect Google Code project. And finally, if you just want to install it, click on the badge below.

AIR Badge

var pixelPerfectBadge = new SWFObject(“/cantrell/air_apps/badge.swf”, “badge”, 217, 180, “9”, “#ffffff”);
pixelPerfectBadge.addVariable(‘appname’, ‘PixelPerfect’);
pixelPerfectBadge.addVariable(‘appurl’, ‘http://weblogs.macromedia.com/cantrell/air_apps/PixelPerfect.air’);
pixelPerfectBadge.addVariable(‘airversion’, ‘1.0’);
pixelPerfectBadge.addVariable(‘imageurl’, ‘/cantrell/air_apps/pixelperfect.png’);
pixelPerfectBadge.write(‘pixelperfect_div’);

Newsbrew is now a Google Application

I wrote a news aggregator a couple of years ago called Newsbrew which I primarily used for my own news-reading needs. I think I took it down when I got tired of paying for the server, and worrying about keeping it up.

After Google launched the Google App Engine, I decided to take a little break from Flex and AIR and rewrite Newsbrew in Python to get a good feel for the GAE experience. You can see the current beta version here.

Overall, I was very pleased GAE. It took me about five days to write this version of Newsbrew, but that included learning Python, Django, and everything about GAE. The application is fairly comprehensive, consisting of a user interface, aggregation service, and a secure administrator section. Unfortunately, I didn’t get to all the features and bug fixes that I wanted, but the app still seems to work reasonably well.

It’s still going to be a little while before we’re writing real-world production apps on GAE as it still has several rough patches, bugs, and missing functionality. But it’s very clear where Google is going with this, and there’s no doubt that GAE is a very powerful concept and platform. I’m certainly going to keep my eye on GAE, and use it as much as I can.

Maptacular 2.0: a desktop mapping application for AIR

Maptacular was one of the first applications I wrote for AIR. The first version parsed vCards from your local file system, and let you map the addresses it found inside. That was back when AIR was in still in alpha, so I didn’t have APIs for things like drag and drop or copy and paste. Now that AIR 1.0 has shipped, I decided to rewrite Maptacular to to have the functionality that I originally envisioned.

I created a screencast of Maptacular 2.0 which you can watch here. If you want to install the app, just click on the badge below. If you want to see the source, it’s all available on Google Code.

Maptacular is a good example of the following:

  • Custom chrome with transparency.
  • Custom application menus (implemented for the Mac only — when Maptacular runs on Windows, there are no application menus).
  • Context menus.
  • Drag and drop.
  • Copy and paste (system clipboard access).
  • Yahoo! Maps for ActionScript 3 (with custom markers).
AIR Badge

var maptacularBadge = new SWFObject(“/cantrell/air_apps/badge.swf”, “badge”, 217, 180, “9”, “#ffffff”);
maptacularBadge.addVariable(‘appname’, ‘Maptacular’);
maptacularBadge.addVariable(‘appurl’, ‘http://weblogs.macromedia.com/cantrell/air_apps/Maptacular.air’);
maptacularBadge.addVariable(‘airversion’, ‘1.0’);
maptacularBadge.addVariable(‘imageurl’, ‘/cantrell/air_apps/maptacular.png’);
maptacularBadge.write(‘maptacular_div’);

Lineup: an Exchange calendar viewer for AIR

I did a screencast of an Exchange calendaring application I wrote for AIR. Click here to watch it.

It’s one of the most useful applications I’ve written so far, and probably the most popular within Adobe. It lets you view your Exchange calendar, and it notifies you of upcoming meetings. It also works offline, so you can view your calendar and get meeting details while you’re between internet connections.

Lineup uses all the following open source ActionScript 3 libraries:

  • as3corelib: various utilities like advanced date parsing.
  • as3exchangelib: talks to Exchange servers.
  • as3nativealertlib: a modal alert that appears in its own native window.
  • as3notificationlib: creates notification windows, and provides a layer of abstraction on top of OS-specific notifications.
  • as3preferenceslib: manages application preference persistence, including encryption when necessary.

The complete source code for Lineup itself is also available on Google Code, or you can simply click on the badge below to install it.

AIR Badge

var lineupBadge = new SWFObject(“/cantrell/air_apps/badge.swf”, “badge”, 217, 180, “9”, “#ffffff”);
lineupBadge.addVariable(‘appname’, ‘Lineup’);
lineupBadge.addVariable(‘appurl’, ‘http://weblogs.macromedia.com/cantrell/air_apps/Lineup.air’);
lineupBadge.addVariable(‘airversion’, ‘1.0’);
lineupBadge.addVariable(‘imageurl’, ‘/cantrell/air_apps/lineup.png’);
lineupBadge.write(‘lineup_div’);