I recently opted to throw together my own blog software (after going through the standard Build or Buy analysis), expediting deployment as a means of forcing follow-thru. The goals of this micro-project were to improve the authoring and content management experience, to improve searchability of the content (without having to cast content out from the blog to a static form), and to improve the usability and navigation from the user's perspective (for instance the classic "date" navigator common on most blogs is something that I've opted to remove).
Despite having close to no time to allocate to this task, my tendency to over-engineer still showed through: The easiest option would have been a content-management system defined entirely in code (it's as easy for me to change and deploy code than it is to change templates and metadata), and of course to build it for a single author. Instead it supports many blogs through the same URLRedirector, blog aggregations (where a blog is a publication of a set of blogs, each with distinct authors) each using its own templates and configurations.
Which brings me to templates -- failing to find a decent Smarty-type templating system for .NET (basic ASPX is really a templating system, but I'm speaking more towards something that can enumerate sections, retrieving data based upon an object structure of relationships and containment).
So I had to build a basic templating system, yielding the templates that follow. The first for HTML output--
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
<title>{#blog.Title} {#docTitle}</title>
<link rel="stylesheet" type="text/css" media="screen, projection"
href="http://www.yafla.com/dforbes/style/css/blog.css"></link>
<script type="text/javascript" src="http://www.haloscan.com/load/dforbes"> </script>
</head>
<body>
<div class="clsHeader">
<div class="clsBlogHeader"><a href="{#blog.BaseUrl}">{#blog.Title}</a></div>
<div class="clsSubheader">{#blog.Description}</div>
</div>
<div class="clsBody">
{foreach $entry in $entries}
<div class="clsEntry">
<div class="clsDate">{#entry.EntryContent.PublishDateUTC|dddd, MMMM dd yyyy}</div>
<div class="clsTitle"><a href="{#entry.Permalink}">{#entry.EntryContent.EntryTitle}</a></div>
<div class="clsBody">{#entry.EntryContent.EntryContent}</div>
<div class="clsKeywords">{foreach $keyword in $entry.EntryKeywords}
<a href="{#blog.BaseUrl}{#keyword.KeywordText|escape}">{#keyword.KeywordText}</a> {/foreach}
</div>
<div class="clsPermalink">
<a href="javascript:HaloScan('{#entry.MappingId}');" target="_self">
<script type="text/javascript">postCount('{#entry.MappingId}'); </script></a>
<a href="{#entry.Permalink}">permalink</a>
</div>
{foreach $relatedentry in $entry.RelatedEntries}
{ifcond $LoopFirst = "True"}
<center>
<div class="clsRelatedEntries">
Related Entries
{/ifcond}
<div class="clsRelatedEntry">
<a href="{#relatedentry.Permalink}">{#relatedentry.EntryContent.EntryTitle}</a>
</div>
{ifcond $LoopLast = "True"}
</div>
</center>
{/ifcond}
{/foreach}
</div>
{/foreach}
<div class="clsAdBlock">
{#adBlockHorizontal}
</div>
<div class="clsNavigator">
<span class="clsNavigateEarlier">{#moveEarlier}</span><span class="clsNavigateLater">{#moveLater}
</span>
</div>
</div>
<br/>
<div class="clsAttribution">
<a href="mailto:{#entry.EntryContent.ContentAuthor.EmailAddress}">
{#entry.EntryContent.ContentAuthor.Name}
</a> -
{#entry.EntryContent.ContentAuthor.Description}
</div>
</body>
</html>
The next template is for RSS consumers--
<rss version="2.0">
<channel>
<title>{#blog.Title|escape}</title>
<link>{#blog.BaseUrl}</link>
<description>{#blog.Description|escape}</description>
<lastBuildDate>{#buildDate|r}</lastBuildDate>
<language>en-us</language>
{foreach $entry in $entries}
<item>
<title>{#entry.EntryContent.EntryTitle|escape}</title>
<link>{#entry.Permalink}</link>
<guid>{#entry.Permalink}</guid>
<pubDate>{#entry.EntryContent.PublishDateUTC|r}</pubDate>
<description><![CDATA[{#entry.EntryContent.EntryContent}]]></description>
</item>
{/foreach}
</channel>
</rss>
All in all, I think it works pretty good, and I can successfully run the W3C validations on the vast majority of generated pages and get the comforting green checkmark.
My original foray into the land of blogging was delayed while I stumbled towards the goal of building my own blogging software: like many software developers, I have a sometimes irrational desire to build it myself rather than admit “defeat” and use one of the many (and in the realm of blogging, there are many) available products.
I took a couple of stabs at building it myself originally, but due to another common foible – a tendency to over-engineer (I couldn’t simply write some blog software to post and publish my own thoughts. No…it had to be a full multi-author aggregation and collaboration suite, meaning that weeks went by while I mentally debated the database model for such a machination) – it just never seemed to get finished.
Other priorities always trumped it, and the little time I did allot towards this goal saw me solving absurd edge conditions.
I finally set a deadline for myself, and when I couldn’t find the time to finish anything before my marker (billable hours always came first), I went and bought a copy of Radio Userland and started publishing content the blog way.
That worked well enough for a while, but Radio Userland is a venerable publishing tool that is really showing its age. Authoring to it is a less than pleasant experience – which has been a huge contributor towards the dearth of content (it’s always a bit of a roll of the dice to see which characters it randomly replaces in posts, or which carefully authored HTML blocks it’s decided to mangle) – and simple tasks like cross-linking posts (e.g. a “related posts” sidebar to allow users to easily see follow-ups) was just far too manual to be worth the bother.
Now that I have a powerful, fully dedicated server, it’s also grossly under-featured for users, making the experience of consuming and navigating through the information far less usable than it should be.
So I’ve gone and built my own blogging software, this time quickly bringing it to a sort of beta release.
Given that this is the venue with which I will publicize a ton of changes elsewhere on the site, I really considered this a roadblock on the critical path to the release of other web application functionality elsewhere on yafla.
With some focus, it took only a couple of hours this time, mostly accomplished while putting my toddler son to bed over the weekend. It was so ridiculously quick and easy that I kick myself for not having done it sooner.
I’m extremely pleased about the functionality built out (hey it isn't rocket science, and definitely falls within the realm of "trivial", but there's lots of little "gotchas" with software like this), though most of the kudos go towards .NET 2 and SQL Server 2005: A couple of tools that make short work of what would once have been an enormous task, bringing a robust, secure, high performance web application to a usable stage in less time than it takes to watch the Lord of the Rings trilogy.
Right now you’ll probably notice that – at this moment at least – the HTML version of the blog looks absolutely terribly. That is somewhat by design (or rather an intentional time compromise)…momentarily. I’m working on the template (it’s of course parameterized template driven), and wanted to force myself to follow through by deploying (perhaps prematurely).
So what are the features of the blog software?
Well, firstly I migrated 100% of the old content over (including metadata such as categorization), running it all through Tidy first to try to make it a little more XHTML legitimate. Using an identifier mapping structure, every single link to the legacy content still works (which was important to me: I didn’t want to give link followers the frustrating “We moved everything so have fun trying to find it” 404 experience).
Everything works via URL remapping, and for now I’ve set it to redirect from old links to the new links where possible. E.g. http://www.yafla.com/dforbes/categories/softwareDevelopment/2005/09/28.html redirects to http://www.yafla.com/dforbes/Clean_Code. All new entries Will follow that more transparent and obvious structure.
But the URLs aren’t limited to just single documents – All entries in June of 2006 can be accessed via http://www.yafla.com/dforbes/2006/06. Add in a category and you can refine further – http://www.yafla.com/dforbes/2006/06/.NET (or http://www.yafla.com/dforbes/.NET/2006/06. Whatever makes you happy).
Want that in RSS form? http://www.yafla.com/dforbes/2006/06/.NET/rss.xml. Add in the day if you wanted to refine further.
Of course, no longer are entries limited to the archaic “categories”. Now they’re basically keywords, so if you want to see the posts where I’ve abused categories and multi-tagged, take a look at
http://www.yafla.com/dforbes/.NET/SQL/Blogging/SoftwareDevelopment/Personal/IT/
Yikes!
So the tagging will be much more logical now that there aren’t broad categories, and given that anyone can filter content however they want (stick rss.xml on the end and you can get a feed of whatever you want).
There’s also search, though I’m not comfortable enough with the finality of the API to publish anything about that.
Entries now have versioning, given that I want to be more transparent with edits that I make (I’m endlessly doing minor corrections and improving wording, and for those who consider that deceptive there’ll be a little version history to see what changed and when, along with a label of why the change was made). All links are auto-parsed and logged, so every entry has a list of posts that link into it, making for much more elegant self follow-ups without resorting to post-editing some “UPDATE: See also…“ notes into old entries, and without resorting to the ugliness of trackbacks.
Extensive caching ensures that it’s still spritely and capable of handling peak loads with no fuss.
Oh, and the system supports many blogs by many authors, including publishing multiple authors into one system…so I still over-engineered, but in the end it was workable and I’m extremely happy with the core structure.
Great things lie ahead.
Summer is waning here in the Northern hemisphere.
While it's sad that the warm weather and summer activities will soon be packed in the garage for another year, it's almost the time for fall fairs, rich soups, apple picking, walks in the gorgeous escarpment country when the leaves have changed color, pumpkins and costumes.
'Tis a wonderful season ending, to be replaced by another great time of year.
With the decrease in outdoor activities, I'll be posting more frequently. I've been kicking SQL Server 2008 around, and look forward to writing about it (I'm excited about its new hierarchical functionality, which has echos of versatile high performance hierarchies), along with many other thoughts that have percolated in my head.

While most prospective bloggers (online content authors) have already been doing it for some time, every now and then someone anxiously asks me whether they should start a blog, feeling like the train is leaving the station and in future world they'll be relegated to the info-slums because of their lack of participation. For these recurring queries I thought it worthwhile posting an entry, giving me a a simple URL to reference.
A decade+ ago, most "online" comments were conceived and birthed in feature-rich, fat-client applications. These were tools that generally offered a rich gamut of functionality: spell-checking, automatic intelligent threading, offline composition, selective content blocks (such as plonking unliked trolls, censoring expletives), automatic notification of certain keywords or topics, alongside a wide breadth of additional capabilities.
You could read and participate in conversations on a massive array of topics, from law and order, to product support forums for a particular vendor's database product, to the seedier side of the alt hierarchy. All using the same client application that you were comfortable with, configured just the way you liked it.
After authoring your brilliant, convincing argument (or your question about what video card to buy or how to call a certain API function) and hitting send, the application would queue it up much like an outgoing email, and when the opportunity arose (when you dialed up to your local BBS), it would send it to your local server via a standard protocol, where it would be shared with a decentralized universe of servers.
Usually your brilliant literary gem would be immediately visible to the world -- limited only by the rate of propagation -- though a small number of newsgroups had post moderation that requiring each new addition to first be approved.
This standardized protocol, message format, and distribution mechanism allowed for rich client functionality without reinventing it for every single newsgroup. Imagine how absurd it would have been if you used a different set of tools, with a different set of functions, to interact with comp.sys.ibm.pc.hardware.video than you did with comp.sys.ibm.pc.hardware.sound?
Just as importantly, the standard message format and transport protocol allowed for very easy indexing and archiving -- easily searchable across time and space by whichever search vendor did the best job. This is how we got the incredible functionality of DejaNews (which was later purchased by Google and rebranded as Google Groups), which managed to reach its indexing fingers back a decade earlier than it was even imagined.
If you do software development, you've probably found newsgroups to be by far the most useful resource to search when looking for answers: While a normal web search will yield thousands of noise responses and pay sites begging for money to see the answer (that they usually ripped from a usenet newsgroup), a quick tab over to the groups will usually immediately find the archive of someone who faced a similar question or problem, and the helpful replies.
Of course Usenet is still around and very much alive, and some sites still use NNTP. Unfortunately the quantity of useful answers has been declining, or at least that's my impression, as more and more conversations are being siphoned off into poorly structured, often unindexed islands of information.
Why is every new web app creating yet another terrible reinvention of a container for discussions? Why are we functionally stepping back 20 years for every single new forum (see Digg, YouTube, Reddit, and others for examples of colosally broken discussion systems that people interact with despite their enormous failures, having no alternatives. There are a few, Slashdot for instance, that are moderately evolved, but it took half a decade to achieve a somewhat usable system, and even then the failings are numerous)?
Worse still, why are so many sites storing conversations and threads in isolated silos of data, stored and communicated in completely non-standardized ways. I can easily find and reference threads that I reminisce reading on a usenet newsgroups 14 years ago (usually for "I told you so!" purposes), yet it's often impossible to find a thread or comment on a modern web forum even if I remember seeing it a month ago.
This isn't an argument for a return to the days of yore, and I'm candy-coated the history and usability of Usenet, but it does seem like a lot of people are continually reinventing the wheel, ignoring the lessons of the past.
It does seem like the value of each additional piece being added to the global solution set is being diminished or completely lost: Where once we had clearly defined domains of information, clearly deliminated and indexed by topic, with a clear threading organization and meta-data structure (author, date, what other comment entry it's a reply to, and so on) that could easily be interpreted by anyone who understood the NNTP spec, now we're at the point where search engines have to try to interpret a million variations of rendering engines, inevitably losing most context and metadata, and that's only if they happen to even crawl across the conversations in the first place.
Somehow we need to find a medium, taking from the past while incorporating modern technology. Perhaps a new embedded commenting structure should be an addition to Firefox 3.
Hearing the word "blog" makes me vomit just a little in the back of my mouth.
Having real people in the meat world comment to me about my "blog" leaves me feeling just a little embarrassed and uneasy: There's just something about the pompous self-importance and imagined sense of influence of the whole "blogosphere", coupled with the cacophony of useless chatter coming from some dubious participants, that makes it a group that I really don't feel entirely comfortable being associated with.
Many blogs (not including yours, of course) feature predominately insipid ramblings, with space-filling content of limited or no informational value. Many of their authors have no particular skill or unique message in the realm that they focus on.
Bloggers themselves often subscribe to hundreds of blogs just to have content to blog about (I'd wager that RSS readers are overwhelmingly used by RSS publishers...), in a giant circular linkfest, all saying the same things in unison. The more accessible the source, the easier it is to "contribute" by making some ancillary comment about how the shed should have a red stripe instead of a blue stripe, the more subscribers, the more references.
Don't think I'm excluding this very blog from these criticisms. I'm very critical of my own works.
Among the "A-list" bloggers, many are the Paris Hiltons of the technology world -- readers (a fanbase primarily consisting of B...Z-list bloggers, as mentioned earlier. Among the general population, especially people and groups of influence, even the largest bloggers have zero influence or namespace) follow them, and link to them, and talk about them...because people follow them, link to them, and talk about them.
People anxiously watch their moves because they don't want to miss anything that "everyone else" is watching. It really is extraordinary.
I've never been discrete about my feelings of this topic: I started this blog by indicating my contempt for blogs in general, commenting that I viewed this more as a mature content management system. It was a halfway point between formal writing and informal writing, where I could "own" my content, easily posting and altering information while making it available for search engines (and perhaps playing the system a bit to ensure that I maintain and gain search engine credibility, which I've gained in buckets).
I don't use an RSS reader, and from that obviously I don't subscribe to any blogs.
Now and then I do browse around some of the few blogs that feature occasionally insightful or interesting or thought-provoking content, or from authors who have inside information (e.g. developers inside a corporation whose software or tools I depend upon, sharing a unique perspective that can be valuable for me), and often traipse back through the history a bit, gaining knowledge and perspective, just as I did before they were called blogs and were just papers and articles that people posted online.
Often these blog-diving journeys begin when one of their posts make it atop the meme or news sites. I got linked on Slashdot yesterday, and of the ten thousand or so visitors referred over, a very large percentage actually felt the desire to go browsing through historical entries, which is something that always makes me feel that I've "succeeded" in my quest a bit.
My opinions on the topic of blogs have hardly endeared me into the blogging community. Even those who fully agree with me are naturally wary of linking this way, lest they play into exactly what I criticize. I don't have a "blog roll", and when I do link to other blogs, which is infrequent, I usually tag it with a rel=nofollow just to be sure to indicate that I'm not giving any link love, and I'm certainly not looking for cheap reciprocity. If my goal was inbound links from other bloggers -- the ultimate goal of many bloggers -- this would be the absolutely worst way to achieve it.
I am not a blogger's blogger.
All of this isn't to say that blogs -- even those dedicated to documenting the most banal of everyday events -- don't have a "right" to exist, or even a very useful purpose. The more information on the net the better, and everyone has every right, ability, and encouragement to post anything and everything online. There are a lot of extraordinary blogs out there, amongst the noise.
The beauty of the internet is that if you don't want to read it, no one is forcing you to. Even if I don't like some blogs, I have no position or right or even moral opening to demand that the person cease its production.
Yet this whole "industry" needs a serious kick in the nads, and a serious correction of perspective. 10,000 readers would give one a significant position in the blogosphere, yet it's less readers than the two-bit journalist whiling away their career writing for the local newspaper in the tiny industrial town I grew up in gets every single day.
All of that was initiated by some of the grandiose pro-blog comments I came across while reading about the incident described in the next section, and some of the anti-blog commentary that resulted (yes, if you read the above with an open mind you will discover that it actually exonerates blogs from some of the criticism they've received).
A bit of a controversy kicked up recently over Microsoft (or its agents) giving out freebie high-end laptops with "no strings attached" to a variety of bloggers (some of whom have been identified, others not).
They emailed some bloggers, covering the gamut of popularity, informing them that they can receive a spanking new $2300USD+ laptop, pre-loaded with Windows Vista. After they were done "reviewing" it -- wink wink -- they could choose to return it, give it away, or keep it (there were variations of the email -- apparently they haven't mastered mail-merge technology -- one implying that the recipient could "borrow" it indefinitely, which is a bit of tax weaseling given that legally the sender was required to log the recipient's tax information of this valuable, taxable gift, and the receiver is to pay the appropriate taxes).
Several of the recipients of this Laptop Loot immediately posted about their great fortune, coming clean about the source, but claiming that somehow they were immune to the long proven and entrenched law of reciprocity. Their supposed objectivity was completely unswayed, we were told.
Other recipients were quiet about the whole affair, or worse made posts indicating that they just "traded-in" for the spanky new laptop. Another claimed that it came from a different source than actuality (just got a laptop from Microsoft and AMD? Say it came courtesy of Acer!)
Critics and pundits have taken up arms on both sides.
Defenders of the bloggers have almost universally fallen to the defense that those who throw stones are just jealous, which is a convenient, albeit very juvenile, retort to virtually any criticism. The alternate defense being that everyone is unethical in every industry, so what's the problem? It's a race to the bottom, baby, so grab whatever you can en route!
Critics have largely exaggerated the whole affair, declaring that the laptop recipients are worse than Hitler. Or something like that.
Few (if any) of the thus identified recipients have any hardware review credibility or experience worth noting, so their perception of the laptop itself is laughably useless (already we've seen some inane, content-free "reviews" appearing), at most restricted to valuable comments like "sure is pretty" or "seems fast". To counter this, some recipients have claimed that the laptop was justified because it allows them to review Vista without all of the trouble and difficulty of actually installing the operating system (or going through the Herculean effort of returning the supposed review unit), clearly indicating their experience level (low to none), not to mention their complete lack of dedication in exerting any effort at all in the pursuit of bringing useful content to their readers. If it isn't as easy as loading their RSS reader and punching in some opinions -- sort of like this entry! -- then they can't be bothered.
Deliver it on a platter, please.
Why do people read these people again? I've had various builds of Vista, and now the gold version, in virtual machines, and on an actual PC, for a good amount of time -- and I'm hardly interested in sitting on the razor edge of Microsoft technology, and surely was long beaten to the punch by pro-Microsoft cheerleaders -- as have many tens (hundreds?) of thousands of people who actually know what they're doing, and who aren't crippled with laziness. I have no inside track at Microsoft -- I'm quite antagonistic about them -- yet somehow I manage.
It runs very well, with all features enabled, on the middle to low-end PC I have it on, eliminating any (counterproductive) claim that only a high-end laptop would suffice.
All in all the whole thing is a lesson in how easily people can be bought, and how cynical one has to be about the opinions they find (and perhaps how meaningless those opinions really are), even among the pure and unadulterated blogging community (which, we are told, is supposed to be a superior alternative to the corrupt mainstream media). It is human nature to reciprocate favours, such as a $2300 laptop, but worse still is the inevitable invisible hand effect: If you want to keep this good stuff coming, you know what to do. Bring on the love, baby!
More disturbing is the entirely corrupt sense of ethics espoused by many of their supporters.
Nonetheless, I don't blame Microsoft. They're hardly alone in doing something like this (and like a mistress and a strayed husband -- why blame the mistress when she isn't the one that's married? Why blame Microsoft when they're not the one trying to present an impartial, objective opinion? Microsoft is just trying to sell a product.)
There's an extraordinarily good essay on this topic from a former magazine writer, sharing many parallels with the current situation. He details how the automotive industry used the same sort of coercion to get them to convince you that the new car is a lifestyle instead of just 4 wheels and an engine. He describes the soul-selling corruption that he witnessed among his peers, at the behest of Volvo (although it was hardly the only guilty company). The essay does nothing to sour my opinion of Volvo -- the Microsoft in that case -- but it does make me feel very negatively towards the supposed reviewers who beg their readers' trust. Who are empowered only by their readers' trust (otherwise Volvo wouldn't have wasted the money buying their voices).
I originally found that link from the superb The Submarine essay by Paul Graham.
I also highly recommend the superb book Influence: The Psychology of Persuasion. I was originally hooked onto that book by Spolsky several years back, and found it extraordinarily insightful about some of the techniques "compliance practitioners" use to get people (such as low level bloggers) to do their bidding.
No one is unbiased. Even something like Visual Studio committing hari kari, taking some work out with it, can make me anti-Microsoft in completely unrelated matters for a period, often unfairly. On the flip side, if their tools help me achieve a particular result with gusto, I might be prone to suddenly thinking the brown Zune with "squirt" technology looks like a mighty nice MP3 player.
This is the case with all of us. We're human.
I've written about bias and blogs before, so I won't retread all of that.
One thing that I marvel at, however, is seeing that some of the lucky laptop recipients have explained that they can't be bought by Microsoft, because they I(HEART)Microsoft already: Their position is already so pro-Microsoft they couldn't possibly be swayed further. They're gonna love it anyways!
Again, I have to ask: Who reads the postings of that sort of person? I'm deadly serious. Why would you read the opinion of someone who would declare (explicitly or implicitly) such a confused outlook on reality? I share the same feeling about those who can't possibly see any good in anything Microsoft does (or big oil, or Republicans, or the UN, or whatever).
If you are in technology and you think this is teams that you are playing for (e.g. Linux or Microsoft or Apple), and you don't directly work for and get paid by one of the aforementioned teams, then you've taken a seriously wrong path somewhere. If you are getting paid, then you'd better be wearing a "Hi, my name is and I work for " nametag, and you'd better realize how entirely impossible it is for you to be any more than superficially unbiased. And no, softball criticisms aren't going to fool us into thinking otherwise.
If you aren't getting paid, then you should NEVER declare your fealty to a technology camp, or fool yourself into thinking that you have to pick. You don't. Don't do yourself, your employer, your clients, and your users a tremendous disservice by myopically aligning yourself with interests that don't necessarily correlate with your own.