0 comments suggest edit

Steve Harman digs in and solves a longtime mystery for me regarding VPN connections and default gateways on remote networks.

Most clients we have require that we connect to their network via VPN. Nothing new about that of course. But some clients require that we check the Use default gateway on remote network option when setting up the VPN.

That effectively shuts down my ability to access resources on my local network as all traffic gets routed through the remote network.

VPN Dialog. Shows the Use Default Gateway on Remote Network

Fortunately, Steve didn’t give up like I did. He persisted and, following up on a tip by Jon Galloway, figured out how to configure Routing Tables to achieve what he needed.

This so beats my twine and wire MacGuyver solution of simply setting up Remote Desktop to another machine that is then connected to the VPN.

With persistence and problem solving skills like that, a company would be lucky to hire Steve. So we did this past month!

blogging 0 comments suggest edit

DownIf you’ve read my blog for any length of time, you know I tend to go on and on about the virtues of blogging and participating in Open Source projects.

You might even start to suspect that I think we could end wars, poverty, and hunger and sit around singing Cumbaya together in harmony if only everyone would blog and participate in Open Source.

Really now. I’m not that naïve. I’m sure we could pick a better song to sing around the campfire.

All kidding aside, I really have put my money where my mouth is.

UpIn the past, I’ve talked about the challenges of hiring, as well as my belief that blogs are a great means to connect with good developers.

That’s how I met and hired Jon Galloway who is a tremendous technical leader, developer, and business partner.

I also think that judging potential hires on open source contributions (as 37Signals suggests) is a great way to find good developers, though I’m not so inclined to be as extreme as they are and only hire Open Source developers.

But rather than just talking about hiring Open Source developers, we recently hired Steve Harman. Steve was a Java developer at a large financial institution when he started contributing to Subtext so that he could cut his teeth with C# and .NET.

Over time, he really took on a lot of responsibility and impressed me with both his good judgment, and his work ethic. By actually working with him on a project and seeing the quality of his code, I got a really good sense of him as a developer and potential coworker that is impossible to get from a three hour or even three week interview.

I’ve been responsible for hiring as a development manager at three companies, with varying degrees of success. It turns out, that my best hiring has been at VelocIT.

Hiring is full of landmines. I’ve hired people who were great in interviews, but ended up not being able to code their way out of a Hello World program.

That is why I’m such a firm believer in the power of blogs and open source contributions to filter out the true gems among the lumps of coal.

Of course, another great way to hire good people, though draws upon a smaller pool of talent, is to hire the best people you’ve worked with in the past. A while back we hired Pat Gannon who is a fantastic software developer. The only reason he doesn’t get mentioned much here is because he doesn’t have a blog, and you know how I feel about blogs.

Maybe if we didn’t we keep him so busy building systems, he’d have time to write a blog post or two.

0 comments suggest edit

This is amusing. I tried to view a post on Slashdot and got the following error page.

Banned from Slashdot

I have no idea why that would be the case. I think I have RSS Bandit configured to download the RSS feed every hour, which hardly qualifies as a DDOS attack. Interesting.

0 comments suggest edit

Image of the sun from
http://www.noaanews.noaa.gov/stories2005/s2372.htm Today I turn 32 years old.

I remember when that sounded old to me. But with recent advances in health care and life expectancy, songs like Jay-Z’s new 30 Something (the chorus states “30 is the new 20”) remind me I’m still in my prime.

If only someone would tell my knees that.

My wife threw a nice party for me and some friends on Saturday. We had a huge Korean food spread. In true Korean style, it was way too much food, and I’ve been eating Korean food all week, not that I’m complaining or anything. We bought some marinated ribs (Kalbee) in KoreaTown and grilled it up proper on my friend’s grill.

Tonight will be low key. I’ll probably grab some sushi with the wife, and later hang out with Jeff Atwood who happens to be in town.

One of the new toys I received from my family is a Linksys CIT200 Skype phone. It’s not a wifi phone, but rather a cordless phone. It’ll allow me to roam around the house on those long Skype conference calls. So far, I think it’s pretty nice.

tech, code 0 comments suggest edit

Fingerprint via public domain
clipart How do you uniquely identify a person, without divulging the identity of that person?For example, given a set of personal artifacts, how would I arrange the set of artifacts grouped by the person to which they belonged?

