So, prompted by the new iTunes release, I thought I’d set down some thoughts on music players, and how they all suck, at least a little bit.
Firstly, here’s what I require from a music player:
Here’s what I’d like to have in a music player:
What I don’t really need that seem like must-haves for other people:
Now, I’ve tried about every (free) player available on Windows and Linux, and they all fall down in some fashion (usually queuing). With iTunes’ new party shuffle, it gets the closest on windows. (It probably also means that rhythmbox will get the functionality soon.) iTunes doesn’t have customizable keyboard shortcuts though, and I haven’t been able to find a plugin that provides it. With a few different plugins winamp has most of the functionality I want, but not nearly as elegantly as iTunes.
On Linux, yammi has the functionality pretty much nailed, but its interface is a little, well, cluttered. It also doesn’t update its database automatically (and when you DO, you also have to save the damn thing). It also uses xmms as a backend, which doesn’t always work smoothly.
The lesson: interfaces are hard, especially when they meet up with widely divergent user needs.
One app that doesn’t meet my needs but is at least not trying to clone iTunes: muine. (Note to developers: the integrated cover art retrieval is cool, but why are you saving it to some crappy db file in my home directory? Save it to the mp3 location!)
Update: iTunes Remote and Hot Keys Plus give me configurable keybindings for iTunes. Shiny.
I have to go through a gateway box to get to various production boxes; this gets rather tiresome because you end up doing things like:
ssh gateway enter password<ENTER> ssh boxireallywanted enter password<ENTER>
Do this a few thousand times and it starts to get old. Being slightly clever, I’d tried ssh gateway ssh boxiwant, but that doesn’t work because a tty isn’t allocated so password entry can’t happen (and keys aren’t possible for me). Today, I finally found the magic should-have-known-it command line magic to fix this - -t:
ssh -t gateway ssh -t boxireallywanted
Enter both passwords and you’re in. This makes it possible to set up window manager shortcuts for the various boxes I need to get to.
Yes, this qualifies as excitement in my world.
I’ve been working on a Bloglines notifier for the Gnome panel for the last little while, and it’s finally at the stage where letting other people attempt to use it doesn’t fill me with abject fear. If for some reason you’d like to test installing and using my first programming project with a) python and b) gtk, please email me. It requires pygtk and all the various gnome-python libraries. A bloglines account would probably help too.
Debugging a problem related to the web can be an exercise in frustration, because there are a lot of layers where things can go wrong, and what’s going on in an HTTP transaction isn’t transparent. Here’s how I tracked down a recent problem and the tools I used to do it:
The Problem: I’m starting development using a new third party Java API and running the sample code behind the corporate proxy results in a NullPointerException. Third party support has no immediate suggestions as to why this happens.
The Solution: The first thing I pull out of my toolkit is the excellent tcpmon tool provided by the Axis Project
This tool is a mini-proxy that monitors requests and responses and presents them in a GUI; it can also pass requests off to your real proxy. Using this, I captured the request that the third party API was using and the response received back. The response looked normal, with these HTTP headers:
HTTP/1.0 200 OK Content-type: text/plain Content-length: 136
I also captured the request the API was making, which was just a simple GET request. We do have an unproxied test box, so I emailed the GET request to an outside email account and went and made the request on that box with a web browser, using live http headers to capture the http session. The content returned is identical, but the headers are different:
HTTP/1.x 200 OK Server: Thirdparty Listener Date: Tue Apr 20 04:16:24PM Connection: close Content-Type: text/plain Content-Length: 136
I immediately fixate on the Server field, as it seems that would be the most likely header that the API might check (blindly), therefore causing the NPE (it could also be the Date header, I suppose). I figure the best thing to do is somehow proxy the request and insert the necessary header. I google around a bit and eventually settle on this perl script. I start it running, point the API to that as its proxy and try the test scripts again. Joy: no null pointer exception! I can now get on with the actual project. I’ve reported the bug to the Third Party support team, we’ll see what they say.
Summary: This stuff is the reason programmers drink. Or the reason I do.
Another cool item for the web developer toolkit: the cacheability engine. It analyzes web pages and gives you a report on how cacheable it and any images within are. Nifty.
Useful Eclipse shortcuts. More here.