Friday, July 14, 2006

FMS – Drunken Master

First, I’ve decided not to try to keep track of the numbers of these posts. From now on, they’ll just start with FMS, and then a title for the story.

While I was stationed on Okinawa, my duties took me on deployment to the mainland many times. Most of the time, I would fly into Yokota Air Base, and then travel by bus or truck to Camp Fuji, nestled at the base of Mount Fuji. Actually, it was about 8000 feet up the mountain. That 8000 feet is just a SWAG (Silly Wild-Ass Guess), so don’t quote me on it.

On a serious note, before the funniness, Camp Fuji was the most beautiful and dramatic place I have been. Seeing this mountain just raise up out of the middle of a plain, with no other terrain in site, is amazing. When I got up in the morning one day, I looked away from the mountain, and realized that I was looking down on the clouds.

Back to the funny. In my first 8 trips to Fuji, I got exactly one (1) evening off. And that one barely counted, because I had to be up at 7 the next morning, to take care of the details of flying my artillery battery back to Oki. Since I had been to Fuji so many times, I knew just about all of the permanent personnel that were close to my rank. Since Fuji was such a small base, there were only like 200 permanent personnel there. There were, I think, 7 females on the whole base.

Since I had my one night out, after spending about 20 nights at Fuji, my friends in the Motor T group decided to take me out for a night on the town, in Numazu.

Numazu was about an hour’s drive from Fuji; at least, the bar we were visiting was. One of my buddies had heard about this bar from his Japanese girlfriend. She was meeting us there.

The bar was crap. We were the only people in there, except for a fat chick from New Zealand, and my friends’ girlfriend and her friends. I was the DD for the night. That didn’t last long, actually. At that time, I was big into drinking Tequila. One of the guys that came with us starting drinking it, and I decided to join him. I purchased 8 drinks, each of which cost 500¥ (~$5.00), and was equivalent to ~3 shots of tequila (they came in tumblers). Well, I drank 8 drinks that I know about. After the 8 drinks, I still had 1500¥ in my pocket. I’m not sure what happened to that money.

I know that I passed out on a couch in the back of the bar, after feeling up the New Zealand chick’s ass. I know that I needed a lot of help walking the mile or so back to where we parked the car.

When we got back to the car, I sat down on the gravel, and leaned against the right rear wheel. Then I started to puke. I made a puddle, then asked for help getting on my feet. One of the Jarheads I was with asked for the keys to the car, to get me in it.

The guy with the girlfriend was the one who drove. When we started yelling for the keys, he responded that he was coming, and then that he was almost there. What I didn’t realize until a couple of years later was that he was in his girlfriend’s car, having relations. He was serious when he said coming.

A few minutes later, he opened the car door, and I stumbled into the backseat.

I remember being in the back of the car, and feeling like I was going to puke. Then I remember puking. A lot. I was drunk enough that I thought I could catch the puke in my hands, and was trying to catch it and throw it out the window. It didn’t work so well.

When they got me back to my barracks, I collapsed into bed, after taking my pants and shirt off (inside out), and throwing them away. I got undressed in the laundry room, which was shared by everyone on that floor of the barracks.

At 6:30 or so, my boss, Sgt Scali, came to wake me up for the day. He told me to get showered, and that we would go to breakfast. Later, he told me that he came back around 7, to tell me that he was going to breakfast, and to meet him at the HQ building in half an hour.

The next thing I remember, it’s right about 8am, and Sgt Scali (who was a body builder) was pounding open my door, and screaming at me to get out of bed. I literally jumped from a prone position on the bed, and landed at attention about three feet from the edge of the bed. I was very confused, and didn’t understand what he was so mad about. I was only a couple of minutes late, after all.

That day, I couldn’t keep anything down, not even water. Finally, at about 1 pm, I managed to keep a pear down. One of my “friends” came over and asked me how I was feeling, and jiggled my head around. I told him it was my stomach, and not my head, so he jiggled my stomach. I threw up in the hallway, about 5 feet from the bathroom door, at a run.

Later that day, I finally managed to keep some Gatorade down. Do you remember the old Gatorade commercials, where the athlete drinks it, and you can see the fluid hit his stomach, and spread outward from there? I felt that. The first sip didn’t even make it to my throat; my mouth absorbed it completely.

Of course, since I was in trouble, Sgt Scali had been riding me all day long. He made me weigh every one of the 26 or so vehicles that we had to move that day, by myself. That consisted of dragging four 50 lb scales (they weigh 50 pounds, not read 50 pounds) in front of, say, a humvee. Then, I drive the hummvee onto the scales, get out, read the scales, pull the humvee off the scales, move the scales, and then park the humvee. After that, I get the next truck, and do it all again. 26 times. While incredibly hung over, and puking every few minutes.

Later that day, I talked to a friend in my unit, and he asked about me getting all drunk. I didn’t understand how he knew, since no one from my unit had been with us. Apparently, he ended up in the same bar, somehow, and had come to talk to me while I was passed out. When he woke me up to say hi, I apparently tried to deck him.

Luckily, I missed, and our friendship continued.

That night is why I don’t drink Tequila anymore, even after 9 years.

Thursday, July 13, 2006

Taking a collection

Alright folks, as many of you know, Courtney and I have had to cut out all frivolous expenses recently.

This sucks for many reasons, but right now, I want to tell you about one particular tragedy. I had planned to attend the Microsoft GameFest game development conference here in Seattle next month. The normal cost for this event is $450, but I am an elite, so my cost is only going to be $150.

As you all should know, it is my ultimate aspiration to support my family by creating and selling games to the unwashed masses. There are a few really huge announcements coming during this conference, and there are like 25 sessions I’d like to attend. Unfortunately, even if I go, it’s only a 2 day event, so I can attend max 16 sessions.

This is where you all come in. I’m putting a hand out in need. Dire need. I don’t know if I will be able to face another year with no game dev conference. The only other conference for game devs that I want to attend costs like $3000, so I’m giving you all a deal.

Now, if everyone that reads this blog donates some money, then I only need $80 from each reader.

That was a joke. Seriously, though, I’m hoping that you will all find it in your hearts to send me some little bit of money, so I can go and check out this conference. You can consider it charity, and you can claim it on your taxes (Note that I said you can claim it, not that it is legal to do so).

The easiest way for you to contribute is to send some dollars to my paypal account (Cullen_waters AT hotmail DOT com). For those that aren’t familiar, you have to replace the ‘AT’ with ‘@’, and the ‘DOT’ with ‘.’ when you send the money, or some other guy will get to go to GameFest in my place. And that would be a whole nother tragedy.

Wednesday, July 12, 2006

Take that, Mac boy

I have been waiting for this for a while now. Someone finally rewrote the Mac vs PC commercials. I think the new versions are a bit closer to the truth, and definitely funnier.


 

http://www.youtube.com/watch?v=UA3NyRr4Eng

Monday, July 10, 2006

Keep in Mind

We live in the Pacific time zone now. That means that it is 5am in Seattle when it is 8am in Florida. I’ve gotten several calls this week at 5am. Luckily, I’ve had the phone’s ringer turned off. Luckily for whoever called, that is. Mikayla is not a happy girl if she gets woken up early.

Neither is her mommy, and her daddy doesn’t like it too much, either.

Sunday, July 09, 2006

Funny Marine Stories #3

Every night, we had to post a guard in the barracks. Since there were over 100 M16s in the barracks, and they didn’t want anyone going nuts, we had a nightly guard. The way that worked, is 16 guys would get picked each night (it rotated pretty fairly). Each one of us would have one hour of guard duty (called fire watch), either in the head (bathroom), or in the squad bay. We basically had to walk around, and check that everyone’s rifle was locked up, and make sure no one went crazy.

You learn a lot about the human body’s reaction to sleep in that kind of situation. Every time I had guard duty, at least one guy would scream in his sleep, or sit bolt upright in bed, or start reciting some of the facts that we were absorbing every day. I’m pretty sure that boot camp magnified my talking in my sleep (ask Courtney about the snow man sometime).

Well, having people suddenly sit up or scream at you is no big deal, compared to what one guy did.

One morning, the drill instructor told me to gather up about 4 guys’ cammies, and wash them. When we went to sleep at night, we would roll up our uniforms, and put them behind our racks, where the floor met the wall (by the way, rolling your clothes is remarkably effective at keeping wrinkles out of them).

As I went to grab the cammies, of the other recruits stopped me, and told me to grab a towel, and not to touch the cammies with my hands. Naturally, as I was grabbing a towel, I asked why. Apparently, while one of the guys was on fire watch, someone from the lower end of the alphabet (our racks were arranged alphabetically) got out of bed, and walked back to the wall behind his rack. He proceeded to pull out his pecker, and take a leak all over about four guys’ cammies, including his own. The fire watch asked him what the hell he was doing. The pee-er just ignored him, and got back into bed. Turns out, the guy wasn’t even awake. He slept through the whole thing!

Why is it that I always end up with the nasty, clean up the piss jobs? Why am I cursed?

Funny Marine Stories #2

How about something a little lighter?

Writing the last post reminded me of a story that is funny, in a sad sorta way.

There was this guy in our platoon, named Annis. Now, I don’t know about all of you, but to us, there was only one nickname for this guy.

