0 comments suggest edit

Soccer Ball I’ve joined a group of soccer players attempting to form a team to get into a 30 and over league that hosts games on much nicer fields. These are the fields with that really nice high quality artificial turf, a huge difference over the pock-marked dirt/grass fields of my current league. The play in this league is also at a much higher level than my current league and they are very particular about which teams they let in. They judge teams on ability, sportsmanship, and organization.

Last night we played one of their top teams, if not the top. This team included an ex-Sweden national team player and an ex-MLS/National Team player. Had I known I would have asked for autographs. ;)

For one of their warm-ups, these guys we’re in tight circles of five conducting a one-touch five man weave. The interesting part was that it was one-touch in the air. The ball didn’t touch the ground. Meanwhile we looked like the Bad News Bears with our mismatched jerseys. This was one of several friendlies so that the league could evaluate us, so we don’t have uniforms yet.

In any case, we struck first with a goal and ended up with a one to one tie. A very respectable showing, but between me and you, and I would never admit this normally, but they were a much better team. It was obvious they’ve played together for a long time. It is amazing what a well organized, well coordinated team can do. Just like software teams!

Not only that, every last one of them was fit like Lance Armstrong. This was one of the few games I subbed myself out from time to time to get a breather. Usually you have to drag me kicking and screaming off the field.

In any case, we just got the word that we have been accepted into the league. Woohoo! Hopefully we won’t run into any brawls in this league.

0 comments suggest edit

Toy Soldier With Bazooka No, this isn’t a revisionist history account attempting to insert the role of software in the Crusades. Today we take a look at Religious Wars in software. Sometimes also referred to as “Flame Wars” and “Holy Wars”.

A religious war is a very passionate conflict or argument in which each side is absolutely convinced of the objective truth of his or her own position on a matter of personal preference. These are typically very heated arguments over very trivial matters in which the only truth is that there is no objectively correct answer. These arguments would make an outsider wonder if we should all be locked up in straight jackets.

Spaces or Tabs

One good example, and I hesitate to even mention it, is the topic of using spaces or tabs for indenting code. True software developers know there is only one right answer and they’ll defend the truth of that answer till they are blue in the fingers, making sure to spread the “One True Indenting Style“ to every forum in every nook and cranny of cyberspace. Obviously I know what the real answer is and that answer is…

Kinda puts the “anal” in anal retentive obsessive compulsive doesn’t it?

Private Member Prefix

Sometimes we lob grenades over a single character or two. Make sure to prefix private member variables with an underscore or be burned at the stake in one camp. Use an m_ prefix or be flayed alive by another camp. Don’t use an underscore at all in yet another camp or be drawn and quartered. I’ve seriously thought of joining the camp that wants to prefix member variables like so:

string HEYThisIsAPrivateMemberVariable___someVariable;

How is that for being explicit? Of course the true code warrior will notice I didn’t explicitely mark the member as private and already has a sniper laser scope aimed at my head.

Holy War Phoenix

The real beauty of religious wars is that they never go away. Sure they’ll sometimes flame out a bit and lie smoldering just under the radar. But wait long enough and they’ll spring back to life in full force. Just look at the Edit and Continue debate in Atwood’s blog.

Another example of a holy war that never seems to die is the VB.NET vs C# debate. This is an interesting one because VB.NET and C# are really good buddies who like to have a pint at the pub together every now and then. They don’t have a beef with each other. It’s certain camps that use these languages who like to beat each other with flames and misinterpreted arguments that thrust these languages into an all out religious war.


At the forefront of these religious wars are the crusaders. I won’t link or call out any in particular lest my blog become the next battleground for the faithful holy warriors. But you recognize them when you see them. They can be found in the trenches of the newsgroups, blog comment sections, and in their own blogs, fighting for the cause with a single minded determination.

They rarely give an inch to the oppositions viewpoint, lest they come across as weak. You are either with them, or against them.

