Quick Update on installing ImageMagick on OS X

I’ve updated the tutorial on how to install ImageMagick from source on OS X, with links to the latest libraries and commands updated to reflect some changes for Leopard.

Searching for the perfect admin tool

Writing web applications for almost 10 years, I can’t count how many admin tools I’ve written. Having worked on so many, I’ve developed a programming pattern for creating them. However almost every time I make a new one, I find myself trying a new layout and navigation style.

Frequently I look at GoPlan, Basecamp and Wordpress (3 tools I also use quite often) and notice how similar their layouts are. Is this because they are doing the right thing? Or is it because they are lazy and copied each other? Should I be modeling my admin tool layouts like theirs? As a developer, I don’t have as much time to think about those things. I’m too busy making the tool work.

I am curious why so much time is spent by designers creating the front-end of a web site, but it’s usually up to the developers to create the layout for the admin tool. The usability and design of admin tool should be just as important as the public facing web site. An admin tool should be a continuation of the site look and feel, but in my experience it looks like a completely different site.

Some people say I have fairly good design sensibility. However I am not as good as a lot of designers who do it full time. This probably applies to most web developers. So next time you’re involved in creating a web site with an admin tool, consider asking the designer for at least a simple layout and style guide for the admin. They don’t have to create a design for every page, just a mockup of a sample layout that shows all types of form fields with labels, typography treatment and a navigation system. It will make a developers life much easier.

What is your experience as either a user or developer of an admin tool? What works and what doesn’t?

Track Trimet on your iPhone

Recently I started riding the bus again full time…if not to save the environment, but to save my nerves from dealing with traffic. After a few days I was reminded about one of the things that bothered me about riding the bus: I hated not knowing exactly when the next bus was going to arrive.

This time around I have my iPhone, so I am able to use the tracker on Trimet.org to see when the next bus came. Except it was really difficult to use on such a small screen. I was able to find out when the next bus came, it took me 2-3 minutes to do it.

So I decided I was going to write an iPhone app to do the same thing, but with a much simpler and easier to use interface. At first I was just going to scrape the Trimet site to get the information. But then I came to find out that Trimet actually has a really nice API to all their tracking information!

So I present to to you the Trimet Tracker, an iPhone app that allows you to easily find out when the next bus is going to arrive at your stop. Just enter your Stop ID and you’ll get a list of all the arriving buses (or MAX or Street Car), what time they will be showing up, and how long you have to wait. If you don’t know your Stop ID, you can also do a quick search by picking a route and selecting from all the stops on that route.

To make it even easier, you can also save any stop to your favorites list so you don’t have to enter a Stop ID or search for your stop again. Just hit ‘Favorites’ and select which stop you saved.

Obviously this tool isn’t for the masses…how many people are riding Trimet with an iPhone? Even if no one uses it, this tool has already saved me the a couple times from missing a bus. That’s worth the whole 4 hours it took me to develop it.

For the technically inclined, Trimet Tracker was built using the Camping microframework, IUI for the interface, and a few lines of custom Javascript.

One final thought: I now firmly believe that Portland is the geekiest city on the west coast. Even our transit system has an API.

28 NES Ringtones for your iPhone

The other day my friend Jason Glaspey showed me how he made an Excitebike ringtone with MakeiPhoneRingtone by actually ripping audio from a Youtube video, pulling it through and audio editor then finally dropping into MakeiPhoneRingtone to be able to put it on his phone.

Being the NES nerd I am, I remembered how to rip music from NES games directly. So now I’m going to show Jason up by sharing 28 different NES music ringtones for your iPhone. These are all AAC files that you can drop into MakeiPhoneRingtone, which will make them immediately available as ringtones that can sync up to your iPhone.

I’ve broken the collection up into 4 separate zip files, and I’m calling them NES Ringtone Paks 1-4. I’ve covered most of my favorite tracks from about 20 NES games. Here is a list of all the ringtones:

NES Ringtone Pak 1:

  • Blaster Master Area 1
  • Blaster Master Area 2
  • Goonies 2 Theme
  • Castlevania Level 1
  • Contra Level 1
  • Double Dragon
  • Excitebike

NES Ringtone Pak 2:

  • Kid Icarus World 1
  • RC Pro Am Opening
  • Legend of Zelda Overworld
  • Little Nemo
  • Metroid Spacey
  • Metroid Zebes
  • Mike Tyson’s Punch Out Workout

NES Ringtone Pak 3:

  • Mega Man 1 Elecman
  • Mega Man 2 Boss Selection
  • Mega Man 2 Opening
  • Mega Man 2 Wily
  • Mega Man 2 Woodman
  • Super Mario Bros. 1
  • Super Mario Bros. 1 Out of Time

NES Ringtone Pak 4:

  • Super Mario Bros. 3 Powerup
  • Super Mario Bros. 3 Star
  • Super Mario Bros. 3 Underground
  • Wizards & Warriors 1 Castle
  • Wizards & Warriors 1 Low Energy
  • Wizards & Warriors 2 Air
  • Wizards & Warriors 2 Fire

If you have any requests for other games, leave me a comment below. Enjoy your NES ringtones!

TwitterWhere - Filter Tweets by Location

Inspired by a post over at Silicon Florist about following local people on Twitter, I investigated whether it was possible to follow someone in a geographic area. The closest I found was TwitterVision, which is a great idea, but doesn’t exactly do what I want. So I ended up taking a few hours and developed TwitterWhere, an aggregator that watches the Twitter public timeline and geocodes what it finds. From there anyone can generate an RSS or XML feed that will pull only Tweets within a set radius around an area. Now you can have a feed of Tweets within 50 miles or Portland, or 5 miles of Manhattan, New York.

For anyone who is interested, here’s how I pulled it off…

I wrote the app in Ruby on Rails, utilizing my favorite gem of all time, Graticule (geocoding and spatial search), Hpricot (parsing the public timeline on Twitter), and a couple custom geocoding libraries I already had cooked up for Unthirsty and Knitmap.

Every minute I query the Twitter public timeline XML file and the results. If a new user is entered into the system it is geocoded and any Tweets added by that user from that point inherit the coordinates. Any users with an invalid location are thrown out and not cached. I also cache geocode queries locally. Both of these measures are in place so I don’t overload the geocoding services I use (especially considering I have two other fairly heavy traffic sites using geocoding services).

On the front end, feeds are not exactly ‘generated’, it’s more of a verification that the location someone has entered is geocodable. Once the location is verified a link is presented to the user that points to RSS or XML feeds. If this ends up getting more traffic, I’ll consider using caching for each unique feed, but right now when you visit a feed URL, it is generated from the database in real time, every time.
TwitterWhere runs on my good old Dual 1.8GHz Powermac G5 at our co-location facility, using a custom compiled Apache 2.2, mod_proxy_balancer and 5 mongrels.

Okay, I’m done geeking. Here are few mentions of TwitterWhere from around the web. Thanks for the write-ups!

P.S. Apologies to TwitterWhere.com, I didn’t even think to check if the domain existed, let alone to see if there was something there! We don’t exactly do the same thing (TwitterWhere.com allows you to easily update your current location on Twitter), so hopefully there isn’t too much confusion.