Recently in General Category


| 1 Comment | No TrackBacks

If you know me, then you know I'm a huge fan of Trac and Subversion for managing software development. If you've ever wanted to give it a try, now there's no excuse not to with preconfigured Virtual Appliances Just download, boot, and go.

Awhile ago I had set up a Linux box on my home network with Trac and Subversion and documented my process here. I admit that I'm not a very good Linux system administrator. I'm a developer, and I write code. Someone else has always managed the development boxes, or they were outsourced to a company like CVSDude or ProjectLocker. The point is, sometimes getting up and running with Trac and Subversion isn't just a one-click install process, and usually takes some time to get everything configured and working properly.

That's why I was excited to find out that you can get a complete working agile development box up and running in no time thanks to VMWare's Virtual Appliances. By downloading the free VMWare Player, and a system image with Trac and Subversion already installed, you can just load the system image and boot it up to immediately start using it for development.

There are a few preconfigured Trac and Subversion images if you search the VMWare Virtual Appliance directory. Two that I've found are Helix Agile Development and Buildix from ThoughtWorks. There are probably others as well if you spend a little more time searching.

I'll admit that I haven't actually downloaded and run with these yet (since I have that Linux box I've already configured), but I plan on investigating these sometime in the future. Hopefully having these servers ready-to-go will help someone out there get up and running with Trac and Subversion much easier. It's the best development environment I've ever programmed in...

I've been spoiled lately - all of the contract projects I've been involved with have used Trac and Subversion. I wanted the same killer set up for my hobby projects at home, so I put together a Linux server and documented the steps along the way to share with you.

First, it's always a good idea to use version control. I used to have Subversion installed locally on my Windows machine so I could keep track of changes, revert if I did something stupid, and have backups in the event I lost everything. Subversion has saved me a lot of time on multiple occasions, and to me it's a no-brain decision to use it.

The very first time I saw Trac, I loved it. Trac features an integrated wiki, bug base, and integrates tightly with Subversion. You can have a look at the Timeline to see what has changed across your project and when, look at the changes that were applied between revisions with the integrated diff view, link a bug to a particular revision (say, bug #9 was fixed in change set #104), use the wiki to describe a change set in more detail, etc. Trac is a very easy to use system that helps keeps projects organized, and gives you the ability to look inside of a project to see how it's progressing.

For my personal projects, I thought Trac would be overkill at first since I'm really a one-man team at home, but it's really been nice to have. The biggest change has been keeping my desk free of clutter. Instead of littering my desk with yellow post-it notes for ideas, bugs, features, etc., I just put all of that into the Trac project. Once you use it, you can't live without it.

Introductions aside, it's time to get down to business. First, I'm really not a Linux expert. All of what I know about Linux was gathered from using it in college to get my Comp. Sci. degree. I'd use it at home more, but I'm a Flash/Flex developer.. so there you go. Take this with a grain of salt - I believe these instructions will be useful, but there's no guarantee they'll actually work for you (I may have tinkered with something and forgot to make note of it). In any event, a standard disclaimer applies: The following information is to be used at your own risk. You agree not to hold me responsible if anything bad should happen as a result of following these instructions, including, but not limited to, an invasion of lemmings attacking a small army of ants that happen to crawl up your pants leg while trying to power off your newly configured Linux server due to a massive lightning strike off the coast of Kanagawa. Wow, I really need to cut down on the coffee in the afternoon.

Here goes...

Getting Friendly with Eclipse Workspaces

| 7 Comments | No TrackBacks

I've been using Eclipse for a long time, but it was only recently that I discovered the power of multiple workspaces. I feel like I should've learned this a long time ago.. but better late than never I guess!

I've never really explored the concept of the Eclipse workspace. To me, it was just the directory path that you had to specify at startup. The real meat-and-potatoes were the projects that were created in the workspace, so why care about the workspace itself?

If you're anything like me, you've always worked with a single workspace and a lot of projects. I would create a new Java project for each application I was working on. I would have CFEclipse projects along side of those. I would have ActionScript projects living right next door as well. All in all, at a single point in time I probably had 40 or 50 different projects in my workspace.

Now, this isn't really a bad thing. I was still able to be productive, though there was a lot of project opening and closing going on, and switching between projects was a bit of a task. It's no secret that when using Eclipse, you close the projects that you're not working with to save resources. I was accustomed to working like this, so it really wasn't a big deal.

Enter Flex / Java hybrid projects.

Following my typical workflow, I had a Flex / Java hybrid project that I was working on. I first created a Java project, and made a "flex" subdirectory where the .mxml and class files were held. This gave me code hinting for the back-end Java code, and with ASDT, the code hinting was "good enough" for the ActionScript code. Trying to build the project was a different story, and required a bit of ANT magic to compile everything and get all of the files where they needed to be. During the development cycle, when we switched from ASDT to FDT, it was clear there was a problem. Trying to have back-end code managed via the JDT coupled with front-end code edited via FDT, things just weren't working. They were mixing like oil and water.

The solution? Create 2 projects of course! One for the back end code, and one for the front end code. The problem? My project list continued to grow. Ideally I wanted a way to just focus on these 2 related projects at one time.

Enter the workspace.

I finally realized how powerful the workspace concept was. Each workspace houses a collection of projects, so it was determined that creating multiple workspaces was a good way to get organized. I created a new workspace, specific to the client the project was, and created two projects – one for the front end and one for the back. They each had their own build.xml files to manage building, and the new layout made FDT work extremely well (by giving it it's own project).

So now, whenever I wanted to work on this particular application, I just switched the workspace. Whenever I start a new application for a client, I automatically give them their own workspace. Whenever I start a new "for fun" application, I use my "Playground" workspace. Switching between different projects is no longer a hassle – instead of toggling open / close, and trying to find the right project to work with, I just switch workspaces entirely. I've been much more organized since I've been using multiple workspaces.

I can't believe I didn't know about this 2 years ago.

Anyway, to set up a new workspace (or switch between them), select File -> Select Workspace. Enter the path to a workspace. If the workspace already exists, it will be opened (and your project list will be updated). If no workspace exists at the location, a new workspace will be created (and the project list will be empty). Piece of cake! If you'd like to start Eclipse with a certain workspace, you can use the –data argument to pass the location of the workspace: eclipse.exe –data c:\development\workspaces\Client1Workspace

As an aside, this also makes sharing projects easier with a team. In my latest project, we put all of the eclipse project files under version control. All a new developer needs to do is check out the code from the repository, create a new workspace, and then "Import existing projects into workspace." Two or three clicks later, all of the projects are set up with correct project references and such, and the new developer is ready to dive in with the code instead of fumbling around trying to set up the projects.

Again, I can't believe this never occurred to me 2 years ago. Better late than never I guess… :-)

New Year, New Goals

| 5 Comments | No TrackBacks

Today marks the end of my holiday vacation and the start of a new year. Rather than making resolutions that tend to get broken after a few weeks (you know, the classic "eat better, lose weight" etc), I prefer setting goals for myself. Before the page turns toward 2007 in 365ish days, here are some things I'd like to accomplish in 2006.

Professional Goals:

  • Build some killer Flex applications
  • Author a book
  • Continue to grow my consulting business, possibly bringing on employees
  • Write at least 2 articles for technical magazines
  • Contribute at least 50 examples to IFBIN
  • Keep a steady stream of useful posts / code snippets coming to this weblog (once a week?)

A Few Personal Goals:

  • Buy a house with my beautiful wife
  • Celebrate our 1 year anniversary in style
  • Get another dog to keep Yellowdog company
  • Learn some songs in a new genre on guitar. Metal is fun to play, but I'd like to expand my horizons a bit and be more versatile.

I'm really looking forward to 2006. Here's to a memorable year with good times, great friends, and lots of code. :-)

Car and Driver: Ride and Drive

| 9 Comments | No TrackBacks

Somehow I managed to get invited by Car and Driver to participate as an editor for the day in their exclusive Ride and Drive program.

I'm a car enthusiast and naturally have a subscription to Car and Driver magazine. Apparently there's a random selection process that picks a few people from the subscriber base in certain areas where the events are held and offers them the chance to be an editor for the day. The idea is simple: As editor for the day you get to drive their cars around some cones in a parking lot and submit your opinions for magazine consideration.

Beating up on cars I don't own, no string attached? I'm there! I didn't so much care as to having quotes in the magazine, I was just looking forward to driving around the test courses.

Here's a picture of the letter they sent me, along with the registration card I had to use to get in:


Because we were allowed to invite a friend along for the ride, I brought Justin, a long time high school / college friend and fellow car enthusiast, down with me to FedEx field (where the Washington Redskins play, just inside 495 - the DC Beltway).

I suppose at this point I should mention that while my magazine subscription is still to my place in Baltimore, I actually just moved to Hershey, PA about a week ago. More on that later (maybe).. Anyway, we had an appointment at 8 to meet the Car and Driver crew in the stadium parking lot. Being as I now live much further away, it was quite an early start for us. Let's just say I'm not entirely used to getting up at 4 AM and driving 3 hours while seeing the sun rise.

Anyway, when we arrived, we were greeted by the 4 test cars and two tracks. The tracks were done in typical autocross style of cones in a parking lot, but the parking lot was huge and the tracks were laid our bigger than you might expect.

Here's the two tracks, side by side, in the straightaway for acceleration testing:


The one track was for testing a Cadillac STS and BMW 530i. The other for testing a Cadillac CTS against a Lexus ES 300.

We collected as a group under the welcome tent (there were maybe 30-40 people invited total) and listened to some driving instruction. The group was divided in half with half going to one track and the other the half going to the other. At each track there were 4 cars (2 of each type) to accommodate 12 drivers (3 people + 1 pro driver for each car). The first track I went to was comparing the CTS and the ES330. Halfway through the event, the two groups switched tracks.

The idea was you drive the 1 car for two laps, then drive the other car for two laps so that you could make a good comparison between the two. They asked us to focus on braking, handling, acceleration, overall ride and comfort, steering response, etc. Inside the cars, the pro driver was always in the right front passenger seat telling us the best way to maneuver the course.

What a blast! The cars were a little underpowered for my liking, and they wouldn't let us turn traction control off, but rest assured there were tires squeeling in every turn. The CTS was more fun than the ES330, and I even managed to avoid running over any cones.

The other track was much of the same, but the STS and 530i were a slightly different class and weren't quite as nimble. Despite lots of understeer, I think I avoided most of the cones there as well. I liked the STS overall better than the 530i, but the BMW was the better handling of the two.

All in all it was great fun. We were there for about 2 hours of testing, and left plenty of rubber on the pavement. Thankfully, they didn't ask us to replace any of the tires...

I'm not really expecting my quotes to appear in the magazine, but I have a feeling Justin's might. He came up with quite a few good ones... I'm looking forward to the issue where they print the results and seeing if they used any of our quotes / pictures in it.

I have a few more pictures of the day, but no where to put them all at the moment. Maybe this is a good time to finally build myself a photo gallery, or get a Flickr account... Anyway, here's one more picture. This is the Cadillac STS going through the handling course:


Definitely a memorable experience...


| 6 Comments | No TrackBacks

It's been almost 3 weeks since I've touched a computer. I'm back from Jamaica and now happily married!

So what did I miss while I was gone? A few things I've noticed:

.. and theres probably more I missed as well. Is there anything else I need to know about before resuming my regularly scheduled program?

Oh, and Flash Forward New York is this week. Sadly, I won't be able to attend. After taking off so much time for the wedding / honeymoon, I'm not going to be able to make it out. Maybe next year...

Xbox Live Usability Issue

| 3 Comments | No TrackBacks

My first experience with Xbox Live wasn’t entirely pleasant. This is why usability is such an important issue in design in general, not just when creating applications.

First off, a little bit of background. With Xbox Live you can connect your Xbox game console to the internet and play select games online against other people, all over the world. One of the very cool features is that the Xbox Live Kit contains a headphone / microphone ear piece, allowing you to list and talk to the players that you’re playing against. The audio adapter plugs into the controller, and the earpiece plugs into the top of the adapter.

The earpiece microphone has two modes of operation. One mode transmits everything you say to other players, the other mode allows you to silence your microphone so you can cough or talk to other people in the room without the online players hearing you. There is a button to change between the modes, but it is not a stateful button. That is, the button doesn’t stay “pushed in” or not - to change modes you just push the button again.

Because the button doesn’t provide state information there is a toggle light to let you know what mode your microphone is currently in. This is where the problem is. Here are two images that show how the light works in each mode.



From these images, can you tell which mode is “recording” and which is “muting”? Is it obvious? My answer to that is a resounding no.. and here’s why.

A few things I’ve learned about user interface design:

  • Avoid modes wherever possible. Modes require the user to remember something. If you need to implement a mode, be absolutely sure that the user can easily tell what mode the system is currently in.
  • Metaphors are a great way to enhance usability. Users can understand metaphors because they can relate to them in the “real” world. Requiring your users to remember less can increase usability (knowledge in the head vs. knowledge in the world).
  • If you use a metaphor, make sure you get it right! Ensure that the user’s conceptual model accurately reflects the system model. Bridge the gulfs of evaluation and execution.
  • Users never, ever, ever, read manuals. Never. If the system needs a manual to figure it out, chances are it wasn’t designed well.

So… Miscrosoft did a good thing. The microphone has two modes – record, and mute. In order for the user to not have to remember what mode is which, they’ve used a metaphor to indicate what mode the microphone is currently in.

The problem is, they got the metaphor wrong.

The metaphor they picked, green meaning “go” and red meaning “stop”, is a metaphor that everyone understands. However, green and red don’t make sense at all in this context. If I had to guess, I would say that “go” meant the microphone was recording, and “stop” meant that the microphone was on mute.

However, another metaphor, speficially related to the microphone context, is that “off” (no light) means “not recording” and “red” means “recording.” Remember that old tape player that you had in 1990? Remember when you went to record a song off of the radio, there was a red light that illuminated to signal that the tape player was recording?

So which is it? Is green “record” or is red “record”? In my head, I picked the radio metaphor over the stop/go metaphor because of the microphone/voice context. I assumed that when the light was red that everything I said would be transmitted over the internet and when the light was green the microphone was muted and I could talk freely to myself.

As you can guess, I picked the wrong metaphor.

The button on the controller is used toggle between the two modes. Aside from the color, there is nothing else to indicate what mode the microphone is currently in.

Imagine my chagrin when I discovered that my random coughing and commentary had been heard by numerous people when I didn’t intend for it to be. Imagine my frustration when people were talking to me but I couldn't respond back to them. Believe it or not, I actually had to read the manual to figure out what the colors meant. I consider this a failure on the part of Microsoft in the design of the adapter.

How could the adapter have been designed better? Personally, if a metaphor had to be used I think more people would be familiar with the radio vs. the red/green one. Of course, this is a baseless claim.. just because I’m more familiar doesn’t mean everyone else would be… which is why it’s essential to perform usability testing. Maybe Microsoft did, and their target audience (which is probably younger than me.. but I’m only 23) understood the red/green one more a higher percentage of time?

How about a different idea – instead of a stateless button, have a stateful switch on the side with two positions, record and mute. The record position has an icon of a microphone, and the mute position has the microphone icon with the classic “circle with a line through it.”

Taking that one step further and combining with a previous thought – keep the stateless button, change the light to a microphone icon, and have a the “no” ciricle light up red when the microphone is muted. I think that would offer less ambiguity and would reduce misinterpretation. Again, that is a baseless statement… it would have to be proven through user testing.

The point of all of this, as I’m sure you’re aware, is that user interface design is important in all things. If you build something that other people need to use (from a teapot, to a doorknob, to a software program), you need to build it with the other people in mind. The architect, programmer, designer, etc. is not a good judge of “simple,” and usability testing is very important.

What do you think about the Xbox Live toggle light? Did you guess the right metaphor? How could the design be improved?

UML - some good reading material

| 3 Comments | No TrackBacks

If you have some free time and want to brush up on some UML skills, heres a few links that provide a good read.

If anyone is interested, I can post up the UML diagram for SolVE. Although the app is coded in Java, I'm pretty pleased with how it turned out behind the scenes. A little bit of planning goes a long way.

Also, by now you should've seen/heard the buzz about the previews of Flash Player 8. If not, check the original post at The video had to be taken down due to bandwidth, but trust me, it was cool. A lot of the blogs are talking about this.. Cheers to Macromedia for such an impressive demonstration.

5 gmail invites left...


With all of the invites being thrown around for gmail lately the geek factor is gone for sure. Nevertheless, I have 5 invites for anyone who wants one. Post up a comment, but be sure to include your current email address as that is where the invitation will be sent to.

Bug me not


Tired of having to register for sites that offer free content? Look no further.

From their FAQ page: was created as a mechanism to quickly bypass the login of web sites that require compulsory registration and/or the collection of personal/demographic information (such as the New York Times).

There's a great FireFox extension that allows you to right click on a page that requires regiration and select "BugMeNot." This will open a popup window that provides a username and password to access the free content, so you don't have to provide your personal information or register yourself.

Click here to visit the BugMeNot home page.

Is this ethical? Use your own judgement. There's an interesting discussion happening over here.

About this Archive

This page is an archive of recent entries in the General category.

Flex is the previous category.

Find recent content on the main index or look in the archives to find all content.


OpenID accepted here Learn more about OpenID
Powered by Movable Type 5.02