Well Known Religious Wars

No discourse on religious wars would be complete without a list. This list is by no means complete, but simply a list of well known holy wars in software that I can recall. Please contribute others in the comments and I will keep this updated.

  1. Spaces vs Tabs for indenting code
  2. Curly braces on their own line or not
  3. Private Member Prefixes…or not
  4. private keyword or just omitting it
  5. Managed Languages vs Unmanaged
  6. Edit and Continue or Not Edit and Continue
  7. BDUF vs Iterative Design
  8. Interpreted and dynamic languages vs Compiled
  9. VB.NET vs C#
  10. Java vs .NET
  11. vi vs emacs
  12. Windows vs Linux
  13. Tastes Great vs Less Filling

Got any others?

0 comments suggest edit

So after reading this post by Scott Hanselman, I just had to try it out. He writes about a site called MyHeritage that attempts to match your face to celebrities and relatives.

I thought I might have interesting results since I am bi-racial, but wasn’t expecting much. Here is the photo I uploaded and the two closest look alikes.

Portrait of Me

Look Alikes

Now that is just plain rude! Dare I play the race card here? Just because I am half-Korean with glasses doesn’t mean I look like Kim Jong Il! We don’t all look alike!

In a way they were accurate about my heritage, by having the top two results be a caucasian and a Korean.

Now if you’ll excuse me, the Great Leader wishes to get back to work on some interesting code.

0 comments suggest edit

Recently I added some seemingly innocent code to Subtext within the Application_BeginRequest method of Global.asax.cs that I adapted from this blog post by Darren Neimke. The purpose of the code is to provide culture aware formatting of dates, times, and numbers specific to the user reading the blog.

// Set the user culture.  Got the idea from

// http://markitup.com/Posts/Post.aspx?postId=52252561-f83d-4463-82f0-769fce82fd82

// but modified it to catch specific exceptions.

//TODO: Make sure we store dates in UTC etc and do the conversion when we pull them.

//        I assume we do this but haven’t checked.



    if (Request.UserLanguages != null

            && Request.UserLanguages.Length > 0

            && Request.UserLanguages[0] != null)


        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);



catch(NotSupportedException nse)


    log.Error(“Error while attempting to set CurrentCulture to ‘” + Request.UserLanguages[0] + “’”, nse);


Such a simple snippet of code, yet it introduced a couple of bugs, both which can be seen in this screen capture that Jayson Knight kindly sent me.

Archive Links

The first error, the fact that you see the same month over and over, has been fixed in our codebase, but I have yet to deploy it to my blog. That has to do with how different cultures format dates differently when ordering the month and the day.

The second error is the fact that Jayson is seeing the months in what appears to be Portugese in the first place. At one time, he saw the months in Spanish. I started wondering if somehow a thread from the thread pool with a CurrentCulture already set was servicing his request, but that didn’t make any sense since it should be reset for him.

Then it occurred to me today. Subtext makes extensive use of caching on multiple levels from data caching to output caching. When I added this code, I didn’t go through and update all code that caches data to vary the cache by user language. Doh!

Once again, the law of unintended consequences smacks me upside the forehead.

UPDATE: Jon Galloway points out that Scott Hanselman wrote about this very thing recently. I read that post and totally forgot about it when I made my change. Blogs are good, umm’kay.

0 comments suggest edit

If you’ve started on module development with DotNetNuke 4.0 and above in Visual Studio.NET 2005, you might run into a problem with trying to add a Web User Control (*.ascx file) to a class library.

The fix is similar to what you had to do with Visual Studio.NET 2003.

