<rss version="2.0">
  <channel>
    <title>Dennis Forbes on Pragmatic Software Development</title>
    <link>http://www.yafla.com/dforbes/</link>
    <description></description>
    <lastBuildDate>Mon, 08 Sep 2008 18:40:41 GMT</lastBuildDate>
    <language>en-us</language>
		
		<item>
		  <title>Imagine If Apple Acquired Sony</title>
		  <link>http://www.yafla.com/dforbes/If_Apple_Married_Sony/</link>
		  <guid>http://www.yafla.com/dforbes/If_Apple_Married_Sony/</guid>
		  <pubDate>Wed, 21 May 2008 12:00:00 GMT</pubDate>
		  <description><![CDATA[<p>Microsoft&#146;s spurned advances toward Yahoo -- an incredibly generous
offer that could only have been rejected out of raw bilious contempt -- got me
thinking about possible mergers and acquisitions in the industry. </p>

<p>Which couplings make sense, and which don’t?</p>

<p>The mentioned Microsoft / Yahoo union, for instance, would
be a terrible partnership with almost no merit beyond maybe giving a short-term
legitimacy to Microsoft’s online efforts, temporarily hushing the naysayers.</p>

<p>A Google and Yahoo partnership makes just as little sense.</p>

<p>Of the mergers that would yield more than a fraction of the
sum of the parts, one that just won’t stop buzzing loudly in my brain, is one
that my subconscious has just assumed as inevitable– a Sony/Apple merger. </p>

<p>By today’s market capitalization numbers, it would actually
be an acquisition of Sony (worth approximately $42 billion today) by Apple
(worth a hard to believe $150+ billion), which really is extraordinary to consider.</p>

<p>How could Apple, supplying a small segment of the computer
market, along with a couple of portable electronics devices, dwarf the global
electronics giant Sony? </p>

<p>It seems incredible, but it’s true.</p>

<p>Apple should cement some of that market capitalization with
a merger (a polite acquisition) of Sony.</p>

<p>The synergies possible
between these two companies are absolutely incredible, giving Apple a significant
presence in the entire consumer electronics spectrum (a huge potential worldwide
market for services like iTunes), while gaining industry leading engineering
and fabrication capacity.</p>

<p>They’d even have a Windows-equipped PC division, as hilarious as that would
be. They’d have a whole media division, including movies and music, including
the Gracenotes catalog that was snatched by Sony.</p>

<p>It goes on and on. The more I contemplate how each company could use the other, the more 
inetivable such a pairing seems.</p>

<p>The only conceivable negative for such a merger would be the
infamous distaste Japanese companies have for foreign control (you lose some
value when all of the executives jump out windows in dishonor). A polite “merger
of equals” would probably be the only tenable option.</p>

<p>If such a merger came to pass, it would be a very bad day to
own Microsoft stock.</p>
]]></description>
		</item>
		
		<item>
		  <title>Being &quot;Bad&quot; -or- The Startup Lottery Ticket</title>
		  <link>http://www.yafla.com/dforbes/Be_Bad_Or_The_Startup_Lottery_Ticket/</link>
		  <guid>http://www.yafla.com/dforbes/Be_Bad_Or_The_Startup_Lottery_Ticket/</guid>
		  <pubDate>Mon, 21 Apr 2008 22:22:00 GMT</pubDate>
		  <description><![CDATA[<p>Paul Graham continues his popular series of "How To Get Rich Quick on the Internet. And Fast!" essays with his <a href="http://www.paulgraham.com/good.html">latest entry</a>, "Be Good", in which he describes some startup attributes common among a sampling of successful internet businesses.</p>
<p>One such pattern, observes Paul, is that his selected success stories started with no real revenue plans beyond "get big and flip it".</p>
<p>No subscriptions. No advertisements. No pop-ups. No interstitials.</p>
<p>They started more like a charity than a real business, just bringing good to their userbase with nothing asked or expected in return. At least at first.</p>
<p>This isn&#39;t a new position for Mr. Graham. He has long advocated the idea that you just need to worry about getting the eyeballs and you can figure out how to make money from them later. Or better still &mdash; reading between the lines &mdash; you can let the sucker you flip the thing to worry about the gritty details of how to monetize it, suffering the consequences if the userbase burns it to the ground in defiance of any revenue generating scheme.</p>
<p>This isn&#39;t a surprising position for Paul to support. It is entirely aligned with his micro-VC organizations&#39; business model, which is to take young, time- and energy-rich grads, fresh out of the college mill, and bankroll them with a small investment (which they need because they won&#39;t be earning anything from their Internet baby anytime soon), and then cash in when/if they manage to flip it to a sucker that still buys into the many eyeballs model (a strict "No Returns" policy in effect.)</p>
<p>Given the small investment, only a percentage of YC Combinator&#39;s `fundees&#39; need to hit the jackpot for the strategy to succeed, at least for Paul. He&#39;s playing house odds in this startup casino.</p>
<p>Paul provides some examples to demonstrate his position that the charity-that&#39;ll-make-you-rich approach is the winning strategy: Google and Craigslist. Incontestably successful companies, and most would be over the moon to experience a fraction of their success.</p>
<p>Let&#39;s take a closer look at these examples, and see how relevant they are to Paul&#39;s central theme.</p>
<h4>Craigslist</h4>
<p>Craig Newmark, the founder of Craigslist, <a href="http://www.craigslist.org/about/mission.and.history.html">started compiling a list of upcoming local events in 1995</a>, publishing it to subscribers via a listserver. Later, after the list was well established and had a healthy subscriber base, he started publishing entries to a website, adding functionality to allow users to email directly to categorized lists.</p>
<p>Today Craigslist is an internet superstar, constantly ranking among the top 50 websites worldwide. It pulls in impressive revenue numbers through a model that Craig himself describes in <a href="http://answers.yahoo.com/question/index?qid=20060720194938AADFTbO">this entry</a> on Yahoo! Answers.</p>
<p>Craigslist is a rare survivor among thousands, tens of thousands, or perhaps hundreds of thousands of exceedingly similar lists/classified upstarts, most of them run ad-free and for free (sites were often ad free as a simple side-effect of the barriers to entry to hosting ads pre-2000. At that time it wasn&#39;t as simple as signing up for an AdSense account).</p>
<p><a href="http://www.flickr.com/photos/dforbes/2426765254/" title="A Long Day Complete"><img src="http://farm3.static.flickr.com/2276/2426765254_156ae9cd52_m.jpg" width="240" height="161" alt="A Long Day Complete" align="right" vspace="8" hspace="8" /></a>Craigslist had the perfect, rare combination of the real-world personal connections of the founder, an ideal starting locality, userbase, and a progressive evolution that allowed it to build enough momentum that eventually the network effect took over, and you&#39;d use craigslist because everyone uses craigslist, at least in some markets.</p>
<p><b>What You Can Learn From Craigslist</b>: Craigslist is an extreme anomaly. Holding it up as an example of a path to follow is fundamentally akin to analyzing the number picking "strategy" of the latest lottery winner. It&#39;s also an excellent example of how corrupting, and falsely compelling, a <a href="http://en.wikipedia.org/wiki/Survivorship_bias">survivorship bias</a> can be. Countless sites have followed a close to identical path, failing miserably.</p>
<h4>Google</h4>
<p>Google hit the scene during the portal craze. This was a period when every other search engine, failing to sufficiently profit off of search alone, started merging with a gangly bunch of dance partners. Excite hooking up with @Home, for example. To "leverage the synergy", each quickly morphed into a "destination for all things" portal, fattening up their content until they featured a landing page <a href="http://web.archive.org/web/19980703072349/http://www01.excite.com/">absolutely packed from margin to margin</a> with text, news, stock quotes, images, comics, horoscopes, etc.</p>
<p>Ads were almost invisible in this era of visual pollution, and were seldom the problem. Many users were using dial-up, so the content inflation wasn&#39;t just aesthetically deplorable, but it also made the search process a slow, unpleasant experience.</p>
<p>Sergey and Larry had been working on some algorithms for internet search during this period, and with the dot com boom peaking they <a href="http://www.google.com/corporate/history.html">managed to pull together an impressive million dollars in financing before even launching their beta website</a>.</p>
<p>When they did finally get something online, they did the absolute minimal amount possible. Later they described the utter simplicity of the first version as a function of their lack of HTML knowledge: It was the best they could do, or cared to do, at the time.</p>
<p>They had differentiated themselves, however inadvertently, and it worked brilliantly. They had copious long-term financing (not "flip it to someone else" financing) before even launching, so they had no need to worry about making money immediately, using the website as a technology demo that would conceivably allow them to sell search technology and services to third parties and businesses.</p>
<p>While the quality of the search results got the Google buzz started, the dial-up bandwidth-friendly simplicity of their offering really won people over. Yet it was a simplicity that came primarily because the company only really had one product &mdash; search &mdash; and couldn&#39;t link to hundreds of other provided services.</p>
<p>When everyone else went heavyweight, the minimalism of Google got it a lot of attention among technology trend makers. That exposure on sites like Slashdot &mdash; amplified when the community learned that Google ran Linux &mdash; got them their next $25 million in financing, and the rest is history.</p>
<p><a href="http://www.flickr.com/photos/dforbes/2390226937/" title="Wishes"><img src="http://farm3.static.flickr.com/2210/2390226937_c68e5755c4_m.jpg" width="240" height="161" alt="Wishes" align="right" vspace="8" hspace="8" /></a>With their advertising initiatives Google took exactly the same approach, and when everyone else was using pop-up, high-bandwidth, obnoxious ads, Google zagged and had text ads. As others have adopted Google&#39;s text ad approach, Google has started adding in animated and full graphics ads to their docket.</p>
<p><b>What You Can Learn From Google</b>: If you have an algorithm or technology that is sufficiently impressive enough to get a million dollars in financing before you&#39;ve even left the drawing board, maybe you can take lessons from Google beyond "<em>differentiating from the competition is good</em>" (which is fairly obvious advice.)</p>
<h4>The Cold, Hard Truth</h4>
<p>The vast majority of "go big of go home" web ventures will fail. It isn&#39;t a meritocracy. Luck has a lot to do with it. There is little you can learn from the success stories unless you also learn from the failures, yet aside from the huge flameouts (which had to have enough success to even be notable), most failures fizzle out and disappear without a trace.</p>
<p>From the opposite angle, many "grow revenue from day one" websites have succeeded admirably (I just gave a local babysitter directory $39 for 3 months of lookups), albeit not without the "lottery ticket" quick payoff that a miniscule percentage of the winner-take-all players yield.</p>
<h4>Ethics and Morales</h4>
<p>It&#39;s a risky and disingenuous proposition to build a website, baiting a community, on one model &mdash; the "Good" and charitable model &mdash; and then switch the userbase once the founder&#39;s numbers get drawn. It&#39;s a scummy behavior to engage in, much less evangelize. It also might have the opposite effect than intended: I might not care whether a site like a social link voting site has a revenue model, but when I was considering photo sites I immediately discarded those that followed the Paul Graham business model, considering the risks too high: Either it would eventually be forced to flail about, obnoxiously trying different approaches at making it pay, or it would fold with a "Sorry We Got Bored Our Numbers Didn&#39;t Come Up" notice one fateful day. Instead I went for one with a sustainable business model, and haven&#39;t been unhappy with my decision (even if it did cost me a bit per year for all of the features).</p>
<h4>Bits And Bytes</h4>
<ul>
<li>This entry was authored in emacs.</li>
<li>A quad-core is definitely your best choice, especially given the huge price drops just announced.</li>
<li>I called the whole Riya thing perfectly.</li>
<li>The standard for comments in code shouldn&#39;t be driven by the need to provide endless guideposts for incompetent programmers. If it describes something that should be obvious by the code, you&#39;re fixing the wrong problem (which can be either unclear code, or incompetent programmers, or both).</li>
<li>Most developers don&#39;t rely upon books anymore because the overwhelming majority of technical books are garbage.</li>
<li>Bits and Bytes was a <a href="http://en.wikipedia.org/wiki/Bits_and_Bytes">brilliant educational program on TVO</a> in the early 80s, and it is entirely responsible for beginning my love of computer hardware and software.</li>
<li>Nassim Nicholas Taleb explores survivorship and confirmation biases excellently in his books the Black Swan and Fooled by Randomness. While I was put off by his ego, and 
the expansion of a paragraph-worth idea into chapters, they&#39;re still great reads.</li>
</ul>]]></description>
		</item>
		
		<item>
		  <title>The Hyperinflation of XMLSpy</title>
		  <link>http://www.yafla.com/dforbes/The_Hyperinflation_Of_XMLSpy/</link>
		  <guid>http://www.yafla.com/dforbes/The_Hyperinflation_Of_XMLSpy/</guid>
		  <pubDate>Tue, 18 Mar 2008 12:00:00 GMT</pubDate>
		  <description><![CDATA[<p >Back in the late 1990s, when XML was still in its formative
years (a state some would argue continues to this day), XML Spy was a very
welcome entrant to the developer tools market, bringing intuitive, GUI-based schema
and basic transformation authoring and validation to the developer’s desktop. </p>
<p >While some were productive and happy with just the W3C specs
and a copy of emacs, many of us only used XML intermittently, building an
export, import or transformation that simply worked, promptly forgetting all of
the nuances of DTDs versus XSDs versus XDRs, or the quickly changing XSL(T)
specifications.</p>
<p >It was a great step forward in the uptake and quality of XML
utilization to have such an easy to use, up-to-date tool.</p>
<p >At the time XML Spy was basically shareware, offering a
fully featured 30-day trial, at worst popping up the occasional “please
register me!” exhortation. </p>
<p >Many just registered it: it was an easy sell at <a
href="http://web.archive.org/web/19990430062708/http:/www.xmlspy.com/">$54 a
user</a>, less if you bought multiple copies. That’s almost disposable money,
and was an easy pitch to most managers. It was easy enough saying “let’s get a
copy for everyone in the group. Even for the guy in the cube near the washroom,
anti-XML rage bursting from his trembling lips in a spray of spittle and phlegm.”</p>
<p >Time goes on and we all moved to different projects, divisions
and companies, often with long gaps needing little or no in-depth XML. When
those instances came up, we’d try to find an old licensed copy, or would
download the latest trial, using yet another toss away email address for the
validation.</p>
<p >And XML Spy just kept getting more expensive. The company
grew and grew (note that the domain on the original archive.org link above actually
expired, and now sits in the hands of a domain ad purveyor), and the dollar
signs in their dreams had them imagining, apparently, of a day when millions of
information workers sat toiling their days away in the pure awesomeness of XML
Spy. In emacs-esque form, it had grown more and more functionality, even if
many users never used it for anything more than creating and validating schemas
and transformations.</p>
<p >By late 2000, the price of XML Spy had inflated to <a
href="http://web.archive.org/web/20001204211600/http:/xmlspy.com/">$149 a user</a>.
By the end of the next year it hit <a
href="http://web.archive.org/web/20011116014146/http:/www.xmlspy.com/">$399 a
user</a>. By late 2006 it was up to <a
href="http://web.archive.org/web/20061117013237/xmlspy.com/pricelist.html">$499
a user</a> (at some point dropping the space between XML and Spy, becoming
XMLSpy). </p>
<p >As I write this it’s up to <a
href="https://shop.altova.com/pricelist.asp">$539 a user</a>.</p>
<p >Maybe XMLSpy is developed in a poorly insulated aircraft hangar
in Siberia, and thus is strongly impacted by the price of oil?</p>
<p align="center"><img src="http://www.yafla.com/dforbes/images/xmlspy_versus_oil.png" width="483" height="291" alt="XMLSpy versus Oil -- Peak XML?" /></p>
<p >A ten-fold jump in price in about 8 years seems excessive.
What was once a wonderfully priced utility is now a considerably expensive
development ecosystem. What was once an easy purchase (at one workplace I just
paid for it myself rather than deal with the annoyance of a requisition form)
is now a difficult to justify expenditure, requiring vendor comparisons, and negotiations
with middle managers. When the money handlers are convinced, often it’s just for
partial coverage of the development team. </p>
<p >You end up with the “XML guy”, rather than having a team appropriately
equipped with a uniform set of tools.</p>
<p >Of course, clearly my complaints are off base. Altova obviously
did appropriate research, and they determined that there <i>really</i> are
people and groups who’ll happily pay more for an XML editor than they paid for their
entire Visual Studio suite. </p>
<p >But come on, Altova – bring back a, err, “Semi-Professional”
version – something with XML schema and transformation authoring and validation
and nothing more. No grand vision where your product is the center point of a
developer’s existence. Put a reasonable price tag on it – like $59 – and I’m
sure you’ll get a lot of sales where right now you get none. I realize you probably 
have lots of big buildings with expensive lights, and layers and layers of bureaucracy 
to  finance, but don’t do it all on the back of a simple little XML utility.</p>]]></description>
		</item>
		
		<item>
		  <title>Fibonacci Numbers, Recursion, And Terrible Examples</title>
		  <link>http://www.yafla.com/dforbes/Fibonacci_Numbers_Recursion_And_Terrible_Examples/</link>
		  <guid>http://www.yafla.com/dforbes/Fibonacci_Numbers_Recursion_And_Terrible_Examples/</guid>
		  <pubDate>Fri, 22 Feb 2008 12:00:00 GMT</pubDate>
		  <description><![CDATA[<h4>Goto Considered Appropriate In Some Cases</h4>
                <p>One of the most referenced papers in software development has to be                     <a href="http://en.wikipedia.org/wiki/Edsger_Dijkstra">Dijkstra&#39;s</a> seminal 
                    paper titled &quot;Goto Statement Considered Harmful&quot;.</p>
                <p>Dijkstra didn&#39;t actually author the title, but instead it was the                     <a href="http://www.wordyard.com/2006/10/10/dijkstra-goto/">creation of an 
                    editor</a>  en route to being printed in an ACM publication. It was changed from its original 
                    title of &quot;A case against the goto statement&quot;. </p>
                <p>While the core essence of the essay is indeed that the goto statement can be 
                    harmful, Djikstra wasn&#39;t making an <i>absolute </i>statement (as is commonly 
                    claimed, and which is an absolutism tendency of far too many in this industry), but instead 
                    was commenting on the abuse of goto that was occurring in the industry, calling 
                    for a sober evaluation of where it is appropriate, but more importantly where it 
                    is not.</p>
                <p>Nonetheless, the meme was created and has been reused and abused in innumerable <i>
                     Considered Harmful </i>declarations since.</p>
                <h4>So...how <i>does </i>a C# 3.0 implementation of Fibonacci differ from a C# 2.0 version?</h4>
                <p>A month or so back the development webosphere was awash with references to
                    <a href="http://www.hanselman.com/">Scott Hanselman</a>&#39;s excellent blog, all 
                    excitedly linking (<i>rel=&quot;titillating&quot;</i>?) to his piece titled &quot;<a 
                        href="http://www.hanselman.com/blog/TheWeeklySourceCode13FibonacciEdition.aspx">The 
                    Weekly Source Code 13 - Fibonacci Edition</a>&quot;. This was particularly 
                    common 
                    in the .NET community, with many linkers describing it as an elucidating example of the 
                    many advantages of .NET 3.5 / C# 3.0.</p>
                <p>I perused the entry, always eager to absorb that sort of information, but found 
                    it less than perfect. I withheld critical comment, hoping it would all just blow away.</p>
                <p>Then this morning I opened up Visual Studio and happened to notice a link to his 
                    entry on the Start page.</p>
                <p align="center"><img src="http://www.yafla.com/dforbes/images/fibonacci.png" width="645" height="339" alt="Visual Studio 2008 Start Page" /></p>
                <p>Maybe it&#39;s been there for a while (the last date is pretty old) and I just didn&#39;t 
                    notice it before, but the title used on the Start page pushed me over the edge, 
                    coercing me to comment.</p>
                <h4>Recursion Considered Harmful</h4>
                <p>There are several issues I have with Scott&#39;s Fibonacci entry.</p>
                <p>First, the C# 2.0 (henceforth I&#39;m dumping the subversion precision on the language versions) 
                    version is oddly dumbed down: C# 2 <i>also</i> has ternary comparisons, and it 
                    even has anonymous functions (including closure functionality). Yet the 
                    demonstrations given contrast the simplest possible C# 2 implementation with the 
                    most obtuse C# 3 example.</p>
                <p>Basically the only novel difference with the C# 3 example is that it uses a 
                    lambda, though of course it would be an absolutely terrible thing to use a 
                    lambda for.</p>
                <p>It&#39;s not a very good example of the implementation differences between the 
                    versions, which is the claim made by the Visual Studio start page, and was the 
                    description often used during the dissemination of this piece.</p>
                <p>I like C# 3, but this isn&#39;t a good demonstration of any advantage of the 
                    language.</p>
                <p>Worse yet, the only place you&#39;ll ever see recursion used to calculate Fibonacci 
                    numbers is in &quot;<b>Recursion for Dummies</b>&quot; type examples. To understand why 
                    that is, consider Scott&#39;s C# 3 example, which he leads into with the statement &quot;<i>Now, 
                    here&#39;s a great way using C# 3.0</i>&quot;.</p>
                <p>Here&#39;s a logarithmic-scaled chart of the number of function calls necessary to calculate 
                    Fibonacci numbers in the C# 3 example Scott gave.</p>
                <p align="center"><img src="http://www.yafla.com/dforbes/images/the_horror.png" width="693" height="291" alt="The Horror!" /></p>
                <p>Obviously it gets unusable pretty quickly. Try calculating the 90th Fibonacci 
                    number using recursive algorithms...</p>
                <p>In the same way that Goto can be harmful, the use of recursion is often a sign of 
                    badness, and this is no exception. Epic inefficiency is used 
                    instead of the obviously simple approach.</p>
                <pre>long CalcFibonacciNumber(long n)<br />
{
    long current = 1, previous = 0, swapholder;
    while (n-- > 1)
    {
        swapholder = previous;
        previous = current;
        current += swapholder;
    }
    return current;
}
</pre>
                <p>(Ignoring mathematical shortcuts)</p>
                <h4>Unrealistic Examples Considered Harmful</h4>
                <p>A lot of readers will be rolling their eyes right about now, muttering something 
                    along the lines of &quot;<i>Awww, come on...you didn&#39;t <b>seriously </b>think anyone thought 
                    that recursion was a good way to calculate Fibonacci numbers, did you? This is 
                    beginner&#39;s stuff, and no one really thinks that&#39;s the right way to do it!</i>&quot; </p>
                <p>I&#39;m optimistic about the profession, so no, I didn&#39;t really think 
                    it was a serious example (though I do think it nonetheless deserves some serious warnings to 
                    ensure no one becomes misled).</p>
                <p style="margin-left:10em;margin-right:10em;align:center;border:solid 2px #FF8888;background: #FF4444;padding:0.3em;color:yellow; font-weight: bolder;"><b>WARNING:</b> The Code Contained In This Example Will Rot Your Brain. Never Do 
                    Something Like This In Real Life. Don&#39;t Let Peers See You Looking At Code Like 
                    This. Suspend All Critical Thought While Reading This Piece.</p>
                <p>Instead it&#39;s a sample of &quot;here&#39;s a demonstration of how to do something 
                    absolutely terrible &mdash; almost felony worthy &mdash; in a variety of programming 
                    languages....&quot;.</p>
                <p>This is still a serious problem.</p>
                <p>The example given is so very wrong &mdash; even if it is what&#39;s used in Recursion for 
                    Dummies books &mdash; that it makes it close to impossible to focus on the actual 
                    point being made, even if it had used comparable features of each language to 
                    demonstrate how the same task could be accomplished in each.</p>
                <p>It reminds me of many early web service tutorials and advocacy pieces: Many used 
                    absurd examples like &quot;a web service to add two numbers&quot; (and amazing variations 
                    such as subtract two numbers, multiply two numbers, divide two numbers, compute 
                    the Log10 of a number, and so on. You get my point &mdash; things for which a web service would be entirely unsuited).</p>
                <p><b>Stop it!</b> </p>
                <p>Stop with the ridiculous no-one-would-(or rather 
                    should)-ever-do-it-this-way examples. It completely undermines the value of the 
                    examples.</p>
                <p>Surely there are realistic examples that would be more appropriate for demonstrating 
                    the advantages of lambdas (recursion {is recursion}; [goto {is recursion}], so 
                    there isn&#39;t much enlightenment provided there). How about &quot;how to build a 
                    rudimentary regular expression parser in a variety of languages&quot;, or for a web 
                    service &quot;pulling weather data from a remote weather station&quot;. </p>
                <p>Something that a developer isn&#39;t going to have to slog through with their brain 
                    fighting them on every line, demanding an explanation for the terrible design or 
                    algorithm they&#39;re supposed to accept at face value.</p>
]]></description>
		</item>
		
		<item>
		  <title>Hardware Reviews</title>
		  <link>http://www.yafla.com/dforbes/Hardware_Reviews/</link>
		  <guid>http://www.yafla.com/dforbes/Hardware_Reviews/</guid>
		  <pubDate>Fri, 04 Jan 2008 00:39:00 GMT</pubDate>
		  <description><![CDATA[<p>To allow me to post quick and dirty reviews of hardware that I've used in home and in business &mdash; something I've 
    long wanted to do much more frequently, 
empowering searchers with another user's perspective to help guide their choices &mdash; I've set up a <a href="http://www.yafla.com/blogs/hardware-reviews">separate blog</a> (courtesy of this great new custom blog software). This will allow me to 
hash out and publish reviews without feeling that it's contrary to the direction or tone of this blog.</p>
<p>This carries on the original intent of my long unchanged <a href="http://www.yafla.com/rants/mini_reviews/index.htm">mini-reviews page</a>.</p>
<p>First up is a review of the <a href="http://www.yafla.com/blogs/hardware-reviews/Comstar_500gb_USB_RJ45_Ximeta_ND_Enclosure/" title="Comstar 500GB USB RJ45 / Ximeta ND USB Netdisk Enclosure">Comstar 500GB USB RJ45 / Ximeta ND USB Netdisk Enclosure</a></p>]]></description>
		</item>
		
		<item>
		  <title>2007 An Introspective Blog Year In Review</title>
		  <link>http://www.yafla.com/dforbes/2007_An_Introspective_Blog_Year_In_Review/</link>
		  <guid>http://www.yafla.com/dforbes/2007_An_Introspective_Blog_Year_In_Review/</guid>
		  <pubDate>Tue, 01 Jan 2008 22:00:00 GMT</pubDate>
		  <description><![CDATA[<p>
                            It’s been a quiet year, blogwise.</p>
                        <p>
                            It wasn’t unexpected.
                        </p>
                        <p>
                            Early 2007 saw the addition of my 3<sup>rd</sup> child (my second boy, 
                            giving me three children under five years old). I can’t overstate how much time 
                            and work goes into children, especially when they’re this young (every outing of 
                            any sort is a campaign of epic proportions). The reward is worth it a trillion 
                            times over, but it means that things like blogging tend to get sacrificed on the 
                            priority list, and the entries that do happen occur through creative time 
                            usage. Such as this one that’s being authored in my son’s room while I wait 
                            for him to fall asleep.</p>
                        <p><a href="http://www.flickr.com/photos/dforbes/2146964675/" title="Dinosaurs at the ROM by Dennis Forbes, on Flickr"><img align="right" vspace="8" hspace="8" src="http://farm3.static.flickr.com/2064/2146964675_3fd2a74839.jpg" width="333" height="500" alt="Dinosaurs at the ROM" /></a>
                            Add the fact that I’d switched from running a mostly one-man consulting company 
                            (which was yafla’s former purpose, providing business justification for the time 
                            spent on every entry – they were gaining eyeballs, clients, PageRank, 
                            professional credibility, and so on for consulting and development 
                            opportunities) to instead dedicating my time and energies exclusively to one 
                            client.</p>
                        <p>
                            My mental efforts these days are focused on an amazing New York City back-end 
                            financial services company, imagining and building the next generation of 
                            software for the industry. While it is very rewarding professionally and 
                            financially, basic professional courtesy and confidentiality restrictions limit 
                            how much I can discuss the discoveries, trials and tribulations of that 
                            adventure.</p>
                        <p>
                            So where does material come from then? Much of the wisdom I had to dole out had 
                            been exhausted earlier in the lifecycle of this blog (all bloggers have a finite 
                            amount of accumulated wisdom to espouse before they start recycling, or worse 
                            outsourcing, content. Beware any blogger that operates on a schedule, because 
                            their creation will almost certainly be vacuous or intellectually stolen tripe). 
							I've since accumulated a lot of observations and suggestions about mixing work and
							family life in this industry, and at some point I need to put virtual pen to virtual 
							paper, however the low hanging fruit material has already been stored in the 
							archives.</p>
                        <p>
                            When I agree with things I’ve read and seen elsewhere, I don’t see much point in 
                            a toss-off “I agree” post, so instead the limited content was usually seemingly 
                            negative – where I disagreed with something or someone. Like most people 
                            (excluding cults and fan clubs), I’m more motivated by disagreement than 
                            agreement, so it inspired the extra effort to find a moment to author a post.</p>
                        <p>
                            Lacking the opportunity to post normal posts to balance things out, it gives an 
                            unsavory “critic” feel to the blog, which was never my intent.</p>
                        <p>
                            There is hope, however!</p>
						<p>With the dawn of a new year, yafla is going to gradually (but 
                            immediately) start morphing into something new (this isn’t a new year's 
                            resolution or anything of that sort, but was the planned timeline all along). 
                            For far too long I’ve sat on the sidelines waiting for the
                            <i style="mso-bidi-font-style:normal">perfect </i>idea for casual development to 
                            reuse a relatively well-ranked domain. Realizing that is a self-defeating bar, 
                            I’ve decided to go with an imperfect but viable secondary option.</p>
                        <p>
                            So where is it going? Failing a market segment categorization, let’s just say 
                            Slashdot * Digg ^ Wikipedia * Reddit + StumbleUpon + Delicious ^ Blogger. There 
                            are a million and one competitors in this space already, but I’m targeting 
                            something special, implementing ideas that have clattered around in my head 
                            since the early Slashdot era (having one’s carefully crafted, timely submissions 
                            rejected by a Slashdot editor was undoubtedly the impetus behind the creation of 
                            a lot of the follow-up sites).</p>
                        <p><a href="http://www.flickr.com/photos/dforbes/2044432570/" title="Daughter Playing in Leaves by dennis_forbes, on Flickr"><img src="http://farm3.static.flickr.com/2399/2044432570_132d8a449d_m.jpg" width="240" height="160" align="right" hspace="8" vspace="8" alt="Daughter Playing in Leaves" /></a>
                            In a nutshell, the yafla realization will be quality above quantity, and value 
                            above distraction (I have no intent of catering to the crowd using it to avoid 
                            work. I want to cater to the people using it to further their pursuits, whatever 
                            they are pursuing, not to avoid life.) The differentiator will be the people 
                            empowered by the analytics, bringing a special perspective to information 
                            coalescence.</p>
                        <p>
                            It’s going to start terribly and hackishly (a transparent, ultra-agile work in 
                            progress), and will probably be ignored and seldom used for a while after 
                            inception, but it will at least give me comfort that something is being done 
                            with the domain, and will most certainly provide unencumbered source material 
                            for the blog.</p>
                        <p>
                            Let’s see what the new year brings.</p>]]></description>
		</item>
		
		<item>
		  <title>Benchmark Driven Development - Lies, Damn Lies, and Benchmarks</title>
		  <link>http://www.yafla.com/dforbes/Benchmark_Driven_Development/</link>
		  <guid>http://www.yafla.com/dforbes/Benchmark_Driven_Development/</guid>
		  <pubDate>Fri, 21 Dec 2007 08:00:00 GMT</pubDate>
		  <description><![CDATA[<h4>
                    <i>“What gets measured gets done.”</i></h4>
                <p>I decided to take the new SunSpider benchmarks for a spin, generating the pretty graphs found down below. Benchmarks are 
					always entertaining, and it was enjoyable comparing the numbers yielded under various conditions (turning SpeedStep on and off [none 
					of the benchmarks loaded the CPU long enough for it to bother raising up from its lowered power, 66% performance relaxation state], setting CPU affinity, running it on different PCs, 
					trying different build options on my Firefox build, etc.)</p>
				<p>
                    "Why benchmark at all?" one might ask. Simple: If you find the right measures, the common wisdom goes, the inputs to the measure
                    will improve as the various players work to improve the metrics.</p>
                <p>
                    Whether you’re measuring bugs per developer, 
                    <a href="http://www.yafla.com/dforbes/The_Most_Destructive_Metric_in_Software_Development">lines-of-code</a>, widgets per hour…whatever:
                    Start measuring it and invariably it’ll start moving in the desired direction, whether
                    this actually serves your end goal or not. Often such initiatives come at the cost
                    of the unmeasured, but over time it adapts and starts serving as a beneficial feedback.</p>
                <h4>The Assembly Line Benchmark - Widgets per Hour</h4>
				<p>
                    <img src="http://www.yafla.com/dforbes/images/menial_work.jpg" width="160" height="200"
                        alt="The Widget" align="right" />During the summer in my late teens I worked
                    on an assembly line building car parts (pieces that played some sort of role in
                    the air conditioning system – basically widgets): Put a little bracket in a metal
                    cylinder, add a circle of fiberglass, inject some desiccant beads using a machine,
                    add another fiberglass circle and another metal bracket to hold it all in place
                    and then put it in another machine that squashed another cylinder onto the top.
                    Then I sent it down the line to the welder.
                </p>
                <p>
                    Atop my machine sat a little counter that monitored my progress, carefully recording
                    every piece assembled. While this was a less advanced era &mdash; being the prehistoric
                    early 90s and all &mdash; and I had to manually transfer the final count to my timecard
                    for submission, every worker was kept somewhat honest by the metrics submitted by
                    the other workers on the line.
                </p>
                <p>
                    Clearly I couldn’t have done 2000 parts in a day if the people before me and behind
                    me in line only reported 1000, for instance, and vice versa.
                </p>
                <p>
                    Coupled with continuous, careful QA tests and random inspections (performed by people who had their own 
                    metrics to work towards), this struck me as an excellent system because it was
                    difficult or impossible to game, and the onerous checks ensured that it didn’t come
                    at the expense of quality.
                </p>
                <p>
                    It certainly worked wonders on me, as I wiled away the endless summer days performing
                    the most awesomely brainlessness of tasks by competing with my own personal
                    productivity “records”, endlessly trying to push out more quality parts per hour
                    day after day.
                </p>
                <p>
                    I was there and had nothing better to do, and that little counter sat looking down
                    on me, mocking me. It dared me to do just a couple more pieces per hour, and I willingly
                    complied.</p>
                <p>
                    Somewhere a paper pusher and cackling middle manager would sum up the part 
                    counts and rub their hands together in giddy glee, eager for my zombie-state 
                    quest for worth to pad their bonus cheques.</p>
                <p>
                    It’s good I was a summer employee, because my pace didn’t make me friends on the
                    line.</p>
                <p>
                    Test Driven Development tries to create a similar spirit of metrics, giving you
                    a goal to strive for as you build out your product. It’s a comforting bit of feedback
                    when all of the TDD tests come back with green checkmarks. The more tests you create,
                    the higher the absolute count of passes you can brag about when the product sails
                    through with flying colors, easily passing 497 of the 497 tests.</p>
                <p>
                    Performance benchmarks serve the same purpose for the performance and efficiency
                    domain.</p>
                <p>
                    Consider the initial hardware-accelerating video cards for Windows. Early on they
                    seemed to have little or no purpose, and were almost abstract to users. Then benchmarks
                    started appearing, giving the manufacturers something to strive towards while also providing
                    end users with an easy way to compare and choose amongst the options. “Card {A} can only do 10,000,000 accelerated
                    rectangles per second, while card {B} can do 12,000,000. Clearly we need to get
                    card {B} for our rectangle displaying needs.”</p>
                <h4>
                    Gaming the Metrics<img src="http://www.yafla.com/dforbes/images/speedstar24x.jpg" width="304" height="252"
                        alt="Diamond Speedstar 24x" align="right" /></h4>
                <p>
                    Of course some vendors started gaming the metrics in various creative ways (see Joel's <a href="http://www.joelonsoftware.com/items/2006/08/09.html">excellent essay</a> on poorly thought out metrics). Several
                    created products that actually recognized running benchmarks in hardware, “optimizing”
                    (by any means possible, including simply discarding many of the benchmark commands,
                    knowing the end user will never notice if every second rectangle or rendered text
                    of the millions per second isn’t being rendered). Worse, the benchmarks were so
                    atrociously artificial, bearing little similarity to actual everyday use that the
                    direction of progress was to optimize the performance of benchmarks, often to the
                    detriment of everyday use.</p>
                <p>
                    Eventually the benchmarks matured, getting better and more realistic, and the gaming was prevented or embarrassingly
                    heralded, and it became a hugely beneficial tool in the march forward in the field.
                    Various games have served the benchmarking role, the Doom and then Quake series
                    being the most influential.</p>
                <p>
                    In the browser market, the growing interactivity of the web and the renewed competition
                    amongst the big competitors has seen a flurry of benchmarks being widely discussed
                    and debated, stereotyping each of the browsers into performance ghettoes. “Firefox
                    is sooooo slow….” “IE is garbage. Opera is super speedy!”</p>
                <p>
                    Having some real tests is of obvious benefit to “set the record straight”, not to
                    mention that it provides a carrot for the competitors to chase. Exactly that happened
                    with me a while back when I came across a <a href="http://mckoss.com/jscript/SpeedTrial.htm">
                        string concatenation benchmark</a>, <a href="http://www.yafla.com/dforbes/String_Concatenation_and_Immutable_Strings_Speeding_Spidermonkey/">
                            so I went in and streamlined the piece of Firefox code specifically impacted by
                            that benchmark</a>. My change in place, Firefox indeed did much better on
                    that specific benchmark, though the real-world benefit was negligible.</p>
                <p>
                    In many ways the various web benchmarks available reminds me of the early accelerated video card
                    benchmarks: Crude, having little or no correlation with the pain points of real-world
                    use, and opportune for gaming and false evangelism.</p>
                <h4>
                    WebKit&#39;s SunSpider</h4>
                <p>
                    Which brings me to the recently released <a href="http://webkit.org/perf/sunspider-0.9/sunspider.html">
                        SunSpider</a> benchmark (which is a credible contender for the widely coveted “most
                    poorly chosen project name” award: It’s bad enough that an Apple project uses “Sun”
                    in their product name, but it&#39;s thrice as bad when it’s a project related to
                    JavaScript – JavaScript being another nominee).
                </p>
                <p>
                    SunSpider is very easy to run and gives quick feedback, so quite a few charts and
                    graphs have been sprouting on blogs across the land.</p>
                <p>
                    JavaScript/DOM performance is a huge concern right now, as web applications are
                    growing in richness by leaps and bounds, so there is definitely a need to be filled.
                </p>
                <p>
                    Will SunSpider be what we&#39;ve all been looking for?</p>
                <p>
                    Here’s just such a graph, charting the stacked benchmark runtime for the current tier-1 browsers for Windows.</p>
                <p style="text-align: center;">
                    <img src="http://www.yafla.com/dforbes/images/benchmark1.png" width="696" height="550"
                        alt="SunSpider Benchmark Results" /></p>
                <p>
                    Benchmarks were performed on a 4GB, Q6600 quad-core Core 2 processor machine running
                    Vista x64. Firefox 3 was <a href="http://www.yafla.com/dforbes/A_Build_Process_That_Works_The_Fabulous_Firefox/">
                        built from the current CVS</a> (as of this morning). The Y-axis represents milliseconds.</p>
                <p>
                    Such a benchmark provides immediate feedback regarding the biggest bang for the
                    buck optimization, at least in regards to improving the runtime of this particular
                    benchmark. For IE 7 it is pretty clear that the benchmark killer is the bizarre
                    and repeated use of string concatenation throughout the benchmark tests, particularly evident
                    in the string-base64 and string-validate benchmark.</p>
                <h4>
                    Naive String Concatenations</h4>
                <p>
                    After approximately 20 seconds (okay, maybe 22 seconds) &quot;optimizing&quot; the 
                    <a href="http://www.yafla.com/dforbes/files/string-base64.html">base64</a> and 
                    <a href="http://www.yafla.com/dforbes/files/string-validate-input.html">validate</a> tests to use the
                    <i>extremely</i> common 
                    <a href="http://www.softwaresecretweapons.com/jspwiki/javascriptstringconcatenation">Array push/toString idiom</a> 
                    that is used on pretty much any page that does more than the most trivial of 
                    string operations (my changes were rash and very simplistic, though if I were 
                    motivated — if this were production code — I could do a much better job with 
                    it), the performance had changed rather dramatically, as seen in the following 
                    graph (scroll up and down for dramatic flair).</p>
                <p style="text-align: center;">
                    <img src="http://www.yafla.com/dforbes/images/benchmark2.png" width="696" height="544"
                        alt="SunSpider Benchmark Results" /></p>
                
               <p>It&#39;s late and I&#39;m tired, but I&#39;d guarantee that I could dramatically decrease the 
                   remaining largest test -- string tagcloud -- but I think the point is proven.</p>
                <p>Some will naturally draw from this the presumption that I&#39;m just an Internet 
                   Explorer 7 fan, desperately manipulating the benchmark to best fit the strengths 
                   and avoid the weaknesses of my favourite browser. </p>
                    <p><a href="http://www.yafla.com/dforbes/Why_Internet_Explorer_7_Shouldnt_Matter/">
                        They&#39;d be wrong</a>.</p>
                    <p>My browser of choice is Firefox. Not only do I not find the featureset of 
                        Internet Explorer 7 uncompelling and anemic compared to a naked copy of Firefox 
                        (not evening considering the <i>enormous</i> functionality offered by add-ins, such as the extraordinary <a href="https://addons.mozilla.org/en-US/firefox/addon/1843">Firebug</a>), I find 
                        the performance of Microsoft&#39;s offering to be <strong>atrocious</strong> on <i>real-world</i> websites. </p>
                    <p>I don&#39;t like Internet Explorer on technical grounds, and I like it even less 
                        given the concerning conflict of interest it represents.</p>
                    <p>Perhaps I&#39;m just bearing a grudge. </p>
                    <p>We&#39;re currently implementing a very rich, advanced web application, and one thing 
                        that we&#39;ve found, in case after case, is that in real-world situations with 
                        extensive DOM manipulation and production JavaScript, Internet Explorer stumbles 
                        and groans under the load, while competing browsers complete the task with gusto 
                        (just rendering a dynamically loaded complex table takes 20x or more on IE than 
                        in Firefox 2. The disparity grows greater with Firefox 3). It's to the point that 
                        I can&#39;t help but wonder if Microsoft is trying to undermine the whole web thing 
                        intentionally, hoping to encourage the middle-grounders to hoard to the boards 
                        proclaiming the deficiencies of web apps, manipulated into begging for some XAML goodness.</p>
                    <p>So if I wasn&#39;t looking to defend IE7, what was my point?</p>
                    <h4>Lies, Damned Lies, and Benchmarks</h4>
                    <p>Maybe the motivations of the team behind this benchmark were noble, and they 
                        weren&#39;t blinded into naturally biasing the benchmark towards their own project, 
                        but I can&#39;t help but see this benchmark as an entirely artificial, naive, 
                        unrealistic benchmark that adds little to the benchmarking landscape. A cursory 
                        glance through the benchmark sees bizarre oddities that would never appear in 
                        real-world code, and a variety of implementation choices that are questionable for a benchmark (for instance test/sample 
                        data is often constructed within the timed scope of the benchmark in the 
                        SunSpider tests, as if a production website needs to create 4000 random email 
                        addresses and ZIP codes, for instance. Normally such data is constructed outside 
                        of the timed loop, for obvious reasons).</p>
                    <p>The lack of weighting, the lack of realistic test scenarios... I&#39;m just not 
                        convinced that it holds much utility (though I do like the way they have the 
                        &quot;driver&quot;, and the elegant and clean client-side way they aggregate the test 
                        values, and do the same for comparison. The framework is a great foundation) for cross-browser comparison. I can see use 
in analyzing performance differences for a single browser (the results turning Firebug on and off, for instance, were very surprizing), just not as a valid comparison
between different browsers.</p>
                    <p>Just as I dramatically changed the IE results in less than a minute of code 
                        changing, I&#39;d guarantee that I could do the same with the other outliers (in 
                        particular the longer Firefox tests).</p>
                    <p>I&#39;m still waiting for a good, real-world benchmark. Something that simulates 
                        sites like Digg, Slashdot, Facebook, interacting with them in a way that a real 
                        world user really would.</p>]]></description>
		</item>
		
		<item>
		  <title>Picking A Side In The HD-DVD vs Blu-ray War</title>
		  <link>http://www.yafla.com/dforbes/Picking_A_Side_In_The_HD-DVD_vs_Blu-ray_War/</link>
		  <guid>http://www.yafla.com/dforbes/Picking_A_Side_In_The_HD-DVD_vs_Blu-ray_War/</guid>
		  <pubDate>Fri, 07 Dec 2007 17:09:00 GMT</pubDate>
		  <description><![CDATA[<p>I'd been sitting on the sidelines of the HD-DVD vs. Blu-ray spectacle, reluctant to sink cash into either hardware 
or media until the dust settled and one victor remained.</p>
<p>I&#39;m hardly alone in this sentiment: No one wants an expensive piece of hardware 
sitting unused, or a media collection that is only playable on the one TV down 
in the basement (after reconnecting the derelict player that had been 
disconnected to free an HDMI port). </p>
<p>Sales had been relatively slow for standalone players. </p>
<p>Instead the most successful uptake of the new formats has been via the Sony PS3 
and its built-in Blu-ray player (Sony is the principal backer and beneficiary of 
Blu-ray), accounting for a hefty percentage of deployed Blu-ray players 
worldwide, whether their owners know that they&#39;re being counted as faithful 
Blu-ray fans or not. For those who were aware of the feature, I&#39;m sure it helped 
them justify the purchase to their parents/wives/husbands: &quot;But it&#39;s also a next 
generation DVD player!&quot; (Countless PS2s were sold on the justification that it 
could double as a somewhat mediocre DVD player). </p>
<p align="center"><img src="http://www.yafla.com/dforbes/images/blu-ray_hd_dvd.jpg" alt="HD-DVD vs Blu-ray" width="200" height="170" /></p>
<p>This vaulted Blu-ray into an early lead considering that Microsoft, despite being 
an HD-DVD backer, didn&#39;t incorporate HD-DVD into the XBox 360 -- there remains 
widespread confusion about this -- instead offering it later as an add on 
player. </p>
<p>The boards filled with the Blu-ray faithful, hopeful that they could help the format succeed 
to vindicate their purchase justification.</p>
<p>Not wanting a PS3, the motivation to upgrade just wasn't as strong as it was for, say, 
the desire to move from VHS to DVD. While the new formats technically offer improved resolution, and a much better video compression 
technology (greatly reducing irritants like posterization in dark sections), the 
improvement isn&#39;t dramatic compared to standard DVD run through a competent 
upscaling DVD player. Audio has theoretically improved on the new formats, but 
given the sparse availability of DTS-encoding movies on DVD media -- DTS being 
the higher quality alternative to Dolby Digital -- the audio capabilities of DVD 
was barely exploited at all already, so I don't expect much real improvement with 
the new formats, beyond looking better on paper.</p>
<p>The interactivity features of the platform have improved (even seemingly trivial 
things like accessing the chapter guide while the movie continues to play, the 
chapter guide translucently overlaid), but until the media makers start fully 
leveraging it, and unless you are the sort to draw a lot of value from the 
extras, that isn&#39;t a major selling point. DVD was a huge convenience win over 
VHS, with random access and no be-kind-rewind demands, but the new formats are 
just minor improvements over what we already have.</p>
<p>Which brings me to my recent desire to buy an upscaling DVD player, desiring a 
unit that interpolated more elegantly to HDTV resolutions.</p>
<p>Then I came across a Toshiba HD-DVD HD-A3 player for less than $200 (with 2 free 
HD-DVDs in the box, and another 5 via a mail in form).</p>
<p align="center"><img src="http://www.yafla.com/dforbes/images/toshiba_hd_a3.jpg" alt="Toshiba HD-A3" width="368" height="119" /></p>
<p>So I picked sides, and chose HD-DVD. I&#39;ve thus declared fealty to the format, and 
will now order the loyal minion t-shirt and ballcap, and debate the point 
passionately whenever the opportunity arises!</p>
<p>My purchase justification goes as follows-</p>
<ul>
<li>It&#39;s cheap. Really cheap. Comes with a couple of movies as well, which is nice. 
It doesn&#39;t have every feature, but it&#39;s a good start. [For instance it&#39;s missing 
1080p, but that didn&#39;t disuade me: 1080p happens to be one of the most oversold, 
misrepresented features trumpeted today. I&#39;d much rather have 1080/24]<br />
</li>
<li>We&#39;ll still be largely watching traditional DVDs, with the odd HD-DVD rented 
from <a href="http://www.zip.ca">zip.ca</a>. I&#39;m not going to cry any tears that 
some companies have been bribed or coerced into only supporting one format or 
the other -- I'll just go with the standard DVD option.<br />
</li>
<li>It&#39;s a really, really good upscaling DVD player, so I&#39;m completely satisified 
with the purchase even without playing next-generation media. If Blu-ray was 
victorious and tossed the HD-DVD consortium into the dustbin of history, I 
wouldn&#39;t have purchase regret (I would feel quite differently if bought one of 
the $700 players).<br />
</li>
<li>The storage differential between the two formats is irrelevant for the 
prescribed use. While the greater capacity of Blu-ray is a win if you want it as 
a backup format for a PC, it isn&#39;t pertinent for a 4 hour VC1-encoded motion 
picture with top quality audio and sound. Indicative of this is the fact that 
quite a few Blu-ray releases have been encoded with the vastly inferior MPEG2 
codec, wasting the extra space to use an obsolete compression technology.<br />
</li>
<li>In a few years, this will all be moot anyways, as streaming technology and 
capacity improves. Ultimately these are holdover technologies.</li>
</ul>
<p>
I still don&#39;t plan on amassing a media collection, but I have been enjoying the 
higher quality rentals -- when a given release is available on HD-DVD -- for 
just a small premium over a decent upscaling DVD player.</p>]]></description>
		</item>
		
		<item>
		  <title>Mainstream Gaming Goes Multicore</title>
		  <link>http://www.yafla.com/dforbes/Mainstream_Gaming_Goes_Multicore/</link>
		  <guid>http://www.yafla.com/dforbes/Mainstream_Gaming_Goes_Multicore/</guid>
		  <pubDate>Fri, 16 Nov 2007 16:45:42 GMT</pubDate>
		  <description><![CDATA[<p>The just released first-person shooter <em><a href="http://www.callofduty.com/">Call of Duty 4</a></em> hit store shelves a couple of weeks ago, targeting a variety
    of platforms, <a href="http://www.yafla.com/dforbes/An_Unimportant_Collection_of_Slightly_Buggy_Device_Drivers/">
        surprisingly</a> including the PC. I grabbed a copy to supplement my Battlefield
    2 outings -- I still enjoy the odd late-night frag-fest to ease me gently into sleep.</p>
       <p>
           I was pleased to find it priced at &lt;$50 at my local electronic superstore: 20
           years ago, <a href="http://www.youtube.com/watch?v=cl5iWQOojvk">terrible games</a>
           for a ColecoVision cost $70-$80, so it's amazing to pay less for such an incredible
           product. It's even more amazing after factoring in 20 years of inflation.</p>
       <p>
           CoD4 is a remarkable feat of software engineering, demonstrating significant technical
           excellence. As a business-class software developer, it's a bit humbling. It's pretty
           clear that the team is extraordinarily capable. The game is riddled with remarkable
           details that are easy to miss, but they're so impressive you're surprised that they
           didn't stop the action and highlight it to make sure the player savoured every laboriously 
		   created effect.</p>
       <p>
           Probably worth mentioning that
           It also happens to be a lot of fun to play!</p>
       <p>
           Featuring unparalleled visuals, <em>incredibly </em>intense combat, an interesting
           and immersing storyline, and a lot of gameplay variety, the single player game has
           been a pleasant surprise. I usually skip the often trite single-player games in
           first-person shooters, heading directly online for some multiplayer combat. For this one the single-player game
           has captured every moment of the few chances I get to game.</p>
       <p>
           It isn't a perfect game, though. Like many games in the genre, the player is tightly
           coralled along a heavily orchestrated path (standing in stark contrast with even
           dated games like Operation Flashpoint, which allowed the player to basically do
           whatever they wanted within the confines of the island). The game features invisible
           triggers that cause predictable outcomes: When I pass this line the two guys will
           appear behind that door, and then I'll move right and the guy will run out at the
           top and the five guys will march in the door at the end of the hall.
       </p>
       <p>
           It does randomize to a small degree, but I can't imagine that there's a lot of replayability.</p>
       <p>
           One noteworthy attribute of the PC version -- what inspired me to write about it
           on here given the various entries about quad-cores over the past while -- is its ability to scale out across multiple
           cores. The following is a graph of CPU usage on my otherwise unladen quad-core
           PC.</p>
       <p style="text-align:center"><img src="http://www.yafla.com/dforbes/images/call_of_duty4.png" alt="Call of Duty 4 Multicore CPU Usage" width="840px" height="525px" />
           </p>
       <p>
           The drop-off at the end was the period of time while it switched out to the desktop
           so I could take a screenshot of the task manager. While actual gameplay was underway,
           the application consumed about 75% of 3 cores at times, peaking up to 75% on the
           fourth core, using this to apply the physics model used extensively throughout the
           game. Further evidence of the technical excellence is the fact that they didn't
           just spin out threads for each core and then busy wait for the duration (which would
           have fixed each at 100%) -- as many games sadly do (Netscape Navigator's download
           manager used to do that) -- but instead they have some finite amount of calculations
           they perform and then they properly yield to any other tasks on the system that
           might have work to do.</p>
       <p>
           A brilliant game, making great use of modern hardware.</p>]]></description>
		</item>
		
		<item>
		  <title>Virtuous Vista - Taking the x64 Plunge</title>
		  <link>http://www.yafla.com/dforbes/Virtuous_Vista_Taking_The_x64_Plunge/</link>
		  <guid>http://www.yafla.com/dforbes/Virtuous_Vista_Taking_The_x64_Plunge/</guid>
		  <pubDate>Mon, 12 Nov 2007 18:00:00 GMT</pubDate>
		  <description><![CDATA[
<p>Some recent hardware upgrades left one of my PCs in a fragile state: While I had
    managed to avoid the time sucking irritation of an OS reinstall over generations
    of hardware changes, the latest hardware swaps -- or rather wholesale migrations
    -- pushed the crufty stack of refusing-to-vacate legacy drivers and confused minibuses
    over the edge.</p>
       <p>
           It had become a fragile platform, with frequent crashes and unexplained behaviour.
       </p>
       <p>
           Not surprising, given that the OS install had seen the platform go through a myriad
           of trasitions, including from a VIA chipset to an nforce chipset to a VIA chipset
           and then back to an nforce chipset; from nvidia to ATI to nvidia graphics.
       </p>
       <p>
           Really it had dealt with change remarkably well, at least relative to the tradition
           of Windows being tightly bound to the installation hardware, with the slightest
           deviation demanding a reinstall.</p>
       <p>
           Like many users, I'd been avoiding Vista. Actually that isn't entirely true: It
           wasn't that I was <em>avoiding </em>Vista, but rather that the benefits it offered
           just weren't compelling. Not compelling enough to reinstall a working system, or
           even to deal with the inevitable <em>dev team just had to move stuff around to set their
               fingerprint </em>search for traditional features<em>.</em></p>
       <p>
           When <a href="http://www.microsoft.com/windows/products/windowsvista/features/details/flip3D.mspx">
               Flip 3D</a> is a highlighted feature, you know that things can't be that great.</p>
       <p>
           Nonetheless, given that a rebuild was in order anyways, and given that a professional 
           in this field should generally ride the leading the edge of technology (though nothing 
		   like the days of old -- once upon a time we had to eagerly consume
           every Microsoft beta as a necessity for job security, whereas nowadays technologies
           like WPF are a complete and utter non-issue in the general tech industry), I figured
           I'd force myself to embrace Vista, warts and all.
       </p>
       <p>
           I'd eat my industry's dog food.</p>
       <p>
           To make things more interesting, I decided to go full bore and install the <a href="http://www.yafla.com/dforbes/Microsoft_Timing_Kung_Fu_or_Captive_Audience/">
               x64 version of Vista</a>. I had a <a href="http://www.yafla.com/dforbes/The_Legacy_PC_Gets_An_Upgrade_to_a_Quad_Core_CPU/">
                   fully 64-bit capable processor</a>, and despite only having 2GB of RAM (with
           two slots eagerly waiting to be populated), it would nonetheless allow me to start
           playing around with the extended x64 instructions and registers.
       </p>
       <p>
           x64 is much, <em>much </em>more than just bigger pointers, so I wanted to <a href="http://developer.amd.com/article_print.jsp?id=13">
               play around with them</a> in my favourite development environment (like many
           such transitions, it will take a few years before the benefits of x64 are fully
           realized, though in the .NET world the 64-bit runtime immediately takes advantage
           of the new features for platform neutral assemblies.)</p>
       <p>
           The install and transition went very well. While I had to disable UAC quickly to
           make the experience marginally pleasant (I'd experienced Vista enough in dual-boots
           and virtual machines to quickly learn to despise this security "feature"), generally
           it just went well.
       </p>
       <p>
           On the modern nforce4-based motherboard (featuring onboard sound and networking,
           all drivers installed by the single package of nvidia drivers), with a Q6600 quad-core
           processor and contemporary nvidia video card, everything simply worked after running
           a couple of driver packages. Even my dual-layer DVD burner just worked. All of the
           attached Canon printers, including the multifunction with faxing and scanning, auto-installed
           and immediately worked. Visual Studio 2005 worked great with the Vista patch, and
           while it's a 32-bit app it capably generates great 64-bit builds. Awesome!</p>
       <p>
           Now I had IIS 7 to play around with, getting ready for the same in the server sphere.
           The integrated pipeline and <a href="http://www.yafla.com/dforbes/XCopy_and_IIS/">web.config
               based configuration </a>really is a wonderful step forward for the platform.</p>
       <p>
           Several things didn't work. CameraWindow won't work with my Canon Digital Rebel
           XT, though by switching to PictBridge on the camera I found that Vista itself did
           a great job downloading and organizing the photos (and Windows Photo Gallery is
           a universe better than the <em>terrible </em>"Picture and Fax Viewer", not just
           for navigating and organizing photos, but moreso because the venerable XP viewer
           did a horrible job resizing photos for display at monitor resolutions, managing
           to make great shots look terrible). The bundled burning software that came with
           my DVD drive wouldn't install, but I was delighted to find that Vista actually had
           pretty decent burning capabilities built in, competently writing 9GB backups to
           my DL discs.</p>
       <p>
           I hadn't really exploited the benefits of the 64-bit address space at this point,
           but then I booted up a copy of Battlefield 2 for some late night mental-diversion
           fragging.</p>
       <p>
           Imagine my surprise when this game that ran very well on a vastly less powerful
           1GB XP system now yielded frequent stutters while significant memory paging occurred. Despite
           having twice the RAM to draw from in the rebuilt machine (if you add in the system
           baseline, it really had about 2.7x as much RAM to draw from), somehow it was now
           hitting the ceiling on a machine that was almost completely dedicated to it.</p>
       <p>
           So I grabbed 2GB more PC6400 DDR2 from a local retailer, plugged it in, and with 4GB everything is running pretty
           smoothly. Another $120 to upgrade the memory to have the same experience that I
           had with 1/4 the memory in XP.</p>
       <p>
           Vista was hardly a surprise to me given that I'd been playing with it in various
           forms since the Longhorn days, and the technical feature list is entirely underwhelming
           compared to the early vaporware promises, however it isn't the travesty many are
           making it out to be. While it definitely needs work, it isn't going anywhere, and
           Microsoft isn't going to rollback to XP.</p>
       <p>
           If you have modern, supported hardware, Vista x64 is a solid choice.</p>
]]></description>
		</item>
		
		<item>
		  <title>The Templates Behind The New Blog Engine</title>
		  <link>http://www.yafla.com/dforbes/The_Templates_Behind_The_New_Blog_Engine/</link>
		  <guid>http://www.yafla.com/dforbes/The_Templates_Behind_The_New_Blog_Engine/</guid>
		  <pubDate>Tue, 06 Nov 2007 12:00:00 GMT</pubDate>
		  <description><![CDATA[<p>I <a href="http://www.yafla.com/dforbes/The_New_Blog_Software_Goes_Live/">recently opted to throw together 
my own blog software</a> (after going through the standard <a href="http://www.yafla.com/dforbes/Build_Buy_or_Uncertainty_The_Great_Dilemma_of_Software_Development/">Build or Buy analysis</a>), 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 <a href="http://www.yafla.com/dforbes/Tidy_Your_HTML_with_The_Pragmatic_Impurity_of_NET/">cast content out 
from the blog to a static form</a>), 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).</p>
<p>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.</p>
<p>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).</p>
<p>So I had to build a basic templating system, yielding the templates that follow. The first for HTML output--</p>
<pre>
&lt;!DOCTYPE html PUBLIC &quot;-&#47;&#47;W3C&#47;&#47;DTD XHTML 1.0 Transitional&#47;&#47;EN&quot; 
   &quot;http:&#47;&#47;www.w3.org&#47;TR&#47;xhtml1&#47;DTD&#47;xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http:&#47;&#47;www.w3.org&#47;1999&#47;xhtml&quot; xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text&#47;html; charset=utf-8&quot;&gt;&lt;&#47;meta&gt;