Anus was a geeky white guy from somewhere up north. Quiet, steady, not a tough guy. Anus’ bunkmate was this huge black guy, Albright. Apparently, Albright was a bit unhappy/stressed out about boot camp. He got pretty frustrated every day; until he found a way to relieve that anger.

Every night, for about two months, before he went to bed, Albright would punch Anus. He would wait till the lights were out, and most of us were asleep. He’d get out of his rack, and hit Anus in the side a time or two.

Anus didn’t mention this to anyone. He didn’t tell a drill instructor, and he didn’t tell any of us. Well, not until the night before graduation. He just took it, and was Albright’s punching bag (literally) for a couple of months.

Anus wasn’t the smartest cookie in our platoon, although he was a pretty cool cat. He was a really stoic guy, just took whatever was thrown at him. He managed to get cellulitis (an infection that eats your skin), and just took that, too. He didn’t mention it to anyone for like a week. By the time he did mention it, there was a hole in the side of his cheek, that went all the way through. Dude could breathe with his mouth closed and his nose plugged.

Can you say dumbass?

Longing

Over the past 5 years, I have tried several times to put a feeling into words. Until recently, I didn’t feel like I was adequately describing what I was feeling. Then, earlier this week, it struck me. Longing. I feel a strong sense of longing, almost a yearning.

Of course, your response is going to be: What do you long for? I’ll tell you (that’s basically the reason I’m writing this post, after all).

For Father’s Day, in addition to my Xbox360, my wonderful wife got me a couple of military history books. Those of you that know me will immediately realize that this means books about World War II. This period in our history is by far my favorite; I am fascinated by the war, and its effects on our homeland, and the entire world.

While I was in the Marine Corps, there was a series of books being published, called The Corps. These books were written by a man named W.E.B. Griffin (Any of his books are great gifts, by the way). These books were nearly required reading for Jarheads, and definitely shaped my view of what it meant to be a Marine. I closely identify with all of the characters in the book. I think my dad would probably say the same thing about the Badge of Honor series that Griffin wrote.

Anyway, reading these two really good military history books brought back a welter of emotions, and with the emotions came a word. Longing. It was like something in my brain clicked into place. I can finally explain how I feel when I read a book about the Corps, or see news articles about Marines in war. I long for the brotherhood that I experienced as a Devil Dog. I yearn for the closeness, the camaraderie, the friendship. There isn’t anything else that I have ever yearned for. In general, I have a wonderful life. A great, loving, amazing wife, to go along with my beautiful, fun, interesting daughter. My dream job, and work that stimulates and excites me. I’ve got some good friends (even if they are all 3000 miles away now).

But, since I left the Marines, I haven’t made friends like I did when I was in. I haven’t met anyone (except Courtney) who I can stand next to in an open shower, and have a normal conversation while we are bathing. I’ve never met anyone else who I would trust to refill my shower bag while I was washing. I haven’t been close enough to anyone else to be able to tell them that they can’t go out with us unless they take a shower and brush their teeth, and have that person just accept that I am coming from a good place with that requirement.

Question: Is it possible for normal people to be this close? My hypothesis: no. Unless they are in extreme circumstances, people cannot bond this closely (with the exception of your significant other).

I think some examples are in order.

I went to boot camp with a guy named Dent. This guy was a scrawny, skinny black guy, with a heart of gold. We didn’t see each other after boot camp, for a couple of years. When I was in Australia, I went to the laundry to drop off some cammies, and Dent is running the machines. Dent and I weren’t particularly close in boot camp, but we immediately started chatting and complaining like we had known each other since birth, and had just seen each other the day before.

There was another guy in our platoon that stood out. Not in such a good way, though. One of our platoon mates got struck by lightning while we were on the rifle range. Actually, 19 guys got struck. One guy died. I feel horrible, because I can’t remember his name. What I do remember, however, is that all 100+ of us were destroyed by his death. We had a kid die in high school, and the whole school wept, even people that didn’t know him. I didn’t. Lots of people I don’t know die every day, and I can’t mourn them all. This one kid’s death, though I probably only spoke 10 words to him, completely wrecked me. I still miss him, to this day. At least once a month, I think about going back to Parris Island, and going to the Starlite range, and looking at the hole in the concrete between the 200 and 300 yard lines. That hole is there from the electricity passing through our buddy’s foot, into the ground.

Now, when I see or hear about Marines fighting and dying over in Iraq or in Afghanistan, I want to join back up, and go get in the fight. Not because I am a killer, or because I necessarily believe that we should be over there anymore, but because my brothers are dying, and my being there might keep even one guy from getting wounded or killed.

I wonder if I will ever again experience the depth of friendship that I experienced in the Corps. It’s almost worth dealing with the chickenshit to be able to have those kinds of friends again. I wonder if it would be the same as an officer. Do they get as close? I kind of doubt it. Most of the officers I knew when I was in (and those retirees I’ve met since) were very career-oriented. The enlisted guys I knew weren’t out to advance themselves, they were there to do their duty, and hopefully get some enjoyment out of it.

God I miss those guys.

Wednesday, June 28, 2006

Cruise Control.net update

I have decided to disable cc.net. There isn’t anything wrong with cc.net, and I still think it’s a great tool for teams larger than one person.

The usefulness, however, for a single dev shop is limited, at best. I have spent over 10 hours working on cc.net, to get it all set up and running. All this so that I can know what I already did know: whether or not the build is broken. Since I don’t check in unless the build is working, there’s very little value added by cc.net.

Add to that the complexity inherent in keeping two machines configured with all of the tools and such that I use during the build process, and the costs greatly outweigh the benefits.

My plan is to leave the server installed, and the config files intact, so it should be an easy matter to re-enable it in the future, if I want to. If I do get involved in any multi-dev projects, I will certainly push to use cc.net. I will probably try to write a better application to monitor the build, though. The cc.net tray application takes like 60 seconds to start up.

Great Customer Service Experience

Today, a single employee at a huge corporation retained my business by great customer service. Any of you that have been near me during or after a retail experience in the last few years have heard my opinion of the general state of the customer service industry.

Courtney and I decided to go with Washington Mutual for our bank here. I opened us an account over a month ago. As of this morning, I still didn’t have a working ATM card or checks. I ordered both in mid May. Needless to say, I was very frustrated.

Today, I went to a branch, to get the ATM card straightened out, and see what was going on with the checks I ordered. If I heard “no” or “we can’t do that”, I was going to close my account, and walk across the street to First Technical Credit Union.

The teller, Ashley, did such a good job of addressing my concerns, and taking care of my needs, that before I left I grabbed the branch manager, and told him how I felt walking in, and that Ashley had singly-handedly saved my business. Ashley seemed to be a youngun, and was somewhat embarrassed when I grabbed her manager, and sang her praises in front of her. Sorry for that, Ashley.

If there is anyone who works for Washington Mutual that reads this blog, Ashley at the Overlake Financial Center in Bellevue, WA is the kind of employee that you should want to stick around in your company, and promote into a position where she can positively affect more customers’ views of the bank. If anyone else is in the financial industry, you might want to drop by and see if you can steal her away from WaMu.

Courtney can tell you how big of a deal it is that I even remember this girl’s name. I am horrible with names, so the fact that I can still remember it hours later should be an indicator of what a good job she did.

Tuesday, June 20, 2006

Live Messenger

The new version of Live Messenger is out. If you guys are still using an old version of MSN Messenger, or using the beta of Windows Live Messenger, I’d recommend upgrading. I love the new features in the Live version.

Here’s the link: http://get.live.com/messenger/overview

SpaceRocks! update (finally)

Tonight, I finally had the energy to work on my computer some at home. And, since the beta build of Flight Simulator X kept dying on me before I could take off, I decided to do some code work.

A while back, I finally got around to converting the SpaceRocks! code to use a high performance timer (the one included with the DirectX SDK, slightly modified), instead of just using a simple frame counter.

This is a Good Thing™. And a difficult thing. In game programming (at least my game programming), I have found the need for several constants. I originally tweaked these constants to get decent playability (like in version 0.0.8). After switching to the high perf timer, I had to re-tweak nearly every constant. So, that’s what I’ve been doing for the last few coding sessions.

In addition to tweaking the game settings, to achieve some measure of playability, I also tweaked the particle code. Finally, I am fairly happy with the particles, and how they behave. That was much more of a frustration than I thought it would. Over time, I will continue to play with the particles. Specifically, I plan to change them so they attenuate over time, and I am going to randomize the colors somewhat. I’m planning on specifying a base color, and creating particles whose colors are close to that base, but not exact, with probably a few white ones thrown in for fun.

Lots of good stuff, for a couple of hours worth of work.

Oh yeah, cruisecontrol.net is working just fine. I was having more source control issues, but they seem to have cleared up (magically). Actually, now that I think about it, the computer was rebooted due to a power outage. I bet that cleared some cache somewhere. I had been making changes to the config file, and relying on the service being restarted to apply the changes. I wonder if the hard reboot forced some changes to be applied that were being cached before.

It’s actually building right now, as I type this. Beautiful, isn’t it?

Question for Eric Sink: Do I need to purchase a seperate Vault license for the cc.net service?

Wednesday, June 14, 2006