The answer is quite easy, isn’t it (especially given the title of this blog post and the image to the right)? You can look at the fingerprints on the items.

Unless you happened to have a file that mapped the fingerprints to individuals, you won’t know who the comb and mirror belong to, for example, only that they do belong to the same person and not to the person who owns the scissors.

The analogous structure in the world of information theory and computer science is the digital fingerprint, often created via ahash function. MD5 and SHA1 are two of the most commonly used hash functions.

A hash function is a one way algorithm for converting data into a number which for the most part can be used to identify the data without revealing the data. This is why it is common to hash passwords before storing them in a database.

In order to authenticate a user, I don’t need to know the user’s password, I just need to know that the hash I’ve stored corresponds to the password you typed.

Don Park recently invented a system for representing IP Addresses without divulging the actual IP Address via a system of glyphs, which he calls Identicons. This serves as a nice means of identifying commenters on a blog, without divulging their actual IP address, which could be a privacy concern. The following image are some examples of identicons.

Some Identicon

What’s interesting to me about identicons is that they have wider uses beyond representing IP addresses. As Don states,

I think identicons have many use cases. One use is embedding them in wiki pages to identify authors. Another is using them in CRM to identify customers. I can go on and on. It’s not just about IP addresses but information that tends to move in ’herds’.

One way to look at identicons is that they are a visual representation of a hash value. They sort of add even more weight to the fingerprint analogy by being visual like a real fingerprint.

For example, for security reasons, many free software providers provide an MD5 checksum of their software binaries. You can see an example of this from the PuTTY download page.

Putty Download Page. Shows links to MD5

The next screenshot shows some actual hash values of exes.


Looking at the first listing, we can see that for pageant.exe, the hash value is 01d89c3cbf5a9fd2606ba5fe3b59a982, kind of a mouthful, right? Another way that could be represented is via an Identicon, which would be more readily recognizable.

Of course, in this situation, the security minded person would use an automated MD5 checksum checker rather than manually confirming the binary. But do you trust your md5 checksum checker? A quick visual confirmation would be a nice additional vote of confidence in this scenario.

If you’re interested in playing with Identicons in .NET, I recommend taking a look at this .NET port of Don Park’s implementation written by Jeff Atwood and Jon Galloway.

I had the pleasure of reviewing the code with Jeff and he’s quite proud of his caching optimization. Rather than caching the Bitmap object, he caches the PNG output as a MemoryStream instance. That ends up saving a ton of memory.

code 0 comments suggest edit

Yesterday I mentioned that Jeff Atwood and Jon Galloway wrote an Identicon implementation for .NET. It works beautifully, but they distributed the code as a Web Site Project, which I cannot deploy to my blog as is.

For those of us who prefer Web Application projects, I repackaged their code as compiled DLL and a handler file. This distribution will work for both Web Application Projects as well as Website Projects.

Just download the binaries, copy the DLL to your bin directory, copy the IdenticonHandler.ashx file to your website directory, and you are good to go. You can simply add an image tag that references your identicon handler.

<img src="IdenticonHandler.ashx?hash=hash-of-ip-address" />

[Download Binaries]

You can also grab the Solution I used to prepare the binaries.

[Download Source]

Gravatar Tip!

If you use Gravatar, consider using the identicon handler as the default image. That’s what I did for this website. That way, if the user does not have a gravatar, the identicon will show up instead. Better than nothing!

0 comments suggest edit

Windows Developer Power Tools Cover From
Amazon.com In order to promote the book Windows Developer Power Tools: Turbocharge Windows Development with More Than 140 Free and Open Source Tools, O’Reilly is declaring January 19^th^ (aka today) to be “Windows Developer Tools Day”.

I think declaring days will become a bigger trend in 2007. I’ve tried my hand at declaring July 26^th^ to be “Contribute to Open Source Day”. Jeff Atwood declared December 1^st^ to be “Support Your Favorite Small Software Vendor Day”.

Now we can add Windows Developer Tools Day to that geek calendar.

As I mentioned before, I contributed a couple of sections to the book–The section on TortoiseSVN and TortoiseCVS and the section on Subtext of course.

I’m genuinely looking forward to receiving my copy of this book for the many useful tools that are presented inside. Not only that, some of our clients are starting to migrate towards using Subversion, for which we’re providing some rudimentary training.

