Software development industry analysis by Larry O'Brien, the former editor of Software Development and Computer Language
Saturday, December 31, 2005

New resolutions:

  • Release at least one significant "long-tail" Web-based training resource;
  • Write at least one article to be sold by micropayments;
  • Develop professional-level competence in WinFX;
  • Maintain 6 AM - 2 PM working discipline;
  • Free-dive goals: 3 minutes; 100' depth;
  • Go surfing; 
  • Memorize the field marks, common, scientific, and Hawaiian names of the 50 most common reef fish in every developmental phase;
  • Figure out a fitness routine that isn't so "weekend warrior";
  • Rewrite my novel to submission-quality

Last year's resolutions:

Achieved:

  • grow, harvest, mill, and roast my own coffee;
  • write a game for the Tablet PC
  • "Get Things Done" between 6AM and 2PM;
  • make at least the same amount of money I did this year;
  • maintain professional competence in in C++ (/CLI!), C#, and Java;

Close, but no cigar:

  • do a 3 minute free-dive (my personal best is a 2:51 dive in September, but I haven't come close to duplicating it);
  • consistently throw a golf disc 120 yards;
  • memorize the field marks, common, scientific, and Hawaiian names of the 50 most common reef fish in every developmental phase;

Not even close:

  • get barreled;
  • write a distributed genetic algorithm;
  • release at least two significant Web-based training resources;
  • evolve my shape-recognition library;
  • implement a domain-specific language for mediating between OTA requests, business rules, and at least 2 major Global Distribution Systems (Sabre and To Be Named)

Also, I decided that programming in Python in ink was not a viable idea, which wiped out the Pynk-related resolutions:

  • become professionally competent in Python
  • evolve Pynk to the point where it's a reasonable way to program with a pen;
  • release Pynk as OSS;

 

Saturday, December 31, 2005 12:13:09 PM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | Offtopic#
Friday, December 30, 2005

Don Demsak brings up the question of making money off blogging. This is appealing to me, not so much because I like blogging but because I make, in most years, the majority of my money by writing. So, although you wouldn't know it from the quality of the writing on this blog, I can actually write a sentence that doesn't begin with the word 'So,' and a paragraph that conveys a complete thought without just petering out in ellipses, and so forth and so on...

I blog for several reasons, but already for a primarily professional one -- blogging games the search engines which, in turn, are now the de facto first step in finding "experts" to hire. If you blog about one topic (programming) regularly and you blog about another, esoteric, topic (e.g., the Sabre Global Distribution System) irregularly, you will still get an unusually high response for a search for "programming and Sabre." That's money in the bank, my friends. Honestly, being the #1 Google return for "programming Sabre" has directly earned me more money than I have made in 15 years of writing for magazines and speaking at conferences.

Even for no other reason, this is enough to make blogging essential to being an independent technologist / programmer.

We're forbidden from speaking of our AdSense revenues, but we can speak in general terms:

  1. A couple lattes per month
  2. A couple lattes per day
  3. A monthly car payment (for those who don't drive paid-off '92 Honda Civics. For those who do, let's say 'a health insurance premium.')
  4. Your mortgage
  5. A new car

I've been blogging for 3 1/2 years now and, while having flirted with category 2 for a few specific weeks, have otherwise always been in category 1. I haven't fretted about moving ads around on the page, so much, as I tend to think that might make a difference, but not a categorical difference (am I wrong?). Instead, I've tried various strategies that I thought might make categorical differences: a rigorous publishing schedule (twice daily posting for a month), longer posts, short link-oriented posts, permanent articles, etc. Short link-oriented posts do seem to have a positive effect and might suffice to move from one category to another.

What I wonder, though, is:

Can a blog centered on programming or the programming industry be a category 3 (Car Payment) or higher revenue source?

Reviewing Software Development Tools? Nope.

For instance, let's say I wanted to monetize a professional-level comparison of Visual Studio, Eclipse, and IDEA. What are my options?

  • Blog about the topic
  • Directly sell a, say, 1500-word review as a PDF, or an Amazon "short"
  • Sell a 1500-word review to a magazine
  • Public whitepaper it -- sell a 5,000 word analysis to one of the major "analyst" companies, who in turn, sell it to vendors and F500 companies
  • Private whitepaper it -- sell the analysis directly to vendors and Fortune 500 companies

Of those, a magazine review is a solid category 3, subcontracting a whitepaper is a solid 4, and a private whitepaper could be a 5 (but requires an infrastructure that includes a sales force, not blogging about driving a Honda Civic, no t-shirts, etc.). (Also note that the effort increases and not just by word count. A whitepaper analysis is both broader and deeper than a published review.)

If I were to blog such a comparison, I have no reason to believe it would make me change from a Category 1 to Category 2 because, for blog advertising, traffic == money and traffic must be built over time. I find it likely a monthly comparison of products could create at least a Category 2 blog, but on the other hand, it's still competing with the Category 3 "write reviews and sell them to magazines."

The problem with reviews is that they don't have a "long tail," and the long tail is the only alternative to high traffic for making money off advertising.

Are books an exception?

As we sit here, I'm surrounded by stacks of books that are contending to be shortlisted for this year's "Jolt Awards." There are a lot of good books that won't make the shortlist. As an Amazon affiliate, I could write reviews and get a cut of positively-reviewed books that are purchased due to a click-through from this site. This is a more direct pay-off than advertising and, when I've done such things in the past, I've had at least one month of Category 2 (couple lattes a day). Programming books have a long(-er) tail and I am in the fortunate position of receiving review copies of far, far more books than I can possibly mention in my column. On the other hand, taking an affiliate cut directly from a review is against the quaint ethics that were taught me when I first doing this stuff professionally. By today's publishing standards, though, it's a laughably minor infraction (... fighting temptation to vent on sordid industry ... must ... fight .... )

However, even very worthy books like Michael Scott's Programming Language Pragmatics (yes, it's an affiliate link) are highly unlikely to sell 10,000 copies total. Wouldn't I be smarter to say that Harlan Coben (Tell No One) writes very tight plots, has the very rare gift of infusing genre thrillers with just a touch of detached humor, but suffers slightly from the "one more twist" disease? Or to say that Call of Duty 2 is clearly superior to Perfect Dark Zero?

Assuming that affiliate-link reviews are a route towards monetization, wouldn't it be smarter to review popular books, movies, video games, etc., rather than programming books? Of course, this assumes that one can build authority as a reviewer in a mass-market media, but the upside of doing so is vastly greater than the upside of having authority in the programming niche.

Other routes to traffic...

You despise dotnet247, don't you? You Google for an API and, without checking the link, you click through to that d***ed newsgroup scraper (hey, what about a Greasemonkey script that nukes those returns?). However, the idea of a Website with user-donated content that covers a programming topic in depth ... could that achieve Category 2 or even Category 3, do you think? A Wiki on programming the Tablet PC, or Language Integrated Query, or Indigo or something like that?

Unfortunately, while I think you could grow traffic, you're still challenged by the relative unattractiveness of the programming market for advertisers (I think). Wouldn't you do better creating a Wiki on digital cameras, or XBox 360 games, or DVDs, or whatever online-purchased mass-market product you happen to have an interest in? Wouldn't I be better advised, for instance, to create a "GPS User's Guide to Visiting Hawai'i" Wiki than producing one on Language Integrated Query?

Or you can sell bits...

"Write an Amazon short," has been sitting in "Deferred projects" list since I heard about the service. Has anyone done this? I think I'll shoot them an email right now...

(done)

...Or, it's trivial to write a PayPal callback to your own PDF...

...Or, you can pursue the MicroISV path...

Well, one way or the other, it's time for me to sign off, walk the dog, and then go for a swim.

Drive safe and hau'oli makahiki hou!

 

Friday, December 30, 2005 9:32:29 AM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | Knowing | Reviews | SD Tools#
Thursday, December 29, 2005

Once upon a time, I wrote a book about C#. More accurately, I talked to a friend who had written a Java book that I thought was proven to be a good way to teach that language and I said "Hey, can I license the content of your book and port it to C#, which, since you hate Microsoft, you have no interest in?" And he said yes and, nine months later, I had this 1,100-page book on the verge of being published. Now, my friend had, in the days when publishers really had no idea of what the Internet was, secured the electronic distribution rights to his work and, as a matter of fact, he gave away his Java book for free. His publisher was eager to publish the C# book and, lo and behold, my contract ended up with the same electronic rights. So I said to him "I know that having given it away for free for years, you've said you can't do this, but I'm thinking of charging $5 for the download via PayPal. Waddya' think?" And he said "Yeah, sounds like a good experiment."

So I wrote a little thing that hooked up to PayPal and when the postback happened, sent out the obfuscated but totally un-encrypted URI of a PDF version of the book (complete with trim marks for the printer, etc.). Oh, and just for fun, I hooked it up so that every time I sold a book, a little "ka-ching" wav file would play. And for a couple of days I hung out in the NetNews C# group and answered a bunch of questions and ended all my posts with "If you found this helpful, you might be interested in..." and linked them to the $5 download.

Well, let me tell ya', it's a really good feeling to be watching TV and to be bothered because every minute or so you make $5. And, within a week, it was being traded on the filesharing networks because, despite what utopians say, it's not really about affordability or the "cut" that the media companies take. Someone paid $5 for an 1,100-page book and then turned around and said "Yeah, I'll put this up for sharing." But y'know, what can you do? I was certainly making enough off the PayPal to consider the experiment a roaring success.

Now comes the sad part. Very shortly after the money started rolling in, I made the incredibly foolish mistake of mentioning my system on a mailing list that was read, not only by computer book authors, but by computer book publishers. Including my own publisher, who was in the process of finalizing the cover design and getting everything nice and tidy for the print run.

Well, let me tell ya', it's a really bad feeling when your own publisher feels thwarted. You see, as far as giving away for free the Java book, the accountants at the publisher couldn't quantify their losses (dividing by zero, the lack of download statistics, etc.). By charging $5 for the download, all of a sudden their spreadsheets became unstuck and all of a sudden they weren't being nearly as nice to me as they had been the previous week. One of the things that they said was "Sign over the electronic rights to us or we won't publish the book." And I said "Why would I do that? My per-unit profit on electronic sales is greater than the royalty" (For a $50 cover price! Don't get me started). And they said "Poof! You don't have the right to publish any version of your book. It is derived from our property and you cannot create a derivative work." And I said "Hah! I'll change the title and any text that directly quotes the Java book!"

And they said... And here's a point of copyright law for all you kids out there ... "The majority of your 400 sample programs are structured the same as the Java samples. You can't use the structure without infringing." At which point, I started paying a lawyer $300 to do my speaking for me. I would have been much better served to just bend over and grab my ankles.

The worst part of it is that if I hadn't immediately complied with their first informal request to cease selling the electronic version (back when I was under the impression we were all on the same side and just needed to work out this kink), I probably would have made enough money in a couple weeks to at least pay the lawyer's bills.

I swore that if I were going to write another book for no monetary gain, it sure as heck wasn't going to be a programming book, it would be a novel, thank you very much.

So, this year, I wrote a novel. Well, a really bad first draft. But still.

And no, I'm not selling it online. Who in their right mind would buy a novel online?

Thursday, December 29, 2005 2:29:08 PM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | Knowing#

I just posted my three final invoices for 2005, my first full year of living in Hawai'i. The good news is that I beat my budget targets by 16%. The bad news is that, because of the move, I reduced those targets by 15%! The other bad news is that the cost of living in Hawai'i is higher even than in the Bay Area, so when I calculate our budget for next year, I'm going to have to ratchet up my income targets, which means either charging my clients more or taking on more work. Sigh. The other good news, though, is that it does seem possible to live on a tropical island and make a living wage as a programmer and writer.

I've long felt that it is impossible to get rich if the only thing you sell is your own time, and although we're doing okay, our lifestyle is quite modest (I drive a '92 Honda Civic that we bought new and which just passed 100,000 miles). I make the large majority of our money -- Tina works part-time in a plant nursery and hasn't sold any paintings this year. I'm not particularly interested in "advancing" in my career. I've done lots of stuff and, like Nora Desmond, I feel I am big, it's the pictures that got small. (Microsoft and Mozilla agreed on an RSS icon ? I take back everything!)

I can't justify charging people $200 an hour. More truthfully, I can't justify it to myself. I know a few people who charge $200 or more an hour and the thing is: if you just do it, you can do it. You have to travel a lot, though, and you probably shouldn't put pictures of yourself wearing a t-shirt on your blog and you certainly don't tell people you drive a '92 Honda Civic. I used to think that when I taught, for which I generally charged $2,500 to $3,000 a day, I made good money, but the problem is that you have to amortize your development and practice time, which, for me, is about a 20:1 ratio. For me the worst thing is that I have a strong novelty-seeking personality and I cannot stand to give the same lecture more than four or five times. Including practice run-throughs. Which means that, essentially, I've never amortized the cost of developing a talk. Not even close.

I think to make more than a living wage, you have to sell a product.

Thursday, December 29, 2005 1:54:10 PM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | Hawaii | Knowing | Offtopic#
Wednesday, December 28, 2005

Gus Mueller, developer of Voodoo, a desktop Wiki application for the Mac, has been able to quit his day job based on the sales of his two applications. Eric Sink, who developed a guaranteed-winnable version of Windows Solitaire, made $215 in 15 months and has sold off the app. The difference(s)? It seems to me that Mueller was:

·         More compelled to pursue monetary goals

·         “Write something people are willing to buy” – but this is tricky. Everyone has played Windows Solitaire, people buy games, and “there is a way to win every game” is a clear value proposition. A desktop Wiki, on the other hand, has the advantage of being something that people could grow reliant on, but has a huge disadvantage in terms of people understanding what it is.

·         Mueller wrote for the Mac

Although I’m sure that there are more independent ISVs for Windows than for Mac, in the past couple of years I’ve gotten the impression that the percentage of successful ISVs for the Mac is definitely higher. I think that if you’re writing an application that purports to increase productivity, as Mueller does, you’ll definitely find marketing and selling to the Macintosh community easier than to the Windows community.

Wednesday, December 28, 2005 8:30:42 AM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | #
Friday, December 23, 2005

I have a subscription MusicMatch's "On Demand" service, which includes the ability to put in an artist and say "Music like this." I loved this when I first experienced it, but Pandora is much better.

Compare these two results for a seed of "Jesus & Mary Chain":

MusicMatch "Artist Match"

  1. "Situation" by Yaz
  2. "Blue Monday" by New Order
  3. "Love & Peace or Else" by U2
  4. "Some Girls Are Bigger Than Others" by The Smiths
  5. "Cities" by The Talking Heads

Okay, fair enough recreation of a 1982 New Wave commercial radio playlist...

Pandora:

  1. "Eric's Trip" by Sonic Youth
  2. "Stand Guard" by Bob Mould
  3. "Pig Knuckled Clown" by Flour
  4. "Sometimes" by Firehose
  5. "Soft Signals" by Limblifter

Now that's like what you'd expect from a college DJ! With Pandora, you can actually fine-tune what you want to hear considerably, but even with just the seed there's no question that Pandora "gets" the sound of Jesus & Mary Chain and MusicMatch "gets" the era and that its "New Wave."

Between KEXP.ORG, ReplayRadio, MusicMatch On Demand, and Pandora, I actually feel like I'm hearing as much musical diversity as I ever did on the mainland.

Friday, December 23, 2005 12:37:47 PM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | Offtopic | Reviews#

It would be a really good idea to do this as a basic safety process: installing XP on your 256MB-or-bigger USB flash drive

Friday, December 23, 2005 12:17:54 PM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | #

I have what was considered a great TV in its day (the year 2000) -- a 27" Sony Trinitron. There are no over-the-air HD signals here on the slopes of Hualalai Volcano, I have basic cable, and my Tivo doesn't record in HD. Project Gotham Racing totally makes me want to go out and spend $1,000 on an HDTV. (With better visual cues, I'm sure I could shave 10 seconds off my Nurburgring times -- I'm just sure of it!) Not gonna' happen, but all the HD manufacturers ought to send Bill Gates a box of chocolate or flowers or something...

Friday, December 23, 2005 7:56:31 AM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | Offtopic | XBox360#
Thursday, December 22, 2005

Wouldn’t it be awesome if Borland released a complete Ruby development environment that could target native Windows, Linux, the JVM, and .NET? Plus, of course, Rails?

Thursday, December 22, 2005 9:17:24 AM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | Knowing | SD Tools#

I guess a bit of a theme is emerging today, check out this account from an ex-Microsoftian on the energy levels at Google:

A little over a year ago I left Microsoft and went to work for Google. During the interview process, one of the things that really impressed me was the energy in the work places. There were people everywhere coding, talking, obviously engaged in solving problems. Every engineer is sitting in front of dual 24" monitors cranking out code, exploring ideas, etc…..Those of you in the trenches writing code, there is virtually no incentive to work hard, crank out code ahead of schedule, invent and implement innovative new ideas, etc. Microsoft is just a safe place to collect a paycheck....this kind of energy is what we thrive on, and whats needed from time to time to create great products….This is the kind of energy that I think is missing from Microsoft. It was definitely there in the old days.

 

Thursday, December 22, 2005 9:10:43 AM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | Knowing#

Clemens Vaster, the original developer of my preferred blogging engine (dasBlog), has joined Microsoft as a Program Manager for WCF (Indigo).

 

If the past is any guide, the next six months will have a significant uptick in moves in and out of Redmond. While MS is always hiring and people are always moving on, there is usually a significant “inhalation” when Microsoft emerges from a heads-down shipping mode such as they’ve been in with the VS 2005 / Whidbey wave of technologies. What makes this a little different is that the WinFX / Vista wave of technologies is right at the verge of that heads-down phase itself, so it’ll be interesting to see if the “inhalation” is cut short. The influx of PM-level talent is one of the most important components of Microsoft’s struggle to maintain leadership in the development marketplace.

Thursday, December 22, 2005 8:57:39 AM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | Knowing#

O'Reilly's Jeremy Jones is reporting that Guido van Rossum, creator and lead developer of the Python programming language, is now working for Google.

My immediate reaction was “Not Heinemeir Hansson?” (The creator of Ruby on Rails, the much more buzzword-y framework for Web apps).

Seriously though, it’s long been known that Google extensively uses Python (and other, proprietary domain-specific languages and tools) internally. This is one of those practices that signal Google’s sophistication. In most organizations, you’ll find that all work is done with the “production” language – the language that is used to deliver value to the end-user. More sophisticated organizations recognize that exploration and exploitation often require different toolsets.

Personally, my favorite tool for exploration is Mathematica, which has a unique “notebook” interface that allows you to record your thoughts, embed pictures and media, and develop functionality.

Thursday, December 22, 2005 8:29:00 AM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | Knowing | SD Tools#
Wednesday, December 21, 2005

I liked King Kong quite a bit, and I'll say that the special effects of Kong's face are the best I've ever seen. But in most of the action scenes, I thought the effects were a notch below Lord of the Rings. The dinosaur chase scene I thought was really poor, with no real sense that the actors and dinosaurs were in the same space.

Oh, and Kong can handle three T. Rex but can be brought down by a couple of grappling hooks? Puh-lease.

 

Wednesday, December 21, 2005 3:39:00 PM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | Hawaii | Reviews#
Monday, December 19, 2005

CMP, a major trade publisher, laid off a bunch of people in their software development publishing group on Friday, including blindsiding a five-month pregnant editor who'd worked there for more than a decade. Ah, corporate America!

I suspect that at least two well-known but ad-challenged magazines are going to shut down. Stay tuned...

Monday, December 19, 2005 11:16:44 AM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | Knowing | SD Tools#
Tuesday, December 13, 2005

Wesner Moise has a fantastic blog post on how iterators and Expressions can be used to implement backtracking:

It turns out that it is possible to implement logic programming in C# natively through the use of iterators.  

grandparent(x, z) :– parent(x, y), parent(y, z).
parent(jebbush, gpbush).
parent(ghwbush, gwbush).
parent(ghwbush, jebbush).

The above rules in Prolog could be translated into following C# code: http://wesnerm.blogs.com/net undocumented/2005/12/iterators and n.html

 

Tuesday, December 13, 2005 9:02:29 PM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | #
Monday, December 12, 2005

XSLT is used to transform one XML document into another. The canonical example is the transformation of a data-oriented XML document into a XHTML document formatted for reading in a browser. However, the evolution of dynamic Web sites has clearly favored procedural programming to get the data (ASP, PHP, etc.) and CSS as the formatting model. But I, like some others, originally thought that XSLT's great potential was as the linguage franca for transforming documents in a data-driven world. But here we are,  on the eve of 2006 seven years after I first worked with XSL, and I am looking with utter dismay at a project that (potentially) involves the development of a custom XSLT transform.

The dismay comes from the idea of configuring my system for XSLT debugging, clearing a space beside my keyboard for Michael Kay's XSLT Programmers Reference (which is the only way to get through a major XSLT job), and plunging into the darkness. Or, I think to myself, Load the DOM, walk the tree, and write the nodes. A part of me finds this thought a betrayal -- XSLT solves this problem, darn it, and it's just a matter of figuring out the templates and then you write nice declarative transforms, as opposed to doing it in code, where you'll confuse transformation and declaration, mess up your responsibilities, shroud the transform in the fog of infrastructure, etc.

But when I've done major XSLT jobs before, I get the sense that I might as well have been delivering PROLOG source code -- it works (for now), it has theoretical advantages, if you immerse yourself in it it eventually clicks and makes sense, but... No one ever will. Expertise in XSLT? Hah!

I'm going to talk it over with my client, but I doubt that I will end up doing this in XSLT. It's a technology that's failed.

Monday, December 12, 2005 9:12:31 AM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | Knowing | SD Tools#
Saturday, December 10, 2005

Seb Wills has hooked the accelerometers in the Toshiba M200 to control the Dasher text-input system (in which letters gradually slide from right-to-left and your vertical motion selects them). Fantastic!

One of the most interesting things about the Tablet PC is all the ways we search for alternate input techniques. Personally, I find that SHARK has the highest rate of entry (better than FITALY, better than Dasher, way better than handwriting), but there are aspects of the Java-based input panel that are really frustrating.

For my next DevX article, I'm working on a voice-input correction system that is based on the Tablet PC Input Panel, which is a tremendous piece of UI engineering for correcting hand-writing. My premise is that it's acceptable to use a mixed-mode editing panel, where a pen / mouse is used to navigate the recognized text and its alternates. I'm having some trouble understanding the SAPI object model -- I'm requesting alternates but getting identical outputs, which is strange.

Saturday, December 10, 2005 12:04:08 PM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | TabletPC#
Friday, December 09, 2005
Microsoft has just released a CTP with the first version of IronPython / Visual Studio integration: http://affiliate.vsipmembers.com/downloads/41/UserFileDownload.ashx
Friday, December 09, 2005 12:27:16 PM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | #
The msbuildtasks project at http://msbuildtasks.tigris.org/ has written tasks for MSBuild that include Subversion commit, update, checkout, etc. Also, they have an FTPUpload that double definitely come in handy. Fantastic!
Friday, December 09, 2005 8:33:37 AM (Hawaiian Standard Time, UTC-10:00) |  Disqus link  | Knowing | SD Tools#
Thursday, December 08, 2005

It can be hard, when using MSBuild, to know what Tasks (aka Targets aka functions) are available, especially when using the built-in .targets files associated with the compilers. So, I wrote a custom Task that iterates over all the other Tasks that are currently loaded and outputs their [Output] properties. To use it, just drop the .DLL so that MSBuild can find it, open your existing MSBuild project file, and add the following:

<UsingTask AssemblyFile="TasksAndOutputs.dll" TaskName="TasksAndOutputs"/>
<Target Name="AfterBuild">
   <TasksAndOutputs/>
</Target>

And run MSBuild.

Binary and Source-Code Download.

Oh, it's also a decent-enough sample of extending MSBuild with a custom task.