More Microsoft goodies

In addition to my work on Flight Sim, and my start at helping on Wix, I answered a survey targeted at independent/hobbyist game developers. Once the survey master found out I was coming to MS, she got me all set up.

I attended a round table about the new XNA Framework that MS is going to release. I had heard of XNA before, but the marketing blurbs I had read didn’t really explain how XNA was going to help small shops like me. Well, I know better now. I can’t say much since it’s all MS Confidential for now, but there’s going to be a big announcement soon.

After the round table, I was contacted by one of the SDEs on the team, to get my input on starter kits for the project. How cool is that? I’m helping shape future indie game dev tools; not to mention making great contacts on the team, in case I need any special help down the road.

There’s going to be a game conference here in Seattle, Microsoft GameFest. The XNA team is trying to hook us(those that are participating in the discussions about XNA) up with regards to the conference fee. I’ll be going, and if any of you are going to be in the Seattle area, I’d suggest you go as well. There are going to be some big announcements coming.

Here’s the list of study tracks from the site:

  • Graphics
  • Audio
  • Systems – Windows and Xbox
  • Visual Arts
  • Cross-Platform Xbox Live
  • XNA, Visual Studio & Developer Tools
  • Casual Games
  • Middleware
  • Publisher and Business
  • QA and Certification
  • Hands-on Workshops

Quite a list, eh?

Immortalized

I have been immortalized.

The number of perks that come with working for Microsoft are amazing. I found out that we are currently building the next Flight Simulator, and that employees are encouraged to become play testers.

Being a huge Flight Sim fan, I signed up right away. One of the guys on the team (an audio engineer) sent out an email request for people to come in and be recorded for the game. They are trying to get some diversity in the in-game voices.

I volunteered immediately, and was chosen. Somehow, somewhere in the next version of Flight Sim, you will be able to hear my voice. The audio engineer working on the project is going to send us all an email telling us exactly what has to happen to be able to hear ourselves in the game. Once I get that email, I’ll post it, so you can all hear me in the game, too. I’m also going to try to get permission to post the .wav files once they are all edited and such.

Coolest job ever.

Happy Father’s Day to me

It’s not even Father’s Day yet, and I’ve already had a great day.

As most of you know, Courtney’s parents were in town for the last week. Today, they wanted to go to the company store, and get some software using my allowance. They got a ton of stuff. The coolest part is that they bought me the Bluetooth keyboard and mouse set that I have wanted for a couple of years now.

It took a bit of doing (meaning reading the directions) to get the keyboard and mouse hooked up, but they’re ready to go now.

While at the company store, Mike & Mindy also got some accessories for the Xbox 360 that Mindy was planning to buy Mike. We can’t get the systems at the store, but we can get MS games and controllers and other accessories way cheap. They got three games, and three controllers.

Then, Courtney did it again. She totally surprised me. I was upstairs, messing with my new keyboard and mouse, and she calls up to ask me to bring her down a quilt. I go in the closet, and grab the quilt for her, and notice this cool, white box, with green stripes. At first, I was like “oh crap. I did it again. I ruined another surprise”. Then it hit me that she sent me into the closet, and I realized that Xbox was probably for me!

Turns out, all the stuff Mike & Mindy bought was just to throw me off the scent, so I wouldn’t figure out that Re was getting me the 360. I had no clue, as always.

My wife is truly amazing. Every time I think she’s done everything cool that a wife can do, she goes and surprises me again. I certainly don’t have to worry about being bored when she is around. Sometimes I feel like I ought to be checking the closets every day, to see if there are any gifts laying around.

I sure hope she never decides to cheat on me (which she wouldn’t, of course). If she ever started sneaking around on me, I’d have absolutely no clue. That girl is sneaky, I tell you.

Thank you honey. Once again, you have made a good holiday great!

Tuesday, June 13, 2006

The best software feature ever

I just read an article about the best software feature that has ever been created. Now, the author didn’t put it in those terms, but I am. This feature has been a long time coming.

Do you know someone who thinks that there blog is all about what goes on over their? Don’t you hate those kind of errors? The ones that people never fix, because Office doesn’t flag the word as misspelled, and they are too illiterate to learn the rules around when to use there or their?

Office 2007 to the rescue! Read this entry: http://blogs.msdn.com/jensenh/archive/2006/06/13/629124.aspx

Friday, June 09, 2006

Who’s a punk now?

A few days ago, one of my ‘friends’ put a comment on this blog calling me a punk. I’d like to respond.

First, some background on the perpetrator.

  1. He’s old. Really old. Over 30 old. He tries to hang out with younger guys, to look hip and cool, and it’s just sad.
  2. He blow-dries his hair. How much more of a woman can you be?
  3. He rides a bike. It’s a sissy blue bike, but it’s still a bike. If you can’t ride a raven R6, then an older, not as fast, no inverted fork blue R6 is probably the next best thing.

What’s the purpose of this post? Just a little rubbing in. You see, I’m way cooler than he is. Here’s why:

  1. My bike is black, and has inverted forks, and is faster. At least .1 seconds faster in the ¼ mile.
  2. I don’t blow dry my hair. I never have. Ever.
  3. There are mountains all around me. There is a crazy steep, twisty road right near our temporary housing, and a whole range of mountain roads about an hour away.
  4. There is a motorcycle road racing track
    35 miles from my house.
  5. On July 15th, I am going to a free
    track day at the aforementioned track. I don’t have to buy any new gear, and I don’t have to do anything to my bike except fold back the mirrors. I get two 20 minute lap sessions in the morning, to see how much I love riding on a track.

Eat that, sucker.

Wednesday, June 07, 2006

One other thing

I spent some time today unpacking boxes in the office. I got all of them unpacked, except for books and games. We’re going to go through our books again, and sell/donate a bunch more of them. We have like 10 boxes of books, still. That’s after purging a whole bunch of books, and selling them at a second hand book store. We sold so many books, we made over $250 (at about $0.75 each). That’s a lot of books.

I’ve decided that I am going to get rid of almost all of my non-technical books. I’ve found that the books I kept last time are such favorites that I don’t read them anymore. There are about 20 books that I can read in just 3 or 4 hours, since I know the stories so well. I find that I’m basically skimming them, and relying on my memory to fill in the storyline. Seems kind of pointless to keep moving them around the country, when I could just think about them for a couple of hours, and get the same result.

I will, of course, be keeping the Corps series by W.E.B. Griffin, though. That is a requirement for all jarheads. Actually, I’m a big fan of all of his books.

Cruise Control .Net working

I got cc.net up and working. After fixing the way the service logs on, the vault task was failing again. This was caused by my installation path containing spaces (like “Program Files”). I fixed it rather easily; the fix came from dealing with the same type of issues using command line applications. I surrounded the path to the vault executable with quotes. That took care of the failing source control tasks.

After that, I had to install NUnit on my server, to build the test project. Because I haven’t developed on that box since the last rebuild, I was missing some required components (NUnit, DirectX SDK, etc). Those are all installed now, and my cc tray utility shows green (meaning the projects are building properly). Next up is to integrate NUnit into the cc.net build, so it automatically runs the NUnit tests, and then NCover, so I get a code coverage report with every build. This stuff is way cool.

Who needs it?

Tonight, rather than sleep, I have been working on getting continuous integration set up in my personal development environment.

What is continuous integration, you ask? I’ll tell you. Basically, CI is the process by which every time code is changed in the repository, a build is kicked off, and the results of the build are displayed for all to see. A repository is the place where good developers(Eric’s thoughts, Joel’s thoughts) store their source code, and provides many benefits. Check out Eric Sink’s articles on source control for more information.

This task was not as simple as I thought it would be. I’m monitoring two projects (SpaceRocks! and my ‘engine’) with my CI server. I chose CruiseControl.NET for my CI server. Download the really small installer, and it’s ready to go in minutes. Of course, then you have to configure the projects.

I ran into a couple of gotchas, mostly around using cc.net and Vault (still the best source control system for smaller shops ever built). The biggest one is that the cc.net service has to run as a user account (not the system account), in order for the Vault tasks to work. I had to look for a long time to find the problem. The looking time was compounded by the fact that the cc.net error message was less than informative.

Second, I ran into a couple of minor issues using cc.net and MSBuild. Recently, I converted SpaceRocks! and the supporting projects into C# 2.0, so I could use the new features of the language, and of VS 2005.

Once I got those two things worked out, I was ready to roll. Of course, the build was still failing, since I hadn’t ever built the project on the server machine before (I do all my dev work on laptops and on my main desktop). I need the DirectX SDK before I can build successfully (which I’m downloading now).

Next, I’m going to spend some time in the code getting the unit tests working again, and I’m going to start working towards increasing my code coverage. I had let my tests slack off, since I was on such a roll with the game. I’m ahead of schedule, and feeling guilty about not having more tests in the code.

Monday, June 05, 2006

Quiet

Courtney and I moved into our semi-permanent housing Friday. This caused an outage of internet proportions, so we can't post from home. Thus, the lack of any updates for the last few days. We'll be posting again after tomorrow, when the internet gets hooked up.

Tuesday, May 23, 2006

How we got to Microsoft, Vol 3

