<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Half-Baked Bits</title>
	
	<link>http://halfbakedbits.com</link>
	<description>Small Ideas Factory</description>
	<lastBuildDate>Fri, 09 Jan 2009 12:43:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/halfbakedbits" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="halfbakedbits" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Greenfield Already!  When is enough enough?</title>
		<link>http://halfbakedbits.com/2009/01/greenfield-already-when-is-enough-enough/</link>
		<comments>http://halfbakedbits.com/2009/01/greenfield-already-when-is-enough-enough/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 12:43:57 +0000</pubDate>
		<dc:creator>Brett Veenstra</dc:creator>
				<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[career]]></category>
		<category><![CDATA[coding life]]></category>
		<category><![CDATA[greenfield]]></category>

		<guid isPermaLink="false">http://halfbakedbits.com/?p=204</guid>
		<description><![CDATA[What is the best part about software development? Greenfield projects. You have none of the baggage of the bad decisions you made in the past, and you can create some code and see something new. That&#8217;s the attractiveness of this business. What we get &#8220;paid for&#8221; is actually dealing with a lot of crap code, [...]]]></description>
			<content:encoded><![CDATA[<p>What is the best part about software development?  <strong><a href="http://en.wikipedia.org/wiki/Greenfield_project">Greenfield projects</a></strong>.  You have none of the baggage of the bad decisions you made in the past, and you can create some code and see something new.  That&#8217;s the attractiveness of this business.</p>

<p>What we get &#8220;paid for&#8221; is actually dealing with a lot of crap code, some written by us, the rest written by others.  <a href="http://ayende.com/Blog/archive/2008/07/29/There-is-no-such-thing-as-a-single-developer-project.aspx">Ayende has a great quote, broken English and all</a>:</p>

<blockquote>
  <p>There are always at least two people in any software project:</p>
  
  <ul>
  <li><p>The developer who wrote the code.</p></li>
  <li><p>The developer who read the code.</p></li>
  </ul>
  
  <p>They are never the same person, even if just by temporal dissonance.</p>
</blockquote>

<p>In other words, we will generally have a thought of <a href="http://twitter.com/brettveenstra/status/1049133055">&#8220;who wrote this crap&#8221;</a>, and most of the time, it is our past self.</p>

<p>As tempting as it is, we cannot simply try to create new projects whenever we encounter difficulties or better ways of doing things.  <strong>We would never get things done.</strong></p>

<p>There are however instances that demand a new project.  Here are a few that come to mind:</p>

<ul>
<li>Platform is not actively supported or vendor&#8217;s development has reached a sunset.</li>
<li>Another major technology has supplanted the one your using in the marketplace, one that would reduce your codebase significantly.</li>
<li>You have to re-read nearly the entire codebase to make any changes <em>or</em> you have limited tests, specs, documentation, etc. on a key application.  This is a special case, one that&#8217;s not very popular and easily ignored when we get busy, but in this event, you want to capture as much of the knowledge from the developers <strong>now</strong>, this is your &#8220;project&#8221;.</li>
<li>Your application is small (e.g. 1 developer, handful of function points), these are the perfect environments for learning new technologies, techniques, etc.</li>
</ul>

<p>Any others come to mind?  Let&#8217;s have them!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=JwhLTicYxgY:hbyjImhl0vc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=JwhLTicYxgY:hbyjImhl0vc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=JwhLTicYxgY:hbyjImhl0vc:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=JwhLTicYxgY:hbyjImhl0vc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=JwhLTicYxgY:hbyjImhl0vc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=JwhLTicYxgY:hbyjImhl0vc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=JwhLTicYxgY:hbyjImhl0vc:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://halfbakedbits.com/2009/01/greenfield-already-when-is-enough-enough/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Some fun with NSIS</title>
		<link>http://halfbakedbits.com/2008/10/some-fun-with-nsis/</link>
		<comments>http://halfbakedbits.com/2008/10/some-fun-with-nsis/#comments</comments>
		<pubDate>Fri, 17 Oct 2008 01:23:00 +0000</pubDate>
		<dc:creator>Nathan Bedford</dc:creator>
				<category><![CDATA[tools]]></category>
		<category><![CDATA[Audacity]]></category>
		<category><![CDATA[installation wizard]]></category>
		<category><![CDATA[NSIS]]></category>
		<category><![CDATA[registry]]></category>

		<guid isPermaLink="false">http://halfbakedbits.com/?p=190</guid>
		<description><![CDATA[I was all set to write a riveting article on the importance of application UI response times, but another great little project came up and I couldn&#8217;t resist. Basically, my friend come up to me at work today and asked if I knew of any way to record and save a song she had heard [...]]]></description>
			<content:encoded><![CDATA[<p>I was all set to write a riveting article on the importance of application UI response times, but another great little project came up and I couldn&#8217;t resist.</p>

<p>Basically, my friend come up to me at work today and asked if I <a href="http://www.nathanbedford.com/blog/?p=25">knew of any way to record and save</a> a song she had heard on the internet.  It should go without saying that the legalities of this should be investigated a bit before trying this yourself, but in this case, I felt comfortable that we were within the law.</p>

<p><a href="http://audacity.sourceforge.net/">Audacity</a> can do this sort of thing nicely, but the problem is, Audacity doesn&#8217;t ship with an MP3 encoder (due to legal reasons, I suspect).  I needed to find a simple way to copy lame_enc.dll to the user&#8217;s hard drive, and create a registry key in the right spot that points to that dll.  There are a lot of ways to do this: a little .NET application, a variety of scripting languages, etc.  But let&#8217;s think about this for a sec&#8230;really, what you&#8217;re doing is a lot like what an installer does.  InstallShield, Wise Installer, the installation wizard that comes with Visual Studio, <a href="http://wix.sourceforge.net/">WiX</a>&#8230;all these are great, albeit a bit expensive and/or confusing.  Did you know there are two great, free alternatives?  <a href="http://www.jrsoftware.org/isinfo.php">Inno Setup</a> and <a href="http://nsis.sourceforge.net/Main_Page">NSIS </a>are both quite robust, fully scriptable, free installation packages.  As an aside, I&#8217;d encourage you to not underestimate the significance of having your installer be totally scriptable&#8230;just being able to follow the version of your installer via a source control system is immensely helpful.  And if you&#8217;re stuck with Windows Installer, check out WiX&#8230;it&#8217;s great.</p>

<p>Out of the free options, I tend toward NSIS for several key reasons:</p>

<ol>
<li>Helpful support community</li>
<li>Used by Google</li>
<li>Very small install files (smallest of all installers)</li>
</ol>

<p>There are <a href="http://nsis.sourceforge.net/Category:Development_Environments">several IDEs </a>to help you create and maintain NSIS installers.  I choose <a href="http://nsis.sourceforge.net/HM_NIS_Edit">HM NIS Edit</a> simply because it was first one I saw years ago (before all the others were available).  It has a nice little wizard that can help you build a simple installer script very quickly.</p>

<p>I walked through the wizard and chose lame_enc.dll as the only file that this installer will install.  I decided to put it in Program Files, since I assume that most users know not to randomly delete files from there.  Plus, it sort of fits there <img src='http://halfbakedbits.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>

<p>Now, all, we need to do is add the registry key that tells Audacity where to find lame_enc.dll.  The NSIS documentation is very helpful, and I found the answer in no time:</p>

<p><code>WriteRegStr HKEY_CURRENT_USER "Software\Audacity\Audacity\MP3" "MP3LibPath" "$PROGRAMFILES\LAME MP3 Encoder\lame_enc.dll"</code></p>

<p>My NSIS script already had a block of code called &#8220;MainSection&#8221;.  That block contains the operations that happen when the installer runs.  I just added my new operation to the end of the main section, and added a corresponding DeleteRegKey operation in the Uninstall section, and voila!  The installer was done.  Well, done after I compiled it, of course.  Now, all I need to do is point my friend to the Audacity installer, and the LAME MP3 Dll installer I just wrote in 3 minutes, and she&#8217;ll be making her own mp3s like a pro.</p>

<p>Oh, and remember when I said that NSIS makes small installers?  Well, the dll we&#8217;re installing here is 296KB, and the installer?  It&#8217;s 219KB.  Isn&#8217;t that refreshing?
<a href="http://halfbakedbits.com/wp-content/uploads/2008/10/installer.png"><img src="http://halfbakedbits.com/wp-content/uploads/2008/10/installer.png" alt="" title="installer" width="500" height="388" class="alignnone size-full wp-image-194" /></a></p>

<p>I hope every developer has a chance to spend some quality time learning how modern installers work.  That knowledge comes in handy more times than you might think.  Check out NSIS and Inno Setup for starters&#8230;they&#8217;re so simple to use, I bet you&#8217;ll find yourself thinking of ways to use them before you know it.</p>

<p><strong>Helpful links for this article:</strong></p>

<ul>
<li><a href="http://www.nathanbedford.com/dev/hbb/installer.nsi">Installer source file</a></li>
<li><a href="http://www.nathanbedford.com/dev/hbb/lame_installer.exe">Installer compiled 
<li><a href="http://www.nathanbedford.com/blog/?p=25">Article on how to save audio from the internet</a></li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=fVaxVy6-aDI:io_dy4kNWGE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=fVaxVy6-aDI:io_dy4kNWGE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=fVaxVy6-aDI:io_dy4kNWGE:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=fVaxVy6-aDI:io_dy4kNWGE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=fVaxVy6-aDI:io_dy4kNWGE:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=fVaxVy6-aDI:io_dy4kNWGE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=fVaxVy6-aDI:io_dy4kNWGE:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://halfbakedbits.com/2008/10/some-fun-with-nsis/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Retrieving Delicious (Del.icio.us) Feed with PHP &amp; CURL</title>
		<link>http://halfbakedbits.com/2008/10/retrieving-delicious-delicious-feed-via-php-curl/</link>
		<comments>http://halfbakedbits.com/2008/10/retrieving-delicious-delicious-feed-via-php-curl/#comments</comments>
		<pubDate>Sat, 11 Oct 2008 02:00:56 +0000</pubDate>
		<dc:creator>Brett Veenstra</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[delicious]]></category>
		<category><![CDATA[deliciousrssimporter]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sourceforge]]></category>

		<guid isPermaLink="false">http://halfbakedbits.com/?p=157</guid>
		<description><![CDATA[Looking back on the progress since my last post about the Delicious RSS Importer (DRI) project, these past two weeks have seen only a small functional improvement. Alas, the journey of an Open Source Project. PHP is rather new to me, but I was comfortable with the interpretive style with my experiences in Classic ASP, [...]]]></description>
			<content:encoded><![CDATA[<p>Looking back on the progress since my last post about the Delicious RSS Importer (DRI) project, these past two weeks have seen only a small functional improvement.  Alas, the journey of an <a href="http://sourceforge.net/projects/deliciousrssimp">Open Source Project</a>.</p>

<p>PHP is rather new to me, but I was comfortable with the interpretive style with my experiences in Classic ASP, and PHP&#8217;s C-like syntax.  I figured I could whip something out in a few minutes (maybe an hour once I saw what we could do) that would retrieve my Delicious feed using their <a href="http://delicious.com/help/api">API</a>.</p>

<p>&#8220;Wait a minute!&#8221; you say, &#8220;Doesn&#8217;t Delicious already provide a way to find this information using JSON and this would then allow you to use <a href="http://www.google.com/search?q=jquery+json+remote+retrieval">JQuery to do a Remote Data call?</a>&#8221;  Ah yes, but only for <em>public</em> bookmarks.  We&#8217;re trying to support all Delicious bookmarks here.</p>

<p>So let&#8217;s get back to the bane of PHP development: trying to find relevant, <strong>correct</strong> examples.  Not only did I need to <a href="http://www.google.com/search?q=retrieve+data+using+Curl">retrieve data using Curl</a>, but I also needed to provide a <a href="http://www.google.com/search?hl=en&amp;q=retrieve+data+Curl+username+password">Username and Password</a>, over <a href="http://www.google.com/search?hl=en&amp;q=retrieve+data+Curl+SSL+username+password">SSL</a>.  It felt like going from 0 to <a href="http://www.google.com/search?q=convert+100mph+to+kph">100mph</a> and I forgot to <a href="http://www.google.com/search?hl=en&amp;q=php+getting+started">cover the basics</a> first.  But, I&#8217;m a &#8220;seasoned&#8221; developer, I can handle it.</p>

<p>A few <strong>hours</strong> later and I had code, that wouldn&#8217;t run.  I was relegated to reading&#8230;<a href="http://oreilly.com/catalog/9780596514013/">a book</a>.  A little time with <a href="http://w3schools.com/php/default.asp">w3schools PHP section</a> would have answered most of my questions, correctly.</p>

<p>These were the two things that made the progress slow:</p>

<ul>
<li>Finding the correct way to concatenate strings in PHP &#8211; &#8220;.&#8221;</li>
<li>Finding the correct way to retrieve variables from &#8220;$_REQUEST&#8221; object</li>
</ul>

<p>Enough already, let&#8217;s have the code!</p>

<pre><code><?php

    if( !extension_loaded('curl') ){
            die('You need to load/activate the cURL extension (http://www.php.net/cURL).');
    }
    
    $fetch_url = "https://api.del.icio.us/v1/posts/all?";       //for production
    $fetch_url = "https://api.del.icio.us/v1/posts/recent?count=3";

    $user = $_REQUEST["user"];
    $pwd = $_REQUEST["pwd"];

    $curl = curl_init();
    curl_setopt( $curl, CURLOPT_URL, $fetch_url );
    curl_setopt( $curl, CURLOPT_FAILONERROR, 1); 
    curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, 1);     // allow redirects 
    curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );    // return into a variable 
    curl_setopt( $curl, CURLOPT_HEADER, 0 );        // do not put Header info into result
    curl_setopt( $curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
    curl_setopt( $curl, CURLOPT_USERPWD, $user . ":" . $pwd );
    curl_setopt( $curl, CURLOPT_CONNECTTIMEOUT, 1 );
    curl_setopt( $curl, CURLOPT_TIMEOUT, 120 );
    // curl_setopt( $curl, CURLOPT_USERAGENT, "delicious-rss-importer" );
    $content = curl_exec( $curl );

//Debug
/*
    print_r(curl_getinfo($curl)); 
    echo "\n\ncURL error number:" .curl_errno($curl); 
    echo "\n\ncURL error:" . curl_error($curl); 
*/


    curl_close( $curl );

    header("Content-Type:text/xml");
    print $content;

?>

</code></pre>

<p><strong>Note:</strong> As <a href="http://halfbakedbits.com/author/nathan/">Nathan</a> has pointed out already, you don&#8217;t have to use &#8220;$user&#8221; or &#8220;$pwd&#8221; as they will be automatically populated via PHP.  I choose to include them to highlight intent<del datetime="2008-10-10T10:30:39+00:00">didn&#8217;t know PHP did that at first</del>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=RzfunDconho:uSFPhmEEL2A:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=RzfunDconho:uSFPhmEEL2A:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=RzfunDconho:uSFPhmEEL2A:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=RzfunDconho:uSFPhmEEL2A:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=RzfunDconho:uSFPhmEEL2A:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=RzfunDconho:uSFPhmEEL2A:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=RzfunDconho:uSFPhmEEL2A:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://halfbakedbits.com/2008/10/retrieving-delicious-delicious-feed-via-php-curl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Big Design Upfront: Delicious RSS Importer</title>
		<link>http://halfbakedbits.com/2008/09/big-design-upfront-delicious-rss-importer/</link>
		<comments>http://halfbakedbits.com/2008/09/big-design-upfront-delicious-rss-importer/#comments</comments>
		<pubDate>Sat, 27 Sep 2008 05:00:44 +0000</pubDate>
		<dc:creator>Brett Veenstra</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[delicious]]></category>
		<category><![CDATA[deliciousrssimporter]]></category>
		<category><![CDATA[google gears]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[sourceforge]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://halfbakedbits.com/?p=144</guid>
		<description><![CDATA[In my last post, I introduced the mockups of a half-baked idea: Delicious RSS Importer. I was trying to explain the idea this past week and quickly realized that I need to put together some visuals to how this will work. I&#8217;m not backsliding into an old habit of BDUF. I&#8217;ll keep this brief and [...]]]></description>
			<content:encoded><![CDATA[<p>In my last post, I introduced the mockups of a half-baked idea: <a href="http://halfbakedbits.com/2008/09/half-baked-idea-delicious-rss-importer/">Delicious RSS Importer</a>.  I was trying to explain the idea this past week and quickly realized that I need to put together some visuals to how this will work.</p>

<p>I&#8217;m not backsliding into an old habit of <a href="http://c2.com/xp/BigDesignUpFront.html">BDUF</a>.  I&#8217;ll keep this brief and use this latest post to simply work out the plan of how the major pieces fit.</p>

<p>Here&#8217;s the current intent:
<div id="attachment_148" class="wp-caption alignnone" style="width: 542px"><a href="http://halfbakedbits.com/wp-content/uploads/2008/09/delicious-rss-importer-architecture.png"><img src="http://halfbakedbits.com/wp-content/uploads/2008/09/delicious-rss-importer-architecture.png" alt="Delicious RSS Importer Architecture" title="delicious-rss-importer-architecture" width="532" height="600" class="size-medium wp-image-148" /></a><p class="wp-caption-text">Delicious RSS Importer Architecture</p></div></p>

<p>Basically we need to have a server-side piece to proxy the data requests from Delicious and external RSS feeds.  Those results are then stored client-side using <a href="http://gears.google.com/">Google Gears</a>.</p>

<p>The other concern is that NO passwords are stored externally.  Once you setup Delicious RSS Importer for your environment, your credentials remain private.</p>

<p>Finally, I managed to setup a <a href="http://sourceforge.net/projects/deliciousrssimp">dedicated project space</a> for this work with the good folks at SourceForge.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=VPGG37DJTwk:kZpRtdvprg4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=VPGG37DJTwk:kZpRtdvprg4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=VPGG37DJTwk:kZpRtdvprg4:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=VPGG37DJTwk:kZpRtdvprg4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=VPGG37DJTwk:kZpRtdvprg4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=VPGG37DJTwk:kZpRtdvprg4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=VPGG37DJTwk:kZpRtdvprg4:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://halfbakedbits.com/2008/09/big-design-upfront-delicious-rss-importer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cleaning up after ActiveX executables</title>
		<link>http://halfbakedbits.com/2008/09/cleaning-up-after-activex-executables/</link>
		<comments>http://halfbakedbits.com/2008/09/cleaning-up-after-activex-executables/#comments</comments>
		<pubDate>Sat, 20 Sep 2008 15:29:10 +0000</pubDate>
		<dc:creator>Nathan Bedford</dc:creator>
				<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[ActiveX]]></category>
		<category><![CDATA[registry]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://halfbakedbits.com/?p=139</guid>
		<description><![CDATA[There&#8217;s a good chance most .NET developers don&#8217;t have to deal with this much anymore, but for those stuck in VB6, you might know the pain of cleaning up after ActiveX executables and DLLS. If everything goes as planned, it&#8217;s trivial. For ActiveX DLLs, you can just use regsvr32 with the /u switch, like so: [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s a good chance most .NET developers don&#8217;t have to deal with this much anymore, but for those stuck in VB6, you might know the pain of cleaning up after ActiveX executables and DLLS.</p>

<p>If everything goes as planned, it&#8217;s trivial.  For ActiveX DLLs, you can just use regsvr32 with the /u switch, like so:</p>

<p><code>regsvr32 /u dllFile.dll</code></p>

<p>For ActiveX executables, you use the /unregserver argument for EXE itself, like so:</p>

<p><code>ActiveXFile.exe /unregserver</code></p>

<p>Each ActiveX file has a class ID (CLSID) that uniquely identifies that file in the registry.  When you unregister the ActiveX library with one the previous commands, all references to the library are removed from the registry.  This is important if you&#8217;d like to update an ActiveX library that has had it&#8217;s CLSID changed.  Normally, you&#8217;d just unregister the old library (using the old file), remove the old file, then copy in the new file and register it.</p>

<h2>Lil&#8217; Orphan Annie</h2>

<p>So what happens if the old library file has been deleted?  You&#8217;re stuck with all those old keys in the registry, and often times that will prevent the <strong>new</strong> from registering properly!</p>

<p>It just so happens I was working with a company that had a problem like this.  Their product had several ActiveX exes and DLLS, and more often than not, when trying to update a client&#8217;s files, someone would forget to unregister the old libraries before removing them, so we found ourselves stuck in this mess quite often.</p>

<p>To figure out how to fix this, I decided to figure out exactly what happened when an ActiveX library is registered, so I could undo the changes.  I did some research and concluded that when an ActiveX library is registered, the only thing on the system that changes is that several keys are added to the registry.  There are several programs (mostly for installers) that will help you discover exactly how an installation has affected your system, but I wanted to try a free way.  This is where a simple but irreplaceable tool came into play: the diff tool.</p>

<h2>Visual diff tools rock!</h2>

<p>Diff tools compare two text-based files (or blocks of text) and visually show you how those files are different.  It&#8217;s an absolute must-have for programmers&#8230;when combined with a revision control software product like SVN, git, or Source Save, you can easily compare how a text file has changed since it was last &#8216;checked-in&#8217;.   There are plenty of good ones out there&#8230;I&#8217;d recommend checking out <a href="http://www.winmerge.org/">WinMerge</a>.  It&#8217;s fast, free, looks good, and integrates nicely with TortoiseSVN.</p>

<p>So how is WinMerge going to help us here?  Well, fortunately the Windows Registry Editor (regedit) provides an option to export the entire registry into a text file! So, discovering how your registry has changed after an operation is as simple as:</p>

<ol>
    <li>Taking a snapshot of your registry (export to text file)</li>
    <li>Applying the change (registering your ActiveX DLL)</li>
    <li>Taking another snapshot of your registry (export to different text file)</li>
    <li>Comparing the two text files to spot the differences (Use WinMerge or other diff tool)</li>
</ol>

<h2>On to the next adventure</h2>

<p>It&#8217;s ridiculously simple, but it works great, and it&#8217;s free. You&#8217;ll learn a lot about how much your registry is being used <strong>constantly </strong>by the OS and your running programs.</p>

<p>Now that we know which registry entries have changed, we can look for patterns and figure how to remove all traces of an ActiveX library from the registry just by knowing it&#8217;s original path.  I&#8217;ll cover that topic in a future post.</p>

<p>I hope this can help out some poor soul still using VB6 ActiveX libraries!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=q75um7tFIwg:u3G4up5UoUU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=q75um7tFIwg:u3G4up5UoUU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=q75um7tFIwg:u3G4up5UoUU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=q75um7tFIwg:u3G4up5UoUU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=q75um7tFIwg:u3G4up5UoUU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=q75um7tFIwg:u3G4up5UoUU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=q75um7tFIwg:u3G4up5UoUU:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://halfbakedbits.com/2008/09/cleaning-up-after-activex-executables/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Half Baked Idea: Delicious RSS Importer</title>
		<link>http://halfbakedbits.com/2008/09/half-baked-idea-delicious-rss-importer/</link>
		<comments>http://halfbakedbits.com/2008/09/half-baked-idea-delicious-rss-importer/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 10:22:05 +0000</pubDate>
		<dc:creator>Brett Veenstra</dc:creator>
				<category><![CDATA[Announcement]]></category>

		<guid isPermaLink="false">http://halfbakedbits.com/?p=86</guid>
		<description><![CDATA[I have a confession, I&#8217;m an RSS junkie, I won&#8217;t even try to survive without it. As an RSS junkie, I read a lot, and would like to be able to catchup on my RSS feeds when nature callsfrom almost anywhere. There are currently several elements to my utopic RSS lifestyle: iPhone 3G NewsGator online [...]]]></description>
			<content:encoded><![CDATA[<p>I have a confession, I&#8217;m an RSS junkie, I won&#8217;t even <a href="http://brettveenstra.com/2008/02/21/surviving-the-technological-future/">try to survive</a> without  it.  As an RSS junkie, I read <strong>a lot</strong>, and would like to be able to catchup on my RSS feeds <del datetime="2008-09-11T10:03:48+00:00">when nature calls</del>from almost anywhere.</p>

<p>There are currently several elements to my utopic RSS lifestyle:</p>

<ul>
<li><a href="http://apple.com/iphone">iPhone 3G</a></li>
<li><a href="http://www.newsgator.com">NewsGator</a> online account and services

<ul>
<li><a href="http://www.newsgator.com/Individuals/NetNewsWireiPhone/Default.aspx">NetNewsWire for iPhone</a></li>
<li><a href="http://www.newsgator.com/INDIVIDUALS/NETNEWSWIRE/">NetNewsWire for Mac</a></li>
<li><a href="http://www.newsgator.com/Individuals/FeedDemon/Default.aspx">FeedDemon for Windows</a></li>
</ul></li>
<li><a href="http://delicious.com/bveenstra">Delicious</a></li>
</ul>

<p>Here&#8217;s the great part: NewsGator products all synch with each other, so I&#8217;m never re-reading content.</p>

<p>Here&#8217;s the real problem though, I read <strong>most</strong> of my feeds on my iPhone, which doesn&#8217;t easily post content to <a href="http://delicious.com/bveenstra">Delicious</a>, instead they use something called &#8220;Clippings&#8221;.</p>

<p>This Clipping thing, while interesting, is something similar to Google Reader&#8217;s Shared Items, just with less features.  Both Shared Items and Clippings can themselves be output as RSS feeds and <a href="http://kentbrewster.com/badger/">you can do fun stuff with that to be sure</a>.</p>

<p>So the problem is this: <strong>how can I import RSS content into Delicious?</strong></p>

<p><a href="https://secure.delicious.com/settings/bookmarks/import">Delicious themselves don&#8217;t have a good answer</a>.  <a href="http://www.google.com/search?hl=en&amp;q=delicious+importer">Google also doesn&#8217;t provide relevant solutions</a>, even <a href="http://schestowitz.com/Weblog/archives/2005/05/28/delicious-bookmarks/">other solutions</a> don&#8217;t quite measure up.</p>

<p>So, without further <del datetime="2008-09-11T10:12:36+00:00">adieu</del><a href="http://beesbuzz.biz/blog/e/2005/11/12-get_your_idioms.php">ado</a>, here&#8217;s the first Half-Baked Bits project announcement: Delicious RSS Importer.</p>

<p>Here&#8217;s the idea in a nutshell:</p>

<ol>
<li>User hits a page and enters Delicious credentials.  Those credentials are stored in cookies, no server-side saves.
<img src="http://farm4.static.flickr.com/3144/2847431590_a617dd5109.jpg?v=0" alt="Step 1" /></li>
<li>User adds RSS feeds of their choosing
<img src="http://farm4.static.flickr.com/3182/2846597363_0270fa853e.jpg?v=0" alt="Step 2" /></li>
<li>User adds items from those feeds to Delicious, while being provided a simple tag window of popular and existing tags, existing items (via URL) are then hidden from display
<img src="http://farm4.static.flickr.com/3133/2846597579_20dfbdf681.jpg?v=0" alt="Step 3" /></li>
</ol>

<p>Thanks again to <a href="http://balsamiq.com/">Balsamiq</a> for their <a href="http://halfbakedbits.com/2008/09/effortless-gui-mockups-with-balsamiq/">excellent Mockups tool</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=urqANVODghU:p8i0prgGfKI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=urqANVODghU:p8i0prgGfKI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=urqANVODghU:p8i0prgGfKI:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=urqANVODghU:p8i0prgGfKI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=urqANVODghU:p8i0prgGfKI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=urqANVODghU:p8i0prgGfKI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=urqANVODghU:p8i0prgGfKI:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://halfbakedbits.com/2008/09/half-baked-idea-delicious-rss-importer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Effortless GUI Mockups with Balsamiq</title>
		<link>http://halfbakedbits.com/2008/09/effortless-gui-mockups-with-balsamiq/</link>
		<comments>http://halfbakedbits.com/2008/09/effortless-gui-mockups-with-balsamiq/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 02:21:58 +0000</pubDate>
		<dc:creator>Brett Veenstra</dc:creator>
				<category><![CDATA[Review]]></category>
		<category><![CDATA[balsamiq]]></category>
		<category><![CDATA[balsamiq mockups]]></category>
		<category><![CDATA[great software]]></category>
		<category><![CDATA[peldi]]></category>

		<guid isPermaLink="false">http://halfbakedbits.com/?p=88</guid>
		<description><![CDATA[In preparation for this week&#8217;s post, I started looking online for a GUI Mockup tool. One that was quick and easy to use, as well as a &#8220;not quite done&#8221; look that would spark collaboration (subjective I know). I didn&#8217;t want something that was heavy like: PowerPoint, Keynote, or Visio. I didn&#8217;t want something that [...]]]></description>
			<content:encoded><![CDATA[<p>In preparation for this week&#8217;s post, I started looking online for a GUI Mockup tool.  One that was quick and easy to use, as well as a &#8220;not quite done&#8221; look that would spark collaboration (subjective I know).  I didn&#8217;t want something that was heavy like: PowerPoint, Keynote, or Visio.  I didn&#8217;t want something that would encourage me to spend time in the antipattern of <a href="http://en.wikipedia.org/wiki/Big_Design_Up_Front">Big Design Up Front</a>.</p>

<h2>Here&#8217;s the entire review in two words: <strong>Perfect Fit</strong>.</h2>

<p><img alt="" src="http://farm4.static.flickr.com/3073/2847471156_fa78cd5496_b.jpg" title="Balsamiq Mockups - 1 Minute Example" class="aligncenter" width="685" height="400" /></p>

<p>Alright, <del datetime="2008-09-11T02:03:13+00:00">if you promise to come back, </del>stop reading and just <a href="http://www.balsamiq.com/demos/mockups/Mockups.html">try out the online demo</a>.</p>

<h3>Here&#8217;s what I really like:</h3>

<ul>
<li>Clean UI: property boxes are dimmed until needed, keeping you focused on your screen</li>
<li>Easy to Discover: I quickly found little nuances (like icon sizes)</li>
<li>Smart: auto-appearing guidelines for aligning elements and providing consistent borders, </li>
<li>Support: I had to contact Peldi about something and he responded <strong>within 45 minutes</strong>&#8230; from Italy&#8230; and it&#8217;s <a href="http://manishjethani.com/blog/2008/08/11/one-man-isv/">only Peldi as Balsamiq</a>.</li>
<li>Convincing: As I fly through this app I consistently try clicking on an object, expecting some behavior&#8230; only afterwards do I remind myself how <em>dumb I really am</em>.</li>
<li>Multi-platform, web-delivered: Adobe AIR application all the way.</li>
</ul>

<h3>Here&#8217;s what still needs work:</h3>

<ul>
<li>Consistent Text Editing: When editing text, I missed at first that I needed to use a &#8220;Label/String of Text&#8221; or &#8220;Paragraph of Text&#8221; to get Text Alignment, and other formatting options.</li>
<li>Favoring the Keyboard: many times I was editing text of an object and I wanted some &#8220;quick finish&#8221; keyboard command (say, CTRL+Enter) to commit my change and drop me out of edit mode.  Instead I had to use the mouse and click somewhere off the object.</li>
</ul>

<p>This is just great software to work with&#8230; fantastic job to <del datetime="2008-09-11T02:03:13+00:00">the huge software team</del>Peldi with <a href="http://www.balsamiq.com/products/mockups">Balsamiq Mockups</a>!
<a href="http://balsamiq.com/products/mockups"><img alt="Balsamiq Logo" src="http://www.balsamiq.com/images/balsamiq_logo1.jpg" width="176" height="50" /></a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=VuH_KSRDsls:o3J0pqQmaYs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=VuH_KSRDsls:o3J0pqQmaYs:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=VuH_KSRDsls:o3J0pqQmaYs:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=VuH_KSRDsls:o3J0pqQmaYs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=VuH_KSRDsls:o3J0pqQmaYs:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=VuH_KSRDsls:o3J0pqQmaYs:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=VuH_KSRDsls:o3J0pqQmaYs:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://halfbakedbits.com/2008/09/effortless-gui-mockups-with-balsamiq/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SVN Host Decision</title>
		<link>http://halfbakedbits.com/2008/09/svn-host-decision/</link>
		<comments>http://halfbakedbits.com/2008/09/svn-host-decision/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 16:54:42 +0000</pubDate>
		<dc:creator>Nathan Bedford</dc:creator>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[cvsdude.com]]></category>
		<category><![CDATA[fogbugz]]></category>
		<category><![CDATA[subversion hosting]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[wush.net]]></category>

		<guid isPermaLink="false">http://halfbakedbits.com/?p=76</guid>
		<description><![CDATA[Alright, so I&#8217;ve finally settled on an SVN host. Here&#8217;s the short list of what I was looking for: Excellent network reliability Excellent data reliability At least 2 GB of space At least 2 user accounts FogBugz integration Secure access to repository Good price ($15 or less per month) I was checking out the CVSDude.com, [...]]]></description>
			<content:encoded><![CDATA[<p>Alright, so I&#8217;ve finally settled on an SVN host.  Here&#8217;s the short list of what I was looking for:</p>

<ul>
<li>Excellent network reliability</li>
<li>Excellent data reliability</li>
<li>At least 2 GB of space</li>
<li>At least 2 user accounts</li>
<li>FogBugz integration</li>
<li>Secure access to repository</li>
<li>Good price ($15 or less per month)</li>
</ul>

<p>I was checking out the <a href="http://cvsdude.com/">CVSDude.com</a>, <a href="http://svnrepository.com/">SVNRepository.com</a>, <a href="http://unfuddle.com">Unfuddle.com</a>, <a href="http://beanstalkapp.com">BeanstalkApp.com</a>, <a href="http://www.codespaces.com">CodeSpaces.com</a>, <a href="http://www.hosted-projects.com/">Hosted-Projects.com</a>, and <a href="http://www.wush.net">Wush.net</a>.  Only three had 2GB/mo for $15 or less: CVSDude, SVNRepository, and Wush.net.</p>

<p>Out of those three options, only Wush.net and CVSDude allowed FogBugz integration.  SVNRepository did not advertise FB integration on their site, so Brett emailed them, and they confirmed NO FB INTEGRATION.  Too bad, too.  They had a nice price.</p>

<p>So I had to choose between Wush.net and CVSDude.  CVSDude has been around forever&#8230;since 2002.  Wush.net has been around since 2004.  CVSDude has over 45,000 projects hosted right now; I couldn&#8217;t see a project count on Wush.net.  Both seem to a solid data security plan (RAID, nightly backups, etc).</p>

<p>In the end, poor reviews of CVSDude made the difference.  I typed in &#8220;CVSDude&#8221; in my Firefox search window (Google search), and suggested search 3 and 4 was &#8220;CSVDude down&#8221; and &#8220;CVSDude problems&#8221;.  Ruh-row.</p>

<p>I&#8217;m sure CVSDude has to deal with a lot of traffic&#8230;probably several times more than Wush.net.  For now, however, we&#8217;ll use Wush.net, and maybe CVSDude will work through their scaling issues.</p>

<p>So Wush.net it is!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=0tu7mxSSgXc:YtXbKwtj7IA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=0tu7mxSSgXc:YtXbKwtj7IA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=0tu7mxSSgXc:YtXbKwtj7IA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=0tu7mxSSgXc:YtXbKwtj7IA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=0tu7mxSSgXc:YtXbKwtj7IA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=0tu7mxSSgXc:YtXbKwtj7IA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=0tu7mxSSgXc:YtXbKwtj7IA:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://halfbakedbits.com/2008/09/svn-host-decision/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>The Pit of Flexibility</title>
		<link>http://halfbakedbits.com/2008/08/the-pit-of-flexibility/</link>
		<comments>http://halfbakedbits.com/2008/08/the-pit-of-flexibility/#comments</comments>
		<pubDate>Mon, 25 Aug 2008 11:00:50 +0000</pubDate>
		<dc:creator>Brett Veenstra</dc:creator>
				<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[complexity]]></category>
		<category><![CDATA[flexibility]]></category>
		<category><![CDATA[problem solving]]></category>

		<guid isPermaLink="false">http://halfbakedbits.com/?p=14</guid>
		<description><![CDATA[As software creators, our passion (and livelihood) is to translate some human want or problem into CPU instructions. Often as the application matures and expands, regardless of architecture, there is a significant burden placed on the trainers and support staff as they work through inquiries by the user community. When an inquiry is strange enough, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://halfbakedbits.com/wp-content/uploads/2008/08/2538644176_8c46500004_m.jpg" alt="" title="Sarlacc Pit" width="240" height="181" class="alignleft size-medium wp-image-29" />As software creators, our passion (and livelihood) is to translate some human want or problem into CPU instructions.  Often as the application matures and expands, regardless of <a href="http://www.ibm.com/developerworks/library/ar-apparch4/">architecture</a>, there is a significant burden placed on the trainers and support staff as they work through inquiries by the user community.  When an inquiry is strange enough, it can finally make it back to the developers to handle (which will rank nearly as fun as writing documentation).  Sometimes your users will continue to demand additional options from the application, and as those are added, so does your support/training efforts.</p>

<h3>How Did We Fall</h3>

<p>Our applications usually <strong>start from a simple problem</strong> (something is costing someone money), but finish as masterpieces of problem solving.  There are many natural complicating factors that go into this finished solution, the principal among them being users require various ways of getting the answers they&#8217;re looking for.  Additionally, <strong>as a programmer, I rarely want to work on a problem that isn&#8217;t difficult.</strong>  All of these forces contribute to taking a once simple solution and creating a Pit of Flexibility.</p>

<h3>The Cost of Flexibility</h3>

<p>Martin Fowler had this <a href="http://www.artima.com/intv/flexplex2.html">comment about flexibility in software</a>:</p>

<blockquote>
  <p>The cost of flexibility is complexity. Every time you put extra stuff into your code to make it more flexible, you are usually adding more complexity.</p>
</blockquote>

<p>This complexity will directly affect your users&#8230; which in turn will load down your support staff.  You may have the brightest support staff, but problem solving a batch calculation system is a difficult and long business even for a few elements.  Once the support staff is spent, inquiries will be sitting on the your door as the developer.</p>

<p>Often these problems aren&#8217;t bugs, they&#8217;re just buried complexity.  Each element on even simple calculations can product a <a href="http://en.wikipedia.org/wiki/Big_O_notation">BigO</a> effect on the final complexity of the answer.  On applications written by different developers or teams, this problem solving can be compounded even further, taking the style and approach of each developer into account.  So how do we as programmers shift these efforts back where they belong, so we can <del datetime="2008-08-28T11:45:22+00:00">catchup on the latest 360 FPS</del> find something more productive to do?</p>

<h3>Jumping off the Treadmill</h3>

<p>The way off this treadmill is simple: let the people upstream see what your application does, let them be able to analyze how your application solves the problem.  Consider Wikipedia&#8217;s entry on problem solving, specifically the <a href="http://en.wikipedia.org/wiki/Problem_solving#Characteristics_of_difficult_problems">characteristics of difficult problems</a>:</p>

<blockquote>
  <ul>
  <li>Intransparency (lack of clarity of the situation)
  
  <ul>
  <li>commencement opacity</li>
  <li>continuation opacity</li>
  </ul></li>
  <li>Polytely (multiple goals)
  
  <ul>
  <li>inexpressiveness</li>
  <li>opposition</li>
  <li>transience</li>
  </ul></li>
  <li>Complexity (large numbers of items, interrelations, and decisions)
  
  <ul>
  <li>enumerability</li>
  <li>connectivity (hierarchy relation, communication relation, allocation relation)</li>
  <li>heterogeneity</li>
  </ul></li>
  <li>Dynamics (time considerations)
  
  <ul>
  <li>temporal constraints</li>
  <li>temporal sensitivity</li>
  <li>phase effects</li>
  <li>dynamic unpredictability</li>
  </ul></li>
  </ul>
</blockquote>

<p>The next time my application is stuck in the Pit of Flexibility, and I cannot reduce its flexibility, I&#8217;ll be building time into my estimates for additional interfaces that provide:</p>

<ul>
<li>Transparency: context of the solution and problem</li>
<li>Singularity: ability to find a specific example of a problem or work backwards from a solution</li>
<li>Simplicity: capability to filter elements of a solution, while offering the completeness of the full answer</li>
</ul>

<a href="http://www.dotnetkicks.com/kick/?url=http://halfbakedbits.com/2008/08/the-pit-of-flexibility/"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://halfbakedbits.com/2008/08/the-pit-of-flexibility/" border="0" alt="kick it on DotNetKicks.com" /></a>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=ldZgpQlP5WA:VDlcl9iW25M:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=ldZgpQlP5WA:VDlcl9iW25M:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=ldZgpQlP5WA:VDlcl9iW25M:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=ldZgpQlP5WA:VDlcl9iW25M:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=ldZgpQlP5WA:VDlcl9iW25M:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=ldZgpQlP5WA:VDlcl9iW25M:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=ldZgpQlP5WA:VDlcl9iW25M:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://halfbakedbits.com/2008/08/the-pit-of-flexibility/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The search begins</title>
		<link>http://halfbakedbits.com/2008/08/the-search-begins/</link>
		<comments>http://halfbakedbits.com/2008/08/the-search-begins/#comments</comments>
		<pubDate>Sat, 23 Aug 2008 17:07:51 +0000</pubDate>
		<dc:creator>Nathan Bedford</dc:creator>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[fogbugz]]></category>
		<category><![CDATA[subversion hosting]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://halfbakedbits.com/?p=17</guid>
		<description><![CDATA[I&#8217;m pretty excited to be a part of HBB&#8230;this is gonna be awesome. My first task here is to get a FogBugz On-Demand account setup. After that, I need to find us a good remote SVN host. We&#8217;re looking for something inexpensive and fast, with excellent uptime and a lot of storage space. I&#8217;ll post [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m pretty excited to be a part of HBB&#8230;this is gonna be awesome.</p>

<p>My first task here is to get a FogBugz On-Demand account setup.  After that, I need to find us a good remote SVN host.  We&#8217;re looking for something inexpensive and fast, with excellent uptime and a lot of storage space.</p>

<p>I&#8217;ll post the results of my search when I&#8217;m done.  But first, I&#8217;m going with my family to <a href="http://www.michigandnr.com/ParksandTrails/Details.aspx?id=462&#038;type=SPRK">Island Lake</a>!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=iz3I2q7v8bA:3jFBqYF54Vk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=iz3I2q7v8bA:3jFBqYF54Vk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=iz3I2q7v8bA:3jFBqYF54Vk:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=iz3I2q7v8bA:3jFBqYF54Vk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=iz3I2q7v8bA:3jFBqYF54Vk:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=iz3I2q7v8bA:3jFBqYF54Vk:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=iz3I2q7v8bA:3jFBqYF54Vk:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://halfbakedbits.com/2008/08/the-search-begins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hello world</title>
		<link>http://halfbakedbits.com/2008/08/hello-world/</link>
		<comments>http://halfbakedbits.com/2008/08/hello-world/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 20:11:27 +0000</pubDate>
		<dc:creator>Brett Veenstra</dc:creator>
				<category><![CDATA[Announcement]]></category>

		<guid isPermaLink="false">http://halfbakedbits.com/?p=3</guid>
		<description><![CDATA[Half-Baked Bits is the nexus of the projects that Nathan &#38; I have built over the years: those skunkworks tools that we build to make the grind smoother.]]></description>
			<content:encoded><![CDATA[<p><a href="http://halfbakedbits.com/wp-content/uploads/2008/08/half-baked-bits.png"><img src="http://halfbakedbits.com/wp-content/uploads/2008/08/half-baked-bits.png" alt="" title="Half-Baked Bits Logo" width="216" height="75" class="alignnone size-medium wp-image-6" /></a>
Half-Baked Bits is the <a href="http://en.wikipedia.org/wiki/Nexus">nexus</a> of the projects that Nathan &amp; I have built over the years: those skunkworks tools that we build to make the grind smoother.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=uCzlwdUI0K8:lPS0a3OqYXk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=uCzlwdUI0K8:lPS0a3OqYXk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=uCzlwdUI0K8:lPS0a3OqYXk:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=uCzlwdUI0K8:lPS0a3OqYXk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=uCzlwdUI0K8:lPS0a3OqYXk:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/halfbakedbits?a=uCzlwdUI0K8:lPS0a3OqYXk:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/halfbakedbits?i=uCzlwdUI0K8:lPS0a3OqYXk:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://halfbakedbits.com/2008/08/hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

