<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3711335003390554188</id><updated>2012-01-24T11:31:22.905-08:00</updated><category term='mocks'/><category term='mac rails rspec cucumber gem gems uninstalling version error problem issue'/><category term='mountain biking'/><category term='Cucumber'/><category term='Rails Rspec validates_email_format_of model_validation'/><category term='Groovy'/><category term='Rspec'/><category term='Rails'/><title type='text'>Jiggy Pete says</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jiggypete.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jiggypete.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Peter Aitken</name><uri>http://www.blogger.com/profile/17656998844052804342</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3711335003390554188.post-6244527925853308457</id><published>2011-03-03T01:35:00.000-08:00</published><updated>2011-03-03T01:41:34.267-08:00</updated><title type='text'>Charity Work</title><content type='html'>As most of you will know myself and five friends are raising funds for Maggie's Centres as well as training for their &lt;a href="http://www.maggiescentres.org/eventsfundraising/events/monsterhike/about.html"&gt;Bike'n'Hike&lt;/a&gt; event.&lt;br /&gt;&lt;br /&gt;From the &lt;a href="http://www.maggiescentres.org/about/introduction.html"&gt;Maggies webite&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;What is a Maggie's Centre?&lt;br /&gt;A Maggie’s Centre is a place to turn to for help with any of the problems, small or large, associated with cancer. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One in three people are affected by cancer, that is a terrifying ratio. Having visited the Glasgow Centre it is clear how incredibly important this charity is to people at a harrowing time in their life.&lt;br /&gt;&lt;br /&gt;So what do I intend to do to help raise funds I hear you ask?&lt;br /&gt;I am offering my services as an Agile Coach and Developer to anyone who is willing to donate £500 or more per day to Maggies Cancer Centres. &lt;br /&gt;&lt;br /&gt;What do you get for your donation over and above a warm fuzzy feeling for helping out a much in need charity?&lt;br /&gt;Presumably the overarching goal for your company is that I can help your team make more ( or save more ) money faster.&lt;br /&gt;&lt;br /&gt;How can I help achieve that with your software development team? &lt;br /&gt;* Introduce Agile Techniques and the values of Communication, Feedback, Simplicity and Courage.&lt;br /&gt;* Aid improvement of the teams current process&lt;br /&gt;* Pair up with developers to improve technical skills like Acceptance Testing, TDD, and Refactoring.&lt;br /&gt;&lt;br /&gt;I have added a section about my experience to date below. If it sounds like I could be of benefit to your company or development team why not get in touch and make me an offer?&lt;br /&gt;&lt;br /&gt;In summary, I am offering my services for a period of up to 5 days to help your team or develop software. Ideally this would be in early April, and for each day onsite you would donate at least £500 to Maggies Centres via &lt;a href="http://justgiving.com/jiggypete"&gt;http://justgiving.com/jiggypete&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The types of technology that I am most familiar with are Ruby, Rails and Java.&lt;br /&gt;If you have any questions please do get in touch, this is all for a very good cause.&lt;br /&gt;&lt;br /&gt;You can contact me via any of these methods,&lt;br /&gt;Email:   jiggypete at gmail .com&lt;br /&gt;Twitter: &lt;a href="http://twitter.com/jiggy_pete"&gt;@jiggy_pete&lt;/a&gt;&lt;br /&gt;Website: &lt;a href="http://jiggypete.com"&gt;jiggypete.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My Experience:&lt;br /&gt;For 10 years I have been working in XP teams and have been heavily involved with the Scottish Agile community.&lt;br /&gt;The types of applications I have worked on are,&lt;br /&gt;* Tools to create Blu-ray discs, &lt;br /&gt;* Multi-million pound trading applications, &lt;br /&gt;* Pension apps, &lt;br /&gt;* Tools to allow bus drivers to submit timesheets&lt;br /&gt;* and applications that run a repair line,&lt;br /&gt;&lt;br /&gt;Thankyou for your time,&lt;br /&gt;Peter Aitken&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3711335003390554188-6244527925853308457?l=jiggypete.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jiggypete.blogspot.com/feeds/6244527925853308457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3711335003390554188&amp;postID=6244527925853308457' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/6244527925853308457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/6244527925853308457'/><link rel='alternate' type='text/html' href='http://jiggypete.blogspot.com/2011/03/charity-work.html' title='Charity Work'/><author><name>Peter Aitken</name><uri>http://www.blogger.com/profile/17656998844052804342</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3711335003390554188.post-6228441314786344892</id><published>2010-10-18T03:55:00.000-07:00</published><updated>2010-10-18T05:24:26.364-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mountain biking'/><title type='text'>Mabies Aye</title><content type='html'>For the last few weeks I've had a bit of extra time on my hands which I've been trying to put to good use by going out to play on my bike. Fun as it sounds there is a more serious reason for getting out on the bike more, six of us have signed up to participate in &lt;a href="http://www.maggiescentres.org/maggies/maggiescentres/home/eventsfundraising/events/monsterhike/about.html"&gt;Maggies Monster Bike'n'Hike&lt;/a&gt; at the end of April 2011.&lt;br /&gt;&lt;br /&gt;What does that involved?&lt;br /&gt;A 30 mile bike ride plus one of an 8, 22 or 43 mile hike.&lt;br /&gt;If you are feeling generous feel free to donate/sponsor our team at &lt;a href="http://justgiving.com/jiggypete"&gt;http://justgiving.com/jiggypete&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;See why I need to get some training underway?&lt;br /&gt;&lt;br /&gt;Having got out for a number of runs round the &lt;a href="http://www.forestry.gov.uk/carronvalley"&gt;Carron Valley&lt;/a&gt; and the Lochgoin Circuit at&lt;a href="http://whiteleewindfarm.co.uk/"&gt; Whitelee Windfarm&lt;/a&gt; the odd bit of wear and tear appeared on the bike. The folks at &lt;a href="http://www.wheelcraft.net/"&gt;Wheelcraft&lt;/a&gt; were a great help sorting my gears, brakes and chain.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3219/2502971887_40a16a7c73_z.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 640px; height: 453px;" src="http://farm4.static.flickr.com/3219/2502971887_40a16a7c73_z.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Big Al and the guys were all friendly, helpful and incredibly knowledgable on everything bike related, I can't recommend them enough.&lt;br /&gt;&lt;br /&gt;Prior to taking on something a bit more challenging I had a niggling concern. Ross, one of my biking buddies, had a bit of a crash landing at 25mph when going round the Carron Valley. He had pains in his wrists, elbows and previously broken ribs despite wearing  a cosy piece of 661 body armour. If I was going to venture into something braver/stupider it seemed like a good time to pick up some body armour.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://s3.amazonaws.com/twitpic/photos/large/178191846.jpg?AWSAccessKeyId=0ZRYP5X5F6FSMBCCSE82&amp;Expires=1287402695&amp;Signature=OhHLWBxOQ56Be35QyOviLvENLHY%3D"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 600px; height: 1002px;" src="http://s3.amazonaws.com/twitpic/photos/large/178191846.jpg?AWSAccessKeyId=0ZRYP5X5F6FSMBCCSE82&amp;Expires=1287402695&amp;Signature=OhHLWBxOQ56Be35QyOviLvENLHY%3D" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That was purchased on Saturday just in time for Sundays trip to the &lt;a href="http://www.forestry.gov.uk/forestry/ACHS-5RNFL6"&gt;Mabie Forest&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Finally Sunday arrived and it was time to get the bike into the car, pick up Ross and head to Mabie.&lt;br /&gt;An hour and a half later we arrived, got changed, put the bikes together and found the rest of the group all ready to take on one of the &lt;a href="http://www.7stanes.gov.uk/"&gt;7Stanes&lt;/a&gt; red routes.&lt;br /&gt;&lt;br /&gt;20 meters from the car and the chain snapped. What a start.&lt;br /&gt;5 minutes later and we're ready to go again.&lt;br /&gt;&lt;br /&gt;The first section of the red route is the Butterhole Climb. It is well named and not the easy start I was hoping for. The downhill section is very lumpy and bumpy. You could easily loose some inner tubes on this section ( infact all of the forest ). Only one part caught me out where I was nearly over the handlebars.&lt;br /&gt;&lt;br /&gt;The Countour Climb seemed a lot easier going, with a easy going firetrack leading to it....be careful of the little bridge with a tree root at the far side. It's a small manageable jump so get that front wheel up but it can cause a bit of a hold up on the route with riders stopping to push their bike over it. This section gets a bit harder towards the end again getting a bit steep for my legs and lungs.&lt;br /&gt;&lt;br /&gt;Once at the top you enter the Descender Bender which has replaced a technical park. It's full of fast tight berms which is great fun!&lt;br /&gt;&lt;br /&gt;Then we made it to Stan's Pond. Lots of nice tight single track through the forest. This is where I broke in the body armour over compensating when coming out of a berm and off I came. &lt;br /&gt;Sure I've left a hole in the ground where I landed. The right shoulder took the brunt of the fall, just like the other crash that landed me in hospital a few years back. Fortunately the shoulders and elbows were protected by the armour so it was a case of getting up, catching my breath and climbing back on the bike.&lt;br /&gt;&lt;br /&gt;The Scorpion, I have no idea why it is called The Scorpion. It doesn't matter what they call it, this section has the biggest, steepest climb of the red route. If you don't get off to push up this section I'd be astonished!&lt;br /&gt;&lt;br /&gt;The Roller Coaster was the last part of the red route we took on. Any climb by this part of the day was getting done on foot, I was spent. The uphills weren't that steep but still beyond my fitness. Lots of nice rolling sections finished off with a pretty high drop off - be warned you'll need a bit of speed, if you're spent go round it.&lt;br /&gt;&lt;br /&gt;Too finish off the day we followed a blue track back to the car park.&lt;br /&gt;&lt;br /&gt;Phew, it was really hard going and great fun flying about the place particularly when on the bike.&lt;br /&gt;Should be easier next time!&lt;br /&gt;Wooo&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3711335003390554188-6228441314786344892?l=jiggypete.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jiggypete.blogspot.com/feeds/6228441314786344892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3711335003390554188&amp;postID=6228441314786344892' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/6228441314786344892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/6228441314786344892'/><link rel='alternate' type='text/html' href='http://jiggypete.blogspot.com/2010/10/mabies-aye.html' title='Mabies Aye'/><author><name>Peter Aitken</name><uri>http://www.blogger.com/profile/17656998844052804342</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3219/2502971887_40a16a7c73_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3711335003390554188.post-9166786668998563665</id><published>2009-12-08T14:50:00.000-08:00</published><updated>2009-12-08T15:10:34.621-08:00</updated><title type='text'>Call to arms: Ban Case / Switch statements</title><content type='html'>Of late I've been keeping up with the &lt;a href="http://livestream.com/hashrocket"&gt;Hashrocket bookclub&lt;/a&gt; which is streamed on Tuesday evenings at 5.12pm GMT.  Each week the folks discuss a chapter or two of the current book &lt;a href="http://www.amazon.co.uk/Refactoring-Ruby-Jay-Fields/dp/0321603508"&gt;Refactoring: Ruby Edition&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I noticed there was a running theme through a number of the 'Organising Data' refactorings which was removing case statements.&lt;br /&gt;&lt;br /&gt;I've been at this coding game for about a decade now and I've only seen what I would call one valid use of a case statement. Every other use benefitted from being replaced by polymorphism.&lt;br /&gt;&lt;br /&gt;With that in mind I'd like to see the case and switch keywords removed from all OO languages as it actively encourages poor design and less flexible code. &lt;br /&gt;&lt;br /&gt;Any language designers out there reading?&lt;br /&gt;The one case I mentioned above where a switch was useful could easily be replaced by an if, else if condition. Save yourself the hassle of implementing case or switch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3711335003390554188-9166786668998563665?l=jiggypete.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jiggypete.blogspot.com/feeds/9166786668998563665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3711335003390554188&amp;postID=9166786668998563665' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/9166786668998563665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/9166786668998563665'/><link rel='alternate' type='text/html' href='http://jiggypete.blogspot.com/2009/12/call-to-arms-ban-case-switch-statements.html' title='Call to arms: Ban Case / Switch statements'/><author><name>Peter Aitken</name><uri>http://www.blogger.com/profile/17656998844052804342</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3711335003390554188.post-3669676092234193876</id><published>2009-07-09T01:48:00.000-07:00</published><updated>2009-07-09T02:00:22.392-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mocks'/><title type='text'>Girls and Mocks</title><content type='html'>They both have expectations, high exepctations. &lt;br /&gt;If their demands are not met they throw a fit until they get what they want.&lt;br /&gt;&lt;br /&gt;How else can this be described? &lt;br /&gt;'Childish' yes but that hardly fits with the analogy, how about 'High Maintenance'.&lt;br /&gt;&lt;br /&gt;"Peter what should you do to solve the problem?"&lt;br /&gt;Easy, avoid high maintenance girls/mocks.&lt;br /&gt;&lt;br /&gt;Peters final thought: Don't completely close your mind to girls/mocks as they can be useful in the appropriate situation :o)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3711335003390554188-3669676092234193876?l=jiggypete.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jiggypete.blogspot.com/feeds/3669676092234193876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3711335003390554188&amp;postID=3669676092234193876' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/3669676092234193876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/3669676092234193876'/><link rel='alternate' type='text/html' href='http://jiggypete.blogspot.com/2009/07/girls-and-mocks.html' title='Girls and Mocks'/><author><name>Peter Aitken</name><uri>http://www.blogger.com/profile/17656998844052804342</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3711335003390554188.post-3619271969651144011</id><published>2009-04-15T13:27:00.000-07:00</published><updated>2009-04-15T14:03:40.287-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac rails rspec cucumber gem gems uninstalling version error problem issue'/><title type='text'>Mac Gem Jip</title><content type='html'>I'm a bit of a newbie to Macs and finally took the plunge a few months back. The day job is still on a windows box to keep inline with the rest of the team so there hasn't been much Mac playtime.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The last few days I started to put together a presentation for Agile Scotland with coded examples and that is where I hit the wall - running the code. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Background to the problem:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;About six months back I was poking at rspec and cucumber to get a feel for them. For my presentation I wanted to have the latest and greatest version of rails, rspec and cucumber available on my Mac.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When trying to run features for cucumber 0.3.0 it was expecting rspec 1.2.2 to be in place, which it was, however the rails environment had already picked up rspec 1.2.4. For the life of me I couldn't find out what where rspec 1.2.4 was being fetched. I decided to uninstall the rspec 1.2.4 leaving only one version in place and hopefully solving the problem. All looked good until you run &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;gem list&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;and there it is, still sitting there refusing to budge no matter how many gem uninstalls are run: rspec 1.2.4&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;What was wrong:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After much running around the short story is there are three places gems are stored. Depending on how you install the gems affects where the gems are stored and I managed to muddle them. Thanks to Jason Tennier &lt;a href="http://blog.supergenius.ca/2008/11/removing-local-gems-in-mac-os-x.html"&gt;post&lt;/a&gt; which helps explains where I went astray.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3711335003390554188-3619271969651144011?l=jiggypete.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jiggypete.blogspot.com/feeds/3619271969651144011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3711335003390554188&amp;postID=3619271969651144011' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/3619271969651144011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/3619271969651144011'/><link rel='alternate' type='text/html' href='http://jiggypete.blogspot.com/2009/04/mac-gem-jip.html' title='Mac Gem Jip'/><author><name>Peter Aitken</name><uri>http://www.blogger.com/profile/17656998844052804342</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3711335003390554188.post-3991211959915587031</id><published>2008-12-05T10:25:00.000-08:00</published><updated>2008-12-05T10:36:32.185-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rails Rspec validates_email_format_of model_validation'/><title type='text'>How easy is it to validate the format of an email address</title><content type='html'>The other day I had to create an admin console for creating a user object which contained the usual fields,&lt;br /&gt;&lt;ul&gt;&lt;li&gt;username&lt;/li&gt;&lt;li&gt;forename&lt;/li&gt;&lt;li&gt;surename&lt;/li&gt;&lt;li&gt;email&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;etc.&lt;br /&gt;&lt;br /&gt;When it came to setting up the active record object to ensure that the username, forename and surname are supplied I started spec'ing the behaviour. All was moving along well.&lt;br /&gt;&lt;br /&gt;When it came to validating the format  of the email address I realised this was something I'd not done this before. Off the top of my head an email address must&lt;br /&gt;&lt;ul&gt;&lt;li&gt;include only one '@'&lt;/li&gt;&lt;li&gt;not include spaces&lt;/li&gt;&lt;/ul&gt;There must be a lot more to it than that.&lt;br /&gt;With a bit of help from google I found there was a helpful standard that specified exactly what is a &lt;a href="http://en.wikipedia.org/wiki/E-mail_address"&gt;valid email address&lt;/a&gt;. All of a sudden my nice task of creating a scaffold for a user object had grown to include 'implementing validation for email addresses' which was going to be slightly more than,&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;validates_presence_of :username, :forename, :surname&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The folks in the team keep talking about Rails plugins for this, that and the other. Could there be some kind sole out there that has already solved this problem?&lt;br /&gt;&lt;br /&gt;google 'rails plugin validate email format'&lt;br /&gt;&lt;br /&gt;and there it is!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.dunae.ca/validates_email_format_of.html"&gt;http://code.dunae.ca/validates_email_format_of.html&lt;/a&gt;&lt;br /&gt;A plugin called validates_email_format_of by &lt;a href="http://code.dunae.ca/validates_email_format_of.html"&gt;Alex Dunae&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There has got to be a catch, how complicated is it going to be to get into my codebase and make use of it?&lt;br /&gt;&lt;br /&gt;Here is the user class before&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;class User&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    validates_presence_of :username, :forename, :surname&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;and here is the User class after&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;class User&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;   validates_presence_of :username, :forename, :surname&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;   &lt;span style="color: rgb(51, 51, 255);"&gt;validates_email_format_of :email&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;I'd a few failing tests sketched out to check the email validation....all of a sudden they all pass!&lt;br /&gt;&lt;br /&gt;Job done.&lt;br /&gt;Simple and elegant, what more could you ask for?&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3711335003390554188-3991211959915587031?l=jiggypete.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jiggypete.blogspot.com/feeds/3991211959915587031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3711335003390554188&amp;postID=3991211959915587031' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/3991211959915587031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/3991211959915587031'/><link rel='alternate' type='text/html' href='http://jiggypete.blogspot.com/2008/12/other-day-i-had-to-create-admin-console.html' title='How easy is it to validate the format of an email address'/><author><name>Peter Aitken</name><uri>http://www.blogger.com/profile/17656998844052804342</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3711335003390554188.post-1255107499106742491</id><published>2008-12-03T12:32:00.000-08:00</published><updated>2008-12-03T12:33:35.964-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cucumber'/><category scheme='http://www.blogger.com/atom/ns#' term='Rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>Working With Rails</title><content type='html'>I've just started working with a new team on a Rails project. It seems very weird to be developing full time in Ruby after spending the last eight years where the main focus of the day job has been java development.&lt;br /&gt;&lt;br /&gt;It is great to have all of these new things to learn in terms of rails, cucumber, rspec-rails and mysql. It is a little daunting being thrown that bit outside of my comfort zone with all this new technology at once even though I've been using ruby for the past 3 years.&lt;br /&gt;&lt;br /&gt;I'll be sure to report back with all the interesting things I learn.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3711335003390554188-1255107499106742491?l=jiggypete.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jiggypete.blogspot.com/feeds/1255107499106742491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3711335003390554188&amp;postID=1255107499106742491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/1255107499106742491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/1255107499106742491'/><link rel='alternate' type='text/html' href='http://jiggypete.blogspot.com/2008/12/working-with-rails.html' title='Working With Rails'/><author><name>Peter Aitken</name><uri>http://www.blogger.com/profile/17656998844052804342</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3711335003390554188.post-3389728684013543610</id><published>2008-05-17T06:45:00.000-07:00</published><updated>2008-05-17T08:33:56.240-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>We've gone Groovy</title><content type='html'>&lt;div style="text-align: justify;"&gt;When we started our latest project about 6 months ago I was banging on about using Groovy. Nobody was convinced or should I say interested.&lt;br /&gt;&lt;br /&gt;On Thursday the Mighty Gus and myself went along to a presentation on Groovy. We came back thoroughly enthused and were desperate to use it day to day.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Rather than placing Groovy code directly into the application we thought it would be good to introduce the language in the test suite. This would help familiarise the team with the language before introducing Groovy to the actual web application ( that is if we chose to go ahead and continue using the language ).&lt;br /&gt;&lt;br /&gt;All of the developers on the team are competent with Ruby and would keen to use it within a web app. Having a Java web app places a bit of a restriction on introducing Ruby into the app code. This is the major win for Groovy, it seamlessly integrates with the Java code!&lt;br /&gt;&lt;br /&gt;The main aim for Thursday afternoon was to&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;get Groovy up and running within our development environment,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;write a test case for new functionality&lt;/li&gt;&lt;li&gt;update the continuous build and try to have minimal impact on the teams local environments.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;Getting Groovy up and running locally&lt;/span&gt;&lt;br /&gt;Only two downloads were required.&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;The Groovy compiler&lt;/li&gt;&lt;li&gt;JetGroovy, the IntelliJ plugin&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;Then we pointed the plugin at the Groovy home and added the groovy-all.jar to the test module path.&lt;br /&gt;&lt;br /&gt;At this point we could run groovy test cases against our java codebase!&lt;br /&gt;When running 'All Tests' in IntelliJ it automatically picked up the groovy test case!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;Writing a test case for new functionality&lt;/span&gt;&lt;br /&gt;Gus and I were half way though some work prior to going to the presentation.&lt;br /&gt;We took the old Java test case and cloned it into a groovy test case ( updated the file and classname to avoid clashes).&lt;br /&gt;&lt;br /&gt;At this point we were running groovy tests!&lt;br /&gt;&lt;br /&gt;Yet we weren't taking advantage of any of the Groovy-ness, it was simply a renamed Java class.&lt;br /&gt;What Groovy features did we make use of?&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;Remove semicolons  ( as Ben described it, "the bald look" )&lt;/li&gt;&lt;li&gt;Removing method brackets  ( this only works in certain situations)&lt;/li&gt;&lt;li&gt;Dropped types where they were not of value.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Introduce groovy lists for those ugly mock objects to return.  &lt;/li&gt;&lt;li&gt;Replace the ugly mocks with some super-condensed stubs.&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;I should explain 4 &amp;amp; 5 above a bit more.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4:&lt;/span&gt; Due to the nature of some of our 'generic' interfaces that we were testing, the tests need to know about the 'generic' type. ( Does this sound like a contradiction to anyone else? )&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;For example:&lt;/span&gt;&lt;br /&gt;We were testing a Spring Controller which adds the size of a list of items to the Model for display.&lt;br /&gt;The list of items was retrieved from a Dao, which is injected into the Controller.&lt;br /&gt;Standard practise on our project is to mock the Dao and, in the test, place expectations on the methods that will be called.&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:130%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;public class Controller&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;{&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;    private Dao dao;&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;    public Controller( Dao dao)&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;    {&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;        this.dao = dao;&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;    }&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;    public void handleRequest( HttpRequest request, HttpResponse response )&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;    {&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;        Map model = new HashMap();&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;        model.put( "number_of_items", dao.getItems().size() );&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;        return new ModelAndView( "viewname", model );&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;    }&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;}&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;public class TestControllerJava extends MockObjectTestCase&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;{&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;    public void testCorrectNumberOfItemsAreAddedToModel()&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;     {&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;        List&lt;/span&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; items = Arrays.asList( new Item(), new Item(), new Item() );&lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        Mock mockDao = mock( Dao.class )    &lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        Controller testee = new Controller( (Dao)mockDao.proxy() );&lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        mockDao.expects( once() ).method( "getItems" ).will( returnValue( items ) );&lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        ModelAndView actual = testee.handleRequest( null, null );&lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        assertEquals( items.size(), actual.getModel().get( "number_of_items" );&lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    }&lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;item&gt;Here nothing in the Controller is particularly interested in the type Item. It is only concerned about the number of Items.&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;Which brings us to introducing Groovy lists.&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;item&gt;&lt;/item&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;class TestControllerGroovy extends MockObjectTestCase&lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;{&lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    void testCorrectNumberOfItemsAreAddedToModel()&lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;     {&lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item style="color: rgb(204, 0, 0); font-style: italic;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        def items = ["one","two","three"]&lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        Mock mockDao = mock( Dao.class )    &lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        Controller testee = new Controller( (Dao)mockDao.proxy() );&lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        mockDao.expects( once() ).method( "getItems" ).will( returnValue( items ) );&lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        ModelAndView actual = testee.handleRequest( null, null );&lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        assertEquals( items.size(), actual.getModel().get( "number_of_items" );&lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    }&lt;/span&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;/item&gt;&lt;/span&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;br /&gt;&lt;/pre&gt;&lt;item&gt;In this example the differnce may not be much, but consider the situation where the construction of the Item object is complex and needs a number of params.&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;This brings us nicely to further explaination of item 5 above. ( Replace the ugly mocks with some super-condensed stubs.)&lt;/item&gt;&lt;br /&gt;&lt;item style="font-family: trebuchet ms; font-weight: bold;"&gt;&lt;/item&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:trebuchet ms;font-size:100%;"  &gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;class TestControllerGroovy extends &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;TestCase&lt;/span&gt;&lt;/item&gt; &lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;{&lt;/span&gt;&lt;/item&gt; &lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;br /&gt; void testCorrectNumberOfItemsAreAddedToModel()&lt;/span&gt;&lt;/item&gt; &lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;     &lt;br /&gt; {&lt;/span&gt;&lt;/item&gt; &lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;       &lt;br /&gt;  def items = ["one","two","three"]&lt;/span&gt;&lt;/item&gt; &lt;item&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;       &lt;br /&gt;&lt;span style="font-style: italic;"&gt;  def dao = [getItems: { items }] as Dao&lt;/span&gt;&lt;/span&gt;&lt;/item&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="font-style: italic;"&gt;        &lt;/span&gt;&lt;br /&gt;  Controller testee = new Controller( &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;dao &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;);&lt;/span&gt;&lt;/item&gt; &lt;item&gt;&lt;/item&gt; &lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;       &lt;br /&gt;  ModelAndView actual = testee.handleRequest( null, null );&lt;/span&gt;&lt;/item&gt; &lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;       &lt;br /&gt;  assertEquals( items.size(), actual.getModel().get( "number_of_items" );&lt;/span&gt;&lt;/item&gt; &lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    &lt;br /&gt; }&lt;/span&gt;&lt;/item&gt; &lt;item&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/item&gt; &lt;item&gt;&lt;/item&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;item style="font-family: arial;"&gt;&lt;/item&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;item&gt;Here we have, line in Javascript, created a map instead of an actual typed object as the stub. We have satisfied just enough of the interface that we are interested in ( or that the source is interested in ).&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;The map is defined within the square brackets, the first item being the method call, then a colon, then a block ( which is defined in the curly brackets ) which will be executed when the method is called. You can have as many of these as you like, separated by commas. Another point to note is that, just like in Ruby, the result of the last statement executed will be returned by the method. Therefore there is no need to explicitly say &lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;{return items} &lt;/span&gt;as &lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;{items} &lt;/span&gt;will do perfectly well.&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;I'm not suggesting to use this as a rule, always aim for the clearest code/test possible rather than roping in as many new features of a language as possible.&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;The example above is a great deal simpler that the actual code and test we created on Thursday. It had 7 lists and 7 mock expectations and it looked absolutely hideous. It was so much nicer to see it condensed into 7 lines, however it felt really strange seeing so much functionality defined within 7 lines!&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;I suspect this is something we will get used to, it just felt weird.&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;Check in time - or is it?&lt;/item&gt;&lt;br /&gt;&lt;item&gt;How will this affect the other developers and the build box?&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;Our Team City build delegates to Ant. A quick look at the Groovy site gave some nice examples for compiling Groovy in Ant.&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;What we did forget to do was to add the groovy-all.jar to the ant classpath - D'oh.&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;We then updated the build box with the appropriate groovy install and jars and put together some info for the other developers about where to find the compiler and JetGroovy.&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;Job done.&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;br /&gt;&lt;item&gt;I'll let you know how we get on!&lt;/item&gt;&lt;br /&gt;&lt;item style="color: rgb(0, 0, 0);"&gt;WOOOO&lt;/item&gt;&lt;br /&gt;&lt;item&gt;&lt;/item&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3711335003390554188-3389728684013543610?l=jiggypete.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jiggypete.blogspot.com/feeds/3389728684013543610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3711335003390554188&amp;postID=3389728684013543610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/3389728684013543610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/3389728684013543610'/><link rel='alternate' type='text/html' href='http://jiggypete.blogspot.com/2008/05/weve-gone-groovy.html' title='We&apos;ve gone Groovy'/><author><name>Peter Aitken</name><uri>http://www.blogger.com/profile/17656998844052804342</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3711335003390554188.post-9037676868941981837</id><published>2007-10-01T17:50:00.000-07:00</published><updated>2007-10-01T17:57:11.388-07:00</updated><title type='text'>Lazy Development</title><content type='html'>&lt;span style="color: rgb(0, 0, 0);"&gt;For around the past 6 months I have been trying to nail down what the difference in attitude is between developers.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Paul Duvall has summed up what I have been trying to get across to colleagues in his &lt;/span&gt;&lt;a style="color: rgb(51, 51, 255);" href="http://www.testearly.com/2007/08/17/fire-your-best-peoplereward-the-lazy-ones/"&gt;post &lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;about troubleshooters and troublepreventors.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;I describe myself as a lazy developer to anyone who cares to listen, however this needs some context.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;By lazy I mean that I will put more effort into automating a task now rather than have to work out how to do it manually once a fortnight. (DRY)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Couple this with writing unit tests now to allow refactoring to take place safely at anytime in the future and it will aid you in developing great software.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Everytime these upfront payments get dodged it comes back to punish the dev team with obscene amounts of non-value add work.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3711335003390554188-9037676868941981837?l=jiggypete.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jiggypete.blogspot.com/feeds/9037676868941981837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3711335003390554188&amp;postID=9037676868941981837' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/9037676868941981837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/9037676868941981837'/><link rel='alternate' type='text/html' href='http://jiggypete.blogspot.com/2007/10/lazy-development.html' title='Lazy Development'/><author><name>Peter Aitken</name><uri>http://www.blogger.com/profile/17656998844052804342</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3711335003390554188.post-6602432537864658135</id><published>2007-09-05T07:14:00.000-07:00</published><updated>2007-10-01T17:26:31.052-07:00</updated><title type='text'>Jiggy jumps into action after NFSJ</title><content type='html'>&lt;span style="color: rgb(0, 0, 0);"&gt;Hello and welcome to my first blog post,&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;During my trip to London for the &lt;/span&gt;&lt;a style="color: rgb(51, 51, 255);" href="http://www.nofluffjuststuff.com/"&gt;No Fluff Just Stuff &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;eXchange&lt;/span&gt;&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;a href="http://www.nofluffjuststuff.com/"&gt; &lt;/a&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);" class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;NFJS&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) I was introduced to a host of new tech toys to play with. The friendly nature of the presenters and attendees was great and I really want to share some of that experience with the wider world.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;The overarching message I took from &lt;/span&gt;&lt;a style="color: rgb(51, 51, 255);" href="http://www.nofluffjuststuff.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;NFJS&lt;/span&gt;&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; was that Polyglot Programming is the future of software development, encouraging the developer to use the right tool / language for the job thereby having many languages in your toolbox to draw upon.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Whatever your bag is Java, Ruby, Groovy or something more functional like &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);" class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Erlang&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; or &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);" class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Scala&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);" class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;NFJS&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; was keen to introduce you to them all and allow you to make an informed decision as to which language you should use to solve which problems.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="color: rgb(51, 51, 255);" href="http://www.davisworld.org/blojsom/blog/default/"&gt;Scott Davis&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; was really excited about Groovy, which looks a lot like Ruby.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Scott was keen to point out that when he was working on a Ruby app in the morning and a Java app in the afternoon the context switching was a major source of pain. He finds using Groovy for both apps easier to deal with as it is so tightly coupled to Java and has all the expressiveness of Ruby.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left; color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 153, 0);font-size:100%;" &gt;To create a .groovy file you can take any .java file and rename it to .groovy. You now have a syntactically correct Groovy file. The only other change necessary at that point is to compile with the groovy compiler &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);font-size:100%;" &gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;groovyc&lt;/span&gt;. &lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);font-size:100%;" &gt;Thereafter you can start taking advantage of closures and the scripting ability of the language!&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Sounds and looks too good to be true. I'll let you know how I get on.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="color: rgb(51, 51, 255);" href="http://graemerocher.blogspot.com/"&gt;Graeme &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Rocher&lt;/span&gt;&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; provided a &lt;/span&gt;&lt;a style="color: rgb(51, 51, 255);" href="http://grails.codehaus.org/"&gt;Grails&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; intro which looks very interesting although I don't think I'll get to play with it at work anytime soon.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="color: rgb(51, 51, 255);" href="http://memeagora.blogspot.com/"&gt;Neil Ford&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; was discussing &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);" class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;DSLs&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; and Language Oriented Programming. This is something that I've been trying to play with for a while with limited success so it was nice to get some pointers. The main thing being to keep a &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);" class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;DSL&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; small and focused, do not try and be all things to all men. This presentation left me immediately wanting to go and start playing with &lt;/span&gt;&lt;a style="color: rgb(51, 51, 255);" href="http://www.antlr.org/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Antlr&lt;/span&gt;&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; and the &lt;/span&gt;&lt;a style="color: rgb(51, 51, 255);" href="http://www.jetbrains.com/mps/index.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;IntelliJ&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;Metaprogramming&lt;/span&gt; System&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;. ( You can find a similar presentation given by Neil and &lt;/span&gt;&lt;a style="color: rgb(51, 51, 255);" href="http://martinfowler.com/"&gt;Martin Fowler&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; at &lt;/span&gt;&lt;a style="font-weight: bold; color: rgb(51, 51, 255);" href="http://www.theserverside.com/talks/index.tss"&gt;The Server Side&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;. )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;During &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);" class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;NFJS&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; there was a great deal of banner waving "Death to SOAP" and championing of REST :o)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="color: rgb(51, 51, 255);" href="http://blogs.tedneward.com/"&gt;Ted &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;Neward&lt;/span&gt;&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; showed off some of the &lt;/span&gt;&lt;a style="color: rgb(51, 51, 255);" href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/index.html#manage"&gt;monitoring tools&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; that come with Java. I never even knew these existed! ( Well not along with your downloaded &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);" class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;JVM&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; at least.)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Scott Davies gave another couple of exciting talks on,&lt;/span&gt;&lt;br /&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;GIS&lt;/span&gt; web development&lt;br /&gt;&lt;/li&gt;&lt;li&gt;and &lt;a style="color: rgb(51, 51, 255);" href="http://developer.yahoo.com/yui/"&gt;Yahoo &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;YUI&lt;/span&gt; Ajax&lt;/a&gt; library.&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; I had no idea so much free &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);" class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;GIS&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; data is out there!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;In terms of the &lt;/span&gt;&lt;a style="color: rgb(51, 51, 255);" href="http://developer.yahoo.com/yui/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;YUI&lt;/span&gt; &lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;here is what it has to offer,&lt;/span&gt;&lt;br /&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;All of the widgets shown were super-configurable. Great, less javascript to write.&lt;/li&gt;&lt;li&gt;There is a load of widgets - all &lt;span style="font-weight: bold;"&gt;free&lt;/span&gt;!&lt;/li&gt;&lt;li&gt;An excellent Logger widget to help debug any components you have been doing handy work on.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;However there was one really strange thing about the widgets that troubled me. Each widget had it's own &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);" class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;dir&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; with library with &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;three &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;implementations!&lt;/span&gt;&lt;br /&gt;&lt;ol style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;widget.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;js&lt;/span&gt;&lt;/li&gt;&lt;li&gt;widget_min.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;js&lt;/span&gt;&lt;/li&gt;&lt;li&gt;widget_debug.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;js&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Whats going on?&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Well &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 0);"&gt;widget.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;js&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; is the javascript &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);" class="blsp-spelling-corrected" id="SPELLING_ERROR_25"&gt;implementation&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; nicely formatted with comments.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 0);"&gt;widget_min.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;js&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; is &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 0);"&gt;widget.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;js&lt;/span&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;with comments and surplus &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);" class="blsp-spelling-corrected" id="SPELLING_ERROR_28"&gt;white space&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; removed so that download is quicker. Fair enough.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 0);"&gt;widget_debug.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;js&lt;/span&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;is a version with logging output.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;If you need to do some debugging of the file you have in production &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 0);"&gt;widget.js/widget_min.js&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, you need to change the reference in your html file from &lt;/span&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 0);"&gt;widget.js/widget_min.js&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; to &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;widget_debug.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;js&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;This is a recipe for confusion if not disaster, replacing the file that is not working and needing examined with a completely different file!?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="color: rgb(51, 51, 255);" href="http://www.agiledeveloper.com/blog/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;Venkat&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;Subramaniam&lt;/span&gt;&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; did a session on Functional &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);" class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;Programming&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; with &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);" class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;Erlang&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;. The main thing &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);" class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;Venkat&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; reinforced for me as a web developer is trying to have no ( or as little as possible ) state held within your application.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;In brief summary, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);" class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;NFJS&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; was,&lt;/span&gt;&lt;br /&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;very interesting,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;introduced me to some knew ideas,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;rekindled some old one ideas,&lt;/li&gt;&lt;li&gt;will &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_37"&gt;definitely&lt;/span&gt; have me attending again!&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3711335003390554188-6602432537864658135?l=jiggypete.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jiggypete.blogspot.com/feeds/6602432537864658135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3711335003390554188&amp;postID=6602432537864658135' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/6602432537864658135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3711335003390554188/posts/default/6602432537864658135'/><link rel='alternate' type='text/html' href='http://jiggypete.blogspot.com/2007/09/jiggy-jumps-into-action-after-nfsj.html' title='Jiggy jumps into action after NFSJ'/><author><name>Peter Aitken</name><uri>http://www.blogger.com/profile/17656998844052804342</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