Well, the hard stuff wasn't really over. We had an 8:40 flight to SeaTac. With an 18 month old daughter, and three firearms in our bags. We got to the airport later than planned (of course), at about 7:45. My plan had been to have our stuff all checked, and be meeting Courtney’s family at 7:45, so we could spend a half hour or so with them.

Courtney had spent some time the before we packed, researching the topic of traveling with firearms in your checked baggage. She discovered that we were supposed to put our weapons in their original case, unloaded, and lock the suitcase (not the weapon or case). We had this all set up a couple of days before we were flying.

When we got to the airport, I told the lady at the counter (in very hushed tones) that we had firearms in our bags. She reacted by shouting (at the top of her lungs) “Well then, you’ll have to put this bright orange firearms declaration paper in your bag”. All of the nearby passengers started squirming, and eyeing us. Not the most comfortable of moments. So here I am, already running late, digging through our carryon crap to find the keys to the bags, so I can open the bags and put the forms inside them. Then the lady tells us (again at a volume where the pilot could probably hear from inside the plane) that we had to put the forms inside the gun cases, not just inside the bags. This requirement made no sense to me, since any reasonably intelligent person would have deduced that there were firearms in the bag after seeing the black Glock pistol case, and before opening it, to read the firearms declaration form. The Day-Glo orange declarations form. That chick made me really uncomfortable.

Finally, though, we are all checked in to the flight. We start hustling to Starbucks, where we are going to pick up our kid, and meet Courtney’s family. By the time we get done checking in, and get down there, we only have like 5 minutes to visit, since the security line is getting backed up. We said our goodbyes, and grabbed our squirmy worm. She woke up early, so she was already grumpy (This was my decision; I thought the tired baby would be more likely to sleep on the plane). On to security.

Surprisingly, security was pretty much a breeze. One side note: When I was in Okinawa, one of my roommates worked for this guy, Chief Warrant Officer III Lahey. Gunner Lahey was in charge of the Battalion Motor Pool. All of the mechanics and ‘professional’ drivers in the battalion answered to him. Turns out, he’s now working for the TSA, at the Jacksonville airport. I believe he is a supervisor, since every time I saw him; he was supervising, not checking people.

Once through security, we thought we were home free. Silly parents. In the past year, I have been on about 10 flights. None of them has been delayed more than 15 minutes. Not our Detroit flight. There was some weather over the Antarctic Ocean or somewhere, the night before, and the flight attendants for our flight were delayed. They didn’t get the federally mandated 8 hours of rest, so we couldn’t fly out on time. We were delayed for about an hour, while they rounded up another flight crew (from North Carolina). That was a hellish hour. The airport was packed, and Mik was bored and tired. Not a good combination. We chased her around the airport for over an hour before we got to get on the plane. Now, she’s wide awake, having fun, bored, and tired.

Needless to say, the flights were not enjoyable. But, we made it, and we got to SeaTac on time. The rental car and luggage went as smoothly as those things ever go, and we were on our way (to temporary housing, that is).

Blogging from MS Word 2007

The beta version of Office 2007 is now out and available for public use. I’ve been using it for a few days now, and I must tell you, I totally love the new version.

One of the coolest new features is the blog integration with MS Word 2007. I am typing this entry into Word 2007 right now, and publishing to my blog is super easy.

Of course, you realize this spells the end of DeskBlogger as a development project, right? I’m not going to spend my time trying to create a tool that mimics some of the behavior of Word. I have a few friends in the Office group, and they do great work.

Download the beta, and give it a shot. I think you’ll like it.

Friday, May 19, 2006

How we got to Microsoft, Vol 2

After the house hunting trip, we didn't really have anything to do in regards to reocating. I left my previous employer on 4/28, and spent 10 days or so just hanging out with Courtney and Mikayla, catching up on some quality family time.

Around about 5/8, things started getting hectic. We did about 15 loads of laundry between the 7th and the 10th, so we wouldn't be shipping dirty clothes. We also went through all our clothes, and donated like 4 or 5 bags worth of clothing to Goodwill.

The packers showed up on 5/9, to pack the house. That took about 6-7 hours. They were very efficient. One guy packed the whole upstairs, by himself, in less than 5 hours. Hell of a feat, in my opinion. After the packers left, we had nothing to sleep on, and nothing to entertain ourselves with. We checked into a Quality Inn. It should have been Quality Lacking Inn. There wasn't anything too wrong with the room, but there wasn't really anything that right about the room either, know what I mean?

The following morning, the loading crew showed up to load our stuff into a truck. These guys were very efficient too. There were two and a half of them (three bodies, but one guy was seriously slow). They loaded everything we own into a 28' truck, except my motorcycle. Apparently, they had a paperwork mixup, and didn't know the bike was coming. I ended up riding the bike over to their warehouse (7 miles from the house). That was the most uncomfortable ride ever. I didn't have any of my gear, since it was all in a box stuffed in the truck.

Once the truck was loaded, we went up to the airport, and stayed at the Clarion on the airport grounds. We got there around 10 or so, and just collapsed into bed.

The hard stuff was finally over.

How we got to Microsoft, Vol 1

My wife and I decided to accept the offer presented by MSFT on or about March 25th. We had received the initial offer on 5/21.

The decision to accept the offer was a tough one for us. It meant leaving everything we were familiar with, and moving approximately 3,000 miles away. We moved just about as far as you can, and still be in this country at the start and end of the move.

Following our acceptance of the offer, we started talking to MSFT relo. The young woman who was assigned to help us is named Denise. Denise was/is amazing. She answered every one of my numerous questions, and was very responsive, even when I was having her paged at 9 and 10 at night.

The first step in the process is a house hunting trip. We came out to Redmond for 5 days, to look for a place to live. That was quite an experience. Housing in the Seattle area is rare, to say the least. We spent most of the 5 days looking at houses to rent, and didn't find one that met our needs.

This failure to find a home was less stressful than it might have been, since we were already set up for temporary housing, on MSFT's tab.

We left the area without a permanent home, but having fallen even more in love with the area. We were starting to get really excited about the move.

Our housing trip was in April, around the 20th or so. I was scheduled to start at MSFT on May 15th.

Thursday, May 18, 2006

New blog

Today, I started my blog on blogs.msdn.com. You can find the blog at http://blogs.msdn.com/LiveStress.

From this point forward, all entries on this blog should be considered the opinion of the authors, and in no way should they be construed as the opinions or beliefs of Microsoft Corporation.

I will continue to post personal content here, in order to keep my MSDN blog very focused on the business of building secure, reliable software (the business of building buggy, unsecure software will continue to be a major topic of this blog).

We're still alive

Folks, don't worry. We're still alive and kicking. Courtney, Mik and I are all safe in the Seattle area. We didn't have an internet connection at home until yesterday (5/17), and I just got word that our computers arrived via UPS.

Shortly, I'll post some info about our move experience, and my first few days at Microsoft.

Friday, May 05, 2006

Particles are go

I finally figured out what I was doing wrong with the particles. I'm still not happy with them, but I can see them now. I was using CustomVertex.PositionColored, since I was providing a position and a color for each particle. I wanted to use CustomVertex.TransformedColored, since I am providing screen-space coordinates for each particle. I'm guessing that the transforms from world to screen space were pushing the particles off the screen before. So, they exist, but they're ugly. I'll work on that next.

Tuesday, May 02, 2006

SpaceRocks version 0.0.7

Ok, here's the latest drop.

In this release, I have added a few GUI elements (score, number of lives, level indicator), and added the concept of levels. Also, I enabled the code that allows you to have multiple lives (they were always there, I just had the game assuming only one life).

I played for about 5 minutes, and got to level 3, with like 17000 points. I quit playing then, with 3 lives left, because I was just running a test.

We're getting to the point where I could use your feedback. If you have suggestions about game play (too hard, too easy, gets hard too quickly, etc), please leave me a comment. Also, if you get a really good score, you could post it.

Here's the link again: SpaceRocks!

If you don't have it already, you'll need DirectX 9.0c.

It's not semi any more

I totally give up. I tried another approach with the particle system, and it just ain't working. I took code directly from a book I have, and put it in my app, and still no particles. I'm done.

Feature removed. I will revisit this once I get to v2, and have converted all the drawing code to meshes.

Sunday, April 30, 2006

I am taking a break (semi giving up)

I have been working for like a week trying to get a PointSprite-based particle system working. It hasn't. So far, I have shown exactly NOTHING on the screen. Quite frustrating, I must say. I am going to leave that, and get something else working for now.

Wednesday, April 26, 2006


SpaceRocks! v0.0.6

Today, I fixed the screen shot code. I realized, after thinking for a few minutes, that the old code was taking the screen shot, from the back buffer, before the the back buffer was drawn to. That's why my screen shots started coming out blank. I hadn't actually run any drawing code yet, so the back buffer was just black.

Anyway, here is a picture of the game, in all its glory. Notice the new bullet images, the larger asteroids, the explosion, and the score in the top left.

Tuesday, April 25, 2006

Programming tip

I had to perform a particular task today, one which I have had to do several times before. I thought I would share it. I'm not sure if you guys all already know how to do this, but here goes.

public int DoSomeWork(int a, int b)
{
return a * b / 2;
}