For C#, follow these steps.

  1. Close VS.NET 2005.
  2. Open the directory C:\Program Files\Microsoft Visual Studio 8\Web\WebNewFileItems\CSharp (assuming a default installation of VS.NET).
  3. Open the CSharpItems.vsdir file in Notepad. Select the text and copy it to the clipboard.
  4. Now open up the file C:\Program Files\Microsoft Visual Studio 8\VC#\CSharpProjectItems\CSharpItems.vsdir and paste the contents of the clipboard underneath the existing text.
  5. Now copy the contents of C:\Program Files\Microsoft Visual Studio 8\Web\WebNewFileItems\CSharp (excluding CSharpItems.vsdir) into the folder C:\Program Files\Microsoft Visual Studio 8\VC#\CSharpProjectItems.

Now “Web User Control” should be an option when you select Add | New Item.

0 comments suggest edit

Lately I have been spending a little bit of time performing maintenance tasks on my blog’s SQL Server. I noticed that OdeToCode’s Scott Allen was in the same mood.

In looking to free up some database space, he took the somewhat drastic step of deleting all referrals and urls before a certain date. Since he doesn’t care about this data, it isn’t really all that drastic. But it makes a data packrat like me shudder. I wanted to free up some space as well so I created an approach that frees up a lot of space, but keeps the data I care about.

Around 90% to 99% of my referrals are from web searches and online blog readers. As a matter of fact, nearly all of these are from Google. Since those referrals are not that important to me as WebHost4Life also tracks that data, I wrote a script to delete them for Subtext. Note that the following SQL script is pretty aggressive, so use at your own risk. You might even think of some search strings that I missed.

DELETE FROM subtext_Referrals




  FROM subtext_URLs

  WHERE Url LIKE ‘http://google.%’

    OR Url LIKE ‘http://%.yahoo.%’

    OR Url LIKE ‘http://yahoo.%’

    OR Url LIKE ‘%/Search/%’

    OR Url LIKE ‘%/Search?%’

    OR Url LIKE ‘http://search.%’

    OR Url LIKE ‘http://bloglines.%’




WHERE Url LIKE ‘http://google.%’

  OR Url LIKE ‘http://%.yahoo.%’

  OR Url LIKE ‘http://yahoo.%’

  OR Url LIKE ‘%/Search/%’

  OR Url LIKE ‘%/Search?%’

  OR Url LIKE ‘http://search.%’

  OR Url LIKE ‘http://bloglines.%’

I then ran the same commands that Scott did after reading his post.


DBCC DBREINDEX(subtext_Referrals)


In order to run those commands on .TEXT, just replace the “subtext_” prefix with “blog_” and you are set.

Now I haven’t tested this, but I imagine the corresponding script for Community Server would be the following based on its published schema.

DELETE FROM cs_Referrals



    SELECT UrlID FROM cs_Urls

    WHERE Url LIKE ‘http://google.%’

      OR Url LIKE ‘http://%.yahoo.%’

      OR Url LIKE ‘http://yahoo.%’

      OR UrlLIKE ‘%/Search/%’

      OR Url LIKE ‘%/Search?%’

      OR Url LIKE ‘http://search.%’

      OR Url LIKE ‘http://bloglines.%’




WHERE Url LIKE ‘http://google.%’

  OR Url LIKE ‘http://%.yahoo.%’

  OR Url LIKE ‘http://yahoo.%’

  OR UrlLIKE ‘%/Search/%’

  OR UrlLIKE ‘%/Search?%’

  OR UrlLIKE ‘http://search.%’

  OR UrlLIKE ‘http://bloglines.%’

0 comments suggest edit

I got a 1099 for my blog yesterday. Now that is a weird feeling. Google giveth, the federal government taketh away.

Google has some tax information regarding ad-sense income. Basically operating this blog has in effect become a small proprietorship small business. I will deduct hosting costs etc… I wonder if I can deduct time spent on Subtext. That would be pretty sweet.

UPDATE: For my readers not familiar with tax regulations in the U.S., I should mention that the 1099 is used to report income other than wages, salaries, and tips. I linked to the Wikipedia explanation for more details.

0 comments suggest edit

