<?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>ThotSpots &#187; News</title>
	<atom:link href="http://www.thotspots.com/category/blog/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.thotspots.com</link>
	<description>Agile Software Development</description>
	<lastBuildDate>Wed, 09 Sep 2009 18:13:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Web Hosting Now Available Here</title>
		<link>http://www.thotspots.com/web-hosting-now-available-here/</link>
		<comments>http://www.thotspots.com/web-hosting-now-available-here/#comments</comments>
		<pubDate>Wed, 08 Aug 2007 22:57:35 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.maximsc.com/web-hosting-now-available-here/</guid>
		<description><![CDATA[By popular request, Maxim Software Corp. now offers website hosting service to the public.  The same servers that we use to host the properties of our ThotSpots Web Media division are now available to you at competitive prices.  This service is being offered as a convenience to our consulting clients who seek one-stop-shopping, [...]]]></description>
			<content:encoded><![CDATA[<p>By popular request, Maxim Software Corp.<span> </span>now offers website hosting service to the public.<span>  </span>The same servers that we use to host the properties of our <a href="http:./thotspots" title="ThotSpots Web Media network">ThotSpots Web Media</a> division are now available to you at competitive prices.<span>  </span>This service is being offered as a convenience to our consulting clients who seek one-stop-shopping, but is not required.<span>  </span>As always, our software developers and website administrators will be happy to work with any website project, regardless of where it is hosted.  For more information, write to <a href="mailto:info@maximsc.com" title="contact us" target="_blank">info@maximsc.com</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/web-hosting-now-available-here/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>This Blog is Now Registered on Technorati</title>
		<link>http://www.thotspots.com/this-blog-is-now-registered-on-technorati/</link>
		<comments>http://www.thotspots.com/this-blog-is-now-registered-on-technorati/#comments</comments>
		<pubDate>Mon, 06 Aug 2007 09:00:47 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.maximsc.com/this-blog-is-now-registered-on-technorati/</guid>
		<description><![CDATA[This is just a quick post to indicate that this blog is now registered on Technorati.
]]></description>
			<content:encoded><![CDATA[<p>This is just a quick post to indicate that this blog is now registered on <a href="http://technorati.com/claim/pqwhwp7ttt" rel="me">Technorati</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/this-blog-is-now-registered-on-technorati/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Removing Code Generators from the Build Process</title>
		<link>http://www.thotspots.com/removing-code-generators-from-the-build-process/</link>
		<comments>http://www.thotspots.com/removing-code-generators-from-the-build-process/#comments</comments>
		<pubDate>Fri, 03 Aug 2007 17:04:16 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[code generators]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://www.maximsc.com/removing-code-generators-from-the-build-process/</guid>
		<description><![CDATA[I&#8217;m a huge fan of code generators.  I&#8217;ve seen them used successfully in many different ways.  In the Java world, for example, the Xdoclet parser is commonly used to generate object code and ORM mappings based on database schema &#8212; a huge timesaver.  I&#8217;ve also seen creative uses of XSTL transforms and [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a huge fan of code generators.  I&#8217;ve seen them used successfully in many different ways.  In the Java world, for example, the Xdoclet parser is commonly used to generate object code and ORM mappings based on database schema &#8212; a huge timesaver.  I&#8217;ve also seen creative uses of XSTL transforms and Velocity templates for handily generating all kinds of program code.  There are generally two ways to take advantage of code generators.  One is for software developers to invoke the code generators on demand, as they program.   The other is to incorporate code generators as part of a &#8220;daily build&#8221; (i.e. some automated build process using Ant, Maven, another build tool, or handcrafted scripts/batch files).  Lately, I&#8217;ve gotten soured on the latter.<span id="more-35"></span></p>
<p>Case in point: On a project where we were upgrading a system from Java 1.4 to Java 5, I happened to be the first developer to check in code with Java 5 type safety notation (which uses angle brackets) in a file that happened to be processed by a Hibernate 2 Xdoclet parser during the build process (if necessary).  I didn&#8217;t realize that the Xdoclet parser didn&#8217;t know how to handle those angle brackets.  Furthermore, I didn&#8217;t notice the problem because of the way the Ant script was set up, it didn&#8217;t manifest until after running a CLEAN task, but I had no reason to run CLEAN (just BUILD). So, instead, an unsuspecting developer on the East Coast was made to suffer, puzzling over the problem until I came online three hours later and realized what had happened.</p>
<p>So, in my experience, code generators seem to be much more successful when used as tools that are invoked on demand by the developers.  The key distinction is whether or not the generated code is committed to version control.  Looking back over the last seven projects that I&#8217;ve been involved with that made heavy use of code generators, three of them did so with post-commit generation.  The four projects that used on-demand generation always seems to work out much better.  On-demand generation simplifies much:</p>
<ol>
<li>The build process is faster and more direct, with less to go wrong at build time, which is beyond the control of the committing developer.  This is especially important when automating the build process to be unattended, with tools like Cruise Control.</li>
<li>Newbie developers do not need to be aware of the existence of the code-generation tools at all (until their first assignment that requires one).  That&#8217;s less to go wrong when setting up a new development environment.</li>
<li>Exceptions to the rule can be handled manually.  No need to spend hours perfecting rickety RegEx replacement tasks in Ant.  (By all means, utilize RegEx replacement tasks when it is cost effective to spend the time writing them, but this way you get to choose when that is, rather than being forced into it.  Also, this way it won&#8217;t kill you if the transform is not perfect.)</li>
<li>There is high visibility of the generated code.  What&#8217;s checked in to version control is what you get.  The exact changes are logged and can be easily differenced/compared/branched/tagged, just like any other code.  There&#8217;s no question as to what the compiler is &#8220;really&#8221; going to compile and deploy.</li>
<li>By putting the developer in the loop between the code generation and the commit, it gives Eclipse a chance to chime in about errors and warnings.<br />
Also, if Eclipse can see the generated code, that means that all the power and might of the searching, navigating, and refactoring tools come into play.</li>
<li>When the code generators make bad decisions (e.g. when presented with a new kind of input), the results are more easily noticed because the developer facing the problem is the one who just did the on-demand code generation.  Chances are, the problem will manifest as a blatant error, warning, or hint, or as unit test failure.  Even if not, the committing developer might catch it still if he/she is disciplined in comparing the differences of every single file that he/she is about to check in (a good practice anyway for catching things like typos, unaddressed TODO&#8217;s, and extraneous debugging logic).</li>
<li>It&#8217;s easer for developers to mix and match tools, applying them in any arbitrary order, as opposed to the ones that are programmed in to the build process always having to be last.</li>
</ol>
<p>I admit there are some downsides:</p>
<ol>
<li>Having to make sure the developers know when and how they are supposed to use the tools, at the risk of them thinking they need to do the work by hand.</li>
<li>Remembering to revisit previously generated code whenever a code generator process changes, and either manually affecting the changes, or regenerating that code and merging back in any modifications that were done by hand.  (Fortunately tools like WinMerge and Beyond Compare make this easier.)</li>
</ol>
<p>There are undoubtedly more cons (as well as pros), but I&#8217;m convinced that the cons are easily managed and that the &#8220;low road&#8221; is the easier route.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/removing-code-generators-from-the-build-process/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interview with a Sarbanes-Oxley Auditor</title>
		<link>http://www.thotspots.com/interview-with-a-sarbanes-oxley-auditor/</link>
		<comments>http://www.thotspots.com/interview-with-a-sarbanes-oxley-auditor/#comments</comments>
		<pubDate>Wed, 01 Aug 2007 23:14:35 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[role-based security]]></category>
		<category><![CDATA[Sarbanes-Oxley]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[segregation of duties]]></category>

		<guid isPermaLink="false">http://www.maximsc.com/interview-with-a-sarbanes-oxley-auditor/</guid>
		<description><![CDATA[On Role-Based Security and Segregation of Duties
Jim Fleischmann is a security consultant who audits companies for Sarbanes-Oxley compliance [defined].  He and I recently compared notes.  As a software developer who has often worked on role-based security systems, it was wonderful for me to get his perspective on where the rubber meets the road. [...]]]></description>
			<content:encoded><![CDATA[<h2>On Role-Based Security and Segregation of Duties</h2>
<p>Jim Fleischmann is a security consultant who audits companies for Sarbanes-Oxley compliance [<a href="http://en.wikipedia.org/wiki/Sarbanes-Oxley">defined</a>].  He and I recently compared notes.  As a software developer who has often worked on role-based security systems, it was wonderful for me to get his perspective on where the rubber meets the road.  As you might imagine, his feedback was quite different from the usual feedback I&#8217;d get through channels (QA bug reports, customer service support tickets, etc.) The following is my recollection of what we covered.  I&#8217;ll start with Jim&#8217;s observations, and then follow up with my own.<br />
<span id="more-33"></span><br />
I opened the conversation by lamenting on how difficult it is to find information on best practices for role-based security.  Jim agreed that there is a dearth of information for this.  He suggested that if anything new does surface, I might find it by searching on the phrase &#8220;<strong>segregation of duties</strong>,&#8221; that being the overarching concept for which role-based security is just one manifestation.</p>
<p>I next asked Jim what are the most important aspects of any of role-based security system, to him as an auditor.  He named four:</p>
<ul>
<li><strong>Reporting Capability</strong> &#8212; The audit stops dead if Jim cannot be provided with hard-copy reports that list: (a) all of the available permissions and their definitions, (b) all of the defined roles with the permissions assigned to them, and (c) all of the active users and their roles.</li>
<li><strong>Usage Auditing</strong> &#8212; Next, Jim looks for anything that can tell him whether or not permissions and roles are actually being used.  Jim says one of the most common recommendations that come out of his audits is to clamp down on roles and permissions that are not being used.  Say, for example, that a user is assigned to a role that is allowed 20 different permissions, but that particular user only ever takes advantage of three of those permissions.  Jim&#8217;s recommendation would be to define a second role with just those three permissions (or at least a much smaller subset of the 20), and then reassign the user to that new role.  Therefore, anything the software can do from an auditing perspective to support the discovery of this kind of information is a boon.</li>
<li><strong>100% Role-Based</strong> &#8212; It&#8217;s a red flag to Jim if the software allows a user to be assigned a permission directly (without having to go through a role).  That defeats the whole purpose of having roles, he says, and having the roles be meaningful.</li>
<li><strong>Segregation of Duties Enforced by Mutually Exclusive Permissions</strong> &#8212; The whole point of role-based security is to give workers access to only the functionality they need to perform their jobs.  So, a main focus of any audit is to look for certain tasks that should always be mutually exclusive (e.g. the person processing an order should never be the same person who handles the cash), and then to see that the roles and permissions, as defined, enforce this.  All the better if the software actively supports the concept of mutually exclusive permissions, preventing in the first place any one role from being granted both permissions.  Furthermore, if the system allows one user to be assigned multiple roles, then the software should also prevent any role combinations that would grant a single user conflicting permissions.</li>
</ul>
<p>I also wanted to know if Jim had any thoughts on whether or not users should be allowed to be assigned more than one role.  Similarly, did he like the idea of having super-roles that are made up of sub-roles, or if that muddled things.  Jim did not have an opinion on either.  Whichever of these approaches works best for the application, would be fine by him.  He did point out that it should be absolutely clear that assigning a user to multiple roles means they are being granted the union of all those permissions, lest someone in administration think they are only granting that user the intersection of them.</p>
<p>Finally, here are a few of my own observations on the practical implementation of role-based security:</p>
<ul>
<li><strong>Us Programmers are Lazy</strong> &#8212; We tend to write code that is wide-open and worry about clamping down on security last, if at all.  So, the more we can do as software architects to make security awareness part of the development process, the better.  This could mean utilizing code generation and code templates at development time, adding static or dynamic code validation at build time, or taking advantage of aspect oriented programming such as described by Rick Hightower here: <a href="http://www.thearcmind.com/confluence/display/SpribernateSF/%20Using+Spring+AOP+to+add+row+level+security%20+to+Hibernate+or+any+ORM+really"> www.thearcmind.com/confluence/display/SpribernateSF/ Using+Spring+AOP+to+add+row+level+security +to+Hibernate+or+any+ORM+really</a>.</li>
<li><strong>Always Code to Permissions, Never to Roles</strong> &#8212; Application programmers should only code their security checks against permissions, not directly against roles.  Roles should be treated only as a mechanism for bundling permissions.  For one thing, it simplifies the application code if security checks are always only against permissions.  But more importantly, coding directly against a role in effect creates a phantom permission, and it would be all too easy for that aspect of the role, that phantom permission, to go undocumented.</li>
<li><strong>Hyper Specific Permissions</strong> &#8212; New permissions should be created at the drop of a hat.  Reusing an existing permission for a second purpose is usually wrong.  In any event, it&#8217;s far easier to merge two permissions that are later determined to be redundant, than it is to split one that is determined to be overreaching.</li>
<li><strong>Careful Permission Naming</strong> &#8212; The naming of permissions is hard, but worth every minute spent agonizing over getting them right.  It is especially important to ensure that permission names are unique with all other entities throughout the code base.  Since permission names are often cited within quoted strings, in XML files, and in database load scripts, most of these occurrences are therefore out of the reach of any of the &#8220;safe&#8221; refactoring tools that are programmed into modern IDE&#8217;s. So, having absolutely unique permission names makes it easier to rely on an ordinary search-and-replace tool.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/interview-with-a-sarbanes-oxley-auditor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maxim Software Acquires CodeJacked.com</title>
		<link>http://www.thotspots.com/maxim-software-acquires-codejackedcom/</link>
		<comments>http://www.thotspots.com/maxim-software-acquires-codejackedcom/#comments</comments>
		<pubDate>Thu, 15 Mar 2007 03:37:05 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[CodeJacked.com]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.thotspots.com/?p=28</guid>
		<description><![CDATA[We at Maxim Software Corporation proudly announced today our acquisition of <a HREF="http://codejacked.com">http://www.codejacked.com</a>, a website of productivity tips for Windows and Linux users.  CodeJacked.com is the brainchild of Kyle Pott, a programmer and productivity expert who is now lending his writing skills to lifehack.org (which has to do with productivity, in general, whereas CodeJacked.com is focused on "jacking up" computer-user productivity).  CodeJacked.com was briefly dormant while the sale was pending, but regular daily postings resumed last Monday.

The newest postings, written by Maxim employees, are already well received, and are attracting plenty of positive comments and feedback.  CodeJacked is a perfect fit for us, and it's great to know that the readers agree.

For more details, see the press release at <a HREF="http://codejacked.com/sitenews">codejacked.com/sitenews</a>, or simply visit the site itself to see what it's all about.]]></description>
			<content:encoded><![CDATA[<p>We at Maxim Software Corporation proudly announced today our acquisition of <a href="http://codejacked.com">http://www.codejacked.com</a>, a website of productivity tips for Windows and Linux users.  CodeJacked.com is the brainchild of Kyle Pott, a programmer and productivity expert who is now lending his writing skills to lifehack.org (which has to do with productivity, in general, whereas CodeJacked.com is focused on &#8220;jacking up&#8221; computer-user productivity).  CodeJacked.com was briefly dormant while the sale was pending, but regular daily postings resumed last Monday.<br />
<span id="more-28"></span><br />
The newest postings, written by Maxim employees, are already well received, and are attracting plenty of positive comments and feedback.  CodeJacked is a perfect fit for us, and it&#8217;s great to know that the readers agree.</p>
<p>For more details, see the press release at <a href="http://codejacked.com/sitenews">codejacked.com/sitenews</a>, or simply visit the site itself to see what it&#8217;s all about.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/maxim-software-acquires-codejackedcom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Overburdened Software Developers?</title>
		<link>http://www.thotspots.com/team-compliment/</link>
		<comments>http://www.thotspots.com/team-compliment/#comments</comments>
		<pubDate>Fri, 09 Mar 2007 02:35:48 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[ThotSpots services]]></category>

		<guid isPermaLink="false">http://www.thotspots.com/?p=25</guid>
		<description><![CDATA[Are your Java or C# programmers too busy chopping down trees to sharpen their axes?  We can help.  There are hundreds of proven, best-practice methods for dramatically shortening turn-around times, reducing senseless rework, obtaining consistently better time-estimates, and generally increasing developer productivity.  Let us help you identify and adopt the ones that [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Are your Java or C# programmers too busy chopping down trees to sharpen their axes?</strong>  We can help.  There are hundreds of proven, best-practice methods for <em>dramatically shortening turn-around times, reducing senseless rework, obtaining consistently better time-estimates, and generally increasing developer productivity.</em>  Let us help you identify and adopt the ones that are most suitable for your situation.</p>
<p><strong>Keep your developers focused on what they do best</strong> &#8212; directly applying their hard-won knowledge of the problem domain &#8212; and allow us to take care of the nagging incidentals.  We bring expertise in all of the following areas:</p>
<ul>
<li>Build Process Automation</li>
<li>Deployment Process Automation</li>
<li>Version Control Integration</li>
<li>Automated Regression Testing (&#8221;Smoke Tests&#8221;)</li>
<li>Project Wikis</li>
<li>Code Generation &amp; Templating</li>
<li>Static &amp; Dynamic Source Code Validation</li>
</ul>
<p><span id="more-25"></span><br />
We work well with teams of any size, whether they are collocated or distributed, on-site or remote.  We can start with whatever processes you already have in place, or create new processes from the ground up.  Every job is fully documented and completely transparent, so your developers will have no trouble adopting and perpetuating the chosen solutions.</p>
<p><strong>Questions?</strong>  Call anytime to learn more or to schedule an exploratory review.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/team-compliment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Software Archeology Using Rsync</title>
		<link>http://www.thotspots.com/software-archeology-using-rsync/</link>
		<comments>http://www.thotspots.com/software-archeology-using-rsync/#comments</comments>
		<pubDate>Sat, 03 Mar 2007 04:09:03 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[searching code]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://www.thotspots.com/?p=24</guid>
		<description><![CDATA[The most powerful tool in the knapsack of a software archeologist/maintainer, is the grep search.  Unfortunately the signal-to-noise ratio for grep search results can often be quite low.  This happens when the project source files are intermingled with other artifacts such as generated files, raw templates, library/framework documentation files and examples.

One trick to filtering out the noise is to define a shell script that uses Rsync to create/update a searchable shadow copy of the working folder, and then to search that copy...]]></description>
			<content:encoded><![CDATA[<p>The most powerful tool in the knapsack of a software archeologist/maintainer, is the grep search.  Unfortunately the signal-to-noise ratio for grep search results can often be quite low.  This happens when the project source files are intermingled with other artifacts such as generated files, raw templates, library/framework documentation files and examples.</p>
<p>One trick to filtering out the noise is to define a shell script that uses Rsync to create/update a searchable shadow copy of the working folder, and then to search that copy&#8230;<span id="more-24"></span>  In case you&#8217;re not familiar with Rsync, it is a tool intended to keep two remote file systems synchronized.  Rsync&#8217;s main claim to fame is that it&#8217;s fast because it only transmits the differences, but Rsync is also quite powerful when it comes to specifying exactly which files and folders are to be synchronized and how.  It&#8217;s this secondary feature of Rsync that allows us to filter out the noise.  There are two parts to this solution: the actual shell script, and a file that lists all of the inclusion and exclusion patterns.  (This example uses CygWin, running on a Windows box.)</p>
<h3>Here is the (entire) shell script (C:workcmdsearchcopy.sh):</h3>
<pre>
 #!/bin/sh
 pushd /cygdrive/c/work
 mkdir -p /cygdrive/e/work_search
 rsync -vrut --filter='. /cygdrive/c/work/cmd/searchcopy_filelist.txt' alpha bravo charlie /cygdrive/e/work_search
 popd</pre>
<ul>
<li>/cygdrive/c/work is your working folder (that&#8217;s CygWin speak for C:work).</li>
<li>Alpha, bravo, and charlie are the folder names of the projects that you are interested in.</li>
<li>/cygdrive/e/work_search is the name of the searchable shadow copy you want to create/update (over on your E: removable USB drive).</li>
</ul>
<h3>Here is (an abbreviated version of) the filter file (C:workcmdsearchcopy_filelist.txt), to give you an idea:</h3>
<pre>
 - .svn/
 - bin/
 - build*/
 - deployment/
 - lib/
 - log/
 - .#*
 - *.[ehjstw]ar
 - *.[Bb][Aa][Kk]
 - *.doc
 - *.[Ee][Xx][Ee]
 - *.gif
 - *.httpunit
 - *.ico
 - *.jasper
 - *.jpg
 - *.library
 - *.log
 - *.[Oo][Ll][Dd]
 - *.pdf
 - *.[Zz][Ii][Pp]</pre>
<p>In this case, they are all exclusions (leading minus sign),  Thus, everything in the alpha, bravo, and charlie folders will be copied, except files or subfolders matching these patterns.</p>
<h3>Tips for using Rsync:</h3>
<ul>
<li>Don&#8217;t waste time with the &#8211;include and &#8211;exclude switches, they are merely dumbed-down versions of the &#8211;filter switch, so just use the &#8211;filter switch right off.</li>
<li>Avoid the &#8211;cvs-exclude switch, if you can, and pay close attention to what it ignores if you can&#8217;t.  For example, it ignores any file or folder named &#8220;core&#8221;, and it ignores *.script files; both of which burned me when I tried using it on a certtain Tapestry application.</li>
<li>Most implementations of Rsync are case sensitive, including CygWin&#8217;s!  So if there is a possibility of filenames that exist with multiple casings, then you either have to repeat the pattern or use the square bracket notation:
<pre>
 - *.EXE
 - *.Exe
 - *.exe</pre>
<p>or</p>
<pre>
 - *.[Ee][Xx][Ee]</pre>
</li>
<li>Pay close attention to the man pages that describe other aspects of the pattern matching algorithm.  For example, leading and trailing slashes each have special significance.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/software-archeology-using-rsync/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Head First&#8221; Book Sometimes Makes My Head Hurt</title>
		<link>http://www.thotspots.com/head-first-book-sometimes-makes-my-head-hurt/</link>
		<comments>http://www.thotspots.com/head-first-book-sometimes-makes-my-head-hurt/#comments</comments>
		<pubDate>Sat, 17 Feb 2007 01:17:19 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[design principles]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://www.thotspots.com/?p=23</guid>
		<description><![CDATA[[This review originally appeared in my personal blog on Sept 8, 2005.  I'm reposting it by request.]

IÃƒÂ¢Ã¢â€šÂ¬Ã¢â€žÂ¢m helping out with a study group for "Head First Design Patterns," which just finished chapter 6. On the whole, itÃƒÂ¢Ã¢â€šÂ¬Ã¢â€žÂ¢s a pretty good introduction to software design patterns ÃƒÂ¢Ã¢â€šÂ¬Ã¢â‚¬Å“ way more accessible than the seminal work by the Gang of Four; however, the examples sometimes make my head hurt. I canÃƒÂ¢Ã¢â€šÂ¬Ã¢â€žÂ¢t imagine what theyÃƒÂ¢Ã¢â€šÂ¬Ã¢â€žÂ¢re doing to the heads of the beginners in the group. Coming up with decent examples is the hardest thing to do in expository writing, and]]></description>
			<content:encoded><![CDATA[<p>[This review originally appeared in my personal blog on Sept 8, 2005.  I'm reposting it by request.]</p>
<p>I&#8217;m helping out with a study group for &#8220;Head First Design Patterns,&#8221; which just finished chapter 6. On the whole, it&#8217;s a pretty good introduction to software design patterns &#8212; way more accessible than the seminal work by the Gang of Four; however, the examples sometimes make my head hurt. I can&#8217;t imagine what they&#8217;re doing to the heads of the beginners in the group. Coming up with decent examples is the hardest thing to do in expository writing, and I certainly give the authors an E for effort in creativity, but I wish they had been a little less concerned with making their examples &#8220;hip&#8221; and a little more concerned with making them appropriate.<br />
<span id="more-23"></span><br />
To wit, the whole pizza store analogy in chapter 4 (to illustrate factory method and abstract factory) is flawed. For one thing, that&#8217;s just not the way you&#8217;d model a pizza business in any actual software that I can imagine. For another, the differences between a New York pizza factory and a Chicago pizza factory are too subtle/trivial to make for an effective illustration of why you would need to subclass anything (much less use a factory to manage the subclasses). A much better example, as everyone in my group agreed, would have been an application that needs to offer up a consistent set of functionality to users who are accessing it in wildly different ways: one&#8217;s in a web browser on a desktop, another is running a cell phone app, another is using a touch-tone phone, and yet another is using a voice-activated headset. All the client code knows is that, for example, it needs to ask a multiple-choice question and obtain the answer. It&#8217;s up to an abstract factory to provide the client with a set of classes that can do that, in the context of the selected user-interface, in whatever way is necessary.</p>
<p>To a lesser degree, the Starbucks coffee example at the beginning of the book suffers from the same too-hip-to-be-effective syndrome, although I do think that the remote-control example for the Command pattern in chapter six is dead on.</p>
<p>For any novice who is reading this book without the benefit of a study group, I highly suggest that you find at least one other programmer who is experienced in design patterns to explain why/if/how the examples are lacking.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/head-first-book-sometimes-makes-my-head-hurt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Magic Number Seven WRT the Framework Simplicity Conundrum</title>
		<link>http://www.thotspots.com/the-magic-number-seven-wrt-the-framework-simplicity-conundrum/</link>
		<comments>http://www.thotspots.com/the-magic-number-seven-wrt-the-framework-simplicity-conundrum/#comments</comments>
		<pubDate>Sun, 11 Feb 2007 05:48:07 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[complexity]]></category>
		<category><![CDATA[design principles]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[simplicity]]></category>

		<guid isPermaLink="false">http://www.thotspots.com/?p=22</guid>
		<description><![CDATA[Mid last year, Kurt Williams wrote "Beware of Simplicity" [<a HREF="http://jroller.com/page/cardsharp?entry=beware_simple_frameworks">jroller.com/page/cardsharp?entry=beware_simple_frameworks</a>] in development frameworks.  According to him, new and fresh frameworks can only claim to be simple because they are immature.  All frameworks are doomed to growing more complex as they grow in features.  I can't argue with that.  It seems to me, therefore, that the best frameworks are the ones that do the best job of hiding that complexity -- either because of the innate architecture of the framework, or by virtue of the tools and practices that deal with the complexity for you.  A framework can have all of the under-the-hood complexity it needs.  It's the day-to-day, in-your-face complexity that I care about.

In the field of cognitive psychology there's this so-called "Magic Number 7."  Basically, the idea is that humans can only keep 7 disjointed "things", plus or minus two, in short-term memory at once.  To see what I mean, study the following list of words for a minute.  Then, turn away and write down as many as you can from memory:]]></description>
			<content:encoded><![CDATA[<p>Mid last year, Kurt Williams wrote &#8220;<a href="http://jroller.com/page/cardsharp?entry=beware_simple_frameworks">Beware of Simplicity</a>&#8221; in development frameworks.  According to him, new and fresh frameworks can only claim to be simple because they are immature.  All frameworks are doomed to growing more complex as they grow in features.  I can&#8217;t argue with that.  It seems to me, therefore, that the best frameworks are the ones that do the best job of hiding that complexity &#8212; either because of the innate architecture of the framework, or by virtue of the tools and practices that deal with the complexity for you.  A framework can have all of the under-the-hood complexity it needs.  It&#8217;s the day-to-day, in-your-face complexity that I care about.</p>
<p>In the field of cognitive psychology there&#8217;s this so-called &#8220;Magic Number 7.&#8221;  Basically, the idea is that humans can only keep 7 disjointed &#8220;things&#8221;, plus or minus two, in short-term memory at once.  To see what I mean, study the following list of words for a minute.  Then, turn away and write down as many as you can from memory:<br />
<span id="more-22"></span><br />
Apricot, ladder, storm, headphones, spark-plug, sneaker, anchor, coin, library, twenty-seven, lyrics, nail, telescope, onion.</p>
<p>How&#8217;d you do?  I could only recall nine of them (even though I was the one who made up the darn list just now), and in fact, I had to work hard to recall the eighth and ninth.  By the way, IQ has nothing to do with this number.  Whether you&#8217;re closer to Mensa or Densa, your short-term recall factor will still be 7 +/- 2.  (See <a href="http://en.wikipedia.org/wiki/The_Magical_Number_Seven%2C_Plus_or_Minus_Two">Wikipedia</a> and George Miller&#8217;s 1956 paper that first noted the phenomenon is at <a href="http://www.musanim.com/miller1956/">www.musanim.com/miller1956/</a>.)</p>
<p>As the Wikipedia article points out, Ed Yourdon first commented on how this relates to computer science back in 1979.  He described what we would today refer to as the long-method smell (see <a href="http://www.soberit.hut.fi/mmantyla/BadCodeSmellsTaxonomy.htm">www.soberit.hut.fi/mmantyla/BadCodeSmellsTaxonomy.htm</a>), citing the magic number 7 as why it&#8217;s bad to tax the short-term memory of someone trying to understand a piece of code.</p>
<p>So, how often does your web framework require you to keep track of more than seven things at once?  Take, for example, the simple task of creating a data-entry page.  How many different files need to be created or modified to accomplish this? One for the HTML template, one for the page logic, multiple files for each model object (interface, impl, and ORM mapping), the DAO (interface and impl), the config file with the URL construction rules, the config file with the user security rules, the config file that lists all of the pages on the site, the interface file with constants for all those page names?  &#8212; That&#8217;s eleven and counting.  Sound familiar?  This amount of complexity often leads to things falling through the cracks, and is usually reflected in a high number of bug reports.</p>
<p>From what I have seen, Ruby on Rails has made this particular task as simple as it can be, and that accounts for a great deal of RoR&#8217;s appeal, I&#8217;m sure.  Even .Net has this down cold.  In the case of RoR, it&#8217;s an innate feature of the framework.  In the case of .Net, it&#8217;s simplified by the tools.  I&#8217;m still waiting for a Java-based framework/environment that &#8220;gets it&#8221; in this regard.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/the-magic-number-seven-wrt-the-framework-simplicity-conundrum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SoCal Code Camp 2007 Reviewed</title>
		<link>http://www.thotspots.com/socal-code-camp-2007-reviewed/</link>
		<comments>http://www.thotspots.com/socal-code-camp-2007-reviewed/#comments</comments>
		<pubDate>Wed, 31 Jan 2007 06:41:29 +0000</pubDate>
		<dc:creator>Craig Jones</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.thotspots.com/?p=17</guid>
		<description><![CDATA[The second annual <a HREF="http://www.socalcodecamp.com/">SoCal Code Camp</a> at Cal State Fullerton last weekend was an improvement in many ways.   The volunteer speakers were all well prepared, knew their stuff, and gave excellent talks.  The only hitch I experienced was once when we had to swap rooms because one topic gathered more interest than expected, and it's not like they could have done anything to prevent that.  For an all-volunteer event with no admission charge, I was blown away (again)...]]></description>
			<content:encoded><![CDATA[<p>The second annual <a href="http://www.socalcodecamp.com/">SoCal Code Camp</a> at Cal State Fullerton last weekend was an improvement in many ways.   The volunteer speakers were all well prepared, knew their stuff, and gave excellent talks.  The only hitch I experienced was once when we had to swap rooms because one topic gathered more interest than expected, and it&#8217;s not like they could have done anything to prevent that.  For an all-volunteer event with no admission charge, I was blown away (again).<br />
<span id="more-17"></span></p>
<p>The best part is that the talks were not all technical.  Much of the conference was business oriented, putting the technical aspects into perspective.  For example, Abhijit Gadkari opened up his talk about <a href="http://www.socalcodecamp.com/session.aspx?sid=bafcd88e-7da2-44ac-828a-77ea3df7716b">Software as a Service (SaaS)</a> by pointing to where he believes it to be on the <a href="http://www.floor.nl/ebiz/gartnershypecycle.htm">hype cycle</a> (half way between the technology trigger and the peak of inflated expectations) as compared to where four technologies are that SaaS relies on: XML (plateau of productivity), web services (slope of enlightenment), SOA (just past the peak of inflated expectations and dropping), and Workflow (just recently triggered).</p>
<p>Jinesh Varia, the Evangelist from Amazon showed off <a href="http://www.socalcodecamp.com/session.aspx?sid=35ebff5c-e9ab-432d-98cd-fd734c4d5697">S3</a> and <a href="http://www.socalcodecamp.com/session.aspx?sid=499ecb00-cfa4-4dcf-8d30-ddb8fd4f6c90">EC2</a>, which are the greatest things to happen to remote hosting since fibre optics.</p>
<p>Waleed Abdulla presented his XRules project &#8211; a clean, straightforward way to encode business rules for working with XML packets, to validate them, and to perform computations on them.  The idea is that the same business rules work for local validation as well as remote.  He&#8217;s written .Net implementations that run on Windows servers and in IE, but the concepts are universal.  His use case is that he&#8217;s aggregating information between hundreds of different vendors &#8212; regional trucking companies if I recall correctly &#8212; each with slightly different criteria for the jobs they&#8217;ll accept and how they charge for them.  This is something that&#8217;s going to come up more and more often as smaller businesses figure out how to join forces (and new startups figure out how to do that joining).  I&#8217;m impressed with what Waleed has done.  The Java community would do well to consider a port of XRules.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.thotspots.com/socal-code-camp-2007-reviewed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