What we need to do is change the method, so that we can pass a value to divide by, instead of just dividing by two. The catch is that we have several classes, spread across multiple projects and multiple solutions, that all call this method. The chance of missing a call to this method in a different solution is pretty high in this case. How do you make the change without breaking existing code? Here's my technique, which I have implemented at least two dozen times in the app I worked on from 1/05 to 5/06.

public int DoSomeWork(int a, int b)
{
return DoSomeWork(a, b, 2);
}

public int DoSomeWork(int a, int b, int c)
{
return a * b / c;
}

Now, all existing calls all work properly, using the default value that was originally hard-coded. In addition, we can now take advantage of the new functionality going forward. I have found, in my experience, that we generally add a boolean to the method signature, and have an if statement that triggers on that boolean. It works for any type of parameter, though.

Hope this helps you guys.

SpaceRocks! 0.0.6

I fixed the display bug in SpaceRocks!. I also changed the bullet class to a cooler sprite, and tweaked some code. The large asteroids are now 50% larger as well.

Check out the revised alpha version:
www.CSquaredComputing.com/Products/SpaceRocksSetup.msi.

Live.com

Ok, I get live.com.

Today, I read an entry by Rick Strahl stating that he doesn't get live.com, particularly because the interface was non-intuitive. Here's the link: http://west-wind.com/weblog/posts/5290.aspx.

That post prompted me to check out live.com. I don't get what he doesn't get. When I logged in to my passport account (using the 'sign in' link at the top right), I saw my email right away, and a bunch of crap I wasn't interested in. Each section of crap had a little 'X' that I clicked on, to get rid of it.

The top left of the page had a link to '+ add stuff'. I click that, and I get a cascading menu of options to choose from. I click the add button, and it shows up on my page. In 5 minutes, I had the crap removed, and 8 sections of stuff I care about showing up. I didn't like the layout, so I dragged-and-dropped the sections around, until I was happy with the organization.

There are some cool options for stuff, too. I have one called peculiar postings from MSNBC.com. The first entry is titled 'Mom's corpse is my co-pilot'. That is an article that I have to read.

I particularly focused on the weather gadget. It showed me Seattle weather by default. That makes me happy, since we are moving there. I didn't like the size of the gadget, so i clicked the little caret to minimize it. Now I have a one-line entry that shows cloudiness, low temp, and high temp for Seattle. But wait, I live in Jacksonville still. So, I maximize the gadget, and click the plus sign. Type in Jacksonville, FL, and I get both Seattle and Jax weather. Since I'm in Jax still, I drag and drop jax above seattle. Now, when I minimize, I see that it is partly cloudy in Jax, with a low of 67° and a high of 91°. And the 91° is even in red, so I can see that it's freakin hot today.

Five minutes, folks. Normally, I don't really push the new MSFT stuff, but I might actually change my homepage away from Google to live.com now. There's a search bar at the top, which presumably uses MSN search, but I get all this other great free content.

I am a happy consumer.

Monday, April 24, 2006

Memory & performance optimization for today

Originally, whenever a new object was created in the game, the texture for that object was read from disk, and a new Microsoft.DirectX.Direct3d.Texture object was created, using TextureLoader.FromFile(). I realized today that this approach was crazy wasteful.

At any given time, there can be up to 50 bullets on screen. The texture for the bullet is 256 B. In addition, there can be up to around 20 asteroids. The asteroid texture averages 80 KB. So, worst case, we would be using roughly 1600 KB (1.5 MB) of memory, just to hold the textures!

Here is the original code(called every time a game object was created):

protected TileSet GetTileSet(
Device dev,
int rows,
int cols)
{Toggle}
So, every time we created an object, we were reading from disk, and adding more memory, to hold the texture.

Here is the new code, split into two parts:
(Called once per game session)


public static void LoadTexturesFromDisk(
string texturePath,
string searchPattern,
Device dev)
{Toggle}

(Called every time an object is created)


protected TileSet GetTileSet(
Device dev,
int rows,
int cols)
{Toggle}
So, now, we have each texture in memory exactly one time, in a static variable. Each object then references the correct texture, basically by using a pointer, thereby saving both disk IO time, and significant memory space. The maximum texture memory footprint for asteroids and bullets is now ~367.5 KB. The savings aren't as great as you would expect, since there are 9 textures for asteroids (three different sizes, with three different types). Still, the memory requirements are now one quarter of the original.

Pretty good savings, for one new method, and a couple of lines of code.

Project Plan update

From the post http://cullenwaters.blogspot.com/2006/04/revisiting-spacerocks-plan.html, in the v0.5 - v1 section, we see this entry:
2-3 hours: Add sound effects [v1-1 hour][v2-2 hours] In progress, with about an
hour to go

Today, I finished the sound effects, after working for about .5 hours. In addition, I spend about 1 hour creating a setup project, refactoring some code, and refactoring the project heirarchy.

That brings the total development time to about 24 hours. Definitely on schedule.

SpaceRocks! alpha version

Today, I fixed a problem with the in-game sound. The game had been crashing, when I tried to clone a sound. The problem only showed up when you fired several bullets at once, in such a way that all of the existing SecondaryBuffer objects were playing, and you needed to create a new one.

I fixed that, and did some refactoring today, as well as creating a quick and dirty setup project; about 2 hours worth of work.

As promised, here is the link to SpaceRocks!, alpha version. Play it. Enjoy it. Have fun. Let me know if it sucks.

www.CSquaredComputing.com/Products/SpaceRocksSetup.msi (1.3 MB)

There is one bug that I have seen, and am aware of. Some of the asteroids' textures are messed up. Actually, it's only on medium asteroids, of type 1 and type 3. I'm pretty sure the problem is just the artwork. I'm going to track down this problem next. If you see asteroids that seem to be rotating around some point that is non-center, that's the bug I'm talking about.

The controls are as follows:

  • <a>- left
  • <d>- right
  • <w>- thrust
  • <s>- reverse thrust (this is only for testing purposes, will not be in the release version. Also, this command acts 5x as fast as the thrust command)
  • <space>- fire
  • <q>- end game (simulates dying)
  • <esc>- exit game (leaves the program)

Make sure you have speakers connected, and sound turned on. I'd hate to see all my work debugging the sound player go to waste ;)


[Edit: added known-bug note]

Friday, April 21, 2006

Revisiting the SpaceRocks! plan

A while back, I posted a project plan for my clone of the asteroid destroying game. In case you didn't notice, I changed the name from RockCrusher to SpaceRocks!. I'm going to review the plan here, and show my current progress.

I will reproduce the entire plan, and show the time I spent on each part. Some of this stuff happened months ago, though, so it's all just an estimation. Actual times will be in square brackets ([]).


Nominal Project Plan

  • 1 hour: Get Managed DirectX to display a black screen [.5 hours]
  • 2-3 hours: Design the class framework for the game [1 hour]
  • 2 hours: Develop classes for the player ship and the asteroids[1 hour]
  • 1 hour: Display the ship on the screen[3 hours] This task turned out to be frustrating. I missed two critical lines of code, and didn't tell DirectX that I was about to start drawing sprites. This caused Invalid Call errors when I rendered, and I couldn't tell what was causing the error. However, once I got the sprite problem worked out, I got asteroids on screen for free.
  • 1 hour: Display some asteroids (included in time above)
  • 3-4 hours: Design the physics simulation system [0 hours] I decided to strip the gravity from the game, as well as friction. I may add friction back in, but for now the only forces in the game are velocities and accelerations. The ship is the only object that feels any accelerations, the rest move at constant velocity.
  • 1 hour: Apply the physics engine to the ship[0 hours] Removed when I pulled out the above entry.
  • 1 hour: Apply physics to asteroids [0 hours] Removed when I pulled out the above entry.
  • 2 hours: Handle player input for the ship(DirectInput) [1 hour] This was a lot easier than I thought it would be. Currently, the game only supports keyboard control. I'd like to add mouse and joystick in the future.
  • 3 hours: Make the ship wrap when hitting the edge of the screen [1 hour] Once I got around to it, this was trivial. The code works for all game objects, including ships, bullets, and asteroids
  • 1 hour: Make asteroids wrap when on the edge of the screenCompleted above
  • 2 hours: Add a bullet class [1 hour] Since the bullet class inherits from the game object class, most of the code was trivial. The artwork is still subpar for the bullet, though.
  • 1 hour: Get ship firing bullets [2 hours] This took a little while to get right. There are still some tweaks to be made to bullet offset and velocity.
  • 2 hours: Make bullets his asteroids [2 hours] Since most of my objects are easily approximated with spheres, collision detection is incredibly simple. This collision detection handles bullet to asteroid collisions, and asteroid to ship collisions.
  • 1 hour: Make asteroids explode when their damage threshold is reached [.5 hours] The code to kill the asteroid was pretty easy. The harder part was splitting it, which I did at the same time. The time for splitting is further down the plan, though.
That's already 28 hours of work. [There were 13 hours to get to this point in the game's development. I was way ahead of schedule, in development time. I thought that the actual elapsed time would be shorter, but I got discouraged a couple of times, and took some time off to get away from it. Now, the code is flowing.]

At this point, I should have a playable game, v0.5