Troll Cap I love this idea from 37 Signals in handling abusive comments. Rather than simply deleting them, they will take the approach of shaming the abusers with a Troll Cap. Though it is doubtful that those who troll will really feel much shame, at least it serves an educational purpose of teaching others what is considered trolling behavior.

This is definitely an idea to put in Subtext at some point.

0 comments suggest edit

Looks like Jeff Atwood is not content to let dead dogs lie when he revisits Edit and Continue.

Jeff argues that those decrying E&C are promoting a culture of machismo which implicitely states that “Everyone Should Code The Way We Do”.

As I stated in his comments, I think the real argument is not whether or not E&C is dangerous, but whether it should have a higher priority than other features introduced into VS.NET when the discussion first started.

I am not against E&C as I see it as a tool that can be used or abused like any other. When I was a VB programmer back in the day, I found it helpful at times while debugging a unit test. Rather than endure a compile and re-run unit test cycle that could take a couple minutes, I could simply fix a dumb typo in stride and continue on. I didn’t need it, but used responsibly, it saved me time in certain situations.

However, I wonder if there may have been other features that Microsoft could have focused on that would have been more worthwhile than E&C. When using test driven development practices, I find the need to use E&C greatly reduced. Unit tests provide a bigger bang for my development buck in writing better code. If I had a say in it, I would have suggested that Microsoft really focus on getting the test driven development story right, which they’ve completely failed at so far.

So again, for me it is not a question of whether E&C is useful, I believe it is, but whether it has pushed aside more useful features. What do you think?

0 comments suggest edit

One common approach to having a script method run when a page loads is to attach a method to the window.onload event like so…

window.onload = function() { someCode; }

This is a common approach with methods for enhancing structural markup with Javascript like my table row rollover library, but it suffers from one major problem.

What happens when you include more than one script that does this? Only one of them will be attached to the onload event.

It would be nice if there was a syntax like the C# delegate syntax for attaching an event handler. For example…

window.onload += function() {} //This doesn’t work

However, there is a better way. In looking at the Lightbox script, I noticed the script references a method written about by Simon Willison. He has a method named addLoadEvent(func); that will append the method to the load event, without interfering with any existing methods set to execute on load.

Read about this technique here.

0 comments suggest edit


I have a bit of “me” time today to write some code and I thought I’d treat myself to something light and fun by building something purely for its flashiness and aesthetic. Something that does’t have any useful purpose other than it looks good.

I am a big fan of adding effects to html pages by simply adding a reference to a separate javascript file. This keeps the javascript code separated from the HTML, which is a big help in avoiding “spaghetti script”.

This is a technique that Jon Galloway writes about in his post on Markup Based Javascript Effect Libraries which highlights several approaches for adding interesting behaviors to a page without using Flash or DHTML behaviors (which only work in IE anyways). By referencing a javascript file and adding certain semantic markup to html elements, an author can add very interesting effects to a page.

The Row Mouse Over Effect

The effect I will introduce is simple. Adding a javascript file and a couple CSS classes will allow you to add row highlighting to any table. It provides a mean to change the look and style of a row when you mouse over it, and then change it back when you mouse out.

All you need to do is to reference the tableEffects.js javascript file and add the “highlightTable” css class to a table. At that point, each row of the table will have its CSS class changed to “highlight” or “highlightAlt” when moused over. Its CSS class will be reset when the mouse leaves.

In order to actually see a change when you mouse over, you’ll have to style the rows for highlighting like so:

table.highlightTable tr.highlight td
    background: #fefeee;
table.highlightTable tr.highlightAlt td
    background: #fafae9;

The script assumes you want to use a different color for alternating rows. If not, you can simply style both highlight and highlightAlt the same.

See It In Action

col 1 col 2 col 3 col 4
Apple Orange Banana Kiwi
Pinto Porsche Peugot Acura
No Body Look Here
Red Blue Green Alpha

Get the file

Download the file from here (Right click and save as).

