Thursday, January 31, 2008

free subversion host

A while back I was looking for a free subversion host, and I wasn't able to find a whole lot. I had thought about setting up a server on one of my own machines at home, but part of the reason for using a remote host (outside of me not having to hassle with setting it up) was that I wanted it to be offsite so that I didn't have to worry about my clunky old hardware going toes-up and taking out my source code with it. The last time I looked I found cvsdude, which works well but only gives you 2 megs of space for free. Tonight I looked again, and I found unfuddle, which offers free account users 200 megs of space, a vast improvement over 2!

I just started using unfuddle, and I haven't used cvsdude much at all because of the space limitations, so I can't offer a comparison yet. unfuddle is looking better because of the additional space alone, but they also offer a set of project managment tools that might come in handy.

If you love subversion, you'll love having a free offsite host. If you don't love subversion, it just means you haven't used it yet; once you do you'll never want to use anything else. Get yourself the tortoisesvn client and enjoy.

Friday, January 11, 2008

Friday funny


Other articles in the series: hearing difficult for the deaf, living difficult for the dead, etc.

Thursday, December 20, 2007

RSS is *everywhere*

UPDATE: for some reason not all the images come through in my feed reader; there should be three images below: two smaller ones side-by-side, and then the larger one that is a larger shot of the drinking fountain top.
***

First there was the coffee cam, then the internet-enabled refrigerator, now there are water fountains with RSS feeds:


Separated at birth?



Monday, December 17, 2007

Misuse of the progress bar in web applications

A while back it became fashionable to have animations appear in or layered on top of web pages during page transitions to indicate that the user's request was being processed and that the page was not just sitting there waiting for input or locked up. That's all well and good, except for one thing: it doesn't mean anything like "your request is being processed." The indicator is just an animation that is preprogrammed to cycle through the same set of images until the next page loads, giving the appearance that something is happening, but all it really means is that the animation loaded. It's the web version of "this page intentionally left blank," but worse, because it is misleading rather than just paradoxical.

There is no question that feedback improves usability, so it is the right thing to do to visually advise the user that the application knows a button has been clicked, etc. But, there is one type of status indicator that has no place on a web page: the segmented progress bar. These are a carryover from desktop apps where the bar really does indicate the relative completeness of a process, but they don't work in a web page (they work fine for browser status, but that's different). Unlike desktop apps, web apps are not wired into the events as they are taking place and so they are meaningless.

The problem developers and designers are faced with is that the bar can't just move from left to right once and then stop because the process may take more or less time than that to complete. Clever folks (not good clever) have taken to making the bar cycle repeatedly from left to right, as if that makes any more sense, unless you are a fan of Battlestar Galactica or Knight Rider.

Some alternatives I have seen include a message in the status bar of the browser itself, which is hard to see and easy to ignore; the blinking dot, which is old school in a command-line sort of way (or in the way of the highway information sign when it contains no accident information or fictitious travel times).

The best I have seen are animated icons that are circles or spheres of some kind that have a piece of their image that moves around it, such as the belly-button ring on the Nintendo Wii (take a look, you'll see what I mean), or even the beachball in Windows Mobile apps. In the case of the Wii, the indicator is a simple circle that has a dot moving around it, so there is no question that something is happening. Likewise with the beachball, it is simple but effective, because a circle has no starting point and no ending point and so there is no problem of trying to decide what to do after it cycles the first time.

I probably won't be able to pry the nearly useless status indicators out of web developers' hands, but please, please, please get rid of the Cylon eyes!

Monday, December 10, 2007

Linq + Anonymous Types = bliss

If you've ever been faced with the task of reading in a list of object properties from XML and instantiating objects with the node text, you know that while it is relatively straightforward on the surface, it still can be a lot of hassle to create the DOM object, work up the XPath to get what you want, create a strongly-typed object to hold the properties you are pulling, and test and convert the node inner text and stuff it into the object.

I have been following along Scott Guthrie's description/tutorial of the new ASP.NET MVC Framework and ran across a little tidbit that made the job of using XML in my application a whole lot easier: using anonymous types and the results from a Linq query to populate them. Here's an example:


XDocument buildFile = XDocument.Load(args[0]);

var builds = from file in buildFile.Descendants("file")
select new
{
SourcePath = file.Element("sourcePath").Value,
TargetPath = file.Element("targetPath").Value,
ReplaceToken = file.Element("replaceToken").Value,
ReplaceWith = file.Element("replaceWith").Value
};

foreach (var file in builds)
{
ReplaceInFile.Replacer replacer = new Replacer(
file.SourcePath,
file.TargetPath,
file.ReplaceToken,
file.ReplaceWith);

string contents = replacer.Replace();

Utilities.SaveFile(file.TargetPath, contents);
}


The anonymous type comes in really handy here because I only need it for a very limited purpose and will not need it anywhere else. Previously I would have created a new class to hold the properties, but now I can do it on the fly.

Maybe calling it blissful is a bit much, but it definitely is an improvement over the old way of doing things.

Thursday, December 06, 2007

Using gmail chat for AIM contacts

More cool features from google chat: you now can log into AIM and chat with your AIM contacts from google chat. You still need to have an AIM account, but you no longer need to use the AIM client to talk to your contacts on that service.

It's about time, too. Google chat is a Jabber client, and there are transports out there that bridge between Jabber and other chat protocols, but for some reason google does not have servers running those transports. Even though you can do it using other servers they are a pain to configure (you can't do it through any google client or settings page, you have to download another client (like Psi), find your way to a server of questionable security and availability, and perform some voodoo to get everything working right) and even then it is iffy.

I have long wondered why google has not set up transports and whether they someday will, and it looks like this may be a step in that direction. I don't yet know whether they are using the XMPP transports or some other method to do the bridging, but whatever they are doing I hope they extend it to ICQ (really an AOL property), MSN, and Yahoo! so I can ditch my desktop chat clients entirely.