It’ll be helpful to tell them to buy this book and read my section on TortoiseSVN.

I believe the book also covers CruiseControl.NET. CruiseControl.NET has been an extremely valuable tool for Subtext’s continous integration and build process. The next step for some of our clients is to help them devote a server and time to setting up a continous integration process.

0 comments suggest edit

Photo of a
DrillWe often hear that the current state of software development is still dysfunctional. Scott Rosenberg recently wrote a book to that effect called Dreaming In Code. He takes takes a look at the question Why is software so hard? According to Scott, Software developement’s history is marred by poor quality, missed deadlines, and cost overruns, primarily due to a persistent dysfunctional culture.

And he’s talking about software written by companies who are in the business ogf writing software. Well if software written by software companies is so bad, how bad is the software written by hardware companies?

Very bad.

I’m sure there are a few exceptions, but companies that I think should know better write atrociously poor software. And frankly, I’m getting tired of it. Here are some basic principles for hardware makers to keep in mind when writing software for their products.

1. The computer belongs to me, not you!

Did you ever notice that my documents are in a folder named My Documents. Not Your Documents (in Vista, it’s just Documents, but there’s still an implicit my in there).

That means that folder belongs to me. Not you.

So I beg you, stop adding your folders in there. There is a proper location for your stuff, in the Application Data directory. Since you’re too lazy to understand how Windows works, I’ll write some sample code for you in C# that demonstrates where to place your application’s files. I’m sure you can figure out the C++ equivalent.

string appDataPath = Environment.GetFolderPath

string yourAppDataPath = 
  Path.Combine(appDataPath, "YourApplicationName");

Brush up on the Environment.SpecialFolder enumeration. It’ll come in handy.

For user settings and application cache data, you might also consider using Isolated Storage. Just don’t put it in My Documents.

2. Don’t Assume The User Is An Administrator

While I’m ranting on this topic, I should also mention that any data your application needs to write should not go in the Program Folders directory. Not everybody runs their machine as an administrator and better you learn that lesson now than when Vista is widely disseminated.

3. Learn About the Platform And The Services It Provides You.

I recently bought a USB enabled Universal Power Supply (UPS) that was well reviewed. It appears to be a great hardware product, but the software is crap.

The point of getting a USB enabled UPS is that the UPS can shut down windows gracefully if the power goes out. But rather than intergrating cleanly with Windows XP Power Management, they wrote their own ugly little system tray applet. Why not take advantage of what the OS provides?

To me, this example and the previous example I mentioned with the Application Data folder belies a willful ignorance and disregard for writing good software for Windows. It’s due to an unwillingness to take the time to learn about the platform.

4. Honor Your Obligations and Promises.

When installing HP drivers and software for my scanner (which sadly doesn’t work with Vista at all), the installation process provides me with a checkbox “Add an HP Share-To-Web icon to the desktop?”.

I responded with my usual response, Hell no!, by unchecking the checkbox. But what happens when the installation is complete? There’s the icon on my desktop. Not only that, the icon is impossible to delete. I mean impossible!

I tried to right click it, there’s no delete option. I click properties and select remove icon from desktop and click Apply. The dialog hangs, never returning. Fantastic!

Please, give users a choice. And when they make a choice, honor it!

5. We Really Don’t Want Your Cruft

Really. Seriously. We don’t.

It’s simple. If a piece of software is something we really want, we’ll take the time to find it and install it. We don’t need you to install a bunch of crapware alongside your drivers or main application.

If it needs to be pork barreled in order to get it on our machines, we probably don’t want it.

Trust me on this one. The extra endorsement money you get for bundling probably won’t make up for the loss in customer satisfaction.

6. If The Software Sucks, We Think The Hardware Sucks.

Again, quite simple. The majority of user interaction with a piece of hardware is really via the software. If the software is clunky and hard to use, or worse, just flat out fails to work. We associate the failure with the entire product, hardware and all. After all, if a company can’t take the time to write quality software, why should we trust in the quality of the hardware?


So that’s it. All I ask is that hardware makers take as much care writing their software as they do building their hardware. Perhaps more care, given how flimsy hardware can be these days.

When the supporting software is good, customers will rave about your products.

0 comments suggest edit