If you have any improvements (as I am sure there will be some), please let me know and I will keep my version updated. I named the script “tableEffects.js” because I hope to add more interesting effects.

And remember, though I tend to preach table-less design, there are semantic uses for tables. When using this script, it helps to make sure that your tables are semantically marked up. For example, if you don’t want your header row to highlight, use <th> tags instead of <tr>. The script ignores the table header tags.

0 comments suggest edit

Ball There is something really satisfying about having a beer after soccer. Especially when you can sit down with a Newcastle at the computer and blog about it. I’ve heard many marathoners say that a beer after a long run is helpful for replenishing lost carbohydrates. Yeah, that’s the ticket. It’s a health drink!

This season has been going much better than last season so far. The team has really picked it up a notch. We started off with a four to zero thrashing of the other team in our first game. I had a goal in the first minute of the second half. Fastest goal off of a kickoff I’ve ever been a part of.

Our second game ended in a two to one victory. Unfortunately that was marred by a near brawl. One of their teammates known for causing trouble smacked one of ours in the head after the game was over. Their biggest guy smacked our smallest guy. Who happened to have a brother on our team as well.

Here is the thing with brothers. If you smack someone, his brother will be more upset than the guy receiving the smack. We had to really struggle to pull everybody apart and keep it from devolving into anarchy.

This week we have a bye so today we had a friendly against my Saturday group of pick-up players. It was a long two and a half hour ordeal and I pretty much ran myself ragged in the midfield. I transitioned to striker just to take a break in the last half hour, when we were down a couple players. Unfortunately all that running left me with a slightly pulled quadricep. Now I can limp around the house and try to muster up some sympathy. And another beer.

0 comments suggest edit

Screen Showing Code The great thing about being involved in a couple of open source projects is that they provide great opportunities to learn and to teach, especially through the vehicle of code reviews.

To enable this within the Subtext Project, I recently set up commit emails within the CVS repository. This makes it possible for more people to review changes to the code. However, this brings up a bit of a quandary. How should we go about conducting the reviews? We don’t have any policy in place.

Ideally I would love to have regularly scheduled code reviews in which a small group of developers gather around the screen and review the code at the same time. But as several of our team are in Europe, that is just not feasible. At least not so soon after the code is checked in. I think it would be helpful to have more immediate feedback.

There are two ways to handle this that I will put forth in the hopes of soliciting feedback.

Make Suggestions In Comments

One approach proposed by Steve Harman is an approach he uses at work. When reviewing code and finding something that might need to be changed, the reviewer puts a comment like so:

//REVIEW: haacked - Ummm... Hey, this violates an FxCop rule. Perhaps you should do FOO instead.{.example}

What I like about this approach is that it is deferential. You can shoot off an email to the person who wrote the code and say something along the lines of …

Hey, the code you checked in looks good. However, I noticed a few things you might want to look at. I put the appropriate comments in the code.

This approach allows the original author the chance to learn from the reviewer comments as well as to defend or elaborate upon the code if he or she feels that the code is indeed correct. Should the original author not have time to change it, the reviewer can return to change it.

Change the Code and Notify

One drawback to the previous approach is that it takes two people to fix code. One thing you’ll find when participating in an open source project is that people are REALLY BUSY. Sometimes a contributor will contribute a piece of code, and then get slammed at work and home, only to return in three months time to contribute again. That’s a long time to wait for code to get corrected.

An alternate approach is one borrowed from certain agile methodologies. Practices such as Extreme Programming promote the concept of “Collective Ownership”. This is an important principle to apply to open source projects, as the code belongs to everyone. Likewise, everyone should feel free to contribute to any piece of code in a project, assuming they use good judgement and understand the code.

In this approach, one would just fix the code and in the source control checkin comments, explain why the change was made. Additionally the reviewer could send the author a quick email mentioning that he made some changes and to keep an eye out on the commit emails.

