<?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-4159040525348802212</id><updated>2012-02-27T23:41:36.503-05:00</updated><category term='traeger'/><category term='XMBC'/><category term='book-review'/><title type='text'>Purple Plutonium</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-5020226520996608380</id><published>2011-10-24T09:26:00.001-04:00</published><updated>2011-10-24T09:26:12.502-04:00</updated><title type='text'>Background Logging With Disruptor</title><content type='html'>I spent a couple of minutes over the weekend watching the presentation: &lt;a href="http://vimeo.com/30781988"&gt;Understanding the Disruptor, a Beginner's Guide to Hardcore Concurrency&lt;/a&gt; to try and better understand the technology.&amp;nbsp; It is a good talk but you need to have &lt;a href="http://www.slideshare.net/trishagee/understanding-the-disruptor"&gt;the slides&lt;/a&gt; in front of you to really follow along.&amp;nbsp; The current project I am working on does not have the throughput requirements that the LMAX projects do but I was pleased to find &lt;a href="http://www.symphonious.net/2011/09/26/background-logging-with-the-disruptor/"&gt;a blog post&lt;/a&gt; describing a scenario that we do use on our current project: background logging.&amp;nbsp; We have multiple servers spitting out log messages to a central logging service which allows us to trace a work request as it comes into the system and bounces between servers for processing.&amp;nbsp; We didn't want have main processing held up waiting for log messages to get posted so we decided to go with a background logger based on blocking queues. Curious to see what the solution looks like using Disruptor, I decided to code up the examples and do a little benchmarking.&amp;nbsp; If you are interested, you can grab the code from &lt;a href="https://bitbucket.org/kurron/distruptor-logger/"&gt;bitbucket&lt;/a&gt;.&amp;nbsp; What I found interesting was that the Exchanger based solution works only when there is one producer and one consumer, which I don't think is practical.&amp;nbsp; The Disruptor and Blocking Queue solutions deal with the multiple producer scenarios, which is what we have in our system.&amp;nbsp; The simple benchmark I've written indicate that the Disruptor and Blocking Queue exhibit similar processing times, which was surprising to me. Based on what I've learned from the presentation, I would've expected more overhead from the plain Java solution. I'm guessing somebody who really understood the inner workings of Disruptor could show me where I'm doing something silly in the code, artificially holding back the framework and skewing the results.&amp;nbsp; What I did find interesting was that the Disruptor framework wasn't that hard to get implemented. It is a single JAR file and couple API calls and you are off to the races.&amp;nbsp; I'm not working on a &lt;a href="http://www.eecs.harvard.edu/%7Emdw/proj/seda/"&gt;SEDA&lt;/a&gt;-based solution but the next time I am, I'll definitely look more closely at using &lt;a href="http://code.google.com/p/disruptor/"&gt;Disruptor&lt;/a&gt; as the queuing solution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-5020226520996608380?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/5020226520996608380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/10/background-logging-with-disruptor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/5020226520996608380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/5020226520996608380'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/10/background-logging-with-disruptor.html' title='Background Logging With Disruptor'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-8159997360294888078</id><published>2011-09-04T09:45:00.002-04:00</published><updated>2011-09-04T09:45:30.199-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book-review'/><title type='text'>Quick Book Review: SQL Antipatterns: Avoiding the Pitfalls of Database Programming</title><content type='html'>&lt;a href="http://www.goodreads.com/book/show/7959038-sql-antipatterns" style="float: left; padding-right: 20px;"&gt;&lt;img alt="SQL Antipatterns: Avoiding the Pitfalls of Database Programming" border="0" src="http://photo.goodreads.com/books/1279087895m/7959038.jpg" /&gt;&lt;/a&gt;&lt;a href="http://www.goodreads.com/book/show/7959038-sql-antipatterns"&gt;SQL Antipatterns: Avoiding the Pitfalls of Database Programming&lt;/a&gt; by &lt;a href="http://www.goodreads.com/author/show/3455085.Bill_Karwin"&gt;Bill Karwin&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I'm a software developer who gets paid mostly for working on the back end portion of solutions and I've worked in both small and large companies.  I am not an SQL guru and I am more than happy to let somebody else review and fine tune any SQL that the solution uses.  If I'm lucky, I'll be working in an organization large enough to have full-time SQL experts who can help me out.  More times than not, however, the development team has to craft the SQL ourselves.  As of late, I've been letting Hibernate do most of the heavy lifting for me, trusting that it will generate reasonable SQL and keep me out of hot water.  I fully understand that, like most tools, Hibernate is only as useful as the developer's understanding of it which is why I try and read up on the ins and outs of Hibernate as much as I can.  To that end, I figured I'd pick up a copy of &lt;a href="http://pragprog.com/book/bksqla/sql-antipatterns" rel="nofollow" target="_blank"&gt;SQL Antipatterns: Avoiding the Pitfalls of Database Programming&lt;/a&gt; to help me understand if I was asking Hibernate to do something silly and I'm really glad that I did. &lt;br /&gt;&lt;br /&gt;Some of the anti-patterns I've seen before, like not using using constraints or using a column to mean multiple things, but there are many I haven't seen before but should now be able to spot.  I enjoyed the discussions around security and can appreciate that storing passwords in the database is a bad idea (I've seen that more than once) and have a better understanding on how to protect against SQL injection attacks.  The section on application development was a pleasant surprise to me because it talks about testing and possible migration strategies. I also enjoyed the comparison of the Active Record pattern versus the Repository pattern as it convinced me that the decision to use Repository on my current project was a reasonable one.  &lt;br /&gt;&lt;br /&gt;All in all, I loved the book and recommend that anybody who has to deal with a relational store pick up a copy and give it a read.  It isn't a very long book and you get the sense that the advice given came from some hard learned lessons on the job.   &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.goodreads.com/review/list/3171435-ronald"&gt;View all my reviews&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-8159997360294888078?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/8159997360294888078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/09/quick-book-review-sql-antipatterns.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/8159997360294888078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/8159997360294888078'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/09/quick-book-review-sql-antipatterns.html' title='Quick Book Review: SQL Antipatterns: Avoiding the Pitfalls of Database Programming'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-1822912178054578452</id><published>2011-08-26T09:45:00.001-04:00</published><updated>2011-08-26T09:45:02.649-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book-review'/><title type='text'>Quick Book Review: Driving Technical Change</title><content type='html'>&lt;a href="http://www.goodreads.com/book/show/7992960-driving-technical-change" style="float: left; padding-right: 20px;"&gt;&lt;img alt="Driving Technical Change" border="0" src="http://ecx.images-amazon.com/images/I/419MBVqGtgL._SX106_.jpg" /&gt;&lt;/a&gt;&lt;a href="http://www.goodreads.com/book/show/7992960-driving-technical-change"&gt;Driving Technical Change&lt;/a&gt; by &lt;a href="http://www.goodreads.com/author/show/3466171.Terrence_Ryan"&gt;Terrence Ryan&lt;/a&gt;&lt;br /&gt;My rating: &lt;a href="http://www.goodreads.com/review/show/196859183"&gt;3 of 5 stars&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ever come across a shiny new technique or tool but couldn't get it adopted by your organization?  I know I have.  This book contains some ideas on how you might get people to give your idea a try.  The information contained in the book isn't likely to be used daily like some other books but when you really want to try something new and have run into a road block, the book has some interesting ideas.  The essence of the book is to try and identify the different archetypes of skeptics and use specific approaches to persuade them to your way of thinking.  Some archetypes include The Burned and The Ignorant.  Be warned, however, the techniques described aren't going to work overnight and you will have to apply them over time.  He doesn't spend much time on it but it is assumed you have done a bit of thinking to ensure that the shiny new tool makes sense for the business.  As I said before, you aren't likely to use this book daily but when you really want to install a new tool or technique, this book has some good ideas to try. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.goodreads.com/review/list/3171435-ronald"&gt;View all my reviews&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-1822912178054578452?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/1822912178054578452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/08/quick-book-review-driving-technical.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/1822912178054578452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/1822912178054578452'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/08/quick-book-review-driving-technical.html' title='Quick Book Review: Driving Technical Change'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-312769527169732623</id><published>2011-08-23T12:50:00.003-04:00</published><updated>2011-08-23T12:50:40.460-04:00</updated><title type='text'>Quick Book Review: Designed for Use: Create Usable Interfaces for Applications and the Web</title><content type='html'>&lt;a href="http://www.goodreads.com/book/show/11890985-designed-for-use" style="float: left; padding-right: 20px;"&gt;&lt;img alt="Designed for Use: Create Usable Interfaces for Applications and the Web" border="0" src="http://photo.goodreads.com/books/1313466157m/11890985.jpg" /&gt;&lt;/a&gt;&lt;a href="http://www.goodreads.com/book/show/11890985-designed-for-use"&gt;Designed for Use: Create Usable Interfaces for Applications and the Web&lt;/a&gt; by &lt;a href="http://www.goodreads.com/author/show/4999261.Lukas_Mathis"&gt;Lukas Mathis&lt;/a&gt;&lt;br /&gt;My rating: &lt;a href="http://www.goodreads.com/review/show/193423287"&gt;3 of 5 stars&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I spend most of my programming time working on the back end of systems but have been called on to contribute to user interface portions of solutions.  I'll admit that UX is not a passion of mine but I thought it would be wise to better understand the thinking that goes into creating a usable interface, so I picked up a copy of the book.  At the very least, it would allow me to better contribute in meetings when I get asked my opinion on which option I think is best.&lt;br /&gt;&lt;br /&gt;Much like the rest of the software engineering world, there is no "one way to rule them all".  You have to understand what is out there, try something and test, test, test.  The book is split into techniques and ideas where techniques are concrete steps you can use to create a usable interface, such as paper prototyping.  Ideas, on the other hand, are more abstract and general covering topics such as how to write usable text or animations.  Being a UX newbie, most of the ideas in the book were new to me and I found them to be very interesting.  I especially liked the notion of capturing your user's context prior to exiting an application in an attempt to determine if they succeeded in their task or gave up frustrated.  Tracking what features your users actually use was also interesting probably because I've been in many discussions over adding complexity to a feature that nobody uses. Maybe there are ways to prove or disprove that assertion?  Apparently, much of UX is testing your design and getting useful feedback and there are discussions on various ways to do that.  &lt;br /&gt;&lt;br /&gt;Overall, I found the book to be useful as it gave me broad coverage in the topic and pointed me to resources in case I wanted more depth.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.goodreads.com/review/list/3171435-ronald"&gt;View all my reviews&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-312769527169732623?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/312769527169732623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/08/quick-book-review-designed-for-use.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/312769527169732623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/312769527169732623'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/08/quick-book-review-designed-for-use.html' title='Quick Book Review: Designed for Use: Create Usable Interfaces for Applications and the Web'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-8040311253255058764</id><published>2011-08-19T09:09:00.000-04:00</published><updated>2011-08-19T09:09:22.978-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book-review'/><title type='text'>Quick Book Review: The Agile Samurai: How Agile Masters Deliver Great Software</title><content type='html'>&lt;a href="http://www.goodreads.com/book/show/8248700-the-agile-samurai" style="float: left; padding-right: 20px;"&gt;&lt;img alt="The Agile Samurai: How Agile Masters Deliver Great Software" border="0" src="http://photo.goodreads.com/books/1300680505m/8248700.jpg" /&gt;&lt;/a&gt;&lt;a href="http://www.goodreads.com/book/show/8248700-the-agile-samurai"&gt;The Agile Samurai: How Agile Masters Deliver Great Software&lt;/a&gt; by &lt;a href="http://www.goodreads.com/author/show/4022260.Jonathan_Rasmusson"&gt;Jonathan Rasmusson&lt;/a&gt;&lt;br /&gt;My rating: &lt;a href="http://www.goodreads.com/review/show/196860144"&gt;4 of 5 stars&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I enjoyed this book and found that it had useful information.  I am not Scrum certified and haven't picked up an XP book in years and enjoyed reading about the current state of the Agile world.  The book feels authentic because the author lets you know throughout the book that the goal is to write great software that is useful to your customers and there is no one way to do that -- you have to be open to ideas and give them a whirl on your project.  I'll have to revisit the chapter on estimation because that is the part of the job I typically struggle with.  The notion of an Inception Deck is one I had not heard of before and found it very compelling.  I'll have to try it myself to see if it works for us but it looks like it could be very useful and a tad bit scary -- you have to ask some tough questions when creating the deck.  In short, I think the Pragmatic Programmer guys have produced another DRM-free, interesting and useful book.  Two thumbs up.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.goodreads.com/review/list/3171435-ronald"&gt;View all my reviews&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-8040311253255058764?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/8040311253255058764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/08/quick-book-review-agile-samurai-how.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/8040311253255058764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/8040311253255058764'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/08/quick-book-review-agile-samurai-how.html' title='Quick Book Review: The Agile Samurai: How Agile Masters Deliver Great Software'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-2744842847186874853</id><published>2011-08-15T15:55:00.001-04:00</published><updated>2011-08-15T15:55:14.561-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book-review'/><title type='text'>Quick Book Review: Dependency Injection</title><content type='html'>&lt;a href="http://www.goodreads.com/book/show/6379134-dependency-injection" style="float: left; padding-right: 20px;"&gt;&lt;img alt="Dependency Injection" border="0" src="http://photo.goodreads.com/books/1266667781m/6379134.jpg" /&gt;&lt;/a&gt;&lt;a href="http://www.goodreads.com/book/show/6379134-dependency-injection"&gt;Dependency Injection&lt;/a&gt; by &lt;a href="http://www.goodreads.com/author/show/2890887.Dhanji_Prasanna"&gt;Dhanji Prasanna&lt;/a&gt;&lt;br /&gt;My rating: &lt;a href="http://www.goodreads.com/review/show/94649950"&gt;3 of 5 stars&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've have been a user of the Spring framework for years now and like to think I know a thing or two about DI so I was a dubious about the book, but I checked my ego at the door and purchased the book anyway.  I'm glad that I did.  For one thing, being a Spring fan it was nice to see some examples of Guice, another popular DI framework.  The author helped clarify the nuances of scoping and provided some interesting ideas on how to apply custom scopes.  The book also reminds us how important it is to remember about thread safety when creating DI managed services.  If you are new to the DI world then you should pick up this book.  If you are a DI veteran, then some of the material will be familiar to you but I am confident that there are some nuggets in there worth the purchase price.  If I could give it a 3 1/2 stars I would.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.goodreads.com/review/list/3171435-ronald"&gt;View all my reviews&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-2744842847186874853?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/2744842847186874853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/08/quick-book-review-dependency-injection.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/2744842847186874853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/2744842847186874853'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/08/quick-book-review-dependency-injection.html' title='Quick Book Review: Dependency Injection'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-1140712166292572641</id><published>2011-08-08T08:32:00.002-04:00</published><updated>2011-08-08T08:33:04.779-04:00</updated><title type='text'>Transparent Language: We're Hiring</title><content type='html'>My current employer is hiring and seeing that these are tough times for some, I figured I would spread the word.&amp;nbsp; All currently available positions can be found at the &lt;a href="http://www.transparent.com/about/careers.html"&gt;Transparent Language careers page&lt;/a&gt;, but below are a few highlights:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Front End Flex Developer&lt;/li&gt;&lt;li&gt;Front End Developer and Designer&lt;/li&gt;&lt;li&gt;Senior Software Engineer&lt;/li&gt;&lt;li&gt;Technical Support Project Manager&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/4159040525348802212-1140712166292572641?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/1140712166292572641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/08/were-hiring.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/1140712166292572641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/1140712166292572641'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/08/were-hiring.html' title='Transparent Language: We&apos;re Hiring'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-1378852451444773140</id><published>2011-08-05T08:56:00.000-04:00</published><updated>2011-08-05T08:56:18.562-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book-review'/><title type='text'>Quick Book Review: Specification by Example: How Successful Teams Deliver the Right Software</title><content type='html'>&lt;a href="http://www.goodreads.com/book/show/10288718-specification-by-example" style="float: left; padding-right: 20px;"&gt;&lt;img alt="Specification by Example: How Successful Teams Deliver the Right Software" border="0" src="http://photo.goodreads.com/books/1307392511m/10288718.jpg" /&gt;&lt;/a&gt;&lt;a href="http://www.goodreads.com/book/show/10288718-specification-by-example"&gt;Specification by Example: How Successful Teams Deliver the Right Software&lt;/a&gt; by &lt;a href="http://www.goodreads.com/author/show/1407215.Gojko_Adzic"&gt;Gojko Adzic&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My rating: &lt;a href="http://www.goodreads.com/review/show/181710275"&gt;3 of 5 stars&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I'm currently trying to better understand the &lt;a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development" rel="nofollow" target="_blank"&gt;BDD&lt;/a&gt; mind set and how it might improve things on my current project so I was really excited when Specification by Example showed up in my Kindle.  I was looking forward to finding a whole check list of dos and don'ts to help accelerate me to BDD nirvana.  Instead, I learned that implementation of SBE is very contextual -- one size does not fit all.  Different teams use different techniques.  The author interviewed several teams using SBE and discovered what worked and what didn't work for them.  Some teams started fresh on greenfield projects while others added SBE to existing brownfield projects.  Some common themes emerge, such as don't specify at the GUI level and implement your living documentation system as soon as possible, but to really dig out the nuggets I would suggest the following.  Read the book once cover to cover to get a grasp of what the teams went through.   After that, scan the book again looking for the pearls of wisdom that each team offers and create your own list of dos and don'ts.  From that you, should be able to get some ideas on what might apply to your current project.  I enjoyed the book and feel that it offers valuable insights but readers need to be aware that some work on their part will be required in order to get the full benefit of the book. Potential readers might want to visit the &lt;a href="http://specificationbyexample.com/" rel="nofollow" target="_blank"&gt;book's web site&lt;/a&gt; for a taste of what is inside. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.goodreads.com/review/list/3171435-ronald"&gt;View all my reviews&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-1378852451444773140?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/1378852451444773140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/08/quick-book-review-specification-by.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/1378852451444773140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/1378852451444773140'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/08/quick-book-review-specification-by.html' title='Quick Book Review: Specification by Example: How Successful Teams Deliver the Right Software'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-6474607498944911771</id><published>2011-07-28T14:23:00.004-04:00</published><updated>2011-07-28T14:23:55.991-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book-review'/><title type='text'>Quick Book Review: Zero Day</title><content type='html'>&lt;br /&gt;&lt;a href="http://www.goodreads.com/book/show/9763010-zero-day" style="float: left; padding-right: 20px;"&gt;&lt;img alt="Zero Day" border="0" src="http://photo.goodreads.com/books/1301992716m/9763010.jpg" /&gt;&lt;/a&gt;&lt;a href="http://www.goodreads.com/book/show/9763010-zero-day"&gt;Zero Day&lt;/a&gt; by &lt;a href="http://www.goodreads.com/author/show/3075959.Mark_Russinovich"&gt;Mark Russinovich&lt;/a&gt;&lt;br /&gt;My rating: &lt;a href="http://www.goodreads.com/review/show/167701975"&gt;4 of 5 stars&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Good book if you enjoy cyber terrorism and plausible scenarios. &amp;nbsp;Probably not enough explosions to make into a Michael Bay movie but fun none the less. I hear rumors about a sequel and will read that the instant it comes out. &amp;nbsp;Two thumbs up. &amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.goodreads.com/review/list/3171435-ronald"&gt;View all my reviews&lt;/a&gt;&lt;br /&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/4159040525348802212-6474607498944911771?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/6474607498944911771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/07/quick-book-review-zero-day.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/6474607498944911771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/6474607498944911771'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/07/quick-book-review-zero-day.html' title='Quick Book Review: Zero Day'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-3497811506857975317</id><published>2011-07-27T10:30:00.000-04:00</published><updated>2011-07-27T10:30:02.720-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book-review'/><title type='text'>Quick Book Review: Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions</title><content type='html'>&lt;br /&gt;&lt;a href="http://www.goodreads.com/book/show/85012.Enterprise_Integration_Patterns" style="float: left; padding-right: 20px;"&gt;&lt;img alt="Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions (The Addison-Wesley Signature Series)" border="0" src="http://photo.goodreads.com/books/1171058711m/85012.jpg" /&gt;&lt;/a&gt;&lt;a href="http://www.goodreads.com/book/show/85012.Enterprise_Integration_Patterns"&gt;Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions&lt;/a&gt; by &lt;a href="http://www.goodreads.com/author/show/48627.Gregor_Hohpe"&gt;Gregor Hohpe&lt;/a&gt;&lt;br /&gt;My rating: &lt;a href="http://www.goodreads.com/review/show/183040505"&gt;4 of 5 stars&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I wasn't really expecting to enjoy this book as much as I did but it is packed full of really useful information. &amp;nbsp;I've worked on a few systems that used enterprise-level messaging and I thought I had a good handle on the space but I picked up the book anyway just to deepen my knowledge. &amp;nbsp;I am really glad that I did. &amp;nbsp;It is very apparent that the authors have been involved in a variety of integrations and have managed to convert their experience into patterns. &amp;nbsp;The book does a good job of balancing the explanation of the patterns and their combination into solutions. &amp;nbsp;Given that there are numerous patterns to sift through, you will likely have to review the list when crafting a new solution to just to re-familiarize yourself with the possibilities. &amp;nbsp;The book can't tell you what solutions are right for your situation but it does a great job of making you think of the various aspects that need to be considered, such as configuration and control, security, logging and testing. &amp;nbsp;The examples bounce between Java and C# but they should be readable by most developers. &amp;nbsp;I highly recommend to anybody who is involved in any integration solutions. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.goodreads.com/review/list/3171435-ronald"&gt;View all my reviews&lt;/a&gt;&lt;br /&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/4159040525348802212-3497811506857975317?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/3497811506857975317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/07/quick-book-review-enterprise.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/3497811506857975317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/3497811506857975317'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/07/quick-book-review-enterprise.html' title='Quick Book Review: Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-7057757677706135905</id><published>2011-07-26T08:52:00.000-04:00</published><updated>2011-07-26T08:52:10.810-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book-review'/><title type='text'>Quick Book Review: Free: The Future of a Radical Pric</title><content type='html'>&lt;br /&gt;&lt;a href="http://www.goodreads.com/book/show/6150530-free" style="float: left; padding-right: 20px;"&gt;&lt;img alt="Free: The Future of a Radical Price" border="0" src="http://photo.goodreads.com/books/1255867094m/6150530.jpg" /&gt;&lt;/a&gt;&lt;a href="http://www.goodreads.com/book/show/6150530-free"&gt;Free: The Future of a Radical Price&lt;/a&gt; by &lt;a href="http://www.goodreads.com/author/show/1756.Chris_Anderson"&gt;Chris Anderson&lt;/a&gt;&lt;br /&gt;My rating: &lt;a href="http://www.goodreads.com/review/show/174847658"&gt;4 of 5 stars&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Even after a second reading, I still find valuable insights into how people view free, what the expectations are and how free can be used in a business environment. &amp;nbsp;Although I don't recommend it, you can skip to the back and look at the list of ways free can be employed. &amp;nbsp;The chapters before the list contain the interesting nuggets and should be read. &amp;nbsp;I enjoyed the book and it caused me to think about free in the context of software and how to monetize it via free. &amp;nbsp;The freemium model is the one I see the most but other interesting ones also exist.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.goodreads.com/review/list/3171435-ronald"&gt;View all my reviews&lt;/a&gt;&lt;br /&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/4159040525348802212-7057757677706135905?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/7057757677706135905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/07/quick-book-review-free-future-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/7057757677706135905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/7057757677706135905'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/07/quick-book-review-free-future-of.html' title='Quick Book Review: Free: The Future of a Radical Pric'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-8745789639972067384</id><published>2011-07-25T09:46:00.002-04:00</published><updated>2011-07-25T09:46:00.439-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book-review'/><title type='text'>Quick Book Review: Building and Testing with Gradle</title><content type='html'>&lt;br /&gt;&lt;a href="http://www.goodreads.com/book/show/11217528-building-and-testing-with-gradle" style="float: left; padding-right: 20px;"&gt;&lt;img alt="Building and Testing with Gradle" border="0" src="http://photo.goodreads.com/books/1311019016m/11217528.jpg" /&gt;&lt;/a&gt;&lt;a href="http://www.goodreads.com/book/show/11217528-building-and-testing-with-gradle"&gt;Building and Testing with Gradle&lt;/a&gt; by &lt;a href="http://www.goodreads.com/author/show/4815261.Matthew_McCullough"&gt;Matthew McCullough&lt;/a&gt;&lt;br /&gt;My rating: &lt;a href="http://www.goodreads.com/review/show/183015241"&gt;3 of 5 stars&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A short read but answers many of the questions a Gradle newbie would ask. &amp;nbsp;Much of the material was already familiar to me but I had to invest weeks to gain that knowledge. &amp;nbsp;If you are starting a Gradle project this book should be &amp;nbsp;sitting next to you. &amp;nbsp;One piece of advice, looking at the Gradle source will save you a bunch of time and give you new ideas on how to solve problems.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.goodreads.com/review/list/3171435-ronald"&gt;View all my reviews&lt;/a&gt;&lt;br /&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/4159040525348802212-8745789639972067384?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/8745789639972067384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/07/quick-book-review-building-and-testing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/8745789639972067384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/8745789639972067384'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/07/quick-book-review-building-and-testing.html' title='Quick Book Review: Building and Testing with Gradle'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-6700203658221032369</id><published>2011-07-22T09:44:00.002-04:00</published><updated>2011-07-22T09:58:32.013-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='book-review'/><title type='text'>Quick Book Review: The Cloud at Your Service</title><content type='html'>&lt;br /&gt;&lt;a href="http://www.goodreads.com/book/show/8839403-the-cloud-at-your-service" style="float: left; padding-right: 20px;"&gt;&lt;img alt="The Cloud at Your Service" border="0" src="http://photo.goodreads.com/books/1281476228m/8839403.jpg" /&gt;&lt;/a&gt;&lt;a href="http://www.goodreads.com/book/show/8839403-the-cloud-at-your-service"&gt;The Cloud at Your Service&lt;/a&gt; by &lt;a href="http://www.goodreads.com/author/show/507377.Jothy_Rosenberg"&gt;Jothy Rosenberg&lt;/a&gt;&lt;br /&gt;My rating: &lt;a href="http://www.goodreads.com/review/show/163899263"&gt;4 of 5 stars&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I was a bit skeptical when I flipped through the book but I'm glad I decided to pick up a copy. &amp;nbsp;Although I try and keep up with current technology, I'm not currently on a team that is knee deep in cloud technology and was a little surprised about how much I wasn't aware. &amp;nbsp;The book does a good job of presenting the primary arguments for the cloud and the types of scenarios where it can be useful but accounting for the fact that the technology is rapidly evolving. &amp;nbsp;I enjoyed the discussion of security because I just assumed that an in-house IT solution is more secure than a cloud one. &amp;nbsp;I've since changed my mind. &amp;nbsp;I also enjoyed the treatment of database sharding, which is a technique I've never personally had to employ, and was unaware of the issues that have to be thought through prior to use. &amp;nbsp;If you aren't already in the cloud but want to be prepared for when your boss says it is time I recommend reading this book today.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.goodreads.com/review/list/3171435-ronald"&gt;View all my reviews&lt;/a&gt;&lt;br /&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/4159040525348802212-6700203658221032369?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/6700203658221032369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/07/quick-book-review-cloud-at-your-service.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/6700203658221032369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/6700203658221032369'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/07/quick-book-review-cloud-at-your-service.html' title='Quick Book Review: The Cloud at Your Service'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-8385699308870448430</id><published>2011-07-07T09:54:00.000-04:00</published><updated>2011-07-07T09:54:57.708-04:00</updated><title type='text'>Continuous Delivery: Part 14</title><content type='html'>&lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-13.html"&gt;Last time&lt;/a&gt;, we talked a bit about whether or not our pipeline should support branches or not. &amp;nbsp;Today I would like to ask another question: are debug builds necessary? &amp;nbsp;Back in my C++ days, we would typically build two flavors of the software: one intended for production and one for development. &amp;nbsp;The production one was built with all optimization flags turned on and debugging symbols removed. &amp;nbsp;The development version was almost the opposite with the key being that debugging symbols were enabled. &amp;nbsp;In order to have a reasonable hope of tracking down a bug, you really wanted access to a debug version of the build. &amp;nbsp;The reason I bring up the topic is that one of the primary principles of the continuous delivery movement is to build your artifacts &lt;b&gt;once&lt;/b&gt; and then test the crap out of them before deploying into production. &amp;nbsp;Does a CD pipeline need to support debug builds?&lt;br /&gt;&lt;br /&gt;In the Java world, compiling without the debug flag isn't the end of the world. &amp;nbsp;Stack traces will contain useful information but you won't be able to look at local variables in your debugger. &amp;nbsp;One feature that is often put into a debug build are assertions which, in Java, are enabled/disabled at runtime, not compile time so a debug version isn't necessary. &amp;nbsp;Finally, logging messages are controlled at runtime as well. &amp;nbsp;Again, no debug version is necessary. &amp;nbsp;So, for my project, it looks like a debug version is not necessary but I see how it might be useful in other languages. &amp;nbsp;How might we do that?&lt;br /&gt;&lt;br /&gt;When we do our builds, not only do we create the primary artifact, such as a WAR file, we also create secondary artifacts. &amp;nbsp;Such artifacts include&amp;nbsp;production&amp;nbsp;source code , test binaries, test source and documentation. &amp;nbsp;Perhaps we could also create a debug version of the build and treat it as a secondary artifact? &amp;nbsp;Picture this, QA is running their manual tests and finds something wrong. &amp;nbsp;The bug report contains the candidate release version allowing the developer to pull down the debug artifact along with the accompanying source. &amp;nbsp;In theory, this should allow the developer to deploy a version very similar &amp;nbsp;to the one tested by QA. &amp;nbsp;Perhaps this is good enough to track down the defect without having the developer try and recreate the release on his own? &amp;nbsp;The price of such a solution is increased build time and storage space used by the artifact repository. &amp;nbsp;Sounds like something worth exploring. &amp;nbsp;Until next time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-8385699308870448430?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/8385699308870448430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/07/continuous-delivery-part-14.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/8385699308870448430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/8385699308870448430'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/07/continuous-delivery-part-14.html' title='Continuous Delivery: Part 14'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-955489798883694966</id><published>2011-07-01T09:31:00.000-04:00</published><updated>2011-07-01T09:31:05.002-04:00</updated><title type='text'>Have I Found My Application Logging Solution?</title><content type='html'>I've been programming for many years with the last decade working mostly with Java code. &amp;nbsp;One of the problems I've struggled with over the years centers around logging. &amp;nbsp;I have yet to work on a system where the logging didn't negatively impact the system in one way or another. &amp;nbsp;Typically, too much logging is used and you end up with "scroll blindness", missing the critical message, or it impacts the performance of the application. &amp;nbsp;I really like &lt;a href="http://www.michaelnygard.com/"&gt;Michael Nygard's&lt;/a&gt; view on logging which he presented in his book Release It!: Design and Deploy Production-Ready Software. &amp;nbsp;Among other things, Nygard recommends using error codes to drive log messages. &amp;nbsp;He reminds us that the folks in operations trying to keep the system healthy will read the logs more than the developers so their's should be the perspective we take when crafting logging solutions. I've been using his technique on recent systems and have liked the results -- &lt;a href="http://www.slf4j.org/"&gt;slf4j&lt;/a&gt; rocks!. Today I read a read a &lt;a href="http://www.dzone.com/links/r/high_performance_and_smarter_logging.html"&gt;great article&lt;/a&gt; that takes Nygard's advice to the next level.&lt;br /&gt;&lt;br /&gt;The article is filled with good observations and recommendations but the part I'm really enamored with is the author's idea of using a plainly human-unfriendly log format so that the information can quickly be sent to a central log repository and analysis service. &amp;nbsp;The idea is to reduce the stress of log processing on the applications and off-load that to some other node. &amp;nbsp;Here is an example of the log message:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;1300604499194,4,192168001002,20600,1001,2,500000&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To make sense of that you need to look an example logging API that is used to generate that message:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;public class LogClientFacade {&lt;br /&gt;&lt;br /&gt;      public void log(int logLevel, int instanceId, int subsystemId, int componentId, int errorCode);&lt;br /&gt;&lt;br /&gt;      public void logWithContext(int logLevel, int instanceId, int subsystemId, int componentId, int errorCode, Object[] contextInfo);&lt;br /&gt;&lt;br /&gt;      public void logWithEx(int logLevel, int instanceId, int subsystemId, int componentId, int errorCode, Throwable ex);&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I'm a huge Spring fan and use it to inject loggers into objects that indicate their desire to access one. &amp;nbsp;I can see enhancing the bean post-processor to automagically determine the application's instance, &amp;nbsp;sub-system and component, saving some boiler plate code. &amp;nbsp;I look forward to thinking about this to see if it might make sense on future projects. &amp;nbsp;Until next time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-955489798883694966?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/955489798883694966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/07/have-i-found-my-application-logging.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/955489798883694966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/955489798883694966'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/07/have-i-found-my-application-logging.html' title='Have I Found My Application Logging Solution?'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-7615992205280101235</id><published>2011-06-29T09:29:00.000-04:00</published><updated>2011-06-29T09:29:23.742-04:00</updated><title type='text'>How Can I Show Nice Code Snippets in Blogger?</title><content type='html'>Typically, when I blog I write about programming which means that I often show code snippets, as done in a &lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-12.html"&gt;previous post&lt;/a&gt;. &amp;nbsp;Although I like Blogger's convenience, I wish that it pretty printed my snippets. &amp;nbsp;Finally, I got off my butt and did some searching and came across two techniques. &amp;nbsp;The first, uses &lt;a href="http://concise-software.blogspot.com/2010/03/enabling-syntaxhighlighter-in-blogger.html"&gt;this recipe&lt;/a&gt; and allows you to stay within Blogger when crafting a snippet. &amp;nbsp;Here is an example of that:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: groovy"&gt;sourceCompatibility = 1.5&lt;br /&gt;version = '1.0'&lt;br /&gt;jar {&lt;br /&gt;    manifest {&lt;br /&gt;        attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A second option, which requires no Blogger template configuration, is to use &lt;a href="https://gist.github.com/"&gt;gist&lt;/a&gt;. &amp;nbsp;Here is an example of that:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1053752.js?file=Ronbo.groovy"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Which do you think looks better? &amp;nbsp;The two solutions are reasonably easy to implement and offer a better result than stock Blogger. &amp;nbsp;Until next time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-7615992205280101235?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/7615992205280101235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/how-can-i-show-nice-code-snippets-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/7615992205280101235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/7615992205280101235'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/how-can-i-show-nice-code-snippets-in.html' title='How Can I Show Nice Code Snippets in Blogger?'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-1536532816110689333</id><published>2011-06-25T10:29:00.000-04:00</published><updated>2011-06-27T08:26:52.628-04:00</updated><title type='text'>Are TDD and Polyglot Programming a Poor Combination?</title><content type='html'>&lt;a href="http://purpleplutonium.blogspot.com/2011/06/still-more-junit-auto-detection.html"&gt;Last time&lt;/a&gt;, we dug up some old tools that can help us to auto-detect our JUnit tests.&amp;nbsp; As I was writing up my thoughts for that post, my mind wandered a bit over to something I had been wanting to try and how it might impact testing.&lt;br /&gt;&lt;br /&gt;Test Driven Design (TDD) in increasingly becoming more accepted each day.&amp;nbsp; Part of TDD is to develop a code-test-code-test rhythm.&amp;nbsp; To this point, I've always written my tests in the same language that the implementation used -- typically Java.&amp;nbsp; On today's JVM, there are a vast array of different languages to chose from so does it make sense to use a different language to test than the one being used for production?&amp;nbsp; Neal Ford, in his book The Productive Programmer, has an example of a test written in two ways: once using Java and once in Groovy.&amp;nbsp; The Groovy one is more concise because it can skip over the reflection APIs used in the test.&amp;nbsp; Groovy can look similar to Java code if you want but it can also look different.&amp;nbsp; After you drop the typing, semi-colons and add in iteration constructs and closures, you are looking at a different beastie -- which leads me to my question.&amp;nbsp; Is there a cognitive penalty for constantly switching between programming languages? &lt;br /&gt;&lt;br /&gt;When TDD is flowing, you are constantly switching between the production abstraction and the tests that poke at it.&amp;nbsp; The focus is on how to verify the abstraction, not what language feature should be use to do that.&amp;nbsp; Groovy can look like Java so maybe the penalty isn't that great but what about jRuby?&amp;nbsp; Scala?&amp;nbsp; The syntax and language libraries aren't my only concern. What about the notion that TDD can help define better APIs because your tests are the first users of those APIs?&amp;nbsp; Are the APIs going to look differently&amp;nbsp; depending on what testing language I select?&amp;nbsp; &lt;a href="http://agile.dzone.com/news/tdd-adapted-mere-mortals"&gt;This viewpoint&lt;/a&gt; suggests that TDD doesn't guide you to a better design but, instead, to a less coupled and more testable one but that is a debate for another day.&lt;br /&gt;&lt;br /&gt;If anybody has any real-world experience with polyglot testing I would love to hear from you.&amp;nbsp; I'm thinking about applying it on a new project and hope to avoid any known issues.&amp;nbsp; Until next time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-1536532816110689333?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/1536532816110689333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/are-tdd-and-polyglot-programming-poor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/1536532816110689333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/1536532816110689333'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/are-tdd-and-polyglot-programming-poor.html' title='Are TDD and Polyglot Programming a Poor Combination?'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-1557926689924938909</id><published>2011-06-23T08:58:00.000-04:00</published><updated>2011-06-25T10:30:34.131-04:00</updated><title type='text'>Still More JUnit Auto-detection Solutions</title><content type='html'>In a &lt;a href="http://purpleplutonium.blogspot.com/2011/06/another-junit-test-auto-detection.html"&gt;previous post&lt;/a&gt;, I talked about a solution for automatically detecting JUnit tests and obviating the need for maintaining suite files. &amp;nbsp;As I walked into work this morning, I spotted a copy of &lt;a href="http://manning.com/rainsberger/"&gt;JUnit Recipes&lt;/a&gt; on my bookshelf. &amp;nbsp;The book is from 2004 and I haven't cracked it open for quite some time but I decided to see if a recipe for my problem existed. &amp;nbsp;Sure enough, Recipe 4.5 titled &lt;i&gt;&lt;b&gt;Scan the file system for tests&lt;/b&gt;&lt;/i&gt;&amp;nbsp;slapped me in the face and describes two solutions that might be useful to me. &amp;nbsp;Granted, JUnit 4 was not released until 2006 so it is possible that these solutions may no longer apply but I'll pass them on just in case. &amp;nbsp;One option is to use &lt;a href="http://gsbase.sourceforge.net/"&gt;Mike Bowler's GSBase library&lt;/a&gt; which contains the RecursiveTestSuite object. &amp;nbsp;Unfortunately, the project didn't load for me and may no longer exist. &amp;nbsp;Another option is to use &lt;a href="http://junit-addons.sourceforge.net/"&gt;Vladimir Bossicard's JUnit-addons&lt;/a&gt; DirectorySuiteBuilder object. &amp;nbsp;This site, thankfully, loaded but does not appear to have been updated recently. &amp;nbsp;The documentation says that the file system is scanned for tests candidates and that you provide a custom filter based on the class name and class meta-data. &amp;nbsp;I bet I could write a simple filter that could look for the new Category annotation. &amp;nbsp;The DirectorySuiteBuilder does deviate from what I want in one respect: it scans the file system and not the classpath. &amp;nbsp;Using a solution that searches the classpath has the potential for being more portable. &amp;nbsp;For example, I'm looking into how difficult it might be to embed some of our application's tests into the application itself. &amp;nbsp;Not having to deal with differing file system layouts would make it a bit easier. &amp;nbsp;If I ever get around to trying out DirectorySuiteBuilder, I'll let you know. &amp;nbsp;&lt;a href="http://purpleplutonium.blogspot.com/2011/06/are-tdd-and-polyglot-programming-poor.html"&gt;Next time&lt;/a&gt;, I hope, we'll get back to some more build pipe lining.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-1557926689924938909?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/1557926689924938909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/still-more-junit-auto-detection.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/1557926689924938909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/1557926689924938909'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/still-more-junit-auto-detection.html' title='Still More JUnit Auto-detection Solutions'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-2339390911091091527</id><published>2011-06-20T09:49:00.001-04:00</published><updated>2011-07-08T08:35:20.260-04:00</updated><title type='text'>Continuous Delivery: Part 13</title><content type='html'>&lt;a href="http://purpleplutonium.blogspot.com/2011/06/another-junit-test-auto-detection.html"&gt;Last time&lt;/a&gt; I promised to expand a bit on our Gradle file's ability to assemble Java code but I'd like to break that promise because something relevant to our pipeline just came across my desk: source code branching. &amp;nbsp;My investigations into a pipeline implementation assumed a main line build and nothing else. &amp;nbsp;Does the pipeline need to support branches or is building the trunk good enough? &amp;nbsp;Thinking back over the projects I've been involved in, I can remember both good and bad when it comes to branching the code.&lt;br /&gt;&lt;br /&gt;The good, and I'm being kind when I say good, involved branching code after a release into the wild. &amp;nbsp;The release branch was fairly stable and was only touched in order to fix bugs. &amp;nbsp;What got interesting is when we were asked to port a fix in the trunk to the release branch. &amp;nbsp;Typically, the code differed enough that you had to use diff tools and merge the changes in by hand -- a scary proposition to say the least.&lt;br /&gt;&lt;br /&gt;The bad happened when some disruptive feature was being created which typically took many weeks to develop. &amp;nbsp;If we were really lucky, we could have two feature branches going on at the same time. &amp;nbsp;If the feature developers were disciplined enough to merge from the trunk everyday, things worked out reasonably well. Even if they did, it was not uncommon for files to get moved around or otherwise refactored making it more difficult for the feature branch to stay in sync with the mainline. &amp;nbsp;Merging back into the trunk was always an adventure. &amp;nbsp;How does this relate to a CD pipeline?&lt;br /&gt;&lt;br /&gt;If the goal of a pipeline is always to deploy, does that apply to a feature branch? &amp;nbsp;In my experience, feature branches spend much of their time "broken" and don't fit the mold of something to be continuously deployed. &amp;nbsp;Release branches, however, may work. &amp;nbsp;I can see how bug fixes should seamlessly &amp;nbsp;progress through the system. &amp;nbsp;So how do we, in the context of a pipeline, give the business the ability to introduce new features and still keep the deployment train rolling? &amp;nbsp;One idea is to use &lt;a href="http://martinfowler.com/bliki/FeatureToggle.html"&gt;Feature Toggles&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The essence of Feature Toggles is to add the ability to enable/disable features so that development and testing can continue on the trunk. &amp;nbsp;There are build-time and run-time strategies that can be used, including configuration files, program parameters and annotations. &amp;nbsp;So, as far as the pipeline is concerned, we will focus on supporting release branches but not feature branches. &amp;nbsp;Using feature toggles appears to be better aligned with the continuous delivery mantra. &amp;nbsp;Hopefully, &lt;a href="http://purpleplutonium.blogspot.com/2011/07/continuous-delivery-part-14.html"&gt;next time&lt;/a&gt; we'll dig a bit more into our Gradle file and learn how to create more of the artifacts that will be consumed by step two of the piepline.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-2339390911091091527?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/2339390911091091527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-13.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/2339390911091091527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/2339390911091091527'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-13.html' title='Continuous Delivery: Part 13'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-6438131431128638561</id><published>2011-06-18T03:00:00.000-04:00</published><updated>2011-06-20T09:49:59.049-04:00</updated><title type='text'>Another JUnit Test Auto-detection Solution</title><content type='html'>&lt;a href="http://purpleplutonium.blogspot.com/2011/06/i-will-drop-testng-for-junit.html"&gt;Last time&lt;/a&gt;, I wrote about a solution that I came across that will allow me to auto-detect tests, eliminating the need to maintain JUnit suite files. &amp;nbsp;I was pleased to see a DM from and old&amp;nbsp;colleague pointing me to a &lt;a href="http://bit.ly/mjhCfp"&gt;library&lt;/a&gt; he had written to solve that problem. &amp;nbsp;I haven't had a chance to try out &lt;a href="http://dhemery.com/"&gt;Dale's&lt;/a&gt; solution but having worked with him for a few years I have no doubt that the solution is solid and does what is advertised. &amp;nbsp;I am really interested in perusing the source to see if I can glean its secret recipe for success. &amp;nbsp;I'll probably write about what I find out but my plan for &lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-13.html"&gt;next time&lt;/a&gt; is to continue down the pipeline road.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-6438131431128638561?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/6438131431128638561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/another-junit-test-auto-detection.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/6438131431128638561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/6438131431128638561'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/another-junit-test-auto-detection.html' title='Another JUnit Test Auto-detection Solution'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-6437713734316687846</id><published>2011-06-17T03:00:00.000-04:00</published><updated>2011-06-18T09:55:52.165-04:00</updated><title type='text'>I will drop TestNG for JUnit</title><content type='html'>&lt;a href="http://purpleplutonium.blogspot.com/2011/06/should-i-drop-testng-for-junit.html"&gt;Last time&lt;/a&gt; I was pondering whether or not to reexamine my preference of TestNG over JUnit.&amp;nbsp; I had mentioned that I was not willing to give up TestNG's ability to group tests as well as its auto-detection capabilities.&amp;nbsp; I did some poking around the web and was pleased to find that some smart folks have already solved the problem.&amp;nbsp; JUnit 4.8.2 now supports the notion of a Category which is a mechanism to logically group your tests. This is similar to TestNG's group feature.&amp;nbsp; The auto-detection of tests, however, is not built in.&lt;br /&gt;&lt;br /&gt;In order to solve that problem, you need to include a nifty library named &lt;a href="http://www.johanneslink.net/projects/cpsuite.jsp"&gt;ClasspathSuite&lt;/a&gt;.&amp;nbsp; It purpose in life is to scan your classpath for JUnit tests.&amp;nbsp; Awesome.&amp;nbsp; Some nice person &lt;a href="http://stackoverflow.com/questions/2176570/how-to-run-all-tests-belonging-to-a-certain-category-in-junit-4/2176791#2176791"&gt;posted a recipe for mixing auto-detection with Categories&lt;/a&gt; which I shamelessly ripped off.&amp;nbsp; I've &lt;a href="https://bitbucket.org/kurron/junit-exploration/"&gt;posted my learning test code on bitbucket&lt;/a&gt; in case anybody is interested.&amp;nbsp; It is close enough to what I get from TestNG that I'm willing to switch over to JUnit and see how that works out for me.&lt;br /&gt;&lt;br /&gt;I already see one thing I'll miss from TestNG which is the ability to identify all public methods in a class as tests with a single annotation.&amp;nbsp; In JUnit, you have to annotate each method but this is minor complaint.&amp;nbsp; Hopefully, moving back to JUnit will make integration with other tools less painful than it has been when I was using TestNG.&amp;nbsp; We shall see.&amp;nbsp; &lt;a href="http://purpleplutonium.blogspot.com/2011/06/another-junit-test-auto-detection.html"&gt;Next time&lt;/a&gt;, we'll get back to discussing the continuous delivery pipeline.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-6437713734316687846?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/6437713734316687846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/i-will-drop-testng-for-junit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/6437713734316687846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/6437713734316687846'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/i-will-drop-testng-for-junit.html' title='I will drop TestNG for JUnit'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-2990002876883091172</id><published>2011-06-16T03:00:00.000-04:00</published><updated>2011-06-17T09:00:09.295-04:00</updated><title type='text'>Should I drop TestNG for JUnit?</title><content type='html'>I thought I would take a break from our &lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-12.html"&gt;discussion on implementing a continuous delivery pipeline&lt;/a&gt; and revisit a decision I've made a while back. &amp;nbsp;First, some context.&lt;br /&gt;&lt;br /&gt;Yesterday, I was chatting with a good friend of mine who had mentioned that he was having trouble getting his Scala tests to run the way he wanted with TestNG. &amp;nbsp;I suggested that he try his test under JUnit and his response was "I don't like JUnit". &amp;nbsp;It was then that I remembered that years ago he and I had arrived at the same conclusion: TestNG was the best framework for how we tested. &amp;nbsp;Over time, JUnit has improved itself and both frameworks have borrowed ideas from each other giving developers a difficult choice of which tool to use. &amp;nbsp;My favorite features of TestNG are its ability to assign a test to multiple groups, eg unit, integration, smoke. &amp;nbsp;It also has the ability to scan your classpath for tests, freeing you from having to manually maintain an ever growing collection of tests to run. &amp;nbsp;You can also combine the two notions so that you can easily tell your build system to run all the smoke tests in one target and all the unit tests in another target. &amp;nbsp;Once I was reminded that my decision to use TestNG was based on data that is years old I started to wonder if &amp;nbsp;maybe it is time to revisit that decision?&lt;br /&gt;&lt;br /&gt;I went to the JUnit website and started reading the release notes. &amp;nbsp;Lo and behold I find a new feature called Categories which, on the surface, appear to be similar to TestNG's groups. &amp;nbsp;One less feature in TestNG's favor. &amp;nbsp;I continued to search for discussions on how to make JUnit auto-locate tests and &lt;a href="http://stackoverflow.com/questions/2176570/how-to-run-all-tests-belonging-to-a-certain-category-in-junit-4"&gt;came across one&lt;/a&gt; on stackoverflow that seemed to indicate that it is not a built in feature but can be coerced into doing it. &amp;nbsp;I'm seriously consider trying out JUnit again but it has to be able to support my two favorite TestNG features. &amp;nbsp;Why bother, you ask? &amp;nbsp;Primarily it is because JUnit appears to be the most popular choice for unit testing in Java. &amp;nbsp;For example, I've been using Spring Roo to help me bootstrap a Spring MVC project and it has the ability to generate the skeletons for the tests. &amp;nbsp;Guess what framework it supports? &amp;nbsp;You guessed it, JUnit. &amp;nbsp;JUnit has improved greatly since its 3.0 days and has a sizeable ecosystem surrounding it so I'll probably give it another chance. &amp;nbsp;If I can't get where I want to go using off-the-shelf components I may experiment with writing my own test runner -- maybe. &amp;nbsp;&lt;a href="http://purpleplutonium.blogspot.com/2011/06/i-will-drop-testng-for-junit.html"&gt;Next time&lt;/a&gt; we'll go back to our journey towards pipeline nirvana.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-2990002876883091172?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/2990002876883091172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/should-i-drop-testng-for-junit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/2990002876883091172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/2990002876883091172'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/should-i-drop-testng-for-junit.html' title='Should I drop TestNG for JUnit?'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-465106903946259512</id><published>2011-06-14T06:00:00.000-04:00</published><updated>2011-06-16T08:27:22.313-04:00</updated><title type='text'>Continuous Delivery: Part 12</title><content type='html'>&lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-11.html"&gt;Last time&lt;/a&gt;, we decided how we would structure the build files and I promised to finally start writing them.&amp;nbsp; Let's get started.&lt;br /&gt;&lt;br /&gt;The stage one build is responsible for compiling the production and test source as well as running the unit tests and some light-weight inspections.&amp;nbsp; The team recognizes that Java is a very capable but aging language and wishes to be bit more polyglot in their development.&amp;nbsp; Our past strategy for introducing something new into our tool box is to deploy it into test.&amp;nbsp; If the experiment fails, we won't impact the production system.&amp;nbsp; In our case, we are looking to simplify our test code and are willing to try some of languages available on the JVM, such a Groovy and jRuby.&amp;nbsp; Let's see if Gradle can help us do that.&lt;br /&gt;&lt;br /&gt;Gradle tries to simplify the developer's life by providing commonly required behavior in the form of plug-ins.&amp;nbsp; If your project adheres to the plug-in's conventions, then your build file can be very small.&amp;nbsp; Our primary requirement is to compile and package Java files and that can be done with a single line: &lt;b&gt;&lt;i&gt;apply plugin: 'java'&lt;/i&gt;&lt;/b&gt;.&amp;nbsp; If you've done this correctly, you should be able issue the command &lt;b&gt;&lt;i&gt;gradle tasks&lt;/i&gt;&lt;/b&gt; and see some build related tasks appear in the list, such as &lt;i&gt;classes&lt;/i&gt;.&amp;nbsp; Any .java files in &lt;i&gt;src/main/java&lt;/i&gt; and &lt;i&gt;src/test/java&lt;/i&gt; get compiled.&amp;nbsp; Most projects have dependencies on libraries and gradle needs to know what they are. There are a variety of ways to express the dependencies and here is an example of what I've done:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;dependencies {&lt;br /&gt;   compile module('aspectj:com.springsource.org.aspectj.weaver:1.6.8.RELEASE')&lt;br /&gt;   compile module('slf4j:slf4j-api:1.6.1')&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Including the Java plug-in and specifying the dependencies should be enough to let Gradle build your Java source files.&amp;nbsp; The documentation for the Java plug-in is good and you should use it to help guide your build file.&amp;nbsp; Like Maven, Gradle's Java plug-in supports&amp;nbsp; different classpaths based on context.&amp;nbsp; For example, the above snippet shows two libraries being added to the compile configration.&amp;nbsp; The testCompile configuration is the classpath used when compiling and running the tests.&amp;nbsp; The runtime and providedCompile are examples of other configurations.&lt;br /&gt;&lt;br /&gt;I'm out of time today but &lt;a href="http://purpleplutonium.blogspot.com/2011/06/should-i-drop-testng-for-junit.html"&gt;next time&lt;/a&gt; we'll continue to build out our stage one build file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-465106903946259512?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/465106903946259512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-12.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/465106903946259512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/465106903946259512'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-12.html' title='Continuous Delivery: Part 12'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-2180361119702448376</id><published>2011-06-13T06:00:00.000-04:00</published><updated>2011-06-15T08:25:53.031-04:00</updated><title type='text'>Continuous Delivery: Part 11</title><content type='html'>&lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-10.html"&gt;Last time&lt;/a&gt;, we pondered how the Gradle build files should be organized.&amp;nbsp; It seems reasonable that each stage should have its own build file.&amp;nbsp; We also considered playing some games with Subversion to avoid having stage two check out source files that it won't be building.&amp;nbsp; After thinking about it some more, it seems clearer to have the two build files appear in its natural form and not do anything tricky with the VCS.&amp;nbsp; Although this may fall into the category of YAGNI, I'm not sure that the DVCS systems we are likely to move to in the future, such as Mercurial and Git, can support the virtual layout mechanism we were thinking about employing.&amp;nbsp; Second, if a developer wanted to test out stage two on her box, she would have to keep two working areas, one for each stage, which seems like a hassle.&amp;nbsp; Finally, the plan is to store library dependencies in a repository and not as part of the source tree which should help to keep its size reasonable. &lt;br /&gt;&lt;br /&gt;In summary, we will have two build files, &lt;i&gt;build.gradle&lt;/i&gt; and &lt;i&gt;stage-two.gradle&lt;/i&gt;, living at the root of the source tree with common logic stored in &lt;i&gt;shared.gradle&lt;/i&gt;.&amp;nbsp; The stage one build will use &lt;i&gt;build.gradle&lt;/i&gt; and the stage two build will invoke &lt;i&gt;stage-two.gradle&lt;/i&gt;.&amp;nbsp; The clarity of keeping the various build files together in an understandable manner outways any potential performance benefits of not downloading files that won't be built.&amp;nbsp; &lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-12.html"&gt;Next time&lt;/a&gt;, I promise, we'll start crafting the build files.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-2180361119702448376?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/2180361119702448376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-11.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/2180361119702448376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/2180361119702448376'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-11.html' title='Continuous Delivery: Part 11'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-4935235071100343468</id><published>2011-06-10T06:00:00.000-04:00</published><updated>2011-06-13T08:42:26.617-04:00</updated><title type='text'>Continuous Delivery: Part 10</title><content type='html'>&lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-09.html"&gt;Last time&lt;/a&gt; we talked a little bit about how the source files are laid out and promised to start writing some Gradle code.&amp;nbsp; I may have been a bit premature.&lt;br /&gt;&lt;br /&gt;One thing we need to consider is Gradle in the context of the CD pipeline.&amp;nbsp; Stage One is going to be the stage that does all the compilation and assembly of the code, along with some light testing.&amp;nbsp; Stage Two is going to perform all the automated tests and deep inspection of the artifacts.&amp;nbsp; To avoid leakage of stage one build constructs into stage two, I'm thinking we need to create two build files: one for each stage.&amp;nbsp; Gradle allows the specification of a build file via the &lt;b&gt;&lt;i&gt;--build-file&lt;/i&gt;&lt;/b&gt; option so that should be doable.&amp;nbsp; Using a script based plug-in, we should be able to share common Gradle code between the two files.&amp;nbsp; If we imagine the build running in a CI environment, we have to ask this question: should the stage two build be part of the stage one source tree or independent?&amp;nbsp; Asked another way, should stage two endure the overhead of checking out the entire project despite the fact it is not going to do any building?&amp;nbsp; In our small example project, the overhead is not significant.&amp;nbsp; In a larger project, however, it may be a factor.&amp;nbsp; I guess it boils down to a few issues:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; how can the two Gradle build files share common code if they reside in different areas of VCS?&lt;/li&gt;&lt;li&gt;do the files need to live in different area of VCS or can we play Subversion tricks and just grab what we need?&lt;/li&gt;&lt;li&gt;is how stage two gets its artifacts from stage one a factor in the decision?&lt;/li&gt;&lt;li&gt;is separating things too hard to do at this point and should be tabled to a later date?&lt;/li&gt;&lt;/ul&gt;Interesting questions but I'm out of time for today so we'll have to ponder them &lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-11.html"&gt;next time&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-4935235071100343468?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/4935235071100343468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-10.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/4935235071100343468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/4935235071100343468'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-10.html' title='Continuous Delivery: Part 10'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-723984850011597488</id><published>2011-06-09T09:00:00.000-04:00</published><updated>2011-06-10T08:27:09.696-04:00</updated><title type='text'>Continuous Delivery: Part 09</title><content type='html'>&lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-08.html"&gt;Last time&lt;/a&gt; we talked a bit about how you might want to load up the Gradle source into your IDE whenever you start doing Gradle work because it'll save you plenty of time.&amp;nbsp; Today, we'll talk about the directory structure and the project we'll be creating to test out the CD pipeline.&lt;br /&gt;&lt;br /&gt;First off, I'm a big fan of the &lt;a href="http://www.springsource.org/"&gt;Spring framework&lt;/a&gt; and have created a simple template project that I use to bootstrap new projects.&amp;nbsp; I also use it to see how things change between Spring releases.&amp;nbsp; This is the project we'll be using to test out our pipeline.&amp;nbsp; It is a simple web application that exposes a basic RESTful service that is tested using Spring's RestTemplate.&amp;nbsp; The application also uses Spring Social to make a quick Twitter call to get a list of an account's followers.&amp;nbsp; Nothing fancy but it does mimic what you might find in a typical application.&lt;br /&gt;&lt;br /&gt;The layout of the project attempts to follow the Maven conventions.&amp;nbsp; Although I don't use Maven on my personal projects, I really like what they have done with dependency management and encouraging standard project layouts.&amp;nbsp; Our project follows their conventions and looks something like this:&lt;br /&gt;&lt;br /&gt;src/main/java&lt;br /&gt;src/main/groovy&lt;br /&gt;src/main/resources&lt;br /&gt;src/test/java&lt;br /&gt;src/test/groovy&lt;br /&gt;src/test/resources&lt;br /&gt;buildSrc/src/main/groovy&lt;br /&gt;buildSrc/src/main/java&lt;br /&gt;&lt;br /&gt;The files under src/main contain the production code and the files under src/test contain the test code.&amp;nbsp; Files under buildSrc are the custom Gradle plug-ins we'll write.&amp;nbsp; The project is implemented in Java but we added Groovy directories so that we could test out how polyglot programming might work under Gradle, especially in the context of testing.&lt;br /&gt;&lt;br /&gt;In our shop, we've settled on the following definitions for tests:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; unit - testing of a single object isolated from its dependencies, driven by TestNG and Mockito&lt;/li&gt;&lt;li&gt;component - testing of a set of cooperating objects but does not require the entire application to be up and running, driven by a combination of TestNG and Spring's testing objects&lt;/li&gt;&lt;li&gt;system - testing of the fully assembled system running in a production like environment, driven by a variety of tools including TestNG and SoapUI.&lt;/li&gt;&lt;li&gt;UAT - testing of what the application does from the perspective of the user.&amp;nbsp; This is a new area for us and we hope to use Cucumber to drive the UATs but that may just be a disaster in waiting.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;All our tests live in the src/test directory and use annotations to group our tests.&amp;nbsp; For example, we use TestNG's group notion to tag tests as either unit, component or system.&amp;nbsp; Cucumber has a similar feature in its framework which should allow us to group those as needed.&lt;br /&gt;&lt;br /&gt;That's it for today but now you have a better understanding of how the code is organized and how we are thinking about attacking tests.&amp;nbsp; &lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-10.html"&gt;Next time&lt;/a&gt;, we'll actually write some Gradle code and get this bad boy building.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-723984850011597488?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/723984850011597488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-09.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/723984850011597488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/723984850011597488'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-09.html' title='Continuous Delivery: Part 09'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-6363267846377139145</id><published>2011-06-08T09:00:00.000-04:00</published><updated>2011-06-08T09:14:40.515-04:00</updated><title type='text'>Continuous Delivery: Part 08</title><content type='html'>&lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-07.html"&gt;Last time&lt;/a&gt;, we decided to go with a single project layout.&amp;nbsp; It doesn't allow for much reuse but it is the simplest to implement.&amp;nbsp; Today we'll talk about implementing the build in Gradle.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tip:&lt;/b&gt; load up the Gradle source into your favorite IDE before you do any Gradle work.&amp;nbsp; You'll be glad you did.&amp;nbsp; The documentation is generally pretty useful but if you really want to know what is going on or want to do something out of the ordinary, looking at the code will make it easier. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tip:&lt;/b&gt; write a plug-in.&amp;nbsp; Taking the time to write a simple plug-in will help you to better understand how Gradle is put together and gives you another option for packaging your logic.&amp;nbsp; Plug-ins take a few forms.&amp;nbsp; One, is a simple file inclusion where you are importing a Gradle file and looks like this: &lt;i&gt;apply from: 'shared.gradle'&lt;/i&gt;.&amp;nbsp; Another form manifests as Groovy and Java files.&amp;nbsp; The simplest version of this type live in your project's &lt;i&gt;buildSrc/src/main/groovy&lt;/i&gt; or &lt;i&gt;buildSrc/src/main/java&lt;/i&gt;.&amp;nbsp; Understanding how plug-ins work makes it easier to figure out where to look when reverse engineering existing Gradle logic.&lt;br /&gt;&lt;br /&gt;I'm out of time for today so next time we'll discuss the directory structure of the project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-6363267846377139145?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/6363267846377139145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-08.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/6363267846377139145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/6363267846377139145'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-08.html' title='Continuous Delivery: Part 08'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-107211534011043600</id><published>2011-06-07T09:00:00.000-04:00</published><updated>2011-06-07T09:00:08.806-04:00</updated><title type='text'>Continuous Delivery: Part 07</title><content type='html'>&lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-06.html"&gt;Last time&lt;/a&gt; we mulled over the selection of a build tool and arrived at Gradle. &amp;nbsp;Now we have to decide how to layout the project files. &amp;nbsp;There are two options: one is to have a single project that contains the code for the entire system from presentation to persistence -- soup to nuts. &amp;nbsp;The other option is to create smaller interdependent projects that comprise the solution. &amp;nbsp;To help us decide, we need to quickly examine the tensions between the three major parties that care about the project layout.&lt;br /&gt;&lt;br /&gt;The first party is the developer. &amp;nbsp;Ideally, she just wants to issue a single check out command, point her IDE at the source and get to work. &amp;nbsp;In our shop, Eclipse-based IDEs are the norm, such as &lt;a href="http://www.springsource.com/developer/sts"&gt;SpringSource Tool Suite&lt;/a&gt; and &amp;nbsp;&lt;a href="http://www.adobe.com/products/flash-builder.html"&gt;Adobe Flash Builder&lt;/a&gt;, and we need to account for its layout preferences. &amp;nbsp;In Eclipse parlance, individual Projects are collected together into a Workspace. &amp;nbsp;If we opt to have a single uber-project, we would have a single Workspace that contains a single Project. &amp;nbsp;If we opt to use a multi-project layout, the Workspace would contain multiple Projects and the Projects would refer to each other so as to share the various symbols each produces. &amp;nbsp;Our shop currently uses Subversion as its VCS which supports the notion of &lt;a href="http://svnbook.red-bean.com/en/1.5/svn.advanced.externals.html"&gt;Externals&lt;/a&gt; which can be used to present a virtual layout different from the physical one. &amp;nbsp;We can use that mechanism or a custom script to solve our "single checkout" requirement.&lt;br /&gt;&lt;br /&gt;If we switch perspectives to that of the CI server we'll see that the single project model is easier to implement. &amp;nbsp;Most of the documentation talks about building a project or showing the test results for a project. &amp;nbsp;Most don't even acknowledge that is even possible to create a chain of interdependent builds. &amp;nbsp;Let's says that we have a Client project that depends on APIs produced by the Server project. &amp;nbsp;The CI build sequence is to build Server first, export its artifacts to Client and build that. &amp;nbsp;The complexity comes from the export step. &amp;nbsp;The CI's reporting preference is also a factor. &amp;nbsp;Most CI servers can show test results and other reports for a project. &amp;nbsp;I have yet to see one that can aggregate the results for a set of projects into a single view. &amp;nbsp;It is easier for people to assess the health of a build if they see the results of the whole and don't have to visit each project's build page to see how the tests are doing.&lt;br /&gt;&lt;br /&gt;Finally, we need to look at things from the Gradle's perspective. &amp;nbsp;We must assume that Gradle will be official build tool. &amp;nbsp;The IDE's build is for convenience only and the developer is expected to execute the Gradle build prior to check in. &amp;nbsp;Gradle can easily handle single and multi-project layouts so, at first glance, our decision doesn't really matter. &amp;nbsp;If we combine the CI viewpoint with that of the developer, we see that there is certain amount of tension. &amp;nbsp;Assume that we have taken advantage of Subversion Externals and have created an Eclipse-friendly multi-project layout. &amp;nbsp;If we also assume that the CI server does not use the virtual layout but instead checks out just the individual projects we can see that &amp;nbsp;Gradle must support two views of the build landscape. &amp;nbsp;One view is the layout as seen on the developer's desktop where sibling projects can be accessed by using relative paths. &amp;nbsp;The layout on the CI server is isolated and has to obtain dependencies a different way. &amp;nbsp;Gradle must operate in both environments and needs to accommodate both views. &amp;nbsp;Gradle uses Groovy to express build logic so we should be able to put in the needed infrastructure to support both but it is likely to be complicated to implement. &amp;nbsp;For example, how can Gradle know, when running in a CI environment, how to obtain artifacts generated in previously built projects? &amp;nbsp; What is a good way to remain DRY and share common build logic when building a single project in a CI environment? Is it possible to aggregate reports of the individual projects into a single view?&lt;br /&gt;&lt;br /&gt;Once you think about, the seemly simple decision of whether to have a single uber-project or not is a bit more complex than originally thought. &amp;nbsp;Individual projects do appear to offer greater reuse between different solutions because you can share artifacts via an artifact repository but with greater development cost. &amp;nbsp;A single project is simpler to implement but doesn't support reuse like the individual project solution. &amp;nbsp;Given that we are trying to keep implementation time down for this project and that we are more interested in how the CD pipeline works, I'll opt for single project model. &amp;nbsp;If we find value in CD, then I'm sure we'll revisit the single- vs. multi-project layout decision.&lt;br /&gt;&lt;br /&gt;I've rambled on enough for today but at least we've selected a project layout style. &amp;nbsp;Next time, we begin crafting our Gradle build and I'll share a few tips that I've learned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-107211534011043600?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/107211534011043600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-07.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/107211534011043600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/107211534011043600'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-07.html' title='Continuous Delivery: Part 07'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-8212168054438736282</id><published>2011-06-06T09:30:00.000-04:00</published><updated>2011-06-07T09:43:55.363-04:00</updated><title type='text'>Continuous Delivery: Part 06</title><content type='html'>&lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-05.html"&gt;Last time&lt;/a&gt; we listed some of the potential tools that we might use in our CD solution and came to realize that there are numerous moving parts.&amp;nbsp; Today we'll focus on one aspect: the build tool.&lt;br /&gt;&lt;br /&gt;The candidates are Ant, Maven and Gradle.&amp;nbsp; The team is already comfortable with Ant but it really isn't anyone's favorite tool.&amp;nbsp; Yes, it has many of the pieces needed to build a Java project and is also being used to build our ActionScript projects.&amp;nbsp; Yes, it is integrated with most IDEs and yes, there are custom Ant tasks to bind it to various tools.&amp;nbsp; Ant, however, is a blank slate and doesn't make it easy to create a working build and applying conditional logic can be a pain.&lt;br /&gt;&lt;br /&gt;"Apache Maven is a software project management and comprehension tool" which sounds ambitious.&amp;nbsp; My favorite feature is its ability to manage library dependencies and I also like how it encourages a standard directory structure.&amp;nbsp; On the negative, Maven can be a bitch if something doesn't work right.&amp;nbsp; For example, I worked on a project were the automated tests were getting run twice and it turned out to be a "known problem".&amp;nbsp; If you don't do things the Maven way, you will be in constant debug mode, despite what the documentation says.&amp;nbsp; I admit, it has been a while since I've been involved with a Maven build and haven't looked at Maven 3 but I doubt things have changed that much.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Gradle is an interesting approach in that it combines a DSL expressed in the Groovy language with Apache Ivy producing a powerful build environment.&amp;nbsp; As an added benefit, it has Ant support so that, in theory, anything you do can do in Ant can be done in Gradle.&amp;nbsp; I've been annoyed enough with Ant and Maven that I once wrote a build system that was 80% Ant and 20% Groovy and managed to create a reasonably powerful build system that had reasonable defaults, freeing the developer from having to specify most things.&amp;nbsp; Gradle stole a page from the Maven playbook and supports common tasks via plug-ins.&amp;nbsp; Gradle also has support for multi-project builds.&lt;br /&gt;&lt;br /&gt;Gradle sounds good but what are the risks?&amp;nbsp; First, at the time of this writing, it still in release candidate status so 1.0 hasn't shipped.&amp;nbsp; Second, none of the team has any real experience with it.&amp;nbsp; Third, only IntelliJ appears to have baked-in support for it.&amp;nbsp; Eclipse might, but I haven't waded through the zillions of plug-ins that could be installed.&amp;nbsp; Since we are talking about implementing CD on a low-risk pilot project, picking Gradle doesn't sound like something anybody could get fired over and Plan B would simply be to re-write the build in terms of Ant.&lt;br /&gt;&lt;br /&gt;Now that we've selected Gradle as the build tool we now have to decide what to do with it?&amp;nbsp; Do we create a single monster project or use a set of cooperating individual projects?&amp;nbsp; That will be the discussion for &lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-07.html"&gt;next time&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-8212168054438736282?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/8212168054438736282/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-06.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/8212168054438736282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/8212168054438736282'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-06.html' title='Continuous Delivery: Part 06'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-4806536500818362882</id><published>2011-06-05T09:00:00.000-04:00</published><updated>2011-06-06T09:54:41.492-04:00</updated><title type='text'>Continuous Delivery: Part 05</title><content type='html'>&lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-04.html"&gt;Last time&lt;/a&gt;, we talked a bit about the vision for a CD pipeline.&amp;nbsp; This time we'll toss around some candidate technologies.&lt;br /&gt;&lt;br /&gt;The first thing we'll need is a CI server.&amp;nbsp; Being an Atlassian shop, &lt;a href="http://www.atlassian.com/software/bamboo/"&gt;Bamboo&lt;/a&gt; seems like a reasonable choice.&amp;nbsp; The folks over at ThoughtWorks have their &lt;a href="http://www.thoughtworks-studios.com/go-agile-release-management"&gt;GO&lt;/a&gt; solution which has the added benefit of being designed by the author of the CD book. &lt;a href="http://jenkins-ci.org/"&gt;Jenkins&lt;/a&gt;, a fork of Hudson, seems like an popular free solution.&lt;br /&gt;&lt;br /&gt;Another piece we'll need is a build tool.&amp;nbsp; The usual suspects are &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt; and &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; but &lt;a href="http://www.gradle.org/"&gt;Gradle&lt;/a&gt; looks really interesting. Complementing the build tools are artifact repositories, which boil down to &lt;a href="http://nexus.sonatype.org/"&gt;Nexus&lt;/a&gt; and &lt;a href="http://www.jfrog.com/"&gt;Artifactory&lt;/a&gt;, and the version control system.&amp;nbsp; For us, our current choice is &lt;a href="http://subversion.apache.org/"&gt;Subversion&lt;/a&gt; but I can see &lt;a href="http://mercurial.selenic.com/"&gt;Mecurial&lt;/a&gt; and &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; on the horizon. &lt;br /&gt;&lt;br /&gt;After the code is compiled and assembled, it needs to be tested.&amp;nbsp; Two popular testing frameworks are &lt;a href="http://www.junit.org/"&gt;JUnit&lt;/a&gt; and &lt;a href="http://testng.org/"&gt;TestNG&lt;/a&gt;.&amp;nbsp; For UAT, &lt;a href="http://cukes.info/"&gt;Cucumber&lt;/a&gt; appears to have the potential for being very useful for UATs and&amp;nbsp; I can't forget about &lt;a href="http://www.soapui.org/"&gt;SoapUI&lt;/a&gt; for testing RESTful APIs.&amp;nbsp; We also need to see how much of the code has been tested so we'll need run a coverage tool, such a &lt;a href="http://cobertura.sourceforge.net/"&gt;Cobertura&lt;/a&gt;, &lt;a href="http://emma.sourceforge.net/"&gt;EMMA&lt;/a&gt; or &lt;a href="http://www.atlassian.com/software/clover/"&gt;Clover&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Once the code is tested, it needs to be inspected for various quality and standards violations.&amp;nbsp; &lt;a href="http://findbugs.sourceforge.net/"&gt;FindBugs&lt;/a&gt; can help find common bug patterns in the code.&amp;nbsp; &lt;a href="http://checkstyle.sourceforge.net/"&gt;Checkstyle&lt;/a&gt; and &lt;a href="http://pmd.sourceforge.net/"&gt;PMD&lt;/a&gt; can look for coding violations and bad practices while &lt;a href="http://pmd.sourceforge.net/cpd.html"&gt;CPD&lt;/a&gt; can help keep the code DRY.&amp;nbsp; &lt;a href="http://www.sonarsource.org/"&gt;Sonar&lt;/a&gt;, thankfully, can run all of these tools for you and perform trending analysis.&lt;br /&gt;&lt;br /&gt;In the grab bag category, we'll take a peek at &lt;a href="http://schemaspy.sourceforge.net/"&gt;SchemaSpy&lt;/a&gt;, &lt;a href="http://www.stack.nl/%7Edimitri/doxygen/index.html"&gt;Doxygen&lt;/a&gt; and &lt;a href="http://www.umlgraph.org/"&gt;UmlGraph&lt;/a&gt; for generating documentation and &lt;a href="http://www.liquibase.org/"&gt;Liquibase&lt;/a&gt; and &lt;a href="http://dbdeploy.com/"&gt;dbdeploy&lt;/a&gt; to assist with rollback of deployments.&lt;br /&gt;&lt;br /&gt;Holy smokes, that is a lot of stuff to look at and is going to take a bit of time to wade through.&amp;nbsp; &lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-06.html"&gt;Next time&lt;/a&gt;, we talk about what we want to use for building the code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-4806536500818362882?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/4806536500818362882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-05.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/4806536500818362882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/4806536500818362882'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-05.html' title='Continuous Delivery: Part 05'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-4410956805049133155</id><published>2011-06-04T09:00:00.000-04:00</published><updated>2011-06-05T18:15:45.183-04:00</updated><title type='text'>Continuous Delivery: Part 04</title><content type='html'>&lt;a href="http://purpleplutonium.blogspot.com/"&gt;Last time&lt;/a&gt; we talked about some of the parameters surrounding the project so this time I figured I would talk a little bit about the pipeline we want to set up.&amp;nbsp; After a few discussions with the team, we came up with a four stage pipeline, with two being automated and two being manual:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;stage one - compile, package, unit tests, documentation and basic inspection&lt;/li&gt;&lt;li&gt;stage two - automated tests (unit, component, system and user acceptance), deeper code inspection, publication to repository&lt;/li&gt;&lt;li&gt;stage three - manual testing (functional, longevity, performance)&lt;/li&gt;&lt;li&gt;stage four - deployment to&amp;nbsp;production&lt;/li&gt;&lt;/ol&gt;In stage one, we are trying to quickly verify that no egregious errors have been introduced, including compilation errors, too little unit test coverage or ridicuously long and/or complex routines.&amp;nbsp; We want stage one to run as quickly as reasonable because the developer's are supposed to run the stage on their desktops prior to check in and they are also supposed to wait until the stage completes on the CI server before moving on to their next task.&lt;br /&gt;&lt;br /&gt;In stage two, we are taking the artifacts generated in stage one and applying deeper inspections as well as running all of the automated tests.&amp;nbsp; As we will see in future discussions, implementing stage two can be challenging, for various reasons.&lt;br /&gt;&lt;br /&gt;In stage three, the changes have passed all automated testing and are ready for manul testing.&amp;nbsp; The goal is to have a tool in place that notifies the test team that a test candidate is&amp;nbsp;available and provides push-button deployment to the desired test environment.&amp;nbsp; Typically this will mean functional testing but, on occassion, we'll need to run non-functional tests, such as longevity tests.&amp;nbsp; Ideally, the tool used to notify the test team of candidates should also remind them when some of the non-functional tests need to be run.&lt;br /&gt;&lt;br /&gt;Finally, in stage four our push-button deploy tool should notify the operations folks that a release candidate is available for deployment.&amp;nbsp; This stage must include a rollback strategy in case something goes wrong.&amp;nbsp; Ideally, some form of smoke test should be available to ensure the sanity of the installation.&lt;br /&gt;&lt;br /&gt;Our pipeline should be triggered after a commit to the version control system (VCS) is done.&amp;nbsp; The idea is to better isolate who caused a breaking change.&amp;nbsp; The Blame Game is fun to watch once in a while but can become tedious on a regular basis.&lt;br /&gt;&lt;br /&gt;Now that we have an idea of what we want to happen in each stage, we can sift through some candidate technologies and see what shakes out.&amp;nbsp; We'll do that &lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-05.html"&gt;next time&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-4410956805049133155?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/4410956805049133155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-04.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/4410956805049133155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/4410956805049133155'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-04.html' title='Continuous Delivery: Part 04'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-4542913139330521204</id><published>2011-06-03T09:00:00.000-04:00</published><updated>2011-06-03T09:00:09.374-04:00</updated><title type='text'>Continuous Delivery: Part 03</title><content type='html'>&lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-02.html"&gt;Last time&lt;/a&gt;, we discussed how the CD project got kicked off and promised to review some of the project's parameters.&lt;br /&gt;&lt;br /&gt;We're not a huge company with near limitless resources and have made some investments in software and infrastructure.&amp;nbsp; The CD solution should leverage those investments when reasonable, keeping the dollar cost down.&amp;nbsp; We use several portions of the &lt;a href="http://www.atlassian.com/"&gt;Atlassian stack&lt;/a&gt; so it makes sense to look at their CI server to see if it can meet our needs.&amp;nbsp; We are not afraid to use open-source software which opens up a whole lot of doors.&amp;nbsp; I prefer to select open source technologies that are mature enough to have some sort of commercial entity backing them, just in case we need some support.&amp;nbsp; The Spring framework and &lt;a href="http://www.springsource.com/"&gt;SpringSource&lt;/a&gt; are a good example of what I mean.&lt;br /&gt;&lt;br /&gt;Another restriction is that the solution can not take months to create.&amp;nbsp; There are too many projects that need attention and too few of us to do the work to spend on something that could &lt;b&gt;potentially&lt;/b&gt; improve things.&amp;nbsp; To me, this meant either finding a reasonably priced off-the-shelf solution or integrating various OSS parts together.&amp;nbsp; In any case, writing new software to make this happen or spending too much time working around defects in nascent technologies is out of the question.&amp;nbsp; This had to be done in a few weeks, not months. &lt;br /&gt;&lt;br /&gt;Finally, the solution has to work with Java based projects with ActionScript compatibility a "nice to have".&amp;nbsp; Java has been around for years with a mature ecosystem so compatibility with JVM-based languages shouldn't be a problem.&amp;nbsp; It will be interesting to see what tools are available on the ActionScript side.&lt;br /&gt;&lt;br /&gt;In summary, don't spend too much time or money crafting the CD solution and make it work with Java and ActionScript.&amp;nbsp; Next time, we'll discuss candidate technologies and maybe even pick one or two of them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-4542913139330521204?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/4542913139330521204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-03.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/4542913139330521204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/4542913139330521204'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-03.html' title='Continuous Delivery: Part 03'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-6405324364861611335</id><published>2011-06-02T09:00:00.000-04:00</published><updated>2011-06-03T09:27:24.927-04:00</updated><title type='text'>Continuous Delivery: Part 02</title><content type='html'>&lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-01.html"&gt;Last time&lt;/a&gt;, we kicked off the discussion about my particular continuous delivery solution.&amp;nbsp; This time I thought I would give a bit of context to the project.&lt;br /&gt;&lt;br /&gt;Like most software companies, mine is constantly looking to improve the software development process.&amp;nbsp; My manager was a developer in a previous life and understands how automation can ease certain pain points and kicked off a pilot project to see if continuous delivery is suitable for our development shop.&amp;nbsp; I have always been interested in improving the development process and have tried to stay current with the continuous integration landscape.&amp;nbsp; Unfortunately, my past shops have stopped at "continuous compilation" and weren't all that interested in automated testing, inspections or deployments.&amp;nbsp; Luckily, I attended an &lt;a href="http://www.nofluffjuststuff.com/"&gt;NFJS&lt;/a&gt; conference and one of the speakers encouraged people to grab a copy of &lt;a href="http://continuousdelivery.com/"&gt;Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation&lt;/a&gt; to see if some of its recommended practices would be relevant to our current situations.&amp;nbsp; I had heard of continuous integration, read some &lt;a href="http://www.integratebutton.com/"&gt;books on the topic&lt;/a&gt; and implemented a few "continuous compilation" servers at a few jobs but CD was new to me.&lt;br /&gt;&lt;br /&gt;I threw a copy on my Kindle and liked what I read.&amp;nbsp; The advice seemed sound and didn't reek of the all too frequent "do it this way and all will be well" seen in some software literature.&amp;nbsp; Some of the techniques described in the book were already underway in our shop so trying to build out a CD pipeline seemed like a good fit.&lt;br /&gt;&lt;br /&gt;Of course, no field is totally green and there are certain restrictions that have to be respected.&amp;nbsp; We'll discuss those restrictions &lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-03.html"&gt;next time&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-6405324364861611335?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/6405324364861611335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-02.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/6405324364861611335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/6405324364861611335'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-02.html' title='Continuous Delivery: Part 02'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-1995158741799092136</id><published>2011-06-01T09:12:00.000-04:00</published><updated>2011-06-02T09:05:00.822-04:00</updated><title type='text'>Continuous Delivery: Part 01</title><content type='html'>I've been involved in an effort to implement a &lt;a href="http://continuousdelivery.com/"&gt;continuous delivery&lt;/a&gt; system and have come to appreciate how difficult the solution can be.&amp;nbsp; Throughout this process I've come to rely heavily on the communities surrounding the various tools we are using in our implementation and have decided that I should give back by documenting what I've learned.&amp;nbsp; If I can save somebody an hour or two of hair pulling by pointing out a dead end path or sharing a tip, then I'll be happy.&lt;br /&gt;&lt;br /&gt;I'll be putting up short posts on a regular basis and will be discussing tools such as &lt;a href="http://www.gradle.org/"&gt;Gradle&lt;/a&gt;, &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;, &lt;a href="http://jenkins-ci.org/"&gt;Jenkins&lt;/a&gt;, &lt;a href="http://www.atlassian.com/software/bamboo/"&gt;Bamboo&lt;/a&gt;, &lt;a href="http://www.sonarsource.org/"&gt;Sonar&lt;/a&gt;, &lt;a href="http://testng.org/"&gt;TestNG&lt;/a&gt;, &lt;a href="http://cukes.info/"&gt;Cucumber&lt;/a&gt; and maybe even a little &lt;a href="http://en.wikipedia.org/wiki/ActionScript"&gt;ActionScript&lt;/a&gt;.&amp;nbsp; I warn you, however, that the solution is not yet complete and I really can't say exactly how this journey will end but it might be fun to stick around and see how it all turns out.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-02.html"&gt;Next time&lt;/a&gt;, I'll be discussing the context of the solution including the requirements, restrictions and the team that will be initially using the system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-1995158741799092136?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/1995158741799092136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-01.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/1995158741799092136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/1995158741799092136'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/06/continuous-delivery-part-01.html' title='Continuous Delivery: Part 01'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-3855359734436586435</id><published>2011-05-29T18:09:00.000-04:00</published><updated>2011-05-30T10:35:01.506-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='traeger'/><title type='text'>Why doesn't my Traeger heat up past 350 degrees?</title><content type='html'>I'm starting my second full season of grilling with my &lt;a href="http://www.traegergrills.com/"&gt;Traeger&lt;/a&gt; and I've run into an interesting problem: it won't heat up past 350 degrees.&amp;nbsp; This isn't a problem when I'm cooking ribs or some other "low and slow" meat but it is an issue when I'm trying to cook burgers or steak.&amp;nbsp; When I initially purchase the unit I remember it topping out right around 500 degrees.&amp;nbsp; When I replaced the stock thermostat with a digital one, the maximum temperature dropped to around 450, which was fine.&lt;br /&gt;&lt;br /&gt;Fast forward to this spring, I cleaned out the grill as it had spent the winter snuggled under its cover.&amp;nbsp; When I fired it up to verify everything was ok, the thermometer wouldn't get passed 320.&amp;nbsp; Thinking that it might be an issue with the digital thermostat, I swapped it out for the stock one.&amp;nbsp; No joy -- the Traeger still wouldn't climb much higher.&amp;nbsp; I used a kitchen digital thermometer to verify that the thermometer built into the grill wasn't somehow broken -- it wasn't.&amp;nbsp; I had read on the internet that sometimes the fuel can become damp with moisture and affect the heat output.&amp;nbsp; I swapped out the pellets for a different batch but it made no difference.&amp;nbsp; I even bought some non-Traeger brand pellets to see if that was the issue but no luck.&amp;nbsp; I cleaned everything out once again and tested to see how hot the grill could get with no grate, drip shield or anything that covers the fire box.&amp;nbsp; That configuration allowed me to hit 500 degrees with no problem.&amp;nbsp; Adding back the drip shield, however, decreased the grill's output back down the the 350 range.&amp;nbsp; I'm hoping that somebody might give me a tip or two on how to solve this problem.&amp;nbsp; I'll contact the folks at Traeger to see what they can do to help me.&amp;nbsp; I haven't dealt with their customer support before but I'm hoping they'll be able to help me out.&lt;br /&gt;&lt;br /&gt;Update: I was a bit on the bored side this Sunday afternoon so I asked Traeger for assistance in three ways: Twitter, Facebook and their website.&amp;nbsp; Five minutes after filling out the support form on the website, I got an e-mail listing 7 things I can try.&amp;nbsp; About 90 minutes later I got a phone call from Andy over at Traeger and he gave me some ideas as well.&amp;nbsp; On Facebook, Traeger left a comment stating that I should call them and they would help me out.&amp;nbsp; Nothing on the Twitter channel. &amp;nbsp; I haven't had a chance to try out their suggestions yet but I've got to say that I'm pleased thus far with the folks at Traeger.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-3855359734436586435?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/3855359734436586435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/05/why-doesnt-my-traeger-heat-up-past-350.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/3855359734436586435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/3855359734436586435'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/05/why-doesnt-my-traeger-heat-up-past-350.html' title='Why doesn&apos;t my Traeger heat up past 350 degrees?'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-7014167388861128692</id><published>2011-03-29T09:22:00.000-04:00</published><updated>2011-03-29T09:22:27.879-04:00</updated><title type='text'>How can I get Spring 3.0 MVC to use content negotiation for errors?</title><content type='html'>I'm a big fan of the Spring framework and have come to appreciate its REST support in the MVC module. I especially like how the client can request a specific representation by setting the Accept header in its request to a mime-type that the server understands, like&amp;nbsp;application/json. &amp;nbsp;That was easy enough to get running with the reference documentation and a little trial and error. &amp;nbsp;What I did struggle with, however, is getting Spring MVC to honor the requested format when returning error information. &amp;nbsp;It took some time tracing things in the debugger to finally figure out the secret sauce so I figured I'd save people some time and share what I know with the rest of the world.&lt;br /&gt;&lt;br /&gt;First, a little context. &amp;nbsp;I use JAXB annotations on my DTOs and let the Spring OXM layer translate between Java and XML. &amp;nbsp;One of those DTOs is a Fault object that contains an error code, error message and a link to more details. &amp;nbsp;The Fault DTO is also annotated with JAXB so it can be serialized to XML. &amp;nbsp;I use Spring annotations on my controllers to indicate URI endpoints and fault handlers. &amp;nbsp;Here is an example of a fault handler:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;@ExceptionHandler( Deviation.class ) // says call this method whenever Deviation is thrown&lt;br /&gt;@ResponseBody // says use the return value as the response body&lt;br /&gt;public Fault handleDeviations( final Deviation deviation,&lt;br /&gt;                               final HttpServletResponse response ) throws IOException&lt;br /&gt;{&lt;br /&gt;    response.setStatus( deviation.getErrorCode() );&lt;br /&gt;    final Fault fault = new Fault();&lt;br /&gt;    fault.setCode( HttpStatus.NOT_IMPLEMENTED.value() );&lt;br /&gt;    fault.setMessage( deviation.getLocalizedMessage() );&lt;br /&gt;    return fault;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The trick to get Spring to honor the requested media type which is controlled by the&amp;nbsp;AnnotationMethodHandlerExceptionResolver object. &amp;nbsp;The secret is to hand-configure the exception resolver to use the XML and JSON message converters in addition to its default converters. &amp;nbsp;The resolver loops through its list of converters, asking each one if it can support the requested media type. &amp;nbsp;The first one to say yes gets to serialize the fault object. &amp;nbsp;Here is some example configuration code:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver" id="annotationExceptionResolver"&amp;gt;&lt;br /&gt;    &amp;lt;property name="messageConverters"&amp;gt;&lt;br /&gt;        &amp;lt;list&amp;gt;&lt;br /&gt;            &amp;lt;ref bean="jsonHttpMessageConverter"&amp;gt;&lt;br /&gt;            &amp;lt;ref bean="marshallingHttpMessageConverter"&amp;gt;&lt;br /&gt;            &amp;lt;bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"&amp;gt;&lt;br /&gt;            &amp;lt;bean class="org.springframework.http.converter.StringHttpMessageConverter"&amp;gt;&lt;br /&gt;            &amp;lt;bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"&amp;gt;&lt;br /&gt;            &amp;lt;bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"&amp;gt;&lt;br /&gt;        &amp;lt;/bean&amp;gt;&amp;lt;/bean&amp;gt;&amp;lt;/bean&amp;gt;&amp;lt;/bean&amp;gt;&amp;lt;/ref&amp;gt;&amp;lt;/ref&amp;gt;&amp;lt;/list&amp;gt;&lt;br /&gt;    &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Once your message converter are in place you should be good to go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-7014167388861128692?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/7014167388861128692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/03/how-can-i-get-spring-30-mvc-to-use.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/7014167388861128692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/7014167388861128692'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/03/how-can-i-get-spring-30-mvc-to-use.html' title='How can I get Spring 3.0 MVC to use content negotiation for errors?'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-6840125499956773211</id><published>2011-01-03T09:52:00.000-05:00</published><updated>2011-01-03T09:52:47.900-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XMBC'/><title type='text'>XBMC on Acer Aspire Revo AR3700-U3002</title><content type='html'>Santa was kind to me and brought me a brand new&amp;nbsp;&lt;a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16883103297"&gt;Acer Aspire Revo AR3700-U3002&lt;/a&gt; for Christmas. &amp;nbsp;I liked the &lt;a href="http://screamingtiger.blogspot.com/2009/12/can-i-create-inexpensive-home-theater.html"&gt;HTPC setup I created last year&lt;/a&gt; so much, I decided to create another one for the second TV. &amp;nbsp;This unit is a bit more expensive than last years but it has more current hardware and a few more bells and whistles, such as WIFI. &amp;nbsp;Unlike last year, I decided to leave the OS as is: Windows 7 Home Premium. &amp;nbsp;&lt;a href="http://purpleplutonium.blogspot.com/2010/12/xmbc-windows-xp-720p-goodness.html"&gt;As I noted before&lt;/a&gt;, the Windows drivers seems to yield better performance than its Linux counterparts. &amp;nbsp;All I did for this set up was to image the drive and then remove all the bloatware that I did not want or need. &amp;nbsp;I visited the nVidia site and updated the drivers to the current version as well as installed Adobe Flash for Hulu support. &amp;nbsp;Nothing unusual. &amp;nbsp;I then dropped in XBMC 10.0 and was off to the races. &amp;nbsp;The current version of XBMC is really nice and played well with the hardware. &amp;nbsp;The &lt;a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16880121001"&gt;remote I have&lt;/a&gt;, was recognized automagically by Windows and I can use it to control XBMC, Hulu and Windows Media Center. &amp;nbsp;All is not perfect, however. &amp;nbsp;When I play Hulu desktop in full screen, it stutters. &amp;nbsp;I was really surprised by this because the older hardware does not have this problem. &amp;nbsp;I've got to believe I've missed a setting somewhere. &amp;nbsp;The only difference that is obvious to me is that the older hardware is running 32-bit os while the newer one is running 64-bit. &amp;nbsp;Are there issues with Adobe Flash under Windows 7 b4-bit? &amp;nbsp;I'll let you know when I finally figure it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-6840125499956773211?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/6840125499956773211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2011/01/xbmc-on-acer-aspire-revo-ar3700-u3002.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/6840125499956773211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/6840125499956773211'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2011/01/xbmc-on-acer-aspire-revo-ar3700-u3002.html' title='XBMC on Acer Aspire Revo AR3700-U3002'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-6484060620692627101</id><published>2010-12-21T13:05:00.000-05:00</published><updated>2010-12-21T13:05:19.527-05:00</updated><title type='text'>XMBC + Windows XP = 720p Goodness</title><content type='html'>Last year, I wrote about how I &lt;a href="http://screamingtiger.blogspot.com/2009/12/can-i-create-inexpensive-home-theater.html"&gt;set up a Linux-based HTPC&lt;/a&gt;. &amp;nbsp;Overall, I think the system worked very well. &amp;nbsp;My only complaint would be that I cannot run Hulu Desktop in full-screen mode. &amp;nbsp;The playback is jittery and annoying. &amp;nbsp;I just assumed that the processor and/or video card just weren't up to the task. &amp;nbsp;I was wrong. &amp;nbsp;Recently, a co-worker was contemplating a similar purchase but didn't want to waste money on a system that wouldn't work for him. &amp;nbsp;He hails from India and cannot easily get video content from his native region here in the US so files are traded electronically between friends and family. &amp;nbsp;As a favor, I took a rip of a Blu-Ray movie and told him I would try it out on my box at home. &amp;nbsp;I played the movie under the standard Linux/XBMC combination but there were annoying hesitations and skips. &amp;nbsp;No joy. &amp;nbsp;When I built the box, I kept the original Window XP installation and set up a dual boot configuration. &amp;nbsp;As a test I decided to try playing the file under Windows.&lt;br /&gt;&lt;br /&gt;Since I rarely boot into Windows I had to apply a zillion updates to make the OS current. &amp;nbsp;A couple of those updates proved to be significant:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Flash Player 10+&lt;/li&gt;&lt;li&gt;nVidia chipset and video drivers&lt;/li&gt;&lt;li&gt;XMBC 10&lt;/li&gt;&lt;/ul&gt;What I found after the updates was that I was able to play Hulu in full-screen without skipping. &amp;nbsp;Yay! &amp;nbsp;My guess is that the support for hardware acceleration is present in the Windows software but not the Linux version. I then proceeded to fire up the Blu-Ray rip and XBMC played it in its full 720p glory. &amp;nbsp;Being such a Linux fan it had never occurred to me that Windows might be a better performing solution. &amp;nbsp; It is a bitter pill to swallow but the support for the hardware, at least in this case, proved to be better than Linux. &amp;nbsp;Granted, I'm not running the most current release of Ubuntu but I would be surprised if any significant performance gains were made in the past 12 months. &amp;nbsp;Now that I have determined that Windows+XBMC is the best solution for my hardware, I'll need to go back and solve some of the same problems I've already solved in the Linux world, such as how to get XMBC to automagically start when Windows starts or how to make the remote control work. &amp;nbsp;Such as the life of geek: always tweaking and never satisfied with the status quo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-6484060620692627101?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/6484060620692627101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2010/12/xmbc-windows-xp-720p-goodness.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/6484060620692627101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/6484060620692627101'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2010/12/xmbc-windows-xp-720p-goodness.html' title='XMBC + Windows XP = 720p Goodness'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-7240727460870933427</id><published>2010-08-31T13:03:00.000-04:00</published><updated>2010-08-31T13:03:14.580-04:00</updated><title type='text'>Atlassian Stack: FishEye Startup</title><content type='html'>Ubuntu uses Upstart as it mechanism for starting/stopping processes during bootup/shutdown.&amp;nbsp; FishEye includes two shell scripts: start.sh and stop.sh.&amp;nbsp; I created two files: /etc/init/fisheye-start.conf and /etc/init/fisheye-stop.conf that controls the FishEye process.&amp;nbsp; The scripts are dirt simple and are just rip-offs of the previous Startup scripts with the only difference is that we only specify a "start on" or "stop on" stanza, depending on what we are trying to do.&amp;nbsp; This seems to work well.&amp;nbsp; I have noticed that upon booting the machine I have to wait several minutes for the CPU to calm down before I try logging into the various services or they won't be available.&lt;br /&gt;&lt;br /&gt;When I configured FisheEye, I used the file:/// URL form to eliminate the use of the network and boost performance a bit.&amp;nbsp; Tomorrow, I'll do some more FishEye configuration and integrate it with the rest of the stack.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-7240727460870933427?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/7240727460870933427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2010/08/atlassian-stack-fisheye-startup.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/7240727460870933427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/7240727460870933427'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2010/08/atlassian-stack-fisheye-startup.html' title='Atlassian Stack: FishEye Startup'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4159040525348802212.post-2644546929283114940</id><published>2010-08-30T12:22:00.000-04:00</published><updated>2010-08-30T12:22:10.639-04:00</updated><title type='text'>Greetings, Earthlings</title><content type='html'>I've started this new blog not because I wanted but because I had to.&amp;nbsp; You see, the blog I was using -- &lt;a href="http://screamingtiger.blogspot.com/"&gt;screaming tiger&lt;/a&gt; -- became unavailable to me.&amp;nbsp; I have been using my &lt;a href="http://www.google.com/apps/"&gt;Google Apps&lt;/a&gt; account to log into Blogger and one day, it stopped working.&amp;nbsp; Blogger insisted that I use my regular Google account.&amp;nbsp; I waited hoping things would fix themselves.&amp;nbsp; I know the Googlers are hard at work trying to integrate Google Apps into the rest of the Google portfolio so I had some reason to be optimistic.&amp;nbsp; When that failed, I tweeted hoping that somebody out in the Twitterverse would hear my cries and tell me that everything is going to be all right but, alas, silence.&amp;nbsp; I can't complain too loudly because I'm not paying Google anything for the use of their services but I am concerned about how the lights suddenly went dim for my account.&amp;nbsp; Unless things change, I won't ever be able to get into my other account and get to my data.&amp;nbsp; Luckily, I can still view the blog and pull out any useful tidbits of information I may have stored there.&amp;nbsp; So, at least for now, this is my new campsite on the web.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4159040525348802212-2644546929283114940?l=purpleplutonium.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purpleplutonium.blogspot.com/feeds/2644546929283114940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://purpleplutonium.blogspot.com/2010/08/greetings-earthlings.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/2644546929283114940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4159040525348802212/posts/default/2644546929283114940'/><link rel='alternate' type='text/html' href='http://purpleplutonium.blogspot.com/2010/08/greetings-earthlings.html' title='Greetings, Earthlings'/><author><name>Ron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_--QHoTbp9JA/Sd-BpyKG8DI/AAAAAAAAAXk/MfMCOQU1W8o/S220/231eb95.jpg'/></author><thr:total>0</thr:total></entry></feed>