BeckhamLooks like Beckham is moving to La La Land. Sure, he is no longer on the English national team, nor does he start for Real Madrid, but I bet he’s still got some good playing days in those legs, and will definitely be a huge lift for the level of play in the MLS, or at least for the struggling Galaxy.

I’m just thinking I should’ve bought season tickets, because the price probably just went way up.

0 comments suggest edit

Image of a RIM Blackberry
emulatorI’m currently working on an interesting project to develop a series of HTTP services used by games running on the RIM Blackberry. These services will enable players to compete against one another (though not in real time) in various games and see high scores, challenge friends, etc…. It brings a social aspect to gaming on your blackberry device.

The games are written in Java and I’m using a Blackberry emulator for testing the interaction between the game and the services. I’m running the service at localhost on my local machine to allow me to step through the debugger when necessary.

With all these web requests and response shuttling back and forth between the game and the service, it’d be nice to be able to debug that HTTP traffic using a network analyzer like Fiddler.

What Is Fiddler?

If you’re not familiar with Fiddler, it acts as a local HTTP Proxy on port 8888 allowing you to inspect HTTP traffic between your an application and a web application (even one running at localhost). WinINET-based applications (such as Internet Explorer) automatically use Fiddler when its running. For other applications, you need to configure the application to use Fiddler as a proxy.

It’s immensely useful when debugging web services and weird problems with web applications.

It Wasn’t Working For Me

Unfortunately, I ran into an annoying problem. The emulator is not a WinINET-based application nor does it allow configuring a proxy, thus Fiddler was not reporting any traffic.

Configuring Fiddler as a Reverse Proxy

Fortunately, I found instructions on the Fiddler site that shows you how to configure Fiddler as a Reverse Proxy.

A reverse proxy sits in front of your webserver and forwards requests on to your webserver. Thus the application doesn’t need to be configured to use it. All I had to do was ask the developers to change the application to make requests for port 8888 (I’ll explain later why I couldn’t just set up a HOSTS file entry).

I then added a rule to forward requests for localhost port 8888 to localhost port 80 like so:

if (oSession.host.toLowerCase() == “localhost:8888”) \     oSession.host = “localhost:80”;

Unfortunately, this didn’t work, creating some weird infinite loop when I would make a request to localhost:8888. To rectify this, I added an entry to the HOSTS file to map the hostname MOBILE to the ip address Fiddler apparently doesn’t work as a simple port forwarder (I’ve got a solution for that, keep reading).

Image depicting a hosts file. The last entry shows the ip address mapped to the host name

I then updated the custom rule in Fiddler to route requests for mobile:8888 to port 80 of the localhost and again asked the developers to change the url encoded in the app (I don’t have the source for the client app).

if (oSession.host.toLowerCase() == “mobile:8888”) \     oSession.host = “localhost:80”;

Now I can monitor requests from the emulator to localhost using Fiddler. One benefit of using Fiddler is that I can replay requests tweaking form values and such.

Image of a Fiddler

Dealing With Hard-Coded URLs

In the most recent build of the game, the game developers accidentally changed the hard-coded URL to point back to the QA environment. For the sake of this example, suppose it is http://mobile.example.com/.

Rather than asking them once again to change it, I decided to try and work around this. I added the QA server hostname to the HOSTS file just like I did with MOBILE before, pointing it to localhost. I then had to change IIS on my machine to run on a different port, since I planned to configure TcpTrace to listen in on port 80. I chose the perennial favorite alternate port for IIS, port 8080. and used TcpTrace to listen on port 80 and forward requests to port 8080.

Image of TcpTrace window forwarding requests for port 80 to

This allowed me to view the HTTP traffic back and forth between the emulator and the web service again using TcpTrace. Unfortunately, I could not get Fiddler to work in this setup, so I lost some of the ability to tweak and replay requests. This ended up being fine since the latest build is meant for final testing.

The following are some useful resources for HTTP debugging.

code 0 comments suggest edit

A big
wrenche Jeremy Miller believes that among the various beneficial and important qualities a codebase can have, the single most important quality of code is maintainability. I totally agree, having spent many hours maintaining legacy code written years ago as well as code I wrote a week ago.

As soon as a line of code is typed on the screen, it becomes legacy.You are now maintaining that code.

Enterprise software systems change.  Business rules change, technology platforms change, third party dependencies are upgraded.  …