For the next version, 1.0:
  • 2 hours: Add scoring [1 hour]
  • 2-3 hours: Add sound effects [v1-1 hour][v2-2 hours] In progress, with about an hour to go
  • 2-4 hours: Add levels [2 hours] during this time, I also worked on the code base a bit, cleaning things up, and tweaking the constants
  • 1-2 hours: Make the asteroids break into smaller asteroids when you blow them up(this should be a random choice) [2 hours] This was tricky. I created a couple of events in the code to handle this, and that caused some problems, because the events were firing at funny times during the game cycle. In hindsight, I should have just taken care of this as part of the updating phase of each frame, instead of using events
  • 4-5 hours: Add alien spaceships that can shoot back once you reach a certain level
  • 2-3 hours: Give the aliens some AI
  • 1-2 hours: Track a high score board [2 hours] I wrote a class in my game engine that can track high scores, as well as persist the scores. There is a helper class that represents a score. This class should be useful for all games, and is fully code-covered (I used TDD writing it)
  • 2-5 hours: Implement a particle system, and provide particle-based thrust effects during player maneuvers I removed this feature. I just can't get it to work. I think there must be some incompatibility between rendering with sprites, and adding in PointSprite rendering. [6 hours] I finally got this feature to work. I'm pretty pleased with the final results.
  • ? hours: Improve artwork
  • 10 hours: Finish UI work (high score board, menus, help, etc)
That's another 19 hours, for a total of 37 estimated hours.
So far, we are in really good shape for time. I'm about 15 hours ahead of schedule, and could, with only a little embarassment, publish the game to friends and family now. There's a lot of polish still to be added, but the basic gameplay is complete.

Where do we go from here?
The next step is to iron out the bugs remaining in v2 of the sound control classes. I'm trying to add support for multiple instances of the same sound playing at the same time. This is a little tricky in DirectSound. I can handle multiple sounds, as long as they are from different .wav files. If you fire twice in succession, though, you only hear the first shot sound.

After that, I should be able to breeze through most of the items left for v1 of the game, and then I will be publishing it. Once I get the sound fixed, I will post an alpha version of the game, so you guys can check it out and let me know what you think.

[Edit: fixed a couple of places I was missing strikeouts.]
[Edit: I'm going to keep this entry up-to-date, so I marked off the sound time]
[Edit: added particle system and thrust effect feature]
[Edit: added task for UI work]

Geeking with Greg: Google Cluster Architecture

Geeking with Greg: Google Cluster Architecture

In this article, there is a quote that just struck me.

Google quite literally stores a copy of the entire web to implement their
snippet feature.

I assume that everyone knows what he means by snippet. That is the little part of the page that Google shows you when you do a search, I've always thought of it as proof that they really did find your search terms on the page. I have found that this feature is incredibly useful during searches, since it lets you check the context in which your search terms were found.

The hardware and software problems being solved by Google stagger me.

Friday, April 07, 2006

An OFFER!

I got an offer from Microsoft! Can you believe that?

The salary isn't quite what we were hoping for. It's actually a small step back, if you take cost of living into account. I'm getting about a 10% increase in salary, but we are taking a 20% hit on cost of living.

There are other compensations, though. The benefits are amazing. We don't have to pay a penny for full medical, dental, and vision coverage for the entire family. No copays, no premiums, no prescription costs; nothing out of pocket, ever.

The dress code is lax. As far as I could tell, you just couldn't be naked.

Completely flexible time. One of the test managers I interviewed with normally comes to work around 11am, then heads out for a couple of hours in the afternoon, to go sailing, then works till about 2am. Apparently, MSFT is really big on work-life balance, and letting you set that balance for yourself. I must have heard that work-life balance phrase 30 times Monday.

The relo benefits are awesome. I'm going to come out ahead, because they give you a $750 check for incidentals. Plus, we get an all-expense paid house hunting trip.

I'm also going to get a signing bonus (about 10% of my current salary), and a stock grant (which, at today's prices, is another 10% of my current salary).

It's going to be really hard for Courtney to leave her family, since she hasn't ever lived away from them. It's not as hard for me, since I had the whole Marine Corps thing to prepare me.

I have some doubts about whether this is the right thing for us, mostly centered around taking Mik away from her extended family, and taking us away from our support network.

Of course, this isn't necessarily permanent. We can always come back if we hate it, which I don't think we will.

Right now, I'm sticking with stoked about the big adventure. The worst part about it was having to send Eric Sink an email telling him I wasn't going to come interview, since I already had an offer from MSFT. I really feel like I would be failing my family to turn down a solid offer from a great company like MSFT to go interview with a great company like SourceGear. Had I received the same offer from both companies, at the same time, I would have needed days to decide which to accept. MSFT just got in there first, with a concrete offer.

Stay tuned, and I'll provide more information as I get it.

Whew. What a long day

First interview starts at 8am. Last interview (6th) ended at 5pm. For those of you keeping track, that is 9 hours of straight interviews. Even at lunch.

By the way, lunch was at the MSFT cafeteria. The burger was pretty good, the fries were not.

So, what should you expect when interviewing with Microsoft? Data structures. Then more data structures. Then, after that, a few more data structures.

Every one of my interviews went about the same. Meet the interviewer, get a problem description from them, and then do some coding. After you solve the technical problem, come up with a bunch of test cases to test this algorithm.

Here are the specific algorithms and questions, as I can remember them:


  1. Given a binary tree, and a number, find the item in the tree that has the next highest value.

  2. Given a binary tree, create singly-linked lists that connect all of the nodes at each level. So, all of the sibling nodes in the tree should be connected to each other, in a list that goes from lowest to highest values.

  3. You have a 100 element array of integers. The values 1-100 are in the array, but in random locations. I will take away one of the values, and replace it with a zero. Find out which value was removed. The best solution I could come up with worked in a constant O(n) time. My first solution was found in O(n2) time.

  4. Given two arrays, A and B, of unknown length, determine if the array B is contained inside array A. So, B contains a list of integers. We need to know if that same list of integers exists anywhere in A.

  5. Implement the String.Split function. Except, instead of passing in a character as the delimiter, we will provide a string delimiter. Memory utilization is important for this one. Try to implement the algorithm without any memory overhead beyond the strings passed in to the function.

  6. Given the 'Save As' dialog from notepad, come up with test cases for the file name textbox. I came up with about 30 test cases, which would have resulted in thousands of permutations.



Some suggestions:


  • Get extra sleep. 8 am comes early, and I did the worst on my first technical interview. The 3 hour time difference messed us up here.

  • Study up on data structures. You need to know about every data structure from your class, to include linked lists, queues, stacks, hash tables, and particularly binary search trees.



I'm supposed to find out tomorrow if they are interested in offering me a position. The 5 hiring managers are apparently going to sit down in a room together, and come up with a decision about which team(s) will offer me a position.

Oh yeah, and I found out something else. It's taboo at MSFT to bypass the system, which I sorta did. There were raised eyebrows when my recruiter learned that an SDET took me around Seattle on his own time, without being asked.

There are two teams on the Office Live group, Core Services and User Experience. So, those are the two teams that will have the option to present me an offer.

More updates to follow.

Seattle is amazing

Courtney and I both love Seattle. Actually, to be technically correct, we both love the Seattle area.
It's really beautiful here. We took a bunch of pictures today, here's a link: www.TheWatersFamily.Shutterfly.com.
Only one hour from real, full-on mountains. I can't wait to get my bike here, and go for weekend rides. I've got to find a group of sport bikers in the area as soon as we get moved. There are a surprising number of riders out today, considering the 47° high temp today.
Interviews tomorrow. I am really nervous. Every other time I interviewed, I was pretty sure I would get an offer. This is the only job I've ever felt like I was more 50/50 than 90/10.

Big huge news

I've got a Microsoft interview scheduled! Courtney and I are going out to Seattle for 17-21 March, with my 5 SDET interviews scheduled for March 20th.

I had two phone screens before this, one with a recruiter, and one with a test manager.

MSFT presented me with 4 teams that are interested in talking to me. Guess how they choose which ones I interview with (you can only interview with 2 teams)? They asked me which ones sounded coolest to me.

The four teams were(in my coolness order):
  1. Office Live
  2. Small Business Accounting
  3. Dynamics CRM
  4. Setup and Deployment (.NET Framework)

I'll let you know how things went, and what a MSFT interview day is really like in my next post.

Thursday, April 06, 2006

Amazingly relevant quote

I am finally reading my copy of Code Complete, 2nd Edition. I've had the book for a while, but couldn't get past the first chapter the last time I tried to read it. This time, I skipped the first chapter ;).

Anyway, here's the quote:

We try to solve the problem by rushing through the design process so
that enough time is left at the end of the project to uncover the errors that
were made because we rushed through the design process.

--Glenford Myers


Other than the fact that we ignore the design process, instead of just rushing through it, this quote really applies to my current company.

Revelation day

Today, I told my boss Steve that I would be leaving my company on May 1st. I have accepted an offer from Microsoft, and Courtney, Mik and I will be moving to Seattle May 7th or so.

Tomorrow, I will post a series of entries detailing my experience with MSFT, focusing on the interview process. I wrote them a while ago, and have been waiting to post them until after I announced my leaving.

Stay tuned.

Sunday, March 26, 2006

