<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Mr Paul Woods&#039;s Weblog</title>
	<atom:link href="http://mrpaulwoods.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://mrpaulwoods.wordpress.com</link>
	<description>Life of a One-Man-Shop Software Engineer</description>
	<lastBuildDate>Mon, 24 Dec 2012 15:53:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='mrpaulwoods.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Mr Paul Woods&#039;s Weblog</title>
		<link>http://mrpaulwoods.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://mrpaulwoods.wordpress.com/osd.xml" title="Mr Paul Woods&#039;s Weblog" />
	<atom:link rel='hub' href='http://mrpaulwoods.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Implementing Burt Beckwith&#8217;s GORM Performance &#8211; No Collections</title>
		<link>http://mrpaulwoods.wordpress.com/2011/02/07/implementing-burt-beckwiths-gorm-performance-no-collections/</link>
		<comments>http://mrpaulwoods.wordpress.com/2011/02/07/implementing-burt-beckwiths-gorm-performance-no-collections/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 05:59:52 +0000</pubDate>
		<dc:creator>mrpaulwoods</dc:creator>
				<category><![CDATA[grails]]></category>

		<guid isPermaLink="false">http://mrpaulwoods.wordpress.com/?p=26</guid>
		<description><![CDATA[No More GORM/Hibernate Collections? Mr. Burt Beckwith http://burtbeckwith.com/ gave a talk on improving GORM performance in Grails. His presentation is available at http://www.infoq.com/presentations/GORM-Performance. A point of his was to not use collections on your domain objects because the collections may need to be fully loaded from the database before objects can be added. I decided to use it [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mrpaulwoods.wordpress.com&#038;blog=3630989&#038;post=26&#038;subd=mrpaulwoods&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<h1>No More GORM/Hibernate Collections?</h1>
<p>Mr. Burt Beckwith <a href="http://burtbeckwith.com/">http://burtbeckwith.com/</a> gave a talk on improving GORM performance in Grails. His presentation is available at <a title="http://www.infoq.com/presentations/GORM-Performance" href="http://www.infoq.com/presentations/GORM-Performance">http://www.infoq.com/presentations/GORM-Performance</a>.</p>
<p>A point of his was to not use collections on your domain objects because the collections may need to be fully loaded from the database before objects can be added.</p>
<p>I decided to use it on one of my work projects. This project has 18 domain classes. I ran into a few problems, scratched my head for a few hours, then I was able to fix them. It took about 1/2 day to update the project from a &#8220;hasMany/belongsTo&#8221; style to a no collection style. Here is a very-simplified domain that uses a typical gorm one-to-many cascading relationship.</p>
<h1>Sample Shopping Cart Application</h1>
<p>Lets start with sample code of a Shopping Cart. We have a Cart object that contains many Item objects.</p>
<h2>Typical GORM Relationship</h2>
<p><strong>grails-app\domain\shopping\Cart.groovy</strong><br />
<pre class="brush: groovy;">
package shopping

class Cart {

	String name

	static hasMany = [ items : Item ]

	static mapping = {
		sort &quot;name&quot;
		items sort:&quot;name&quot;
	}

    static constraints = {
    	name nullable:false, blank:false, unique:true
    }

    String toString() {
    	&quot;Cart $name&quot;
    }
}
</pre></p>
<p><strong>grails-app\domain\shopping\Item.groovy</strong><br />
<pre class="brush: groovy;">
package shopping

class Item {

	String name
	Integer quantity

	static belongsTo = [ cart : Cart ]

	static mapping = {
		sort &quot;name&quot;
	}

    static constraints = {
    	name nullable:false, blank:false, unique:['cart']
    	quantity nullable:false
    }

    String toString() {
    	&quot;$quantity $name&quot;
    }
}
</pre></p>
<p><strong>grails-app\conf\BootStrap.groovy</strong><br />
<pre class="brush: groovy;">
import shopping.*

class BootStrap {

    def init = { servletContext -&gt;
    
    	def cart = new Cart(name:&quot;alpha&quot;).save()
    	cart.addToItems new Item(name:&quot;apples&quot;, quantity:10)
    	cart.addToItems new Item(name:&quot;milk&quot;, quantity:2)
    	cart.addToItems new Item(name:&quot;bread&quot;, quantity:3)
    	cart.save()
    }

    def destroy = {
    }
}
</pre></p>
<h1>Removing hasMany and belongsTo</h1>
<p>Now, following Burt&#8217;s advice, we remove the belongsTo and hasMany relationship, and embed a the parent object in the child.</p>
<p>Now our code looks like this:</p>
<h2>BelongsTo and HasMany Removed</h2>
<p><strong>grails-app\domain\shopping\Cart.groovy</strong><br />
<pre class="brush: groovy;">
package shopping

class Cart {
	
	String name
	
	static mapping = {
		sort &quot;name&quot;
	}
	
    static constraints = {
    	name nullable:false, blank:false, unique:true
    }
    
    String toString() {
    	&quot;Cart $name&quot;
    }
}
</pre></p>
<p><strong>grails-app\domain\shopping\Item.groovy</strong><br />
<pre class="brush: groovy;">
package shopping

class Item {
	
	String name
	Integer quantity
	Cart cart
	
	static mapping = {
		sort &quot;name&quot;
	}
	
    static constraints = {
    	name nullable:false, blank:false, unique:['cart']
    	quantity nullable:false
    }
    
    String toString() {
    	&quot;$quantity $name&quot;
    }
}
</pre></p>
<p><strong>grails-app\conf\BootStrap.groovy</strong><br />
<pre class="brush: groovy;">
import shopping.*

class BootStrap {

    def init = { servletContext -&gt;
    	def cart = new Cart(name:&quot;alpha&quot;).save()
    	new Item(cart:cart, name:&quot;apples&quot;, quantity:10).save()
    	new Item(cart:cart, name:&quot;milk&quot;, quantity:2).save()
    	new Item(cart:cart, name:&quot;bread&quot;, quantity:3).save()
    }
    
    def destroy = {
    }
}
</pre></p>
<p>Here&#8217;s what changed.</p>
<p><strong>in Cart.groovy</strong></p>
<ul>
<li>removed static hasMany = [ items : Item ]</li>
<li>removed items sort:&#8221;name&#8221; from mappings</li>
</ul>
<p><strong>in Item.groovy</strong></p>
<ul>
<li>removed belongsTo</li>
<li>added Cart cart</li>
</ul>
<p><strong>in BootStrap.groovy</strong></p>
<ul>
<li>Changed the way we created child objects.</li>
<ul>
<li>from: cart.addToItems new Item(name:&#8221;apples&#8221;, quantity:10)</li>
<li>to  : new Item(cart:cart, name:&#8221;apples&#8221;, quantity:10)</li>
</ul>
</ul>
<h1>New Problems and Solutions</h1>
<p>Are we done? Of course not &#8211; it&#8217;s not quite that easy. There were a few other problems that needed to be addressed:</p>
<ol>
<li>No longer have easy access to the collection of child items.</li>
<li>Sorting of collections (defined in mapping) no longer takes place.</li>
<li>Can&#8217;t delete the parent object because of foreign-key relationships.</li>
<li>Scaffolding no longer shows the child objects.</li>
</ol>
<p>Lets solve these, one-at-a-time.</p>
<h2>No longer have easy access to the collection of child items</h2>
<p>This is easily fixed. We just add a new method to the parent object (Cart) that returns the collection of child objects (Item) that are in the cart:</p>
<p><strong>grails-app\domain\shopping\Cart.groovy</strong><br />
<pre class="brush: groovy;">
    ....
    def getItems() {
    	Items.findAllByCart(this)
    }
    ....
</pre></p>
<h2>Sorting of collections (defined in mapping) no longer takes place.</h2>
<p>This is also easy. We just need a slight modification to the code above. We can add a sort parameter to the findAllBy* method.</p>
<p><strong>grails-app\domain\shopping\Cart.groovy</strong><br />
<pre class="brush: groovy;">
    ....
    def getItems() {
        Item.findAllByCart(this, [sort:&quot;name&quot;])
    }
    ....
</pre></p>
<p>Now, we can access the cart&#8217;s items just like we did when we had a hasMany relationship.</p>
<p><pre class="brush: groovy;">
    println cart.items
</pre></p>
<h2>Can&#8217;t delete the parent object because of foreign-key relationships.</h2>
<p>This was the head-scratcher. Not because it&#8217;s difficult, but it took a little research to find a elegant solution.</p>
<p>The problem is if we do a cart.delete(), it will fail it there are items in the cart. The old hasMany / belongsTo solution would automatically cascade-delete the items, and the cart. We don&#8217;t have that now, so we must do it manually.</p>
<p>The best solution that I know of (let me know if there is a better one) is to use the beforeDelete event on the Cart object.</p>
<p>Before a object is deleted, GORM fires the beforeDelete event. You can place code in it to do whatever you want. In our case, we will delete the child Item objects. Take a look at the documentation for <a href="http://grails.org/doc/latest/guide/5.%20Object%20Relational%20Mapping%20(GORM).html#5.5.1 Events and Auto Timestamping">beforeDelete </a>.</p>
<p>Lets update the Cart.groovy code and add the beforeDelete method.</p>
<p><strong>grails-app\domain\shopping\Cart.groovy</strong><br />
<pre class="brush: groovy;">
    ....
    def beforeDelete() {
        Item.withNewSession { items*.delete() }	
    }
    ....
</pre></p>
<p>(This is what I love about groovy &#8211; one line of code does so much work!)</p>
<p>First, we create a new hibernate session. If you read the docs for beforeDelete, you know that (in this case) you should use a new session for the delete in order to avoid StackOverflow exceptions.</p>
<p>Next, we delete all of the child items. We use groovy&#8217;s spread operation to call a method on all items in a list. </p>
<p>So, with that line of code, all child objects (Item) will be deleted when the parent object (Cart) is deleted.</p>
<h2>Scaffolding no longer shows the child objects.</h2>
<p>Since the parent object no longer knows about the child objects, the default grails scaffolding will now longer display the items in a cart. I don&#8217;t know a way around this, other than not using scaffolding.</p>
<h1>Final Cart and Item Code</h1>
<p><strong>grails-app\domain\shopping\Cart.groovy</strong><br />
<pre class="brush: groovy;">
package shopping

class Cart {
	
	String name

	static mapping = {
		sort &quot;name&quot;
	}

	static constraints = {
		name nullable:false, blank:false, unique:true
	}

	String toString() {
		&quot;Cart $name&quot;
	}

	def getItems() {
		Item.findAllByCart(this, [sort:&quot;name&quot;])
	}

	def beforeDelete() {
		Item.withNewSession { items*.delete() }	
	}
    
}
</pre></p>
<p><strong>grails-app\domain\shopping\Item.groovy</strong><br />
<pre class="brush: groovy;">
package shopping

class Item {

	String name
	Integer quantity
	Cart cart

	static mapping = {
		sort &quot;name&quot;
	}

	static constraints = {
		name nullable:false, blank:false, unique:['cart']
		quantity nullable:false
	}

	String toString() {
		&quot;$quantity $name&quot;
	}
}
</pre></p>
<h1>My Opinions</h1>
<h2>Implementation Difficulty</h2>
<p>Once I worked out how to implement this solution, installing it in my domain objects was pretty simple. Remember that you may need to update any code that uses addTo* and removeFrom* methods</p>
<h2>Complexity / Maintenance</h2>
<p>Does this solution make my apps more complex to understand? I don&#8217;t think so. A experienced groovy person can understand the cart.getItems() method. The beforeDelete will take a little time to understand, but it is quickly learned.</p>
<p>Also there is complexity in using belongsTo / hasMany. See <a href="http://blog.springsource.com/2010/07/02/gorm-gotchas-part-2/">GORM Gotchas Part 2</a>. I don&#8217;t think this solution is any more complex the using belongsTo / hasMany.</p>
<h2>Performance</h2>
<p>Don&#8217;t know yet. I don&#8217;t have any real-world apps that I considered the loading of child objects to be a performance problem.</p>
<h2>Would I Do It Again</h2>
<p>Definitely. I had a project fall-apart because it has &gt; 20 objects and &gt;30 relationships between objects. Hibernate and GORM were causing various exceptions, and at the time I was too inexperienced to know how to solve the problems. I am considering attempting that project again, using this &#8220;no collections&#8221; technique to see if I can finish the project. I have a good feeling that this method will work, but I need to prove it.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mrpaulwoods.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mrpaulwoods.wordpress.com/26/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mrpaulwoods.wordpress.com&#038;blog=3630989&#038;post=26&#038;subd=mrpaulwoods&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://mrpaulwoods.wordpress.com/2011/02/07/implementing-burt-beckwiths-gorm-performance-no-collections/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/fa098f1d6be195aa1cb7b21756511b1d?s=96&#38;d=identicon&#38;r=PG" medium="image">
			<media:title type="html">mrpaulwoods</media:title>
		</media:content>
	</item>
		<item>
		<title>A Pattern to Simplify Grails Controllers</title>
		<link>http://mrpaulwoods.wordpress.com/2011/01/23/a-pattern-to-simplify-grails-controllers/</link>
		<comments>http://mrpaulwoods.wordpress.com/2011/01/23/a-pattern-to-simplify-grails-controllers/#comments</comments>
		<pubDate>Sun, 23 Jan 2011 20:24:59 +0000</pubDate>
		<dc:creator>mrpaulwoods</dc:creator>
				<category><![CDATA[grails]]></category>

		<guid isPermaLink="false">http://mrpaulwoods.wordpress.com/?p=6</guid>
		<description><![CDATA[The WithDomainObject Pattern Note, the sample code was modified on 5/18/2011. The withPerson method is now private. I generally follow the same patterns with my controllers. They start with &#8220;the big 7 actions&#8221; &#8211; closures for index, list, show, create, save, edit, update and delete. Then i include any necessary controller-specific actions. After unit testing my [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mrpaulwoods.wordpress.com&#038;blog=3630989&#038;post=6&#038;subd=mrpaulwoods&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<h2>The WithDomainObject Pattern</h2>
<p><strong>Note, the sample code was modified on 5/18/2011. The withPerson method is now private.</strong></p>
<p>I generally follow the same patterns with my controllers. They start with &#8220;the big 7 actions&#8221; &#8211; closures for index, list, show, create, save, edit, update and delete. Then i include any necessary controller-specific actions. After unit testing my controllers for the up-teenth time, I realized that there is a consistent pattern for many of the actions &#8211; get the id from params, get the domain object, then use the domain object. I wanted to extract this pattern into its own method, and that extraction evolved into the &#8220;WithDomainObject&#8221; pattern.</p>
<h2>The Problem</h2>
<p>Lets say you had a contact manager application, and you had a domain object called Person and a controller called PersonController. In the controllers show, save, edit, update and delete actions all follow the same pattern:</p>
<ol>
<li>Get the ID from the params map.</li>
<li>Get the person from the domain.</li>
<li>Doing something with the person.</li>
</ol>
<p>The problem is that steps 1 and 2 are repeated for the 5 actions. Not very DRY.</p>
<h2>The Solution</h2>
<p>Lets encapsulate steps 1 and 2 into a method called withPerson:</p>
<p><pre class="brush: groovy;">
	private def withPerson(id=&quot;id&quot;, Closure c) {
		def person = Person.get(params[id])
		if(person) {
			c.call person
		} else {
			flash.message = &quot;The person was not found.&quot;
			redirect action:&quot;list&quot;
		}
	}
}
</pre></p>
<p>and lets put our code from step 3 into its own anonymous closure. Heres a example of a action that uses the withPerson method and the update action:</p>
<p><pre class="brush: groovy;">
	def update = {
		withPerson { person -&gt;
			person.properties = params
			if(person.validate() &amp;&amp; person.save()) {
				redirect action:&quot;show&quot;, id:person.id
			} else {
				render view:&quot;edit&quot;, model:[person:person]
			}
		}
	}
</pre></p>
<h2>Example </h2>
<p>See the withPerson method at the botttom of the controller.</p>
<h2>The Person domain class</h2>
<p><pre class="brush: groovy;">

package contact

class Person {

	String name

        static constraints = {
    	    name blank:false, unique:true
    }
}

</pre></p>
<h2>The PersonController controller</h2>
<p><pre class="brush: groovy;">

package contact

class PersonController {

	def index = {
		redirect action:&quot;list&quot;, params:params
	}

	def list = {
		[ people:Person.list(params), count:Person.count() ]
	}

	def show = {
		withPerson { person -&gt;
			[person:person]
		}
	}

	def create = {
		[person:new Person()]
	}

	def save = {
		def person = new Person(params)
		if(person.validate() &amp;&amp; person.save()) {
			redirect action:&quot;show&quot;, id:person.id
		} else {
			render view:&quot;create&quot;, model:[person:person]
		}
	}

	def edit = {
		withPerson { person -&gt;
			[person:person]
		}
	}

	def update = {
		withPerson { person -&gt;
			person.properties = params
			if(person.validate() &amp;&amp; person.save()) {
				redirect action:&quot;show&quot;, id:person.id
			} else {
				render view:&quot;edit&quot;, model:[person:person]
			}
		}
	}

	def delete = {
		withPerson { person -&gt;
			person.delete()
			redirect action:&quot;list&quot;
		}
	}

	private def withPerson(id=&quot;id&quot;, Closure c) {
		def person = Person.get(params[id])
		if(person) {
			c.call person
		} else {
			flash.message = &quot;The person was not found.&quot;
			redirect action:&quot;list&quot;
		}
	}

}

</pre></p>
<h2>The PersonControllerTests unit tests</h2>
<p><pre class="brush: groovy;">

package contact

import grails.test.*
import org.junit.*

class PersonControllerTests extends ControllerUnitTestCase {

    def p7 = new Person(id:7, name:&quot;alpha&quot;)
    def p9 = new Person(id:9, name:&quot;beta&quot;)

    @Before
    public void setUp() {
        super.setUp()
    	mockDomain Person, [p7,p9]
    }

    @After
    public void tearDown() {
        super.tearDown()
    }

    @Test
    public void index() {
		controller.index()
		assert &quot;list&quot; == controller.redirectArgs.action
    }

    @Test
    public void list() {
    	def model = controller.list()
    	assert 2 == model.people.size()
    	assert p7 == model.people[0]
    	assert p9 == model.people[1]
    	assert 2 == model.count
    }

    @Test
    public void show() {
    	controller.params.id = 7
    	def model = controller.show()
    	assert p7 == model.person
    }

    @Test
    public void create() {
    	def model = controller.create()
    	assert model.person instanceof Person
    }

    @Test
    public void save_success() {
    	controller.params.name = &quot;Paul Woods&quot;
    	controller.save()
    	assert &quot;show&quot; == controller.redirectArgs.action
    	assert null != controller.redirectArgs.id
    }

    @Test
    public void save_failure() {
    	controller.params.name = &quot;&quot;
    	controller.save()
    	assert &quot;create&quot; == controller.renderArgs.view
    	assert controller.renderArgs.model.person instanceof Person
    }

    @Test
    public void edit() {
    	controller.params.id = 9
    	def model = controller.edit()
    	assert p9 == model.person
    }

    @Test
    public void update_success() {
    	controller.params.name = &quot;Paul Woods&quot;
    	controller.params.id = 7
    	controller.update()
    	assert &quot;show&quot; == controller.redirectArgs.action
    	assert 7 == controller.redirectArgs.id
    }

    @Test
    public void update_failure() {
    	controller.params.name = &quot;&quot;
    	controller.params.id = 9
    	controller.update()
    	assert &quot;edit&quot; == controller.renderArgs.view
    	assert controller.renderArgs.model.person instanceof Person
    }

    @Test
    public void delete() {
    	controller.params.id = 7
    	controller.delete()
    	assert &quot;list&quot; == controller.redirectArgs.action
    	assert 1 == Person.count()
    }

    @Test
    public void withPerson_success() {
    	controller.params.id = 7
    	def person = null
    	controller.withPerson() { p -&gt;
    		person = p
    	}

    	assert 7 == person.id
    }

    @Test
    public void withPerson_fail() {
    	controller.params.id = 0
    	controller.withPerson() { p -&gt;
    		assert false
    	}
	assert &quot;The person was not found.&quot; == controller.flash.message
	assert &quot;list&quot; == controller.redirectArgs.action
   }

}

</pre></p>
<h2>Advantages of this Pattern:</h2>
<ol>
<li>The controller actions are simpler, as they don&#8217;t require code to detect not-found domain objects.</li>
<li>The unit tests can be simpler. There is less code to test.</li>
</ol>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mrpaulwoods.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mrpaulwoods.wordpress.com/6/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mrpaulwoods.wordpress.com&#038;blog=3630989&#038;post=6&#038;subd=mrpaulwoods&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://mrpaulwoods.wordpress.com/2011/01/23/a-pattern-to-simplify-grails-controllers/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/fa098f1d6be195aa1cb7b21756511b1d?s=96&#38;d=identicon&#38;r=PG" medium="image">
			<media:title type="html">mrpaulwoods</media:title>
		</media:content>
	</item>
		<item>
		<title>Dallas TechFest 2008</title>
		<link>http://mrpaulwoods.wordpress.com/2008/05/05/dallas-techfest-2008/</link>
		<comments>http://mrpaulwoods.wordpress.com/2008/05/05/dallas-techfest-2008/#comments</comments>
		<pubDate>Mon, 05 May 2008 21:11:31 +0000</pubDate>
		<dc:creator>mrpaulwoods</dc:creator>
				<category><![CDATA[training]]></category>
		<category><![CDATA[DallasTechFest]]></category>

		<guid isPermaLink="false">http://mrpaulwoods.wordpress.com/?p=3</guid>
		<description><![CDATA[I went to the Dallas Tech Fest last Saturday. They offered several dozen 1-hour sessions throught the day.  I attended many of the Java sessions and one of the Microsoft Robotics sessions. &#8220;Strange Pervisions in Java Bytecode&#8221; &#8211; Ben Rady I&#8217;ve never messed with the java bytecode. Ben demonstrated the javap command that shows the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mrpaulwoods.wordpress.com&#038;blog=3630989&#038;post=3&#038;subd=mrpaulwoods&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I went to the Dallas Tech Fest last Saturday. They offered several dozen 1-hour sessions throught the day.  I attended many of the Java sessions and one of the Microsoft Robotics sessions.</p>
<p>&#8220;Strange Pervisions in Java Bytecode&#8221; &#8211; Ben Rady</p>
<p>I&#8217;ve never messed with the java bytecode. Ben demonstrated the javap command that shows the byte codes in the .class files. I can see how this can lead to better code, but the complexity it adds will probably keep me from using it.</p>
<p>&#8220;Pardon the Interruption: What&#8217;s the deal with Groovy?&#8221; &#8211; Paul Holser, Derek Lane</p>
<p>Paul and Derek introduced groovy &#8211; a scripting language that compiles into java byte code. I&#8217;m taking a closer look at Grooy, as it seems to reduct the amount of coding needed to get work done.</p>
<p>&#8220;Spring In Action&#8221; &#8211; Craig Walls</p>
<p>Craig, the author of &#8220;Spring in Action&#8221; introduced Spring 2.5. I&#8217;ve messed with spring in the past, but never enough to use it in one of my projects. I an going to use it in a future project (or a older one that needs to be updated). I am curious how the MVC function in Spring compares with Servlets and JSP.</p>
<p>&#8220;Microsoft Robotics&#8221; &#8211; Phil Wheat</p>
<p>Ater several hours of serious sessions, I decided to relax in the robotics session. Of course, it had some of the most complex material in the sessions. Try controlling a robot , and having it react to its sensors in real time, and supporting concurreny and multiple processors.</p>
<p>Now, being a Software Engineer and Electronic Technician, I think I will get back into robotics.</p>
<p> </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/mrpaulwoods.wordpress.com/3/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/mrpaulwoods.wordpress.com/3/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mrpaulwoods.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mrpaulwoods.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mrpaulwoods.wordpress.com&#038;blog=3630989&#038;post=3&#038;subd=mrpaulwoods&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://mrpaulwoods.wordpress.com/2008/05/05/dallas-techfest-2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/fa098f1d6be195aa1cb7b21756511b1d?s=96&#38;d=identicon&#38;r=PG" medium="image">
			<media:title type="html">mrpaulwoods</media:title>
		</media:content>
	</item>
	</channel>
</rss>