&lt;title&gt;{#blog.Title} {#docTitle}&lt;&#47;title&gt;
&lt;link rel=&quot;stylesheet&quot; type=&quot;text&#47;css&quot; media=&quot;screen, projection&quot; 
   href=&quot;http:&#47;&#47;www.yafla.com&#47;dforbes&#47;style&#47;css&#47;blog.css&quot;&gt;&lt;&#47;link&gt;
&lt;script type=&quot;text&#47;javascript&quot; src=&quot;http:&#47;&#47;www.haloscan.com&#47;load&#47;dforbes&quot;&gt; &lt;&#47;script&gt;
&lt;&#47;head&gt;
&lt;body&gt;
&lt;div class=&quot;clsHeader&quot;&gt;
&lt;div class=&quot;clsBlogHeader&quot;&gt;&lt;a href=&quot;{#blog.BaseUrl}&quot;&gt;{#blog.Title}&lt;&#47;a&gt;&lt;&#47;div&gt;
&lt;div class=&quot;clsSubheader&quot;&gt;{#blog.Description}&lt;&#47;div&gt;
&lt;&#47;div&gt;
&lt;div class=&quot;clsBody&quot;&gt;
{foreach $entry in $entries}
&lt;div class=&quot;clsEntry&quot;&gt;
   &lt;div class=&quot;clsDate&quot;&gt;{#entry.EntryContent.PublishDateUTC|dddd, MMMM dd yyyy}&lt;&#47;div&gt;
   &lt;div class=&quot;clsTitle&quot;&gt;&lt;a href=&quot;{#entry.Permalink}&quot;&gt;{#entry.EntryContent.EntryTitle}&lt;&#47;a&gt;&lt;&#47;div&gt;
   &lt;div class=&quot;clsBody&quot;&gt;{#entry.EntryContent.EntryContent}&lt;&#47;div&gt;
   &lt;div class=&quot;clsKeywords&quot;&gt;{foreach $keyword in $entry.EntryKeywords}&amp;nbsp;
      &lt;a href=&quot;{#blog.BaseUrl}{#keyword.KeywordText|escape}&quot;&gt;{#keyword.KeywordText}&lt;&#47;a&gt;&amp;nbsp;{&#47;foreach}
   &lt;&#47;div&gt;
   &lt;div class=&quot;clsPermalink&quot;&gt;
      &lt;a href=&quot;javascript:HaloScan('{#entry.MappingId}');&quot; target=&quot;_self&quot;&gt;
      &lt;script type=&quot;text&#47;javascript&quot;&gt;postCount('{#entry.MappingId}'); &lt;&#47;script&gt;&lt;&#47;a&gt;&amp;nbsp;
      &lt;a href=&quot;{#entry.Permalink}&quot;&gt;permalink&lt;&#47;a&gt;
   &lt;&#47;div&gt;
{foreach $relatedentry in $entry.RelatedEntries}
{ifcond $LoopFirst = &quot;True&quot;}
&lt;center&gt;
&lt;div class=&quot;clsRelatedEntries&quot;&gt;
Related Entries
{&#47;ifcond}
&lt;div class=&quot;clsRelatedEntry&quot;&gt;
   &lt;a href=&quot;{#relatedentry.Permalink}&quot;&gt;{#relatedentry.EntryContent.EntryTitle}&lt;&#47;a&gt;
&lt;&#47;div&gt;
{ifcond $LoopLast = &quot;True&quot;}
&lt;&#47;div&gt;
&lt;&#47;center&gt;
{&#47;ifcond}
{&#47;foreach}
&lt;&#47;div&gt;
{&#47;foreach}
&lt;div class=&quot;clsAdBlock&quot;&gt;
{#adBlockHorizontal}
&lt;&#47;div&gt;
&lt;div class=&quot;clsNavigator&quot;&gt;
   &lt;span class=&quot;clsNavigateEarlier&quot;&gt;{#moveEarlier}&lt;&#47;span&gt;&lt;span class=&quot;clsNavigateLater&quot;&gt;{#moveLater}
   &lt;&#47;span&gt;
&lt;&#47;div&gt;
&lt;&#47;div&gt;
&lt;br&#47;&gt;
&lt;div class=&quot;clsAttribution&quot;&gt;
   &lt;a href=&quot;mailto:{#entry.EntryContent.ContentAuthor.EmailAddress}&quot;&gt;
      {#entry.EntryContent.ContentAuthor.Name}
   &lt;&#47;a&gt; - 
   {#entry.EntryContent.ContentAuthor.Description}
&lt;&#47;div&gt;
&lt;&#47;body&gt;
&lt;&#47;html&gt;
</pre>
<p>The next template is for RSS consumers--</p>
<pre>
&lt;rss version=&quot;2.0&quot;&gt;
  &lt;channel&gt;
    &lt;title&gt;{#blog.Title|escape}&lt;&#47;title&gt;
    &lt;link&gt;{#blog.BaseUrl}&lt;&#47;link&gt;
    &lt;description&gt;{#blog.Description|escape}&lt;&#47;description&gt;
    &lt;lastBuildDate&gt;{#buildDate|r}&lt;&#47;lastBuildDate&gt;
    &lt;language&gt;en-us&lt;&#47;language&gt;
		{foreach $entry in $entries}
		&lt;item&gt;
		  &lt;title&gt;{#entry.EntryContent.EntryTitle|escape}&lt;&#47;title&gt;
		  &lt;link&gt;{#entry.Permalink}&lt;&#47;link&gt;
		  &lt;guid&gt;{#entry.Permalink}&lt;&#47;guid&gt;
		  &lt;pubDate&gt;{#entry.EntryContent.PublishDateUTC|r}&lt;&#47;pubDate&gt;
		  &lt;description&gt;&lt;![CDATA[{#entry.EntryContent.EntryContent}]]&gt;&lt;&#47;description&gt;
		&lt;&#47;item&gt;
		{&#47;foreach}
  &lt;&#47;channel&gt;
&lt;&#47;rss&gt;
</pre>
<p>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.</p>]]></description>
		</item>
		
		<item>
		  <title>The New Blog Software Goes Live</title>
		  <link>http://www.yafla.com/dforbes/The_New_Blog_Software_Goes_Live/</link>
		  <guid>http://www.yafla.com/dforbes/The_New_Blog_Software_Goes_Live/</guid>
		  <pubDate>Tue, 30 Oct 2007 06:01:44 GMT</pubDate>
		  <description><![CDATA[<p>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 <i>many</i>) available products. </p>

<p>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. </p>

<p>Other priorities always trumped it, and the little time I
did allot towards this goal saw me solving absurd edge conditions.</p>

<p>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 <a
href="http://www.yafla.com/dforbes/Taking_the_Plunge_Into_Blogging/">started
publishing content the blog way</a>.</p>

<p>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 <i>far</i> too manual to be worth the bother.</p>

<p>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.</p>

<p>So I’ve gone and built my own blogging software, this time quickly
bringing it to a sort of beta release. </p>

<p>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.</p>

<p>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.</p>

<p>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.</p>

<p>Right now you’ll probably notice that – at this moment at
least – the HTML version of the blog looks <i>absolutely terribly</i>. 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).</p>

<p>So what are the features of the blog software?</p>

<p>Well, firstly I migrated 100% of the old content over (including
metadata such as categorization), <a
href="http://www.yafla.com/dforbes/Tidy_Your_HTML_with_The_Pragmatic_Impurity_of_NET/">running
it all through Tidy</a> 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). </p>

<p>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. <a
href="http://www.yafla.com/dforbes/categories/softwareDevelopment/2005/09/28.html">http://www.yafla.com/dforbes/categories/softwareDevelopment/2005/09/28.html</a>
redirects to <a href="http://www.yafla.com/dforbes/Clean_Code">http://www.yafla.com/dforbes/Clean_Code</a>.
All new entries Will follow that more transparent and obvious structure.</p>

<p>But the URLs aren’t limited to just single documents – All entries
in June of 2006 can be accessed via <a
href="http://www.yafla.com/dforbes/2006/06">http://www.yafla.com/dforbes/2006/06</a>.
Add in a category and you can refine further – <a
href="http://www.yafla.com/dforbes/2006/06/.NET">http://www.yafla.com/dforbes/2006/06/.NET</a>
(or <a href="http://www.yafla.com/dforbes/.NET/2006/06">http://www.yafla.com/dforbes/.NET/2006/06</a>.
Whatever makes you happy). </p>

<p>Want that in RSS form?   <a
href="http://www.yafla.com/dforbes/2006/06/.NET/rss.xml">http://www.yafla.com/dforbes/2006/06/.NET/rss.xml</a>.
 Add in the day if you wanted to refine further.</p>

<p>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</p>

<p><a
href="http://www.yafla.com/dforbes/.NET/SQL/Blogging/SoftwareDevelopment/Personal/IT/">http://www.yafla.com/dforbes/.NET/SQL/Blogging/SoftwareDevelopment/Personal/IT/</a></p>

<p>Yikes!</p>

<p>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).</p>

<p>There’s also search, though I’m not comfortable enough with
the finality of the API to publish anything about that.</p>

<p>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.</p>

<p>Extensive caching ensures that it’s still spritely and
capable of handling peak loads with no fuss.</p>

<p>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.</p>

<p>Great things lie ahead.</p>]]></description>
		</item>
		
		<item>
		  <title>The Legacy PC Gets An Upgrade to a Quad Core CPU</title>
		  <link>http://www.yafla.com/dforbes/The_Legacy_PC_Gets_An_Upgrade_to_a_Quad_Core_CPU/</link>
		  <guid>http://www.yafla.com/dforbes/The_Legacy_PC_Gets_An_Upgrade_to_a_Quad_Core_CPU/</guid>
		  <pubDate>Mon, 17 Sep 2007 14:26:10 GMT</pubDate>
		  <description><![CDATA[<a name="a424"></a><p>One of my PCs is a bit of a Frankenstein, having gone through
countless small upgrades over the years.</p>
<p>A video card here. Some memory modules there. A replacement
primary harddrive here (<a href=
"http://www.yafla.com/dforbes/2007/04/24.html">thank you g4u</a>).
A supplementary hard drive there. Half a dozen different CD and
then DVD and then Dual-Layer DVD burners.</p>
<p>Every now and then it'd see a larger upgrade that mandated a
motherboard replacement alongside a new CPU.&nbsp;Often that would
require new memory modules as well. Maybe even a new power supply
as connection standards changed.</p>
<p>Motherboard replacements have always been the most disruptive,
and it's been interesting to watch as each has negated the need
for&nbsp;some add-in or other. First the USB+firewire board got
punted, having been replaced by onboard functionality. Then the
network card. Then the Soundblaster card. The only true add-in
card&nbsp;usually needed nowadays is&nbsp;the video card, and I'm
sure <a href=
"http://ati.amd.com/companyinfo/about/amd-ati.html">it's only a
matter of time</a> before the on-board video&nbsp;reaches a
credible level of performance, eliminating even that.</p>
<p>I've pursued this&nbsp;piecemeal approach to
upgrading&nbsp;primarily because it minimized the software
disruption in my life, usually requiring just a quick module swap,
some driver updates, and it's up and running again. I actually
enjoy the modular, hybrid-PC pursuit, individually scoping out and
replacing components with the best bang-per-dollar option available
at the time. It's a bit of a hobby.</p>
<p>[Clearly I'm not alone: A local "<a href=
"http://www.tigerdirect.ca/">Tiger Direct</a>" store opened
recently in my town, featuring a huge floorspace stocked with
esoteric power supplies, mod cases, and other components for DIY
builders. I'm surprized that the demand is still there, having
thought that the self-builder was an endangered species]</p>
<p>I've been negligent, however. Over the past while this
PC&nbsp;had seen little attention. Running on an extremely dated
Athlon XP 1800+ (overclocked to equal a 2200+), with a "measly" 1GB
of DDR1 RAM and a dated collection of complimentary components, it
had fallen so far behind the times that it has dropped far off the
current <a href=
"http://www23.tomshardware.com/cpu_2007.html?modelx=33&amp;model1=871&amp;model2=955&amp;chart=435">
CPU charts</a>. While it served its casual gaming task&nbsp;well
(the video card is quite contemporary, and given that few games are
constrained by the CPU, it held its own), and admirably provided
the network storage for photos and videos, its anemic standings
were a bit embarrassing. Sure, it didn't <em>need</em> to be decent
given the various home and business laptops -- powerful, modern
units that saw most of my computing&nbsp;activity&nbsp;-- but I
felt like I was letting it down.</p>
<p>So following up <a href=
"http://www.yafla.com/dforbes/2007/09/04.html">the entry from a
couple of weeks ago</a>, I finally got around to ordering a new CPU
and motherboard&nbsp;on Tuesday, ordering a retail boxed Intel Core
2 Quad Q6600 2.4Ghz processor from <a href=
"http://www.directcanada.com/">Direct Canada</a> for the
extraordinarily low price of <em>$279.99</em> CAD. I'd been
directed to their site from a search-engine yielded link to
"Shopbot.ca", so I was a bit wary placing my order with this
unfamiliar provider, but at 1pm the next day the box arrived at my
door, amazingly delivered less than 24 hours after I ordered,
coming&nbsp;from a shop 3000km away. I'm very satisfied with the
price and speed. (I received no considerations for that comment,
and know nothing about the shop beyond the fact that they sold me a
killer piece of hardware at a great price, delivering it very
quickly. Your mileage may vary.)</p>
<p>In the end I discovered that some new memory modules would be in
order to fully yield the speed (going with 2GB to correlate with
the oft claimed speed advantage that often flies in complete
contradiction to actual memory usage metering). Oh, and a new case
as it might make the whole process a little easier.</p>
<p>In the end, the only legacy pieces that made the migration to
the "upgraded" box are the hard drives, and the video card.</p>
<p>Minutes later the full-retail copy of Windows was running the
right drivers, and after a quick re-activation it was storming
along.</p>
<p>I booted up.</p>
<p>In a word (and a punctuation) -
<em><strong>Wow!</strong></em></p>
<p>What a <em>tremendous</em> amount of computational power on the
cheap. Day to day activity really feels no different than it did
before -- browsing is the same fast browsing that it was before,
and given that I don't try to use Excel as a warehousing database,
Office seems the same as well. Battlefield 2 plays the same given
that I have the same video card, albeit now with absolutely zero
stutters or hiccups as other threads demanding timeslices are
generally satisfied by one of the other cores.</p>
<p>For the things that actually keep me waiting -- encoding a home
video from the MiniDV, or building firefox from CVS, as I do
regularly -- the improvement is <em>enormous</em>. Not only are
these operations massively sped up by the four cores available to
them, better still I can configure them to only use one, two, or
three threads of parallel executions (via the -j build option for
Firefox, for instance), constraining them as a coarse fix for the
deficiencies of the Windows scheduler. I can now run a full Firefox
3 build in just 12 minutes with full parallelism, or run it (or
other demanding applications) with little or no impact in the
usability and functionality of this PC for other tasks.</p>
<center>
<div style=
"BORDER-RIGHT: black 2px inset; PADDING-RIGHT: 0.2em; BORDER-TOP: black 2px inset; PADDING-LEFT: 0.2em; PADDING-BOTTOM: 0.2em; BORDER-LEFT: black 2px inset; WIDTH: 45%; PADDING-TOP: 0.2em; BORDER-BOTTOM: black 2px inset; BACKGROUND-COLOR: #efedd9; TEXT-ALIGN: left">
<h4 align="center">Parallel Building Firefox<br />
Full Build Times on Quad Core Processor<br />
(Bars represent time. Shorter=better)</h4>
<div style=
"BORDER-RIGHT: black 1px outset; PADDING-RIGHT: 0px; BORDER-TOP: black 1px outset; PADDING-LEFT: 0px; PADDING-BOTTOM: 10px; BORDER-LEFT: black 1px outset; PADDING-TOP: 10px; BORDER-BOTTOM: black 1px outset; BACKGROUND-COLOR: #f0ffee">
&nbsp;<b>-j1 (default)</b> <span style=
"BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; DISPLAY: block; BACKGROUND: #ff0000; MARGIN: 4px 0px; BORDER-LEFT: black 1px solid; WIDTH: 80%; BORDER-BOTTOM: black 1px solid">
&nbsp;</span> <em>&nbsp;24 minutes 12 seconds</em></div>
<div style=
"BORDER-RIGHT: black 1px outset; PADDING-RIGHT: 0px; BORDER-TOP: black 1px outset; PADDING-LEFT: 0px; PADDING-BOTTOM: 10px; BORDER-LEFT: black 1px outset; PADDING-TOP: 10px; BORDER-BOTTOM: black 1px outset; BACKGROUND-COLOR: #f0ffee">
<b>&nbsp;-j2 (1 to 2 threads)</b> <span style=
"BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; DISPLAY: block; BACKGROUND: #0000ff; MARGIN: 4px 0px; BORDER-LEFT: black 1px solid; WIDTH: 55.7%; BORDER-BOTTOM: black 1px solid">
&nbsp;</span> <em>&nbsp;16 minutes 52 seconds</em></div>
<div style=
"BORDER-RIGHT: black 1px outset; PADDING-RIGHT: 0px; BORDER-TOP: black 1px outset; PADDING-LEFT: 0px; PADDING-BOTTOM: 10px; BORDER-LEFT: black 1px outset; PADDING-TOP: 10px; BORDER-BOTTOM: black 1px outset; BACKGROUND-COLOR: #f0ffee">
<b>&nbsp;-j4 (1 to 4 threads)</b> <span style=
"BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; DISPLAY: block; BACKGROUND: #00ff00; MARGIN: 4px 0px; BORDER-LEFT: black 1px solid; WIDTH: 48.14%; BORDER-BOTTOM: black 1px solid">
&nbsp;</span> <em>&nbsp;14 minutes 34 seconds</em></div>
<p style="FONT-SIZE: xx-small">The build continued to speed up with
more possible parallel operations, albeit with a decreased rate of
return, with the fastest test build occuring in just over 12
minutes with the highest option tested: <em>-j12</em>. Having more
parallel operations than cores can yield benefits when it increases
the time utilization of a saturated resource, which in this case
was the hard drive. At this point the cores were left twiddling
their thumbs waiting for the storage to catch up.</p>
<p style="FONT-SIZE: xx-small">Limiting the build process to two
cores via the process CPU affinity had it CPU starved beyond -j2,
yielding no benefit via more parallelism.</p>
</div>
</center>
<p style="FONT-SIZE: x-small" align="left">You can find a stacked
graph detailing core processor usage for the above <em>-j4</em> run
(on 4 cores) at <a href=
"http://www.yafla.com/dforbes/images/Firefox_build_j4_4core.png">http://www.yafla.com/dforbes/images/Firefox_build_j4_4core.png</a>.
You can also <a href=
"http://www.yafla.com/dforbes/images/Firefox_build_j4_2core.png">look
at a chart of building Firefox using the -j4 option, but setting
the processor affinity to only allow the build access to two
cores</a>.</p>
<p>Not only is the build performance fantastic, but better still I
can throttle it back to only run at most two parallel operations
(-j2), getting a build in a still impressive 17 minutes while
leaving two cores completely available for other tasks, like
browsing the web with full responsiveness. I can even launch
Battlefield 2, and remarkably it plays flawlessly...despite the
fact that a full-scale, parallel build is going on in the
background.</p>
<p>(Sidenote: Threads can still be left stalled, stranded waiting
for a shared resource like the limited memory bandwidth and I/O
paths, for instance. In the sample above my build was on a second
harddrive -- a configuration that I recommend for all power users
-- and clearly the other shared resources didn't impact the game to
a perceivable degree)</p>
<p>What a revolution in computer usage. What a discount-priced
computational powerhouse.</p>

]]></description>
		</item>
		
		<item>
		  <title>More Cores For Everyone!</title>
		  <link>http://www.yafla.com/dforbes/More_Cores_For_Everyone/</link>
		  <guid>http://www.yafla.com/dforbes/More_Cores_For_Everyone/</guid>
		  <pubDate>Tue, 04 Sep 2007 17:09:04 GMT</pubDate>
		  <description><![CDATA[<a name="a423"></a><p>A <a href=
"http://www.codinghorror.com/blog/archives/000942.html">recent
article on the utility of multiple cores</a> has been making the
rounds. Despite being largely a copy/paste of other articles and
graphics, with a smidge of editorial commentary, it
is&nbsp;anxiously heralded by dual-core owners as
purchase&nbsp;justification in the face of progressing
technology.</p>
<p>[As fair disclosure, let me say that I'm <em>about</em> to
purchase a quad-core processor based system, and this article and
its sources did absolutely nothing to dissuade me from this
choice]</p>
<p>The meat of the article (or rather the articles that are
referenced by the article&nbsp;-- someone else did the dirty,
arduous footwork work of benchmarking)&nbsp;is comprised of a
showdown between a 2.4Ghz quad-core and a 3.0Ghz dual-core, which
is reasonable given that they're comparable in price
[at&nbsp;writing the 3.0Ghz dual-core E6850 can be had for $384
CDN, while the 2.4Ghz quad-core Q6600 is $319 CDN]. Given that many
games and applications are effectively single-threaded as a legacy
of lowest-common denominator development,&nbsp;the faster clock
speed dual-core processor abstractly takes the lead in such
fundamentally synthetic benchmarks for the pricepoint.</p>
<p>Aside from the questionable "<em>it's good to have one extra
core to allow you to kill bad processes</em>"&nbsp;premise (what if
those bad processes are multithreaded? Do you just have to buy
<em>bad-process-threads+1</em> cores? Maybe set the affinity such
that you've dedicated a core solely for the task manager? In the
real world of modern schedulers, the only time you can't get
control of the machine to kill a rogue process is because of some
absolutely atrocious elements of the implementation of Windows, and
a scheduler that is effectively broken in the face of some
situations. Neither is necessarily improved by more cores), what
really gets me about the whole exercise is how utterly synthetic it
really is, using contrived benchmarks instead of rationally
considering how people actually use their PCs, and where their real
need for more power comes from.</p>
<p>Firstly, it largely focuses on games benchmarks. Even if gaming
performance&nbsp;<em>is</em> pertinent to the reader, for the
majority of users playing the majority of games, <a href=
"http://www23.tomshardware.com/graphics_2007.html">their video
card</a> is <em>far</em> more of a bottleneck than their processor
(even if their processor is a dated affair). I'm saying this as a
<a href=
"http://groups.google.ca/group/comp.sys.ibm.pc.hardware.video/msg/dac6b542f9336402?hl=en&amp;">
long time computer gamer</a> -- one that finds the stuttering
framerate on even top of the line game consoles intolerable: unless
you've turned every quality setting to low and you're running at
800x600, it's doubtful that&nbsp;you're going to even
measure,&nbsp;much less <em>notice</em>,&nbsp;a difference between
a modern 2.4Ghz&nbsp;core and a 3.0Ghz core. Indeed, the
very&nbsp;<a href=
"http://www.techreport.com/articles.x/12737/4">first benchmark</a>
I looked at on the <a href=
"http://www.techreport.com/articles.x/12737">referenced article</a>
says exactly that: "<em>For this test, we set Oblivion's graphical
quality to "Medium" but with HDR lighting enabled and vsync
disabled, at 800x600 resolution</em>". They did that to create a
scenario where the differences are measurable.</p>
<p>So if you plan to game in a contrived way for the purposes of
demonstrating CPU differences in benchmarks, then you'd better pay
attention to core speed.</p>
<p>In the real world of gaming, after you've adjusted the quality
and resolution settings to appropriate settings for your video
card, the primary slowdowns during gaming tend to come about
because of <em>external</em> applications rudely stealing your
thread quanta: I'm about to toss the grenade into the bunker in
Battlefield 2 when suddenly Windows Search has decided that this is
a good time to rebuild its index corpus, for instance, so instead
it falls to the ground and I take out my entire&nbsp;squad
(Seriously, Windows Search guys - when&nbsp;a full-screen DirectX
game is running, it probably isn't a good time to decide that the
PC is "idle").</p>
<p>For moments like that, more cores make a huge difference.
Dual-cores would be sufficient for that simple scenario, but what
if my PC is even more active, as it <em>always</em> is? Perhaps the
blog updater is running an update, I'm FTPing some files, a
download is happening, <em>and</em> I'm gaming.</p>
<p>Every core works towards the ultimate goal of eliminating the
real world problem of cycle theft from my hardcore gaming.</p>
<p>Presuming that you've passed a <em>reasonable&nbsp;</em>bar --
long behind you when you're talking about a 2.4Ghz Core 2 -- more
cores will realistically improve things for gamers enjoying their
vice in the real world. One day we might even have&nbsp;a world
where we don't have to shut down services and trawl taskmanager
violently&nbsp;killing processes before launching a game, fearful
that it will disrupt our immersion.</p>
<p>My second problem with the article is that it doesn't question
what people are <em>really</em> waiting for nowadays. Personally I
see almost no difference between virtually any mainstream PC for
the overwhelming majority of day to day operations (and this is as
a developer) -- most&nbsp;activities are so fast the difference is
negligible. I just switched laptops from a single-core 1.6Ghz
Pentium M to one with a Core 2 Duo T7200 -- a significant
improvement --&nbsp;and from a day to day perspective I've indeed
notice that the new laptop has a better screen, a faster harddrive,
and much better graphics, but the computational difference is
largely unnoticed.</p>
<p>Until,&nbsp;humorously, I do something&nbsp;that is highly
parallelizable, such as encoding a video pulled in from the miniDV
video camera. In that case the dual-core processor strides to a
<em>massive</em> lead over its single core predecessor. If it were
a quad-core, it would storm even further ahead, even with the loss
of frequency.</p>
<p>For something that I'm <em>actually</em> waiting on, more cores
= more goodness.</p>
<p>I would definitely choose the quad-core processor for the
software reality legacy that we have today, despite the many
applications that <em>in the singular</em> fail to exploit the
possibility. My conviction is amplified by the tremendous strides
that application developers <a href=
"http://msdn2.microsoft.com/en-us/library/system.threading.threadpool.queueuserworkitem.aspx">
are</a> <a href="http://osstbb.intel.com/">making</a> to
parallelize their products. Once you've parallelized to 2 cores,
it's generally a <em>very</em> small step to parallelize to 4
cores, or <em>n</em> cores for that matter.</p>
<p>Bring on the cores!</p>

]]></description>
		</item>
		
		<item>
		  <title>Summer Nears Its End</title>
		  <link>http://www.yafla.com/dforbes/Summer_Nears_Its_End/</link>
		  <guid>http://www.yafla.com/dforbes/Summer_Nears_Its_End/</guid>
		  <pubDate>Mon, 27 Aug 2007 12:46:51 GMT</pubDate>
		  <description><![CDATA[<a name="a422"></a><p>Summer is waning here in the Northern hemisphere.&nbsp;</p>
<p>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.</p>
<a title="Photo Sharing" href=
"http://www.flickr.com/photos/dforbes/1241591263/"><img height=
"160" alt="IMG_2741" hspace="8" src=
"http://farm2.static.flickr.com/1197/1241591263_6e1f7ae090_m.jpg"
width="240" align="right" vspace="8" /></a>
<p>'Tis a wonderful season ending, to be replaced by another great
time of year.</p>
<p>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 <a href=
"http://www.yafla.com/papers/sqlhierarchies/sqlhierarchies.htm">versatile
high performance hierarchies</a>), along with many other thoughts
that have percolated in my head.</p>

]]></description>
		</item>
		
  </channel>
</rss>