Finally caught back up

When I recovered all of my data after the hard drive crash, I just put it all into a folder on the new computer. Tonight, I finished getting all of the data back into the right directories.

I double checked that everything in source control was up to date, and made sure that my DeskBlogger code was correct. I thought I had missed the boat on some of it, because the msi that was available for download was out of date (I just updated it to the newest version, which I am using to type this entry).

I have a set of features for v2, also. I'm going to change the work flow, so that you don't have to log in to your blog before posting. To do that, I'm going to have to decouple the post object from the blog object (up to now, a post has contained a reference to the particular blog that it is associated with).

I'm going to change that, and allow the post to exist without knowledge of a blog. This will allow a user to type one or more blog entries, and save them to the local machine, without having to connect to the internet. This will also make it easier for those people that have multiple blogs to post their entries to all of them.

Stay tuned for more updates.

Friday, March 24, 2006

Shockingly unqualified developers

Over the last week, we have been interviewing developers for a short-term consulting gig. We need someone who can hit the ground running, and be useful right off. Our needs are pretty straightforward; we need someone who can write some sql scripts, and hopefully help us with some database tuning, and someone who knows their way around a group of business objects designed using object oriented principles.

The first guy had 14 years of experience, and the consulting firm said they were going to use him as an application architect. We gave him a simple db schema, and asked for a couple of scripts. This guy, with 14 years of experience in developing, and tons of sql and oracle experience, couldn't write a simple query using three related tables!

The next guy had 10 years of experience, and tons of consulting gigs, using C, VB, C++, C#, and VB.Net. Dude couldn't tell me the difference between inheritance and interface implementation. I asked him what an interface was, and he never said the word contract.

What is the deal with this? Where have all of the decent developers gone?

Wednesday, March 22, 2006

Fighting Diabetes

Many of you know that I read a lot of blogs. One of the technical blogs I subscribe to is Scott Hanselman's blog.

Scott has diabetes. From what he writes, it sounds like he has a really bad case. He's going to be participating in a walk against diabetes. http://www.hanselman.com/blog/TeamHanselmanAndDiabetesWalk2006.aspx

Thursday, March 16, 2006

What to do if your notebook hard drive fails

First, Don't Panic.

As long as you didn't let the smoke out of your hard drive, you should be okay. Here's what you need to do:

  1. Go buy a USB laptop hard drive enclosure.
  2. Plug your laptop hard drive into the enclosure, and hook the usb cable up to your computer at home.
  3. Download some recovery software like R-Studio.
  4. Pay the company their $45, they are about to earn it, and earn it big time.
  5. Install R-Studio on your home pc, and start it up.
  6. Tell R-Studio to scan the USB connected hard drive.
  7. It should, once it's done, give you the original directory structure of your hard drive. As an added bonus, many of the files you deleted from the HD will be available again.
  8. Select the files you care about, and tell R-Studio to recover checked items.
  9. Go to sleep.
  10. When you get up, it should be done. You should see a screen like this:
    Screen print of successful restore operation

I cannot tell you how stoked I am that this worked. As you can see in the screenshot, I lost some files, but not many, and not the ones that I care about. Most of the lost files were MP3s and videos, which I can re-acquire. I got the important stuff back (email, code, documents). Just about 11 gigs worth.

Thank you, R-Studio.

Wednesday, March 15, 2006

Software metrics

Lately, there has been a lot of talk at work about the set of bugs filed against our system. Most of that discussion revolves around two metrics: number of open bugs, and the time since the bug was reported.

The powers-that-be at work have decided that the dev team should complete 18 bugs every week, and 2 enhancements. There is no mention of bug severity, scope, or importance to the application. All that matters is the 20 items, and that those 20 items are the oldest items still open in the database.

Larry Osterman has an interesting post about a similar situation. He presents the case from the point of view of measuring tester performance based on number of bugs reported in a given time frame, but I argue that the conclusions are equally valid when talking about the number of bugs closed in a given time frame. Larry's Rules of Software Engineering #2: Measuring Testers by test Metrics Doesn't. Larry's essay got included in Joel Spolsky's book.

Why is it that software project managers refuse to understand that there is more to a bug than it's count? Some bugs are inherently more important than others. Some bugs affect the functionality or profitability of a system, while many bugs are just nit-picky user preferences (or worse, tester preferences) disguised as a "bug".

Here's my real question: If your executive team is focusing on the wrong metric (popular opinion on my team is that they are), whose failure is that? What if your executive team is built of people who have historically had to focus on the number of beans? Who, from the tech team, is responsible for teaching them the way to manage a software project? Or is it their responsibility, as product/project managers, to buy a book, and learn more of the techniques for successfully managing a software project?

Tuesday, March 14, 2006

All the little things

The hard drive in my work laptop failed last week. That sucks, right? Well, I thought it was irritating and all, but now it's gotten downright freaking irritating.

I had about 7-10 GB of personal data on that hard drive.

I had a few work files that hadn't been added to source control yet.

I had about 2 GB of work emails.

I had several (about 25-30) files checked out of Vault on the machine, with changes not saved.

I recreated the work that I lost. I have been dealing with the loss of email. No big deal.

Well, tonight, I decided to work on my game a bit. I thought of a way to implement the wrapping/clipping that I want to use; or at least close approximation of the behavior I ultimately want. So, I go to my Vault server, and get latest on all my code. No errors, no problems. I go to build the project, and oh boy, here come the issues.