Enterprise systems typically aren’t replaced because they stop working.  The end of life cycle for an application or system is often brought about because the system has become too difficult, risky, or expensive to modify to keep up with evolving needs.

According to Robert L. Glass in Facts and Fallacies of Software Engineering, research shows that maintenance typically consumes from 40 to 80 percent of software costs, typically making it the dominant life cycle phase of a software project.

Fortunately, Jeremy has your back. He’s written a multi-part treatise/manifesto on writing maintainable code. Some of the posts are a bit longer than your typical skim it while reading blogs during a compile entry, but are well worth reading.

Print them out, sit back with a fine glass of scotch, and savor the excellent knowledge he imparts.

I look forward to the next post in the series.

0 comments suggest edit

While I really enjoyed the holidays, one part was really difficult for me. There was some great discussions happening about Subtext in the mailing list and in various blog posts, but I was too busy to really get involved.

I’m reading everything, but times are really busy for me right now as I’ve fallen a bit behind on the book and have to play catch up. Not only that, work is really picking up.

Unfortunately this means less time to work on Subtext and blog about it. Fortunately, others have picked up the slack over the holiday weekend. I wanted to highlight a few of those posts.

Adding Custom ASPX pages to Subtext

Now that Barry Dorans finally migrated his blog to Subtext, he’s writing about it. One post he wrote deals with how to workaround the fact that Subtext intercepts all requests for *.aspx pages by default. Thus if you try and add an aspx page for your own needs, it won’t get rendered. Barry walks you through how to add your own .aspx pages to a Subtext installation.

Barry also provides a quick tip on how to recalculate view stats in Subtext.

Subtext and IIS 7

Sascha Sertel wrote a couple of interesting posts that cover how to get Subtext up and running in IIS 7 on Vista.

His first post covers Installing Subtext in an IIS 7 virtual directory with SQL Server 2005. His guide provides some great troubleshooting advice for getting Subtext up and running in this scenario. Hopefully the next version of Subtext will support this scenario much better via improved documentation and error messaging.

He has a short follow up post that covers installing Subtext as its own Website in IIS 7. In truth, this probably applies to any web application in IIS 7.

His latest post in this series covers debugging Subtext on Vista using IIS 7 and Visual Studio 2005. While I personally use the built in Webserver.WebDev for debugging, I do need to test the code using IIS before deployment. This is useful information to have.

Merging Blogs

Keith Elder writes about his experience merging two separate blogs into a single blog on Subtext. Once he had the data imported into a local database, he deployed the Subtext code and ran exported the local data to BlogML and imported that same BlogML from the server. Another success story for BlogML.

So I may not be as heavily involved in current Subtext development at the moment as I would like, but development is still moving forward with or without me. That’s a good feeling.

personal 0 comments suggest edit

Not too long ago I announced that my wife and I are expecting a baby this year as part of our world domination plans. Adding fuel to our plans is the discovery that this year is a special year according to the Chinese Zodiac.

It is not only the year of the Pig, it is the Year of the Golden Pig. According to Chinese Folklore, this is an event that occurs once in every 600 years and will ensure that a baby born on this year will experience a prosperous and wealthy life.

This legend is so popular, that Korea is expected to have a 10% increase in birth rate this year, which is apparently much needed as its birth rate is extremely low.

I’m not going to start taking loans against my child’s future wealth just yet as many Chinese foklorists and historians doubt this belief.

However, a folklore professor, Joo Young-ha, at the Academy of Korean Studies rebuts the theory. He explained that if the year 2007 is the golden pig year which comes every 600 years, there should be records about the special year written in the ‘Taejong Sillok,’ archives of King Taejong. King Taejong ruled the Joseon Dynasty 600 years ago. But there are no such records, which makes him believe the myth was made not long ago.

Well I have a thought for you Joo Young-ha. Quit raining on our parade! Perhaps the Year of the Golden Pig happens every 600 years from now.

0 comments suggest edit

K. Scott Allen, Jayson Knight, and Keyvan Nayyeri all tagged me, so despite my general antipathy towards these viral questionnaire memes (they remind me of that silly slambook fad in grade school), this one is interesting enough for me to respond.

Besides, since my main machine is still fried until Dell manages to ship me my new video card, I’ve got nothing better to do.