The benefit of this approach is that the code gets improved immediately, while still preserving the learning opportunity for the original author. This approach also addresses the fact that any code you change in codebase most like at one point or another was written by someone else. Sometimes a reviewer might be looking at code long after it was committed. The reasonable expectation here is that the reviewer should feel free to modify the code, rather than spending time figuring out who wrote it and making the review comments.

Something In Between?

Perhaps there is an even better option that sits somewhere between these two options. What do you think? I would love to hear from you in my comments.

0 comments suggest edit

I love this post by Steve Yi (found via Raymond Chen) concerning the mysterious things he as eaten. It just goes to show you that us asian (and half-asian) brothers can eat some seriously weird crap.

I have never tried Sea Cucumber (that I know of) nor Kudu Doo-Doo, but I have had everything else on his list. Here is my own list of mysterious things I have eaten.

1. Fermented Soy Bean (aka Natto)

My wife introduced me to this foul smelling Japanese dish. At first I wondered why she was eating the garbage when I first took a whiff, but I realized that others have said the same thing to me when I would bring Kimchee to school back in the day.

So I told myself I would try and acquire the taste since I was curious why she liked it so much. It has worked, as I now love it.

Image of Natto\ photo copyrighted by Matt Wegener.

2. Raw Chicken

For this dish, I have my wife’s brother to thank. Again this is a gift from the Japanese. Apparently there are several places known for serving raw chicken. I suppose if I was to take the risk of eating raw chicken anywhere, it would be Japan. They are well known for their cleanliness and care in crafting food.

It tasted a lot like tuna sashimi (maguro) and was quiet delicious.

3. Blowfish (Fugu)

I guess Japanese food in general is mysterious to me. I wrote about this experience here.

4. Uni (Raw Sea Urchin)

The first time I had this I nearly gagged. But I have since learned that the first one I tried was not of the highest quality. When a master sushi chef prepares Uni, it is smooth like butter.

Uni (raw sea urchin) \ via Matt Wegener

5. Chicken Feet

This one is often served at a Dim Sum restaurant. My Chinese friends might not find this so mysterious, but I sure do. I am not a big fan, and I’ve given it a couple of chances.

I am sure my wife will remind me of even more mysterious things I have eaten. What are yours?

0 comments suggest edit

As a kid, one of my favorite tools I had was a shiny red cased Victorinox swiss army knife. I’d carry that sucker around with me everywhere, using the main blade to tackle nearly every problem like a caveman with a stick. Until one day I sliced my finger trying to stick a paper cup to a tree so we could throw ninja stars at it, but that’s a story for another time.

As software developers, we have a swiss army knife of approaches to tackling any given problem. And often, we like to pull out the same blade over and over again. For example, one tool that we pull out nearly all the time is the tool of “iterative” development.

As Atwood said in the comments to Micah’s post on harmful requirements, you gotta go “iterative”.

However, sometimes you really do need to pull out a different tool in your swiss army knife. For large projects, breaking it up into phases and iterations makes sense most of the time, but there are times where an iteration itself may be longer than other iterations. Sometimes such an iteration itself becomes a mini project that requires BDUF.

Here’s a scenario to chew on. Suppose an iteration of the project is to produce a report based on data imported from a couple external sources. The report only has to produce a single number based on a calculation applied to the data. This is the type of problem that may not lend itself well to iteration. The client is interested in the final number, not any number in between.

Sure you can have an iteration in which you mock up the report to show the client to get something in front of them, but even this can be dangerous because you’ve set the expectation that you can deliver the report. But do you know that until you’ve analyzed the data?

This is a situation we found ourselves in. The requirements appeared to be describing a specific calculation we needed to produce. But after a careful look at all the fields we were getting in, the data required to produce that report just isn’t there. And we won’t be getting that data. Yet we have to produce this report by Monday. It seems we’ve walked to the blackboard to solve a series of two equations, but each equation has three variables. “Does Not Compute”

