<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/xsl' href='rssxsl.xslt' version='1.0'?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>secretGeek</title> 
<link>http://secretGeek.net/index.asp</link> 
<description>secretGeek - dot Nuts about dot Net!</description> 
<copyright>Copyright 2007 Leon Bambrick</copyright>
<language>en-au</language> 
<managingEditor>LeonBambrick@NoSpamGMAIL.com (Leon Bambrick)</managingEditor> 
<webMaster>LeonBambrick@NoSpamGMAIL.com (Leon Bambrick)</webMaster>
<atom:link href="http://secretGeek.net/rss.asp" rel="self" type="application/rss+xml" /> 
<image>
<title>secretGeek</title>
<url>http://secretGeek.net/secretgeek2_noT.gif</url>
<link>http://secretGeek.net/index.asp</link>
<width>49</width>
<height>33</height>
<description>secretGeek - dot Nuts about dot Net!</description> 
</image>
<item>
  <title>Do they store the code for TFS in TFS?</title>
    <link>http://www.secretGeek.net/tfs_in_tfs.asp</link>
    <description>
      <![CDATA[<p>If they don't -- then it gives me absolutely no confidence in the product.</p><p>But if they do store the code for TFS in an instance of TFS... well, in that case I have absolutely no confidence in the product.</p><p>;-)</p>]]>
    </description>
    <pubDate>Wed, 23 Jul 2008 00:28:54 GMT</pubDate>
    <dc:creator>Leon Bambrick</dc:creator>
    <guid>http://www.secretGeek.net/tfs_in_tfs.asp</guid>
  </item>
<item>
  <title>Sudden TimeSnapper Discount!</title>
    <link>http://www.secretGeek.net/ts_all_too_cheap.asp</link>
    <description>
      <![CDATA[<p>Hey cats and crooners.</p><div style='float:right;margin-right:25px;'><a href='http://TimeSnapper.com'><div style="height:72px;width:220px;cursor:hand;cursor:pointer;padding-left:67px;padding-top:25px;font-weight:bold;font-size:1.2em;margin-left:10px;text-decoration:underline;background:url(http://secretGeek.net/image/timeclassic_.png) no-repeat;">TimeSnapper<sub style="font-weight:normal;font-size:0.85em;display:block;">Cheap now, not for long!</sub></div></a></div><p><a href='http://TimeSnapper.com'>TimeSnapper</a> is on sale for a very short while.</p><p>We're dropping the price to <a href='http://TimeSnapper.com/purchase.aspx'>$19.95</a>, waaaay down from the usual $39.95.</p><p>I quite like the normal price. People pay it. They're polite about it. And I get some money in my pocket.</p><p>But my most excellent business partner, Atli, seems to have this generous (<em>*cough* misguided *cough*</em>) soul where he believes that people with less money, (and also bargain hunters), deserve to get their hands on the software we've worked so very <strong>very</strong> hard to build and to continuously improve. He thinks we ought to give that away for practically next to nothing. Thanks Atli. Great Idea. Up there with Napoleon's invasion of Russia. (A dismal failure that one, by the way). So, anyway, he talked about offering a temporary discount, and I foolishly let him proceed.</p><p>I don't want to over-dramatize the point, but clearly these insane prices won't last. We'll either go broke or end up in business-divorce-court. So if you want to improve the way you record and organise your life, <a href='http://TimeSnapper.com/Purchase.aspx'>purchase</a> <a href='http://TimeSnapper.com'>TimeSnapper</a> this very damn minute.</p><p>It's good software, that helps you organise your life, understand how you live it, improve how you work, recover from problems, and a whole lot more. We make it better every chance we get.</p><p>And there's an extra bonus for non-US customers. This took a lot of organising. The American dollar is currently in the toilet, so anything priced in US dollars is much cheaper than usual. (<em>Deal with it</em>, my yankee brothers.)</p>]]>
    </description>
    <pubDate>Sat, 12 Jul 2008 13:03:53 GMT</pubDate>
    <dc:creator>Leon Bambrick</dc:creator>
    <guid>http://www.secretGeek.net/ts_all_too_cheap.asp</guid>
  </item>
<item>
  <title>How Can Microsoft Beat Google?</title>
    <link>http://www.secretGeek.net/ms_v_google.asp</link>
    <description>
      <![CDATA[<a href='http://secretGeek.net/ms_v_google.asp' style='padding:0'><img src='http://secretGeek.net/image/rocky_versus_drago.PNG' alt='Microsoft versus Google with the European Union as adjudicator perhaps. Not sure which one is google and which one is microsoft. Such attributions are perhaps the heart of the problem.' style='border:1pt solid #000;float:right;margin:4pt;margin-left:7pt'/></a><p>This is an interesting question that almost everyone misinterprets.</p><p>People assume the question is:</p><blockquote><p>(wrong question) "How can Microsoft beat Google at <em>Search</em>?"</p></blockquote><p>But Search doesn't make money. Forget search. (Search just brings traffic).</p><p>Advertising makes money.</p><p>While Google are almost <em>invincible</em> at search, they're quite flimsy at advertising. Lucky for them, most other people suck even more at advertising.</p><p>If Microsoft offered a significantly improved advertising service, then Google would be forced to buy advertising services off Microsoft. And then, the more Google excelled at search, the more money Microsoft would make.</p><p>Think about that for a moment. It sounds insane, like some whacked out piece of futurama satire, but i'm deadly serious. Okay, not deadly <em>lethal</em> serious, but serious enough to repeat it in a <code>&lt;blockquote&gt;</code>, for those who scan without reading:</p><blockquote><p><strong>"If Microsoft offered a significantly improved advertising service, then Google would be forced <em>(by shareholders)</em> to buy advertising services off Microsoft!"</strong></p></blockquote><p>Five  years ago, Google's advertising offerings were revolutionary. Their minimalist text-only ads took the world by storm. The jaded internet user actually clicked on a few ads. An incredible time was had by all.</p><p>In the five years since, Google have offered only marginal innovation.</p><p>The funny thing is that in those five years, Microsoft seem to have gone almost backwards!</p><p>Far from jumping on the 'minimalist' bandwagon, they persist with the blinky-banner ad school of thinking, and even dropped SIX billion dollars on <a href='http://www.msnbc.msn.com/id/18736303/'>buying aQuantive</a>, early last year in a move that... well, i'd be scratching my head if i were Steve Balmer.</p><p>Microsoft could simply fire everyone in advertising, and get a bunch of lunatic perverts from a local insane venereal-monkey asylum, and probably come up with a better advertising program. (There are rumours that they've done exactly that several times already)</p><p>Now, in the interests of being <a href='http://www.youtube.com/watch?v=FArZxLj6DLk' title='flight of the conchords... you MUST follow that link, sorry but if you dont follow it i will ban you from visiting'>more constructive with my feedback</a>, here's my two step plan for winning at advertising.</p><ol><li>Clone what google currently do (i.e. same thing they did five years ago)</li><li>Improve upon it.</li></ol><p>The real constructive criticism would be around how to improve upon what Google currently do with advertising.</p><p>I'm out of time. So what are <em>your</em> thoughts, how can advertising be better than we get from Google today? </p>]]>
    </description>
    <pubDate>Sat, 12 Jul 2008 09:38:55 GMT</pubDate>
    <dc:creator>Leon Bambrick</dc:creator>
    <guid>http://www.secretGeek.net/ms_v_google.asp</guid>
  </item>
<item>
  <title>TimeSnapper 3.1: Attack of the the Red/Green Stripes</title>
    <link>http://www.secretGeek.net/red_green_stripes.asp</link>
    <description>
      <![CDATA[<p>There's a new release of <a href='http://TimeSnapper.com'>TimeSnapper</a>, which brings us up to version 3.1.</p><p>You can now see your productivity profile at a glance, when playing back your day.</p><img src='http://secretGeek.net/image/redgreen.PNG' alt='Green and red stripes in the timebar indicate your productive and non-productive time' style='border:1pt solid #000;margin-left:7px;padding:10px;background-color:#FFF'/><p>This turned out to be a real "must have" feature. As soon as I'd implemented a rough version of it (on my home computer) I was frustrated that it wasn't yet available on my work computer. There was no going back.</p><p>We call it 'red/green' striping, because it shows productive time in green, and non-productive time in red.</p><p>You can quickly filter to see only the productive time, or only the non-productive time.</p><p>To teach <a href='http://TimeSnapper.com'>TimeSnapper</a> about what time is considered productive or non-productive you use a simple wizard. You list some applications as 'always productive'. And you can indicate keywords that are a sign of productive time.</p><p>If you aren't interested in productivity tracking, then you get a smooth blue timebar instead.</p><img src='http://secretGeek.net/image/redgreen_off.PNG' alt='Not watching productivity? you get a blue time bar instead' style='border:1pt solid #000;margin-left:7px;padding:10px;background-color:#FFF'/><p>It took a while to iron out the bugs, because this is a feature that I implemented, not Atli. To be fair, there were a lot of edge cases to uncover.</p> <p>Also, automatic updates are enabled again. So you can automatically upgrade from whatever version you are on, right up to version 3.1.</p> <p>Thanks to all the new users, and all the ongoing users who help us out with <a href='http://forums.timesnapper.com/forums/'>feedback</a> and encouragement.</p><p>Also, please, if you see something we can do better, <a href='http://forums.timesnapper.com/forums/'>please tell us</a>. We try. By god do we try!</p>]]>
    </description>
    <pubDate>Tue, 08 Jul 2008 12:10:49 GMT</pubDate>
    <dc:creator>Leon Bambrick</dc:creator>
    <guid>http://www.secretGeek.net/red_green_stripes.asp</guid>
  </item>
<item>
  <title>21 tools used in our MicroISV</title>
    <link>http://www.secretGeek.net/25steps_21tools.asp</link>
    <description>
      <![CDATA[<p>Many, well, <em>years</em>, ago I started a series of articles on <a href='http://secretgeek.net/25steps.asp'>'25 steps for building a Micro ISV'</a>. It's still something that I care about very much, and that I hope to get back to sharing.</p><p>In the meanwhile, here's a quick wrap up of the some of the tools we use to help run <a href='http://TimeSnapper.com'>TimeSnapper</a>, our MicroIsv.</p><p>These are by no means the 'ultimate' choice or 'best of breed' in each category -- these are just the choices that we happen to use in TimeSnapper.</p><p>I think it's interesting to see just how much software we rely upon, even though we are 'Independent'.</p><p>This also leaves out the dozens of articles and blog entries that teach, inspire or unblock along the way, and the many tools we've considered using, or the many tools we're planning to switch to.</p><ol><li>Register Domain <ul><li><a href='http://www.GoDaddy.com'>Go Daddy</a></li></ul></li><li>Reliable hosting  <ul><li><a href='http://www.WebHost4Life.com'>Web Host 4 Life</a></li></ul></li><li>Website design -- free templates  <ul><li><a href='http://andreasviklund.com/'>Andreas Viklund</a></li></ul></li><li>Basic Website content  <ul><li>(write it yourself)</li></ul></li><li>Install traffic monitoring on your site  <ul><li><a href='http://www.google.com/analytics/'>Google Analytics</a></li></ul></li><li>Create forums, encourage feedback  <ul><li><a href='http://www.communityserver.org/'>Community Server</a></li></ul></li><li>Maintain a FAQ  <ul><li>(write it yourself)</li></ul></li><li>Get the best screenshots you can  <ul><li><a href='http://'>Snag It</a></li>	</ul></li><li>Configure email for domain  <ul><li>(all by yourself)</li></ul></li><li>Get payment account  <ul><li><a href='http://www.paypal.com/'>Paypal</a></li></ul></li><li>Allow payment from your website  <ul><li>(all by yourself)</li></ul></li><li>Create a PAD file -- portable application description  <ul><li><a href='http://www.padgen.org/'>PAD Gen</a></li></ul></li><li>Register at download sites  <ul><li><a href='http://robosoft.rudenko.com/'>RoboSoft</a></li></ul></li><li>Strategy: separate "free" from "professional" products  <ul><li>(all by yourself)</li></ul></li><li>Get a suitable end user license agreement (EULA) -- infact get two!  <ul><li>(write it yourself, with help from weasel lawyer friends)</li></ul></li><li>Auto update strategy  <ul><li><a href='http://www.advantechsoftware.com.au'>Advantech</a> Download Unzip and Run tool, which in turn uses:</li><li><a href='http://www.icsharpcode.net/OpenSource/SharpZipLib/'>SharpZipLib</a></ul></li><li>License activation webservice/website  <ul><li>(we wrote our own using asp.net and <a href='http://www.firebirdsql.org/'>firebird</a>)</li></ul></li><li>Get a license management database  <ul><li>(we wrote our own)</li></ul></li><li>Build a proper installer  <ul><li><a href='http://www.jrsoftware.org/isinfo.php'>inno setup</a></li></ul></li><li>Obfuscate your assemblies  <ul><li><a href='http://www.preemptive.com/products/dotfuscator/'>dotfuscator</a></li></ul></li><li>Automate your build+release strategy  <ul><li>We've switched from final builder pro to batch files, to <a href='http://msdn.microsoft.com/en-us/library/ms171452.aspx'>ms build</a></li></ul></li><li>Free up enough time/resources for dealing with support/feedback  <ul><li><a href='http://www.fogcreek.com/FogBUGZ/IntrotoOnDemand.html'>fogbugz ondemand</a></li></ul></li><li>Shiny, Usable, Helpful  <ul><li><a href=''></a></li></ul></li><li>Plan and enact your promotional strategy  <ul><li><a href='http://www.bitsdujour.com'>bits du jour</a></li>	<li><a href='http://www.sharewarepromotions.com'>shareware promotions</a></li>  <li><a href='http://www.CampaignMonitor.com'>campaign monitor</a></li></ul></li><li>Do it all again  <ul><li>No tools required ;-)</li></ul></li></ol><p>Strangely absent from the list is our current choice of source control tool -- <a href='http://www.sourcegear.com/vault/'>SourceGear Vault.</a></p>    ]]>
    </description>
    <pubDate>Wed, 02 Jul 2008 11:16:43 GMT</pubDate>
    <dc:creator>Leon Bambrick</dc:creator>
    <guid>http://www.secretGeek.net/25steps_21tools.asp</guid>
  </item>
<item>
  <title>Lost Treasures of the DOS World: tree!</title>
    <link>http://www.secretGeek.net/dos_tree_nc.asp</link>
    <description>
      <![CDATA[
<p>I luckily stumbled onto a long forgotten gem today -- the <code>Tree</code> command in DOS.</P>
<p>What does tree do?</p><p>Tree promises to:</p><blockquote>
<p>"Graphically display the directory structure of a drive or path."</p>
</blockquote><p>Here's the output of tree called on the <code>obj</code> folder of a .net project, for example:</p>
<pre style='width:200px;background-color:#000;color:#CCC'>&gt;tree<br /> <br />+---Debug<br />|   +---temp<br />|   +---TempPE<br />+---Release<br />    +---temp<br />    +---TempPE<br /></pre>		<p>It's awesome to see the Graphical power of DOS unleashed!</p><p>Here it is with the marvelous 'f' parameter, that also shows files...</p> 		<pre style='width:200px;background-color:#000;color:#CCC'>&gt;tree /f<br /> <br />+---Debug<br />|   |   AboSoftLib.dll<br />|   |   AboSoftLib.pdb<br />|   |   TSLib.dll<br />|   |   TSLib.pdb<br />|   |   TSLib.vbproj.FileListAbsolute.txt<br />|   |   TSLib.xml<br />|   |<br />|   +---temp<br />|   +---TempPE<br />+---Release<br />    |   TSLib.dll<br />    |   TSLib.vbproj.FileListAbsolute.txt<br />    |   TSLib.xml<br />    |<br />    +---temp<br />    +---TempPE<br /></pre>		<p>What joy!</p><p>(Now where was I? Ah yes, about to install <a href='http://en.wikipedia.org/wiki/Norton_Commander'>nc</a>)</p>]]>
    </description>
    <pubDate>Wed, 02 Jul 2008 09:37:33 GMT</pubDate>
    <dc:creator>Leon Bambrick</dc:creator>
    <guid>http://www.secretGeek.net/dos_tree_nc.asp</guid>
  </item>
<item>
  <title>The Virtual Machine Machine and the Virtual Virtual Machine</title>
    <link>http://www.secretGeek.net/vm_vvm_vmm.asp</link>
    <description>
      <![CDATA[<p><small><em>(sorry for posting this drivel from my own backlog of notes. i'm pretty ill at the moment, and don't have time to do any better. there are some good things in the works though -- a whole slew of nifty projects just kicking off)</em></small></p><p>That drunk <a href='http://steve-yegge.blogspot.com/2008/06/rhinos-and-tigers.html'>steve yegge</a> was muttering onstage about languages, and said something that raised an obvious idea in my mind:</p><blockquote><p>Virtual machines are great for language interoperability. If everybody in the world used [the language D, for example], you probably wouldn't need a virtual machine. You'd probably still want one eventually, because of the just-in-time compilers, and all the runtime information they can get.</p></blockquote><blockquote><p>But by and large, we don't all use D. In fact, we probably don't all use the same five languages in this room. And so the VM, whether it's the CLR, or the Java VM, or Parrot, or whatever... it provides a way for us to interoperate.</p></blockquote><p>Although he weakens his own point by mentioning these competing VMs (CLR, JVM, Parrot) -- this slip up makes me wonder: can a VVM be created? A Virtual Virtual Machine -- that acts as a layer between languages and virtual machines, and allows higher level code to be translated onto <em>any</em> virtual machine.</p><h2>Dawn of computer age</h2><pre>We write:<br />Machine Code</pre><h2>Compilers invented...</h2><p><small><em>thank you <a href='http://en.wikipedia.org/wiki/Grace_Hopper'>gracie!</a></em></small></p><pre>We write:<br /><br />Code, compiled to<br />Machine Code<br /></pre><h2>Currently...</h2><pre>We write:<br /><br />Code, compiled to<br />VM code, jitted to<br />Machine code</pre><h2>Future?</h2><pre>We write:<br /><br />Code, compiled to<br />VVM code, zapped into<br />VM code, jitted to<br />Machine code</pre><p>Or instead we could intercept between the Virtual and Physical tiers with a Virtual Machine Machine -- </p><pre>We write:<br /><br />Code, compiled to<br />VM code, jitted to<br />VMM code, swizzled down to<br />Machine code</pre><p>So the full five tier infrastructure would be:</p><pre>We write:<br /><br />Code, compiled to<br />VVM code, zapped onto<br />VM code, jitted to<br />VMM code, swizzled down to<br />Machine code</pre><p>The opportunities for optimization would be endless! (or.... just hopeless)</p>]]>
    </description>
    <pubDate>Fri, 27 Jun 2008 10:04:11 GMT</pubDate>
    <dc:creator>Leon Bambrick</dc:creator>
    <guid>http://www.secretGeek.net/vm_vvm_vmm.asp</guid>
  </item>
<item>
  <title>Should Linq To Sql Go "Open Source"?</title>
    <link>http://www.secretGeek.net/l2s_os.asp</link>
    <description>
      <![CDATA[<p>Linq to Sql started life as:</p><blockquote><p>" ...a humble Visual Studio project on my desktop machine way back in the fall of 2003..."<br /><a href='http://blogs.msdn.com/mattwar/archive/2007/05/31/the-origin-of-linq-to-sql.aspx'>Matt Warren</a></p></blockquote><p>It only reached production when <a href='http://msdn.microsoft.com/en-us/library/ms971512.aspx'>ObjectSpaces</a> failed to ship with VS2005 (it took a dependency on the <a href='http://blogs.msdn.com/winfs/archive/2006/06/23/644706.aspx'>ill-fated WinFS</a>).</p><p>In November 2007, ownership of Linq 2 Sql <a href='http://blogs.msdn.com/dinesh.kulkarni/archive/2007/10/15/linq-to-sql-what-is-not-in-rtm-v1.aspx'>was transferred</a> from the C# team to the SQL Data Programmability team.</p><p>And now, microsoft are finally poised to release their long-anticipated ADO.Net Entity Framework (aka, 'EF').</p><p>Maintaining both EF and L2S involves some clear conflicts of interest.</p><p>So, here's a brief Edward De Bono style "Plus/Minus/Interesting" analysis of the question:</p><h1>'should Linq to sql go open source?'</h1><h2>Plus:</h2><ul><li>It could get a lot of people working on it.</li><li>Features could be added based directly on community need, eg.<ul><li>mockability</li><li>multiple providers</li><li>ability to refresh portions of the model without refreshing the entire thing.</li><li>...and other alleged <a href='http://cs.rthand.com/blogs/blog_with_righthand/archive/2007/10/06/LINQ-to-SQL-showstoppers.aspx'>showstoppers</a></li></ul></li></ul><h2>Minus:</h2><ul><li>If it doesn't get many contributions, then it could effectively kill the product, as it would be hard to move it back in-house.</li><li>It would probably become impossible to ship it as part of the framework, due to liability concerns.</li><li>Open Source is Communism ;-). (ah, kidding)</li></ul><h2>Interesting:</h2><ul><li>It could represent a hedge-bet / fallback position in case <a href='http://en.wikipedia.org/wiki/ADO.NET_Entity_Framework'>Entity Framework</a> doesn't take off. (EF is pretty big and i'm a little worried that it won't take off).</li><li><em>With or without it being open sourced</em>, the community (that's us!) can create <a href='http://weblogs.asp.net/fbouma/archive/2008/05/01/linq-to-sql-support-added-to-llblgen-pro.aspx'>awesome third party products</a>, add-ons and <a href='http://blogs.msdn.com/mattwar/archive/2008/05/04/mocks-nix-an-extensible-linq-to-sql-datacontext.aspx'>scary</a>  <a href='http://blogs.msdn.com/dinesh.kulkarni/archive/2008/05/05/linq-to-sql-tips-3-deferred-lazy-loading-of-related-objects-with-stored-procs.aspx'>work arounds</a> to extend or <a href='http://www.emadibrahim.com/2008/04/04/unit-test-linq-to-sql-in-aspnet-mvc-with-moq/'>test</a> linq to sql</p></li></ul><p>What are the chances? </p>]]>
    </description>
    <pubDate>Sat, 21 Jun 2008 11:56:56 GMT</pubDate>
    <dc:creator>Leon Bambrick</dc:creator>
    <guid>http://www.secretGeek.net/l2s_os.asp</guid>
  </item>
<item>
  <title>Redux: New Synchronisation Idea Overlooked By Microsoft</title>
    <link>http://www.secretGeek.net/sky_v_folder_drive_v_share.asp</link>
    <description>
      <![CDATA[<p>I <a href='http://secretgeek.net/sync_live.asp'>promised earlier</a> I'd look deeper into microsoft's products around Synchronisation -- here's the first  thing I want to make clear:</p><h2>FolderShare and SkyDrive are completely different</h2><p>or to put that another way:</p><div style='float:left'><img src='http://secretgeek.net/image/win_sync_th.png' alt='folershare' /><font color=red style='font-size:XX-large'>DOES NOT EQUAL</font><br /><a href='http://www.foldershare.com/'>FolderShare</a></div><div style='float:left;margin-left:10px'><img src='http://secretgeek.net/image/win_sync_3_th.png' alt='SkyDrive' /><br /><a href='http://skydrive.live.com/'>SkyDrive</a></div><div style='clear:both'>&nbsp;</div><h2>But wait a second... are you retracting your earlier claims?</h2><p>Yes and no. There is a massive fail here -- i'll get to that in a moment.</p><p>But first I want to clear up the differences between these two products.</p><p><a href='http://skydrive.live.com/'>SkyDrive</a> is just <strong>online storage</strong>, and <em>it has nothing to do with synchronizing those files to any location</em>. There's no client side components (no shell extension, no explorer integration) no developer API -- nothing like that. But on the plus side it's 5 GIG, and it's deeply integrated with the spaces.live.com "on line presence" system.</p><p><a href='http://www.foldershare.com/'>FolderShare</a>, on the other hand, is all about <strong>synchronizing files via the internet.</strong> There's no online storage at all. Instead you download and run a small client application <a href='https://www.foldershare.com/clientdownload.aspx'>(from here)</a> on each of your machines, including Mac OSX. And thus, peer to peer connections can be established (i think they're encrypted and then proxied via microsoft servers) for synchronizing folders.</p><p>Each of these are very strong products, and very useful. You can find a lot of people who use and love these services.</p><p>Microsoft did a commendable thing when they bought foldershare, and made it free. Thank you!</p><h2>But the massive fail belongs to...</h2><p>The massive fail here belongs to the "cut and paste marketing" that's been used to push these two products.</p><p>It's a new term I'm coining for Marketing-Communication teams who plagiarise their own work.</p><p>Compare and contrast the difference in these two messages:</p><blockquote><p>"Sharing with friends, co-workers, and family is easy..."<br /><a href='https://www.foldershare.com/learnmore.aspx'>Folder Share marketing</a></p></blockquote><blockquote><p>"Sharing with friends, co-workers, or family is easy"<br /><a href='http://skydrive.live.com/'>Sky Drive marketing...</a></p></blockquote><p>And compare these two:</p><blockquote><p>"access your personal files from anywhere online"<br /><a href='http://skydrive.live.com/'>Sky Drive marketing...</a></p></blockquote><blockquote><p>"Access your files from any computer."<br /><a href='https://www.foldershare.com/learnmore.aspx'>Folder Share marketing</a></p></blockquote><p>The lesson for me is that while <a href='http://secretgeek.net/upsert_revisited.asp'>re-use is a Good Thing</a> when writing code... it's not so good in the world of <a href='http://www.ericsink.com/Positioning.html'>product positioning</a>.</p>]]>
    </description>
    <pubDate>Wed, 18 Jun 2008 05:23:23 GMT</pubDate>
    <dc:creator>Leon Bambrick</dc:creator>
    <guid>http://www.secretGeek.net/sky_v_folder_drive_v_share.asp</guid>
  </item>
<item>
  <title>New Synchronisation Idea Overlooked By Microsoft Live team</title>
    <link>http://www.secretGeek.net/sync_live.asp</link>
    <description>
      <![CDATA[<img src='http://secretGeek.net/image/win_sync_th.png' alt='folder share' style='border:1pt solid #000;margin-left:7px;padding:10px;background-color:#FFF;float:right;clear:right;'/><img src='http://secretGeek.net/image/win_sync_2_th.png' alt='mesh' style='border:1pt solid #000;margin-left:7px;padding:10px;background-color:#FFF;float:right;clear:right;'/><img src='http://secretGeek.net/image/win_sync_3_th.png' alt='sky drive' style='border:1pt solid #000;margin-left:7px;padding:10px;background-color:#FFF;float:right;clear:right;'/><p>Microsoft's Live team have lots of different offerings that let you synchronize your information from one place to another.<p>They've got <a href='https://www.mesh.com/Welcome/Welcome.aspx'>Live Mesh</a>, for sharing 'your digital world' here there and everywhere.</p><p>They've got <a href='http://skydrive.live.com/'>Sky Drive</a>, which lets you share files with yourself, your friends, anyone.</p><p>There's <a href='http://www.foldershare.com/'>folder share</a>, the start up company they bought out which does more or less the same thing.</p><p>There's something called <a href='http://workspace.office.live.com/'>office live workspace</a> which lets you sync and collaborate and something else.</p><p>There's <a href='http://www.microsoft.com/downloads/details.aspx?familyid=c26efa36-98e0-4ee9-a7c5-98d0592d8c52&displaylang=en'>synctoy</a>, which uses <a href='http://msdn2.microsoft.com/en-us/sync/bb887623.aspx'>Sync Services for File Systems</a>. It's a kind of Robocopy on downers, with a UI.</p><p>And then there's the grand daddy of all of these -- Ray Ozzie's offering, <a href='http://office.microsoft.com/en-us/groove/FX100487641033.aspx'>Groove.</a></p><h1>Holy Fracking Jesus, Microsoft!</h1> <p>There's clearly one Synchronisation concept that escaped them completely.</p><p>They could've gotten together as a team, shared their ideas, and realized: Oh Crap! We're all building different versions of the same thing.</p><p>Instead of creating a tangle of overlapping and unmergeable products, why didn't they synchronise their thinking and work out what problem they're trying to solve.</p><p>And then build one <em>compelling</em> product, that's a <em>joy</em> to use, and which <em>clearly</em> solves that problem.</p><hr /><small><p>Not to mention <a href='http://www.microsoft.com/sharepoint/default.mspx'>sharepoint</a> which let's you, well, share. Up to a point.</p><p>And, <a href='http://www.syncmyride.com/default.aspx?'>microsoft/ford sync</a> for talking to your cars.</p><p>Or <a href='http://msdn.microsoft.com/en-us/sync/default.aspx'>Microsoft Sync Framework</a>.</p><p>Or, <a href='http://labs.live.com/Listas.aspx'>Live Labs Listas</a> which helps you share lists.</p><p>Or, <a href='http://www.microsoft.com/windowsmobile/activesync/activesync45.mspx'>ActiveSync</a>, which well, sows frustration and despair on mobile devices everywhere.</p></small><img src='http://secretGeek.net/image/win_sync_4_th.png' alt='groove' style='border:1pt solid #000;margin-left:7px;padding:10px;background-color:#FFF;'/><img src='http://secretGeek.net/image/win_sync_5_th.png' alt='live workspaces' style='border:1pt solid #000;margin-left:7px;padding:10px;background-color:#FFF;'/><img src='http://secretGeek.net/image/win_sync_th_6.png' alt='synctoy' style='border:1pt solid #000;margin-left:7px;padding:10px;background-color:#FFF;'/>]]>
    </description>
    <pubDate>Wed, 11 Jun 2008 11:51:21 GMT</pubDate>
    <dc:creator>Leon Bambrick</dc:creator>
    <guid>http://www.secretGeek.net/sync_live.asp</guid>
  </item>
<item>
  <title>Visual Studio UX Taskforce, Office UX Taskforce... etc.</title>
    <link>http://www.secretGeek.net/vs_uxtaskforce.asp</link>
    <description>
      <![CDATA[<p>Long Zheng's <a href='http://www.istartedsomething.com/taskforce/'>Windows UX Taskforce</a> is amazing.</p><p>In the space of a few days, what started as a blog post has turned into a web phenomenom. He put together the digg-like site in a couple of days, apologizing all the while how long it was taking. (It's actually based more on a site from Dell called <a href='http://www.ideastorm.com/'>IdeaStorm</a> but calling it 'digg-like' gives it an instant familiarity).</p><p>The amount of content now available is stunning. <a href='http://www.istartedsomething.com'>Long</a> is awesome -- but so are the people who follow his blog. The recurring theme is that <em>little things add up.</em></p><p>This is a point that <a href='http://www.joelonsoftware.com'>Joel Spolsky</a> makes over and over on his website (when he's not telling you to learn C)</p><blockquote><p>"Another tiny frustration. These things add up; these are the things that make us unhappy on a day-to-day basis. Even though they seem too petty to dwell on (I mean, there are people starving in Africa, for heaven's sake... ), nonetheless they change our moods."<br />--Joel Spolsky in <a href='http://www.joelonsoftware.com/uibook/chapters/fog0000000057.html'>User Interface Design for Programmers</a> </p></blockquote><p>I think we need more of these UX Task force sites. What I'd love to see:</p><ul><li><h2>Office.UXTaskForce.com</h2>a community site for improving usability in MS Office</li><li><h2>VisualStudio.UXTaskForce.com</h2>improve Visual Studio</li><li><h2>IE.UXTaskForce.com</h2>improve Internet Explorer</li></ul><p>...and so on for any software that has sufficient surface area to maintain its own independent site for focusing on user experience.</p><p>Obviously my own needs are too limited to the microsoft realm -- such is my burden in life.</p><p>I checked if the <code>UXTaskForce.com</code> site was available, with the idea of donating it to Long (he's a fellow Australian after all)</p><p>The website has been registered, and only a few days ago -- hopefully it's Long himself who grabbed it.</p><blockquote><pre>Domain Name: UXTASKFORCE.COM<br />Registrar: ONLINENIC, INC.<br />Updated Date: 08-jun-2008<br />Creation Date: 08-jun-2008<br />Expiration Date: 08-jun-2009<br /></pre></blockquote><p>If there was a community-backed Visual Studio UX Taskforce (rather than the paltry <a href='https://connect.microsoft.com/VisualStudio'>connect.microsoft.com/VisualStudio</a>), here's something I'd contribute (from the last few minutes). It's really small, but... well, little things add up.</p><style type="text/css">.sub .info {margin-left: 100px;}.sub img.attach {float: right;margin: 15px;margin-bottom: 15px;}.sub a {border:0px solid #FFF;}.sub a img.attach {border: 0 none;}.sub p.meta {font-size: 12px;color: #666;margin-left: 0;}.sub p.meta span.edit {display: inline;margin: 0 0 0 10px;} .sub p.meta span.edit a {background: #ffef80 url(images/page_edit.png) no-repeat 2px;padding: 0 2px 1px 20px;color: #713500;}.sub p.meta span.edit a:hover {background: #00436e url(images/page_edit.png) no-repeat 2px;padding: 0 2px 1px 20px;color: #fff;}p.meta {margin-left: 50px;}.sub p label {margin-left: -60px;float: left;color: #666;}</style><div class="sub"><div class="info"><a href='http://secretGeek.net/image/vs2008_ux_trial.PNG'><img src="http://secretGeek.net/image/vs2008_ux_trial_th.PNG" class="attach"/></a><h4>Close button on Trial Dialog should be called 'Continue'</h4><p class="meta">Submitted by <a href="http://secretGeek.net">secretGeek</a> on June 10, 2008</p><p><label>Problem:</label> The 'Trial' nag screen offers two choices: register and close. As a user you pause and think Close will cause the application to shutdown. But actually it doesn't, it just allows you to continue.<br /></p><p><label>Severity:</label> Low</p><p><label>Impact:</label> Low</p><p class="status status1"><label>Status:</label> <span class=" status" id="statustype-347">Not fixed</span></p></div><div class="clear"></div></div></div>]]>
    </description>
    <pubDate>Tue, 10 Jun 2008 22:36:43 GMT</pubDate>
    <dc:creator>Leon Bambrick</dc:creator>
    <guid>http://www.secretGeek.net/vs_uxtaskforce.asp</guid>
  </item>
<item>
  <title>How to be Jeff Atwood</title>
    <link>http://www.secretGeek.net/jatwood_how_to.asp</link>
    <description>
      <![CDATA[<style type="text/css">span.highlight { background-color:#FF8;}</style><img src='http://secretGeek.net/image/JeffAtwood.jpg' alt='jatwood circa 2004' style='border:1pt solid #000;margin-left:7px;padding:10px;background-color:#000;float:right'/><img src='http://secretGeek.net/image/jatwood_special.JPG' alt='the real jeff atwood' style='float:right;border:1pt solid #000;margin-left:7px;padding:10px;background-color:#000;clear:right'/><p>Jeff Atwood writes <a href='http://www.codingHorror.com/blog'>CodingHorror</a> which has been steadily building an audience over the last few years and is now a very popular destination for programmers.</p> <p>I'd like to share my current opinion of the formula for creating Jeff Atwood style articles, in the hope that it may inspire someone, somewhere to do something, somehow.</p><p>Here it is:</p><h2>1. Get an opinion</h2><p>Uncover some ugly half-baked opinion in the dank underground of your tortured soul.</p><h2>2. Resist the urge to blog at this point.</h2><p>99% of bloggers would dash out their hideous wretch of a thought at this point.</p><p>Jeff holds back.</p><h2>3. Research the classics</h2><p>Remember: if you steal from one source they call it plagiarism. Steal from many, they call it research.</p><p>First, turn to books. What does <a href='http://blogs.construx.com/blogs/stevemcc/default.aspx' title='Author of Code Complete... highly recommended... re-read it often!'>Steve McConnell</a> say? Tufte? Brooks?</p> <p><span class='highlight'>Highlight any well written phrases you may wish to quote.</span></p><h2>4. Beyond the classics</h2><p>Ah, but the classics so often fall short. Particularly on contemporary topics.</p><p>Turn to the words of reputable bloggers, or better yet, <a href='http://www.wikipedia.org'>wikipedia</a>. Branch out from there. </p>  <p>Again, <span class='highlight'>highlight phrases with a quotable turn of phrase.</span></p><p>But be ruthless and perfectionist in your approach: quote no trash.</p><h2>5. Look for opposition</h2><p>Actively seek out contrary opinions. Every topic has naysayers, and amongst such sayers of nay must be people who express valid concerns. Again -- </p><p><span class='highlight'>Highlight any well written phrases you may wish to quote.</span></p><h2>6. Firt Major objective satisfied</h2><p>Now you've collected the meat around which the gravy of your narrative shall flow.</p><p>Crack knuckles, sit straight, for now you can write the text itself. Lay out the quotes before you and choose only the best and most worthy.</p><h2>7. Reader is ignorant yet intelligent</h2><p>Assume the reader knows nothing about the specific niche topic at hand.</p><p>And yet -- here's the hard part -- treat the reader as your intellectual equal. Talk across to them, not down to them. They are exactly as smart as yourself, but it so happens that they have not, <em>just moments ago</em>, finished reading <em>the very best writing</em> on the topic at hand, and as such they need some friendly coaxing.</p><p>If new terms are introduced -- define them. Or failing that, provide a link to a definition.</p><h2>8. Take a side - For Now</h2><p>Be willing to take sides, by all means. But present both sides of the arguments in a fair light: hence, do not try to make either side appear worthy of ridicule.</p><h2>9. Why choose <em>that</em> heading?</h2><p>Choose a heading that is open to misinterpretation.</p><p>The heading should raise questions, not answer them. Answers are complex things, and readers shouldn't trust any article that answers everything in the heading.</p><h2>10. Google Search for images</h2><p>It's near the end of this article and you are hardly reading now -- which is a shame, because the best tip is the final one.</p><p>Perform a <a href='http://images.google.com/images?q=jeff+atwood+coding+horror+-sillyape&btnG=Search+Images'>google image search</a> for something entertaining (or disturbing) to accompany and lighten your research. Your own biases will probably come into play here and you'll adorn your article with pictures of computer games, console apps and kittens. But you can't be perfect. After all, you're only Jeff Atwood.</p><p>Scan over your writing one more time. Ensure the tone is friendly and informative: capable of causing upset, yet never quite, exactly "wrong".  </p><p>Hmmm. To be honest, just <a href='http://www.codinghorror.com/blog/'>go read his site</a> and make up your own rules. He breaks these ones all the time.</p><p>The only absolute rule I know he follows -- is to be <em>Atwoodistic</em>. I would <a href='http://secretgeek.net/gsa.asp'>define Atwoodism</a> as follows</p><blockquote><p>When you mention a topic you've covered previously, provide a link. Always.</p></blockquote>]]>
    </description>
    <pubDate>Fri, 06 Jun 2008 19:16:03 GMT</pubDate>
    <dc:creator>Leon Bambrick</dc:creator>
    <guid>http://www.secretGeek.net/jatwood_how_to.asp</guid>
  </item>
<item>
  <title>Reuse good -- Abstractions better!</title>
    <link>http://www.secretGeek.net/upsert_revisited.asp</link>
    <description>
      <![CDATA[<p>I posted something <a href='http://secretgeek.net/wotd_upsert.asp'>about the word 'Upsert'</a> recently -- and I was kind of surprised by the comments.</p><p>My real feelings about the concept of coining a new term 'upsert' are simple:</p><h2>Don't do it!</h2><p>Upsert is a bad name. An evil name. And not because it is a silly portmanteau.</p><p>Coining a term upsert, to embody the concept of "Update or Insert" is bad because it fundamentally misses the point of <strong>"Why We Code"</strong>.</p><h2>Let's get back to basics</h2><p>Just say you discover that your code is frequently peppered with this little snippet:</p><blockquote><pre>If (this.State != New) {<br />  this.Update();<br />} else {<br />  this.Insert();<br />}<br /></pre></blockquote><p>So -- you decide to extract that code snippet and place it in its own routine.</p><p>Routines are nice, routines are great.</p><blockquote><p>"Aside from the invention of the computer, the routine is arguably the single greatest invention in computer science."<br />&nbsp;&nbsp;<a href='http://stevemcconnell.com/ieeesoftware/bp16.htm'>Why You Should Use Routines, Routinely</a></p></blockquote><p>This is what you create:</p><blockquote><pre>private void Upsert() {<br />  If (this.State != New) {<br />    this.Update();<br />  } else {<br />    this.Insert();<br />  }<br />}<br /></pre></blockquote><p>Now -- any instance of those fives lines becomes instead:</p><blockquote><pre>  Upsert();<br /></pre></blockquote><p>Great! You've achieved one of the primary goals of routine construction: code reuse. Your code is now shorter, and thus hopefully cheaper to maintain. It's more versatile because now if you change the way "update or insert" works you only need to change it in one place.</p><p>Life is sweet. The birds sing and the flowers bloom once more.</p><p>But there's something amiss. Something foul remains.</p><p>You've failed on the other goal of routine construction -- you've failed to hide away the implementation details. You've failed to "raise the abstraction level!"</p><p>The user/programmer still has to think about the inner concepts: update and insert. Every time they see that words "upsert" -- the details "Update and Insert" are staring them in the face.</p><p>You lose sleep. Your dreams are troubled. Dark clouds follow you everywhere. And in quiet moments you hear the ominous echo of Alfred North Whitehead whispering:</p><blockquote><p>"Civilization advances by extending the number of important operations we can perform without thinking."</p><p><em>--Alfred North Whitehead</em></p></blockquote><p>Did you read that? What? You missed it -- here it is again:</p><blockquote><p>"Civilization advances by extending the number of important operations we can perform without thinking."</p><p><em>--<a href='http://en.wikipedia.org/wiki/Alfred_North_Whitehead'>Alfred North Whitehead</a></em></p></blockquote><p>By choosing the name "Upsert" we've failed in our duty to advance civilization! We want the user (the programmer who uses your routine) to perform these two important operations without thinking about both of them.<p>Let's think of a better name -- a name that alleviates the consumer from having to think about the constituent parts of the routine they're using.<p>How about this: <strong><code>Save</code></strong>.<blockquote><pre>private void Save() {<br />  If (this.State != New) {<br />    this.Update();<br />  } else {<br />    this.Insert();<br />  }<br />}<br /></pre></blockquote><p>Isn't that nicer? And civilization has taken another tiny step forward.</p><hr /><p>Incidentally -- it seems this 'Alfred North Whitehead' was a functional Programmer in the 1800s -- before Church and the Lambda calculus that gave rise to functional programming. Here's a comment about him:</p><blockquote><p>"There are no fundamental "things," or "objects" in the world of Whitehead. Whitehead's ontology, or parts-list of the universe, contains only processes."<br />--Richard Lubbock in <a href='http://www3.sympatico.ca/rlubbock/ANW.html'>'Alfred North Whitehead: Philosopher for the Muddleheaded'</a></p></blockquote>]]>
    </description>
    <pubDate>Wed, 04 Jun 2008 08:01:26 GMT</pubDate>
    <dc:creator>Leon Bambrick</dc:creator>
    <guid>http://www.secretGeek.net/upsert_revisited.asp</guid>
  </item>
<item>
  <title>Word of the day: Upsert</title>
    <link>http://www.secretGeek.net/wotd_upsert.asp</link>
    <description>
      <![CDATA[<p>I've found a new word, buried deep in the internals of dot net.</p><p>(this is a real word)</p><blockquote><p>"Upsert."</p></blockquote><p>It <a href='http://en.wikipedia.org/wiki/Upsert'>means</a> "update if you can, or insert if you have to."</p><p>It also looks a lot like a combination of the words "Upset" and "Berserk," and it sounds much like "Absurd."</p><p>All up, it's a keeper.</p>]]>
    </description>
    <pubDate>Sun, 01 Jun 2008 11:07:03 GMT</pubDate>
    <dc:creator>Leon Bambrick</dc:creator>
    <guid>http://www.secretGeek.net/wotd_upsert.asp</guid>
  </item>
<item>
  <title>Return from an offline sojourn</title>
    <link>http://www.secretGeek.net/awesome_atli_tooltip.asp</link>
    <description>
      <![CDATA[<p>I was offline for a few days over the past fortnight, and found it really refreshing. Without the continual distraction of the internet I was able to concentrate on achieving a lot of things that had been niggling me for a while.</p><p>Amongst those was the addition of some long overdue 'luxury features' for TimeSnapper that I hope will make it more meaningful for a lot of users. (No doubt I'll bombard you with the details when we release the next upgrade).</p><p>With the internet out of the way, my 'at home' productivity went from its usually mid-40's mark to a whopping 98%.</p><p>There were a lot of blog entries I jotted down notes for, but now I'm just happy not to contribute too much to the hyper-noise of the internet for one more day ;-).</p><p>But here's an example of an 'awesome Atli tooltip' found deep inside the codebase for <a href='http://TimeSnapper.com'>TimeSnapper</a>.</p><div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Me</span>.Label4.Text = <span style="color: #a31515;">"Productive Applications:"</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Me</span>.ToolTip1.SetToolTip(<span style="color: blue;">Me</span>.Label4, <span style="color: #a31515;">"Productive Applications are those that relate to your work."</span> &amp; vbCrLf &amp; _</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span style="color: #a31515;">"Solitaire, for example, is NOT a productive application, "</span> &amp; vbCrLf &amp; _</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span style="color: #a31515;">"unless you are working on becoming the world champion of "</span> &amp; vbCrLf &amp; _</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <span style="color: #a31515;">"solitaire."</span>)</p></div><p>It's these kind of gems that help me enjoy work on this product more and more with every version.</p><p>Now, back to the usual un-productive fare:</p><p>If you too have been tricked into using twitter, you can <a href='http://twitter.com/secretGeek'>follow me here.</a></p>]]>
    </description>
    <pubDate>Sat, 31 May 2008 12:18:33 GMT</pubDate>
    <dc:creator>Leon Bambrick</dc:creator>
    <guid>http://www.secretGeek.net/awesome_atli_tooltip.asp</guid>
  </item>
<item>
  <title>Leaky Abstractions? Try Asp.Net!</title>
    <link>http://www.secretGeek.net/multilinetext.asp</link>
    <description>
      <![CDATA[<p>First here's a code example:</p><style type="text/css">.highlight {  background-color:#FF0;}</style><p>Single line 'TextBox':</p>    &lt;asp:TextBox ID='dd1' runat='server' TextMode="SingleLine" <span class='highlight'>MaxLength="10"</span>&gt; &lt;/asp:TextBox&gt;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ^^^^<em>This 'MaxLength' is respected!</em><br /><p>Multi line 'TextBox':</p>    &lt;asp:TextBox ID='dd1' runat='server' TextMode="MultiLine" <span  class='highlight'>MaxLength="10"</span>&gt; &lt;/asp:TextBox&gt;<br />&nbsp; &nbsp;  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ^^^^<em>This 'MaxLength' gets ignored!</em><br /><p>Now here it is in pictures:</p><img src='http://secretGeek.net/image/maxlength_ignored_on_multiline.png' alt='max length ignored on multi-line TextBox' style='border:1pt solid #000;margin-left:7px'/><p>The single-line TextBox respects the maximum length property. The multi line textbox does not. We see other differences too: these two 'TextBoxen' differ from each other in far more than the number of rows.</p><p>The cause here is a classic <a href='http://www.joelonsoftware.com/articles/LeakyAbstractions.html'>'Leaky Abstraction'</a> - and asp.net is riddled with such leaks. </p><p>The 'abstraction' of "TextBox" is used to emit either one of three underlying html elements -- "TextArea", "Input type=text" or "input type=password" -- depending on the 'TextMode' property. The three controls are wildly different animals.</p><p>"Solutions" to this problem tend to use javascript to stop input once the maxlength is reached.</p><p>Edge cases are frequently missed, for example:</p><ul><li>Once maxlength is reached, ignore input, but don't ignore: Arrow keys, Delete key and Backspace. Others?.</li><li>Pasting of text should truncate down to maxlength.</li><li>Disabling of javascript is always possible, so length validation needs to be applied on server side as well.</li><li>Now that javascript is in play, browser compatability becomes a bigger problem.</li></ul><p>That's pretty nasty stuff to have to perform -- and worse, you're given no warning that you need to perform it.</p><p>The API tells you that there is a maxlength property you can use... but the API, in this case, is lying.</p><p>I'm not really concerned with this problem technically. And I think the asp.net abstraction is so extreme that it's admirable. I'd like to know how to patch this kind of leak.</p> <p>Here's what I'm wondering:</p><p><strong>Is there a way the text box class could have been implemented so that you get a compile error for setting the maxlength property when the textmode is multiline?</strong></p><p>That would be enough to make it a safe abstraction in my books. It's more extreme than the static typing afforded by most static type systems.</p><p>I expect that such a constraint could be achieved with a language/tool like <a href='http://www.hanselminutes.com/default.aspx?showID=128'>Spec#</a>.</p><p>An alternative would be to throw an exception when setting the maxlength property if the textbox type is multi-line, and vice versa. But that seems like quite a faulty approach.</p><p>I'm just not happy about this at all. I think I will need to write a very stern letter to <a href='http://weblogs.asp.net/scottgu/'>Scott Guthrie</a>.</p>]]>
    </description>
    <pubDate>Mon, 26 May 2008 11:14:46 GMT</pubDate>
    <dc:creator>Leon Bambrick</dc:creator>
    <guid>http://www.secretGeek.net/multilinetext.asp</guid>
  </item>
<item>
  <title>A truly original thought</title>
    <link>http://www.secretGeek.net/cab_v_maul.asp</link>
    <description>
      <![CDATA[<blockquote><p>"Everything of importance has been said before by somebody who did not discover it."<br />--Alfred North Whitehead</p></blockquote><p>Yet, once in a while, a true genius will strike upon a <em>genuinely</em> original thought.</p><p>Here's some such wisdom from <a href='http://JCooney.net'>JCooney:</a></p><blockquote><p>"Who would you back in a fight: Cab Calloway or Darth Maul?"<br />--JoCo Loco</p></blockquote><p>Tell me there isn't a multi-million dollar best-selling console game and movie franchise in that question?</p> <img src='http://secretGeek.net/image/Cab_Calloway.jpg' alt='cab calloway -- you may know him from blues brothers where he sung minnie the moocher with its catch cry hi de hi de hi de hi' style='border:1pt solid #000;margin-left:7px;padding:10px'/><img src='http://secretGeek.net/image/darth_maul.PNG' alt='darth maul -- you may recognise him from the phantom menace or else just because hey! he sure looks like your mother' style='border:1pt solid #000;margin-left:7px;padding:10px'/>]]>
    </description>
    <pubDate>Mon, 26 May 2008 10:42:17 GMT</pubDate>
    <dc:creator>Leon Bambrick</dc:creator>
    <guid>http://www.secretGeek.net/cab_v_maul.asp</guid>
  </item>
<item>
  <title>Throw New VirtualMachine();</title>
    <link>http://www.secretGeek.net/throw_new_vm.asp</link>
    <description>
      <![CDATA[<p>Today's crazy idea.</p><p>For <em>serious</em> exception handling:</p><blockquote><p><code>throw new VirtualMachine();</code></p></blockquote><p>...immediately spins up a new virtual machine, identical to the currently running machine, only with a debugger attached and paused on a breakpoint at the currently active line of code which caused the exception.</p><p>The development/operations team are notified and given a url with which to connect to the new virtual machine. A bug is lodged in your support system.</p> <p>Meanwhile, execution continues essentially 'uninterrupted' in the original machine.</p>]]>
    </description>
    <pubDate>Tue, 20 May 2008 11:08:43 GMT</pubDate>
    <dc:creator>Leon Bambrick</dc:creator>
    <guid>http://www.secretGeek.net/throw_new_vm.asp</guid>
  </item>
</channel>
</rss>