Generally, I use source control integrated through Visual Studio. The opposite of Eric Sink. I'm one of those customers he was out of touch with. Here's where things get tricky. At work, we use another SourceGear product, SourceOffSite. At home, I use Vault. I've been trying to get my work to purchase Vault for a long time, but it hasn't worked yet (I won't get into that this time, I promise). Since I realize that my work computer is primarily a work computer, I set up SourceOffSite as the Visual Studio-integrated source control client. Vault, I have to use like Eric, in standalone mode.

There are some nuances to using source control without it being integrated. Mostly, you have to think more. Which, if you know me, you realize is sometimes pretty freaking tricky. For instance, if you add a new class to a project in Visual Studio, and have integrated source control, the source control both checks out the project file, and adds your new class to source control. If you use the standalone client, then you have to manually check out the project file, and manually add the new class. Manually add the new class. What a concept. Being used to integration, I forgot to add a couple of new classes to source control. Guess who feels like a total freaking ass?

The worst part is that those two classes are critical to the game's architecture. And, I haven't looked at the classes in months, since they have been static for a while. I have no recollection of their specific implementations. If I can't find some way to recover the data off of the corrupted hard drive, I am totally screwed.

I'm downloading SystemWorks now, to see if it can recover my data. This is SO not cool.

And, there's a bunch of the little things that are driving me crazy. Settings that have been lost. RSS subscriptions missing. Little things, but incredibly irritating. Oh well, at least I will have more empathy for customers who lose data, if I ever end up working on a source control system (hint, hint Mr. Sink).

Wednesday, March 01, 2006

What an amazing day

Today has been wonderful. What's been so wonderful, you ask? I'll tell you:


  • I got to start writing a new tool in VS 2005 today, at work.

  • Big M called me today, and it was a great conversation. After our last conversation went sour, I was worried that our relationship might have been damaged beyond belief, but I was wrong.

  • While I was on the phone, UPS showed up. Not only did I get my leather jacket (go Courtney!), I got all the computer stuff I ordered yesterday.



See, an amazing, wonderful day. I couldn't have asked for anything else to make it better.

I'm supposed to hear from Big M on Friday again, so see when we are going to next get together. Can't wait for that.

Thursday, February 23, 2006

.NET String Formatting gotcha

Ok, so I found the problem.

I was using this snippet of code to format the date:

DateCreated.ToString("yyyy-MM-ddThh:mm:ssZ")


What I should have been using was:

DateCreated.ToString("yyyy-MM-ddTHH:mm:ssZ")


Notice the "hh" versus "HH". The small hh gives 12-hour hours, and the large HH gives 24 hour hours. So, 9PM with hh is 09, and 9PM with HH is 21.

Blogger expects the 24-hour time format, so my post showed up as 12 hours earlier than it should have been.

All fixed now, though.

Time issues

I just realized that I was posting my entries with a Universal time, instead of my local time. That jacked up what time my last post was. There's only like 1 minute difference between these two posts, but check out the time stamp.

DeskBlogger Update

I added save and load support into DeskBlogger. So now, I can save a post or load a post from disk. Right on, right?

Sure will make it easier to create long-winded posts.

Monday, February 13, 2006

Vault on hosted machines

I was reading The Daily Grind today, and came across this link: How to Setup SourceGear Vault and Dragnet on WebHost4Life, Part 1.

This is cool, and encourages me to consider dropping my server at the house, and running everything from a hosted account. I think this is the last item that would have concerned me; I have to have my source control available.

UI and Usability in the real world

I have read several usability books recently. I read Joel Spolsky's User Interface Design for Programmers , and I read Mark Gunderloy's Developer to Designer.

In both books, they talk about many things dealing with usability and UI design. The two books disagree in several places, as you would expect; two authors writing about the same subject never agree on every point.

However, they both agree on one particular point. And they both argue vehemently for this point.

Confirmation dialogs are a waste of time; both the user's time and the developer's time. Most people don't read the text in a confirmation dialog box more than once.

Think about it. How many times do you stop and read the box that says 'are you sure you want to delete this file'? Everyone reads that box the first few times they delete a file. Almost no one reads the message the 4,000th time they delete something.

I ran across another article today that talked about this very same issue. This article provides several alternatives to the 'are you sure' dialog box.

We had this discussion at work recently. I was of the belief that we should not have a confirmation dialog in a particular place, because I knew, from use, that no one would read that box more than twice, and it really broke the flow of the app. We actually had two confirmation boxes; one to ask if you really wanted to delete; then one to tell you, after you confirmed, that it really did delete.

The second broke a different UI/usability rule: The user expects that your app will work properly. You don't have to tell them it worked. If you don't tell the user there was a problem, then they are correct in assuming that the operation completed successfully.

The real kicker to both of these dialogs is that they are both on a page in our app that is not publicly visible. The only people who ever see this page are our employees. And generally, they hit this page many times in succession, not just once. So, they have two extra clicks added to every iteration, and usually have hundreds of iterations to do. How's that for wasted time?

I was overruled at work, and the first dialog is back in the app. I don't think the second has made it back in yet, but it's removal was listed as a bug. Care to guess what priority bug it was?

Sunday, February 12, 2006

First public version of DeskBlogger

So, I have DeskBlogger pretty much feature complete, at least for now, and ready for download.

Here is a list of the pertinent features:


  • Support for multiple users

  • Support for the most common HTML elements

  • Text formatting via buttons and <ctrl> key combos

  • Installation program that checks for pre-requisites (.NET framework 2.0)



If you have a Blogger blog, try out the tool, and let me know what you think. It's available at http://www.csquaredcomputing.com/products/DeskBlogger.msi (344 KB).

Feature #2

So, now I can italicize, bold, etc text in the post.

New Blogging Tool

So, this weekend, I decided that I was fed up with the current blogging tools I have been using. I have been using w.Bloggar for a while, and mostly have been happy with it.

There is one thing, however, that I was never happy with: No support for the Blogger Title element. So, when I create an entry through w.Bloggar, I have to log in to the site anyway, and modify the post title.

Being the geek that I am, I decided to see what would be involved with creating my own tool.

Guess what? There isn't that much to it. This post was created with the new tool that I made, after only two days of work.

The feature set is still REALLY limited. Once I get a few more features coded, I will be making this little baby available for download.

Eric, this app is currently a great example of "MeWare".

Friday, February 10, 2006

Funny Jarhead Story(FJS): Marine Boredom

So, when I was stationed in Okinawa, Japan, my unit (3d Battalion, 12th Marines, 3d Marine Division) went to mainland Japan frequently. We went to Camp Fuji (at the base of Mount Fuji) 9 times in 18 months.

One time, we were in the field for about a month. There were several groups within our battalion. One of the groups is called Counter-Battery Radar. Their job is to track incoming enemy artillery rounds, and use physics to extrapolate where the rounds were coming from.

Needless to say, we didn't receive a lot of enemy fire during our training exercises. So the guys in CBR were bored a lot. In addition to having no job, they were always set up a long way from the gun batteries and the other Marines in the unit.

Here are these three or four guys stuck in a tent together, in the middle of nowhere, with nothing to do. For days and days.

After the exercise, we're in a bus, on the way to Yakota Air Force base to fly back to Oki. We somehow start talking about how boring the exercise was. The CBR guys tell us that we don't know bored; they know bored.

Apparently, they were so bored, they decided to have a little contest. We were shocked when we heard what they were competing about. They decided to see who could stick his finger the farthest up his nose!

The best part is that the guy who won showed us how far he could shove it... I swear that man tickled his gray matter. He must have stuck his finger 3 inches up his nose!

We laughed for 20 minutes on that one.

Announcing a new series

So, I decided to start a new series of posts. There are two reasons for this:
  1. They are really funny stories
  2. If I don't get them down, I'll forget them

The next post will be the first in the series, and I'll post more as the mood strikes.

Wednesday, February 08, 2006

Great Quote

I got a great quote off of today's entries on The Old New Thing.

"Writing specifications is like writing a novel. Writing code is like writing poetry."

This quote was reprinted without permission. Raymond, if that upsets you or your coworker, just email me, and I'll take down the post.

Tuesday, February 07, 2006

We be needing some new source control

Today, I found another reason why we should change our source control product. You'd think, after more than a year, I would have discovered all of the reasons, but I found another one.

I am at a client site, in Houston, TX. While visiting at this client, I needed to make a change to our code base. No problem, right? We use SourceOffSite, we can connect to our SourceSafe backend over the internet.

Except, I couldn't log in to SOS. We use an unusual port for source control. I think the client was blocking all outbound traffic except 80 and 443. So, our solution is to VPN to our network, and then connect to SOS.

Except, since they are blocking most of the traffic, I can't connect to the VPN either.

It's too bad there isn't a really reliable source control product that works over port 80, so networks allow the traffic. Cough, cough. Like, I don't know, Vault.

Did I mention that I talked to the owner and creator of Vault, and he told me he could get my company a great deal on the software?

How many times do we have to look like idiots in front of clients before it's worth paying for decent source control?

Man, if only someone at my company, with the authority to make these kind of decisions, read my blog. Maybe we could get hooked up with some decent source control.

Did I mention that the retail cost is only $329 with integrated bug tracking? Or $289 without? Once again, that is the retail price, not our price.

Monday, February 06, 2006

Lunch with a Software Craftsman

Last week, the Jacksonville DotNet Users' Group(www.JaxDug.com) hosted Eric Sink (www.SourceGear.com) as a guest speaker. In addition to their normal 2 hour presentation, they arranged to have Eric eat lunch at Panera with members of the group.

As you all know(SourceGear Customer Service, Buggy Source Control), I am a huge fan of Eric's, and of his company. I jumped all over the chance to eat lunch with him, being the second person to sign up. The plan was to meet at Panera's around 11:30 ish.

I was, of course, detained by work. I got there around 12:15 or so, expecting to see like 20 people gathered around, jostling to speak with Eric. Luckily for me, there were only 4 members there, plus Eric. So, I went and grabbed a seat, and introduced myself.

What a treat. Eric was such a nice, down-to-earth kind of guy. He spoke eloquently, and gave us some great insights as to what MS is doing right, and what they are doing wrong in the source control field. He also spoke about why he isn't too concerned about Vault's place in the world, and the future of SourceGear.

They say that the measure of a person's intelligence is the degree to which they agree with you. Eric must be a genius, then. I totally agreed with nearly everything he had to say, which is great, since I totally agree with his writings on software (Software.EricSink.com).

I waited, like a hunter, until all of the other members had left, and then I attacked! I grabbed a moment of semi-privacy when Eric was throwing away the box his lunch came in, and told him that I would be totally stoked to come work with him, and that I would love to be considered the next time he had a C# position open. I let him know I had been monitoring his blog for new positions, and had every intention of applying for the next open one.

Imagine my surprise, then, when he requested that I send him my resume, so he could review it! He said they are in a period of rapid growth, and always on the lookout for new talent (see, I told you I was talented). So, I sent him off my resume.

We'll see what happens. SourceGear would be second only to MS, and only because I like the idea of Seattle a little more than Champaign, IL.

Sunday, January 29, 2006

SpaceRocks! v0.91


Closer and Closer

Today, I got the game setup tweaked, so you get a bunch of random asteroids to fight, instead of just one or two. The game is also keeping score now, and when you die, you get a message showing your final score.

There are a few major tasks remaining:

  • Get the screen wrapping working
  • Make asteroids regenerate, so you get to kill more than 10
  • Finish the textures for the rest of the asteroids

Hopefully, I'll get more time to work on the game this week, and can put v1 out there to download.

Saturday, January 28, 2006

Game Update


The game is getting closer!

I got the collision detection implemented, and a rudimentary scoring system. If the player dies, the game is over, and displays your score. Basically, all I have to do now is to tweak the gameplay settings, so the game has the right difficulty, and start creating new asteroids when the player blows up the existing ones. It would be nice to get some graphic effects and some sound, too.

Definitely making progress. Thanks to Brian for asking about the game, and reviving my interest yesterday.

Wednesday, January 25, 2006

House wrap up

Well, we survived.

Several people have suggested that we sue Idiot, to try to get the closing costs back. We are not going to do so. Neither of us ever wants to see Idiot again. I don't think I can keep my cool if I ever see her again.

We absolutely LOVE our new home. Neither of us has ever felt so at home in a place.

If what they say is true, that whatever doesn't kill you makes you stronger, then Courtney and I are probably two of the strongest people in the world.

Idiot better stay out of my path, though.

Courtney and I would like to acknowledge a couple of people. First, the title agency. If you ever need to sell a house, please consider Sunshine Title Agency. They are amazing.

Second, Pulte Mortgage. The processor and agent there did everything in their power to take care of us.

Third, Pulte Homes. The closing coordinator was amazing. She worked with us until well after closing, several times. Nicole was her name. We LOVE her.

Fourth, Mike & Mindy. They took care of Mikayla for us for a week, while we were homeless. They are amazing, and we cannot thank them enough for their support.