1. In Florida, I helped build a casino.\ Yellow Hotwheel
CarWhen I was around eight or nine years old, I was part of a toy car club. We had meetings to discuss the relative merits of Matchbox vs Hotwheels and what qualities to look for in purchasing a collectible car. We also put on various car shows for the neighborhood kids.

The club leader was a much older kid who decided to raise funds by building a casino. He put us all to work building a shed in his yard and we stocked it with those working toy slot machines, a blackjack table, a roulette wheel etc…

With that in place, we rounded up all the neighborhood kids and had them play the games with real money. I think the club president was using all of us to make himself some extra cash (not to mention doing his chores by building a tool shed/casino) because I recall hefty membership fees to join the club and he pretty much wouldn’t let me cash out my winnings at the casino, egging me on to continue playing until I lost everything.

2. I was part of a breakdancing crew in Spain.\ Man performing a one handed handstand while grabbing his foot with
the other
hand. Who wasn’t part of a breakdancing crew back in the mid-80s? Me and my friends used to battle against the local Spanish kids.

For those who are unfamiliar with the breakdancing vernacular, battling was the act of dancing in a manner so as to impress your buddies and onlookers, while insulting your opponent with such clever actions as pretending to eat an opponent’s head and throwing the excreted result back at him.

My specialty was the head spin.

3. When I was a baby, I nearly drowned in a river in Korea.\ River All I remember was climbing onto an inflatable raft. I must’ve been around three or four. The next thing I know, the sucker flipped and I was drifting towards the bottom. As I was sinking, I remember looking up and seeing my uncle swimming towards me and pulling me up. Apparently I was deathly afraid of water for years afterwards. I’m fine now thank you.

4. I embarrassed myself on television in Guam.\ A ship on the open seas near an island. It is the HMS
Beagle. During Middle School, I was part of the Academic Challenge Bowl team for my school. We would go on local public access television to play a Jeopardy like game against the other middle schools.

In my first game, I got a little buzzer happy and buzzed right in the middle of the question. What I heard was something like this:

Charles Darwin formulated his theory of evolution during a trip to…

I buzzed in and blurted out “Galapagos Islands!” Sorry, no. The moderator continued,

…the Galapagos Islands. What was the name of his ship?


5. In High School, I struggled with math and considered going to art school.\ A self portrait of Van
Gogh I have a bit of a reputation among my friends for being a bit of a math geek. However, due to the fine quality of the educational institutions in Guam, I was actually a year behind my college-bound peers in math when I moved to Alaska.

English was my better subject during highschool. While I struggled with math, I aced both the AP English and AP Literature exams (earning me bookoo college credit).

In fact, during this time, I was seriously considering going to an art institute. What convinced me otherwise was the thought that I would miss the fun of the traditional college experience (Old School anyone?) if I went to a more vocational school. Yeah, that was some seriously deep reasoning.

Tag, You’re It

Ok, so in keeping with this meme, I must now tag five people (a few of whom are the least likely to reply to this) who are then honor bound to reply with their own five things nobody knows or they will lose an eye, or something like that.

0 comments suggest edit

Here’s wishing you a Merry Christmas and a Happy Holidays. For Christmas, I received a defective video card as a warranty replacement for my defective video card. Thanks Dell! The replacement card was more defective than the one I returned.

Unfortunately this means I can’t work on my book until I get it replaced. On the plus side, I have more time to spend with my visiting family.

Tonight, we have our annual Alaska King Crab Christmas dinner. I’ll post pics later.

personal 0 comments suggest edit

No, this was definitely not a good sight for me. With my team pressing the attack, an unfortunate turnover left our defense out of position to help as the opposing team quickly capitalized.Ezra and
Me (Click on any pic for a larger view).

Squinting toward the sun, I saw 6’ 3” Ezra Hendrickson of the Columbus Crew barreling towards me, the last man back on defense. Fortunately his midfielder’s cross was a bit too long, allowing me to pluck it out of Ezra’s path.

With Ezra backtracking towards me attempting to regain the attack, I looked up for a midfielder to distribute the ball to, finding Preki, former U.S. National team player, ready to receive the pass and orchestrate the counterattack.

Jerseys Might sound like a soccer lover’s wet dream, but this is just a small snippet of what I’ve been up to this past week. I attended the Los Angeles Galaxy’s Adult Fantasy Soccer Camp.

