<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Tech 4D &#187; technology</title>
	<atom:link href="http://www.tech4d.com/blog/category/technology/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tech4d.com/blog</link>
	<description>Technology, Web Society</description>
	<lastBuildDate>Mon, 08 Feb 2010 23:09:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Open source choices</title>
		<link>http://www.tech4d.com/blog/2009/01/18/open-source-choices/</link>
		<comments>http://www.tech4d.com/blog/2009/01/18/open-source-choices/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 20:37:33 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/?p=146</guid>
		<description><![CDATA[I open sourced concharto this week.  As a long time consumer of open source projects it has been exciting to actually contribute to the movement.
The project page is hosted on google code here.
Here&#8217;s a summary of what I went through to make this happen.
My Goals
1. The concharto atlas.  My main goal is to create a [...]]]></description>
			<content:encoded><![CDATA[<p>I open sourced <a href="http://www.concharto.com">concharto </a>this week.  As a long time consumer of open source projects it has been exciting to actually contribute to the movement.</p>
<p>The project page is hosted on google code <a href="http://code.google.com/p/concharto">here</a>.</p>
<p>Here&#8217;s a summary of what I went through to make this happen.</p>
<p><strong>My Goals</strong></p>
<p>1. <em>The concharto atlas</em>.  My main goal is to create a comprehensive online atlas of history and happenings founded the Wikipedia community process and enabled by modern mapping web services.  I believe contributors of &#8220;philanthropic information&#8221; generally want to know that their work is not going to enrich some venture capital backed startup so one way to instill confidence is to make the code open source.</p>
<p>2. <em>Someone else could use it</em>.   It would be gratifying to see other concharto based communities springing up.</p>
<p>3. <em>Make the code better</em>.  There are so many open source projects out there that the odds of anyone actually contributing to concharto are pretty low, but it has a few things going for it:</p>
<ul>
<li>the code is stable</li>
<li>the code is live</li>
<li>It is still an active project</li>
</ul>
<p><strong>The Process</strong></p>
<p>The process took about 1 month and involved a number of decisions:</p>
<ul>
<li>Choice of an open source hosting platform</li>
<li>Choice of a license</li>
<li>Code cleanup</li>
</ul>
<p>Each of these activities involved a lot of analysis and tradeoffs and I thought I would share my thought process.</p>
<p><strong>Open source hosting platform</strong></p>
<p>I&#8217;ve used projects that are hosted on source forge, google code, codehaus and a few others.  I really like google code&#8217;s group list and issue manager, and since good issue management is more important to me than anything else, I chose google code.</p>
<p>I currently use Jira (an awesome commercial issue manager) and I could have gotten a Jira open source deal, but google code&#8217;s simple and snappy groups, wiki and issue manager was an unbeatable combination.</p>
<p>Wikipedia&#8217;s <a href="http://en.wikipedia.org/wiki/Comparison_of_free_software_hosting_facilities">open source software hosting page</a> was an invaluable resource.</p>
<p><strong>Choice of a license</strong></p>
<p>I vacillated back and forth on this issue for about three months before I finally settled on Apache License 2.0.  Here again, Wikipedia <a href="http://en.wikipedia.org/wiki/Open_source_license">has lots of good things to say</a>.  The evolution of my decision went something like this:</p>
<p>1. Since Concharto is a web application and not a web library, I looked at respectable web applications like Drupal, Wordpress and Wikimedia.  Most of these use a Gnu Public License (GPL), which follows a <em>copyleft </em>model and imposes strict constraints on commercial use of the code.  This seemed just fine to me.</p>
<p>2. After a while I got to worrying about whether I really agree with the core principals behind the GNU license.  I looked at the Apache and MIT licenses, which follow a <em>permissive</em> model.  They seemed a little too permissive since they would allow anyone to take my code and sell it if they wanted to.  I decided that perhaps the Mozilla Public License, which is what Firefox uses, would be a little more restrictive, yet not as constraining as the GPL.</p>
<p>3. Eventually I decided that the chances of any organization actually taking my code and reselling it are pretty low and even if some company did that, I believe it would be highly beneficial for that organization to be a contributor to the project, so in the end the concharto web site would ultimately benefit.  I felt that the Mozilla license was too complicated and not that much different from the Apache 2 license.  I noticed that both Google&#8217;s Android and Apple&#8217;s WebKit are Apache 2 licensed, so that clinched it for me.</p>
<p><strong>Code cleanup</strong></p>
<p>Having privately worked on this code for several years, I had to ask myself whether I really wanted anyone to be able to see it &#8211; warts and all. As with any software project there are good and bad parts and the desire to make the code perfect before open sourcing it was a powerful influence on me.  Finally, I just changed the package naming, added the Apache Licence 2.0 license headers and let her fly.  A cool <a href="http://www.wdev91.com/?p=cpw">eclipse plugin made</a> adding the license headers really easy.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2009%2F01%2F18%2Fopen-source-choices%2F&amp;linkname=Open%20source%20choices"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2009/01/18/open-source-choices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I&#8217;ll be demoing Concharto at Where 2.0</title>
		<link>http://www.tech4d.com/blog/2008/05/07/ill-be-demoing-concharto-at-where-20/</link>
		<comments>http://www.tech4d.com/blog/2008/05/07/ill-be-demoing-concharto-at-where-20/#comments</comments>
		<pubDate>Wed, 07 May 2008 11:56:28 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/?p=142</guid>
		<description><![CDATA[I&#8217;ll be demonstrating Concharto at this year&#8217;s Where 2.0 conference in San Francisco on May 12.  I&#8217;ll use events and timelines from the map to illustrate all the important features of Concharto.
I&#8217;ll definitely show them &#8220;The Play.&#8221; As John Madden would say, &#8220;he goes left, he goes right, he hits the trombone player, Boom!&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p><img style="float:left" src="http://www.tech4d.com/blog/wp-content/uploads/images.jpg" alt="" title="images" width="112" height="110" class="alignleft size-full wp-image-143" />I&#8217;ll be demonstrating Concharto at this year&#8217;s Where 2.0 conference in San Francisco on May 12.  I&#8217;ll use events and timelines from the map to illustrate all the important features of Concharto.</p>
<p>I&#8217;ll definitely show them &#8220;<a href="http://www.concharto.com/search/eventsearch.htm?_tag=the%20play&#038;_maptype=1">The Play</a>.&#8221; As John Madden would say, &#8220;he goes left, he goes right, he hits the trombone player, Boom!&#8221; I bet I&#8217;ll irritate some Stanford grads but, hey, it&#8217;s just a demo.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2008%2F05%2F07%2Fill-be-demoing-concharto-at-where-20%2F&amp;linkname=I%26%238217%3Bll%20be%20demoing%20Concharto%20at%20Where%202.0"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2008/05/07/ill-be-demoing-concharto-at-where-20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My class wiki</title>
		<link>http://www.tech4d.com/blog/2008/05/06/my-class-wiki/</link>
		<comments>http://www.tech4d.com/blog/2008/05/06/my-class-wiki/#comments</comments>
		<pubDate>Tue, 06 May 2008 15:44:43 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/?p=137</guid>
		<description><![CDATA[I&#8217;ve been teaching a class at University of Delware, CISC474 &#8211; Advanced Web Development.  I&#8217;m using a wiki for most communications with the students.  It has worked pretty well, though something like Moodle (which my children use for their school) would be even nicer.
]]></description>
			<content:encoded><![CDATA[<p><img style="float:left" title="blue-hen" src="http://www.tech4d.com/blog/wp-content/uploads/blue-hen.jpg" alt="" width="82" height="82" />I&#8217;ve been teaching a class at University of Delware, <a href="http://cisc474.fsanmiguel.com/Wiki/">CISC474 &#8211; Advanced Web Development</a>.  I&#8217;m using a wiki for most communications with the students.  It has worked pretty well, though something like <a href="http://moodle.org/">Moodle</a> (which my children use for their school) would be even nicer.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2008%2F05%2F06%2Fmy-class-wiki%2F&amp;linkname=My%20class%20wiki"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2008/05/06/my-class-wiki/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Badly behaved robots and idempotency</title>
		<link>http://www.tech4d.com/blog/2008/04/29/badly-behaved-robots-and-idempotency/</link>
		<comments>http://www.tech4d.com/blog/2008/04/29/badly-behaved-robots-and-idempotency/#comments</comments>
		<pubDate>Tue, 29 Apr 2008 13:01:03 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/?p=135</guid>
		<description><![CDATA[This is a technical web development post.
The other night I was up until 1:30AM fixing a bug in concharto.com.  At 10:00pm I took a look at the latest changes log and noticed hundreds of &#8220;reverts&#8221; had happened and were continuing to happen.  All coming from the same IP address.  I panicked!  [...]]]></description>
			<content:encoded><![CDATA[<p>This is a technical web development post.</p>
<p>The other night I was up until 1:30AM fixing a bug in <a href="http://www.concharto.com/event/latestchanges.htm">concharto.com</a>.  At 10:00pm I took a look at the <a href="http://www.concharto.com/event/latestchanges.htm">latest changes log</a> and noticed hundreds of &#8220;reverts&#8221; had happened and were continuing to happen.  All coming from the same IP address.  I panicked!  I had to shut the site down temporarily while I fixed the problem and repaired the damage.</p>
<p>The problem was caused by a combination of a badly behaved robot (web spider) and a bug in the &#8220;undo revision&#8221; code.</p>
<p>1. <strong>The bug.</strong> Concharto is a geographic wiki.  All wiki&#8217;s need to make it easy to revert changes.  The changes page has a series of &#8220;undo this change&#8221; links next to each change.  It was originally implemented as a simple link with a query string that looked like this:<strong> /edit/undoevent.htm?id=188&amp;toRev=3</strong>.  The bug is that all HTTP GET requests like this one should be <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html"><strong><em>idempotent</em></strong> </a>- i.e. repeated requests (e.g. a user clicking the link over and over) should have the same effect as only one request.  For instance, a link to add something to a shopping cart is NOT idempotent and is best implemented with a POST method (and some javascript). When I coded this feature way back, I did it the lazy way.</p>
<p>2. <strong>The Robot</strong>.  All robots are supposed to follow the instructions in the <a href="http://www.concharto.com/robots.txt">robots.txt</a> at the root of your web site.  This file provides directives on how you want robots to follow links.  Our robots.txt file explicitly prohibits following links to the changes page (which contained the bug).  Unfortunately, all robots don&#8217;t follow this advice.  This particular robot found its way to the changes page and started following all of the links there, including each &#8220;undoevent.htm&#8221; link.  <em>Ugh!</em></p>
<p>I had to do three things to recover:</p>
<ul>
<li>Fix the bug.  I switched all of the links to invoke a javascript submit() method and post the results to the web controller.  This has two benefits: robots don&#8217;t usually run javascript and they don&#8217;t usually do HTTP POST.</li>
<li>Revert the changes that the robot made.  Database backups are a good thing.</li>
<li>Block the robot&#8217;s IP address.</li>
</ul>
<p>3. <strong>The Lesson</strong>.  Keep your GET methods idempotent.  It is sometimes easier (less coding) to use the query string to pass parameters but it is a bug &#8211; you will probably have to fix it later.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2008%2F04%2F29%2Fbadly-behaved-robots-and-idempotency%2F&amp;linkname=Badly%20behaved%20robots%20and%20idempotency"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2008/04/29/badly-behaved-robots-and-idempotency/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducing Concharto</title>
		<link>http://www.tech4d.com/blog/2008/01/29/introducing-time-space-map/</link>
		<comments>http://www.tech4d.com/blog/2008/01/29/introducing-time-space-map/#comments</comments>
		<pubDate>Tue, 29 Jan 2008 13:33:57 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/2008/01/29/introducing-time-space-map/</guid>
		<description><![CDATA[Back in the late 90&#8217;s, I dreamed of building an immersive mapping application that would let people travel through time to any place in the past and see what it was like.  It was an impractical idea at the time, but things have changed recently and the result is Concharto. Last June, I alluded [...]]]></description>
			<content:encoded><![CDATA[<p>Back in the late 90&#8217;s, I dreamed of building an immersive mapping application that would let people travel through time to any place in the past and see what it was like.  It was an impractical idea at the time, but things have changed recently and the result is <a href="http://www.concharto.com">Concharto</a><a href="http://www.timespacemap.com"></a>. Last June, I <a href="http://www.tech4d.com/blog/2007/06/21/a-calculus-of-history-mass-collaboration/">alluded to the project</a> when I noted that Leo Tolstoy, author of &#8220;<em>War and Peace</em>&#8221; proposed applying the <em>scientific method</em> to history, asserting that a complete understanding of an event could be obtained by slicing that event into smaller and smaller pieces, in exactly the same way that a math student performs integral calculus.</p>
<p style="font-style: normal">While not actually creating a calculus of history, <a href="http://www.concharto.com">Concharto</a> does attempt to slice history into smaller pieces.  There are three recent technological advances that make this possible:</p>
<ol>
<li>Advanced database software and cheap server hardware have made it easy to search huge repositories of information.</li>
<li>Geographic web services have simplified the task of placing events in a spacial context.</li>
<li>Wikipedia has demonstrated the awesome power of mass collaboration.</li>
</ol>
<p>Hopefully, Concharto will one day be a comprehensive repository of thin slices of notable events from every place and time.</p>
<p>How can that happen? Concharto is a Geographic Wiki. It looks like Google Maps and works like Wikipedia. It has the all of the illustrative power Google Maps and all of the strengths and weaknesses of Wikipedia.</p>
<p>Unlike virtually all other mapping sites on the internet today, Concharto is not about <em>places</em> &#8211; it is about <em>events</em>. Unlike Wikipedia, it is about small discrete bits of information, rather than comprehensive <em>articles</em>.</p>
<p>You can read more about  it on the <a href="http://wiki.timespacemap.com/wiki/About">community wiki</a> and in the <a href="http://blog.concharto.com">Concharto blog</a>.  .</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
<iframe src='http://www.concharto.com/search/embeddedsearch.htm?_tag=inca%20empire&amp;_maptype=1&amp;_embed=true' height="330" width="450" frameborder="0" scrolling="no"></iframe> <br/><small><a href='http://www.concharto.com/search/eventsearch.htm?_tag=inca%20empire&amp;_maptype=1'>View A Larger Map</a></small></p>
<p>Expansion of the <a href="http://www.concharto.com/search/eventsearch.htm?_tag=inca%20empire&#038;_maptype=1">Inca Empire</a> of South America.</p>
<p><em>(Updated 4/29/08 to reflect our name change from Time Space Map to Concharto)</em></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2008%2F01%2F29%2Fintroducing-time-space-map%2F&amp;linkname=Introducing%20Concharto"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2008/01/29/introducing-time-space-map/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Platform Peril &#8211; A Tale of Two Platforms</title>
		<link>http://www.tech4d.com/blog/2008/01/07/platform-peril-a-tale-of-two-platforms/</link>
		<comments>http://www.tech4d.com/blog/2008/01/07/platform-peril-a-tale-of-two-platforms/#comments</comments>
		<pubDate>Mon, 07 Jan 2008 19:08:22 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/2008/01/07/platform-peril-a-tale-of-two-platforms/</guid>
		<description><![CDATA[This is a follow-up to an earlier post, Platform Peril
I once worked for an ambitious company that aimed to create a new type of web service.  We ultimately succeeded, despite the tale I am about to tell.
Book the First: Reusable Code

Our company had developed some core capabilities in an obscure vertical market which showed [...]]]></description>
			<content:encoded><![CDATA[<p>This is a follow-up to an earlier post, <a href="http://www.tech4d.com/blog/2007/08/07/platform-peril/">Platform Peril</a></p>
<p>I once worked for an ambitious company that aimed to create a new type of web service.  We ultimately succeeded, despite the tale I am about to tell.</p>
<h3><span class="editsection"></span><span class="mw-headline">Book the First: Reusable Code<br />
</span></h3>
<p>Our company had developed some core capabilities in an obscure vertical market which showed some promise to investors.  My group made money by applying our special skills to mostly fixed price software development contracts.  It was decided that we should roll up all of our capabilities into a software platform of libraries and specialized data processing tools which I will call <em>Platform LG</em>.  The project goals for <em>LG </em>were:</p>
<ol>
<li>Speed development of all projects</li>
<li>License <em>LG</em> to our biggest customers for their own internal and external projects</li>
<li>Reduce operational costs by standardizing our internal support infrastructure</li>
</ol>
<p>These are the standard reasons to invest in reusable code projects.  Unfortunately, the project suffered from the standard reasons that such projects get into trouble:</p>
<ol>
<li><em>Behind schedule</em>.  Big, ambitious reusable code projects are notoriously hard to manage, especially in a dynamic environment where requirements are uncertain. Worse still, the schedule slips are very expensive, because ongoing projects are affected.  A lot of people relied on <em>LG.</em></li>
<li><em>Last year&#8217;s requirements.  LG</em> failed to meet the needs of our newest, biggest project.  The platform was slow, ran on the wrong operating system and wasn&#8217;t sufficiently customizable to support the new requirements.</li>
<li>Packaging the platform for use by our big customers exacerbated the other problems because the effort necessary to <em>productize </em>the code made it harder to respond to new requirements.</li>
</ol>
<p>Thus, the <em>LG </em>failed to meet two of its three goals. As a result, our biggest project, which I will call <em>Operation Bandwagon</em>, decided to abandon the platform, instead resurrecting some old code and creating custom capabilities tailored exactly to their own needs.</p>
<p><em><strong>Lesson 1</strong>.  Platforms are expensive and slow to adapt to new requirements.  They are best used in situations where requirements are well understood and relatively constant.</em></p>
<h3><span class="editsection"></span><span class="mw-headline">Book the Second: Operation Bandwagon</span></h3>
<p><em>Operation Bandwagon</em> focused on building an application, not a platform and so was able to create a great deal of new and innovative features very quickly with a small team.  To some people in management, it made the <em>LG </em>look bad.   This should have been no surprise however, since <em>Bandwagon </em>developers weren&#8217;t nearly as constrained as the <em>LG </em>team.</p>
<p><em><strong>Lesson 2.</strong>  It is easier and cheaper to build custom code than reusable code.   </em></p>
<h3><span class="mw-headline">Book the Third: Platform Redux</span></h3>
<p>Within a year, <em>Bandwagon </em>was a smash hit. During that time, the software development organization was split into two competing and antagonistic groups. The <em>Bandwagon </em>core code began to get the petrified feel of a platform.  Unlike the <em>LG</em> however, <em>Bandwagon</em> was originally conceived as an custom application, and then retrofitted to act like a platform &#8211; and it showed.</p>
<p>Meanwhile, <em>LG</em> had finally grown into its own as a stable and capable base on which to build applications. The company now had two competing platforms, complete with release and support organizations. We were paying through the nose for the original schism.</p>
<p><em><strong>Lesson 3.</strong>  Pay attention!  People love to build platforms, but there should be only one.</em></p>
<h3><span class="editsection"></span><span class="mw-headline">Book the Fourth: Unification<br />
</span></h3>
<p>It was left to a small bad of brave developers to reunite the two warring platforms, a process that took years to accomplish.  I wasn&#8217;t there to witness the effort, but I&#8217;ve heard stories.  Some claim that good ultimately won out over evil.  Others say that the two were synergistically merged into a new platform that was better than the individuals combined.</p>
<p><img src="http://www.tech4d.com/blog/wp-content/uploads/2008/01/95px-charles_dickens_-_project_gutenberg_etext_13103.jpg" style="float: left" alt="95px-charles_dickens_-_project_gutenberg_etext_13103.jpg" /></p>
<p>Dickens&#8217; <a href="http://en.wikipedia.org/wiki/A_Tale_of_Two_Cities">A Tale Of Two Cities</a> is a tragic story centered on the French Revolution.  Like its namesake, our story has a bittersweet ending.  <em>It was the best of times</em>.  We built some truly remarkable software.  But <em>it was the worst of times </em>too. If we had been more careful we could accomplished much, much more.</p>
<h3>Epilogue</h3>
<p>History seems doomed to repeat itself.  Revolutions come and go and so do tech bubbles.  Two years later, I found myself enmeshed in platform peril that was weirdly similar to <em>Bandwagon</em> vs <em>LG</em>.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2008%2F01%2F07%2Fplatform-peril-a-tale-of-two-platforms%2F&amp;linkname=Platform%20Peril%20%26%238211%3B%20A%20Tale%20of%20Two%20Platforms"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2008/01/07/platform-peril-a-tale-of-two-platforms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Cost of Complexity</title>
		<link>http://www.tech4d.com/blog/2008/01/01/the-cost-of-complexity/</link>
		<comments>http://www.tech4d.com/blog/2008/01/01/the-cost-of-complexity/#comments</comments>
		<pubDate>Tue, 01 Jan 2008 19:09:46 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/2008/01/01/the-cost-of-complexity/</guid>
		<description><![CDATA[Most software developers understand the relationship between complexity and cost; more complex = more expensive.  Unfortunately many equate code complexity with lines of code, slavishly following design patterns that reduce code counts while actually increasing complexity.
Value Engineering
For years, engineers have noted that the overall cost of a manufactured device is roughly proportional to the [...]]]></description>
			<content:encoded><![CDATA[<p>Most software developers understand the relationship between complexity and cost; more complex = more expensive.  Unfortunately many equate code complexity with lines of code, slavishly following design patterns that reduce code counts while actually increasing complexity.</p>
<p><strong>Value Engineering</strong></p>
<p>For years, engineers have noted that the overall cost of a manufactured device is roughly proportional to the  number of parts it has.  A whole discipline, known as <a href="http://en.wikipedia.org/wiki/Value_engineering">Value Engineering</a>, is dedicated to assigning a cost to each function of a product so that designers and manufacturers can can make wise choices about which functions to improve and which to throw away.  A classic value engineering excercise is to take a common item like a circuit breaker, tear it apart, and then redesign it with less pieces.  Removing one part from the design can yield dramatic cost savings and big improvements in reliability.</p>
<p><img src="http://www.tech4d.com/blog/wp-content/uploads/2008/01/cost-of-complexity.png" alt="cost-of-complexity.png" /></p>
<p>Figure 1 &#8211; Cost and complexity for two competing solutions</p>
<p>In Figure 1, two companies are designing competing products with similar market requirements.   The company that solves the problem with the least number of parts (Team A) is the big winner.  Note that cost often increases exponentially with the complexity of a particular solution.</p>
<p>In many respects, software engineering bears <a href="http://www.tech4d.com/blog/2007/06/28/software-engineers-are-not-engineers/">little resemblance to other engineering disciplines</a>, but in this case, there are real parallels.  Just as in circuit breakers, more parts means more $, both in initial cost and ongoing maintenance and operations.</p>
<p><strong>Virtual Parts</strong></p>
<p>The analogy is useful because code reduction techniques <strong>often increase</strong> the number of virtual &#8220;parts&#8221; while decreasing lines of code.  My favorite example is indirection. Many popular design patterns aim to reduce code duplication by introducing levels of indirection (for example, <a href="http://en.wikipedia.org/wiki/Adapter_pattern">adapter</a> or <a href="http://martinfowler.com/articles/injection.html">dependency injection</a> patterns). If you think of each indirection as a new part, it is easy to see how some designs can have less code yet more parts. I use adapters and injection all of the time, but I also acknowledge that they complicate the design, development, testing and maintenance of the code.</p>
<p>Let&#8217;s say you are adding a new feature to an existing project and there are some similarities to other parts of your code.  You must decide whether to build a new common module and refactor your existing code to use it, or ignore the existing code and build the new piece without regard to the existing stuff.  Many developers, especially dogmatic adherents to <a href="http://en.wikipedia.org/wiki/Agile_software_development">agile development</a> methodologies, would blindly choose the former approach, without regard to the costs involved.  A better strategy is to choose based on a reasoned trade off between cost and benefit.  And there are many hidden costs to certain complex design patterns:</p>
<ul>
<li><em>Clarity</em>.  Some code is just too hard to understand.  For example, xml based configuration files can make your code easy to configure and impossible to understand.</li>
<li><em>Unit Testing complexity</em>. Multiple levels of indirection require multiple levels of testing.  This usually means more support classes, including utility dao&#8217;s, mocks, etc.</li>
<li><em>Debugging time</em>.   You would think that designers would avoid any architecture that hinders efficient debugging, but many architecture decisions are made without even considering the effect on debugging and deployment.</li>
<li><em>Operational costs</em>.  If it is hard to understand  the code, then it will almost always be hard to keep running.</li>
</ul>
<p><strong>Too Many Notes</strong></p>
<p><img src="http://www.tech4d.com/blog/wp-content/uploads/2008/01/too-many-notes.png" style="float: left" alt="too-many-notes.png" />In the play, <a href="http://en.wikipedia.org/wiki/Amadeus">Amadeus</a>, the  Austrian King tells Wolfgang Amadeus Mozart that his opera is too complicated, it has too many notes, and he should &#8220;<em>take some away.</em>&#8221;  Mozart, who feels that his opera is perfect, asks the king which notes he would like to take away.  It is a moment full of meaning for any creative person.  Unfortunately, many creative software developers empathize too much with Mozart, favoring the ornamentation and flash of 18th century classical music.  I believe we should all take the tone deaf King&#8217;s advice and take some away.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2008%2F01%2F01%2Fthe-cost-of-complexity%2F&amp;linkname=The%20Cost%20of%20Complexity"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2008/01/01/the-cost-of-complexity/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CSS Browser compatibility note</title>
		<link>http://www.tech4d.com/blog/2007/12/05/css-browser-compatibility-note/</link>
		<comments>http://www.tech4d.com/blog/2007/12/05/css-browser-compatibility-note/#comments</comments>
		<pubDate>Wed, 05 Dec 2007 15:16:19 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/2007/12/05/css-browser-compatibility-note/</guid>
		<description><![CDATA[I haven&#8217;t written in a while because I&#8217;ve been heads down coding &#8211; not much to say that hasn&#8217;t already been said.  I&#8217;ve been in CSS hell recently, and I haven&#8217;t seen much about the following compatibility issue with IE 6.  Dreamweaver doesn&#8217;t pick up on the problem.
IE 6 doesn&#8217;t handle mixing units in [...]]]></description>
			<content:encoded><![CDATA[<p>I haven&#8217;t written in a while because I&#8217;ve been heads down coding &#8211; not much to say that hasn&#8217;t already been said.  I&#8217;ve been in CSS hell recently, and I haven&#8217;t seen much about the following compatibility issue with IE 6.  Dreamweaver doesn&#8217;t pick up on the problem.</p>
<p>IE 6 doesn&#8217;t handle mixing units in CSS style sheets.  For instance,</p>
<blockquote><p> #main ul {<br />
padding: .1em  .4em .1em 18px;<br />
}</p></blockquote>
<p>Renders in a very unexpected way.  The proper method is:</p>
<blockquote><p> #main ul {<br />
padding: 6px 6px 6px 18px;<br />
}</p></blockquote>
<p>OR</p>
<blockquote><p> #main ul {<br />
padding: .1em  .4em .1em 1.4em;<br />
}</p></blockquote>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2007%2F12%2F05%2Fcss-browser-compatibility-note%2F&amp;linkname=CSS%20Browser%20compatibility%20note"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2007/12/05/css-browser-compatibility-note/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Maps API Geocoder: La La Land, Tiger Data?</title>
		<link>http://www.tech4d.com/blog/2007/09/19/google-maps-api-geocoder-easter-eggs-tiger-data/</link>
		<comments>http://www.tech4d.com/blog/2007/09/19/google-maps-api-geocoder-easter-eggs-tiger-data/#comments</comments>
		<pubDate>Wed, 19 Sep 2007 16:02:00 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/2007/09/19/google-maps-api-geocoder-easter-eggs-tiger-data/</guid>
		<description><![CDATA[The Google Geocoder API
Google allows web developers to create &#8220;mashup&#8221; mapping applications using programming API&#8217;s that connect to Google&#8217;s mapping servers. One of the APIs is for geocoding &#8211; finding the location of a place based on its name. For example: when you want to see a map of &#8220;Turners Creek, MD&#8221; you first have [...]]]></description>
			<content:encoded><![CDATA[<p><strong>The Google Geocoder API</strong></p>
<p>Google allows web developers to create &#8220;mashup&#8221; mapping applications using <a href="http://www.google.com/apis/maps/index.html">programming API&#8217;s</a> that connect to Google&#8217;s mapping servers. One of the APIs is for geocoding &#8211; finding the location of a place based on its name. For example: when you want to see a map of &#8220;Turners Creek, MD&#8221; you first have to geocode the place name to its latitude and longitude coordinates (39.342013,-75.996743).</p>
<p><strong>Fun with the Google Geocoder API</strong></p>
<p>I was investigating how the geocoder returns information when an address lookup fails, so I typed in &#8220;<em>la la land, MD</em>&#8221; (MD = Maryland), expecting the geocoder to fail, but to my great surprise it returned an actual location near Front Royal, MD (you can try this at the Google <a href="http://www.google.com/apis/maps/documentation/examples/geocoding-simple.html">geocoder api demo page</a> or at any number of Google maps mashups).  For my international readers, when an American says someone is in &#8220;la la land&#8221; she is suggesting that the person is not grounded in reality, e.g. living in a fantasy land. For the fantasy location &#8220;<em>la la land, MD</em>&#8220;, the Google API return results indicate that the accuracy is at the &#8220;country&#8221; level so I would have expected to get the centroid of the US (Google puts this somewhere near Portland Oregon, which makes sense if you include all 50 states). Nor is the location the centroid of the State of Maryland which, by a quirk of geography and history, is located in Fairfax, Virginia.  This leads me to wonder whether someone actually put <em>&#8220;la la land, MD</em>&#8221; in the database.  &#8220;<em>la la land, NY</em>&#8221; also has a &#8220;country&#8221; level accuracy.  It is located near Muttontown, New York on Long Island, just off Brookville Rd. If you drive by, take a picture and I will post it here.</p>
<p><img src="http://www.tech4d.com/blog/wp-content/uploads/2007/09/la-la-land-ny.png" alt="la-la-land-ny.png" /></p>
<p>Next I typed in <em>&#8220;la la land, PA</em>&#8221; and found that it actually returned a location with &#8220;street level&#8221; accuracy.  Oops. Apologies to anyone who lives at &#8220;<em>Farm Land Rd Way, Mifflinburg, PA 17844</em>&#8220;!  Surprisingly, the regular Google maps fails to geocode that location.  It is possible that this could be a parsing error since &#8220;<em>la land, pa</em>&#8221; geocodes to an address of &#8220;<em>Land Ln, Schnecksville, PA 18078, USA</em>&#8221; and &#8220;<em>la la land, CA</em>&#8221; (California) is at &#8220;<em>Garden Land Rd, Los Angeles, CA 90049</em>&#8220;.</p>
<p><img src="http://www.tech4d.com/blog/wp-content/uploads/2007/09/la-la-land-pa.png" alt="la-la-land-pa.png" /></p>
<p><strong>Google Maps API Geocoder uses Tiger Data?</strong></p>
<p>For US addresses, the Google geocoder API, which is free for no more than 50,000 geocodes per day, behaves differently than the one on <a href="http://maps.google.com">maps.google.com</a>.  In fact, it behaves a lot like <a href="http://geocoder.us/">geocoder.us</a>, which uses free US Census Bureau <a href="http://www.census.gov/geo/www/tiger/">tiger data</a>. The problem with tiger data is that is not nearly as complete or accurate as the NavTeq mapping data that all of the major mapping services use. Here&#8217;s an example: Use the address &#8220;<em>210 south bank, Landenberg, PA</em>&#8221; and enter it into to <a href="http://maps.google.com">maps.google.com</a>, <a href="http://geocoder.us/">geocoder.us</a> and <a href="http://www.google.com/apis/maps/documentation/examples/geocoding-simple.html">this demo page</a> (uses the Google map geocoding API). You will see that maps.geoogle.com finds the correct location but both geocoder.us and the Google geocoder API fail. Now type in &#8220;<em>1600 Amphitheatre Pky, Mountain View, CA</em>&#8221; and you will see that geocoder.us and the Google API both succeed.</p>
<p>It makes sense for Google to use tiger data for their API partners. After all, accurate geocoding data costs money and the users of the geocoding API aren&#8217;t paying anything. And unlike map images, I can think of no obvious way to sell advertising for geocodes.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2007%2F09%2F19%2Fgoogle-maps-api-geocoder-easter-eggs-tiger-data%2F&amp;linkname=Google%20Maps%20API%20Geocoder%3A%20La%20La%20Land%2C%20Tiger%20Data%3F"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2007/09/19/google-maps-api-geocoder-easter-eggs-tiger-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java-centric UML diagram of KML 2.2</title>
		<link>http://www.tech4d.com/blog/2007/09/12/java-centric-uml-diagram-of-kml-22/</link>
		<comments>http://www.tech4d.com/blog/2007/09/12/java-centric-uml-diagram-of-kml-22/#comments</comments>
		<pubDate>Wed, 12 Sep 2007 15:49:26 +0000</pubDate>
		<dc:creator>frank</dc:creator>
				<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://www.tech4d.com/blog/2007/09/12/java-centric-uml-diagram-of-kml-22/</guid>
		<description><![CDATA[
Google provides great documentation for KML, but their diagram leaves much to the imagination.  I looked around for a more complete diagram of KML 2.2 that I could use as a quick reference, but couldn&#8217;t find any so I made one myself.  I did it using MyEclipse&#8217;s UML modeling tool, which has some [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.tech4d.com/blog/wp-content/uploads/2007/09/google-kml-22-uml-diagram.png" title="google-kml-22-uml-diagram-thumb.png"><img src="http://www.tech4d.com/blog/wp-content/uploads/2007/09/google-kml-22-uml-diagram-thumb.png" style="float: left" title="google-kml-22-uml-diagram-thumb.png" alt="google-kml-22-uml-diagram-thumb.png" /></a></p>
<p>Google provides <a href="http://code.google.com/apis/kml/documentation/kml_tags_beta1.html">great documentation for KML</a>, but their diagram leaves much to the imagination.  I looked around for a more complete diagram of KML 2.2 that I could use as a quick reference, but couldn&#8217;t find any so I made one myself.  I did it using MyEclipse&#8217;s UML modeling tool, which has some irritating quirks, but for the most part is reliable. The diagram is  Java-centric and doesn&#8217;t include every object, though most of the important stuff is there.</p>
<p>Click on the image to see the entire diagram.  Here&#8217;s the actual <a href="http://www.tech4d.com/blog/wp-content/uploads/2007/09/kml-model.zip" title="kml-model.zip">My Eclipse UML file</a>.  If you make any corrections or enhancements, please send me an update.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.tech4d.com%2Fblog%2F2007%2F09%2F12%2Fjava-centric-uml-diagram-of-kml-22%2F&amp;linkname=Java-centric%20UML%20diagram%20of%20KML%202.2"><img src="http://www.tech4d.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.tech4d.com/blog/2007/09/12/java-centric-uml-diagram-of-kml-22/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
