<?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>Pathfinder Development &#187; Java</title>
	<atom:link href="http://www.pathf.com/blogs/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.pathf.com/blogs</link>
	<description>Running commentary about agile development, user experience design and Ajax.</description>
	<lastBuildDate>Tue, 16 Mar 2010 13:42:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Getting CloudTools to Work with Grails 1.1.1</title>
		<link>http://www.pathf.com/blogs/2009/12/cloudtools-work-grails-111/</link>
		<comments>http://www.pathf.com/blogs/2009/12/cloudtools-work-grails-111/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 22:46:43 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
				<category><![CDATA[Custom Application Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[Amazon Web Services]]></category>
		<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[EC2]]></category>
		<category><![CDATA[Grails]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=4513</guid>
		<description><![CDATA[
 photo credit: °Florian
Yes, Cloud Foundry has been acquired by Spring Source and seems to be morphing into a for-pay service, and there hasn't been a new build packaged on the Cloud Tools project page since January of 2009, but if you dig in the SVN repo, you see there's a bit of activity. Before [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/12/cloudtools-work-grails-111/">Getting CloudTools to Work with Grails 1.1.1</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/08/making-vaadin-puremvc-grails-work/' rel='bookmark' title='Permanent Link: Making Vaadin, PureMVC and Grails Work Together'>Making Vaadin, PureMVC and Grails Work Together</a></li><li><a href='http://www.pathf.com/blogs/2009/11/grails-google-app-engine-birthing-pains/' rel='bookmark' title='Permanent Link: Grails and Google App Engine: Birthing Pains'>Grails and Google App Engine: Birthing Pains</a></li><li><a href='http://www.pathf.com/blogs/2008/02/grails-and-json/' rel='bookmark' title='Permanent Link: Grails and JSONP: How Easy is That?'>Grails and JSONP: How Easy is That?</a></li></ol>]]></description>
			<content:encoded><![CDATA[<div style="float:right;padding:10px"><a href="http://www.flickr.com/photos/16634670@N00/3579526541/" rel="nofollow" title="Thunderhead"  target="_blank"><img src="http://farm4.static.flickr.com/3357/3579526541_fc9bf9f3cb_m.jpg" border="0" alt="Thunderhead" /></a><br />
<small><a href="http://creativecommons.org/licenses/by-sa/2.0/" rel="nofollow" title="Attribution-ShareAlike License"  target="_blank"><img src="http://www.pathf.com/blogs/wp-content/plugins/photo-dropper/images/cc.png" border="0" alt="Creative Commons License" width="16" height="16" align="absmiddle" /></a> <a href="http://www.photodropper.com/photos/" rel="nofollow"  target="_blank">photo</a> credit: <a href="http://www.flickr.com/photos/16634670@N00/3579526541/" rel="nofollow" title="°Florian"  target="_blank">°Florian</a></small></div>
<p>Yes, <a href="http://www.cloudfoundry.com/" rel="nofollow"  target="_blank">Cloud Foundry</a> has been acquired by <a href="http://www.springsource.com/" rel="nofollow"  target="_blank">Spring Source</a> and seems to be morphing into a for-pay service, and there hasn't been a new build packaged on the <a href="http://code.google.com/p/cloudtools/" rel="nofollow"  target="_blank">Cloud Tools project</a> page since January of 2009, but if you dig in the SVN repo, you see there's a bit of activity. Before I try building from source, I wanted to see how hard it would be to get 0.6 Grails plugin working with a Grails 1.1.1 app.</p>
<p>Well, harder than I thought. There's a real lack of documentation around cloudtools for one, and the radio silence on the project page over the last few months hasn't helped. Fortunately, Don over at AlterThought has put together a nice post that covers most of the <a href="http://alterlabs.com/uncategorized/grails-and-cloud-computing-part-1-amazon-ec/" rel="nofollow"  target="_blank">pitfalls and problems with the CloudTools Grails Plugin</a>. A few things they don't address and I thought I'd throw in here:</p>
<p><span id="more-4513"></span><br />
<strong>1. The CloudTools scripts expect the plugin to be located in the Grails project directory.</strong></p>
<p>That isn't the case anymore. The plugins have moved to <code>~/.grails/1.1.1/projects/&lt;your-project-name&gt;/plugins/</code>. The one script that barfs on this is <code>~/.grails/1.1.1/projects/&lt;your-project-name&gt;/plugins/cloud-tools-0.6/scripts/CloudToolsDeploy.groovy</code> which tries to determine the plugin dir through a process that just won't work anymore. Edit the file and replace all the <code>pluginHome</code> cruft with a single line:</p>
<pre class="groovy">pluginHome = <span style="color: #ff0000;">&quot;${cloudToolsPluginDir}&quot;</span>
&nbsp;</pre>
<p>That's it.</p>
<p><strong>2. The CloudTools deployment ignores your production configuration and just deploys development.</strong></p>
<p>If your development data source is configured to <code>create-drop</code>, you'll be very disappointed that your database is constantly getting nuked. So, ignore the production environment and just use development! (This will need to be fixed, of course.)</p>
<p><strong>3. When deploying, you need to have a local db running with the same login info/credentials as your production.</strong></p>
<p>What a huge pain. I only discovered this after shutting down my local development mysql instance. Not so good for automated build and deploy. Again, needs to be fixed.</p>
<p><strong>4. Using EBS is pretty dead simple.</strong></p>
<p>Using EBS to persist mysql tables is rather trivial. Just tack on a <code>withNewEbsVolume</code> method call the first time through, then a <code>withExistingEbsVolume</code>, some the first time:</p>
<pre class="groovy">clusterSpec = <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20new" rel="nofollow" ><span style="color: #000000; font-weight: bold;">new</span></a> ClusterSpec<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
                .<span style="color: #006600;">tomcats</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
                .<span style="color: #006600;">topology</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;SingleInstanceTopology&quot;</span><span style="color: #66cc66;">&#41;</span>
                .<span style="color: #006600;">instanceType</span><span style="color: #66cc66;">&#40;</span>EC2InstanceType.<span style="color: #006600;">SMALL</span><span style="color: #66cc66;">&#41;</span>
                .<span style="color: #006600;">slaves</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
                .<span style="color: #006600;">withNewEbsVolume</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span>, <span style="color: #ff0000;">&quot;/dev/sdq&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;</pre>
<p>CloudTools will create a volume, format it and mount it, populate the db tables to it. Next you find the volume id with something like <a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=609" rel="nofollow"  target="_blank" >ElasticFox</a> and edit your config file to look like this:</p>
<pre class="groovy">clusterSpec = <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20new" rel="nofollow" ><span style="color: #000000; font-weight: bold;">new</span></a> ClusterSpec<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
                .<span style="color: #006600;">tomcats</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
                .<span style="color: #006600;">topology</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;SingleInstanceTopology&quot;</span><span style="color: #66cc66;">&#41;</span>
                .<span style="color: #006600;">instanceType</span><span style="color: #66cc66;">&#40;</span>EC2InstanceType.<span style="color: #006600;">SMALL</span><span style="color: #66cc66;">&#41;</span>
                .<span style="color: #006600;">slaves</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
                .<span style="color: #006600;">withExistingEbsVolume</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;vol-1234&quot;</span>, <span style="color: #ff0000;">&quot;/dev/sdq&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;</pre>
<p>Obviously replace <code>vol-1234</code> with your actual volume id.</p>
<p>OK, that's it. With this configuration, I'm able to get a Grails app up in a matter of minutes with a persistent mysql db.</p>
<p>Next time: building from source.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/12/cloudtools-work-grails-111/">Getting CloudTools to Work with Grails 1.1.1</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/08/making-vaadin-puremvc-grails-work/' rel='bookmark' title='Permanent Link: Making Vaadin, PureMVC and Grails Work Together'>Making Vaadin, PureMVC and Grails Work Together</a></li><li><a href='http://www.pathf.com/blogs/2009/11/grails-google-app-engine-birthing-pains/' rel='bookmark' title='Permanent Link: Grails and Google App Engine: Birthing Pains'>Grails and Google App Engine: Birthing Pains</a></li><li><a href='http://www.pathf.com/blogs/2008/02/grails-and-json/' rel='bookmark' title='Permanent Link: Grails and JSONP: How Easy is That?'>Grails and JSONP: How Easy is That?</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/12/cloudtools-work-grails-111/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GWT 2.0 RC1 Released</title>
		<link>http://www.pathf.com/blogs/2009/11/gwt-20-rc1-released/</link>
		<comments>http://www.pathf.com/blogs/2009/11/gwt-20-rc1-released/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 20:34:03 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Rich Internet Apps]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technologies and Platforms]]></category>
		<category><![CDATA[Web Application Development]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[GWT 2.0]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=4346</guid>
		<description><![CDATA[Well, GWT 2.0 RC1 (yes!) is out. I was going to wait for a while with some of my new projects until switching them over to GWT 2.0, but given the pace of the GWT 2.0 project, I may just switch them over now rather than going through a painful migration.
I'm especially eager to use [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/11/gwt-20-rc1-released/">GWT 2.0 RC1 Released</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2008/10/gwt-gadgets-and-opensocial/' rel='bookmark' title='Permanent Link: GWT, Gadgets and OpenSocial'>GWT, Gadgets and OpenSocial</a></li><li><a href='http://www.pathf.com/blogs/2009/11/released-qxwt082rc1-gwt-wrapper-qooxdoo/' rel='bookmark' title='Permanent Link: Released: QxWT-0.8.2-RC1 &#8211; GWT Wrapper for qooxdoo'>Released: QxWT-0.8.2-RC1 &#8211; GWT Wrapper for qooxdoo</a></li><li><a href='http://www.pathf.com/blogs/2008/05/gwt-and-xul/' rel='bookmark' title='Permanent Link: GWT and XUL'>GWT and XUL</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.pathf.com/blogs/wp-content/uploads/2008/06/gwt.png" alt="gwt" title="gwt" width="260" height="250" class="alignright size-full wp-image-952" style="float:right;padding:10px" />Well, <a href="http://code.google.com/p/google-web-toolkit/wiki/GWT_2_0_RC" rel="nofollow"  target="_blank">GWT 2.0 RC1</a> (yes!) is out. I was going to wait for a while with some of my new projects until switching them over to GWT 2.0, but given the pace of the GWT 2.0 project, I may just switch them over now rather than going through a painful migration.</p>
<p>I'm especially eager to use UiBinder to do declarative UI creation. Just specify how your interface should look in XML:<br />
<span id="more-4346"></span></p>
<pre class="xml"><span style="color: #009900;"><span style="color: #808080; font-style: italic;">&lt;!-- UserDashboard.ui.xml --&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;ui:UiBinder</span> <span style="color: #000066;">xmlns:ui</span>=<span style="color: #ff0000;">'urn:ui:com.google.gwt.uibinder'</span>
    <span style="color: #000066;">xmlns:g</span>=<span style="color: #ff0000;">'urn:import:com.google.gwt.user.client.ui'</span>
    <span style="color: #000066;">xmlns:my</span>=<span style="color: #ff0000;">'urn:import:com.my.app.widgets'</span> <span style="font-weight: bold; color: black;">&gt;</span></span>
&nbsp;
  <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;g:HTMLPanel<span style="font-weight: bold; color: black;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;my:WeatherReport</span> <span style="color: #000066;">ui:field</span>=<span style="color: #ff0000;">'weather'</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
    <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;my:Stocks</span> <span style="color: #000066;">ui:field</span>=<span style="color: #ff0000;">'stocks'</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
    <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;my:CricketScores</span> <span style="color: #000066;">ui:field</span>=<span style="color: #ff0000;">'scores'</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
  <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/g:HTMLPanel<span style="font-weight: bold; color: black;">&gt;</span></span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/ui:UiBinder<span style="font-weight: bold; color: black;">&gt;</span></span></span>
&nbsp;</pre>
<p>and write some Java to instantiate it:</p>
<pre class="java"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> UserDashboard <span style="color: #000000; font-weight: bold;">extends</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AComposite+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" rel="nofollow" ><span style="color: #aaaadd; font-weight: bold;">Composite</span></a> <span style="color: #66cc66;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">interface</span> MyUiBinder <span style="color: #000000; font-weight: bold;">extends</span> UiBinder&lt;Widget, UserDashboard&gt;;
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> MyUiBinder uiBinder = GWT.<span style="color: #006600;">create</span><span style="color: #66cc66;">&#40;</span>MyUiBinder.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" rel="nofollow" ><span style="color: #aaaadd; font-weight: bold;">String</span></a><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> teamNames;
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> UserDashboard<span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" rel="nofollow" ><span style="color: #aaaadd; font-weight: bold;">String</span></a>... <span style="color: #006600;">teamNames</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">teamNames</span> = teamNames;
    initWidget<span style="color: #66cc66;">&#40;</span>uiBinder.<span style="color: #006600;">createAndBindUi</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;">/** Used by MyUiBinder to instantiate CricketScores */</span>
  @UiFactory CricketScores makeCricketScores<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #808080; font-style: italic;">// method name is insignificant</span>
    <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> CricketScores<span style="color: #66cc66;">&#40;</span>teamNames<span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>Obviously there's a little more to it than this. I'll try to post a little howto over the weekend. There's already a few examples out there, but when it comes to a new feature like this, the more explanations, the better.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/11/gwt-20-rc1-released/">GWT 2.0 RC1 Released</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2008/10/gwt-gadgets-and-opensocial/' rel='bookmark' title='Permanent Link: GWT, Gadgets and OpenSocial'>GWT, Gadgets and OpenSocial</a></li><li><a href='http://www.pathf.com/blogs/2009/11/released-qxwt082rc1-gwt-wrapper-qooxdoo/' rel='bookmark' title='Permanent Link: Released: QxWT-0.8.2-RC1 &#8211; GWT Wrapper for qooxdoo'>Released: QxWT-0.8.2-RC1 &#8211; GWT Wrapper for qooxdoo</a></li><li><a href='http://www.pathf.com/blogs/2008/05/gwt-and-xul/' rel='bookmark' title='Permanent Link: GWT and XUL'>GWT and XUL</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/11/gwt-20-rc1-released/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Grails and Google App Engine: Birthing Pains</title>
		<link>http://www.pathf.com/blogs/2009/11/grails-google-app-engine-birthing-pains/</link>
		<comments>http://www.pathf.com/blogs/2009/11/grails-google-app-engine-birthing-pains/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 22:45:46 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technologies and Platforms]]></category>
		<category><![CDATA[Web Application Development]]></category>
		<category><![CDATA[Web Infrastructure]]></category>
		<category><![CDATA[App Engine SDK]]></category>
		<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=4311</guid>
		<description><![CDATA[Whenever you can get a free, publicly available place to deploy your applications, your first instinct is to grab it with both hands. Google App Engine is one of those places. Each developer can deploy up to 10 different apps in development mode.
I've been working on a grails app recently that uses the grails App [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/11/grails-google-app-engine-birthing-pains/">Grails and Google App Engine: Birthing Pains</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/02/grails-delegating-to-gorm-persistence-in-java/' rel='bookmark' title='Permanent Link: Grails: Delegating to GORM Persistence in Java'>Grails: Delegating to GORM Persistence in Java</a></li><li><a href='http://www.pathf.com/blogs/2008/02/grails-and-json/' rel='bookmark' title='Permanent Link: Grails and JSONP: How Easy is That?'>Grails and JSONP: How Easy is That?</a></li><li><a href='http://www.pathf.com/blogs/2009/08/making-vaadin-puremvc-grails-work/' rel='bookmark' title='Permanent Link: Making Vaadin, PureMVC and Grails Work Together'>Making Vaadin, PureMVC and Grails Work Together</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-1393" style="float:right;padding:10px" title="grails_logo" src="http://www.pathf.com/blogs/wp-content/uploads/2009/02/grails_logo.png" alt="grails_logo" width="196" height="53" />Whenever you can get a free, publicly available place to deploy your applications, your first instinct is to grab it with both hands. Google App Engine is one of those places. Each developer can deploy up to 10 different apps in development mode.</p>
<p>I've been working on a grails app recently that uses the grails <a href="http://www.grails.org/plugin/app-engine" rel="nofollow"  target="_blank">App Engine Plugin</a>. Along with the <a href="http://grails.org/plugin/gorm-jpa" rel="nofollow" >GORM-JPA Plugin</a>, which gives you some  of the usual grails GORM goodness, you can write some reasonably interesting grails apps.<br />
<span id="more-4311"></span><br />
There are still a few flies in the ointment. Some of them are grails issues, and are due to the immature state of the plugins. Those are forgivable and will clearly be addressed given time. Some of them, however, are <a href="http://code.google.com/appengine/docs/java/overview.html" rel="nofollow"  target="_blank">App Engine Java SDK</a> issues. Those are really more problematic given the 1.2.6 version number on the SDK. f I had to boil it down to it's essentials, then I would say that the SDK doesn't barf in consistent ways. Up until 1.2.5, the SDK in development mode wouldn't even complain if you were doing privileged operations. With 1.2.6 you at least got some complaints. For example, with 1.2.6 you now see the following exception on grails startup:</p>
<pre lang="code" style="overflow:auto" >[java] Unable to use direct char[] access of java.lang.String. Disabling this method.
[java] java.lang.IllegalAccessException: Private fields can not be set on JRE classes.
</pre>
<p>That's because Groovy is trying to modify the <code>String</code> class. But still, there are any number of things that behave differently in the actual App Engine container than the local environment. One solution is to frequently deploy the app the the App Engine container. That's a pretty expensive step, however, and can't be a part of your development and test cycle. Also, even if something does blow up in the App Engine environment, you don't always get a log message. I've been trying to track down a "404 NOT FOUND" problem for a couple of weeks now that doesn't happen at all in the local SDK environment and leaves no log file traces in the App Engine environment.</p>
<p>I have my fingers crossed that version 1.2.7 of the SDK will solve all of those problems.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/11/grails-google-app-engine-birthing-pains/">Grails and Google App Engine: Birthing Pains</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/02/grails-delegating-to-gorm-persistence-in-java/' rel='bookmark' title='Permanent Link: Grails: Delegating to GORM Persistence in Java'>Grails: Delegating to GORM Persistence in Java</a></li><li><a href='http://www.pathf.com/blogs/2008/02/grails-and-json/' rel='bookmark' title='Permanent Link: Grails and JSONP: How Easy is That?'>Grails and JSONP: How Easy is That?</a></li><li><a href='http://www.pathf.com/blogs/2009/08/making-vaadin-puremvc-grails-work/' rel='bookmark' title='Permanent Link: Making Vaadin, PureMVC and Grails Work Together'>Making Vaadin, PureMVC and Grails Work Together</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/11/grails-google-app-engine-birthing-pains/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Coming Soon: Android Wireless Application Development Review</title>
		<link>http://www.pathf.com/blogs/2009/11/coming-android-wireless-application-development-review/</link>
		<comments>http://www.pathf.com/blogs/2009/11/coming-android-wireless-application-development-review/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 23:46:06 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technologies and Platforms]]></category>
		<category><![CDATA[iPhone/Mobile]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Davlik]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[JVM]]></category>
		<category><![CDATA[Mobile]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=4308</guid>
		<description><![CDATA[Just got my hands on a copy of Android, Wireless Application Development by Conder and Darcey and have been working my way through the first three chapters (really, the actual development starts in chapter 3).So far so good. Some of the pseudo JVM (Dalvik) takes a little bit of getting used to, but it's not [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/11/coming-android-wireless-application-development-review/">Coming Soon: Android Wireless Application Development Review</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2007/11/from-the-grassy/' rel='bookmark' title='Permanent Link: From the Grassy Knoll: Google Android Undermining  Java ME'>From the Grassy Knoll: Google Android Undermining  Java ME</a></li><li><a href='http://www.pathf.com/blogs/2007/11/zk-on-android/' rel='bookmark' title='Permanent Link: ZK on Android'>ZK on Android</a></li><li><a href='http://www.pathf.com/blogs/2009/01/book-review-core-animation-for-mac-os-x-and-the-iphone/' rel='bookmark' title='Permanent Link: Book Review: Core Animation for Mac OS X and the iPhone'>Book Review: Core Animation for Mac OS X and the iPhone</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-4309" style="float:right;padding:10px" title="android" src="http://www.pathf.com/blogs/wp-content/uploads/2009/11/android.jpg" alt="android" width="145" height="186" />Just got my hands on a copy of <a href="http://www.amazon.com/Android-Wireless-Application-Development-Conder/dp/0321627091" rel="nofollow"  target="_blank">Android, Wireless Application Development</a> by Conder and Darcey and have been working my way through the first three chapters (really, the actual development starts in chapter 3).So far so good. Some of the pseudo JVM (Dalvik) takes a little bit of getting used to, but it's not really that bad. I'd say that the real thing that pops out at me is that I want a way of developing iPhone and Android applications at the same time, without having to jump through hoops to do so.</p>
<p>I should have a full review of it up in a week or two.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/11/coming-android-wireless-application-development-review/">Coming Soon: Android Wireless Application Development Review</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2007/11/from-the-grassy/' rel='bookmark' title='Permanent Link: From the Grassy Knoll: Google Android Undermining  Java ME'>From the Grassy Knoll: Google Android Undermining  Java ME</a></li><li><a href='http://www.pathf.com/blogs/2007/11/zk-on-android/' rel='bookmark' title='Permanent Link: ZK on Android'>ZK on Android</a></li><li><a href='http://www.pathf.com/blogs/2009/01/book-review-core-animation-for-mac-os-x-and-the-iphone/' rel='bookmark' title='Permanent Link: Book Review: Core Animation for Mac OS X and the iPhone'>Book Review: Core Animation for Mac OS X and the iPhone</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/11/coming-android-wireless-application-development-review/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Griffon and a PureMVC Plugin: Some Initial Thoughts</title>
		<link>http://www.pathf.com/blogs/2009/10/griffon-puremvc-plugin-initial-thoughts/</link>
		<comments>http://www.pathf.com/blogs/2009/10/griffon-puremvc-plugin-initial-thoughts/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 16:59:56 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
				<category><![CDATA[Custom Application Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Rich Internet Apps]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technologies and Platforms]]></category>
		<category><![CDATA[Griffon]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PureMVC]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=4299</guid>
		<description><![CDATA[
I finally have some small amount of spare time to start working on my Griffon PureMVC plugin. One of the first things to think about is where to we make the marriage between the two frameworks?
Griffon has Models, Views and Controllers, as does PureMVC (actually, it has Commands, Mediators and Proxies, which essentially perform the [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/10/griffon-puremvc-plugin-initial-thoughts/">Griffon and a PureMVC Plugin: Some Initial Thoughts</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/10/griffon-plugin-development-nitty-gritty/' rel='bookmark' title='Permanent Link: Griffon Plugin Development: Some Nitty Gritty'>Griffon Plugin Development: Some Nitty Gritty</a></li><li><a href='http://www.pathf.com/blogs/2009/10/griffon-convention-configuration-desktop/' rel='bookmark' title='Permanent Link: Griffon: Convention over Configuration for the Desktop'>Griffon: Convention over Configuration for the Desktop</a></li><li><a href='http://www.pathf.com/blogs/2009/10/questions-griffon/' rel='bookmark' title='Permanent Link: Questions About Griffon'>Questions About Griffon</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><img style="padding:10px" title="puremvc-icon" src="http://www.pathf.com/blogs/wp-content/uploads/2009/07/puremvc-icon.jpg" alt="puremvc-icon" width="318" height="200" /><img style="padding:10px" title="groffon" src="http://www.pathf.com/blogs/wp-content/uploads/2009/10/groffon.png" alt="groffon" width="155" height="50" /></p>
<p>I finally have some small amount of spare time to start working on my Griffon PureMVC plugin. One of the first things to think about is where to we make the marriage between the two frameworks?</p>
<p>Griffon has Models, Views and Controllers, as does PureMVC (actually, it has Commands, Mediators and Proxies, which essentially perform the tasks under MVC). My initial thought is that Griffon's MVC triads really perform the tasks of a complex view, and PureMVC wires these complex views together via it's message bus. So, my thinking is to wrap each MVC triad into a Mediator, with the Mediator mostly talking to the Griffon controller and perhaps the Griffon model.</p>
<p>I'll make some more posts here as my thinking and experimenting evolves.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/10/griffon-puremvc-plugin-initial-thoughts/">Griffon and a PureMVC Plugin: Some Initial Thoughts</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/10/griffon-plugin-development-nitty-gritty/' rel='bookmark' title='Permanent Link: Griffon Plugin Development: Some Nitty Gritty'>Griffon Plugin Development: Some Nitty Gritty</a></li><li><a href='http://www.pathf.com/blogs/2009/10/griffon-convention-configuration-desktop/' rel='bookmark' title='Permanent Link: Griffon: Convention over Configuration for the Desktop'>Griffon: Convention over Configuration for the Desktop</a></li><li><a href='http://www.pathf.com/blogs/2009/10/questions-griffon/' rel='bookmark' title='Permanent Link: Questions About Griffon'>Questions About Griffon</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/10/griffon-puremvc-plugin-initial-thoughts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GWT 2.0: Cool Beans on In Browser Development Mode</title>
		<link>http://www.pathf.com/blogs/2009/10/gwt-20-cool-beans-browser-development-mode/</link>
		<comments>http://www.pathf.com/blogs/2009/10/gwt-20-cool-beans-browser-development-mode/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 20:33:30 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Rich Internet Apps]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technologies and Platforms]]></category>
		<category><![CDATA[Web Application Development]]></category>
		<category><![CDATA[GWT 2.0]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=4278</guid>
		<description><![CDATA[
I have a short list of things that I don't like about GWT. They are:

You have to use a special browser to debug in Java. That browser doesn't always behave the way IE or Firefox or Safari does. And you need OS specific distributions which can make it a little tricky to share a project [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/10/gwt-20-cool-beans-browser-development-mode/">GWT 2.0: Cool Beans on In Browser Development Mode</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2008/08/plugging-some-cool-tools/' rel='bookmark' title='Permanent Link: Plugging Some Cool Tools'>Plugging Some Cool Tools</a></li><li><a href='http://www.pathf.com/blogs/2009/11/grails-google-app-engine-birthing-pains/' rel='bookmark' title='Permanent Link: Grails and Google App Engine: Birthing Pains'>Grails and Google App Engine: Birthing Pains</a></li><li><a href='http://www.pathf.com/blogs/2009/08/lazy-download-good-browser/' rel='bookmark' title='Permanent Link: Don&#8217;t be lazy, download a good browser'>Don&#8217;t be lazy, download a good browser</a></li></ol>]]></description>
			<content:encoded><![CDATA[<div style="float:right;padding:10px"><img class="alignright size-full wp-image-952" title="gwt" src="http://www.pathf.com/blogs/wp-content/uploads/2008/06/gwt.png" alt="gwt" width="260" height="250" /></div>
<p>I have a short list of things that I don't like about GWT. They are:</p>
<ol>
<li>You have to use a special browser to debug in Java. That browser doesn't always behave the way IE or Firefox or Safari does. And you need OS specific distributions which can make it a little tricky to share a project between developers with different OS platforms.</li>
<li>GWT apps download as a massive hunk of code. There's no way to dynamically load code as you need it.</li>
<li>Building UI's dynamically, through a sort of XUL mechanism is a pain in the ass for non-standard components. Just talk to the <a href="http://vaadin.com/home" rel="nofollow"  target="_blank">Vaadin</a> folks about the hoops they had to jump through.</li>
<li>The annoying dependency on SWT for tests.</li>
</ol>
<p>So, what does 2.0 promise? To resolve these four things, and a few more. Check out the <a href="http://groups.google.com/group/google-web-toolkit/browse_thread/thread/8b79ebe444b9126d" rel="nofollow"  target="_blank">GWT 2.0 Milestone 1 release announcement</a>:</p>
<blockquote><p>In-Browser Development Mode: Prior to 2.0, GWT hosted mode provided a special-purpose "hosted browser" to debug your GWT code. In 2.0, the web page being debugged is viewed within a regular-old browser. Development mode is supported through the use of a native-code plugin for each browser. In other words, you can use development mode directly from Safari, Firefox, IE, and Chrome.</p>
<p>Code Splitting: Developer-guided code splitting allows you to chunk your GWT code into multiple fragments for faster startup. Imagine having to download a whole movie before being able to watch it. Well, that's what you have to do with most Ajax apps these days -- download the whole thing before using it. With code splitting, you can arrange<br />
to load just the minimum script needed to get the application running and the user interacting, while the rest of the app is downloaded as needed.</p>
<p>Declarative User Interface: GWT's UiBinder now allows you to create user interfaces mostly declaratively. Previously, widgets had to be created and assembled programmatically, requiring lots of code. Now, you can use XML to declare your UI, making the code more readable, easier to maintain, and faster to develop. The Mail sample has been updated to use the new declarative UI.</p>
<p>Bundling of resources (ClientBundle): GWT has shipped with ImageBundles since GWT v1.4, giving developers automatic spriting of images. ClientBundle generalizes this technique, bringing the power of combining and optimizing resources into one download to things like text files, CSS, and XML. This means fewer network round trips, which in turn can decrease application latency -- especially on mobile applications.</p>
<p>Using HtmlUnit for running GWT tests: GWT 2.0 no longer uses SWT or the old mozilla code (on linux) to run GWT tests. Instead, it uses HtmlUnit as the built-in browser. HtmlUnit is 100% Java. This means there is a single GWT distribution for linux, mac, and windows, and debugging GWT Tests in development mode can be done entirely in a Java debugger.</p></blockquote>
<p>Looks like Xmas has come early. I've been working with the browser plugin for a little bit and it is just a joy to use. One down side, of course, is that Intellij 9.0 will be out of date re: GWT the day it is released. <img src='http://www.pathf.com/blogs/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/10/gwt-20-cool-beans-browser-development-mode/">GWT 2.0: Cool Beans on In Browser Development Mode</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2008/08/plugging-some-cool-tools/' rel='bookmark' title='Permanent Link: Plugging Some Cool Tools'>Plugging Some Cool Tools</a></li><li><a href='http://www.pathf.com/blogs/2009/11/grails-google-app-engine-birthing-pains/' rel='bookmark' title='Permanent Link: Grails and Google App Engine: Birthing Pains'>Grails and Google App Engine: Birthing Pains</a></li><li><a href='http://www.pathf.com/blogs/2009/08/lazy-download-good-browser/' rel='bookmark' title='Permanent Link: Don&#8217;t be lazy, download a good browser'>Don&#8217;t be lazy, download a good browser</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/10/gwt-20-cool-beans-browser-development-mode/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Questions About Griffon</title>
		<link>http://www.pathf.com/blogs/2009/10/questions-griffon/</link>
		<comments>http://www.pathf.com/blogs/2009/10/questions-griffon/#comments</comments>
		<pubDate>Fri, 09 Oct 2009 19:03:29 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technologies and Platforms]]></category>
		<category><![CDATA[Griffon]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java Web Start]]></category>
		<category><![CDATA[jnlp]]></category>
		<category><![CDATA[JWS]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=4271</guid>
		<description><![CDATA[
Time to answer some questions about Griffon:

What is the size of the jar that gets generated for a Griffon jar?If you package it all up ('griffon package'), then a vanilla Griffon jar weighs in at 4.7M. That's mostly the Groovy runtime (4.4M) and the Griffon runtime (204k). If you're concerned about download size for Java [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/10/questions-griffon/">Questions About Griffon</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/11/griffon-tutorials-adding-logging/' rel='bookmark' title='Permanent Link: Griffon Tutorials: Adding Useful Logging'>Griffon Tutorials: Adding Useful Logging</a></li><li><a href='http://www.pathf.com/blogs/2009/10/griffon-plugin-development-nitty-gritty/' rel='bookmark' title='Permanent Link: Griffon Plugin Development: Some Nitty Gritty'>Griffon Plugin Development: Some Nitty Gritty</a></li><li><a href='http://www.pathf.com/blogs/2009/10/griffon-puremvc-plugin-initial-thoughts/' rel='bookmark' title='Permanent Link: Griffon and a PureMVC Plugin: Some Initial Thoughts'>Griffon and a PureMVC Plugin: Some Initial Thoughts</a></li></ol>]]></description>
			<content:encoded><![CDATA[<div style="float:right;padding:10px"><img class="alignright size-full wp-image-4201" title="groffon" src="http://www.pathf.com/blogs/wp-content/uploads/2009/10/groffon.png" alt="groffon" width="155" height="50" /></div>
<p>Time to answer some questions about <a href="http://www.pathf.com/blogs/2009/10/griffon-convention-configuration-desktop/" target="_blank">Griffon</a>:</p>
<ol>
<li>What is the size of the jar that gets generated for a Griffon jar?<br/>If you package it all up ('griffon package'), then a vanilla Griffon jar weighs in at 4.7M. That's mostly the Groovy runtime (4.4M) and the Griffon runtime (204k). If you're concerned about download size for Java Web Start, then you won't want to bundle it as a single jar, but rather let your users download the Groovy and Griffon runtimes once, then your app specific jar as it is updated.</li>
<li>Can Griffon apps be distributed via Java Web Start?<br/>Yes. When you run 'griffon package', you get an executable jar, an applet, a JWS app and a 'zip' that is structured as a directory with bin and lib subdirs and batch and shell files to run the application. In short, most ways that you may want to deploy the application.</li>
</ol>
<p>There is even an <a href="http://griffon.codehaus.org/Installer+Plugin" rel="nofollow"  target="_blank">installer plugin</a> that allows you to package your app as an <a href="http://izpack.org/" rel="nofollow"  target="_blank">izPack</a> (platform independent), RPM (Linux) or DMG (Mac) distribution. It will also create app (Mac) or exe (via <a href="http://jsmooth.sourceforge.net/" rel="nofollow"  target="_blank">JSmooth</a>) launchers for Mac and Windows. Pretty sweet.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/10/questions-griffon/">Questions About Griffon</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/11/griffon-tutorials-adding-logging/' rel='bookmark' title='Permanent Link: Griffon Tutorials: Adding Useful Logging'>Griffon Tutorials: Adding Useful Logging</a></li><li><a href='http://www.pathf.com/blogs/2009/10/griffon-plugin-development-nitty-gritty/' rel='bookmark' title='Permanent Link: Griffon Plugin Development: Some Nitty Gritty'>Griffon Plugin Development: Some Nitty Gritty</a></li><li><a href='http://www.pathf.com/blogs/2009/10/griffon-puremvc-plugin-initial-thoughts/' rel='bookmark' title='Permanent Link: Griffon and a PureMVC Plugin: Some Initial Thoughts'>Griffon and a PureMVC Plugin: Some Initial Thoughts</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/10/questions-griffon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Does your project have Code Ownership Culture?</title>
		<link>http://www.pathf.com/blogs/2009/09/does-your-project-have-code-ownership-culture/</link>
		<comments>http://www.pathf.com/blogs/2009/09/does-your-project-have-code-ownership-culture/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 18:09:03 +0000</pubDate>
		<dc:creator>Sharad Jain</dc:creator>
				<category><![CDATA[Agile Coaching]]></category>
		<category><![CDATA[Agile Project Management]]></category>
		<category><![CDATA[Custom Application Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Pathfinder General]]></category>
		<category><![CDATA[Product Strategy]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Software Development Best Practices]]></category>
		<category><![CDATA[Technologies and Platforms]]></category>
		<category><![CDATA[Web Application Development]]></category>
		<category><![CDATA[uxd]]></category>
		<category><![CDATA[agile]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=3889</guid>
		<description><![CDATA[ Code Ownership is a well known term in software development. Depending on how you define it, it may be a good thing or bad. When a developer sees code-ownership as him/her owning a piece of codebase that only he/she understands enough to make changes, it is generally a bad thing. It is only when [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/09/does-your-project-have-code-ownership-culture/">Does your project have Code Ownership Culture?</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2008/11/what-makes-a-good-requirement-document-for-an-agile-project/' rel='bookmark' title='Permanent Link: What makes a good requirement document for an agile project'>What makes a good requirement document for an agile project</a></li><li><a href='http://www.pathf.com/blogs/2009/03/data-driven-design-and-the-culture-at-google/' rel='bookmark' title='Permanent Link: Data Driven Design and the Culture at Google'>Data Driven Design and the Culture at Google</a></li><li><a href='http://www.pathf.com/blogs/2009/05/code-coverage-why/' rel='bookmark' title='Permanent Link: Code Coverage &#8211; Why?'>Code Coverage &#8211; Why?</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://farm1.static.flickr.com/232/462561247_dd3e4e5f57.jpg" rel="nofollow" ><img class="alignleft" style="float: left; margin: 5px;" title="Open Source Code Ownership" src="http://farm1.static.flickr.com/232/462561247_dd3e4e5f57.jpg" alt="Open Source Code Ownership" width="166" height="214" /></a><a href="http://c2.com/cgi/wiki?CodeOwnership" rel="nofollow" > Code Ownership</a> is a well known term in software development. Depending on how you define it, it may be a good thing or bad. When a developer sees code-ownership as him/her owning a piece of codebase that only he/she understands enough to make changes, it is generally a bad thing. It is only when everybody is free to modify the code with a sense of responsibility that he/she should leave the code cleaner than how they found it, it is a good thing. In my view, code-ownership is a good thing when viewed as <em>a responsibilty</em> as opposed to <em>a right</em>. I view it as a <strong>Collective Code Ownership</strong> where code is not owned by a single person or pair but is owned by an entire team.</p>
<p>So, the question is: How to determine if your project/organization has that collective code ownership culture. And what team members (including managers <img src='http://www.pathf.com/blogs/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ) can do to create/encourage it.</p>
<p><strong>Does your project have collective code ownership?</strong><br />
Here are few things you may want to ask yourself to determine if your organization/project has collective ownership culture.</p>
<p><span id="more-3889"></span></p>
<ul>
<li>Are tools like continuous integration and testing, code coverage and code metrics considered nice to have but not necessary?</li>
<li>Is the project release schedule determined and then enforced with little or no involvement from developers?</li>
<li>Is failure to slip on iteration stories viewed as failure on developer's part?</li>
<li>Does your velocity seem to decrease with time?</li>
<li>Do developers talk about my module, your module instead of our module?</li>
<li>Do members aspire to leave your project and join other project?</li>
</ul>
<p>If answers to these questions are mostly in the "yes" range, you may have a code ownership problem.</p>
<p><strong>What's a developer to do?</strong><br />
Be a good citizen, strive to write good code. Leave any codebase cleaner than how you found it. Developer need to tame their tendency to guard their masterpiece code from other people's changes, infact welcome those. If you really really hate some design, try to pair with the person who concieved it and influence his thought process. This might be slow and furstrating but it will be better in the long term. If you rip out everything you don't like, you will end up owning everything. Remembership, it is a collective ownership. Code is very fluid, which means when coding, you can always take short-cuts to get stuff you are responsible for, done. Or you can take ownership and fix the general code quality (even if it take a little longer). These are all things that a developer is in control.</p>
<p>However, there are stuff that are beyond developer's control. It is hard to continue to be a good citzen when other members don't feel the same way and when your boss is holding your neck against a timeline. This is where managers can play a role.</p>
<p><strong>Why do manager care about code ownership?</strong><br />
A manager cares about the quality of deliverable, team morale, attrition and deadline. An agile project manager can remote obstacles that prevent such culture from growing. Managers need to cultivate a culture where developers are not hard pressed to deliver on timeline at the cost of quality, atleast not often. Managers need to develop a culture of trust where developers are free to over-estimate stuff (atleast from their point of view). Hire team players overs smart but solo players.</p>
<p><strong>What's a Architect to do?</strong><br />
Managers can't judge the quality of code and hence success of code ownership culture. Yes, there are code metrics like code coverage that attempt to quantify the code quality but those are not precise measures. Here is where architects can make a different. By architect, I mean anybody how has the direct or indirect authority to influence other developers and modify their behavior. Install tools like continuous integration, testing, code coverage and various other metrics. Encourage pair programming to reduce bus number and prevent knowledge silos (the bad side of code-ownership).</p>
<p>In summary, it could be a good thing when a team feels <em>responsible</em> when the project when in it and <em>proud</em> that they were part of a project that completed successfully. They owned the outcome of it, good or bad.</p>
<p>Related Services:  <a href="http://www.pathf.com/services/how-we-do-it/" rel="nofollow" >Agile Development</a>, <a href="http://www.pathf.com/services" rel="nofollow" >Custom Software Development</a></p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/09/does-your-project-have-code-ownership-culture/">Does your project have Code Ownership Culture?</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2008/11/what-makes-a-good-requirement-document-for-an-agile-project/' rel='bookmark' title='Permanent Link: What makes a good requirement document for an agile project'>What makes a good requirement document for an agile project</a></li><li><a href='http://www.pathf.com/blogs/2009/03/data-driven-design-and-the-culture-at-google/' rel='bookmark' title='Permanent Link: Data Driven Design and the Culture at Google'>Data Driven Design and the Culture at Google</a></li><li><a href='http://www.pathf.com/blogs/2009/05/code-coverage-why/' rel='bookmark' title='Permanent Link: Code Coverage &#8211; Why?'>Code Coverage &#8211; Why?</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/09/does-your-project-have-code-ownership-culture/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asterisk-Java Testing with Groovy</title>
		<link>http://www.pathf.com/blogs/2009/07/asterisk-and-groovy/</link>
		<comments>http://www.pathf.com/blogs/2009/07/asterisk-and-groovy/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 14:03:28 +0000</pubDate>
		<dc:creator>Ivan Moscoso</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development Best Practices]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[telephony]]></category>
		<category><![CDATA[Test Driven Development]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=2540</guid>
		<description><![CDATA[
Recently I have taken a bit of a detour into the world of telephony, working with Asterisk-Java, which by itself is a very valuable tool, and worth knowing a bit about if you are integrating a system with Asterisk.  While it is a Java-based library, I am integrating it into a Grails application.
We have [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/07/asterisk-and-groovy/">Asterisk-Java Testing with Groovy</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2007/12/gwt-testing-wit/' rel='bookmark' title='Permanent Link: GWT Testing With Groovy? (Heck yeah!)'>GWT Testing With Groovy? (Heck yeah!)</a></li><li><a href='http://www.pathf.com/blogs/2009/02/grails-delegating-to-gorm-persistence-in-java/' rel='bookmark' title='Permanent Link: Grails: Delegating to GORM Persistence in Java'>Grails: Delegating to GORM Persistence in Java</a></li><li><a href='http://www.pathf.com/blogs/2009/02/groovy-16-and-per-instance-metaclass/' rel='bookmark' title='Permanent Link: Groovy 1.6 and Per-Instance Metaclass'>Groovy 1.6 and Per-Instance Metaclass</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><img class="right" src="http://www.pathf.com/blogs/wp-content/uploads/2009/07/asterisk1.png" alt="iPhone in Dock" width="140" height="163" /></p>
<p>Recently I have taken a bit of a detour into the world of telephony, working with <a href="http://asterisk-java.org/" rel="nofollow" >Asterisk-Java</a>, which by itself is a very valuable tool, and worth knowing a bit about if you are integrating a system with Asterisk.  While it is a Java-based library, I am integrating it into a Grails application.</p>
<p>We have a fairly comprehensive suite of unit tests asserting that desired behaviors are triggered upon certain events initiated through the Event API.  This is made even easier, as usual, with Groovy-- specifically on the testing front.  Here I show two hypothetical test cases, followed by supporting code that works specifically with the Asterisk-Java classes...</p>
<p><span id="more-2540"></span></p>
<pre class="groovy">&nbsp;
<span style="color: #a1a100;">import org.gmock.GMockTestCase</span>
<span style="color: #a1a100;">import org.asteriskjava.manager.event.JoinEvent</span>
<span style="color: #a1a100;">import org.asteriskjava.manager.event.LeaveEvent</span>
&nbsp;
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def" rel="nofollow" ><span style="color: #000000; font-weight: bold;">def</span></a> queueObject = <span style="color: #808080; font-style: italic;">// .... some object representing an internal queue</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*
 * Verifies caller entering a call queue will trigger behavior
 */</span>
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20void" rel="nofollow" ><span style="color: #993333;">void</span></a> testCallIAddedToQueue<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  mock<span style="color: #66cc66;">&#40;</span>queueObject<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">add</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'SIP/123'</span>, <span style="color: #ff0000;">'3125551234'</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">once</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  dispatchJoinEvent<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>channel: <span style="color: #ff0000;">&quot;SIP/123&quot;</span>, callerId: <span style="color: #ff0000;">&quot;3125551234&quot;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*
 * Verifies caller leaving call queue will trigger behavior
 */</span>
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20void" rel="nofollow" ><span style="color: #993333;">void</span></a> testCallRemovedFromQueue<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    mock<span style="color: #66cc66;">&#40;</span>queueObject<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">remove</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;SIP/123&quot;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">once</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    dispatchLeaveEvent<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>channel: <span style="color: #ff0000;">&quot;SIP/123&quot;</span>, dateReceived: <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20new" rel="nofollow" ><span style="color: #000000; font-weight: bold;">new</span></a> <a href="http://www.google.de/search?as_q=Date&num=100&hl=en&as_occt=url&as_sitesearch=java.sun.com%2Fj2se%2F1.5.0%2Fdocs%2Fapi%2F" rel="nofollow" ><span style="color: #aaaadd; font-weight: bold;">Date</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #808080; font-style: italic;">// ...</span>
&nbsp;</pre>
<p>The testcases above are fairly straightforward, hiding much of the details involved when working with Asterisk-Java.  The 'queueObject' can be anything, really, as long as it contains behavior which we wired into the event-handling system Asterisk-Java provides.  The important part here is how we can easily bind properties to the underlying Event types, and dispatch them so that our behavior is invoked.</p>
<pre class="groovy">&nbsp;
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20private" rel="nofollow" ><span style="color: #000000; font-weight: bold;">private</span></a> <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def" rel="nofollow" ><span style="color: #000000; font-weight: bold;">def</span></a> dispatchJoinEvent<span style="color: #66cc66;">&#40;</span>properties<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  dispatchEvent<span style="color: #66cc66;">&#40;</span>JoinEvent, properties<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20private" rel="nofollow" ><span style="color: #000000; font-weight: bold;">private</span></a> <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def" rel="nofollow" ><span style="color: #000000; font-weight: bold;">def</span></a> dispatchLeaveEvent<span style="color: #66cc66;">&#40;</span>properties<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  dispatchEvent<span style="color: #66cc66;">&#40;</span>LeaveEvent, properties<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20private" rel="nofollow" ><span style="color: #000000; font-weight: bold;">private</span></a> <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def" rel="nofollow" ><span style="color: #000000; font-weight: bold;">def</span></a> dispatchEvent<span style="color: #66cc66;">&#40;</span>eventType, eventProperties<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def" rel="nofollow" ><span style="color: #000000; font-weight: bold;">def</span></a> event = eventType.<span style="color: #006600;">newInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>:<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
  eventProperties.<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20each" rel="nofollow" ><span style="color: #663399;">each</span></a> <span style="color: #66cc66;">&#123;</span> name, value -&gt; event.<span style="color: #ff0000;">&quot;${name}&quot;</span> = value <span style="color: #66cc66;">&#125;</span>
  play <span style="color: #66cc66;">&#123;</span>
    asteriskService.<span style="color: #006600;">connection</span>.<span style="color: #006600;">dispatchEvent</span><span style="color: #66cc66;">&#40;</span>event<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>Here I have a 'service' class defined in Grails which I call 'asteriskService'.  It encapsulates access to the Asterisk-Java <a href="http://asterisk-java.org/latest/apidocs/org/asteriskjava/manager/ManagerConnection.html" rel="nofollow" >ManagerConnection</a> instance, which in turn can dispatch specific events.</p>
<p>Of interest to those new with Groovy is the binding of properties within 'dispatchEvent()'.  It looks perhaps a bit more complex than one would hope, but unfortunately JoinEvent and LeaveEvent do not have default constructors, requiring the code to 'new' them up with a placeholder argument, and then set any properties on the fly.</p>
<p>Asterisk-Java is worth checking out, but particularly nice is using a bit of Groovy to tie it in nicely.  While this can benefit the application, you can see how it helps ease testing-- particularly as you start using more and more of what the library offers.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/07/asterisk-and-groovy/">Asterisk-Java Testing with Groovy</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2007/12/gwt-testing-wit/' rel='bookmark' title='Permanent Link: GWT Testing With Groovy? (Heck yeah!)'>GWT Testing With Groovy? (Heck yeah!)</a></li><li><a href='http://www.pathf.com/blogs/2009/02/grails-delegating-to-gorm-persistence-in-java/' rel='bookmark' title='Permanent Link: Grails: Delegating to GORM Persistence in Java'>Grails: Delegating to GORM Persistence in Java</a></li><li><a href='http://www.pathf.com/blogs/2009/02/groovy-16-and-per-instance-metaclass/' rel='bookmark' title='Permanent Link: Groovy 1.6 and Per-Instance Metaclass'>Groovy 1.6 and Per-Instance Metaclass</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/07/asterisk-and-groovy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How to learn a new programming language or framework</title>
		<link>http://www.pathf.com/blogs/2009/06/how-to-learn-a-new-programming-language-or-framework/</link>
		<comments>http://www.pathf.com/blogs/2009/06/how-to-learn-a-new-programming-language-or-framework/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 16:03:10 +0000</pubDate>
		<dc:creator>Sharad Jain</dc:creator>
				<category><![CDATA[Custom Application Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Software Development Best Practices]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/2009/06/how-to-learn-a-new-programming-language-or-framework/</guid>
		<description><![CDATA[While never untrue, it is more of a necessity now, that a programmer should know more than just one language or framework. After being a focussed Java/J2EE developer for a long time since college, in the last couple of years, I plunged into .NET, Ruby/Rails and then Javascript/prototype/jQuery etc and now onto groovy/grails. With name [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/06/how-to-learn-a-new-programming-language-or-framework/">How to learn a new programming language or framework</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2007/07/when-is-an-ajax/' rel='bookmark' title='Permanent Link: When is an Ajax Framework Worth Mentioning'>When is an Ajax Framework Worth Mentioning</a></li><li><a href='http://www.pathf.com/blogs/2009/05/are-you-building-and-application-or-a-antique-web-framework/' rel='bookmark' title='Permanent Link: Are You Building an Application or an Antique Web Framework?'>Are You Building an Application or an Antique Web Framework?</a></li><li><a href='http://www.pathf.com/blogs/2008/03/programming-boo/' rel='bookmark' title='Permanent Link: Programming Books, Mostly Not By Me'>Programming Books, Mostly Not By Me</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><img style="border: 1px solid #000000; margin: 2px; display: inline; float: left; width: 349px; height: 238px;" src="http://www.pathf.com/blogs/wp-content/uploads/2009/06/bunny-tutorial.jpg" alt="bunny_tutorial.jpg" width="349" height="238" />While never untrue, it is more of a necessity now, that a programmer should know more than just one language or framework. After being a focussed Java/J2EE developer for a long time since college, in the last couple of years, I plunged into .NET, Ruby/Rails and then Javascript/prototype/jQuery etc and now onto groovy/grails. With name like Erlang, Scala, Compass, git, blueprint, flex flying around us everywhere, it can be overwhelming and we need a plan to pick, peruse, acquire them. Here is a list of things I do when learning a new skill.</p>
<p><span id="more-2772"></span></p>
<p><strong>Start with Basics: Books, Tutorials etc.</strong></p>
<p>Yes, getting hands dirty is the first thing. If you are "programmers don't read manuals" type and/or you know enough about the new language, just download and give it a ride. Or you can pick a book or two, read getting started tutorials and then give it a try. The gist is start relating what we learn to what we already know and ask questions. How can I upload file in the new framework, how do I do testing, how can I write library/reusable-code etc.</p>
<p>All major language framework now-a-days have atleast 2 types of mailing lists: user and developer. It's a good idea to subscribe to user mailing list and start reading it from a few weeks or months ago depending on how fast the language is changing and how relevent the posts are to current version.</p>
<p>All this may get you coding and get by for the day but you haven't really understood the framework. Fear not, here are a couple of things you can do.</p>
<p><strong>Download and Peruse Example Apps</strong></p>
<p>Most frameworks come with an example application where it is being used to exhibit its strengths. If not, it shouldn't be difficult a reputed open-source project even if the framework itself is proprietary. This is a good place to learn best practicies and design patterns as it applies to that framework.</p>
<p><strong>Subscribe to Bug Tracker</strong></p>
<p>Bugs and new feature requests are a great way to learn about the the "other" side of a cool framework, the deficiencies that is. No quick tutorials focus on the internal nitty-gritty that we run into as soon as you start on a non-trivial project. The discussions that happen on whether something is a bug or a design choice becomes clear from this place. Again, not a bad idea to go a little back in timeline to read fixed bugs, and finished features.</p>
<p><strong>Subscribe to Core mailing-list</strong></p>
<p>Peek into the future that is. Here is where the core maintainers discuss what is the next high priority items are and how to implement them. While it may be too early to contribute here, it is a place to learn some advanced stuff.</p>
<p><strong>Download and Peruse Source Code &amp; Tests</strong></p>
<p>This takes time but it has tremendous advantages. The code is the full truth. Besides good coding practices, it also helps us understand the undocumented features of a framework. And, if code is the full truch, tests are the key to that truth. Tests help us understand what was being achieved in a piece of code.</p>
<p><strong>Pair and Ask Questions</strong></p>
<p>Pair with somebody who has had a head start with the new language. This can quickly give us the soft side tools: the efficiencies your pair spent time building and websites, blogs they use.</p>
<p><strong>blogs/wiki/screencasts</strong></p>
<p>Tutorials, API documentations, technical articles has always been there and are important. Blogs and Screencasts are even better since they are the most current and most applicable to current state of affairs with the language or framework.</p>
<p><strong>Blog your experience</strong></p>
<p>Yes, blogging about your experience will help you learn a new framework. Others who read your blog will point out what you have missed and point you in the right direction. It is also a place where you have documented your journey to refer back to.</p>
<p><strong>Work for Consulting Company</strong></p>
<p>No, this is not entirely madeup <img src='http://www.pathf.com/blogs/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Keeping up with latest technologies is a survival trait for any consulting company and its employees. This is where we can meet other motivated folks with different interests and keep up with what is new out there. With plethora of new languages and frameworks coming and going each day, you have to be able to pick winners to add to your tool box. Blogs, RSS feeds help but a lunch time remarks from experienced gurus can go a lot further.</p>
<p>Photo Credit: <a href="http://www.flickr.com/photos/danielvoyager/" rel="nofollow" >Daniel Voyager</a></p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/06/how-to-learn-a-new-programming-language-or-framework/">How to learn a new programming language or framework</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2007/07/when-is-an-ajax/' rel='bookmark' title='Permanent Link: When is an Ajax Framework Worth Mentioning'>When is an Ajax Framework Worth Mentioning</a></li><li><a href='http://www.pathf.com/blogs/2009/05/are-you-building-and-application-or-a-antique-web-framework/' rel='bookmark' title='Permanent Link: Are You Building an Application or an Antique Web Framework?'>Are You Building an Application or an Antique Web Framework?</a></li><li><a href='http://www.pathf.com/blogs/2008/03/programming-boo/' rel='bookmark' title='Permanent Link: Programming Books, Mostly Not By Me'>Programming Books, Mostly Not By Me</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/06/how-to-learn-a-new-programming-language-or-framework/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Grails: Custom Parent/Child Aware Tags</title>
		<link>http://www.pathf.com/blogs/2009/06/grails-custom-parent-child-aware-tags/</link>
		<comments>http://www.pathf.com/blogs/2009/06/grails-custom-parent-child-aware-tags/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 12:56:55 +0000</pubDate>
		<dc:creator>Anthony Caliendo</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development Best Practices]]></category>
		<category><![CDATA[Technologies and Platforms]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[tag]]></category>
		<category><![CDATA[taglib]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=2610</guid>
		<description><![CDATA[
Recently, I needed to create a special tag in Grails which would render specific children in a way that is aware of their order.  I wanted to stick entirely with markup (not passing an array to a tag), and also wanted to avoid putting lots of logic inside a .tag file.  While it [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/06/grails-custom-parent-child-aware-tags/">Grails: Custom Parent/Child Aware Tags</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2008/02/grails-and-json/' rel='bookmark' title='Permanent Link: Grails and JSONP: How Easy is That?'>Grails and JSONP: How Easy is That?</a></li><li><a href='http://www.pathf.com/blogs/2009/11/grails-google-app-engine-birthing-pains/' rel='bookmark' title='Permanent Link: Grails and Google App Engine: Birthing Pains'>Grails and Google App Engine: Birthing Pains</a></li><li><a href='http://www.pathf.com/blogs/2009/02/grails-delegating-to-gorm-persistence-in-java/' rel='bookmark' title='Permanent Link: Grails: Delegating to GORM Persistence in Java'>Grails: Delegating to GORM Persistence in Java</a></li></ol>]]></description>
			<content:encoded><![CDATA[<div class="right"><img src="http://www.pathf.com/blogs/wp-content/uploads/2009/02/grails_logo.png" alt="grails_logo" title="grails_logo" width="196" height="53" class="alignnone size-full wp-image-1393" /></div>
<p>Recently, I needed to create a special tag in Grails which would render specific children in a way that is aware of their order.  I wanted to stick entirely with markup (not passing an array to a tag), and also wanted to avoid putting lots of logic inside a <em>.tag</em> file.  While it was possible to write a tag lib which first parsed the children in a "non-render" mode, I preferred a solution which did not require doing my own parsing before render.  The solution I came up with isn't the most flexible, but it got the job done in a relatively clean way with minimal custom code.</p>
<p>The following is an example solution with the associated code and tests.<br />
<span id="more-2610"></span><br />
The problem is this: I want a parent tag which will add different class names to the children depending on their order.  For this example, we will be adding even/odd and a first/last class to the appropriate children.  For the purposes of this example, we will ignore <a href="http://www.w3.org/TR/css3-selectors/" rel="nofollow" >CSS 3.0 Selectors</a>, which could do this entirely in the stylesheet.</p>
<p>First, let's generate our tag lib through grails.</p>
<pre>
grails create-tag-lib ParentChild
</pre>
<p>Now that we have our empty files, we can write a test to define the expected behavior in the generated test file.  Make sure that you are extending <em>grails.test.GroovyPagesTestCase</em>.</p>
<pre class="groovy">&nbsp;
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20class" rel="nofollow" ><span style="color: #000000; font-weight: bold;">class</span></a> ParentChildTagLibTests <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20extends" rel="nofollow" ><span style="color: #000000; font-weight: bold;">extends</span></a> grails.<span style="color: #006600;">test</span>.<span style="color: #006600;">GroovyPagesTestCase</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
    <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20void" rel="nofollow" ><span style="color: #993333;">void</span></a> testParentContainerShouldRenderChildren<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def" rel="nofollow" ><span style="color: #000000; font-weight: bold;">def</span></a> writer = <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20new" rel="nofollow" ><span style="color: #000000; font-weight: bold;">new</span></a> <a href="http://www.google.de/search?as_q=StringWriter&num=100&hl=en&as_occt=url&as_sitesearch=java.sun.com%2Fj2se%2F1.5.0%2Fdocs%2Fapi%2F" rel="nofollow" ><span style="color: #aaaadd; font-weight: bold;">StringWriter</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
        <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def" rel="nofollow" ><span style="color: #000000; font-weight: bold;">def</span></a> markup = <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20new" rel="nofollow" ><span style="color: #000000; font-weight: bold;">new</span></a> groovy.<span style="color: #006600;">xml</span>.<span style="color: #006600;">MarkupBuilder</span><span style="color: #66cc66;">&#40;</span>writer<span style="color: #66cc66;">&#41;</span>
        markup <span style="color: #66cc66;">&#123;</span>
            ul<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'class'</span>:<span style="color: #ff0000;">'myParent'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                li<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'class'</span>:<span style="color: #ff0000;">'myChild even first'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                    a<span style="color: #66cc66;">&#40;</span>href:<span style="color: #ff0000;">'/first'</span>, <span style="color: #ff0000;">'one'</span><span style="color: #66cc66;">&#41;</span>
                <span style="color: #66cc66;">&#125;</span>
                li<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'class'</span>:<span style="color: #ff0000;">'myChild odd'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                    a<span style="color: #66cc66;">&#40;</span>href:<span style="color: #ff0000;">'/second'</span>, <span style="color: #ff0000;">'two'</span><span style="color: #66cc66;">&#41;</span>
                <span style="color: #66cc66;">&#125;</span>
                li<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'class'</span>:<span style="color: #ff0000;">'myChild even last'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                    a<span style="color: #66cc66;">&#40;</span>href:<span style="color: #ff0000;">'/third'</span>, <span style="color: #ff0000;">'three'</span><span style="color: #66cc66;">&#41;</span>
                <span style="color: #66cc66;">&#125;</span>
            <span style="color: #66cc66;">&#125;</span>
        <span style="color: #66cc66;">&#125;</span>
&nbsp;
        assertOutputEquals<span style="color: #66cc66;">&#40;</span>
            writer.<span style="color: #006600;">toString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>,
            <span style="color: #ff0000;">'&lt;example:parentContainer&gt;&lt;example:child label=&quot;one&quot; url=&quot;[controller: <span style="color: #000099; font-weight: bold;">\'</span>first<span style="color: #000099; font-weight: bold;">\'</span>]&quot;/&gt;&lt;example:child label=&quot;two&quot; url=&quot;[controller: <span style="color: #000099; font-weight: bold;">\'</span>second<span style="color: #000099; font-weight: bold;">\'</span>]&quot;/&gt;&lt;example:child label=&quot;three&quot; url=&quot;[controller: <span style="color: #000099; font-weight: bold;">\'</span>third<span style="color: #000099; font-weight: bold;">\'</span>]&quot;/&gt;&lt;/example:parentContainer&gt;'</span>
        <span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>Now that we have a failing test, we can write the actual code.  Notice that I used a custom namespace here (just for the sake of example).</p>
<pre class="groovy">&nbsp;
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20class" rel="nofollow" ><span style="color: #000000; font-weight: bold;">class</span></a> ParentChildTagLib <span style="color: #66cc66;">&#123;</span>
&nbsp;
    <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20static" rel="nofollow" ><span style="color: #000000; font-weight: bold;">static</span></a> namespace = <span style="color: #ff0000;">'example'</span>
&nbsp;
    <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def" rel="nofollow" ><span style="color: #000000; font-weight: bold;">def</span></a> parentContainer = <span style="color: #66cc66;">&#123;</span>attrs, body -&gt;
          <span style="color: #808080; font-style: italic;">// we'll be using this to keep track of our children</span>
          <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def" rel="nofollow" ><span style="color: #000000; font-weight: bold;">def</span></a> children = <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span>
          <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20this" rel="nofollow" ><span style="color: #000000; font-weight: bold;">this</span></a>.<span style="color: #006600;">pageScope</span>.<span style="color: #006600;">parentContainerChildren</span> = children
          <span style="color: #808080; font-style: italic;">// this will execute the body, so that the children are</span>
          <span style="color: #808080; font-style: italic;">// appended.  obviously, anything other than child</span>
          <span style="color: #808080; font-style: italic;">// tags will not render correctly.</span>
          body<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
          <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def" rel="nofollow" ><span style="color: #000000; font-weight: bold;">def</span></a> mkp = <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20new" rel="nofollow" ><span style="color: #000000; font-weight: bold;">new</span></a> groovy.<span style="color: #006600;">xml</span>.<span style="color: #006600;">MarkupBuilder</span><span style="color: #66cc66;">&#40;</span>out<span style="color: #66cc66;">&#41;</span>
          mkp <span style="color: #66cc66;">&#123;</span>
              ul<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'class'</span>: <span style="color: #ff0000;">'myParent'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                  <span style="color: #808080; font-style: italic;">// iterate over all the children, and</span>
                  <span style="color: #808080; font-style: italic;">// render them here</span>
                  children.<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20eachWithIndex" rel="nofollow" ><span style="color: #663399;">eachWithIndex</span></a> <span style="color: #66cc66;">&#123;</span>child, index -&gt;
                      li<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'class'</span>: determineClassNames<span style="color: #66cc66;">&#40;</span>child, children, index<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
                          a<span style="color: #66cc66;">&#40;</span>href: g.<span style="color: #006600;">createLink</span><span style="color: #66cc66;">&#40;</span>child.<span style="color: #006600;">url</span><span style="color: #66cc66;">&#41;</span>, child.<span style="color: #006600;">label</span><span style="color: #66cc66;">&#41;</span>
                      <span style="color: #66cc66;">&#125;</span>
                  <span style="color: #66cc66;">&#125;</span>
              <span style="color: #66cc66;">&#125;</span>
          <span style="color: #66cc66;">&#125;</span>
      <span style="color: #66cc66;">&#125;</span>
&nbsp;
      <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20private" rel="nofollow" ><span style="color: #000000; font-weight: bold;">private</span></a> <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def" rel="nofollow" ><span style="color: #000000; font-weight: bold;">def</span></a> determineClassNames<span style="color: #66cc66;">&#40;</span>child, children, index<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
          <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def" rel="nofollow" ><span style="color: #000000; font-weight: bold;">def</span></a> classNames = <span style="color: #ff0000;">'myChild'</span>
&nbsp;
          <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20if" rel="nofollow" ><span style="color: #b1b100;">if</span></a> <span style="color: #66cc66;">&#40;</span>index % <span style="color: #cc66cc;">2</span> == <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
              classNames += <span style="color: #ff0000;">' even'</span>
          <span style="color: #66cc66;">&#125;</span> <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20else" rel="nofollow" ><span style="color: #b1b100;">else</span></a> <span style="color: #66cc66;">&#123;</span>
              classNames += <span style="color: #ff0000;">' odd'</span>
          <span style="color: #66cc66;">&#125;</span>
&nbsp;
          <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20if" rel="nofollow" ><span style="color: #b1b100;">if</span></a> <span style="color: #66cc66;">&#40;</span>child == children.<span style="color: #006600;">first</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
              classNames += <span style="color: #ff0000;">' first'</span>
          <span style="color: #66cc66;">&#125;</span> <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20else" rel="nofollow" ><span style="color: #b1b100;">else</span></a> <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20if" rel="nofollow" ><span style="color: #b1b100;">if</span></a> <span style="color: #66cc66;">&#40;</span>child == children.<span style="color: #006600;">last</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
              classNames += <span style="color: #ff0000;">' last'</span>
          <span style="color: #66cc66;">&#125;</span>
&nbsp;
          <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20return" rel="nofollow" ><span style="color: #000000; font-weight: bold;">return</span></a> classNames
      <span style="color: #66cc66;">&#125;</span>
&nbsp;
      <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def" rel="nofollow" ><span style="color: #000000; font-weight: bold;">def</span></a> child = <span style="color: #66cc66;">&#123;</span>attrs, body -&gt;
          <span style="color: #808080; font-style: italic;">// simply keep track of the tag attributes</span>
          <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20this" rel="nofollow" ><span style="color: #000000; font-weight: bold;">this</span></a>.<span style="color: #006600;">pageScope</span>.<span style="color: #006600;">parentContainerChildren</span> <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20&amp;lt;" rel="nofollow" ><span style="color: #b1b100;">&lt;&lt;</span></a> attrs
      <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>Now, given the following GSP code:</p>
<pre class="xml">&nbsp;
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;example:parentContainer<span style="font-weight: bold; color: black;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;example:child</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">&quot;one&quot;</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;[controller: 'first']&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
    <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;example:child</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">&quot;two&quot;</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;[controller: 'second']&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
    <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;example:child</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">&quot;three&quot;</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;[controller: 'third']&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/example:parentContainer<span style="font-weight: bold; color: black;">&gt;</span></span></span>
&nbsp;</pre>
<p>I get the following HTML generated:</p>
<pre class="xml">&nbsp;
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;ul</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">'myParent'</span><span style="font-weight: bold; color: black;">&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;li</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">'myChild even first'</span><span style="font-weight: bold; color: black;">&gt;</span></span>
    <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;a</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">'/first'</span><span style="font-weight: bold; color: black;">&gt;</span></span>one<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/a<span style="font-weight: bold; color: black;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/li<span style="font-weight: bold; color: black;">&gt;</span></span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;li</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">'myChild odd'</span><span style="font-weight: bold; color: black;">&gt;</span></span>
    <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;a</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">'/second'</span><span style="font-weight: bold; color: black;">&gt;</span></span>two<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/a<span style="font-weight: bold; color: black;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/li<span style="font-weight: bold; color: black;">&gt;</span></span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;li</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">'myChild even last'</span><span style="font-weight: bold; color: black;">&gt;</span></span>
    <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;a</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">'/third'</span><span style="font-weight: bold; color: black;">&gt;</span></span>three<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/a<span style="font-weight: bold; color: black;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/li<span style="font-weight: bold; color: black;">&gt;</span></span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/ul<span style="font-weight: bold; color: black;">&gt;</span></span></span>
&nbsp;</pre>
<p>There are some limitations to this strategy.  First, any other markup outside of the child tag inside the parent is not going to render how you'd expect.  Also, nested parent tags aren't going to work for this implementation unless you make some changes.  Finally, this implementation won't support body markup in the child tags; however, given a little tweaking it could be made to do that (I'll leave that as an exercise for the reader).</p>
<p>Despite these limitations, if you are looking to do something like breadcrumbs, tab navigation, or custom list rendering, then this may fit your needs.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/06/grails-custom-parent-child-aware-tags/">Grails: Custom Parent/Child Aware Tags</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2008/02/grails-and-json/' rel='bookmark' title='Permanent Link: Grails and JSONP: How Easy is That?'>Grails and JSONP: How Easy is That?</a></li><li><a href='http://www.pathf.com/blogs/2009/11/grails-google-app-engine-birthing-pains/' rel='bookmark' title='Permanent Link: Grails and Google App Engine: Birthing Pains'>Grails and Google App Engine: Birthing Pains</a></li><li><a href='http://www.pathf.com/blogs/2009/02/grails-delegating-to-gorm-persistence-in-java/' rel='bookmark' title='Permanent Link: Grails: Delegating to GORM Persistence in Java'>Grails: Delegating to GORM Persistence in Java</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/06/grails-custom-parent-child-aware-tags/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Avoid the last minute security review</title>
		<link>http://www.pathf.com/blogs/2009/05/avoid-the-last-minute-security-review/</link>
		<comments>http://www.pathf.com/blogs/2009/05/avoid-the-last-minute-security-review/#comments</comments>
		<pubDate>Wed, 13 May 2009 10:10:34 +0000</pubDate>
		<dc:creator>John McCaffrey</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Software Development Best Practices]]></category>
		<category><![CDATA[Technologies and Platforms]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[planning]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=2417</guid>
		<description><![CDATA[
Photo Credit:
Amagill under Creative Commons Attribution
Security is hard
 Security is often an after thought, slated towards the end of a project, or after some big issue has been discovered, but the nature of security functionality, rules, roles, auditing, etc make it hard to layer in to an existing codebase effectively.
Oh, and if the code base [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/05/avoid-the-last-minute-security-review/">Avoid the last minute security review</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/05/web-app-security-checklist-braindump/' rel='bookmark' title='Permanent Link: Web app security checklist (Braindump)'>Web app security checklist (Braindump)</a></li><li><a href='http://www.pathf.com/blogs/2008/12/app-security-organization/' rel='bookmark' title='Permanent Link: App Security: Throw Out the Org Chart!'>App Security: Throw Out the Org Chart!</a></li><li><a href='http://www.pathf.com/blogs/2008/11/designing-for-security/' rel='bookmark' title='Permanent Link: The Truth About Designing For Security'>The Truth About Designing For Security</a></li></ol>]]></description>
			<content:encoded><![CDATA[<div class="right"><img class="alignright size-full wp-image-2418 right" title="Plan for security" src="http://www.pathf.com/blogs/wp-content/uploads/2009/05/lock_med.jpg" alt="lock_med" width="298" height="375" /><br />
<strong>Photo Credit</strong>:<br />
<a href="http://www.flickr.com/photos/amagill/" rel="nofollow" >Amagill</a> under Creative Commons Attribution</div>
<h3>Security is hard</h3>
<p><span> </span>Security is often an after thought, slated towards the end of a project, or after some big issue has been discovered, but the nature of security functionality, rules, roles, auditing, etc make it hard to layer in to an existing codebase effectively.</p>
<p>Oh, and if the code base isn't sufficiently tested, you're in for a world of hurt.</p>
<p><span> </span></p>
<p><span> </span>If you are a developer that was just asked to 'do a quick security check and plug any holes', you are now in the difficult position of managing the expectation that a two-week security review means "we're covered". Be realistic about what you can accomplish, setting out some short-term and long-term goals.</p>
<h3>Do More With Less. Start with a research 'Spike'</h3>
<p>Instead of pushing for more time to be able to 'cover it all' (even though you have no idea what 'it all' is yet), it might be better to start with a shorter analysis phase, where you detail your findings, identify any trends, and include recommendations for process change.  I've found that even the most demanding manager is appreciative and understanding when you ask for a small amount of time in order to produce a better estimate, than to just immediately demand more time without any evidence as to why.</p>
<h3>Plan for success</h3>
<p>With your analysis and recommendations in hand,<br />
<span id="more-2417"></span> you'll be in a better place to give an estimate on what it will take to correct the problems, and any potential side-effects, (ie. "our legacy data partners might not be able to implement their side of this new security plan on time"). Plus, the team can decide which items are the highest priority, and more importantly, you'll have put some practices in place to prevent any new security issues from slipping in later.</p>
<p><span> </span>Because we are never really 'finished' with security, now would be a good time to schedule the next security review, tapping another member of the team to head it up (with your guidance), so that everyone knows that security is something they should be thinking of. Instead of doing a single 'big-bang' security audit headed by one person under an unrealistic deadline, you'll rotate the responsibility through the entire team, taking smaller more managable bites, and educating everyone in the process.  Eventually your 'security-review' will be a natural part of the iteration and your everyday work.</p>
<p>(Tomorrow I'll post <a href="http://www.pathf.com/blogs/2009/05/web-app-security-checklist-braindump/" target="_blank">a quick checklist</a> of general areas to look into for web application security.)</p>
<p><span> </span></p>
<p>This same 'analyze, prioritize, estimate, rotate' technique could be applied to any 'big-bang' approach, such as:</p>
<ul>
<li>Performance tuning</li>
<li>Adding unit tests to legacy code</li>
<li>Refactoring</li>
<li>Releasing to Production</li>
</ul>
<p><span> </span></p>
<p>Your team will get into a rhythm and become more efficient as the knowledge is evenly distributed. But more importantly your customers will appreciate the stability of having smaller but more frequent changes instead of massive buggy 'overhauls'. They'll see bugs getting fixed faster, and notice that little things that have bothered them for awhile are also getting fixed. Who knows, they might even give you the feedback that leads to your next million dollar idea!</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/05/avoid-the-last-minute-security-review/">Avoid the last minute security review</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/05/web-app-security-checklist-braindump/' rel='bookmark' title='Permanent Link: Web app security checklist (Braindump)'>Web app security checklist (Braindump)</a></li><li><a href='http://www.pathf.com/blogs/2008/12/app-security-organization/' rel='bookmark' title='Permanent Link: App Security: Throw Out the Org Chart!'>App Security: Throw Out the Org Chart!</a></li><li><a href='http://www.pathf.com/blogs/2008/11/designing-for-security/' rel='bookmark' title='Permanent Link: The Truth About Designing For Security'>The Truth About Designing For Security</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/05/avoid-the-last-minute-security-review/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bugs can&#8217;t be estimated</title>
		<link>http://www.pathf.com/blogs/2009/05/bugs-cant-be-estimated/</link>
		<comments>http://www.pathf.com/blogs/2009/05/bugs-cant-be-estimated/#comments</comments>
		<pubDate>Wed, 06 May 2009 05:37:09 +0000</pubDate>
		<dc:creator>John McCaffrey</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Pathfinder General]]></category>
		<category><![CDATA[Product Strategy]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Software Development Best Practices]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Bugs]]></category>
		<category><![CDATA[estimation]]></category>
		<category><![CDATA[iteration]]></category>
		<category><![CDATA[planning]]></category>
		<category><![CDATA[Requirements]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=2345</guid>
		<description><![CDATA[
In an earlier post about the benefits of Agile and Scrum, I made a statement that bugs by their nature are not the same as normal features, and I wanted to take a moment to  try and make my point a little clearer.  Bugs and estimation have been a hot topic with us [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/05/bugs-cant-be-estimated/">Bugs can&#8217;t be estimated</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/01/scrum-defined-in-under-10-minutes-2/' rel='bookmark' title='Permanent Link: Scrum defined in under 10 minutes'>Scrum defined in under 10 minutes</a></li><li><a href='http://www.pathf.com/blogs/2008/05/800-on-your-mat/' rel='bookmark' title='Permanent Link: 800 on Your Math SAT, Software Development and Bugs'>800 on Your Math SAT, Software Development and Bugs</a></li><li><a href='http://www.pathf.com/blogs/2009/02/estimating-bugs-and-the-complex-behavior-of-simple-systems/' rel='bookmark' title='Permanent Link: Estimating Bugs and the Complex Behavior of Simple Systems'>Estimating Bugs and the Complex Behavior of Simple Systems</a></li></ol>]]></description>
			<content:encoded><![CDATA[<div class="right"><img src="http://www.pathf.com/blogs/wp-content/uploads/2009/05/estimating.jpg" alt="group estimation" title="estimating" width="270" height="200" class="size-full wp-image-2351" /></div>
<p>In an <a href="http://www.pathf.com/blogs/2009/01/scrum-defined-in-under-10-minutes-2/">earlier post</a> about the benefits of Agile and Scrum, I made a statement that bugs by their nature are not the same as normal features, and I wanted to take a moment to  try and make my point a little clearer.  <a href="http://www.pathf.com/blogs/2009/02/estimating-bugs-and-the-complex-behavior-of-simple-systems/">Bugs</a> and <a href="http://www.pathf.com/blogs/2009/01/the-not-so-fine-art-of-estimation/">estimation</a> have been a <a href="http://www.pathf.com/blogs/2009/04/the-origins-of-software-engineering-economics-you-are-ron-turcotte/">hot topic</a> with us <a href="http://www.pathf.com/blogs/2009/05/are-you-building-and-application-or-a-antique-web-framework/">lately</a>, but interestingly we are all working on different projects and actually have a slightly different take on the subject.</p>
<p>	My definition of a bug is: A feature that was specified, and you attempted to deliver, but is not working according to your intentions. (ie. "I thought it WAS saving to the database")</p>
<p>	Not a bug: A feature or variation that you hadn't intended to create in the first place. ("Oh, I didn't know it was supposed to do that when you clicked the back button")</p>
<p>And with that understanding I say "Bugs can't be estimated"<br />
<span id="more-2345"></span><br />
	The reason I make the distinction that way is because I think there are a lot of things that should be considered 'Missed Requirements' or 'New Requirements' that often get classified as bugs, when they are not. Both of those things should be as easy to estimate as any other feature work. I try to keep them separate from bugs because they are not bugs in software, but rather 'bugs' in communication. Perhaps the requirements criteria weren't clear, the acceptance test cases insufficient, or the developer just skimmed past a clearly defined and well-stated requirement. Either way, these things <em>can</em> be estimated, and should, and the estimates and actuals should be accounted for in your normal velocity calculation.</p>
<p>	<strong>True bugs</strong>, however are things that aren't working the way you expected them to, and you aren't sure why, and you most likely aren't sure how long its going to take to fix it. When I've seen people give estimates for bug fixes in the past its either a complete guess that will be drastically over or under, or the more common is that they spend some untracked amount of time figuring out what the issue is, and then produce their 'estimate', but I contend that its the 'figuring out what the issue is' that needs to be tracked and accounted for, and is the un-estimatable component that can throw your iteration off.</p>
<p>	I try to make this point in such black and white terms to defend against some common anit-patterns I see.</p>
<p>	1. Missed requirements get called bugs, and the team doesn't measure the time it actually takes to resolve them, or adjust their velocity and relative point scale accordingly. (Imagine someone estimates it will take 2 days to complete feature X, and feature Y looks pretty similar, so they estimate 2 days for it as well. After 2 days feature X is 'done', but then there are several missed requirements and 'bugs' that take an additional 3 days to fix. Its critical to make sure that the estimate for feature Y is updated accordingly)</p>
<p>	2. New Requirements get called bugs, which most of the time is just an honest misunderstanding, or it could be a more insidious attempt to cover up a communication problem, but when they are called bugs, they are often not treated in the same manner as other requirements (UI design, analysis, acceptance test definition, etc). </p>
<p>One my worst experiences with this was on a project where both the BA and QA resources had significant domain expertise, but disagreed on some implementation details. The QA person was unable to make their case during the requirements review, so they just waited until testing to say that there were several bugs, but in fact these bugs were variations on functionality that were not originally specified. On that project, only certain people could define and approve new functionality, but any bugs opened by the QA team were assumed to be top priority and didn't need to be reviewed or approved. (an extreme example I know, but it just points out the importance of making sure that you treat bugs as bugs, and requirements as requirements)</p>
<p>	3. Planning to take care of 'all outstanding bugs' in the 'bug-fix iteration' as the final iteration at the end of the release. Here's where I'm really saying "you can't estimate bugs", and that it might be very dangerous to set the expectation that you can fix all of the issues in that iteration. What if it takes twice as long? What if fixing the bug causes more bugs?</p>
<p>	You can't be so sure of these things, which is why I say you should plan for them differently.<br />
	1. Requirements disguised as bugs should be put in the backlog and prioritized and estimated as normal features (and figure out why they were missed)<br />
	2. Allocate a 'bucket' of time within each iteration to tackle bugs.<br />
	3. The stakeholders prioritize and define the expected behavior for bugs<br />
	4. The burndown chart for the bug fixing reflects the amount of time remaining in the bucket, and the amount of bugs left<br />
	5. When the time is all used up, the product owner has to make a decision for how best to utilize resources, either pull someone off of a feature to continue working on the bug, or hold off on the bug until the next iteration.</p>
<p>	Now it might seem odd to stop working on a bug, but the reality is you have a fixed amount of time each iteration, and you have to leverage it as effectively as possible. The goal is to have fully testable and hopefully releaseable software at the end of the iteration so you can't leave a feature half-done. One way or the other you have to find a way to get it done. When you don't track the amount of time spent on bugs, you can end up short-changing your other features, which in turn can lead to more bugs.</p>
<p>Do you track time spent on bugs? (do you relate it back to the original estimate for that story?)<br />
How do you estimate and plan for how long it will take to fix bugs?</p>
<p>(slightly unrelated) The recent client project I was on had 'Urgent' bugs that went back more than 90 days. Who is in charge of cleaning up bugs on your team? (are there any bugs more than 30 days old, and why?)</p>
<p>Bonus question: What would it take for your team to have a 'zero bug' policy? If at the end of every iteration there were no outstanding bugs?</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/05/bugs-cant-be-estimated/">Bugs can&#8217;t be estimated</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/01/scrum-defined-in-under-10-minutes-2/' rel='bookmark' title='Permanent Link: Scrum defined in under 10 minutes'>Scrum defined in under 10 minutes</a></li><li><a href='http://www.pathf.com/blogs/2008/05/800-on-your-mat/' rel='bookmark' title='Permanent Link: 800 on Your Math SAT, Software Development and Bugs'>800 on Your Math SAT, Software Development and Bugs</a></li><li><a href='http://www.pathf.com/blogs/2009/02/estimating-bugs-and-the-complex-behavior-of-simple-systems/' rel='bookmark' title='Permanent Link: Estimating Bugs and the Complex Behavior of Simple Systems'>Estimating Bugs and the Complex Behavior of Simple Systems</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/05/bugs-cant-be-estimated/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Are You Building an Application or an Antique Web Framework?</title>
		<link>http://www.pathf.com/blogs/2009/05/are-you-building-and-application-or-a-antique-web-framework/</link>
		<comments>http://www.pathf.com/blogs/2009/05/are-you-building-and-application-or-a-antique-web-framework/#comments</comments>
		<pubDate>Tue, 05 May 2009 23:47:35 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
				<category><![CDATA[Custom Application Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Rich Internet Apps]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Software Development Best Practices]]></category>
		<category><![CDATA[Technologies and Platforms]]></category>
		<category><![CDATA[User Experience Design]]></category>
		<category><![CDATA[uxd]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Estimating]]></category>
		<category><![CDATA[Requirements]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=2338</guid>
		<description><![CDATA[ photo credit: dave_7
A few years ago, a friend of mine asked me to help him estimating the conversion of a client/server application to the web. He came armed with a spreadsheet of features, I came armed with Ibuprofen and a red pen.
My usual approach to estimating involves breaking down the features into things that [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/05/are-you-building-and-application-or-a-antique-web-framework/">Are You Building an Application or an Antique Web Framework?</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/06/how-to-learn-a-new-programming-language-or-framework/' rel='bookmark' title='Permanent Link: How to learn a new programming language or framework'>How to learn a new programming language or framework</a></li><li><a href='http://www.pathf.com/blogs/2006/05/yaacgf_yet_anot/' rel='bookmark' title='Permanent Link: YAACGF &#8211; Yet Another AJAX Component GUI Framework'>YAACGF &#8211; Yet Another AJAX Component GUI Framework</a></li><li><a href='http://www.pathf.com/blogs/2009/03/week-in-review/' rel='bookmark' title='Permanent Link: Week in Review'>Week in Review</a></li></ol>]]></description>
			<content:encoded><![CDATA[<div style='float:right;padding:10px'><a href="http://www.flickr.com/photos/21612624@N00/2514480983/" rel="nofollow"  title="1927 Ford Model T tudor" target="_blank"><img src="http://farm3.static.flickr.com/2289/2514480983_a4ba7762c7_m.jpg" alt="1927 Ford Model T tudor" border="0" /></a><br /><small><a href="http://creativecommons.org/licenses/by-sa/2.0/" rel="nofollow"  title="Attribution-ShareAlike License" target="_blank"><img src="http://www.pathf.com/blogs/wp-content/plugins/photo-dropper/images/cc.png" alt="Creative Commons License" border="0" width="16" height="16" align="absmiddle" /></a> <a href="http://www.photodropper.com/photos/" rel="nofollow"  target="_blank">photo</a> credit: <a href="http://www.flickr.com/photos/21612624@N00/2514480983/" rel="nofollow"  title="dave_7" target="_blank">dave_7</a></small></div>
<p>A few years ago, a friend of mine asked me to help him estimating the conversion of a client/server application to the web. He came armed with a spreadsheet of features, I came armed with Ibuprofen and a red pen.</p>
<p>My usual approach to estimating involves breaking down the features into things that can be implemented by a pair of developers within a two week period. I give these a complexity factor of 1-5, then run them through an empirically derived formula to come up with an estimate in terms of person-iterations. (It's actually a little more complicated than that, but this is the main effort). Getting the count and size of these mini-features right is the key aspect of this technique. His spreadsheet had almost 300 features listed, and so we settled in for a day of fun.<br />
<span id="more-2338"></span><br />
After feature number 30, I turned to him and asked, "don't you have any business features in this thing?" His features were not about business use cases -- editing or updating some business entities, performing a business transaction -- they were instead about how this web application could function just like the client/server app it was replacing, i.e. "the administrator will be able to update the checkbox cascading order via the module screeen..." Blech! So next we trimmed out all of the UI features which cut the volume of features by 80%.</p>
<p>As it turned out, my friend had been so focused on UI specs that he forgot some critical business user stories. After adding these we were still down 70% of the feature volume. The trimmed features looked a lot like the specs for a web application framework, and not a very good one.</p>
<p>At the end, my friend asked me what he should do with those UI features we had trimmed out. "Delete with extreme prejudice," I told him. "I wrote that application in 1996 and made all of the mistakes you were about to make."</p>
<p>Lesson: If you're renovating an old application, go back to the business requirements and let the application and user interface come as a natural part of the development process, otherwise you will find yourself spec'ing out a web framework circa 1997.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/05/are-you-building-and-application-or-a-antique-web-framework/">Are You Building an Application or an Antique Web Framework?</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/06/how-to-learn-a-new-programming-language-or-framework/' rel='bookmark' title='Permanent Link: How to learn a new programming language or framework'>How to learn a new programming language or framework</a></li><li><a href='http://www.pathf.com/blogs/2006/05/yaacgf_yet_anot/' rel='bookmark' title='Permanent Link: YAACGF &#8211; Yet Another AJAX Component GUI Framework'>YAACGF &#8211; Yet Another AJAX Component GUI Framework</a></li><li><a href='http://www.pathf.com/blogs/2009/03/week-in-review/' rel='bookmark' title='Permanent Link: Week in Review'>Week in Review</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/05/are-you-building-and-application-or-a-antique-web-framework/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Oracle and Sun: What it may mean for Open Source Landscape</title>
		<link>http://www.pathf.com/blogs/2009/04/oracle-and-sun-what-it-may-mean-for-open-source-landscape/</link>
		<comments>http://www.pathf.com/blogs/2009/04/oracle-and-sun-what-it-may-mean-for-open-source-landscape/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 15:01:04 +0000</pubDate>
		<dc:creator>Sharad Jain</dc:creator>
				<category><![CDATA[Custom Application Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Product Strategy]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[sun]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=2194</guid>
		<description><![CDATA[
 photo credit: Potato Benevolence
The recent acquisition of Sun by Oracle, and not IBM, took the community by surprise. Open source Java developers have benefited immensely from Sun's Java and IBM's contribution to Java space. IBM has a generally favorable view from open source community since IBM has few significant open-source contributions including those to [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/04/oracle-and-sun-what-it-may-mean-for-open-source-landscape/">Oracle and Sun: What it may mean for Open Source Landscape</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2007/12/another-brain-f/' rel='bookmark' title='Permanent Link: Another Brain Fart on Why Open Source is Bad'>Another Brain Fart on Why Open Source is Bad</a></li><li><a href='http://www.pathf.com/blogs/2008/05/adobe-open-scre/' rel='bookmark' title='Permanent Link: Adobe &#8220;Open Screen&#8221; is not &#8220;Open Source&#8221;'>Adobe &#8220;Open Screen&#8221; is not &#8220;Open Source&#8221;</a></li><li><a href='http://www.pathf.com/blogs/2008/05/flashdevelop-op/' rel='bookmark' title='Permanent Link: FlashDevelop: Open Source Flash IDE'>FlashDevelop: Open Source Flash IDE</a></li></ol>]]></description>
			<content:encoded><![CDATA[<div style="float:right;padding:10px"><a href="http://www.flickr.com/photos/52367986@N00/603728121/" rel="nofollow" title="If the hat fits..."  target="_blank"><img src="http://farm2.static.flickr.com/1198/603728121_49886301f8_m.jpg" border="0" alt="If the hat fits..." /></a><br />
<small><a href="http://creativecommons.org/licenses/by-nd/2.0/" rel="nofollow" title="Attribution-NoDerivs License"  target="_blank"><img src="http://www.pathf.com/blogs/wp-content/plugins/photo-dropper/images/cc.png" border="0" alt="Creative Commons License" width="16" height="16" align="absmiddle" /></a> <a href="http://www.photodropper.com/photos/" rel="nofollow"  target="_blank">photo</a> credit: <a href="http://www.flickr.com/photos/52367986@N00/603728121/" rel="nofollow" title="Potato Benevolence"  target="_blank">Potato Benevolence</a></small></div>
<p>The recent acquisition of Sun by Oracle, and not IBM, took the community by surprise. Open source Java developers have benefited immensely from Sun's Java and IBM's contribution to Java space. IBM has a generally favorable view from open source community since IBM has few significant open-source contributions including those to Apache software foundation and Eclipse. When I heard about IBM's talk of acquiring Sun, I was certainly bothered by the demise of Sun as a company but nevertheless hoped that whatever happens, Java and MySQL, and the strong community behind it, should stay largely intact. And I felt comfortable with Java landing in IBM's lap considering its largest contribution to Java community by any corporate vendor. Oracle is a strong and focussed company but its contribution to open source world is minimal. As open source developer or company, you are also concerned about the fate of mysql. Like everybody, I am trying to make sense of what this will mean for the open source developers.</p>
<p><span id="more-2194"></span></p>
<p><strong>Why not IBM? And, more importantly, why Oracle?</strong><br />
Although talks between IBM and Sun dragged a bit, I felt certain that sooner or later, IBM would be Sun's choice. Why? because outside of Sun, IBM is the largest single company that has probably the largest stake in Java remaining successful. And Sun, for its part, will not give away the ownership of its crown-jewel, Java, to a company that is not committed to Java. IBM offered about $7B while Oracle acquired it for $7.4B. I strongly doubt this was the main reason. After all, Sun did open-source Java recently and Solaris not long ago. To me, Sun's concern over regulatory approval was a bigger reason. The impact that a failure of approval would have on future of Java and Solaris was probably unacceptable. Hence, they decided to go with safer alternative, Oracle.</p>
<p>Besides regulatory compliance, Sun may be thinking that Solaris is certainly dead in the hands of IBM. IBM already has a OS and hardware base that would conflict with Sun's offering. Whereas, Oracle may see value in preserving Sun's Solaris and hardware offering and bolstering its suite of offering. Oracle's <a href="http://www.oracle.com/sun/sun-faq.pdf" rel="nofollow" id="n3bw" title="press-release" >press-release</a> refers to the fact that they are planning to offer full application-to-disk suite of tools. Oracle's efforts with RedHat Linux based Unbreakable Linux haven't had tremendous success and there may be large market for Oracle Database on Solaris platform that is mature and proven.</p>
<p><strong>What can open-source community and customers expect?</strong><br />
Just as Websphere, DB2 go together from IBM and .NET,  SQL-Server go together from Microsoft, Java/J2EE usually go with Oracle Database on Solaris or Linux. This is a preferred technology stack for quite a few large corporations (banks and financial institutions included). Oracle also has BEA Weblogic and will have not problem going with any other application servers like JBoss or Tomcat since its own Oracle Application Server isn't widely used anyway. There may be some benefits to such large corporations with the increased synergy between Java and Oracle and Solaris and Linux. However, Oracle's plan for application-to-disk sounds more like Microsoft's Vendor Lock-In strategy and needs to be taken with a grain of salt.</p>
<p>For small and mid-size companies it could be a different story. A large number of these either Java/J2EE and/or MySQL. Sun's Open Sourcing of Java is certainly going to help the community stay away from much of the impact. Prime contributors like <a href="http://www.apache.org/" rel="nofollow" >Apache Software Foundation</a>, <a href="http://www.springsource.org/" rel="nofollow" >Springsource</a> and <a href="http://www.jboss.org/" rel="nofollow" >JBoss</a> should be able to continue to innovate on Java front. The future of MySQL, a favorite not only for Java/J2EE but also LAMP and Ruby/Rails community, seems clouded now. <a href="http://online.wsj.com/article/SB124035244246940627.html" rel="nofollow" >Today's article from Wall Street Journal</a> (WSJ) rightly raises the concern of small and mid-size companies that have been counting on mysql. Oracle does have a huge conflict-of-interest in perserving the status quo, and letting MySQL grow. Whether Oracle wants to admit it or not, mysql does represent a revenue forgone for its own database offering. Granted Oracle is much more powerful and featureful than MySQL, but if mysql can work for websites such as facebook and google, it should be good enough for lot of other websites.</p>
<p>For Oracle, it is best if it accepts that open source databases are here to stay. Killing or limiting MySQL growth will only alienate the community and lead them to look for alternatives, and they are a few (Postgresql etc.). Oracle should find a way to make it easier to migrate from MySQL to Oracle when they are ready (and companies do as they grow). Oracle may even decide to create goodwill in open-source community by letting MySQL, InnoDB combination grow. Oracle has thus far shown little interest in furthering open source community. With the acquisition of Java and MySQL, it has a great opportunity to please or to annoy open-source community. We can only hope that Oracle finds a way for both itself and open source to survive and grow peacefully.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/04/oracle-and-sun-what-it-may-mean-for-open-source-landscape/">Oracle and Sun: What it may mean for Open Source Landscape</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2007/12/another-brain-f/' rel='bookmark' title='Permanent Link: Another Brain Fart on Why Open Source is Bad'>Another Brain Fart on Why Open Source is Bad</a></li><li><a href='http://www.pathf.com/blogs/2008/05/adobe-open-scre/' rel='bookmark' title='Permanent Link: Adobe &#8220;Open Screen&#8221; is not &#8220;Open Source&#8221;'>Adobe &#8220;Open Screen&#8221; is not &#8220;Open Source&#8221;</a></li><li><a href='http://www.pathf.com/blogs/2008/05/flashdevelop-op/' rel='bookmark' title='Permanent Link: FlashDevelop: Open Source Flash IDE'>FlashDevelop: Open Source Flash IDE</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/04/oracle-and-sun-what-it-may-mean-for-open-source-landscape/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Adopt a non-techie. Help your business team move faster</title>
		<link>http://www.pathf.com/blogs/2009/04/adopt-a-non-techie-help-your-business-team-move-faster/</link>
		<comments>http://www.pathf.com/blogs/2009/04/adopt-a-non-techie-help-your-business-team-move-faster/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 10:00:58 +0000</pubDate>
		<dc:creator>John McCaffrey</dc:creator>
				<category><![CDATA[Business Rules Engines]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Pathfinder General]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Software Development Best Practices]]></category>
		<category><![CDATA[Technologies and Platforms]]></category>
		<category><![CDATA[User Experience Design]]></category>
		<category><![CDATA[iPhone/Mobile]]></category>
		<category><![CDATA[uxd]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[google docs]]></category>
		<category><![CDATA[imacros]]></category>
		<category><![CDATA[neal ford]]></category>
		<category><![CDATA[nfjs]]></category>
		<category><![CDATA[Pair Programming]]></category>
		<category><![CDATA[portableapps]]></category>
		<category><![CDATA[productive programer]]></category>
		<category><![CDATA[regex]]></category>
		<category><![CDATA[regular expressions]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1983</guid>
		<description><![CDATA[
 I've been spending some time with our internal sales and marketing team to hash out some of our goals for the year, and it became quite clear to me that non-developers are on their computers all day long facing some of the same technical challenges we do.
Some of the tasks they have to do:

"take [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/04/adopt-a-non-techie-help-your-business-team-move-faster/">Adopt a non-techie. Help your business team move faster</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/04/can-your-selenium-do-that-testing-flashflex-and-silverlight-in-web-apps-with-imacros/' rel='bookmark' title='Permanent Link: Can your Selenium do that? Testing flash/flex and silverlight in web apps with iMacros'>Can your Selenium do that? Testing flash/flex and silverlight in web apps with iMacros</a></li><li><a href='http://www.pathf.com/blogs/2009/06/stick-with-erb-or-move-to-haml/' rel='bookmark' title='Permanent Link: Stick with ERB or move to Haml'>Stick with ERB or move to Haml</a></li><li><a href='http://www.pathf.com/blogs/2009/09/does-your-project-have-code-ownership-culture/' rel='bookmark' title='Permanent Link: Does your project have Code Ownership Culture?'>Does your project have Code Ownership Culture?</a></li></ol>]]></description>
			<content:encoded><![CDATA[<div class="right"><img class="alignright size-full wp-image-1998" src="http://www.pathf.com/blogs/wp-content/uploads/2009/04/confused-computer-user.jpg" alt="" height="125" /></div>
<p> I've been spending some time with our internal sales and marketing team to hash out some of our goals for the year, and it became quite clear to me that non-developers are on their computers all day long facing some of the same technical challenges we do.</p>
<p><strong>Some of the tasks they have to do:</strong></p>
<ul>
<li>"take the data out of the spreadsheet for last quarter and compare it to this quarter"</li>
<li>"gather the bounced emails from <a href="http://www.pathf.com/newsletter/newsletter-archive/" rel="nofollow"  target="_blank">our newsletter</a> posting, and update our list, pulling out duplicates"</li>
<li>"replace all the names and addresses from our NDA agreement each time it is sent to a new client"</li>
<li>"slice and dice google ad-words and google analytics data"</li>
</ul>
<p><span> </span></p>
<p>So I've resolved to take some time each week to 'Adopt a non-techie', and help them spend less time 'screwing around with the computer' and more time on the most valuable tasks they do.</p>
<p>In the same way that developers need to be as efficient as possible with the tools they use, <span id="more-1983"></span>so do the rest of the people at your company. At Pathfinder a good number of us have attended <a href="http://books.google.com/books?id=oVadw8Jf0cYC&amp;dq=neal+ford+productive+programmer&amp;printsec=frontcover&amp;source=bl&amp;ots=fbIouS5hPw&amp;sig=u26tEhBQ00KJwBiqR-pbt65CH4Q&amp;hl=en&amp;ei=6JjbSe7OBYTMyQXOmvi9CA&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=2#PPA31,M1" rel="nofollow"  target="_blank">Neal Ford's Productive Programmer</a> talks at the <a href="http://www.nofluffjuststuff.com/conference/speaker/neal_ford.html" rel="nofollow"  target="_blank">NofluffJustStuff </a>conference, which covers a series of strategies for becoming extremely efficient as a developer. For those on our team that haven't attended the presentations, they pick up the best tricks through pairing and internal developer brownbags, but now I suggest we take the same approach with our business team.</p>
<p><span> </span></p>
<p>While the benefits of having two developers pair on a technical task has been <a href="http://www.google.com/search?hl=en&amp;rlz=1C1GGLS_en-USUS294US303&amp;q=~benefits+of+'pair+programming'+agile+best+practices+blog+TDD+speed+faster+better+less+bugs&amp;btnG=Search" rel="nofollow"  target="_blank">covered a million times</a>, I would say it also applies to pairing with your UI designer, QA and BA resources as well. Whenever they need to take lots of text and reformat it, search/replace, etc, they might be tackling that problem manually, when you could help them solve it with a quick script or finding the plugin they need.</p>
<p><strong> A few areas you might be able to help them with:</strong></p>
<ol>
<li>Forms and mail merge in word</li>
<li>Advanced searching and replacing in word</li>
<li>Google docs now has more powerful regular expression capabilities for searching and replacing (Actually, I could do a whole post on the benefits of getting your team to use GoogleDocs, would anyone be interested in that?)</li>
<li>Building a quick survey with google forms or surveymonkey</li>
<li>General text manipulation</li>
<li>Searching through all of their emails or local documents for anything related to the 'Jelly Belly vs. M&amp;Ms' case</li>
<li>Excel spreadsheet manipulation, charts, etc.</li>
<li>Web searching and data extraction</li>
<li>Managing and sharing bookmarks and research data with others</li>
<li>Even tools like Selenium or <a href="http://www.pathf.com/blogs/2009/04/can-your-selenium-do-that-testing-flashflex-and-silverlight-in-web-apps-with-imacros" target="_blank">iMacros</a> could help your Business team automate repetitive form filling, web searching or web site testing.</li>
</ol>
<p><strong>Goals (First do no harm!):</strong></p>
<ol>
<li>Find the right problem. Just like we see in Product development, sometimes the most difficult problem is also the rarest, and not the best use of your time. In fact, the greatest area of efficiency is more likely to come from something they <em>know </em>how to do, but could be doing faster. (Instead of saving them 30mins off of a task they do twice a year, you might find something that saves 15mins every day!)</li>
<li>Don't expect them to become a developer. The goal is to reduce the time these things get in their way, so they can focus on the higher value stuff.</li>
<li>Make it easy for them to repeat the process (let them document it in their words, or even make a screencast while you're doing it)</li>
<li>Share your successes with the rest of the team (notes and screenshots/videos up on the wiki)</li>
</ol>
<p><strong>Use the right tools for the job!</strong></p>
<p>While its best if you can help them to become more efficient with the tools they use everyday, you may find that they are just not using the right tool for the job, or if its a one-time thing, and you need to bring your toolkit with you.  For that I recommend a usb drive with your favorite <a href="http://portableapps.com/" rel="nofollow"  target="_blank">PortableApps</a> (notepad++ is great for text editing), or my new favorite PortableUbuntu (which lets you run linux off the usb drive, while accessing the files on the windows system)</p>
<p><span> </span></p>
<p><strong>What gets in your way?</strong></p>
<p>To the business folks out there, what are some of the tasks you do to manipulate data? What frustrates you or eats up a lot of your time?</p>
<p>Reach out to your nearest techie, I bet they can help, or post your problem here and we'll make some recommendations.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/04/adopt-a-non-techie-help-your-business-team-move-faster/">Adopt a non-techie. Help your business team move faster</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/04/can-your-selenium-do-that-testing-flashflex-and-silverlight-in-web-apps-with-imacros/' rel='bookmark' title='Permanent Link: Can your Selenium do that? Testing flash/flex and silverlight in web apps with iMacros'>Can your Selenium do that? Testing flash/flex and silverlight in web apps with iMacros</a></li><li><a href='http://www.pathf.com/blogs/2009/06/stick-with-erb-or-move-to-haml/' rel='bookmark' title='Permanent Link: Stick with ERB or move to Haml'>Stick with ERB or move to Haml</a></li><li><a href='http://www.pathf.com/blogs/2009/09/does-your-project-have-code-ownership-culture/' rel='bookmark' title='Permanent Link: Does your project have Code Ownership Culture?'>Does your project have Code Ownership Culture?</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/04/adopt-a-non-techie-help-your-business-team-move-faster/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Can your Selenium do that? Testing flash/flex and silverlight in web apps with iMacros</title>
		<link>http://www.pathf.com/blogs/2009/04/can-your-selenium-do-that-testing-flashflex-and-silverlight-in-web-apps-with-imacros/</link>
		<comments>http://www.pathf.com/blogs/2009/04/can-your-selenium-do-that-testing-flashflex-and-silverlight-in-web-apps-with-imacros/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 10:00:03 +0000</pubDate>
		<dc:creator>John McCaffrey</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex, Flash and Air]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technologies and Platforms]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[cruise]]></category>
		<category><![CDATA[functional]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[imacros]]></category>
		<category><![CDATA[jmeter]]></category>
		<category><![CDATA[QA]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[SeleniumIDE]]></category>
		<category><![CDATA[soapUI]]></category>
		<category><![CDATA[Tellurium]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[watij]]></category>
		<category><![CDATA[watir]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[WebTest]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1873</guid>
		<description><![CDATA[
Having learned a long time ago the value of automated testing tools like Selenium, jMeter, and soapUI, I'm always on the lookout for new improvements in these tools. While I love Selenium and other frameworks like it, it has the limitation of not being able to test Flash/Flex/Silverlight or Java Applets. But if you need [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/04/can-your-selenium-do-that-testing-flashflex-and-silverlight-in-web-apps-with-imacros/">Can your Selenium do that? Testing flash/flex and silverlight in web apps with iMacros</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2008/04/ajax-testing-do/' rel='bookmark' title='Permanent Link: Ajax Testing: Doubling Down with Selenium and JMeter'>Ajax Testing: Doubling Down with Selenium and JMeter</a></li><li><a href='http://www.pathf.com/blogs/2008/11/skinning-flex-with-illustrator-cs3/' rel='bookmark' title='Permanent Link: Skinning Flex with Illustrator CS3'>Skinning Flex with Illustrator CS3</a></li><li><a href='http://www.pathf.com/blogs/2008/09/flash-flex-physics-engines-and-examples/' rel='bookmark' title='Permanent Link: Flash/Flex physics engines and examples'>Flash/Flex physics engines and examples</a></li></ol>]]></description>
			<content:encoded><![CDATA[<div class="right"><img class="alignright size-full wp-image-1880" src="http://www.pathf.com/blogs/wp-content/uploads/2009/04/imacros-logo.gif" alt="imacros-logo" width="132" height="125" /></div>
<p>Having learned a long time ago the value of automated testing tools like <a href="http://seleniumhq.org/" rel="nofollow"  target="_blank">Selenium</a>, jMeter, and soapUI, I'm always on the lookout for new improvements in these tools. While I love Selenium and other frameworks like it, it has the limitation of not being able to test Flash/Flex/Silverlight or Java Applets. But if you need to test flash and silverlight components of your web app, in an automated way, the  <a href="http://www.iopus.com/" rel="nofollow"  target="_blank">iMacros </a> testing tool might be worth checking out.</p>
<p><strong>No Free Ride</strong></p>
<p>While the free version of the iMacros plugins for InternetExplorer and Firefox allow powerful web scripting similar to Selenium, to be able to do the flash/flex and silverlight, you have to get the paid version or the 30-day trial. I downloaded the trial version to see how it compares to Selenium and what kind of damage I could to.</p>
<p>Going through some of the online <a href="http://forum.iopus.com/_uploads/ImageRecognition.htm" rel="nofollow"  target="_blank">demos</a>,<span id="more-1873"></span> I saw you can actually do an image comparison to assert that something is visible in flash, and even have the test click on that part of the app.  The process involved taking a screen shot of the app, grabbing the section you want to use as the target, and then specifiying if you want the script to just assert that section is contained with in the app, or if you want it to also click on it.</p>
<p>I  followed the example to create a test that opened up a flash swf file and navigated through the app, asserting that certain image sections, like buttons and instructional messages appeared in the flash app. While the process wasn't that hard, I could see how it would be brittle as the tests would break whenever slight changes to the graphics happened.</p>
<p>One possible way to defend against brittle tests is to share the image assets that make up a flash app and its assertions between the flash designer and the tester. If the testing person has the access to the source code and images that make up the app, the script could refer to 'start_button.png' from the source tree, and even if the designer updates that file, the test will still pass.</p>
<p>You don't have to use the image detection to drive the script, you can just have it click on things according to their position, but the image detection was more interesting to me,  and I noticed that if you resized your window, the positional detection would be incorrect.</p>
<p><strong>Feeding the script with User Data</strong></p>
<p>One of the stand out features is having the script prompt the user for input, which I think could be extremely powerful when using the test as a data generator.  One of the ways that I've found to encourage Selenium adoption on a new project is to set up the tests so that they automate the most common tasks, and help developers and the BA/QA team generate test data to aide their manual testing.  With Selenium that required that we put some extra components into the iframe, to let the user select values that would be used within the script. I've also used selenium in the past as a way to automate certain personal tasks like filling out online surveys, or reconfiguring my <a href="https://forums.vonage.com/showthread.php?t=222" rel="nofollow"  target="_blank">stupid motorola router</a> after a power failure, and I could see the prompting feature of iMacros making those scripts easier to create.</p>
<p>iMacros also lets you feed a script with a .csv file, and have it loop over and repeat for each row, which can be a good way to seed some test data in an app, while putting it under a bit of load. (Not sure how to best have two iMacros scripts going against one server like I used to with Selenium, but I bet its possible)</p>
<p>Iopus, the company that makes iMacros, is actively encouraging a community to share common scripts, and includes several good examples of their own, one which fires off searches against multiple sites, after prompting you for a search term.  (which I plan to create my own to blast searches against my favorite online classified sites like craigslist, oodle,  googlebase, kijiji,  listpic, and ebay)</p>
<p><strong>Overall, I would say compared to Selenium, iMacros is:</strong></p>
<ul>
<li>Slightly less intuitive to me in terms of syntax, assertions, and scripting capabilities</li>
<li>Capable of working in Firefox and InternetExplorer</li>
<li>Loaded with great examples, documentation and video tutorials</li>
<li>Similar to the <a href="http://seleniumhq.org/projects/ide/" rel="nofollow"  target="_blank">Selenium IDE</a> interface for recording, editing, and  rerunning tests</li>
<li>Designed with user interaction in mind (easy to record, prompting for user input, csv import)</li>
<li>Taking web scripting to the next level with powerful  data extraction capabilities</li>
</ul>
<p><strong>Stuff I didn't look into yet</strong></p>
<ul>
<li>Integrating the tests into the Continuous Integration build with either <a href="http://cruisecontrol.sourceforge.net/" rel="nofollow"  target="_blank">Cruise</a> or <a href="https://hudson.dev.java.net/" rel="nofollow"  target="_blank">Hudson</a></li>
<li>How to use the Data extraction capabilities</li>
<li>Invoking Javascript from the test</li>
<li>Having the script take  a screenshot on failure</li>
<li>Invoking the test script from  <a href="http://wiki.imacros.net/Sample_Code" rel="nofollow"  target="_blank">Java  or Ruby</a></li>
<li>Drag &amp; Drop Ajax</li>
<li>Stepping through the debugger</li>
<li>Firing off multiple sessions</li>
</ul>
<p>No matter which tool you choose, having some level of automated functional and UI tests is critical. It saves everyone on the team time on menial and repetitive tasks, can be a great way for new people to learn the app, provides a suite of smoke tests you can run throughout the development cycle, and it can help you free up your QA resources to focus on higher value goals.</p>
<p><strong>And what about you?</strong></p>
<ol>
<li>How do you test flash/flex/siverlight/java Applets in your apps?</li>
<li>Is there anything that Selenium can't do for you? (Other than Flash/Flex, Selenium has always been able to do what I need)</li>
<li>What parts of your UI testing have you been able to automate? (And what's your next goal?)</li>
</ol>
<p>What do you think you could do with iMacros? Could you use it to <a href="http://www.pathf.com/blogs/2009/04/adopt-a-non-techie-help-your-business-team-move-faster" target="_blank">help your Business team be more efficient</a>? (Post a challenge, we'll see if we can tackle it with iMacros or Selenium)</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/04/can-your-selenium-do-that-testing-flashflex-and-silverlight-in-web-apps-with-imacros/">Can your Selenium do that? Testing flash/flex and silverlight in web apps with iMacros</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2008/04/ajax-testing-do/' rel='bookmark' title='Permanent Link: Ajax Testing: Doubling Down with Selenium and JMeter'>Ajax Testing: Doubling Down with Selenium and JMeter</a></li><li><a href='http://www.pathf.com/blogs/2008/11/skinning-flex-with-illustrator-cs3/' rel='bookmark' title='Permanent Link: Skinning Flex with Illustrator CS3'>Skinning Flex with Illustrator CS3</a></li><li><a href='http://www.pathf.com/blogs/2008/09/flash-flex-physics-engines-and-examples/' rel='bookmark' title='Permanent Link: Flash/Flex physics engines and examples'>Flash/Flex physics engines and examples</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/04/can-your-selenium-do-that-testing-flashflex-and-silverlight-in-web-apps-with-imacros/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Data Driven Design and the Culture at Google</title>
		<link>http://www.pathf.com/blogs/2009/03/data-driven-design-and-the-culture-at-google/</link>
		<comments>http://www.pathf.com/blogs/2009/03/data-driven-design-and-the-culture-at-google/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 14:27:41 +0000</pubDate>
		<dc:creator>Sholom Sandalow</dc:creator>
				<category><![CDATA[Custom Application Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Rich Internet Apps]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Software Development Best Practices]]></category>
		<category><![CDATA[Technologies and Platforms]]></category>
		<category><![CDATA[User Experience Design]]></category>
		<category><![CDATA[uxd]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1688</guid>
		<description><![CDATA[A peek under the hood of google's design apparatus.

In an interview with Newsweek magazine, Irene Au, User Experience Director at Google discusses her responsibilities, and in the process, reveals some telling things about the way design decisions are made at the multi-billion dollar internet company.  Perhaps not surprisingly, she makes it clear that Google takes [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/03/data-driven-design-and-the-culture-at-google/">Data Driven Design and the Culture at Google</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2007/06/visual-design-2/' rel='bookmark' title='Permanent Link: Visual Design as a Balancing Act'>Visual Design as a Balancing Act</a></li><li><a href='http://www.pathf.com/blogs/2009/08/designing-wireframes-visual-design/' rel='bookmark' title='Permanent Link: Developing Good Wireframes Ahead of Visual Design'>Developing Good Wireframes Ahead of Visual Design</a></li><li><a href='http://www.pathf.com/blogs/2009/09/does-your-project-have-code-ownership-culture/' rel='bookmark' title='Permanent Link: Does your project have Code Ownership Culture?'>Does your project have Code Ownership Culture?</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><strong>A peek under the hood of google's design apparatus.</strong></p>
<p><a href="http://www.flickr.com/photos/34826210@N08/3387932314/" rel="nofollow" title="Numbers" ><img class="alignright" style="float: right;" src="http://static.flickr.com/3422/3387932314_8834a1dcb3_m.jpg" alt="Numbers" style="padding:10px" /></a></p>
<p>In an <a href="http://www.businessweek.com/innovate/content/mar2009/id20090318_786470.htm" rel="nofollow"  target="_blank">interview with Newsweek magazine</a>, Irene Au, User Experience Director at Google discusses her responsibilities, and in the process, reveals some telling things about the way design decisions are made at the multi-billion dollar internet company.  Perhaps not surprisingly, she makes it clear that Google takes a data driven approach to interface design just as it does to everything else.  The subjective opinions of art directors or visual designers don't play a key role in the design of their products.  As she states, "A lot of our design decisions are really driven by cognitive psychology research that shows that, say, people online read black text against a white background much faster than white against black, or that sans serif fonts are more easily read than serif fonts online."  No argument here.<br />
But is a completely empirical approach to interface design desirable, or even realistic?  Isn’t it more likely that the left brain culture at google puts greater weight on the opinions of engineers, even if they are being just as subjective? One blog commenter put it this way, regarding Au’s interview with newsweek:</p>
<p><span id="more-1688"></span></p>
<blockquote><p>She says on the one hand that they rely on cognitive psychology research to improve the design, then in the next answer says that their pages have high information density, which cognitive research has shown to slow people down. She also says that they do what's best for users, but that the founders believe there should be one way to do things (presumably whether that's the way that performs the best or not). Sounds to me like what she's really saying is that they rely on human judgement when it comes to certain people (Larry and Sergey), but when professional designers try to use their own judgement (to suggest more line spacing, etc) that judgement isn't enough. That's less a coherent approach to design and more a hierarchy of who's opinion counts. And not surprisingly in a tech company, sounds like designers lose.</p></blockquote>
<p>Douglas Bowman, Google's <a href="http://stopdesign.com/archive/2006/05/27/going-to-google.html" rel="nofollow"  target="_blank">first lead Visual Designer</a> recently <a href="http://stopdesign.com/archive/2009/03/20/goodbye-google.html" rel="nofollow"  target="_blank">blogged about this very issue</a> as he discussed why he was leaving the company.  According to him, Google always has relied on an empirical approach not just to how their products should behave internally, but how they should look and feel to the user, down to the pixel level.  However this reliance on data for every minute detail of the user interface is no substitute for true creative design.  And the culture at google which thrives in a numbers only game is stifling the visual design talent that Google has hired, leading to a vacuum of true visual design leadership.  Although gathering and analyzing data regarding interface decisions is definitely a good thing, Google has reached the point where it has <a href="http://www.zeldman.com/2009/03/20/41-shades-of-blue/" rel="nofollow" >become a crutch</a>, and without leadership from people that understand visual design principles there is a creative vacuum that will negatively impact user’s enjoyment of the products that google ships.  Ultimately Mr. Bowman left because when it came to promoting a new design thinking, it felt like "Google was a massive aircraft carrier, and I was just a small dinghy trying to push it a few degrees North."<br />
By data driven design, I am referring to the approach that says, anything at the GUI level needs to be tested with users and measured empirically using standard metrics like speed, efficiency, error rate, etc.  I don't disagree that given a problem, the more data I as a designer have, the better my design solution will be.  However, I don't think it's even realistic to think that every little nook and cranny in on a web app can be tested on, and even if it were, I agree that that type of thinking can create design paralysis under the wrong conditions.<br />
As it turns out, although Google may suggest that it's product's interface designs are completely performance and data driven, that isn't possible.  The subjective, aesthetic decisions are made, it's just a matter of who makes them.  Those with an engineering or hard science background will invariably have more say in the direction the company takes, including the way it goes about designing its products. One such person is Marissa Mayer, who controls the look and feel of the search engine and related products.  According to a <a href="http://www.nytimes.com/2009/03/01/business/01marissa.html" rel="nofollow" >New York Times article</a> recently written about her, and her role at the company, "Almost every new feature or design, from the wording on a Google page to the color of a Google toolbar, must pass muster with her or legions of Google users will never see it."  The article makes it clear that although they like to test as many design decisions as possible, Mrs. Mayer makes many design decisions absent any hard data.  For instance,</p>
<blockquote><p>Google’s home page — spartan white embroidered with splashes of blue, red, yellow and green — mirrors her Wausau home and her penthouse.<br />
“It used to be people would come over to my apartment and say, ‘Does your apartment look like Google or does Google look like your apartment?’ ” she says with a staccato laugh that has earned a following of its own in Silicon Valley. “I can’t articulate it anymore. I really love color. I’m not very knick-knacky or cluttery. My place has very clean, simple lines. There are some elements of fun and whimsy. That has always appealed to me.”</p></blockquote>
<p>So it's clear that google does rely on the subjective decisions of some people when it comes to product design.  I have no problem with that.  But they should be honest with themselves about how they design, and stop insisting to us and to themselves that everything is numbers driven.   Embrace design as a distinct culture within Google.  Discourage the culture that would require designers to prove every design decision.  Realize that visual designers have something important to provide and then give them leadership positions so they can have the influence google needs them to.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/03/data-driven-design-and-the-culture-at-google/">Data Driven Design and the Culture at Google</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2007/06/visual-design-2/' rel='bookmark' title='Permanent Link: Visual Design as a Balancing Act'>Visual Design as a Balancing Act</a></li><li><a href='http://www.pathf.com/blogs/2009/08/designing-wireframes-visual-design/' rel='bookmark' title='Permanent Link: Developing Good Wireframes Ahead of Visual Design'>Developing Good Wireframes Ahead of Visual Design</a></li><li><a href='http://www.pathf.com/blogs/2009/09/does-your-project-have-code-ownership-culture/' rel='bookmark' title='Permanent Link: Does your project have Code Ownership Culture?'>Does your project have Code Ownership Culture?</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/03/data-driven-design-and-the-culture-at-google/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bean of the Devil: Arguing the Affirmative</title>
		<link>http://www.pathf.com/blogs/2009/03/bean-of-the-devil-arguing-the-affirmative/</link>
		<comments>http://www.pathf.com/blogs/2009/03/bean-of-the-devil-arguing-the-affirmative/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 21:29:22 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
				<category><![CDATA[Custom Application Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Rich Internet Apps]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Software Development Best Practices]]></category>
		<category><![CDATA[Technologies and Platforms]]></category>
		<category><![CDATA[Antipatterns]]></category>
		<category><![CDATA[Beans]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1412</guid>
		<description><![CDATA[I've gotten lots of feedback, much of it asking "what's the alternative?" to using beans and getters and setters. I'll make a deal with my skeptical readers. I'll argue the negative, with examples, if they argue the affirmative. In other words, you show me some places where you can't get around using getters and setters [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/03/bean-of-the-devil-arguing-the-affirmative/">Bean of the Devil: Arguing the Affirmative</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/02/bean-of-the-devil-why-getters-setters-and-such-are-evil/' rel='bookmark' title='Permanent Link: Bean of the Devil: Why Getters, Setters and Such are Evil'>Bean of the Devil: Why Getters, Setters and Such are Evil</a></li><li><a href='http://www.pathf.com/blogs/2009/03/bean-of-the-devil-tally-ho-cms/' rel='bookmark' title='Permanent Link: Bean of the Devil: Tally-Ho CMS'>Bean of the Devil: Tally-Ho CMS</a></li><li><a href='http://www.pathf.com/blogs/2008/05/ruby-internals/' rel='bookmark' title='Permanent Link: Ruby Internals: Overriding Object.require() to watch files as they are loaded'>Ruby Internals: Overriding Object.require() to watch files as they are loaded</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pathf.com/blogs/wp-content/uploads/2009/02/bean.jpg"><img class="alignnone size-full wp-image-1409" style="float:right; padding:10px" title="bean" src="http://www.pathf.com/blogs/wp-content/uploads/2009/02/bean.jpg" alt="" width="100" height="100" /></a>I've gotten lots of feedback, much of it asking "what's the alternative?" to using beans and getters and setters. I'll make a deal with my skeptical readers. I'll argue the negative, with examples, if they argue the affirmative. In other words, you show me some places where you can't get around using getters and setters and I'll show you all sorts of places for the next few weeks, from real open source projects, where people have screwed the pooch with unnecessary getters and setters.</p>
<p><span id="more-1412"></span></p>
<p>For my first trick, I give you <code>JChemPaint.java</code> from the JChemPaint project:</p>
<pre class="java5">  <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>file.<span style="color: #006600;">getName</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">toLowerCase</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">endsWith</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;.cml&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#123;</span>
    FileUtils.<span style="color: #006600;">saveModeltoCMLfile</span><span style="color: #66cc66;">&#40;</span>file, getCurrentModel<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span>
  <span style="color: #b1b100;">else</span>
  <span style="color: #66cc66;">&#123;</span>
    FileUtils.<span style="color: #006600;">saveModeltoMDLMolfile</span><span style="color: #66cc66;">&#40;</span>file, getCurrentModel<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span></pre>
<p>This little beauty sits inside a Swing Action's <code>actionPerformed()</code> method. Sweet. There's similar logic for loading and renaming files as well. The point is that this logic shouldn't be sitting in the UI layer at all. It should probably reside in <code>FileUtils</code>. If you want to go a touch farther, you could have a working document model that contains the file name, whether the model has been modified without being saved (a "dirty" flag), etc. This would wrap the base model and intercept calls that might necessitate updating the dirty flag.</p>
<p>There are other ways to go here, but I think you can see how the tempting <code>getName()</code> led to introduction of file name extension logic here.</p>
<p>OK, tag, you're it. I look forward to seeing cases where getters and setters are absolutely necessary.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/03/bean-of-the-devil-arguing-the-affirmative/">Bean of the Devil: Arguing the Affirmative</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/02/bean-of-the-devil-why-getters-setters-and-such-are-evil/' rel='bookmark' title='Permanent Link: Bean of the Devil: Why Getters, Setters and Such are Evil'>Bean of the Devil: Why Getters, Setters and Such are Evil</a></li><li><a href='http://www.pathf.com/blogs/2009/03/bean-of-the-devil-tally-ho-cms/' rel='bookmark' title='Permanent Link: Bean of the Devil: Tally-Ho CMS'>Bean of the Devil: Tally-Ho CMS</a></li><li><a href='http://www.pathf.com/blogs/2008/05/ruby-internals/' rel='bookmark' title='Permanent Link: Ruby Internals: Overriding Object.require() to watch files as they are loaded'>Ruby Internals: Overriding Object.require() to watch files as they are loaded</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/03/bean-of-the-devil-arguing-the-affirmative/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Bean of the Devil: Why Getters, Setters and Such are Evil</title>
		<link>http://www.pathf.com/blogs/2009/02/bean-of-the-devil-why-getters-setters-and-such-are-evil/</link>
		<comments>http://www.pathf.com/blogs/2009/02/bean-of-the-devil-why-getters-setters-and-such-are-evil/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 01:03:56 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
				<category><![CDATA[Custom Application Development]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Rich Internet Apps]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Software Development Best Practices]]></category>
		<category><![CDATA[Technologies and Platforms]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Object-Oriented]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=1408</guid>
		<description><![CDATA[I felt like I'd already gotten this rant out of my system, but every time I come across the object oriented wreckage that the Java Bean and it's decendents have wrought, I get all heated up. The problem is, simply stated, that the getters and setters that get used for things like system boundaries -- [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/02/bean-of-the-devil-why-getters-setters-and-such-are-evil/">Bean of the Devil: Why Getters, Setters and Such are Evil</a></p>



Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/03/bean-of-the-devil-arguing-the-affirmative/' rel='bookmark' title='Permanent Link: Bean of the Devil: Arguing the Affirmative'>Bean of the Devil: Arguing the Affirmative</a></li><li><a href='http://www.pathf.com/blogs/2009/03/bean-of-the-devil-tally-ho-cms/' rel='bookmark' title='Permanent Link: Bean of the Devil: Tally-Ho CMS'>Bean of the Devil: Tally-Ho CMS</a></li><li><a href='http://www.pathf.com/blogs/2007/09/scriptaculous-a/' rel='bookmark' title='Permanent Link: Scriptaculous and Why &#8216;extends&#8217; is Evil'>Scriptaculous and Why &#8216;extends&#8217; is Evil</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pathf.com/blogs/wp-content/uploads/2009/02/bean.jpg"><img class="alignnone size-full wp-image-1409" style="float:right; padding:10px" title="bean" src="http://www.pathf.com/blogs/wp-content/uploads/2009/02/bean.jpg" alt="" width="100" height="100" /></a>I felt like I'd already gotten this rant out of my system, but every time I come across the object oriented wreckage that the Java Bean and it's decendents have wrought, I get all heated up. The problem is, simply stated, that the getters and setters that get used for things like system boundaries -- Hibernate for persistence, Spring for dependency injection, Java Beans for UI components -- end up being misused for things that break basic OO principles.</p>
<p><span id="more-1408"></span></p>
<p>How do these pernicious little getters and setters undermine OO? Let me count the ways.</p>
<ol>
<li>Encapsulation: the detailed implementation of an object is hidden from the rest of the system. Yes, yes, 99.99999% of all getters and setters are just fronting a private field and that's bad enough, but this is more about the getters, pulling data out of the object and doing things with it outside the object. They leak out, bit by bit, until you repeat yourself all over the place with slightly different manipulations of the data. Before you know it, you are looking at a siloed procedural applications that spurred the invention of OO in the first place.</li>
<li>Polymorphism: one type can substituted for another. If your implementation is out there flapping in the breeze, it's hard to swap types. Even if you do, the application of polymorphism is usually pretty weak. Leaking implementation into the collaborating classes really ties your hands.</li>
<li>High Cohesion: responsibilities of an object are strongly related and focused. If you pull information out of objects and deal with it in the collaborating objects, the cohesion is going to be progressively more diffuse.</li>
<li>Low Coupling: low dependencies between classes, low impact of changes in a class on other classes and high reuse potential. This is a killer. Again, you have your implementation info spread all over the countryside like in a procedural application. You change the implementation and you are in for a mega refactoring.</li>
<li>Information Expert: the responsibility goes to the object with all the relevant information. When you leak data into the collaborating classes, how can you identify the information expert?</li>
</ol>
<p>There's more, of course, but the worst part is that in a system with getters and setters, the rot gets worse the longer the system is under development. A little enhancement can be done so easily by pulling an integer here, a string there and doing a little dance in a method without arranging the collaboration of necessary classes. You need to refactor and refactor to stem the tide. It is a problem of your own making that costs you time and budget.</p>
<p>So, think twice before you expose everything with getters and setters. I would argue that they be the exception and not the rule. A rare sprinking to season the system boundaries.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder Development - creating innovative software that builds business value. </a>
<br/><br/><a href="http://www.pathf.com/blogs/2009/02/bean-of-the-devil-why-getters-setters-and-such-are-evil/">Bean of the Devil: Why Getters, Setters and Such are Evil</a></p>


<p>Related posts:<ol><li><a href='http://www.pathf.com/blogs/2009/03/bean-of-the-devil-arguing-the-affirmative/' rel='bookmark' title='Permanent Link: Bean of the Devil: Arguing the Affirmative'>Bean of the Devil: Arguing the Affirmative</a></li><li><a href='http://www.pathf.com/blogs/2009/03/bean-of-the-devil-tally-ho-cms/' rel='bookmark' title='Permanent Link: Bean of the Devil: Tally-Ho CMS'>Bean of the Devil: Tally-Ho CMS</a></li><li><a href='http://www.pathf.com/blogs/2007/09/scriptaculous-a/' rel='bookmark' title='Permanent Link: Scriptaculous and Why &#8216;extends&#8217; is Evil'>Scriptaculous and Why &#8216;extends&#8217; is Evil</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/02/bean-of-the-devil-why-getters-setters-and-such-are-evil/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 3.390 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2010-03-22 05:13:07 -->