Yeah, the name is a bit snicker-worthy (Adult Fantasy Camp, heh-heh heh-heh?), but such camps are common for other sports such as baseball and basketball. It’s an opportunity for soccer lovers to get a taste of the pro treatment.

For me, it was four straight days of heaven. Two practices a day with former and current Galaxy coaches. Expert guidance from fitness trainers from the company who Jürgen Klinsmann selected to work with the German National team. Guest appearances from several soccer celebrities (though three of them happen to be in my soccer league).

Lounge The camp was held at the Home Depot Center, the home of the Los Angeles Galaxy. We used the same facilities they use, including their lockers, their training fields, and their lounge (seen here at right).

When I first arrived, my locker had two kits neatly displayed in my locker. An away jersey and a practice jersey. You can see my jersey in the picture below right.

#8 Each day started with a morning session which commenced with a warmup lead by an instructor from Athelete’s Performance. I particularly appreciated their philosophy against static stretching before exercise as it can decrease performance. Instead, athletes get a stretch by working through the natural range of motions in various warm-up exercises. Static stretching is great for after workouts.

Afterwards, we ran through various drills and small sided games led by the expert coaches. The afternoon sessions focused more on actual playing and tactics, with the occasional shooting and defensive drill thrown in.

For the most part, the other participants were a diverse group, but the soccer community is a small world in Los Angeles. Four other participants were current or former teammates of mine.

Max, Me, and
Joaquin, and

The Grand Finale of the camp is a full field game with professional MLS referees between two teams chosen by the coaches. On the penultimate day, I noticed the two coaches hunched over their notes furiously picking teams and making trades between the two of them. For the coaches, this was a matter of pride to see who could pick and coach the better team.

The morning of match day, they revealed the lineup, but did not reveal the allocations (marquee players to be announced) until lunchtime. The other team received a current pro and a former college player. We received a former college player, our second allocation not able to make it.

Fortunately, our coach is quite shrewd and happened to run into Preki who was there to interview for the Chivas coaching job. After his interview, he was happy to come out and play one half with us.

The coach gave me a decisision to make, would I stay in the attacking midfield, or reliquish the spot to Preki. That, my friends, is a no-brainer. With a player of that caliber around, I moved back to central defense, ready to get my Beckenbauer (actual compliment from a teammate after the game).

Although I felt we were the superior team, we ended up tying the match 3 to 3. A disappointing result considering how much we possesed the ball. Our last shot of the game nicked the post, almost giving us a game winner at the last second.

My friend Donny filmed much of the camp and will be putting together a video for the MLS. Being his carpool partner, it’ll have a lot of me in it. ;) If you’re a soccer lover in or near Los Angeles, I totally recommend this camp next year.

0 comments suggest edit

VillagersClean drinking water piped to my house is something I take for granted (yes, even in Los Angeles). When I stop to think about it a bit, I can’t imagine how tough it must be to not have clean drinking water.

For people in four remote areas of Malawi, this is a day to day reality. Fortunately, there are people trying to do something about it. Wells for Zoë is a charity dedicated to bringing clean water to these areas.

Jamie Cansdale, famous for TestDriven.NET (a tool near and dear to my heart), is doing his part to contribute to this good cause by starting a .NET software charity auction. Several generous vendors have donated licenses to great software you can bid on. If you have the means, consider making a bid. If not, perhaps you can make a small direct donation.

0 comments suggest edit

Today my team had a friendly preseason game against Hollywood United. They fielded a mixture of a few players from their 40 and over team, but most of the players were from their main team.

While Alexi and Frank were not there today, Hollywood did field the Mean Machine, Vinnie Jones. He is a former professional player from England who was part of the Crazy Gang team that won the FA cup in 1988. He’s notorious for dirty play, but now more well known for his acting, such as the role of the Juggernaut in X-Men 3.

Grabbing the wrong soccer


Despite being known for his rough tactics, it still takes talent to play at the level he played at, and it showed today. He put in a sweet freekick to the upper corner. And yes, he looks even meaner in person than he does on film. He’s a tough looking Mofo.

Another well-known player was Steve Jones, former guitarist for the punk band the Sex Pistols, who also hosts Jonesy’s Jukebox. Jimmy Jean-Louis is also on the team. He plays the guy who can erase memories on the new NBC show, Heroes. They’re not kidding when they call themselves Hollywood United.