It seems to me that this is a classic situation where some up front analysis would have saved our butt and set expectations properly. Unfortunately, we weren’t brought in to this project till later and had to take it on faith that the analysis had occurred, but it was lacking. Someone, anyone, should have looked at the columns of data we would be receiving, and reconciled the data with the calculation we would be producing. I’m not sure how we can iterate ourselves out of that problem.

In our situation, it may well be that the real calculation we need to produce is much simpler and less useful than the one we thought we were going to produce. So we may be out of the fire on this one. But should the stakeholder disagree, we’ve got issues.

0 comments suggest edit

Last month, I wrote about some frustrations I had with Microsoft Money. I am pleased to report that everything has been resolved and I want to take the time to thank members of the Microsoft Money team.

It turns out that the Microsoft Money group is more accessible than I thought. It is unfortunate that the Microsoft website doesn’t highlight this more, but there is an active community that participates in the microsoft.public.money newsgroup. One customer also maintains a FAQ.

It turned out that the password character length in Microsoft’s records varied with those given by the bank a while ago. Russ on the Money team was able to confirm this and a patch was out in a matter of days. The final trick to getting it to work was I needed to refresh the online service setup. I was given the following instructions.

  1. Open Money.
  2. Select Account List.
  3. Select the financial institution you want to re-brand in the Account List.
  4. Under Common Tasks click Connect to bank and click the institution’s services link.
  5. Select For Financial Institution Name under View contact information.
  6. Select Update advanced Web settings on the left navigation bar.
  7. Hold down ctrl + shift and then click Restore Defaults.
  8. Click OK and then click Done.
  9. Select the New online services are now available link.
  10. Select the Update Services link to the left of your financial institution name.
  11. Continue through the rest of the Update Services screens.

So now Money is happily integrated with my online broker. Money rules!

P.S. I probably shouldn’t have made that crack about switching back to Quicken. Word on the street (and in my comments) is that Intuit engages in some underhanded practices with their software and that Money is much better than Quicken. I can’t corroborate the underhanded practices, but I did switch to Money from Quicken many years ago and haven’t regretted it.

0 comments suggest edit

Basement Gamers Video
Screenshot Make some time for this one. This is an eleven minute mockumentary of two hardcore fantasy role playing gamers. If you’ve ever rolled the icosahedron^1^ dice (or live with someone who has), you’ll find this extremely funny, and perhaps painful.

I swear I was never this bad. Really.

Watch it if you dare.

[Via The Old New Thing]

^1^ icosahedron is 20-sided.

0 comments suggest edit

Micah delves into the dark side of requirement documents. I am glad he is taking on writing about some of the challenges we’ve faced in starting a new company. I’ve been planning to write about many of these challenges as well, but I wanted to give myself more time. Perhaps I was a bit too shell-shocked by all the difficulties to give it a proper treatment. Perhaps I was afraid I would violate the one blogging rule we have, don’t be stupid.

Fortunately, Micah has the bravery to delve into the deep dark dirty recesses of real world project management. Read it at your own risk and hold tight to your sanity.

0 comments suggest edit

A while ago I told you that I was starting a company with my business partner, Micah. Well the good news is that we’ve officially added another partner/employee, the indefatigable Jon Galloway.

In the link to Micah breaking the news, he says he is really glad our clients don’t pay us to look pretty or we’d be broke. He can speak for himself, because if he read the fine print on the contract I’m working on, being pretty is indeed one of the requirements.

0 comments suggest edit

This article in Boing Boing about how World of Warcraft (WoW) moderators are warning groups not to adverties their guilds as “GBLT-friendly” (Gay, Bi-sexual, Lesbian, Transgender friendly) got me thinking.

Suppose they allow characters in WoW to publicly declare their sexuality within the game. Now suppose other groups within the game form with the goal of attacking such players completely within the online game (assuming the game allows players to attack other players).

Would that constitute a hate crime?