At the end of regulation, we were tied 4 to 4. Since it was a friendly and we had paid for the field for 10 more minutes, we played a short overtime period in which they scored two more goals, the final being 6 to 4. We should’ve faked injuries and left while we were tied. Wink

0 comments suggest edit


I know what you’re probably thinking. Did Phil forget to take his meds today? Let me explain.

Yesterday I thought I would try my hand at upgrading to Vista. But first, being the conscientious geek that I am, I tried to mirror my current drive to a brand new drive.

I plopped the new drive carefully (as carefully as one can plop anything) into the machine, and the system wouldn’t boot. So I retreated, pulling the old drive out and putting everything back the way it was.

Or so I thought.

The machine still wouldn’t boot. I ran the entire suite of Dell diagnostics tests on it. I also ran CHKDSK /F on it. Nothing. I ran out and bought a new SATA cable. Nothing. As far as any software test could tell, the drive was fine. It was being recognized by the BIOS, it just wouldn’t boot.

I plopped my new drive (again carefully) into the primary spot and was able to perform a clean install on it. So my machine can boot on my new drive with Vista, but not my old drive with Windows XP. How strange! At least I can access my old drive from Vista in order to copy important files over to the new drive.

As an aside, why do we say we perform installs? It’s not like anyone is watching, nor would they really want to. Who is being entertained?

Today, I was still dealing with the aftermath of this drive failure when I chatted up Micah on Skype. He remarked that everyone in our company seems to be having computer issues today. Jon’s having problems with his sound card, Pat misplaced his laptop, and Micah’s USB flash-drive failed. He says,

Must be something in the air. Maybe there was a huge solar flare or something.

Then it struck me.


I remembered reading that in fact there is a huge solar flare headed towards Earth. Well there you go, say no more. That explains it. A solar flare hosed my drive. Right now I am trying to mirror my new drive over my old drive to see if it’ll boot up with Vista. If it does, then it would seem to me that somehow Windows got corrupted on my old drive. Perhaps a solar particle flipped the AllowBootAndJustWork bit to 0. Just my luck.

In any case, it’s a good thing I have a couple of backup machines to blog from.

0 comments suggest edit

I don’t suffer from classic OCD (Obsessive Compulsive Disorder), but I do sometimes have OCD tendencies. Just ask my poor wife when we’re having dinner while my mind is still trying to resolve a thorny programming problem. Earth to Phil. Are you on this planet?

Lately, the object of my OCD-like tendencies is getting the Subtext unit test code coverage up to 40%. At the time of this writing (and after much work), it is at 38%. Why 40%? No reason. Just a nice round number that we’ve never yet hit. Remember, OCD isn’t necessarily a rational affliction.

If code coverage is my disease,TestDriven.NETwithNCoverExplorerintegration is my drug, andJamie Cansdaleis my dealer. He graciously gave me a pro license as a donation to the Subtext project.

So here’s the anatomy of a code coverage addiction. First, I simply right click on our unit test project, UnitTests.Subtext, from within VisualStudio.NET 2005 (also works with older versions of VS.NET). I select the Test With menu option and click Coverage as in the screenshot below.

Test With Coverage in VS.NET

After running all of the unit tests, NCoverExplorer opens up with the a coverage report.

NCoverExplorer coverage results in Left

I can drill down to take a look at code coverage all the way down to the method level. In this case, let’s take a look at the Subtext.Akismet assembly. Expanding that node, I can drill down to the Subtext.Akismet namespace, then to the HttpClient class. Hey! The PostClient method only has 91% code coverage! I’ve gotta do something about that!

NCover Drill

When I click on the method, NCoverExplorer shows me the code in the right pane along with which lines of code were covered. The lines in red were not executed by my unit test. Click on the below image for a detailed look.

NCoverExplorer Code Coverage

As you can see, there are a couple of exception cases I need to test. It turns out that one of these exception cases never happens, which is why I cannot get that line covered. This may be better served using a Debug.Assert statement than throwing an exception.

If you haven’t played around with TestDriven.NET and NCoverExplorer, give it a twirl. But be careful, this is powerful stuff and you may spend the next several hours writing all sorts of code to get that last line of code tested.

Here are a few posts I’ve written that you may find useful to eke out every last line of code coverage.

Now get out there and test!