<?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-7412807111368460595</id><updated>2012-01-06T08:48:21.163-05:00</updated><category term='Continuous Integration'/><category term='SQL'/><category term='java'/><category term='REST'/><category term='Rails'/><category term='development'/><category term='.Net'/><category term='Random Stuff'/><category term='Management'/><category term='Concordion'/><category term='Extreme Programming'/><category term='Groovy'/><category term='User Stories'/><category term='C#'/><category term='ranting'/><category term='Conferences'/><category term='Church'/><category term='Ruby'/><category term='BDD'/><category term='Mac'/><category term='video'/><category term='bjj'/><category term='testing'/><category term='ASP.Net MVC'/><category term='Pair Programming'/><category term='work'/><category term='jquery JSON REST'/><category term='Kaizen'/><category term='Entity Framework'/><category term='Funny'/><category term='Books'/><title type='text'>XP in Anger</title><subtitle type='html'>I am a technologist who became test infected in 2004 and I have been trying to spread it ever since. &lt;br&gt;
Every once and a while I turn green, become enormous, and start smashing things.&lt;br&gt;
[&lt;strong&gt;Disclaimer:&lt;/strong&gt; The opinions expressed herein are those of the author and not of his employer.]&lt;br&gt;
Don't blame them for the stuff you read here.&lt;br&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default?start-index=101&amp;max-results=100'/><author><name>Ariel Valentin</name><uri>http://www.blogger.com/profile/12207867053388986632</uri><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/-Ap-Y5NU0vVM/TcI68YW9uII/AAAAAAAAAAM/DJTYlqEcjSY/s220/Picture%2B1.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>113</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-8381366075244294909</id><published>2011-12-31T00:39:00.000-05:00</published><updated>2011-12-31T00:39:58.607-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Entity Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net MVC'/><title type='text'>GUIDs, Primary Keys, and The Entity Framework</title><content type='html'>&lt;div&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;I spent the evening learning about ASP.Net MVC 3 and thought I would share this bit of information with you.&amp;nbsp;&amp;nbsp;By default the entity framework uses integers for entity identifiers. After years of battling with&amp;nbsp;scaleability issues, company mergers, and database consolidation projects I have come to prefer&amp;nbsp;using GUIDs over integers or longs for tuple identity.&amp;nbsp;&lt;span style="text-align: left;"&gt;The first thing I tried to do was change the POCO's datatype to GUID. However, the default value was being set to 16 zeros!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span style="text-align: left;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; text-align: left;"&gt;After a bit of STFW, I found this &lt;/span&gt;&lt;a href="http://geekswithblogs.net/danemorgridge/archive/2010/02/12/guids-as-primary-keys-with-entity-framework-4.aspx" style="font-family: Arial, Helvetica, sans-serif; text-align: left;" target="_blank"&gt;article&lt;/a&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; text-align: left;"&gt;&amp;nbsp;that came up with a work around generating the Guid inside of the model. Then I found a MS support ticket where you could set&amp;nbsp;&lt;/span&gt;&lt;span style="text-align: left;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;StoreGeneratedPattern&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; text-align: left;"&gt;&amp;nbsp;in some&amp;nbsp;ridiculous xml configuration file.&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; text-align: left;"&gt;Thankfully I &lt;a href="http://stackoverflow.com/questions/5610794/autogenerate-primary-key-guid-entity-framework-ctp5" target="_blank"&gt;learned&lt;/a&gt; that EF also supports the use of attributes via&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; text-align: left;"&gt;System.ComponentModel.DataAnnotations&lt;/span&gt;&lt;span style="font-family: Times, 'Times New Roman', serif; text-align: left;"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;public Guid ID { get; set; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-8381366075244294909?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/8381366075244294909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=8381366075244294909&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/8381366075244294909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/8381366075244294909'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2011/12/guids-primary-keys-and-entity-framework.html' title='GUIDs, Primary Keys, and The Entity Framework'/><author><name>Ariel Valentin</name><uri>http://www.blogger.com/profile/12207867053388986632</uri><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/-Ap-Y5NU0vVM/TcI68YW9uII/AAAAAAAAAAM/DJTYlqEcjSY/s220/Picture%2B1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-6376788331896247217</id><published>2011-11-12T13:30:00.002-05:00</published><updated>2011-11-21T21:53:48.093-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Equality Operators of Complex POCOs</title><content type='html'>Usually I just hit "Alt+Insert" and ReSharper generates these methods correctly, but when your POCOs are composed of collections you will run into this little inconsistency. None of the .Net collections override the Equality operators, that means you will not be able to use your object as a Hash Key. &lt;br /&gt;&lt;br /&gt;System.Linq.Enumerable comes to the rescue with &lt;a href="http://msdn.microsoft.com/en-us/library/bb348567(v=VS.90).aspx" target="_blank"&gt;SequenceEqual &lt;/a&gt;and &lt;strike&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb338442(v=VS.90).aspx" target="_blank"&gt;Sum&lt;/a&gt;!&lt;/strike&gt;&lt;br /&gt;&lt;br /&gt;Use it in the Equals method like so: &lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;bool equal = other._fields.SequenceEqual(_fields);&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;GetHashCode looks something like:   &lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;strike&gt;int hashCode = _fields.Sum(field =&amp;gt; field.GetHashCode());&lt;/strike&gt;&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Have fun!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Update: Nov 21, 2011&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Turns out using &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Sum &lt;/span&gt;is a mistake! There is a high probability that the sum of the hash codes in the collection will exceed &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int.MAX_VALUE&lt;/span&gt;, which will in turn raise an &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;OverflowException&lt;/span&gt;! I quick search using my favorite engine lead me to this &lt;a href="http://dobrzanski.net/2010/09/13/csharp-gethashcode-cause-overflowexception/" target="_blank"&gt;article&lt;/a&gt;&amp;nbsp;where the author provides a few solutions to the problem. I favored using the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;XOR&amp;nbsp;&lt;/span&gt;to compute the composite hash code. The new implementation uses the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb548744.aspx" target="_blank"&gt;Aggregate&lt;/a&gt;&amp;nbsp;&lt;/span&gt;function and looks something like:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int hashCode = _fields.Aggregate(0, (total, field) =&amp;gt; total ^ field.GetHashCode());&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-6376788331896247217?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/6376788331896247217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=6376788331896247217&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6376788331896247217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6376788331896247217'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2011/11/equality-operators-of-complex-pocos.html' title='Equality Operators of Complex POCOs'/><author><name>Ariel Valentin</name><uri>http://www.blogger.com/profile/12207867053388986632</uri><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/-Ap-Y5NU0vVM/TcI68YW9uII/AAAAAAAAAAM/DJTYlqEcjSY/s220/Picture%2B1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-280248962069678482</id><published>2011-07-08T23:38:00.001-04:00</published><updated>2011-07-08T23:42:17.427-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jquery JSON REST'/><title type='text'>Web forms and null values</title><content type='html'>&lt;div&gt;Say you are building a javascript intensive application using jQuery and you wanted to send a literal null value to a server. You may start with the default behavior using the jQuery.ajax function:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;var data = {  some_value: null };&lt;br /&gt;jQuery.ajax({&lt;br /&gt;           url: url,&lt;br /&gt;           type: "PUT",&lt;br /&gt;           data: data&lt;br /&gt;});&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;However you discover that the default content type is &lt;b&gt;application/x-www-form-urlencoded,&lt;/b&gt; which means that jQuery will serialize the data it will send in the message body. I was surprised to see that jQuery sets literal values such as "null" to a parameter value, e.g. &lt;b&gt;data[some_value]=null,&lt;/b&gt; because the &lt;a href="http://www.w3.org/TR/html401/interact/forms.html#successful-controls"&gt;W3C recommendation&lt;/a&gt;, you'll realize that the specification states that browsers should omit null values altogether. This leads to having most web applications frameworks like Rails receive a string value instead of an absence of value.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Oh no! Does that mean there is no way to set the value to null? One option is to use JSON as the requests mime/content/media type:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;jQuery.ajax({&lt;br /&gt;     url: url,&lt;br /&gt;     contentType: "application/json",&lt;br /&gt;     type: "PUT",&lt;br /&gt;     data: JSON.stringify(data),&lt;br /&gt;     processData: false &lt;br /&gt;});&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;The server web framework will now interpret the JSON correctly and you get what you need. NULLS! &lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-280248962069678482?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/280248962069678482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=280248962069678482&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/280248962069678482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/280248962069678482'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2011/07/web-forms-and-null-values.html' title='Web forms and null values'/><author><name>Ariel Valentin</name><uri>http://www.blogger.com/profile/12207867053388986632</uri><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/-Ap-Y5NU0vVM/TcI68YW9uII/AAAAAAAAAAM/DJTYlqEcjSY/s220/Picture%2B1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-3839055046926686555</id><published>2011-07-07T23:46:00.000-04:00</published><updated>2011-07-07T23:46:03.065-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='BDD'/><category scheme='http://www.blogger.com/atom/ns#' term='ranting'/><title type='text'>BDD, how I wish you did not exist.</title><content type='html'>&lt;i&gt;I read a blog &lt;a href="http://robots.thoughtbot.com/post/7348281260/high-ceremony-testing"&gt;post&lt;/a&gt; that got me all bent out of shape and&amp;nbsp;I decided to replicate my reply on the blog.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;"Shipping software is the goal, and the practices are a means to an end. The focus on shipping is no excuse for cutting corners, but perfect adherence to the practices is no excuse for not shipping." (Kent Beck:http://www.threeriversinstitute.org/JustShip.html)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This conundrum of whether or not "high ceremony development" is an valuable agile practice at start ups is interesting. I was not present at RejectConf 2011 but I will infer what Obie's comments were from that blog post you are referring to. As I understood it Obie was saying that using BDD tools like Cucumber or FitNess are a waste of time if they add little insight into the business domain. Let's explore this idea a little, what value does a business get out of a Cucumber Suite if your entire business domain is as simple as the Rails Blog Post Demo Crud App? What about the other extreme, what if they are still experimenting with new ideas and are actually creating a new domain? Most startups are coming up with ideas that they haven't really flushed out yet and still have to test the market and the Lean Startup community can tell you that there are better ways of obtaining that information without having to write "BDD" suites. &amp;nbsp;&lt;br /&gt;&lt;br /&gt;Personally I feel that BDD has caused a great deal of confusion and cargo cult culture in the software community. Dan North made a conscious decision to rebrand test driven development to behavior (or as the Brits spell it behaviour) driven development in order to make it more amenable to his teaching curriculum. In his own words:&lt;br /&gt;&lt;br /&gt;"I had a problem. While using and teaching agile practices like test-driven development (TDD) on projects in different environments, I kept coming across the same confusion and misunderstandings. Programmers wanted to know where to start, what to test and what not to test, how much to test in one go, what to call their tests, and how to understand why a test fails. The deeper I got into TDD, the more I felt that my own journey had been less of a wax-on, wax-off process of gradual mastery than a series of blind alleys. I remember thinking “If only someone had told me that!” far more often than I thought “Wow, a door has opened.” I decided it must be possible to present TDD in a way that gets straight to the good stuff and avoids all the pitfalls. My response is behaviour-driven development (BDD). It has evolved out of established agile practices and is designed to make them more accessible and effective for teams new to agile software delivery." (Dan North:http://dannorth.net/introducing-bdd/)&lt;br /&gt;&lt;br /&gt;Then BDD became a matter of pride:&lt;br /&gt;&lt;br /&gt;"At the end of 2003, I decided it was time to put my money – or at least my time – where my mouth was. I started writing a replacement for JUnit called JBehave, which removed any reference to testing and replaced it with a vocabulary built around verifying behaviour. I did this to see how such a framework would evolve if I adhered strictly to my new behaviour-driven mantras. I also thought it would be a valuable teaching tool for introducing TDD and BDD without the distractions of the test-based vocabulary." (Dan North:http://dannorth.net/introducing-bdd/)&lt;br /&gt;&lt;br /&gt;The original problem that Dan was trying to solve was that he felt like there was too much of a blank canvas and that there was too much of a focus on "testing". He wanted to give people a template to make it "easier" to get started with "testing" but now it has evolved into something different. "Over time, BDD has grown to encompass the wider picture of agile analysis and automated acceptance testing." (Dan North:http://dannorth.net/introducing-bdd/)&lt;br /&gt;&lt;br /&gt;That is one of the things that I dislike about BDD tools and the cargo cult culture around them. To assert that these tools are the catalyst for a collaborative relationships between developers and their customers/product owners is absurd. There is NO guarantee these tools help developers gain deeper insight into a business domain. Thats what practices like planning, sitting together, ubiquitous language, whole team, user stories, customer examples, demos, and frequent releases try to address. The only tools that I know of to help with gaining insight are hard to automate, they are communication and feedback. &amp;nbsp;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-3839055046926686555?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/3839055046926686555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=3839055046926686555&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3839055046926686555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3839055046926686555'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2011/07/bdd-how-i-wish-you-did-not-exist.html' title='BDD, how I wish you did not exist.'/><author><name>Ariel Valentin</name><uri>http://www.blogger.com/profile/12207867053388986632</uri><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/-Ap-Y5NU0vVM/TcI68YW9uII/AAAAAAAAAAM/DJTYlqEcjSY/s220/Picture%2B1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-7702186297029460033</id><published>2011-06-26T23:01:00.001-04:00</published><updated>2011-06-27T23:49:53.768-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><title type='text'>Why I Hate My Mac...</title><content type='html'>I've had my MacBook for a few years now and I keep running into the same problem:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;ariel@bloodchoke$ sudo strace -p 1144&lt;br /&gt;sudo: strace: command not found&lt;br /&gt;ariel@bloodchoke$ sudo /usr/sbin/strace -p 1144&lt;br /&gt;sudo: /usr/sbin/strace: command not found&lt;br /&gt;ariel@bloodchoke$ brew install strace&lt;br /&gt;Error: No available formula for strace&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;UPDATE: I no longer hate my Mac, I am just frustrated with it. Thanks to &lt;a href="http://twitter.com/#!/JimNicholson"&gt;Jim Nicholson&lt;/a&gt; for pointing out that FreeBSD offers a similar utility called truss. Brendan Gregg created a version of truss for the Mac that is built on dtrace. &lt;br /&gt;Running it on the EventMachine tutorial "echo server", this is what I say... &lt;br /&gt;&lt;code&gt;&lt;pre&gt;ariel@bloodchoke$ sudo dtruss -f -p 200 &lt;br /&gt;......&lt;br /&gt;200/0x446:  select(0x7, 0x7FFF5FBFD6E4, 0x7FFF5FBFD764, 0x7FFF5FBFD7E4, 0x7FFF5FBFD868)   = 1 0&lt;br /&gt;  200/0x446:  read(0x6, "afdnasklfasnm;fdas\n\0", 0x4000)   = 19 0&lt;br /&gt;dtrace: error on enabled probe ID 1770 (ID 18322: syscall::read:return): out of scratch space in action #13 at DIF offset 44&lt;br /&gt;  200/0x446:  sigprocmask(0x1, 0x0, 0x7FFF5FBFD600)   = 0x0 0&lt;br /&gt;  200/0x446:  sigaltstack(0x0, 0x7FFF5FBFD5F0, 0x0)   = 0 0&lt;br /&gt;  200/0x446:  select(0x7, 0x7FFF5FBFD6E4, 0x7FFF5FBFD764, 0x7FFF5FBFD7E4, 0x7FFF5FBFD868)   = 1 0&lt;br /&gt;  200/0x446:  writev(0x6, 0x7FFF5FBFD580, 0x1)   = 19 0&lt;br /&gt;  200/0x446:  sigprocmask(0x1, 0x0, 0x7FFF5FBFD600)   = 0x0 0&lt;br /&gt;  200/0x446:  sigaltstack(0x0, 0x7FFF5FBFD5F0, 0x0)   = 0 0&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;There is no output file switch and there does not seem to be a way to increase system select function calls. The other thing I cannot seem to understand is why the file descriptor is nota simple integer. Using hex sucks.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-7702186297029460033?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/7702186297029460033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=7702186297029460033&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/7702186297029460033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/7702186297029460033'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2011/06/why-i-hate-my-mac.html' title='Why I Hate My Mac...'/><author><name>Ariel Valentin</name><uri>http://www.blogger.com/profile/12207867053388986632</uri><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/-Ap-Y5NU0vVM/TcI68YW9uII/AAAAAAAAAAM/DJTYlqEcjSY/s220/Picture%2B1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-394358028712533553</id><published>2011-02-15T00:30:00.001-05:00</published><updated>2011-02-17T07:37:44.450-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='ranting'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Yeah, but too much X is dangerous</title><content type='html'>Why is it that every time I hear someone say, "X is pretty good and very useful", there is always some &lt;a href="http://www.hulu.com/watch/19280/saturday-night-live-debbie-downer-birthday-party"&gt;Debbie Downer&amp;nbsp;&lt;/a&gt;&amp;nbsp;who feels the burden of reminding you; "Yeah, but too much X is dangerous".&lt;br /&gt;&lt;br /&gt;Here is a conversation that went down between a polyglot programmer (PP) with a variety of experience and Debbie Downer (DD)&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;PP&lt;/b&gt;: It's really easy to redefine methods in Ruby in any context. In Java you have to write lots of extra code to deal with the problem of static methods or singletons in third party libraries, etc...&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;DD&lt;/b&gt;: Yeah, but dynamic methods are dangerous.&lt;/blockquote&gt;&lt;div&gt;&lt;blockquote&gt;&lt;b&gt;PP&lt;/b&gt;: It could be a problem, but in practice it never is. This amazing ability to override the existing behavior has been used in statically typed languages for years now and&amp;nbsp;WE DON'T CARE AND IT'S NOT A PROBLEM! Here are some examples; [N]Hibernate decorates concrete PO*Os at runtime with proxies that afford developers the ability to lazily load relationships and track changes in a unit of work. That's what makes it so easy to use and how it knows how to optimize insert and update statements; and Spring uses proxies for @Transactional classes so that one isn't burdened with writing the same boiler plate DB transaction management code over and over.&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;DD&lt;/b&gt;: Those are examples of popular 3rd party libraries with well defined APIs, I am talking about code that people are working on at my company. That's when overusing dynamically typed languages is dangerous. &amp;nbsp; &amp;nbsp;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;PP&lt;/b&gt;:&amp;nbsp;Java and C# are not immune to problems because concrete implementations of interfaces could be deferred until runtime and anyone could simply give you a different implementation than you expected, but again that DOESN'T MATTER because what we are trying to achieve here is good old fashioned encapsulation and loose coupling. You shouldn't have to worry about the implementation of an interface that someone else is asking you to interact with.&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;DD&lt;/b&gt;: Yeah, but too much encapsulation is dangerous.&lt;/blockquote&gt;That's about the time that I walk away to get coffee. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://0.gvt0.com/vi/LECSVlc6O1g/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/LECSVlc6O1g&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266" src="http://www.youtube.com/v/LECSVlc6O1g&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-394358028712533553?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/394358028712533553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=394358028712533553&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/394358028712533553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/394358028712533553'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2011/02/yeah-but-too-much-x-is-dangerous.html' title='Yeah, but too much X is dangerous'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-2623251576661154812</id><published>2011-02-13T13:43:00.001-05:00</published><updated>2011-02-15T00:32:02.984-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Best Practices and Patterns, Aren't just for SmallTalk</title><content type='html'>Here is a lightning talk I gave at Cyrus Innovation about the influence SmallTalk Best Practices and Patterns on my personal coding style.&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="300" src="http://player.vimeo.com/video/19892995" width="400"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/19892995"&gt;Best Practices and Patterns, Aren't just for SmallTalk&lt;/a&gt; from &lt;a href="http://vimeo.com/user6019118"&gt;Ariel Valentin&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-2623251576661154812?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/2623251576661154812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=2623251576661154812&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2623251576661154812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2623251576661154812'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2011/02/best-practices-and-patterns-arent-just.html' title='Best Practices and Patterns, Aren&apos;t just for SmallTalk'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-1183522298958577430</id><published>2011-02-07T22:23:00.001-05:00</published><updated>2011-02-07T22:42:13.907-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>Rails resource helper methods and the mistakes I make using them</title><content type='html'>Here is something that always trips me up when I am working with Rails resources and I do not for the life of me know why:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 1px solid black; padding-left:20px;"&gt;&lt;code&gt;&lt;br /&gt;ariel@bloodchoke demo$ rails console&lt;br /&gt;Loading development environment (Rails 3.0.3)&lt;br /&gt;ree-1.8.7-2010.02 &amp;gt; w = Widget.create!(:name =&amp;gt; 'foo')&lt;br /&gt;&amp;nbsp;=&amp;gt; #&lt;widget 03:15:22",="" 03:15:22"="" 1,="" 2011-02-08="" created_at:="" foo",="" id:="" name:="" updated_at:=""&gt;&amp;nbsp;&lt;/widget&gt;&lt;br /&gt;ree-1.8.7-2010.02 &amp;gt; app.widgets_path(w)&lt;br /&gt;&amp;nbsp;=&amp;gt; "/widgets.1"&lt;br /&gt;ree-1.8.7-2010.02 &amp;gt; app.widget_path(w)&lt;br /&gt;&amp;nbsp;=&amp;gt; "/widgets/1"&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;Why doesn't Rails raise an exception when I try to do this?&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-1183522298958577430?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/1183522298958577430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=1183522298958577430&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1183522298958577430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1183522298958577430'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2011/02/rails-resource-helper-methods.html' title='Rails resource helper methods and the mistakes I make using them'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-160835708782451447</id><published>2010-07-09T21:05:00.002-04:00</published><updated>2010-07-09T21:07:02.446-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>"Stateful" Web Applications</title><content type='html'>There's a dumb title, "Stateful Web Applications". One attribute that I love about &lt;i&gt;the web&lt;/i&gt; is that it is stateless, that means that you can actually use &lt;i&gt;the web&lt;/i&gt; to write applications that could scale.&lt;br /&gt;Programmers who really did not understand the web spent all of their time adding artificial "statefulness" in the form of "session stores". &amp;nbsp;Instead of using the power of&lt;i&gt; the web&lt;/i&gt; we started creating "applications" that simply used http as a transport for our evil doing.&amp;nbsp;Then came the RESTafarians who lead the charge trying to teach others of the virtues and power of &lt;i&gt;the web&lt;/i&gt;. &lt;br /&gt;Now I find myself in the trenches trying to lead others to the promise land! Then I run into little nuggets like the WebSockets API.&lt;br /&gt;&lt;blockquote&gt;A&amp;nbsp;&lt;code&gt;&lt;a href="http://dev.w3.org/html5/websockets/#websocket" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Times;"&gt;WebSocket&lt;/span&gt;&lt;/a&gt;&lt;/code&gt;&amp;nbsp;object with an open connection must not be garbage collected if there are any event listeners registered for&amp;nbsp;&lt;code title="event-message"&gt;&lt;span class="Apple-style-span" style="font-family: Times;"&gt;message&lt;/span&gt;&lt;/code&gt;&amp;nbsp;events.&amp;nbsp;&lt;a href="http://dev.w3.org/html5/websockets/#garbage-collection"&gt;http://dev.w3.org/html5/websockets/#garbage-collection&lt;/a&gt;&lt;/blockquote&gt;I can see the future! Millions developers out there chomping at the bit, waiting to write a bunch of crappy socket code in JavaScript that they could not write in C. Can you see it? The thousands of failed projects in our future that tried to use WebSocket connection pooling frameworks to help deal with the fact that when under heavy load the server had too many file descriptors open, which brought the application to its knees.&amp;nbsp;I guess I better start learning more about this technology so that someone can pay me to re-write it using a stateless technology. Good thing we already have&amp;nbsp;&lt;i&gt;the web&lt;/i&gt;.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-160835708782451447?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/160835708782451447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=160835708782451447&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/160835708782451447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/160835708782451447'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2010/07/stateful-web-applications.html' title='&quot;Stateful&quot; Web Applications'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-3625225484085122058</id><published>2010-07-04T12:23:00.000-04:00</published><updated>2010-07-04T12:23:02.319-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Pair Programming'/><title type='text'>Bad Pairs</title><content type='html'>Like most people, the first time I heard about pair programming I thought it was a dumb idea. I would have never intentionally paired with anyone, however my project manager pointed out that we were pairing all of the time and did not realize it. Whenever we ran into production problems or one of the programmers on our team was stuck, we would sit together and solve the problem... in &lt;i&gt;pairs&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Nowadays I intentionally pair all of the time and I can say with confidence that&amp;nbsp;it has made me into a better programmer, communicator, and team mate but not all of my experiences have not been pleasurable.&amp;nbsp;I have found that pairing, like many XP practices, is easy to get wrong. Project teams misunderstand and abused this practice in terrible ways.&lt;br /&gt;&lt;br /&gt;Inspired by my colleagues &lt;a href="http://twitter.com/moss"&gt;@moss&lt;/a&gt; and &lt;a href="http://twitter.com/lgdean"&gt;@lgdean &lt;/a&gt;who put together a &lt;a href="http://agile2010.agilealliance.org/team.html#5960"&gt;presentation on pairing&lt;/a&gt;, I decided it was time to start compiling a list of "pairing smells" that I have experienced over the years:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Pair Stenographer &lt;/b&gt;-&amp;nbsp;A driver who has no opinion on the subject. The navigator dictates code while the driver types.&amp;nbsp;The crazy thing is that there are companies out there actively searching to fill this role!&lt;br /&gt;&lt;blockquote&gt;"Pair Programmer is an apprenticeship position whose primary responsibility will be to support one of the company's founders - whom will call the Senior Programmer for this description - in the design and implementation of software products. The Senior Programmer will&amp;nbsp;dictate&amp;nbsp;code in python, C++, or other languages to the Pair Programmer." http://newyork.craigslist.org/mnh/sof/1645696541.htm&lt;/blockquote&gt;If the driver is dictating code, tell them to drive and stop being a jerk.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;"We're Lost"&lt;/b&gt; - This is when the navigator does not know what is going on or how we got here. As the navigator you should always know where the driver is taking you. If you do not know where you are ask the driver to "pull over" so that you can figure out what the current task is and review the changes in your current change set. Then produce a "map" of where you are headed so that you do not get lost again.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;"I don't need directions"&lt;/b&gt; - The driver wants to change things ignoring any direction from the navigator. This usually happens because the driver does not respect the navigators programming skill. In this case the best thing for the navigator to do is pull the driver aside and give them direct constructive feedback. Diana Larsen and Ester Derby offer an excellent course where the participants are taught various techniques for providing others with feedback.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Pair Copy Editor&lt;/b&gt; - "You misspelled that... You forgot a semi-colon...". Navigators, please be patient and let the IDE, compiler, or test tell the driver what is wrong. The driver is not going to you both killed if they forgot a semi-colon.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;e-mailing, texting, and talking on the phone&lt;/b&gt; - It's rude. Excuse yourself and go somewhere else.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Watch me look this up&amp;nbsp;&lt;/b&gt;- At times innocuous, but pair researching can be a waist if you're both doing it using one workstation. Split up and perform the search simultaneously. When one of you finds something let the other know.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;"What if I want to get a sandwich?"&lt;/b&gt; - Not everyone is on the same schedule. If you are hungry or have to take a bio break, do not feel compelled to stay at the workstation. It's OK if someone solos for a while.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;"Want to pair in my (cube | office)?"&lt;/b&gt; - I cannot tell you the number of times I have declined these invitations. The guest is always at a disadvantage. Level the playing field by either setting up a shared workstation or use remote pairing and share desktops.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Pairing as training tool&lt;/b&gt; - I often hear people who advocate pair programming say that it is a great way to train new hires. In practice it is a not effective. Bad pairing is not a substitute for good training. When you hire people train them, otherwise your team may find them to be a burden and it has a poor effect on morale.&lt;br /&gt;&lt;br /&gt;That's it for my first list. What "pairing smells" have you caught a whiff of?&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-3625225484085122058?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/3625225484085122058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=3625225484085122058&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3625225484085122058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3625225484085122058'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2010/07/bad-pairs.html' title='Bad Pairs'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-8273701364461744967</id><published>2010-04-13T00:55:00.000-04:00</published><updated>2010-04-13T00:55:55.917-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bjj'/><title type='text'>Tap, tap, tap</title><content type='html'>I attended a seminar with master Rigan Machado where he shared the history behind Brazilian Jiu Jitsu. With every technique he explained the person who introduced it and the event where they dominated opponents all the way to the championship. Unlike other martial arts who have also been around for centuries, BJJ continues to evolve due to active competitors that introduce new techniques and counters.&lt;br /&gt;A few months later I had the pleasure of attending a seminar lead by Ryron Gracie who focused on facing our fear while training. He said "if you are afraid to get tapped when you spar, then you will never get better". He said for most people tapping, or surrendering to your opponent, is a sign of weakness because they are afraid that if others see you tap that you aren't any good at grappling. &lt;br /&gt;As my Shihan Johnny tells us during every class, tapping just means you got caught and you will get caught hundreds of times, its all a learning process &lt;br /&gt;Professor Gracie encouraged us to take risks and intentionally make "mistakes":&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;"...when you roll allow your opponent you in a triangle and practice escaping. The more you allow yourself to get caught, the more you will understand what it takes to get yourself out of trouble."&lt;/i&gt;&lt;/blockquote&gt;He told us that one should experiment a little in those positions; shift ones weight around; grab onto something; move ones hips slightly; and that will eventually one will learn to become comfortable and I guarantee you that you will be the best escape artist.&amp;nbsp;Do not be afraid to tap, nobody really cares! No one will make fun of you or think your are terrible at this!&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-8273701364461744967?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/8273701364461744967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=8273701364461744967&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/8273701364461744967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/8273701364461744967'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2010/04/tap-tap-tap.html' title='Tap, tap, tap'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-9139472160448986868</id><published>2010-04-13T00:50:00.000-04:00</published><updated>2010-04-13T00:50:27.465-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><category scheme='http://www.blogger.com/atom/ns#' term='Random Stuff'/><title type='text'>The trouble with self-organization</title><content type='html'>A common anti-pattern of &amp;nbsp;self-organizaing teams is the lack of a "capable" leader. Often people end up in leadership positions and they are not the "right person" for the job. What is worse is that we do not provide them with adequate tools or a support system to help them succeed. In my opinion good leaders are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Knowledgeable - How well does this person 'know' your flavor of agile?&lt;/li&gt;&lt;li&gt;Empowered - Can actually make a difference? Do they have the authority to remove impediments?&lt;/li&gt;&lt;li&gt;Trustworthy - Does the technical team and the business believe in what this person has to say?&lt;/li&gt;&lt;/ul&gt;What about your team? Really? Wow you guys have a good team! That is pretty rare because...&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;Research has found that 97% of people are followers and only 3% are good leaders. If this is true it means that the contact person role is the responsibility of the wrong person 97% of the time. This also proved to be the fact. The self governed teams had become very reactive and ineffective, so now this organization faces this fact and reinstitute the positions of front line leaders. http://www.idcon.com/article-good-to-great.htm&lt;/i&gt;&lt;/blockquote&gt;I consider myself a three-percenter, ninety-seven percent of the time. ;)&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-9139472160448986868?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/9139472160448986868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=9139472160448986868&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/9139472160448986868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/9139472160448986868'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2010/04/trouble-with-self-organization.html' title='The trouble with self-organization'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-4660510966662218434</id><published>2010-04-13T00:28:00.002-04:00</published><updated>2010-07-04T10:47:34.978-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='ranting'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>BDD is not about tools</title><content type='html'>My team had to integrate with a third party tool whose client library was written in javascript. In order to prevent sprinkling dependency dust all over our code base, we isolated our integration point in a gateway object.&amp;nbsp;After a little research a few members on our team decided that they wanted to test drive the code using Blue-Ridge, which includes ScrewUnit. They felt that this library was very comprehensive and pretty stable.&amp;nbsp;However, when it came time to write some tests, I was really not looking forward to introducing this &lt;a href="http://github.com/relevance/blue-ridge-sample-app/blob/master/test/javascript/project_spec.js" target="_github"&gt;tool&lt;/a&gt; into our codebase.&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;Screw.Unit is a &lt;/i&gt;&lt;b&gt;&lt;i&gt;Behavior-Driven Testing Framework&lt;/i&gt;&lt;/b&gt;&lt;i&gt; for Javascript. It features nested describes. Its goals are to provide:&amp;nbsp;&lt;/i&gt;&lt;b&gt;&lt;i&gt;a DSL for elegant, readable, organized specs&lt;/i&gt;&lt;/b&gt;&lt;i&gt;;&amp;nbsp;an interactive runner that can execute focused specs and describes;&amp;nbsp;and brief, extensible source-code.&lt;/i&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;div&gt;As I understand it, BDD is TDD that is well factored and uses an expressive vocabulary. Dan North started changing the way he thought about writing unit tests so that they were readable and make it easier to teach others unit testing. &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;blockquote&gt;&lt;i&gt;I also thought it [JBehave] would be a valuable teaching tool for introducing TDD and BDD without the distractions of the test-based vocabulary.... Chris and I realized we were trying to define a ubiquitous language for the analysis process itself!&amp;nbsp;&lt;/i&gt;&lt;a href="http://blog.dannorth.net/introducing-bdd/" target="bdd"&gt;http://blog.dannorth.net/introducing-bdd/&lt;/a&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;In my opinion these tools don't do anything special, they simply attempt to provide a template for developers to write structured unit tests. I personally also find the syntactic sugar, a.k.a DSL, of most of these frameworks to be confusing and inconsistent, which runs contrary to what Dan was trying to do with JBehave:&lt;/div&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;#xUnit&lt;/pre&gt;&lt;pre&gt;#-------------------&lt;br /&gt;def test_new_accounts_should_have_an_initial_balance_of_zero&lt;br /&gt;  account = create_new_account&lt;br /&gt;  assert_has_zero_balance account&lt;br /&gt;end&lt;/pre&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="white-space: normal;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;#RSpec&lt;/pre&gt;&lt;pre style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;#-------------------&lt;/pre&gt;&lt;/span&gt;describe "A new account" do  include AccountExampleHelperMethods  before do    account = Account.new  end  it "should have a balance of $0" do    helper_method    @account.balance.should eql(Money.new(0, :dollars))  endend&amp;nbsp;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;div&gt;Is Ruby's Test::Unit::TestCase inferior to RSpec?&amp;nbsp;Was the RSpec test somehow clearer and more expressive than the xUnit version? I claim that these frameworks do not magically lead you to a utopia of ubiquity and expressive code.&amp;nbsp;Writing good, clean, valuable code is a skill.&lt;br /&gt;&lt;br /&gt;Templates are good but great code is better...&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-4660510966662218434?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/4660510966662218434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=4660510966662218434&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4660510966662218434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4660510966662218434'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2010/04/bdd-is-not-about-tooling.html' title='BDD is not about tools'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-1820755967639696375</id><published>2009-11-16T22:10:00.003-05:00</published><updated>2009-11-16T22:12:49.148-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><title type='text'>David A. Black joins our team!</title><content type='html'>&lt;div&gt;A few weeks ago Joe and I had lunch with DABlack. A few weeks later he joined our team... &lt;/div&gt;&lt;div&gt;Can't wait until our first code review!&lt;/div&gt;&lt;div&gt;http://dablog.rubypal.com/2009/11/13/starting-a-new-job-in-december&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-1820755967639696375?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/1820755967639696375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=1820755967639696375&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1820755967639696375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1820755967639696375'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/11/david-black-joins-our-team.html' title='David A. Black joins our team!'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-2170638782840158863</id><published>2009-10-25T00:48:00.001-04:00</published><updated>2009-10-25T00:51:12.783-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Random Stuff'/><title type='text'>Awful interview</title><content type='html'>&lt;span class="Apple-style-span"    style="font-family:arial, sans-serif;font-size:130%;color:#1F497D;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 15px;"&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-size:100%;color:#000000;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Dave Newton author of &lt;a href="http://www.amazon.com/Apache-Struts-Web-Application-Development/dp/1847193390"&gt;Apache Struts 2 Web app&lt;/a&gt; dev sent me a link to possibly the worst job interview I have ever had the *pleasure* of hearing. It is not for the faint hearted:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-size: 13px; "&gt;&lt;a href="http://buckybits.blogspot.com/2009/06/best-jee-interview-ever.html" target="_blank" style="color: rgb(42, 93, 176); "&gt;http://buckybits.blogspot.com/&lt;wbr&gt;2009/06/best-jee-interview-&lt;wbr&gt;ever.html&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-2170638782840158863?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/2170638782840158863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=2170638782840158863&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2170638782840158863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2170638782840158863'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/10/awful-interview.html' title='Awful interview'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-4823583011753705979</id><published>2009-08-21T20:03:00.005-04:00</published><updated>2009-08-21T22:07:43.842-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>_why is not *dead*. He's frozen.</title><content type='html'>The original Poignant-guide...&lt;br /&gt;http://mislav.uniqpath.com/poignant-guide/&lt;br /&gt;&lt;br /&gt;PDF format&lt;br /&gt;http://programminggoody.com/why/whys-poignant-guide-to-ruby.pdf&lt;br /&gt;&lt;br /&gt;GIT mirror&lt;br /&gt;http://github.com/whymirror&lt;br /&gt;&lt;br /&gt;Twitter Comments&lt;br /&gt;http://favstar.fm/users/_why&lt;br /&gt;&lt;br /&gt;ART &amp;amp;&amp;amp; CODE Symposium: Hackety Hack, why the lucky stiff&lt;br /&gt;http://www.vimeo.com/5047563&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-4823583011753705979?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/4823583011753705979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=4823583011753705979&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4823583011753705979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4823583011753705979'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/08/why-is-not-gone-he-is-just-frozen.html' title='_why is not *dead*. He&apos;s frozen.'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-8047889539302656164</id><published>2009-08-13T22:05:00.002-04:00</published><updated>2009-08-13T22:06:17.886-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conferences'/><title type='text'>GWT Talk at Agile 2009</title><content type='html'>My colleagues Daniel Wellman and Paul Infield-Harm will be presenting at Agile 2009. I recommend that you go!&lt;br /&gt;http://blog.danielwellman.com/2009/08/gwt-presentation-at-agile-2009-conference.html&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-8047889539302656164?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/8047889539302656164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=8047889539302656164&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/8047889539302656164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/8047889539302656164'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/08/gwt-talk-at-agile-2009.html' title='GWT Talk at Agile 2009'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-1269738054979406386</id><published>2009-08-12T22:16:00.002-04:00</published><updated>2009-08-12T22:18:21.140-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='Books'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Steve Freeman and Nat Pryce book</title><content type='html'>I cannot wait to get this book in my hands!&lt;br /&gt;&lt;br /&gt;Here it is! http://www.mockobjects.com/2009/08/book-worst-is-over.html&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-1269738054979406386?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/1269738054979406386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=1269738054979406386&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1269738054979406386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1269738054979406386'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/08/steve-freeman-and-nat-pryce-book.html' title='Steve Freeman and Nat Pryce book'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-8346322488355811334</id><published>2009-06-29T22:50:00.003-04:00</published><updated>2009-06-29T22:59:19.282-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>Testing File Uploads in Rails</title><content type='html'>I was frustrated today trying to figure out why the HTTP functions in Integration::Session were converting my UploadStringIO class parameters to String instances using 'inspect'. Turns out for these specific Rails 2.1.2 performance tests you have to use a special class named ActionController::TestUploadFile. Here is the sample documentation:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; # Essentially generates a modified Tempfile object similar to the object&lt;br /&gt; # you'd get from the standard library CGI module in a multipart&lt;br /&gt; # request. This means you can use an ActionController::TestUploadedFile&lt;br /&gt; # object in the params of a test request in order to simulate&lt;br /&gt; # a file upload.&lt;br /&gt; #&lt;br /&gt; # Usage example, within a functional test:&lt;br /&gt; #   post :change_avatar, :avatar =&gt; ActionController::TestUploadedFile.new(Test::Unit::TestCase.fixture_path + '/files/spongebob.png', 'image/png')&lt;br /&gt; #&lt;br /&gt; # Pass a true third parameter to ensure the uploaded file is opened in binary mode (only required for Windows):&lt;br /&gt; #   post :change_avatar, :avatar =&gt; ActionController::TestUploadedFile.new(Test::Unit::TestCase.fixture_path + '/files/spongebob.png', 'image/png', :binary)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-8346322488355811334?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/8346322488355811334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=8346322488355811334&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/8346322488355811334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/8346322488355811334'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/06/testing-file-uploads-in-rails.html' title='Testing File Uploads in Rails'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-6463565909169885614</id><published>2009-06-18T15:12:00.003-04:00</published><updated>2009-06-28T21:18:07.432-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>Migration Helpers To Add Foreign Keys etc...</title><content type='html'>Rails plugin for adding foreign key constraints in a simple way:&lt;br /&gt;&lt;a href="http://github.com/patientslikeme/migration_helpers/tree/master"&gt;http://github.com/patientslikeme/migration_helpers/tree/master&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;add_foreign_key 'address', 'user_id','users'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;They also have a few simplified utility methods:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;update_row 'books', :set =&gt; { :price =&gt; 4.99 }, :update_all =&gt; true&lt;br /&gt;delete_row 'books', :author =&gt; 'Tolkien'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Enjoy.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-6463565909169885614?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/6463565909169885614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=6463565909169885614&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6463565909169885614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6463565909169885614'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/06/migration-helpers-to-add-foreign-keys.html' title='Migration Helpers To Add Foreign Keys etc...'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-6988235653188449054</id><published>2009-06-12T21:37:00.001-04:00</published><updated>2009-06-12T21:37:00.937-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>This code sucks</title><content type='html'>Nat Pryce wrote an interesting article where he comments on "&lt;a href="http://www.natpryce.com/articles/000756.html"&gt;Complaining about Other Peoples Code&lt;/a&gt;". Pay attention to what your team members say while reviewing legacy code. Are they passing judgment on the aesthetics of the code or are they actually asserting that the author is a bad person?&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-6988235653188449054?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/6988235653188449054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=6988235653188449054&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6988235653188449054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6988235653188449054'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/06/this-code-sucks.html' title='This code sucks'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-4698447031003682381</id><published>2009-06-10T20:55:00.005-04:00</published><updated>2009-06-10T21:28:52.866-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>ruby-prof, script/performance, and vendor/gems</title><content type='html'>It seems I keep having all of this fun running into issues working with Rails 2. My most recent challenge was unpacking ruby-prof as part of a Rails 2.1.2 application. Over the past few months I have spent some time getting our project to the point that we were able to unpack our required gems. Everything was working great, until I tried to using &lt;span style="font-family:courier new;"&gt;ActionController::RequestProfiler &lt;/span&gt;a.k.a. &lt;span style="font-family:courier new;"&gt;script/performance/request&lt;/span&gt; to profile a controller action. However when I tried to use it our application complained that:&lt;span style="font-family:courier new;"&gt; `gem install ruby-prof` to use the profiler&lt;/span&gt;&lt;br /&gt;Huh? I thought I unpacked the gem in the vendor directory? A quick directory list revealed that it was there: &lt;span style="font-family:courier new;"&gt;vendor/gems/ruby-prof-0.7.3&lt;/span&gt;&lt;br /&gt;What could be wrong? I started to trace the request script to find this little gem call in the Rails source code:&lt;br /&gt;&lt;pre&gt;     &lt;span class="ruby-comment cmt"&gt;# File actionpack/lib/action_controller/request_profiler.rb, line 146&lt;/span&gt;&lt;br /&gt;146:       &lt;span class="ruby-keyword kw"&gt;def&lt;/span&gt; &lt;span class="ruby-identifier"&gt;load_ruby_prof&lt;/span&gt;&lt;br /&gt;147:         &lt;span class="ruby-keyword kw"&gt;begin&lt;/span&gt;&lt;br /&gt;148:           &lt;span class="ruby-identifier"&gt;gem&lt;/span&gt; &lt;span class="ruby-value str"&gt;'ruby-prof'&lt;/span&gt;, &lt;span class="ruby-value str"&gt;'&gt;= 0.6.1'&lt;/span&gt;&lt;br /&gt;149:           &lt;span class="ruby-identifier"&gt;require&lt;/span&gt; &lt;span class="ruby-value str"&gt;'ruby-prof'&lt;/span&gt;&lt;br /&gt;150:           &lt;span class="ruby-keyword kw"&gt;if&lt;/span&gt; &lt;span class="ruby-identifier"&gt;mode&lt;/span&gt; = &lt;span class="ruby-identifier"&gt;options&lt;/span&gt;[&lt;span class="ruby-identifier"&gt;:measure&lt;/span&gt;]&lt;br /&gt;151:             &lt;span class="ruby-constant"&gt;RubyProf&lt;/span&gt;.&lt;span class="ruby-identifier"&gt;measure_mode&lt;/span&gt; = &lt;span class="ruby-constant"&gt;RubyProf&lt;/span&gt;.&lt;span class="ruby-identifier"&gt;const_get&lt;/span&gt;(&lt;span class="ruby-identifier"&gt;mode&lt;/span&gt;.&lt;span class="ruby-identifier"&gt;upcase&lt;/span&gt;)&lt;br /&gt;152:           &lt;span class="ruby-keyword kw"&gt;end&lt;/span&gt;&lt;br /&gt;153:         &lt;span class="ruby-keyword kw"&gt;rescue&lt;/span&gt; &lt;span class="ruby-constant"&gt;LoadError&lt;/span&gt;&lt;br /&gt;154:           &lt;span class="ruby-identifier"&gt;abort&lt;/span&gt; &lt;span class="ruby-value str"&gt;'`gem install ruby-prof` to use the profiler'&lt;/span&gt;&lt;br /&gt;155:         &lt;span class="ruby-keyword kw"&gt;end&lt;/span&gt;&lt;br /&gt;156:       &lt;span class="ruby-keyword kw"&gt;end&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:times new roman;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;Really? Another Evil monkey patch in my source code:&lt;br /&gt;&lt;pre&gt;     &lt;span class="ruby-comment cmt"&gt;# File /lib/core_ext/action_controller/request_profiler.rb&lt;/span&gt;&lt;br /&gt;  &lt;span class="ruby-keyword kw"&gt;def&lt;/span&gt; &lt;span class="ruby-identifier"&gt;load_ruby_prof&lt;/span&gt;&lt;br /&gt;    &lt;span class="ruby-keyword kw"&gt;begin&lt;/span&gt;&lt;br /&gt;      &lt;span class="ruby-identifier"&gt;require&lt;/span&gt; &lt;span class="ruby-value str"&gt;'ruby-prof'&lt;/span&gt;&lt;br /&gt;      &lt;span class="ruby-keyword kw"&gt;if&lt;/span&gt; &lt;span class="ruby-identifier"&gt;mode&lt;/span&gt; = &lt;span class="ruby-identifier"&gt;options&lt;/span&gt;[&lt;span class="ruby-identifier"&gt;:measure&lt;/span&gt;]&lt;br /&gt;        &lt;span class="ruby-constant"&gt;RubyProf&lt;/span&gt;.&lt;span class="ruby-identifier"&gt;measure_mode&lt;/span&gt; = &lt;span class="ruby-constant"&gt;RubyProf&lt;/span&gt;.&lt;span class="ruby-identifier"&gt;const_get&lt;/span&gt;(&lt;span class="ruby-identifier"&gt;mode&lt;/span&gt;.&lt;span class="ruby-identifier"&gt;upcase&lt;/span&gt;)&lt;br /&gt;&lt;span class="ruby-keyword kw"&gt;          end&lt;/span&gt;&lt;br /&gt;    &lt;span class="ruby-keyword kw"&gt;rescue&lt;/span&gt; &lt;span class="ruby-constant"&gt;LoadError&lt;/span&gt;&lt;br /&gt;      &lt;span class="ruby-identifier"&gt;abort&lt;/span&gt; &lt;span class="ruby-value str"&gt;'`gem install ruby-prof` to use the profiler'&lt;/span&gt;&lt;br /&gt;    &lt;span class="ruby-keyword kw"&gt;end&lt;/span&gt;&lt;br /&gt;  &lt;span class="ruby-keyword kw"&gt;end&lt;br /&gt;&lt;br /&gt;#config/environment.rb&lt;br /&gt;&lt;br /&gt; Rails::Initializer.run do |config|&lt;br /&gt;   config.load_paths += Dir["#{RAILS_ROOT}/vendor/gems/**"].map do |dir|&lt;br /&gt;     File.directory?(lib = "#{dir}/lib") ? lib : dir&lt;br /&gt;   end&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; # Add pagination requirement&lt;br /&gt; require "#{RAILS_ROOT}/lib/core_ext/action_controller/request_profiler"&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-4698447031003682381?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/4698447031003682381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=4698447031003682381&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4698447031003682381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4698447031003682381'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/06/ruby-prof-scriptperformance-and.html' title='ruby-prof, script/performance, and vendor/gems'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-3666856665854953185</id><published>2009-05-19T22:17:00.002-04:00</published><updated>2009-05-19T22:21:29.766-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Daniel Wellman on "What to Expect When You're Automating Testing: Test-last Tips from an Agile Expert"</title><content type='html'>My colleague and good friend Daniel Wellman has written another stellar article based on his personal coaching experience getting teams started on testing:&lt;br /&gt;&lt;a href="http://blog.danielwellman.com/2009/05/testing-tips-article-in-may-2008-better-software-magazine.html"&gt;http://blog.danielwellman.com/2009/05/testing-tips-article-in-may-2008-better-software-magazine.html&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-3666856665854953185?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/3666856665854953185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=3666856665854953185&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3666856665854953185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3666856665854953185'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/05/daniel-wellman-on-what-to-expect-when.html' title='Daniel Wellman on &quot;What to Expect When You&apos;re Automating Testing: Test-last Tips from an Agile Expert&quot;'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-2663478488924560265</id><published>2009-05-08T21:26:00.001-04:00</published><updated>2009-05-08T21:27:39.680-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Uncle Bob- What killed Smalltalk Could Kill Ruby Too</title><content type='html'>&lt;embed src="http://blip.tv/play/AYGAlmaGvAQ" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="390" width="640"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-2663478488924560265?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/2663478488924560265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=2663478488924560265&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2663478488924560265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2663478488924560265'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/05/uncle-bob-what-killed-smalltalk-could.html' title='Uncle Bob- What killed Smalltalk Could Kill Ruby Too'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-5172708298738143557</id><published>2009-04-16T21:11:00.004-04:00</published><updated>2011-07-31T20:41:50.260-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Concordion'/><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>Ruby Concordion on Rails - Getting Started</title><content type='html'>&lt;h3&gt;UPDATE: The Ruby Concordion Project is pretty much inactive. This blog post is here for my own ego.&lt;/h3&gt;&lt;br /&gt;There aren't many tutorials out there about Ruby's version of Concordion so I figured that I would help you get started. In this post, I will give you some guidance on how to get started working with Rails 2.0+. The artifacts that concordion requires are:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Directories for your specifications&lt;/li&gt;&lt;li&gt;Directories for your instrumentation code, a.k.a. fixtures&lt;/li&gt;&lt;li&gt;Directories to output your test results&lt;/li&gt;&lt;li&gt;An easy way to include concordion functionality into your test suite&lt;/li&gt;&lt;li&gt;Provide Rake tasks to run with your build&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Create a directory to store your specifications:&lt;br /&gt;&lt;code&gt;$APP_ROOT/test/specs&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Create a directory to store your instrumentation code:&lt;br /&gt;&lt;code&gt;$APP_ROOT/test/fixtures&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Add a &lt;code&gt;$APP_ROOT/test/fixtures/concordion_test_helper.rb&lt;/code&gt; that will make it easy to use Concordion:&lt;br /&gt;==============================================================&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;#I guess you don't really need this line&lt;br /&gt;ENV["RAILS_ENV"] = "test"&lt;br /&gt;&lt;br /&gt;#This adds your specification directory to the Ruby load path&lt;br /&gt;$:.unshift File.join(File.dirname(__FILE__),'..','specs')&lt;br /&gt;&lt;br /&gt;#Lazily assign the output directory that concordion will write to&lt;br /&gt;ENV['RCOR_OUTPUT_DIR'] ||= File.join(File.expand_path(File.dirname( __FILE__)),'..','spec-output')&lt;br /&gt;&lt;br /&gt;#Load the existing Rails test helper&lt;br /&gt;require File.join(File.dirname(__FILE__),"..","..","test_helper")&lt;br /&gt;&lt;br /&gt;#The Concordion main module&lt;br /&gt;require 'concordion/test_methods'&lt;br /&gt;&lt;br /&gt;#Decorates all classes that inherit from TestCase class with concordion functionality&lt;br /&gt;class Test::Unit::TestCase&lt;br /&gt;&lt;br /&gt;def self.inherited(child)&lt;br /&gt;child.send(:include, Concordion::TestMethods)&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;===============================================================&lt;br /&gt;Create a Rake task to run your fixtures as part of your application code:&lt;br /&gt;&lt;code&gt;$APP_ROOT/lib/tasks/concordion.rake&lt;/code&gt;&lt;br /&gt;===============================================================&lt;br /&gt;&lt;pre&gt;require 'rake/clean'&lt;br /&gt;&lt;br /&gt;#Set the directory where all of the test results will go&lt;br /&gt;ENV['RCOR_OUTPUT_DIR'] ||= File.join 'test','concordion','spec-output'&lt;br /&gt;&lt;br /&gt;#Task will create the output directory on demand&lt;br /&gt;directory ENV['RCOR_OUTPUT_DIR']&lt;br /&gt;&lt;br /&gt;#Add the output directory to the clean task&lt;br /&gt;CLEAN.include ENV['RCOR_OUTPUT_DIR']&lt;br /&gt;&lt;br /&gt;namespace :test do&lt;br /&gt;namespace :concordion do&lt;br /&gt;desc "Prepares the environment for running tests"&lt;br /&gt;task :prepare =&gt; ['clean','db:test:prepare', ENV['RCOR_OUTPUT_DIR']]&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;Rake::TestTask.new('test:concordion' =&gt; 'test:concordion:prepare') do |t|&lt;br /&gt;t.libs &lt;&lt; "test"&lt;br /&gt;t.libs &lt;&lt; Dir[File.join('test','concordion','specs'),File.join('test','concordion','specs','**','*')].select{|item| File.directory?(item)}&lt;br /&gt;t.test_files = FileList[File.join('test','concordion','fixtures','**','*.rb')]&lt;br /&gt;t.verbose = true&lt;br /&gt;end&lt;/pre&gt;============================================================================Now you can create your specification here:&lt;code&gt;$APP_ROOT/test/concordion/spec/order_state_rules.html&lt;/code&gt;Then the instrumentation:&lt;code&gt;$APP_ROOT/test/concordion/fixtures/order_state_rules_test.rb&lt;/code&gt;============================================================================&lt;pre&gt;require File.join(File.dirname(__FILE__),"concordion_test_helper")&lt;br /&gt;&lt;br /&gt;class OrderStateRulesTest &lt; Test::Unit::TestCase; end&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That's pretty much it. In future posts I will go over how to write your first set of examples and some of the mistakes spec authors make while working with Concordion.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-5172708298738143557?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/5172708298738143557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=5172708298738143557&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5172708298738143557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5172708298738143557'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/04/ruby-concordion-on-rails-getting.html' title='Ruby Concordion on Rails - Getting Started'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-4510456306490729890</id><published>2009-04-15T22:19:00.003-04:00</published><updated>2009-04-15T22:49:06.359-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Concordion'/><title type='text'>Ruby Concordion 0.9.9.9</title><content type='html'>For those of you who have run who are getting cryptic errors while working with Concordion and Rails I have good news for you. Some of the bugs are fixed in version 0.9.9.9 out on &lt;a href="http://rubyforge.org/frs/?group_id=7841&amp;amp;release_id=33417"&gt;RubyForge&lt;/a&gt;! As far as I know everything is working on with Ruby 1.8.6 and Rails 2.1 on both RHEL 4 x84_64 and Mac OS X i386.&lt;br /&gt;If you have any trouble using this release feel free to post on our mailing list ruby-concordion@googlegroups.com and we will help you.&lt;br /&gt;Happy Testing!&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-4510456306490729890?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/4510456306490729890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=4510456306490729890&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4510456306490729890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4510456306490729890'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/04/ruby-concordion-0999.html' title='Ruby Concordion 0.9.9.9'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-6805355085180468763</id><published>2009-04-09T00:46:00.001-04:00</published><updated>2009-04-09T00:48:22.136-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>Rails vrs Ruby Error Messages</title><content type='html'>Just discovered the following:&lt;br /&gt;irb&gt;nil.foo&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;NoMethodError: undefined method `foo' for nil:NilClass&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    from (irb):1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;script/console&gt;nil.foo&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;NoMethodError: You have a nil object when you didn't expect it!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The error occurred while evaluating nil.foo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    from (irb):2&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-6805355085180468763?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/6805355085180468763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=6805355085180468763&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6805355085180468763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6805355085180468763'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/04/rails-vrs-ruby-error-messages.html' title='Rails vrs Ruby Error Messages'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-1063933972237408312</id><published>2009-04-08T19:25:00.001-04:00</published><updated>2009-04-08T19:25:41.323-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Church'/><title type='text'>Holy Week Services Montclair, NJ</title><content type='html'>&lt;span&gt;&lt;span style="font-family:Arial;font-size:85%;color:#000000;"&gt;&lt;span&gt; &lt;p style="margin: 0in 0in 0pt;" align="center"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:Times New Roman;"&gt;Saint Peter Claver Church &lt;/span&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span&gt;&lt;span style="font-size:85%;"&gt;¨&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Times New Roman;"&gt; 56 Elmwood Ave., Montclair, NJ 07042 &lt;/span&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span&gt;&lt;span style="font-size:85%;"&gt;¨&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Times New Roman;"&gt;973-783-4852&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt; &lt;p style="margin-left: 40px;" align="left"&gt;&lt;span&gt;&lt;strong&gt;HOLY THURSDAY &lt;br /&gt;April 9&lt;sup&gt;th&lt;/sup&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;7:00 PM – Solemn Mass of the Lord's  Supper, Operation Rice Bowl Collection, followed by Adoration of the Holy  Eucharist &lt;/p&gt;&lt;span&gt; &lt;p style="margin-left: 40px;" align="left"&gt;&lt;span&gt;&lt;strong&gt;GOOD FRIDAY &lt;br /&gt;April 10&lt;sup&gt;th&lt;/sup&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;Solemn Liturgy of the Passion and Death of Jesus  &lt;/span&gt;&lt;br /&gt;6:30 PM – Stations of the Cross begins in church w/ neighborhood  procession followed by the Solemn Liturgy of the Lord's Passion. &lt;/p&gt; &lt;p style="margin-left: 40px;" align="left"&gt;&lt;span&gt;&lt;strong&gt;&lt;img src="http://cdn-cf.aol.com/se/clip_art/gstres/anmls/animals-butterfly" /&gt;HOLY  SATURDAY EASTER  VIGIL&lt;br /&gt;                April  11&lt;sup&gt;th&lt;/sup&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;                Blessing  of Fire, Easter Candle &amp;amp;  Water &lt;/span&gt;&lt;br /&gt;                7:30  PM – Solemn Easter Vigil Celebration &lt;/p&gt; &lt;p style="margin-left: 40px;" align="left"&gt;&lt;span&gt;&lt;strong&gt;EASTER SUNDAY &lt;br /&gt;April 12&lt;sup&gt;th&lt;/sup&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;The Ressurection of the Lord Jesus &lt;/span&gt;&lt;br /&gt;9:00 AM  – English Eucharist&lt;br /&gt;11:00 AM – English Eucharist&lt;br /&gt;12:45 PM – Creole  Eucharist&lt;br /&gt;6:00 PM – Spanish Eucharist &lt;/p&gt; &lt;p style="margin-left: 40px;" align="left"&gt;&lt;span&gt;&lt;strong&gt;DIVINE MERCY  SUNDAY&lt;br /&gt;April 19&lt;sup&gt;th&lt;/sup&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;5:45 PM [&lt;span style="font-style: italic;"&gt;Sat.&lt;/span&gt;] – English Eucharist&lt;br /&gt;9:00 AM –  English Eucharist&lt;br /&gt;11:00 AM – English Eucharist&lt;br /&gt;12:45 PM – Creole  Eucharist&lt;br /&gt;6:00 PM – Spanish Eucharist &lt;/p&gt; &lt;p style="margin-left: 40px;" align="left"&gt;&lt;span&gt;&lt;strong&gt;SPIRIT OF EASTER  MASS&lt;br /&gt;Tuesday, April 21&lt;sup&gt;st   &lt;/sup&gt;7PM&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-1063933972237408312?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/1063933972237408312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=1063933972237408312&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1063933972237408312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1063933972237408312'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/04/holy-week-services-montclair-nj.html' title='Holy Week Services Montclair, NJ'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-5985212453376539026</id><published>2009-03-16T14:16:00.001-04:00</published><updated>2009-03-16T14:17:40.980-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Ola Bini on Null Types</title><content type='html'>His ability to articulate difficult concepts continues to impress me:&lt;br /&gt;&lt;a href="http://olabini.com/blog/2009/03/bottom-types-in-dynamic-languages/"&gt;http://olabini.com/blog/2009/03/bottom-types-in-dynamic-languages/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-5985212453376539026?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/5985212453376539026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=5985212453376539026&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5985212453376539026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5985212453376539026'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/03/ola-bini-on-null-types.html' title='Ola Bini on Null Types'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-4362759211468925511</id><published>2009-03-09T12:15:00.005-04:00</published><updated>2009-03-17T00:07:49.699-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Advanced Ruby Studio</title><content type='html'>I recently attended &lt;a href="http://pragmaticstudio.com/ruby/"&gt;Advanced Ruby Studio&lt;/a&gt; taught by &lt;a href="http://pragdave.pragprog.com"&gt;Dave Thomas&lt;/a&gt; and &lt;a href="http://www.chadfowler.com/"&gt;Chad Fowler&lt;/a&gt;. It was hands down the best training experience I have ever had. I highly recommend that you attend!&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-4362759211468925511?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/4362759211468925511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=4362759211468925511&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4362759211468925511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4362759211468925511'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/03/advanced-ruby-studio.html' title='Advanced Ruby Studio'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-3421409511984597867</id><published>2009-03-08T19:10:00.002-04:00</published><updated>2009-03-08T19:12:56.385-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Random Stuff'/><title type='text'>The Phone Book Is Here!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_On-m8hBmdY8/SRh9hnEJa3I/AAAAAAAAAT0/B19i_pAJRzY/s320/phone+book.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_On-m8hBmdY8/SRh9hnEJa3I/AAAAAAAAAT0/B19i_pAJRzY/s320/phone+book.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Finally Paul Infield-Harm has a blog! &lt;a href="http://www.infield-harm.org/blog/"&gt;http://www.infield-harm.org/blog/&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-3421409511984597867?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/3421409511984597867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=3421409511984597867&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3421409511984597867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3421409511984597867'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/03/phone-book-is-here.html' title='The Phone Book Is Here!'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_On-m8hBmdY8/SRh9hnEJa3I/AAAAAAAAAT0/B19i_pAJRzY/s72-c/phone+book.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-6177156546988975534</id><published>2009-03-06T23:26:00.001-05:00</published><updated>2009-03-06T23:28:36.430-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Concordion'/><title type='text'>Ruby Concordion Moved</title><content type='html'>Ben has moved hosting to Ruby Forge&lt;br /&gt;&lt;a href="http://rubyforge.org/projects/ruby-concordion/"&gt;http://rubyforge.org/projects/ruby-concordion/&lt;/a&gt;&lt;br /&gt;Check it out!&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-6177156546988975534?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/6177156546988975534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=6177156546988975534&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6177156546988975534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6177156546988975534'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/03/ruby-concordion-moved.html' title='Ruby Concordion Moved'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-5587239413594812993</id><published>2009-03-01T12:41:00.001-05:00</published><updated>2009-03-01T12:50:50.914-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>ActionView::TestCase errors Rails 2.1.2</title><content type='html'>I started to use the built in Rails test case extensions when we upgraded a few months ago, however every once and a while I run into something that causes me frustration to no end.&lt;br /&gt;&lt;br /&gt;Our team wrote helper that would render a remote_function call as part of its contents:  &lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;require 'test_helper'&lt;br /&gt;require 'action_view/test_case'&lt;br /&gt;&lt;br /&gt;class ApplicationHelperTest &lt;  &lt; method =""&gt; :get, :controller =&gt; 'main', :action=&gt; 'open_item', :id =&gt; 1)&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Executing this test resulted in an odd error:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;[root@new-host-2 qme]# ruby test/unit/application_helper_test.rb --name test_demonstrates_bug&lt;br /&gt;Loaded suite test/unit/application_helper_test&lt;br /&gt;Started&lt;br /&gt;E&lt;br /&gt;Finished in 0.516956 seconds.&lt;br /&gt;&lt;br /&gt;1) Error:&lt;br /&gt;test_demonstrates_bug(ApplicationHelperTest):&lt;br /&gt;NoMethodError: undefined method `protect_against_forgery?' for #applicationhelpertest:0x2a97ff0d68&lt;br /&gt;  /usr/lib64/ruby/gems/1.8/gems/actionpack-2.1.2/lib/action_controller/test_process.rb:467:in `method_missing'&lt;br /&gt;  /usr/lib64/ruby/gems/1.8/gems/actionpack-2.1.2/lib/action_view/test_case.rb:55:in `method_missing'&lt;br /&gt;  /usr/lib64/ruby/gems/1.8/gems/actionpack-2.1.2/lib/action_view/helpers/prototype_helper.rb:1053:in `options_for_ajax'&lt;br /&gt;  /usr/lib64/ruby/gems/1.8/gems/actionpack-2.1.2/lib/action_view/helpers/prototype_helper.rb:443:in `remote_function'&lt;br /&gt;  test/unit/application_helper_test.rb:17:in `test_demonstrates_bug'&lt;br /&gt;  /usr/lib64/ruby/gems/1.8/gems/activesupport-2.1.2/lib/active_support/testing/setup_and_teardown.rb:67:in `__send__'&lt;br /&gt;  /usr/lib64/ruby/gems/1.8/gems/activesupport-2.1.2/lib/active_support/testing/setup_and_teardown.rb:67:in `run'&lt;br /&gt;&lt;br /&gt;1 tests, 0 assertions, 0 failures, 1 errors&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;I do not know what the root of this was, but I figured that my test did not care about protecting against forgery so I defined the method:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt; def protect_against_forgery?&lt;br /&gt; end&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Then I ran the test again, which resulted in a new error:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;1) Error:&lt;br /&gt;test_demonstrates_bug(ApplicationHelperTest):&lt;br /&gt;NoMethodError: You have a nil object when you didn't expect it!&lt;br /&gt;The error occurred while evaluating nil.url_for&lt;br /&gt;   /usr/lib64/ruby/gems/1.8/gems/actionpack-2.1.2/lib/action_view/helpers/url_helper.rb:71:in `send'&lt;br /&gt;   /usr/lib64/ruby/gems/1.8/gems/actionpack-2.1.2/lib/action_view/helpers/url_helper.rb:71:in `url_for'&lt;br /&gt;   /usr/lib64/ruby/gems/1.8/gems/actionpack-2.1.2/lib/action_view/helpers/prototype_helper.rb:461:in `remote_function'&lt;br /&gt;   test/unit/application_helper_test.rb:20:in `test_demonstrates_bug'&lt;br /&gt;   /usr/lib64/ruby/gems/1.8/gems/activesupport-2.1.2/lib/active_support/testing/setup_and_teardown.rb:67:in `__send__'&lt;br /&gt;   /usr/lib64/ruby/gems/1.8/gems/activesupport-2.1.2/lib/active_support/testing/setup_and_teardown.rb:67:in `run'&lt;br /&gt;&lt;br /&gt;1 tests, 0 assertions, 0 failures, 1 errors&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Reading the source code it turns out that UrlHelper is trying to invoke @controller.url_for... really? I thought that it was initialized in the TestCase setup method? Turns out that it only creates a controller in the event a method is missing on in the TestCase...&lt;br /&gt;&lt;code&gt;&lt;pre&gt; &lt;br /&gt;     def method_missing(selector, *args)&lt;br /&gt;       controller = TestController.new&lt;br /&gt;       return controller.send!(selector, *args) if ActionController::Routing::Routes.named_routes.helpers.include?(selector)&lt;br /&gt;       super&lt;br /&gt;     end&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;I then initialized the controller as an instance member in setup() and things worked just fine. &lt;br /&gt;&lt;code&gt;&lt;pre&gt; &lt;br /&gt;    setup :setup_with_helper_class&lt;br /&gt;&lt;br /&gt;    def setup_with_helper_class&lt;br /&gt;      if helper_class &amp;&amp; !self.class.ancestors.include?(helper_class)&lt;br /&gt;        self.class.send(:include, helper_class)&lt;br /&gt;      end&lt;br /&gt;      @controller = TestController.new&lt;br /&gt;    end&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;I am not sure if all of these crazy things I did were good or bad things, particularly if I have forever inhibited my ability to protect_from_forgery in my tests but I guess I can live with it until I can file a request for fix with the Rails team. &lt;br /&gt;Hope this helps...&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-5587239413594812993?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/5587239413594812993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=5587239413594812993&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5587239413594812993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5587239413594812993'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/03/actionviewtestcase-errors-rails-212.html' title='ActionView::TestCase errors Rails 2.1.2'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-4099699533030451109</id><published>2009-03-01T11:02:00.002-05:00</published><updated>2009-03-01T12:06:33.941-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Conferences'/><category scheme='http://www.blogger.com/atom/ns#' term='Concordion'/><title type='text'>Agile 2009 Proposals</title><content type='html'>I am really excited about possibly leading some presentations this year. I submitted a proposal for Agile 2009 to give a talk about Ruby Concordion and I would love some feedback:&lt;br /&gt;&lt;a href="http://agile2009.agilealliance.org/node/2543"&gt;http://agile2009.agilealliance.org/node/2543&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bruce Eckfelt will also be presenting and I will be the Ward to his Wayne. I also make the distinction because Jason Todd died at the hands of the Joker and I want to LIVE! You can follow his proposal here:&lt;br /&gt;&lt;a href="http://agile2009.agilealliance.org/node/150"&gt;http://agile2009.agilealliance.org/node/150&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is the full list of Cyrus submissions:&lt;br /&gt;&lt;table&gt;&lt;thead&gt;&lt;/thead&gt; &lt;tbody&gt;  &lt;tr class="odd"&gt;&lt;td class="view-field view-field-node-nid active"&gt;2543&lt;/td&gt;&lt;td class="view-field view-field-node-title"&gt;&lt;a href="http://agile2009.agilealliance.org/node/2543"&gt;Concordion - Testing in plain "English"&lt;/a&gt; &lt;/td&gt;&lt;td class="view-field view-field-users-name"&gt;&lt;a href="http://agile2009.agilealliance.org/user/2984"&gt;Ariel Valentin&lt;/a&gt;&lt;/td&gt;&lt;td class="view-field view-field-node-data-field-co-presenter-field-co-presenter-uid"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class="view-field view-field-node-changed"&gt;&lt;em&gt;12 hours 17 min&lt;/em&gt; ago&lt;/td&gt; &lt;/tr&gt;  &lt;tr class="even"&gt;&lt;td class="view-field view-field-node-nid active"&gt;150&lt;/td&gt;&lt;td class="view-field view-field-node-title"&gt;&lt;a href="http://agile2009.agilealliance.org/node/150"&gt;Let's Build a Boat: A Simulation of Just-In-Time Production&lt;/a&gt; &lt;/td&gt;&lt;td class="view-field view-field-users-name"&gt;&lt;a href="http://agile2009.agilealliance.org/user/891"&gt;Bruce Eckfeldt&lt;/a&gt;&lt;/td&gt;&lt;td class="view-field view-field-node-data-field-co-presenter-field-co-presenter-uid"&gt;&lt;a href="http://agile2009.agilealliance.org/user/2984"&gt;Ariel Valentin&lt;/a&gt;&lt;/td&gt;&lt;td class="view-field view-field-node-changed"&gt;&lt;em&gt;16 hours 15 min&lt;/em&gt; ago&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;span style="font-family: Times; font-size: 16px;"&gt;&lt;span style="color: rgb(81, 93, 82); font-family: Verdana; font-size: 12px; line-height: 20px;"&gt;&lt;table style="margin: 1em 0px; border-collapse: collapse; width: 100%;"&gt;&lt;tbody style="border-top: 1px solid rgb(204, 204, 204);"&gt;&lt;tr style="border-style: solid; border-color: rgb(233, 235, 251); border-width: 1px 0px; padding: 0.1em 0.6em; background-color: rgb(245, 246, 253);"&gt;&lt;td style="padding: 0.3em 0.5em; background-color: rgb(237, 239, 251);"&gt;154&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt; &lt;a href="http://agile2009.agilealliance.org/node/154" style="color: rgb(15, 113, 173); text-decoration: none;" target="_blank"&gt;How to Say "No." (Without Destroying the Relationship)&lt;/a&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt; &lt;a href="http://agile2009.agilealliance.org/user/891" style="color: rgb(15, 113, 173); text-decoration: none;" target="_blank"&gt;Bruce Eckfeldt&lt;/a&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt;&lt;em&gt;6 weeks 2 days&lt;/em&gt; ago&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border-style: solid; border-color: rgb(233, 235, 251); border-width: 1px 0px; padding: 0.1em 0.6em; background-color: rgb(255, 255, 255);"&gt; &lt;td style="padding: 0.3em 0.5em; background-color: rgb(242, 243, 252);"&gt;152&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt; &lt;a href="http://agile2009.agilealliance.org/node/152" style="color: rgb(15, 113, 173); text-decoration: none;" target="_blank"&gt;All I Needed to Know About Agile I Learned From Deming&lt;/a&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt; &lt;a href="http://agile2009.agilealliance.org/user/891" style="color: rgb(15, 113, 173); text-decoration: none;" target="_blank"&gt;Bruce Eckfeldt&lt;/a&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt;&lt;em&gt;6 weeks 2 days&lt;/em&gt; ago&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border-style: solid; border-color: rgb(233, 235, 251); border-width: 1px 0px; padding: 0.1em 0.6em; background-color: rgb(245, 246, 253);"&gt; &lt;td style="padding: 0.3em 0.5em; background-color: rgb(237, 239, 251);"&gt;151&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt; &lt;a href="http://agile2009.agilealliance.org/node/151" style="color: rgb(15, 113, 173); text-decoration: none;" target="_blank"&gt;Target Cost Contracting: Part Deux&lt;/a&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt; &lt;a href="http://agile2009.agilealliance.org/user/891" style="color: rgb(15, 113, 173); text-decoration: none;" target="_blank"&gt;Bruce Eckfeldt&lt;/a&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt;&lt;em&gt;6 weeks 2 days&lt;/em&gt; ago&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border-style: solid; border-color: rgb(233, 235, 251); border-width: 1px 0px; padding: 0.1em 0.6em; background-color: rgb(255, 255, 255);"&gt; &lt;td style="padding: 0.3em 0.5em; background-color: rgb(242, 243, 252);"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;span style="color: rgb(81, 93, 82); font-family: Verdana; font-size: 12px; line-height: 20px;"&gt;&lt;table style="margin: 1em 0px; border-collapse: collapse; width: 100%;"&gt; &lt;thead&gt;&lt;tr&gt;&lt;th style="border-bottom: 2px solid rgb(233, 235, 251); padding: 0.3em 1em 0.3em 0.5em; text-align: left; color: rgb(81, 93, 82); font-weight: bold;"&gt; &lt;a href="http://agile2009.agilealliance.org/proposals?sort=asc&amp;amp;order=ID&amp;amp;filter0=&amp;amp;filter1=&amp;amp;filter2=&amp;amp;filter3=&amp;amp;filter4=wellman" title="sort by ID" style="text-decoration: none; color: rgb(121, 151, 171);" target="_blank"&gt;ID&lt;img src="http://agile2009.agilealliance.org/misc/arrow-asc.png" alt="sort icon" title="sort ascending" style="border-style: none; display: inline;" height="13" width="13" /&gt;&lt;/a&gt;&lt;/th&gt; &lt;th style="border-bottom: 2px solid rgb(233, 235, 251); padding: 0.3em 1em 0.3em 0.5em; text-align: left; color: rgb(81, 93, 82); font-weight: bold;"&gt; &lt;a href="http://agile2009.agilealliance.org/proposals?sort=asc&amp;amp;order=Title&amp;amp;filter0=&amp;amp;filter1=&amp;amp;filter2=&amp;amp;filter3=&amp;amp;filter4=wellman" title="sort by Title" style="text-decoration: none; color: rgb(121, 151, 171);" target="_blank"&gt;Title&lt;/a&gt;&lt;/th&gt; &lt;th style="border-bottom: 2px solid rgb(233, 235, 251); padding: 0.3em 1em 0.3em 0.5em; text-align: left; color: rgb(81, 93, 82); font-weight: bold;"&gt; 1st author&lt;/th&gt;&lt;th style="border-bottom: 2px solid rgb(233, 235, 251); padding: 0.3em 1em 0.3em 0.5em; text-align: left; color: rgb(81, 93, 82); font-weight: bold;"&gt; 2nd author&lt;/th&gt;&lt;th style="border-bottom: 2px solid rgb(233, 235, 251); padding: 0.3em 1em 0.3em 0.5em; text-align: left; color: rgb(81, 93, 82); font-weight: bold;"&gt; &lt;a href="http://agile2009.agilealliance.org/proposals?sort=asc&amp;amp;order=Updated&amp;amp;filter0=&amp;amp;filter1=&amp;amp;filter2=&amp;amp;filter3=&amp;amp;filter4=wellman" title="sort by Updated" style="text-decoration: none; color: rgb(121, 151, 171);" target="_blank"&gt;Updated&lt;/a&gt;&lt;/th&gt; &lt;/tr&gt;&lt;/thead&gt;&lt;tbody style="border-top: 1px solid rgb(204, 204, 204);"&gt;&lt;tr style="border-style: solid; border-color: rgb(233, 235, 251); border-width: 1px 0px; padding: 0.1em 0.6em; background-color: rgb(245, 246, 253);"&gt; &lt;td style="padding: 0.3em 0.5em; background-color: rgb(237, 239, 251);"&gt;134&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt; &lt;a href="http://agile2009.agilealliance.org/node/134" style="color: rgb(15, 113, 173); text-decoration: none;" target="_blank"&gt;Test-Driving AJAX applications with Google Web Toolkit&lt;/a&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;new&lt;/span&gt;&lt;/td&gt; &lt;td style="padding: 0.3em 0.5em;"&gt;&lt;a href="http://agile2009.agilealliance.org/user/1927" style="color: rgb(15, 113, 173); text-decoration: none;" target="_blank"&gt;Daniel Wellman&lt;/a&gt;&lt;/td&gt; &lt;td style="padding: 0.3em 0.5em;"&gt;&lt;a href="http://agile2009.agilealliance.org/user/2323" style="color: rgb(15, 113, 173); text-decoration: none;" target="_blank"&gt;Paul Infield-Harm&lt;/a&gt;&lt;/td&gt; &lt;td style="padding: 0.3em 0.5em;"&gt;&lt;em&gt;1 day 17 hours&lt;/em&gt; ago&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;span style="color: rgb(81, 93, 82); font-family: Verdana; font-size: 12px; line-height: 20px;"&gt;&lt;table style="margin: 1em 0px; border-collapse: collapse; width: 100%;"&gt; &lt;thead&gt;&lt;tr&gt;&lt;th style="border-bottom: 2px solid rgb(233, 235, 251); padding: 0.3em 1em 0.3em 0.5em; text-align: left; color: rgb(81, 93, 82); font-weight: bold;"&gt; &lt;a href="http://agile2009.agilealliance.org/proposals?sort=asc&amp;amp;order=ID&amp;amp;filter0=&amp;amp;filter1=&amp;amp;filter2=&amp;amp;filter3=&amp;amp;filter4=rex" title="sort by ID" style="text-decoration: none; color: rgb(121, 151, 171);" target="_blank"&gt;ID&lt;img src="http://agile2009.agilealliance.org/misc/arrow-asc.png" alt="sort icon" title="sort ascending" style="border-style: none; display: inline;" height="13" width="13" /&gt;&lt;/a&gt;&lt;/th&gt; &lt;th style="border-bottom: 2px solid rgb(233, 235, 251); padding: 0.3em 1em 0.3em 0.5em; text-align: left; color: rgb(81, 93, 82); font-weight: bold;"&gt; &lt;a href="http://agile2009.agilealliance.org/proposals?sort=asc&amp;amp;order=Title&amp;amp;filter0=&amp;amp;filter1=&amp;amp;filter2=&amp;amp;filter3=&amp;amp;filter4=rex" title="sort by Title" style="text-decoration: none; color: rgb(121, 151, 171);" target="_blank"&gt;Title&lt;/a&gt;&lt;/th&gt; &lt;th style="border-bottom: 2px solid rgb(233, 235, 251); padding: 0.3em 1em 0.3em 0.5em; text-align: left; color: rgb(81, 93, 82); font-weight: bold;"&gt; 1st author&lt;/th&gt;&lt;th style="border-bottom: 2px solid rgb(233, 235, 251); padding: 0.3em 1em 0.3em 0.5em; text-align: left; color: rgb(81, 93, 82); font-weight: bold;"&gt; 2nd author&lt;/th&gt;&lt;th style="border-bottom: 2px solid rgb(233, 235, 251); padding: 0.3em 1em 0.3em 0.5em; text-align: left; color: rgb(81, 93, 82); font-weight: bold;"&gt; &lt;a href="http://agile2009.agilealliance.org/proposals?sort=asc&amp;amp;order=Updated&amp;amp;filter0=&amp;amp;filter1=&amp;amp;filter2=&amp;amp;filter3=&amp;amp;filter4=rex" title="sort by Updated" style="text-decoration: none; color: rgb(121, 151, 171);" target="_blank"&gt;Updated&lt;/a&gt;&lt;/th&gt; &lt;/tr&gt;&lt;/thead&gt;&lt;tbody style="border-top: 1px solid rgb(204, 204, 204);"&gt;&lt;tr style="border-style: solid; border-color: rgb(233, 235, 251); border-width: 1px 0px; padding: 0.1em 0.6em; background-color: rgb(245, 246, 253);"&gt; &lt;td style="padding: 0.3em 0.5em; background-color: rgb(237, 239, 251);"&gt;1130&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt; &lt;a href="http://agile2009.agilealliance.org/node/1130" style="color: rgb(15, 113, 173); text-decoration: none;" target="_blank"&gt;How to manage the non-software part of your job with Lean and Scrum&lt;/a&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt; &lt;a href="http://agile2009.agilealliance.org/user/851" style="color: rgb(15, 113, 173); text-decoration: none;" target="_blank"&gt;Rex Madden&lt;/a&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt;&lt;em&gt;2 hours 17 min&lt;/em&gt;ago&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border-style: solid; border-color: rgb(233, 235, 251); border-width: 1px 0px; padding: 0.1em 0.6em; background-color: rgb(255, 255, 255);"&gt; &lt;td style="padding: 0.3em 0.5em; background-color: rgb(242, 243, 252);"&gt;1128&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt; &lt;a href="http://agile2009.agilealliance.org/node/1128" style="color: rgb(15, 113, 173); text-decoration: none;" target="_blank"&gt;Zendo and the Art of Debugging&lt;/a&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt; &lt;a href="http://agile2009.agilealliance.org/user/851" style="color: rgb(7, 91, 141); text-decoration: underline;" target="_blank"&gt;Rex Madden&lt;/a&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="padding: 0.3em 0.5em;"&gt;&lt;em&gt;2 hours 49 min&lt;/em&gt;ago&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-4099699533030451109?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/4099699533030451109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=4099699533030451109&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4099699533030451109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4099699533030451109'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/03/agile-2009-proposals.html' title='Agile 2009 Proposals'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-8395585670542702898</id><published>2009-03-01T00:45:00.001-05:00</published><updated>2009-03-01T00:47:20.712-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Concordion'/><title type='text'>Ruby Concordion 0.9.8 - Now integrates with Rails!</title><content type='html'>Just wanted to announce the latest version (0.9.8) of Concordion written in Ruby. There are quite a few updates that make it easy to integrate with other frameworks such as Rails who decorate Test::Unit::TestCase using inheritance.&lt;br /&gt;&lt;br /&gt;Step one:&lt;br /&gt;gem install concordion&lt;br /&gt;&lt;br /&gt;Step two:&lt;br /&gt;Enjoy! http://code.google.com/p/rcor/wiki/Tutorial&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-8395585670542702898?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/8395585670542702898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=8395585670542702898&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/8395585670542702898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/8395585670542702898'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/03/ruby-concordion-098-now-integrates-with.html' title='Ruby Concordion 0.9.8 - Now integrates with Rails!'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-2222675359278029534</id><published>2009-02-17T19:13:00.000-05:00</published><updated>2009-02-17T19:14:19.551-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Concordion'/><title type='text'>RCor now just plain ole Concordion</title><content type='html'>Ben has renamed the project :) Check it out &lt;a href="http://goodspeed-it.tumblr.com/post/79112640/rcor-renamed-to-ruby-concordion"&gt;here&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-2222675359278029534?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/2222675359278029534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=2222675359278029534&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2222675359278029534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2222675359278029534'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/02/rcor-now-just-plain-ole-concordion.html' title='RCor now just plain ole Concordion'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-3871825270910148982</id><published>2009-02-16T21:47:00.001-05:00</published><updated>2009-02-16T21:50:45.056-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>MySQL Default Strings</title><content type='html'>MySQL 5.0.22 ignores DEFAULT definitions with blank strings. In fact it treats them as NULL:&lt;br /&gt;ALTER TABLE Widgets DEFAULT ''&lt;br /&gt;&lt;br /&gt;desc widgets;&lt;br /&gt;+-----------------------+--------------+------+-----+---------+----------------+&lt;br /&gt;| Field                 | Type         | Null | Key | &lt;span style="font-weight: bold;"&gt;Default&lt;/span&gt; | Extra          |&lt;br /&gt;+-----------------------+--------------+------+-----+---------+----------------+&lt;br /&gt;| form_data             | text         | YES  |     | &lt;span style="font-weight: bold;"&gt;NULL&lt;/span&gt;    |                |&lt;br /&gt;&lt;br /&gt;That sucks, but it was interesting.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-3871825270910148982?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/3871825270910148982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=3871825270910148982&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3871825270910148982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3871825270910148982'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/02/mysql-default-strings.html' title='MySQL Default Strings'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-5350684846436633096</id><published>2009-02-16T20:48:00.001-05:00</published><updated>2009-02-16T20:49:33.454-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Random Stuff'/><title type='text'>Assess Your Agility...</title><content type='html'>How agile are you?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jamesshore.com/Blog/abetterteam.html"&gt;http://jamesshore.com/Blog/abetterteam.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-5350684846436633096?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/5350684846436633096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=5350684846436633096&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5350684846436633096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5350684846436633096'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/02/assess-your-agility.html' title='Assess Your Agility...'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-1591733825982884007</id><published>2009-02-16T16:21:00.007-05:00</published><updated>2009-02-16T22:01:01.823-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>Frustrated with change_column Rails 2.1.2</title><content type='html'>My team tried upgrading from Rails 2.1.0 to 2.1.2 and ran into a few frustrating problems. When we first defined our tables in rails 1.2.6 we used "string" data types for certain columns:&lt;br /&gt;&lt;code&gt;create_table :widgets do |t|&lt;br /&gt;  t.string :form_data, :default=&gt;"" :null=&gt;false&lt;br /&gt;  t.timestamps&lt;br /&gt;end&lt;/code&gt;&lt;br /&gt;A few months went by and we decided to upgrade from 1.2.6 to 2.1.0 but it required us to change from strings to text fields. The migration script looked like this:&lt;br /&gt;&lt;code&gt;change_column(:widgets, :form_data, :text, :default=&gt;"")&lt;/code&gt;&lt;br /&gt;In Rails 2.1.2 the change_column function retained its nullability unless you explicitly requested it, however in 2.1.0 it would always redefine it to the defaul null =&gt; true. Tailing the logs confirmed this subtle difference:&lt;br /&gt;2.1.0 =&gt; &lt;code&gt;ALTER TABLE widgets CHANGE COLUMN form_data text DEFAULT '' NOT NULL&lt;/code&gt; &lt;br /&gt;2.1.2 =&gt; &lt;code&gt;ALTER TABLE widgets CHANGE COLUMN form_data text DEFAULT ''&lt;/code&gt;&lt;br /&gt;We then had to create another migration so that we would be in sync with our production database:&lt;br /&gt;&lt;code&gt;change_column(:widgets, :form_data, :text, {:default=&gt;"", :null =&gt; true })&lt;/code&gt;&lt;br /&gt;Annoying but true.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-1591733825982884007?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/1591733825982884007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=1591733825982884007&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1591733825982884007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1591733825982884007'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/02/frustrated-with-changecolumn-rails-212.html' title='Frustrated with change_column Rails 2.1.2'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-5495719965599293420</id><published>2009-02-13T09:54:00.002-05:00</published><updated>2009-02-13T22:56:20.729-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>Rails migration and the dreaded MyISAM-InnoDB MySql Error</title><content type='html'>Our team found itself staring at ONE Linux workstation screen trying to fix the following problem:&lt;br /&gt;&lt;code&gt;-- execute("ALTER TABLE widgets ADD CONSTRAINT fk_widgets_gadgets FOREIGN KEY(gadget_id) REFERENCES gadgets(id)")&lt;br /&gt;rake aborted!&lt;br /&gt;Mysql::Error: Can't create table './foo_development/#sql-3779_341.frm' (errno: 150): ALTER TABLE widgets ADD CONSTRAINT fk_widgets_gadgets FOREIGN KEY(gadget_id) REFERENCES gadgets(id)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;In my experience this error &lt;span style="font-style: italic;"&gt;only&lt;/span&gt; means one thing, there are records in the table that violate the foreign key constraint. Finding the orphaned records should be easy &lt;span style="font-style: italic;"&gt;right&lt;/span&gt;?&lt;br /&gt;&lt;code&gt;select * from widgets where gadget_id not in (select id from gadgets)&lt;br /&gt;0 records found&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The worst part about this problem is that it was only happening in only one of the developers sandbox databases as well as in our pre-production environments. It seemed as if it would be impossible to figure out what was happening. Our quest to destroy the ring was just beginning.&lt;br /&gt;I took a look at the constraints table because we had added constraints to the widgets table before, why would this one be any different?&lt;br /&gt;&lt;code&gt;USE information_schema;&lt;br /&gt;SELECT * FROM table_constraints WHERE table_schema = 'foo_development';&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The results did not display anything out of the ordinary, the other constraints where there!!! At this point I was running out of ideas. We started to compare the tables in development from test when boom there it was: [gadgets TYPE=MyISAM and widgets TYPE=InnoDB]&lt;br /&gt;SON OF A.... &lt;code&gt;ALTER TABLE gadgets TYPE=InnoDB&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-5495719965599293420?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/5495719965599293420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=5495719965599293420&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5495719965599293420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5495719965599293420'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/02/rails-migration-and-dreaded-myisam.html' title='Rails migration and the dreaded MyISAM-InnoDB MySql Error'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-6462049022567961820</id><published>2009-02-10T20:41:00.005-05:00</published><updated>2009-02-10T22:26:10.462-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>REST and the Resource</title><content type='html'>Something that often happens on applications that I've worked on is the need to access a resource in a particular context. For example, you have a application where students submit their homework assignments allowing teachers to grade them.&lt;br /&gt;&lt;br /&gt;Using a resource oriented application, you may allow students to access their submitted assignments to make comments, view their grades, etc... using this URI:&lt;br /&gt;&lt;code&gt;/students/avalentin/assignments/&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;On the other hand a teacher would like to access a particular students assignments with a few more options, such as copy-editing or grading the submission. However making the resource available from the same URI as a student does not provide the context that the teacher is reviewing the item. In that case you may provide a URI that looks like this:&lt;br /&gt;&lt;code&gt;/teachers/cgjung/students/avalentin/assignments/&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The great thing about this URI is that it gives you a context, "As a teacher I want to view a students assignments" vs "As a student I want to view the assignments I submitted for grading"&lt;br /&gt;&lt;br /&gt;Now Rails makes it easy to accomplish this goal. First make students available as a resource with the following mapping:&lt;br /&gt;&lt;code&gt;map.resources :students&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Next make that students assignments available as a nested resource:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;map.resources :students do |students|&lt;br /&gt;    students.resources :assignments&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now you can access a specific students assignments using this URI&lt;br /&gt;&lt;code&gt;/students/{student id}/assignments/{assignment id}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The teachers mapping looks more or less like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;map.resources :teachers do |teachers|&lt;br /&gt;  teachers.resources :students do |students|&lt;br /&gt;    students.resources :assignments&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This access a specific students assignments using this URI&lt;br /&gt;&lt;code&gt;/teachers/{teachers id}/students/{student id}/assignments/{assignment id}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;That's it really. Well not really. Those mappings actually result in non-human discernible URIs that look like this:&lt;br /&gt;&lt;code&gt;/teachers/9999/students/4353/assignments&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now maybe I'm over analyzing this but my preference would be to have resource identifiers that have a logical meaning that is not tied to some database identity...&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-6462049022567961820?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/6462049022567961820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=6462049022567961820&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6462049022567961820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6462049022567961820'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/02/rest-and-resource.html' title='REST and the Resource'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-8804667160169469834</id><published>2009-02-02T19:06:00.002-05:00</published><updated>2009-02-02T19:14:42.532-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Church'/><title type='text'>Help Us Feed Others!</title><content type='html'>&lt;p class="western" style="margin-bottom: 0in; text-align: center;"&gt;&lt;span style="font-family:Verdana, sans-serif;font-size:100%;"&gt;Hello my fellow readers!&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="margin-bottom: 0in; text-align: left;"&gt;&lt;span style="font-family:Verdana, sans-serif;font-size:100%;"&gt;We really need your help to raise funds that support our many social programs that service &lt;a href="http://www.nihn.org/ihn/ihn.html"&gt;homeless families &lt;/a&gt;in Montclair, NJ through &lt;a href="http://www.saintpeterclaverchurch.org/"&gt;Saint Peter Claver Church&lt;/a&gt;. Please Support Social Concerns through our Annual Mardi Gras Event.&lt;/span&gt;&lt;/p&gt;  &lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;All profits from the event go to one of St. Peter Claver’s most important goals, helping people in need. Providing help is especially critical during these tough economic times. Demand for services has increased sharply, particularly for the church’s food pantry. Supplies have dwindled quickly. The following are the programs you can help: &lt;/span&gt;&lt;/span&gt; &lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;Our  FOOD PANTRY is open five days a week and regularly feeds 60+ people  in the community. The money you donate will help stock this pantry  and provide some families with supermarket gift cards. You can also  donate food or gift cards anytime throughout the year. &lt;/span&gt;&lt;/span&gt;  &lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;  &lt;ul&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;THANKSGIVING  meals with all the trimmings are prepared for 75 + people each year.  &lt;/span&gt;&lt;/span&gt;  &lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;  &lt;ul&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;EMERGENCY  FINANCIAL AID is given to needy people in the community for things  like prescription drugs, gas and electric bills and bus cards to get  to work.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;  &lt;ul&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;HELPING  THE HOMELESS- Twice a year, the church opens its doors for a week to  host HOMELESS families through the Interfaith Hospitality Network.  The church helps feed these families, provides money for laundry  service and makes their stay comfortable. &lt;/span&gt;&lt;/span&gt;  &lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;  &lt;ul&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;The  COMMUNITY TUTORING PROGRAM is run by the Montclair Public Schools in  the church’s technology lab. Educational books, PC-based  software paper, pencils, flash cards, work books, or juice and  snacks are always needed. &lt;/span&gt;&lt;/span&gt;  &lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;  &lt;ul&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;Each  day, St. Peter Claver opens its doors and provides heat and  electricity to a number of nonprofit groups, among them the NAACP  Education Committee, NJ Peace Action and People’s Organization  for Progress.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p class="western" style="margin-bottom: 0in;"&gt;  &lt;/p&gt; &lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;We hope that you will share in the church’s mission to help the less fortunate. The following are the many ways you can help raise money for social concerns and all profits go towards social concerns: &lt;/span&gt;&lt;/span&gt; &lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;Purchase  an ad in the Mardi Gras Program (all profits go towards social  concerns):&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;$200  Full Page Inside Cover&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;$100  Full Page &lt;/span&gt;&lt;/span&gt;  &lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;$50  Half Page&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;$$25  Quarter Page&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;$10  Sponsor&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;/ul&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;Donate  a gift basket (or items to fill a gift basket) that will be raffled  (all profits go towards social concerns)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="font-size:85%;"&gt;Attend  the Mardi Gras Party on Feb. 21 at Senorita’s Restaurant in  Bloomfield $35 adt /$15 chd&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;Purchase  Gift Basket Raffles tickets (at the Mardi Gras Party - Feb 21)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p class="western" style="margin-bottom: 0in;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;Purchase  50/50 tickets (available Feb 8 – Feb 21) &lt;/span&gt;&lt;/span&gt;  &lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;    &lt;p class="western" style="margin-bottom: 0in;" align="center"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;b&gt;The form for your contribution towards helping the needy could be found here: &lt;a href="http://docs.google.com/View?docid=df26w9km_25gvst784c"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="margin-bottom: 0in;" align="center"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;b&gt;&lt;a href="http://docs.google.com/View?docid=df26w9km_25gvst784c"&gt;http://docs.google.com/View?docid=df26w9km_25gvst784c&lt;/a&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="margin-bottom: 0in;" align="center"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;b&gt;Thank you for caring. As Mother Teresa said:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="western" style="margin-bottom: 0in;" align="center"&gt;“&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;i&gt;&lt;b&gt;If you can’t feed a hundred people, then feed just one.”&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="western" style="margin-top: 0.21in; margin-bottom: 0in;" align="center"&gt;  &lt;span style="font-family:Verdana, sans-serif;"&gt;&lt;span style="font-size:130%;"&gt;St. Peter Claver  Church • 56 Elmwood Ave. • Montclair, NJ 07042&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-8804667160169469834?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/8804667160169469834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=8804667160169469834&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/8804667160169469834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/8804667160169469834'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/02/help-us-feed-others.html' title='Help Us Feed Others!'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-6257939285146994759</id><published>2009-01-29T13:15:00.004-05:00</published><updated>2009-01-29T13:20:24.614-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Books'/><title type='text'>The Well-Grounded Rubyist</title><content type='html'>David A. Black is wrapping up a new book that covers the features in Ruby 1.9&lt;br /&gt;Here is a sample chapter http://www.infoq.com/news/2009/01/The-Well-Grounded-Rubyist&lt;br /&gt;&lt;br /&gt;Follow him on twitter @david_a_black and his blog http://dablog.rubypal.com/&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-6257939285146994759?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/6257939285146994759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=6257939285146994759&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6257939285146994759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6257939285146994759'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/01/well-grounded-rubyist.html' title='The Well-Grounded Rubyist'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-327399020650307534</id><published>2009-01-28T11:35:00.006-05:00</published><updated>2009-02-01T23:26:22.393-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Concordion'/><title type='text'>RCor 0.9.0 - Concordion in Ruby</title><content type='html'>Rcor 0.9.0 has been released.&lt;br /&gt;&lt;br /&gt;It fixes some CSS issues (which led to misleading reporting) as well as improved support for verifyRows, which models the behavior of FIT row fixtures.&lt;br /&gt;&lt;br /&gt;See the wiki page on it, &lt;a href="http://code.google.com/p/rcor/wiki/verifyRows" target="_blank"&gt;http://code.google.com/p/rcor/&lt;wbr&gt;wiki/verifyRows&lt;/a&gt;, for details.&lt;br /&gt;&lt;br /&gt;====================================&lt;br /&gt;&lt;br /&gt;Just wanted to announce that RCor 0.8.7 was released yesterday!&lt;br /&gt;&lt;br /&gt;Its got a few bug fixes in it as well as better error reporting.&lt;br /&gt;&lt;br /&gt;Here is the link to download the latest version:&lt;br /&gt;http://code.google.com/p/rcor/downloads/list&lt;br /&gt;&lt;br /&gt;Thanks to Christopher Gardner and Ben Goodspeed for the changes!&lt;br /&gt;&lt;br /&gt;You are welcome to ask questions on our google group or join in on the action!&lt;br /&gt;http://groups.google.com/group/ruby-concordion&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-327399020650307534?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/327399020650307534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=327399020650307534&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/327399020650307534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/327399020650307534'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/01/rcor-087-concordion-in-ruby.html' title='RCor 0.9.0 - Concordion in Ruby'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-216840693163272481</id><published>2009-01-27T12:59:00.003-05:00</published><updated>2009-01-27T13:10:24.156-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Testing is overrated - video</title><content type='html'>This is a pretty good presentation for those of you out there trying to become better testers.&lt;br /&gt;&lt;br /&gt;http://www.infoq.com/presentations/francl-testing-overrated&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-216840693163272481?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/216840693163272481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=216840693163272481&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/216840693163272481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/216840693163272481'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/01/testing-is-overrated-video.html' title='Testing is overrated - video'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-7638876531537835016</id><published>2009-01-26T20:46:00.001-05:00</published><updated>2009-01-26T20:48:26.504-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Random Stuff'/><title type='text'>Speak</title><content type='html'>I just disabled moderating comments as well as enabling anonymous users. I've always wondered what you think.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-7638876531537835016?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/7638876531537835016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=7638876531537835016&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/7638876531537835016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/7638876531537835016'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/01/speak.html' title='Speak'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-3255130561916167829</id><published>2009-01-25T22:29:00.000-05:00</published><updated>2009-01-25T10:38:19.132-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><title type='text'>The Team</title><content type='html'>Like many projects success or failure largely depends on your team. If you have good business people, good developers, good chemistry, good leadership, etc... chances are you will be successful. It does not matter if you are using a so called "Agile" practices or not. If the people on your team can't work together you are pretty much going to fail.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-3255130561916167829?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/3255130561916167829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=3255130561916167829&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3255130561916167829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3255130561916167829'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/01/team.html' title='The Team'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-3753739221800436245</id><published>2009-01-25T12:07:00.000-05:00</published><updated>2009-01-25T12:07:49.179-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><category scheme='http://www.blogger.com/atom/ns#' term='Kaizen'/><title type='text'>Kaizen Antipatterns or You suck at getting better</title><content type='html'>I have noticed that people have a bad tendency of blaming Agile for them not being able to do their jobs right. Take Kaizen for example, most of the teams that tell me they are practicing it have no idea what they are doing. They think that Kaizen events are a waste of time because they sit around and bitch for a few hours rather than actually trying to come up with a strategy to get the job done right.&lt;br /&gt;Here are a few smells I think you should watch out for when running such an event:&lt;br /&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt; Mistaking &lt;span class="nfakPe"&gt;Kaizen&lt;/span&gt; for Kaikaku (rapid, large, revolutionary change). In my experience, unless the project team has influence across the organization, these plans collapse under their own weight.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Tyring to fix too many things at once.&lt;/li&gt;&lt;li&gt;Not producing concrete measurable action items and assigning them to the team.&lt;/li&gt;&lt;li&gt; Conducting &lt;span class="nfakPe"&gt;Kaizen&lt;/span&gt; events like a therapy session. During &lt;span class="nfakPe"&gt;Kaizen&lt;/span&gt; events, there are opportunities to explore "unreasonable or excessive strain", which often effects team members on an emotional level. The goal of &lt;span class="nfakPe"&gt;Kaizen&lt;/span&gt; is to eliminate the source of the "strain", not to "heal" the teams psychie.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Identifying a person or team member as the root cause of the problem.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Allowing subjective moderators to conduct the events.&lt;/li&gt;&lt;li&gt; Use &lt;span class="nfakPe"&gt;Kaizen&lt;/span&gt; as a platform to push agendas instead of solve problems.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="nfakPe"&gt;Kaizen&lt;/span&gt; events take place long after the problem is identified.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Not understanding &lt;span class="nfakPe"&gt;Kaizen&lt;/span&gt; metaphors for Software Development.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;"Not asking for the Check" - This is when the team does not follow up on the &lt;span class="nfakPe"&gt;Kaizen&lt;/span&gt; action items. &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-3753739221800436245?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/3753739221800436245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=3753739221800436245&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3753739221800436245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3753739221800436245'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/11/kaizen-antipatterns-or-you-suck-at.html' title='Kaizen Antipatterns or You suck at getting better'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-6384440023481524527</id><published>2009-01-25T12:01:00.000-05:00</published><updated>2009-01-25T12:01:45.725-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>How Ruby made me into a better Java... TDDer?</title><content type='html'>While I was coaching a few teams last summer I realized that my perspective on testing Java applications changed because of Ruby. I used to be one of those people who would not to use databases when writing automated "unit" tests. I would then advise others to use test spies instead of the actual database dependent code. That works when you are working with code that interacts with a repository but what about when you test the repository itself? Well you all know how that ends up.&lt;br /&gt;When I started to work with Ruby I started to apply the same mechanics that I used while working on Java projects, however I quickly discovered that my prejudice from working with other tools was an impediment to my success. Tests where fast and the tools where simple in spite of the fact that they dependend on external sources.&lt;br /&gt;After working with Ruby, I returned to Java questioning my assumptions about testing. At first I started by writing component level tests that would execute the entire stack because I thought that Rails like functional tests would make sense in my Java world. The good thing that happened there was I discovered a rats nest of performance problems in our production code and it got my XP team thinking about how much we really ignored the P in Right BICEP. However, the tests were slow and after profiling them it was clear there was very little we could do to improve the performance. All of the resources in the tests were exhausted in bootsrapping, Spring contexts, Hibernate SessionFactory, etc...&lt;br /&gt;Our team then went on to talk about what was going on. Turns out that the tests where telling us there was something wrong with the &lt;span style="font-style: italic;"&gt;design&lt;/span&gt;, we just were not &lt;span style="font-style: italic;"&gt;listening&lt;/span&gt; to them. What happened to "Tell, Don't Ask"? Why did my code suffer from so many smells?&lt;br /&gt;Just around this time I discovered that &lt;a href="http://www.natpryce.com/"&gt;Nat Pryce&lt;/a&gt; and &lt;a href="http://www.m3p.co.uk/blog"&gt;Steve Freeman&lt;/a&gt; where writing their book on&lt;a href="http://www.mockobjects.com/book/listening-to-the-tests.html"&gt; Growing OO Software Guided by Tests&lt;/a&gt;. Reading this helped me go through sort of an OO design revival and return to a tabula rasa.&lt;br /&gt;I strongly believe that learning and working with Ruby has opened new doors for me both as a tester and designer. It has forced me to challenge what I thought was &lt;span style="font-style: italic;"&gt;good&lt;/span&gt; code and now more than ever I realize how TDD is an art form that is difficult to master. It isn't some mechanical exercise that you can teach someone easily. It is a discipline that takes practice, time, and above all support from a good team.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-6384440023481524527?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/6384440023481524527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=6384440023481524527&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6384440023481524527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6384440023481524527'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/01/how-ruby-made-me-into-better-java-tdder.html' title='How Ruby made me into a better Java... TDDer?'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-3240665528108450501</id><published>2009-01-06T23:38:00.003-05:00</published><updated>2009-01-07T00:10:14.355-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>I heart Ruby</title><content type='html'>Here is another reason why I love Ruby:&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family: courier new;"&gt;?&gt; module Sweatshirt&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;   def self.included(klass)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;     klass.extend ClassMethods&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;   end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;?&gt;   module ClassMethods&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;      def read_aloud&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;          "Now I have a machine gun"       &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;      end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;   end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;   def read_aloud&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;      "ho, ho, ho"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;    end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt; end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;=&gt; nil&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;?&gt; class DieHard&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt;   include Sweatshirt&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt; end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;=&gt; DieHard&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt;&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;?&gt; puts "#{DieHard.read_aloud} #{DieHard.new.read_aloud}"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Now I have a machine gun ho, ho, ho&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;=&gt; nil&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-3240665528108450501?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/3240665528108450501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=3240665528108450501&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3240665528108450501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3240665528108450501'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2009/01/i-heart-ruby.html' title='I heart Ruby'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-733716031627651073</id><published>2008-12-27T12:18:00.004-05:00</published><updated>2008-12-27T12:38:58.400-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Class and class variables...</title><content type='html'>When is a class variable a class variable? When it's not an instance variable I guess:&lt;br /&gt;irb&gt;&gt;&lt;br /&gt;&gt;&gt; class Foo&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&gt;&gt;    attr_reader :foo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;?&gt;   @foo = "I exist in the class object"  #class &lt;span style="font-style: italic;"&gt;instance&lt;/span&gt;&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;variable&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&gt;&gt;   @@foo = "I have no idea where I exist" #class variable&lt;/span&gt;&lt;br /&gt;&gt;&gt;&lt;br /&gt;?&gt;   def initialize(*args)  &lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&gt;&gt;         @foo = "I am an instance variable" #instance variable&lt;/span&gt;&lt;br /&gt;&gt;&gt;   end&lt;br /&gt;&gt;&gt;&lt;br /&gt;?&gt;   def self.read_foo&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&gt;&gt;       puts Foo.new.foo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&gt;&gt;       puts @foo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&gt;&gt;       puts @@foo&lt;/span&gt;&lt;br /&gt;&gt;&gt;   end&lt;br /&gt;&gt;&gt; end&lt;br /&gt;=&gt; nil&lt;br /&gt;&gt;&gt;&lt;br /&gt;?&gt; Foo.read_foo&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;I am an instance variable&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;I exist in the class object&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;I have no idea where I exist&lt;/span&gt;&lt;br /&gt;=&gt; nil&lt;br /&gt;&gt;&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-733716031627651073?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/733716031627651073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=733716031627651073&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/733716031627651073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/733716031627651073'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/12/class-and-class-variables.html' title='Class and class variables...'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-4369791017078300643</id><published>2008-12-18T21:06:00.004-05:00</published><updated>2008-12-21T22:14:32.301-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Installing RCov on Mac OS X.5</title><content type='html'>I tried installing rcov on my Mac OS 10.5.6&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;$&gt;sudo gem install rcov&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Password:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Building native extensions.  This could take a while...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;ERROR:  Error installing rcov:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    ERROR: Failed to build gem native extension.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby extconf.rb install rcov&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;can't find header files for ruby.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Gem files will remain installed in /Library/Ruby/Gems/1.8/gems/rcov-0.8.1.2.0 for inspection.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Results logged to /Library/Ruby/Gems/1.8/gems/rcov-0.8.1.2.0/ext/rcovrt/gem_make.out&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Really? That sucks. I asked the interweb and I found this post:&lt;br /&gt;http://www.macruby.org/trac/wiki/Troubleshooting&lt;br /&gt;OK so I installed Xcode 3 from here: http://developer.apple.com/Tools/xcode/ and then installed mac ports from here: http://www.macports.org/&lt;br /&gt;&lt;br /&gt;Everything worked after that! Awesome!&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-4369791017078300643?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/4369791017078300643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=4369791017078300643&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4369791017078300643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4369791017078300643'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/12/installing-rcov-on-mac-os-x5.html' title='Installing RCov on Mac OS X.5'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-1963774959710453174</id><published>2008-12-12T17:39:00.001-05:00</published><updated>2008-12-12T17:41:00.921-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Corey Haines insights - Tools Vs. Technique</title><content type='html'>Corey provides some awesome insights while on the road pair programming with great developers:&lt;br /&gt;http://programmingtour.blogspot.com/2008/12/road-thoughts-tools-v-technique.html&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-1963774959710453174?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/1963774959710453174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=1963774959710453174&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1963774959710453174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1963774959710453174'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/12/corey-haines-insights-tools-vs.html' title='Corey Haines insights - Tools Vs. Technique'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-2619255947585917536</id><published>2008-12-07T21:50:00.001-05:00</published><updated>2008-12-07T21:52:07.233-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conferences'/><title type='text'>What's missing from the manifesto?</title><content type='html'>Brian Marick on &lt;a href="http://www.exampler.com/blog/2008/12/05/agile-development-practices-keynote-video/"&gt;"What the manifesto left out"&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-2619255947585917536?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/2619255947585917536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=2619255947585917536&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2619255947585917536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2619255947585917536'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/12/whats-missing-from-manifesto.html' title='What&apos;s missing from the manifesto?'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-2293987691243861476</id><published>2008-11-26T20:29:00.001-05:00</published><updated>2008-11-26T20:30:04.446-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Random Stuff'/><category scheme='http://www.blogger.com/atom/ns#' term='Funny'/><title type='text'>Courtesy of Michelle</title><content type='html'>An SQL query goes into a bar, walks up to two tables and says, "Can I join you?"&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-2293987691243861476?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/2293987691243861476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=2293987691243861476&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2293987691243861476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2293987691243861476'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/11/courtesy-of-michelle.html' title='Courtesy of Michelle'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-6943014054910120163</id><published>2008-11-24T19:45:00.002-05:00</published><updated>2008-11-24T19:46:47.011-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conferences'/><title type='text'>REST Track at QCon</title><content type='html'>I really wanted to go to this and after reading Jim Webber's &lt;a href="http://jim.webber.name/2008/11/23/61766710-3def-4dd9-9e36-b8d3147d14b1.aspx"&gt;posts&lt;/a&gt; on the REST track, I really regret having stayed home!&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-6943014054910120163?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/6943014054910120163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=6943014054910120163&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6943014054910120163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6943014054910120163'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/11/rest-track-at-qcon.html' title='REST Track at QCon'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-6217696241854092193</id><published>2008-11-23T23:24:00.003-05:00</published><updated>2008-11-27T12:00:48.451-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>Rails config for concordion</title><content type='html'>I am working with &lt;a href="http://code.google.com/p/rcor/"&gt;rcor&lt;/a&gt;, a ruby port of &lt;a href="http://www.concordion.org/"&gt;concordion&lt;/a&gt;, and I have run into a little setback working with Rails. RCor searches the $LOAD_PATH to find the html specifications, so I decided to add it to the standard config/test.rb. Here was the output:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;new-host:rcor-spike ariel$ rake test&lt;br /&gt;(in /Users/ariel/Documents/dev/bookstore)&lt;br /&gt;/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -Ilib:test "/Users/ariel/.gem/ruby/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader.rb" "test/unit/book_test.rb" "test/unit/hello_world_test.rb"&lt;br /&gt;Loaded suite /Users/ariel/.gem/ruby/1.8/gems/rake-0.8.3/lib/rake/rake_test_loader&lt;br /&gt;Started&lt;br /&gt;...E&lt;br /&gt;Finished in 0.073126 seconds.&lt;br /&gt;&lt;br /&gt;1) Error:&lt;br /&gt;test_spec(HelloWorldTest):&lt;br /&gt;RuntimeError: Could not find hello_world.html on the system load path!&lt;br /&gt;  /Users/ariel/.gem/ruby/1.8/gems/rcor-0.7.0/lib/concordion_reader.rb:15:in `find_on_load_path'&lt;br /&gt;  /Users/ariel/.gem/ruby/1.8/gems/rcor-0.7.0/lib/concordion_reader.rb:4:in `read'&lt;br /&gt;  /Users/ariel/.gem/ruby/1.8/gems/rcor-0.7.0/lib/concordion_parser.rb:22:in `parse'&lt;br /&gt;  /Users/ariel/.gem/ruby/1.8/gems/rcor-0.7.0/lib/concordion_test_case.rb:69:in `parse_spec'&lt;br /&gt;  /Users/ariel/.gem/ruby/1.8/gems/rcor-0.7.0/lib/concordion_test_case.rb:22:in `test_spec'&lt;br /&gt;  /Users/ariel/.gem/ruby/1.8/gems/activesupport-2.1.1/lib/active_support/testing/setup_and_teardown.rb:67:in `__send__'&lt;br /&gt;  /Users/ariel/.gem/ruby/1.8/gems/activesupport-2.1.1/lib/active_support/testing/setup_and_teardown.rb:67:in `run'&lt;br /&gt;&lt;br /&gt;4 tests, 3 assertions, 0 failures, 1 errors&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Really? Well it doesn't work. I had to add the following line to my config/environment.rb: &lt;code&gt;config.load_paths += %W( #{RAILS_ROOT}/test/acceptance ) if ENV['RAILS_ENV'] == 'test'&lt;/code&gt;&lt;br /&gt;WhyTF do I have to do this? Rather than STFW or RTFM I am blogging about it. Talk about open-closed jeez!!!&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-6217696241854092193?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/6217696241854092193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=6217696241854092193&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6217696241854092193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6217696241854092193'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/11/rails-config-for-concordion.html' title='Rails config for concordion'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-2041581737477526414</id><published>2008-11-22T12:29:00.003-05:00</published><updated>2008-11-22T12:59:15.358-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='User Stories'/><title type='text'>Non Functional Requirements as stories</title><content type='html'>Mike Cohn has &lt;a href="http://blog.mountaingoatsoftware.com/?p=62"&gt;this&lt;/a&gt; to say:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;These are requirements that are not about specific functionality (”As a user of a word processor, I want to insert a table into my document.”), but are rather about an attribute or characteristic of the system...  “If it’s non-functional, why do I care about it?”... Each constraint we put on a system narrows the design choices a bit; calling these “constraints” rather than “non-functional requirements” helps us remember this... Trying to put a constraint into this template is a good exercise as it helps make sure you understand who wants what and why.&lt;/blockquote&gt;This post resonates with me because I firmly believe that any feature in your application must fulfill the needs of its users not its engineers. Doing so will encourage simplicity in your application development that way you avoid useless stories like, &lt;span style="font-style: italic;"&gt;As an architect, I want for the system to be integrated using an ESB (so that my resume looks good and I can frustrate the developers who are forced to use it)&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-2041581737477526414?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/2041581737477526414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=2041581737477526414&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2041581737477526414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2041581737477526414'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/11/non-functional-requirements-as-stories.html' title='Non Functional Requirements as stories'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-7807133949638074362</id><published>2008-11-18T23:37:00.005-05:00</published><updated>2008-11-23T23:24:25.775-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>Rails periodically_call_remote issue</title><content type='html'>Here is an interesting problem that I ran into today. A few guys where working on a feature that used a progress bar to give a user feedback on the status of a background task. In order to do this, they used the Rails prototype helper &lt;span style="font-family:courier new;"&gt;periodically_call_remote&lt;/span&gt; method however they noticed that multiple requests were being fired after an interval had passed. I wasn't sure what was happening so I started to read the source code and as of the time of the writing of this post &lt;span style="font-family:courier new;"&gt;periodically_call_remote &lt;/span&gt;creates a &lt;span style="font-family: courier new;"&gt;PeriodicExecuter&lt;/span&gt; but does not ever stop it. According to the Prototype website: &lt;span style="font-style: italic;"&gt;"Once launched, a PeriodicalExecuter triggers indefinitely, until the page unloads (which browsers usually take as an opportunity to clear all intervals and timers) or the executer is manually stopped"&lt;/span&gt;&lt;br /&gt;e.g. of stopping manually:&lt;br /&gt;&lt;code&gt;new PeriodicalExecuter(function(pe) {&lt;br /&gt;                              if (!confirm('Want me to annoy you again later?'))&lt;br /&gt;                              pe.stop();&lt;br /&gt;                              }, 5);&lt;/code&gt;&lt;br /&gt;Now what happens is that every time the application rendered the ajax call, it spawned a new executor, which ends up hanging around for a while. This would not be a problem if the browser "unloaded" itself every once and a while so here is some advice... if you need write a feature that requires rendering a &lt;span style="font-family:courier new;"&gt;periodically_call_remote&lt;/span&gt; multiple times then you are probably doing it wrong.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-7807133949638074362?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/7807133949638074362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=7807133949638074362&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/7807133949638074362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/7807133949638074362'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/11/rails-periodicallycallremote-issue.html' title='Rails periodically_call_remote issue'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-2050082029601550651</id><published>2008-11-16T21:34:00.003-05:00</published><updated>2008-12-21T22:16:17.217-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Random Stuff'/><title type='text'>How the F**k????</title><content type='html'>How did &lt;a href="http://www.lukemelia.com/"&gt;Luke&lt;/a&gt; get Lebron on his &lt;a href="http://www.weplay.com/blog/the-daily-stand-up"&gt;team&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-2050082029601550651?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/2050082029601550651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=2050082029601550651&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2050082029601550651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2050082029601550651'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/11/how-fk.html' title='How the F**k????'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-7246270679868798043</id><published>2008-11-16T10:09:00.004-05:00</published><updated>2008-11-16T22:36:05.617-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='ranting'/><title type='text'>Death to Agile - Rebuttal</title><content type='html'>Uncle Bob posted a &lt;a href="http://blog.objectmentor.com/articles/2008/11/16/dirty-rotten-scrumdrels"&gt;rebuttal&lt;/a&gt; to Shores post.&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;Some have implied that if all those scrum teams had adopted XP instead of scrum, they wouldn’t be having all the technical debt they are seeing. BALDERDASH!... Let me be more precise. ASININE, INANE, ABSURDITY. BALONEY. DINGOES KIDNEYS.&lt;/blockquote&gt;I do not think that Jim alluded to that at all but OK. I have been on too many teams that are composed of the wrong people, the wrong talent, the wrong leadership, in the wrong place, at the wrong time. The teams that gave birth to many of the agile practices where composed of all-stars! Think about the first XP team on the C3 project, wouldn't you be successful with these guys on your team: Beck, Fowler, Cunningham, Jefferies, Hendrickson?&lt;br /&gt;If I read the next part correctly he believes its &lt;span style="font-style: italic;"&gt;your&lt;/span&gt; job to do a &lt;span style="font-style: italic;"&gt;good&lt;/span&gt; job...&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;But it is neither the purpose of scrum nor of CSMs to make engineers out of us, or to instill the disciplines of craftsmanship within us. That’s our job!...&lt;/span&gt; Oh, yeah, and stop blaming everything (and everybody) else for your own laziness.&lt;/blockquote&gt;As you can tell I agree with Uncle Bobs position on individual responsibility however the fact of the matter is &lt;span style="font-style: italic;"&gt;perception &lt;/span&gt;&lt;span style="font-style: italic;"&gt;is a&lt;/span&gt;&lt;span style="font-style: italic;"&gt; reality&lt;/span&gt;.&lt;br /&gt;The industry, like a mob, is not rational or scientific; it often blindly follows trends; it believes and accepts fallacies as truth; and it subscribes to leadership of the "strongest" of the group. From the mobs perspective, failing at agile (a.k.a Scrum) means failing at&lt;span style="font-style: italic;"&gt; agile &lt;/span&gt;(Scrum, XP, Crystal, et al.). That's the a terrible reality and Jim is afraid that we are in trouble as a result.&lt;br /&gt;As I stated in my earlier post I say f**k it. Just let people fail there is nothing wrong with that. Let them &lt;span style="font-style: italic;"&gt;think&lt;/span&gt; that agile sucks because what they &lt;a href="http://blog.arielvalentin.com/2008/09/xp-without-tdd.html"&gt;are practicing right now actually does&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-7246270679868798043?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/7246270679868798043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=7246270679868798043&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/7246270679868798043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/7246270679868798043'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/11/death-to-agile-rebuttal.html' title='Death to Agile - Rebuttal'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-7223013361024914274</id><published>2008-11-15T22:56:00.003-05:00</published><updated>2008-11-15T23:46:12.714-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='ranting'/><title type='text'>Death to Agile</title><content type='html'>In &lt;a href="http://jamesshore.com/Blog/The-Decline-and-Fall-of-Agile.html"&gt;this blog post&lt;/a&gt; James Shore expresses a bit of concern about the bad reputation agile has gotten as a result of "malpractice". If I read it right, he feels that this reputation will lead to the baby being thrown out with the bathwater:  &lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;Whatever we do, we need to do it soon. Agile is failing all around us, and I'd hate for the failure of the fad to take down the truly useful ideas that we started with.&lt;/blockquote&gt;To tell you the truth I can't wait until "agile" dies. I am sick of it.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-7223013361024914274?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/7223013361024914274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=7223013361024914274&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/7223013361024914274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/7223013361024914274'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/11/death-to-agile.html' title='Death to Agile'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-6963464266023235361</id><published>2008-11-11T21:23:00.007-05:00</published><updated>2008-12-16T22:05:51.298-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='User Stories'/><title type='text'>More on "Technical" User Stories</title><content type='html'>Consider a project where you are replacing an antiquated system for the police department and you have a user story similar to &lt;span style="font-style: italic;"&gt;"As the captain, I want to know about the crimes committed in our precinct so that I know where to assign officers and reduce crime"&lt;/span&gt;. Now imagine that your project team is composed of individuals in very well defined roles such as UI designers, server side developers, DBAs, and sysadmins.&lt;br /&gt;How would this team go about implementing this story? In my experience the system would be designed in layers with integration occuring after each team completed the work on their tier. Then there is the question of, what do we do about the "old system"?  Some feel that disabling or perhaps integrating the antiquated system with the new feature in the "old system" should be part of the "definition of done" while others believe that it should be treated as a separate user story. Scott Ambler wrote an &lt;a href="http://www.ddj.com/hpc-high-performance-computing/211800534?pgno=1"&gt;article&lt;/a&gt; on the subject where he describes the problem with creating user stories that focus on these "so-called" non-functional requirements:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;All interesting requirements, but each one on their own &lt;span style="font-weight: bold;"&gt;provides very little value until you put them in the greater context&lt;/span&gt; of sending out marketing literature to a targeted group of customers. Until all of those user stories, and more, are implemented &lt;span style="font-weight: bold;"&gt;your system really doesn't provide true business value&lt;/span&gt; to your stakeholders, &lt;span style="font-weight: bold;"&gt;regardless of the fact that you have been producing potentially shippable software every iteration&lt;/span&gt; up to that point.&lt;br /&gt;&lt;/blockquote&gt;Now if you have not read my original rant on &lt;a href="http://blog.arielvalentin.com/2007/09/technical-user-stories.html"&gt;"technical" user stories&lt;/a&gt;, then I should probably let you know that I believe it is a bad idea. The simplest approach IMO is to pair down user stories into the smallest vertical slices possible and incrementally add support for more general features. Using my example above, we could reduce this story to a specific type of crime. Another way to reduce the scope from an entire city to a neighborhood. Do whatever it takes to make it small enough to get "production releasable software" in one iteration. Its not that hard.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-6963464266023235361?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/6963464266023235361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=6963464266023235361&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6963464266023235361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6963464266023235361'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/11/more-on-technical-user-stories.html' title='More on &quot;Technical&quot; User Stories'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-2789001490708036718</id><published>2008-11-08T13:25:00.006-05:00</published><updated>2008-11-17T20:08:10.411-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Conferences'/><title type='text'>RubyConf 2008 Day 3 - Code Review</title><content type='html'>There is not much I can say about this. I actually felt a little uncomfortable because it was poking fun at some of my customers. Here are some of the problems they pointed out:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Leave no broken windows&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Fixtures are brittle&lt;/li&gt;&lt;li&gt;Do not test "validate" using invalid data in your fixtures&lt;/li&gt;&lt;li&gt;Use VI as your editor&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If you need default values for your Model, encode them in a class method&lt;/li&gt;&lt;li&gt;Use "comment out code" while writing characterization tests&lt;/li&gt;&lt;li&gt;hook methods ... check if it applies to you.. make sure you call super in another if you are implementing decoration using inheritance&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-2789001490708036718?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/2789001490708036718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=2789001490708036718&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2789001490708036718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2789001490708036718'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/11/rubyconf-2008-day-3-code-review.html' title='RubyConf 2008 Day 3 - Code Review'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-8819058829986913323</id><published>2008-11-08T10:29:00.007-05:00</published><updated>2008-12-21T22:16:02.102-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Conferences'/><title type='text'>RubyConf 2008 Day 3 - Advanced DSL's in Ruby</title><content type='html'>Neal Ford gave this &lt;a href="http://www.nealford.com/downloads/conferences/canonical/Neal_Ford-Advanced_DSLs_in_Ruby-slides.pdf"&gt;talk&lt;/a&gt; and I would say that this was one of the best presentations at this conference. For the most part Neil is talking about some of the patterns that Fowler has been working on in his &lt;a href="http://martinfowler.com/dslwip/"&gt;book&lt;/a&gt; only using examples written in Ruby. Ford also introduces some patterns he has identified and a handful of interesting frameworks to help support writing both internal and external DSLs.&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;The Beginning&lt;/span&gt;&lt;br /&gt;He started by discussing the &lt;a href="http://martinfowler.com/dslwip/ExpressionBuilder.html"&gt;fluent interfaces&lt;/a&gt;, which use &lt;a href="http://martinfowler.com/dslwip/MethodChaining.html"&gt;method chaining&lt;/a&gt; to express logic in a "sentence". The challenge with using this style is how method chaining semantics requires "an explicit terminator ", but that causes a "the finishing problem" because it breaks the fluency in the language. In order to mitigate this problem he advised the audience to use a wrapper context and use nested methods to control completion: e.g.&lt;code&gt; rules.add(Discount.new.based_on(foo))&lt;/code&gt; instead of &lt;code&gt; rules.add_discount_based_on(foo)&lt;/code&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;The Middle &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Another thing to keep in mind is that we should control the context. In other words, alias methods so that it reads a little better: e.g. Instead of&lt;code&gt; recepie.instance_eval { @ingredients } &lt;/code&gt;alias instance_eval to provide context&lt;code&gt; recepie.consists_of{ @ingredients }&lt;/code&gt;&lt;br /&gt;He goes on to discuss a few more ways to combat the finishing a.k.a. stopping problem. A common mistake he sees people make in Ruby is using method_missing as a factory to create types. This approach violates the open-closed principle so he advised the audience to use Mixins and builders instead of using method_missing.&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Almost at the End&lt;/span&gt;&lt;br /&gt;Some other interesting things he discussed where &lt;a href="http://martinfowler.com/dslwip/FunctionSequence.html"&gt;function sequences&lt;/a&gt;, bubble words i.e. words that are there for readability not and executable statement, and the declarative nature of DSLs.&lt;br /&gt;Sprinkled throughout the presentation were examples of some DSL code in Ruby. What I found particularly interesting was the work that &lt;a href="http://jayfields.com/"&gt;Jay Fields&lt;/a&gt; has done with &lt;a href="http://www.infoq.com/presentations/fields-business-natural-languages-ruby"&gt;Business Natural Languages&lt;/a&gt;.&lt;br /&gt;Just remember the three P's (Polish, Preprocess, Parse):&lt;br /&gt;Polish =&gt; simple string substitutions to convert nearly ruby to actual ruby&lt;br /&gt;Pre-process =&gt; load strings and modify to coerce them into ruby code&lt;br /&gt;Parse =&gt; strings into your own language&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;The End&lt;/span&gt;&lt;br /&gt;Another bunch of interesting work he talked about were:&lt;br /&gt;&lt;a href="http://semr.rubyforge.org/"&gt;semr&lt;/a&gt; (&lt;a href="http://www.theagiledeveloper.com/commentaries/48"&gt;Matt Deiters&lt;/a&gt;)&lt;br /&gt;&lt;a href="http://olabini.com/blog/tag/dsl/"&gt;Xample&lt;/a&gt; (&lt;a href="http://ola-bini.blogspot.com/"&gt;Ola Bini&lt;/a&gt;)&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Conclusions&lt;/span&gt;&lt;br /&gt;I haven't had much of an opportunity to follow up on these project but I must say they are all rather interesting. DSLs have influenced the way I write code for some time, I just did not know that the coding style I adopted used some of the patterns that Neal described here. That made me feel good :)&lt;br /&gt;&lt;br /&gt;Also can't wait for Jays &lt;a href="http://www.amazon.com/Refactoring-Ruby-Addison-Wesley-Professional/dp/0321603508"&gt;book!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-8819058829986913323?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/8819058829986913323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=8819058829986913323&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/8819058829986913323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/8819058829986913323'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/11/rubyconf-2008-day-3-advanced-dsls-in.html' title='RubyConf 2008 Day 3 - Advanced DSL&apos;s in Ruby'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-1414748629097865850</id><published>2008-11-07T13:22:00.004-05:00</published><updated>2008-11-29T17:12:49.414-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Conferences'/><title type='text'>RubyConf 2008 Day 2 - What Every Rubyist Should Know About Threads</title><content type='html'>Jim Weirich starts with an introduction of computer architecture, Moore's law, and how the market is looking to build more multicore systems than they are investing in faster CPUs.&lt;br /&gt;Java and Ruby share similarities in their concurrent programming models, although I am not sure how much since JRE 1.5.&lt;br /&gt;&lt;br /&gt;He is demonstrated ruby thread code which incremented a nuber:&lt;br /&gt;@amount += 1&lt;br /&gt;&lt;br /&gt;We expect that this operation is atomic but there are a few operations here:&lt;br /&gt;@amount #read operation&lt;br /&gt;+ 1 #object creation operation&lt;br /&gt;@amount = (the result) #write operation&lt;br /&gt;&lt;br /&gt;With ruby you can create a Mutex object to synchronize a block:&lt;br /&gt;Mutex.new.synchronize do&lt;br /&gt;  @amount += amount&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;Jim also demonstrated deadlocks and the ruby script failed. Chain of threads where waiting for each other. Increases when you lock more than one resource at a time. Basically he is saying that multi-threading is difficult.&lt;br /&gt;&lt;br /&gt;Its hard because we share mutable memory.&lt;br /&gt;&lt;br /&gt;What can we do to write correct multi-threaded code?&lt;br /&gt;Use Erlang =&gt; Only Constants, Pattern Matching, Recusion (tail) (Erland eats serial for breakfast!)&lt;br /&gt;Use Clojure =&gt; pretty much a functional language. The language is designed to avoid deadlocks.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-1414748629097865850?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/1414748629097865850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=1414748629097865850&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1414748629097865850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1414748629097865850'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/11/rubyconf-2008-day-2-what-every-rubyist.html' title='RubyConf 2008 Day 2 - What Every Rubyist Should Know About Threads'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-7074316867280254757</id><published>2008-11-07T11:19:00.004-05:00</published><updated>2008-12-06T22:35:47.756-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Conferences'/><title type='text'>RubyConf 2008 Day 2 - Rameze</title><content type='html'>These are my raw unedited notes:&lt;br /&gt;&lt;br /&gt;Luc Castera&lt;br /&gt;His presentation is pretty amusing&lt;br /&gt;He believes that Ramaze is one of the underrated ruby web frameworks&lt;br /&gt;It is modular&lt;br /&gt;There is only one dependency... Rack&lt;br /&gt;ORM-agnostic&lt;br /&gt;Template agnostic&lt;br /&gt;From his perspective the source is Beautiful Code&lt;br /&gt;Bacon BDD - It looks interesting&lt;br /&gt;&lt;br /&gt;How is this different from rails?&lt;br /&gt;Action methods accept parameters&lt;br /&gt;#/controller_name/add/1/2&lt;br /&gt;def add(first, second)&lt;br /&gt;Supports regex and lambda routing&lt;br /&gt;It integrates easily with jquery&lt;br /&gt;&lt;br /&gt;Something that annoys me, Ariel not Luc, about these web frameworks is all of the scriptlets in the view. link_to for example makes it hard to read.&lt;br /&gt;I, Ariel, don't know that this is better than rails. It seems almost like there is more room to make mistakes.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-7074316867280254757?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/7074316867280254757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=7074316867280254757&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/7074316867280254757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/7074316867280254757'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/11/rubyconf-2008-day-2-rameze.html' title='RubyConf 2008 Day 2 - Rameze'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-4030129557494897377</id><published>2008-11-07T10:22:00.003-05:00</published><updated>2008-11-08T10:29:18.934-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Conferences'/><title type='text'>RubyConf 2008 Day 2 - Fear of Programming</title><content type='html'>This was a pretty engaging talk. No slides just us.&lt;br /&gt;&lt;br /&gt;Nathaniel Talbott started his talk by asserting that artists have an emotional relationship with their creations. Fred Brooks likened programmers to artists (actually poets) because we both start with a "blank sheet" were we use our skills, knowledge, and imagination to "create" something. Now if Brooks is correct, Nathaniel believes that programmers are also subject to this emotional connection but because we do not tend to think of ourselves as artists, we tend not to explore this part of our lives.&lt;br /&gt;&lt;br /&gt;Fear is a "very significant emotion" that prevent us from doing "that thing" but "all fear is legitimate because they are warning signs" trying to protect us from danger. "Fear is to your mind as pain is in your body", your body uses pain to tell you that there is something wrong.&lt;br /&gt;&lt;br /&gt;Nathaniel went on to describe how fear hinders our productivity. Here are just some of the fears that he described we face:&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Fear of a blank page &lt;/span&gt;&lt;br /&gt;How do I start? What do I do?&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;Fear of the code&lt;/span&gt;&lt;br /&gt;Legacy code&lt;br /&gt;Beautiful code.  Am I gonna mess this up?&lt;br /&gt;Maybe I will write something that I will not respect and others will not respect me&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;Fear of not finishing&lt;/span&gt;&lt;br /&gt;I am afraid it will not get done&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;Fear of finishing&lt;/span&gt;&lt;br /&gt;Management or lead developers are afraid to call it done and push this out&lt;br /&gt;Its easy to hack away on a side project without publishing it&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;&lt;br /&gt;Fear of the unknown&lt;/span&gt;&lt;br /&gt;The big amorphous blob that I cannot conceptualize.&lt;br /&gt;&lt;br /&gt;Some of us in the audience added the following:&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Fear of not liking what I do&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Fear of developing meaningless code&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Fear of commitment&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Fear of re-invention&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Fear rejecting people&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Fear of all of the non-programming activities&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Fear imagination outreaches my ability&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;He states that since fear is a warning mechanism than "it is pathetic as a decision maker". Do not rely on your "fear" to make decisions instead rely on &lt;span style="font-weight: bold;"&gt;more knowledge and wisdom&lt;/span&gt;. He said use testing; prototypes; setting boundaries; and worst case scenarios. Nathaniel then polled the audience and I said use pair programming to combat fear. Others said be more afraid of something else however that would probably lead to layer upon layer of neuroses. One individual said that he prays. Nathaniel also referenced a few books that desribe how to deal with fear: "The War of Art", "Art and Fear", and "The Road Less Traveled". The jist of the this part was that big fuzzy problems are harder to deal with than smaller fuzzy problems. So work with smaller fuzzy problems.&lt;br /&gt;&lt;br /&gt;His second suggestion which he described as the "ultimate antidote to fear" is &lt;span style="font-weight: bold;"&gt;Love&lt;/span&gt;! Surround yourself with people who love you unconditionally and support your decisions. Its better to make decisions based on the passion that you have for your craft. Pour yourself into the things that you are working on. Be motivated by your passion e.g. I love to solve problems!&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-4030129557494897377?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/4030129557494897377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=4030129557494897377&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4030129557494897377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4030129557494897377'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/11/rubyconf-2008-day-2-fear-of-programming.html' title='RubyConf 2008 Day 2 - Fear of Programming'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-672416311927482044</id><published>2008-11-07T10:16:00.003-05:00</published><updated>2008-11-07T10:19:58.937-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conferences'/><category scheme='http://www.blogger.com/atom/ns#' term='Random Stuff'/><title type='text'>Taking your laptop</title><content type='html'>I gave The Man a lecture on why he shouldn't bring his laptop to the talks at RubyConf. I said "I don't do it because it distracts me during the talks; it acts as an anchor because if I do not like the talk its harder to leave the room (power cord, LAN cable, etc...); and well its just plain rude!"&lt;br /&gt;Turns out I am a hypocrite. Here I am blogging while I wait for the next talk.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-672416311927482044?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/672416311927482044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=672416311927482044&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/672416311927482044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/672416311927482044'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/11/taking-your-laptop.html' title='Taking your laptop'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-2324374297975470692</id><published>2008-11-07T09:49:00.003-05:00</published><updated>2008-11-07T10:11:58.271-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Conferences'/><title type='text'>RubyConf 2008 Day 2 - Patterns in Distributed Processing</title><content type='html'>Distributed computing and threading have been my favorite topics to learn about over the past year. In general this stuff is just way over my head and I feel like I learn something new every time I attend a talk on these subjects. This conference is filled with all sorts of interesting presentations including one where Mike Perham is discussing a library he created for clustered systems. He gave us a little background on himself and I was impressed to find out that he is responsible for shard support in ActiveRecord.&lt;br /&gt;He seems like a brilliant fellow and is demonstrating some advanced threading concepts, only using distributed machines using DRb. This is an entirely different approach from a NeverBlock, which used Fibers, i.e. continuations, to allow green threads to "work" faster.  I believe that based on the code I have seen today, Mike's approach is probably easier to understand and use.&lt;br /&gt;He is also describing "Paxos" and encouraged us to take a look at Google's white paper "Paxos Made Live". Paxos is slow because there is lots of network chatter and Mike decided to head in a less formal direction using a designated "leader" and follower workers.  Quote from his blog:&lt;br /&gt;&lt;ul&gt;&lt;blockquote&gt;&lt;li&gt;&lt;code&gt;TokenWorker&lt;/code&gt; ensures that one process from a group of redundant processes will be elected to perform processing for the next N seconds.&lt;/li&gt;&lt;li&gt;&lt;code&gt;StaticQueueWorker&lt;/code&gt; distributes a predefined set of work to a dynamic set of processes every N seconds.&lt;/li&gt;&lt;/blockquote&gt;&lt;/ul&gt; When Brian Geotz discussed multi-threading in Java he seemed really excited about it. This talk would have been better if Mike were a little more energized.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-2324374297975470692?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/2324374297975470692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=2324374297975470692&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2324374297975470692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2324374297975470692'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/11/rubyconf-2008-day-2-patterns-in.html' title='RubyConf 2008 Day 2 - Patterns in Distributed Processing'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-2156422631753432912</id><published>2008-11-05T15:43:00.000-05:00</published><updated>2008-12-21T22:15:18.998-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><category scheme='http://www.blogger.com/atom/ns#' term='ranting'/><title type='text'>The XP Coaching Paradox</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;span&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:100%;"&gt;As a team new to XP, I want for you to coach my team, so that we can deliver valuable features to our customers.   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Great, now that I know what our goal is, lets get down to business! However its just not that simple because people are afraid to embrace change for a myriad of reasons. The mistake I regularly make is reacting when I loose my patience or when someone says something that runs contrary to pure XP.  The dogmatist in me converts anger into logic and I refuse to stop arguing until I am able to make them look foolish.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.geocities.com/Area51/1075/images/emperor.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 170px; height: 185px;" src="http://www.geocities.com/Area51/1075/images/emperor.jpg" alt="" border="0" /&gt;&lt;/a&gt;Although Emperor Palpatine would encourage you to "release your anger" that behavior is simply unbecoming of a Jedi and is just not the right thing to do! It hurts peoples feelings and brings down the teams morale.&lt;br /&gt;Today was a great step forward in my life as a professional coach. I did not allow my emotions to get in the way of what I was doing. I listened to what my customers where saying without prejudice and reserved my comments when I heard someone say that testing was a waste of time. &lt;br /&gt;As a coach you have to let people make mistakes. Its all part of the game.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-2156422631753432912?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/2156422631753432912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=2156422631753432912&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2156422631753432912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2156422631753432912'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/11/xp-coaching-paradox.html' title='The XP Coaching Paradox'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-1460366500997152783</id><published>2008-11-05T15:13:00.002-05:00</published><updated>2009-03-03T19:07:53.528-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Characterization Testing</title><content type='html'>&lt;span style="font-weight: bold;font-size:130%;" &gt;Test that code &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Michael Feathers introduced the concept of using &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=198296"&gt;characterization testing&lt;/a&gt; in order to provide code coverage for untested legacy code. This technique is essential for anyone working with existing production code because it ensures that the external behavior of the system under modification is not effected as it undergoes internal changes.  The problem with this technique is that it turns people off to testing despite the fact that this technique often helps to identify design problems in the system under test.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Unit Testing Is Stupid&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On one occasion I was paring with a developer who was a staunch supporter of "test automation" but did not believe in unit level tests. His organization however mandated that every developer write unit tests, so he came to my team for help with writing tests for the system. I started by writing the first test....&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;def test_do_it&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;assert_equal "no clue what you do", @sut.do_it&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;... he said, "What are you testing? That really doesn't make any sense". I responded by saying, "I don't know what this class is supposed to do, but I can find out what it actually does by executing it". He scowled furiously at me but I executed it and low and behold there was an error! In disbelief he exclaimed, "&lt;span style="font-style: italic;"&gt;what nil object?&lt;/span&gt;&lt;span style="font-style: italic;"&gt;!?&lt;/span&gt;"  Yes, we actually found a bug by writing a characterization test! This sparked a conversation among a few team members and it turned out that a misunderstanding of what his class was supposed lead to a bug.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.thewashingtonnote.com/archives/Mission-accomplished.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer; width: 278px; height: 370px;" src="http://www.thewashingtonnote.com/archives/Mission-accomplished.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Well not really. He ran off into his cave again writing code without tests in order to fix this problem. However he never came back to me. When I ran into him again I asked how testing was going and he gave me the same spiel about how unit testing is not important. Really? Even though it lead to discovering a BUG!&lt;br /&gt;On other projects where there is just a ton of legacy code and I have to add or correct the existing behavior, we often spend a few hours just writing characterization tests. When I am pairing with someone relatively new to TDD they hate it. Lets just face it, test-last development is tedious. Shouldn't that be reason enough for people to prefer TDD?&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-1460366500997152783?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/1460366500997152783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=1460366500997152783&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1460366500997152783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1460366500997152783'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/10/characterization-testing.html' title='Characterization Testing'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-3768770752533001148</id><published>2008-11-04T19:55:00.000-05:00</published><updated>2008-11-04T19:56:56.093-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>A place for everything</title><content type='html'>Switiching from project to project is one of the most rewarding things about being a consultant but it is also extremely frustrating. Every few months I found myself asking people, &lt;span style="font-style: italic;"&gt;where may I find X?  &lt;/span&gt;When I would verbalize my frustration, my customers would dismiss it saying that its part of the process of "getting up to speed", however I would prefer to spend my time implementing features. Why must I be burdened with this accidental complexity?&lt;br /&gt;That's one of the things that I love about Rails. What stands out to me immediately is how everyone seems to &lt;span style="font-style: italic;"&gt;know where to find X&lt;/span&gt;.&lt;br /&gt;Rails encouraged me to &lt;a href="http://c2.com/cgi/wiki?CommonReusePrinciple"&gt;organize&lt;/a&gt; my Java web projects in a way that is intuitive to people. The results have been mostly positive; easier to understand file structure; increased diligence in using domain language for naming; common names for related features; easier to understand the relationship between view components and "server-side" code; and reduced complexity of our configuration files. I highly recommend that you go back to basics and start simplifying your code base structure!&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-3768770752533001148?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/3768770752533001148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=3768770752533001148&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3768770752533001148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3768770752533001148'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/08/rails-helped-me-be-more-organized.html' title='A place for everything'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-3125423856069253691</id><published>2008-10-31T18:51:00.003-04:00</published><updated>2008-12-21T22:15:18.999-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><title type='text'>We're special... the antipattern</title><content type='html'>Finally someone has recognized this agile adoption anti-pattern. The agile community has gone from being risk takers who influence and embrace change to [INSERT_EXPLETIVE_HERE]&lt;br /&gt;http://www.ibm.com/developerworks/blogs/page/ambler?entry=adoption_antipattern_we_re_special&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-3125423856069253691?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/3125423856069253691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=3125423856069253691&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3125423856069253691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3125423856069253691'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/10/were-special-antipattern.html' title='We&apos;re special... the antipattern'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-900969912083069064</id><published>2008-10-22T20:51:00.001-04:00</published><updated>2008-10-22T20:52:48.380-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Dependency Injection Sucks</title><content type='html'>It depends. If you write terrible code it does.&lt;br /&gt;&lt;br /&gt;http://googletesting.blogspot.com/2008/10/dependency-injection-myth-reference.html&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-900969912083069064?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/900969912083069064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=900969912083069064&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/900969912083069064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/900969912083069064'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/10/dependency-injection-sucks.html' title='Dependency Injection Sucks'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-1437055423497019207</id><published>2008-10-18T07:26:00.008-04:00</published><updated>2008-11-16T23:16:12.162-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><title type='text'>Calculating Capacity</title><content type='html'>If you have ever seen the film Office Space, you are familiar with the scene where the Bob's are interviewing Peter trying to find out how he contributes at work. In that scene he says, &lt;span style="font-style: italic;"&gt;"I'd probably, say, in a given week, I probably do about fifteen minutes of real, actual work."&lt;/span&gt;&lt;br /&gt;Did you laugh when he said that? I know I did, but it begged the question, how much work do I actually do in a day? If I do not know how long it took me to do something then am I really providing honest estimates?&lt;br /&gt;&lt;br /&gt;Our team uses a simple formula to determine how much work we could do in a week:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;one_week_capacity = (total_number_of_developers/2) * total_days * hours_per_day&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;total_number_of_developers/2&lt;/span&gt;? We practice pair programming. If your team doesn't then there is not one there to prevent you from slacking. You really are 50% productive.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;total_days&lt;/span&gt;? Normally you have about 5 days in a week but you should not assume you will have 100% of your time available for working on production code or that your estimates where accurate. Calculate capacity using 70% of your work week (3.5 days instead of 5), that will allow plenty of room for incorrect estimates.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;hours_per_day&lt;/span&gt;? Paring is usually maxes out at about 6 hours a day. The other 2 hours should be allotted to take breaks, respond to e-mails, attend meetings, etc...&lt;br /&gt;&lt;br /&gt;Compare your estimates to your actual completed work every iteration. Once you are able to determine how much work you &lt;span style="font-style: italic;"&gt;are&lt;/span&gt; doing, what you &lt;span style="font-style: italic;"&gt;can&lt;/span&gt; do is easier to calculate. This computation has been pretty accurate for me over the past few years. Give this a try and let me know how it works for you!&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-1437055423497019207?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/1437055423497019207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=1437055423497019207&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1437055423497019207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1437055423497019207'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/10/calculating-capacity.html' title='Calculating Capacity'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-6996404635607893920</id><published>2008-10-16T21:33:00.003-04:00</published><updated>2009-07-17T00:27:32.866-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>Timeout::TimeoutError</title><content type='html'>This was annoying&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;  def test_timeout_error&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    Timeout.expects(:timeout).with(any_parameters).raises(&lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;Timeout::Error.new&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    assert_raise(Timeout::Error) {  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      some_crazy_code()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  end&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;  1) Error:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;test_timeout_error(TimerTest):&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;ArgumentError: wrong number of arguments (0 for 1)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here is the fix!&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;def test_timeout_error&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     Timeout.expects(:timeout).with(any_parameters).raises(&lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;Timeout::Error&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     assert_raise(Timeout::Error) {  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       some_crazy_code()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);font-size:180%;" &gt;&lt;span style="font-weight: bold;"&gt;UPDATE: WARNING WARNING WARNING &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Do not use Timeout::timeout in Ruby 1.8! IT DOES NOT WORK RIGHT!&lt;br /&gt;http://blog.headius.com/2008/02/rubys-threadraise-threadkill-timeoutrb.html&lt;br /&gt;http://ph7spot.com/articles/system_timer&lt;br /&gt;http://www.mikeperham.com/2009/03/15/socket-timeouts-in-ruby/&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-6996404635607893920?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/6996404635607893920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=6996404635607893920&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6996404635607893920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6996404635607893920'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/10/timeouttimeouterror.html' title='Timeout::TimeoutError'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-4725853976540325157</id><published>2008-10-15T23:49:00.002-04:00</published><updated>2008-10-15T23:51:53.038-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Random Stuff'/><title type='text'>Sorry folks!</title><content type='html'>I have canceled my VPS and am in the process of transferring all of my hosting to Google applications. I will miss you Rimuhosting however one day I will come around to slicehost.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-4725853976540325157?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/4725853976540325157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=4725853976540325157&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4725853976540325157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4725853976540325157'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/10/sorry-folks.html' title='Sorry folks!'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-6366852646687240378</id><published>2008-10-06T21:03:00.002-04:00</published><updated>2008-10-06T21:10:15.708-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Java is not Object Oriented.</title><content type='html'>Dave Thomas has made some interesting statements about Java being a class-oriented programming programming language but here are a few interested blog posts about it being "Library-Oriented":&lt;br /&gt;Neal Ford on http://memeagora.blogspot.com/2008/10/library-oriented-programming.html&lt;br /&gt;Eric's blog http://www.lispcast.com/drupal/node/55http://www.lispcast.com/drupal/node/55&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-6366852646687240378?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/6366852646687240378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=6366852646687240378&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6366852646687240378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6366852646687240378'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/10/java-is-not-object-oriented.html' title='Java is not Object Oriented.'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-1545580638652146892</id><published>2008-10-04T22:12:00.001-04:00</published><updated>2008-10-04T22:14:21.893-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Dwellmen on GWT!!!</title><content type='html'>My colleague Daniel Wellman has written an introductory article on &lt;a href="http://blog.danielwellman.com/2008/10/intro-to-gwt-article-in-october-2008-better-software-magazine.html"&gt;GWT&lt;/a&gt;. Enjoy!&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-1545580638652146892?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/1545580638652146892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=1545580638652146892&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1545580638652146892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1545580638652146892'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/10/dwellmen-on-gwt.html' title='Dwellmen on GWT!!!'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-4000698855545672705</id><published>2008-09-28T22:25:00.002-04:00</published><updated>2008-12-21T22:16:02.103-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Internal &amp; External DSLs in Java</title><content type='html'>I attended Venkat's talks at NFJS and I was really excited about what Groovy brings to the table for helping you be a more productive Java programmer. He started a series for DSLs in Java and I found &lt;a href="http://www.javaworld.com/javaworld/jw-08-2008/jw-08-dsls-in-java-3.html?page=1"&gt;this article&lt;/a&gt; to be very interesting.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-4000698855545672705?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/4000698855545672705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=4000698855545672705&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4000698855545672705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4000698855545672705'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/09/internal-external-dsls-in-java.html' title='Internal &amp; External DSLs in Java'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-5348889682408288711</id><published>2008-09-27T20:38:00.000-04:00</published><updated>2008-09-27T20:39:42.057-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>joel on ruby</title><content type='html'>&lt;embed src="http://blip.tv/play/Ace3M4a8BA" type="application/x-shockwave-flash" width="320" height="270" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-5348889682408288711?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/5348889682408288711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=5348889682408288711&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5348889682408288711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5348889682408288711'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/09/joel-on-ruby.html' title='joel on ruby'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-2513433038111803644</id><published>2008-09-27T13:58:00.004-04:00</published><updated>2008-12-21T22:15:33.393-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Kent Beck keynote at Rails Conf 2008</title><content type='html'>KB's keynote is a retrospective of his experiences as a leader in the industry.&lt;br /&gt;&lt;embed src="http://blip.tv/play/Ace1Roa8BA" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="270" width="320"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-2513433038111803644?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/2513433038111803644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=2513433038111803644&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2513433038111803644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2513433038111803644'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/09/kent-beck-keynote-at-rails-conf-2008.html' title='Kent Beck keynote at Rails Conf 2008'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-824912270463028930</id><published>2008-09-23T23:08:00.004-04:00</published><updated>2008-09-23T23:11:59.216-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ranting'/><category scheme='http://www.blogger.com/atom/ns#' term='Random Stuff'/><title type='text'>I don't like reading</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://wondermark.com/comics/445.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 675px; height: 275px;" src="http://wondermark.com/comics/445.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-824912270463028930?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/824912270463028930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=824912270463028930&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/824912270463028930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/824912270463028930'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/09/i-dont-like-reading.html' title='I don&apos;t like reading'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-6222952089632639423</id><published>2008-09-22T22:04:00.000-04:00</published><updated>2008-09-22T23:42:11.723-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Beck on Test Driven Design</title><content type='html'>&lt;a href="http://www.threeriversinstitute.org/AbstractVsConcreteParameters.html"&gt;http://www.threeriversinstitute.org/AbstractVsConcreteParameters.html&lt;/a&gt;&lt;br /&gt;This is an interesting blog post. After reading it, I did asked myself, &lt;span style="font-style: italic;"&gt;which of these approaches leads to a better design&lt;/span&gt;?&lt;br /&gt;Take the example that Beck mentions on the JUnit mailing list, he suggests to "objectify" the integers into a SocketConnection:&lt;br /&gt;&lt;small style="font-family: Helvetica,Arial,sans-serif;"&gt;class Client {&lt;/small&gt;  &lt;small style="font-family: Helvetica,Arial,sans-serif;"&gt;    Client(int address, int port) {&lt;/small&gt;  &lt;small style="font-family: Helvetica,Arial,sans-serif;"&gt;       this(new SocketConnection(address, port));&lt;/small&gt;  &lt;small style="font-family: Helvetica,Arial,sans-serif;"&gt;    }&lt;/small&gt;  &lt;small style="font-family: Helvetica,Arial,sans-serif;"&gt;}&lt;/small&gt;&lt;br /&gt;He then goes on to say that it will be easy to inject an impostor and then you will have more control over the interaction between a socket connection and the client. The problem however is the "cost of modifying the client" because of the lack of flexibility one has when working with a language like Java.&lt;br /&gt;This is not a problem when working with a dynamically typed language like Groovy or Ruby because clients are free to open classes, which makes it easier to remove dependencies. This eliminates the need to make any changes to the client code in order to make it more "testable". This leads me to the conclusion that "good design" changes depending on the language you are using. It seems to me that the more flexibility you have the less it matters how concrete things are in the system... NOT!&lt;br /&gt;Using a flexible language does not excuse you from authoring tightly coupled code. This is something I often observe in CRUD applications because they are generally not designed using a tell don't ask, demeter abiding, publish-subscribe style. If you are lucky the team may use life-cycle hooks like before_save or @PrePersist but chances are your controllers are acting as mediators instead of view components.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-6222952089632639423?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/6222952089632639423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=6222952089632639423&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6222952089632639423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/6222952089632639423'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/09/beck-on-test-driven-design.html' title='Beck on Test Driven Design'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-3372351132078179208</id><published>2008-09-10T23:27:00.002-04:00</published><updated>2008-09-10T23:29:26.038-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Conferences'/><title type='text'>RubyConf 2008</title><content type='html'>I am going back to &lt;a href="http://www.rubyconf.org/"&gt;MCO... MCO... MCO...&lt;/a&gt;&lt;br /&gt;... Did I mention I am back working on RoR? :-)&lt;br /&gt;&lt;br /&gt;I really should twitter...&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-3372351132078179208?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/3372351132078179208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=3372351132078179208&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3372351132078179208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3372351132078179208'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/09/rubyconf-2008.html' title='RubyConf 2008'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-2482172384278642621</id><published>2008-09-10T23:14:00.004-04:00</published><updated>2008-12-21T22:15:33.394-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='ranting'/><title type='text'>Am I an idiot?</title><content type='html'>The thing about the internet is that your comments are immortalized.&lt;br /&gt;&lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=36509#184443"&gt;http://www.theserverside.com/news/thread.tss?thread_id=36509#184443&lt;/a&gt;&lt;br /&gt;I have come a long way from BUFD...&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-2482172384278642621?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/2482172384278642621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=2482172384278642621&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2482172384278642621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/2482172384278642621'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/09/am-i-am-idiot.html' title='Am I an idiot?'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-3769987647717993028</id><published>2008-09-06T15:53:00.004-04:00</published><updated>2008-09-06T16:52:07.353-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>XP without TDD?</title><content type='html'>I've been reading a lot of articles and presentations about the state of "agile" adoption. One that caught my attention was &lt;a href="http://www.threeriversinstitute.org/JustShip.html"&gt;"Just Ship, Baby"&lt;/a&gt;. In it Kent Beck writes:&lt;br /&gt;&lt;blockquote&gt;    &lt;span style="font-style: italic;"&gt;I had an idea for another little tool yesterday. I wrote it without any tests, just to remind myself that I could still program without a net if I had to. I really didn’t like the feeling of not having any tests, especially when the algorithm got hairy. I’m not sure my code works in all cases. But you know what? I shipped. Turns out it isn’t that cool of an idea, and I’ll drop it. Total cost for that answer—3 hours.&lt;/span&gt;&lt;/blockquote&gt;What no TDD? At first, I was appalled but after reflecting on it, it seemed all he did was spike a solution in three hours, which I believe that is a perfectly healthy agile practice. However, this article like many other presentations is a sign that the "agile" community is undergoing a transformation.&lt;br /&gt;No less than ever are we willing to dive in head first to make an impact. I once thought that we were a small band of engineers trying to save ourselves from the waterfall only to find that in the end we are producing waterwheels. How did this happen?&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-3769987647717993028?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/3769987647717993028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=3769987647717993028&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3769987647717993028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3769987647717993028'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/09/xp-without-tdd.html' title='XP without TDD?'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-1955216245707646693</id><published>2008-08-13T20:21:00.003-04:00</published><updated>2008-08-13T20:38:47.295-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='Conferences'/><title type='text'>NFJS 2008 - Princeton NJ Day 3</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Structuring concurrent applications in JDK 5.0 (Brian Goetz)&lt;/span&gt;&lt;br /&gt;This was an awesome talk. I don't know about you but I want to write multithreaded applications now!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Groovy, The Red Pill: Metaprogramming, the Groovy Way to Blow a Buttoned-Down Java Developer's Mind (Scott Davis)&lt;/span&gt;&lt;br /&gt;This session was great because Scott is an engaging speaker. He tried new things at the request of the audience. Fly by the seat of your pants. Lots of fun.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Java Persistence: Approaching the Silver Bullet (Mark Richards)&lt;/span&gt;&lt;br /&gt;This was pretty much an overview of JPA and the limitations, which if you are familiar with Hibernate, you already know. Mark is a great speaker and this was an extremely interactive session, he used code samples and has just a ton of knowledge and experience around different ORM solutions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;EXPERT PANEL DISCUSSION&lt;/span&gt;&lt;br /&gt;I wish we would have had more "audience" questions. This was mostly a talking heads session.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Promoted to Technical Lead. Now what do I do? (Mark Johnson)&lt;/span&gt;&lt;br /&gt;Last talk of the Sunday. I was ready to go home but I wanted to sit through this talk. I was hoping to learn a few soft techniques here to be a better tech lead. I would have liked to get a little more role play to try and tease out some real life scenarios.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-1955216245707646693?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/1955216245707646693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=1955216245707646693&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1955216245707646693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1955216245707646693'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/08/nfjs-2008-princeton-nj-day-3.html' title='NFJS 2008 - Princeton NJ Day 3'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-1879742935837083532</id><published>2008-08-11T20:52:00.002-04:00</published><updated>2008-08-11T20:54:57.245-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Mock Objects Not States</title><content type='html'>The dynamic duo back again... &lt;a href="http://www.infoq.com/presentations/Mock-Objects-Nat-Pryce-Steve-Freeman"&gt;http://www.infoq.com/presentations/Mock-Objects-Nat-Pryce-Steve-Freeman&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A little taste:&lt;br /&gt;&lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;Smell #1:&lt;/strong&gt; the test exposes the internal implementation  details of the object tested. It's clear that object encapsulation is  broken.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Smell #2:&lt;/strong&gt; passing too much information to the object tested with constructors having too many parameters. The object tested has too many dependencies, and it may be time to break it up in several smaller objects.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Smell #3:&lt;/strong&gt; mock everything. One wants to mock dependencies  and peers, but not value objects.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Smell #4:&lt;/strong&gt; the tests just replicate production code. Code  should not be replicated.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Smell #5:&lt;/strong&gt; one needs to mock an object he cannot replace.  External objects can be used, but cannot be mocked.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Smell #6: &lt;/strong&gt;one needs to mock a concrete class. The tests are meant to verify relationships between objects, not to test a specific instance of an object.&lt;/p&gt; &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-1879742935837083532?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/1879742935837083532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=1879742935837083532&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1879742935837083532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1879742935837083532'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/08/mock-objects-not-states.html' title='Mock Objects Not States'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-3029721545500973056</id><published>2008-08-11T20:22:00.003-04:00</published><updated>2008-08-11T20:45:34.318-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conferences'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>NFJS 2008 - Princeton NJ Day 2</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Agile Test Driven Development With Groovy (Jeff Brown)&lt;/span&gt;&lt;br /&gt;I confess that I did not really like Groovy before coming to this conference. I like Ruby's syntax better and Groovy reminded me too much of JavaScript. However this talk made me once again appreciate dynamic languages and how they are easier to test with than compiler checked statically typed languages.&lt;br /&gt;&lt;br /&gt;Another interesting thing about this talk was learning how to use Groovy to test my Java code. Pretty cool.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Caring about your Code Quality (Venkat Subramaniam)&lt;/span&gt;&lt;br /&gt;This talk was pretty much an affirmation for me. If you write crap code. You will get crap code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Java Memory Model (Brian Goetz)&lt;/span&gt;&lt;br /&gt;HOLY COW! I am the worst multi-threaded Java programmer ever. This is an awesome talk and  you must attend it!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Software Development Risk Management (Mark Johnson)&lt;br /&gt;&lt;/span&gt;&lt;span&gt;I was hoping this would have been more hands on.  This is not a technical talk.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-3029721545500973056?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/3029721545500973056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=3029721545500973056&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3029721545500973056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/3029721545500973056'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/08/nfjs-2008-princeton-nj-day-2.html' title='NFJS 2008 - Princeton NJ Day 2'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-4991705606022121626</id><published>2008-08-08T23:29:00.005-04:00</published><updated>2008-08-11T20:46:07.236-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Conferences'/><title type='text'>NFJS 2008 - Princeton NJ Day 1</title><content type='html'>Just wrapped up my first day at NFJS in Princeton. I attended a few talks, which I liked for the most part.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Give it a REST (Brian Sletten) &lt;/span&gt;&lt;br /&gt;I resisted REST for a long time but Jason and &lt;a href="http://blog.danielwellman.com/"&gt;Dan&lt;/a&gt; got me to embrace the concepts. This talk helped me put a nail in my SOAP/WSDL coffin. If you are not familiar with REST I recommend attending this talk.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Evolutionary SOA (Neil Ford)&lt;/span&gt;&lt;br /&gt;Its clear that Jim Webber and Neil dislike using ESB tools. This talk has entertaining slides but I think a combination of Neil seeming tired and a low energy audience made for less interesting experience.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Know your Java? (Venkat Subramaniam)&lt;/span&gt;&lt;br /&gt;This was a lot of fun. Venkat is a really engaging speaker and was generous enough to give Jason and I books! Thanks Venkat!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Keynote (Neil Ford)&lt;/span&gt;&lt;br /&gt;This talk was given by the Neil we know and love. He demonstrated how the teachings of philosophers like Galileo and Plato apply to today's software development projects. Lots of the content was an introduction to agile software development but given the audience, I think that it was appropriate to elaborate on it.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-4991705606022121626?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/4991705606022121626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=4991705606022121626&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4991705606022121626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/4991705606022121626'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/08/nfjs-2008-princeton-nj-day-1.html' title='NFJS 2008 - Princeton NJ Day 1'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-7438979039624726289</id><published>2008-08-06T22:06:00.002-04:00</published><updated>2008-08-11T20:22:01.990-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Another TDD Book?</title><content type='html'>&lt;a href="http://www.m3p.co.uk/blog"&gt;Steve Freeman&lt;/a&gt; and &lt;a href="http://nat.truemesh.com/"&gt;Nat Pryce&lt;/a&gt; are writing what I believe will become the new bible of &lt;a href="http://www.mockobjects.com/2008/07/growing-object-oriented-software-guided.html"&gt;TDD&lt;/a&gt;. It looks like they have been releasing a chapter a week online and I recommend you join them for the ride.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-7438979039624726289?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/7438979039624726289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=7438979039624726289&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/7438979039624726289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/7438979039624726289'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/08/another-tdd-book.html' title='Another TDD Book?'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-5750699952805730192</id><published>2008-08-06T21:55:00.003-04:00</published><updated>2008-08-11T20:21:45.294-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>More GWT Testing</title><content type='html'>Dan is on a roll this month with GWT testing. In this blog post he revisits testing JSON parsing using JavaScript overlay types. Enjoy :)&lt;br /&gt;&lt;a href="http://blog.danielwellman.com/2008/08/testing-json-parsing-using-javascript-overlay-types-in-gwt-15.html"&gt;http://blog.danielwellman.com/2008/08/testing-json-parsing-using-javascript-overlay-types-in-gwt-15.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-5750699952805730192?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/5750699952805730192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=5750699952805730192&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5750699952805730192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5750699952805730192'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/08/more-gwt-testing.html' title='More GWT Testing'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-5091879378868496302</id><published>2008-07-28T19:13:00.003-04:00</published><updated>2008-07-28T19:22:46.489-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>solipse (Eclipse on Solaris)</title><content type='html'>Congratulations to &lt;a href="http://timezra.blogspot.com/"&gt;Tim Myer&lt;/a&gt; and &lt;a href="http://www.bluekorn.com/roller/"&gt;Hugo Garcia&lt;/a&gt; for their valiant efforts getting &lt;a href="http://timezra.blogspot.com/2008/06/solipse-for-building-eclipse-on-solaris.html"&gt;Eclipse running on Solaris&lt;/a&gt; codename solipse!&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-5091879378868496302?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/5091879378868496302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=5091879378868496302&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5091879378868496302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5091879378868496302'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/07/solipse-eclipse-on-solaris.html' title='solipse (Eclipse on Solaris)'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-8586332077536086293</id><published>2008-07-27T23:03:00.005-04:00</published><updated>2008-07-27T23:07:34.369-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>GWT Testing Blog Posts</title><content type='html'>One of the smartest and likable fellows I know, &lt;a href="http://blog.danielwellman.com/"&gt;Daniel Wellman&lt;/a&gt;, is being publish for his work with GWT(Google Web Toolkit). It all started with this blog post:&lt;br /&gt;&lt;a href="http://blog.danielwellman.com/2008/06/strategies-for-testing-gwt-widgets-and-view-components.html"&gt;http://blog.danielwellman.com/2008/06/strategies-for-testing-gwt-widgets-and-view-components.html&lt;/a&gt;&lt;br /&gt;Enjoy!!!&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-8586332077536086293?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/8586332077536086293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=8586332077536086293&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/8586332077536086293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/8586332077536086293'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/07/gwt-testing-blog-posts.html' title='GWT Testing Blog Posts'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-1913747925791663717</id><published>2008-07-27T17:01:00.005-04:00</published><updated>2008-07-27T17:40:35.912-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Random Stuff'/><title type='text'>I've switched</title><content type='html'>I took my family on a shopping spree this weekend. Our last stop was at Best Buy where my wife gave me a choice between:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.samsung.com/us/system/consumer/product/2008/03/10/ln52a550p3fxza/dimage.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: left; cursor: pointer; width: 200px;" src="http://www.samsung.com/us/system/consumer/product/2008/03/10/ln52a550p3fxza/dimage.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.bestbuy.com/BestBuy_US/images/products/8764/8764429_sa.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 323px; height: 195px;" src="http://images.bestbuy.com/BestBuy_US/images/products/8764/8764429_sa.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;and&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Guess what I picked?!?&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-1913747925791663717?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/1913747925791663717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=1913747925791663717&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1913747925791663717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/1913747925791663717'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/07/ive-switched.html' title='I&apos;ve switched'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-5410775855367621240</id><published>2008-07-25T14:35:00.002-04:00</published><updated>2009-01-07T00:11:30.884-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>How Ruby made me into a better Java developer</title><content type='html'>&lt;strong&gt;&lt;/strong&gt;Like most programmers, I have had the pleasure of being exposed to multiple programming languages and frameworks. In some way all of these experiences have influenced the way I think about testing and challenging my beliefs about "good" design. After reading the Pragmatic Programmer for the second time, it occurred to me that this is happening because I...&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;Invest Regularly in Your Knowledge Portfolio&lt;/span&gt;&lt;br /&gt;Make learning a habit. [Thomas and Hunt]&lt;/blockquote&gt;I started my career as an ASP classic VB 6 developer. Learning Java taught me that I should really think more like an OO programmer. It also exposed me to design patterns and forced me to realize that the code I was produced was actually a big mess. Java changed the way I was doing things. I started to use patterns like; proxies; late binding; interfaces; and factories. This greatly improved my ability to test production code and helped me reduce the outrages scriptlet code found in the web pages I was working on.&lt;br /&gt;Then came C#. The transition from Java was not so difficult but I did learn more about delegates, data binding, event driven programming, as well as presentation patterns that were not MVC. It did not seem to make quite as much of an impact on the way I wrote Java apps. I did however find myself asking questions about how useful EJBs where and whether or not a DTO made any sense! I also longed for a "&lt;span style="font-family:courier new;"&gt;using(closableResource)&lt;/span&gt;" so that I would not have to write so many try/catch statements. MbUnit also really impacted the way I thought about testing and how refactoring test code was just as important as production code.&lt;br /&gt;Then there are more complex things like SOA based applications using SOAP/WSDL and how it made me think about designing reusable components using better interfaces. I also learned a lot about how really useful adapters, bridges, and facades mitigate integration nightmares.&lt;br /&gt;Now I find myself reflecting on how Rails influenced the way I approach Java Web applications and how it changed the way I think! So much so that the next few posts are going to be about:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Component/Integration Testing&lt;/li&gt;&lt;li&gt;Unit/Micro Testing&lt;/li&gt;&lt;li&gt;Test Driving UI&lt;/li&gt;&lt;li&gt;Using conventions in my configuration&lt;/li&gt;&lt;li&gt;Simplifying the way I use Hibernate&lt;/li&gt;&lt;li&gt;Using composite views with partials&lt;/li&gt;&lt;li&gt;Meta programming and annotations&lt;/li&gt;&lt;li&gt;Action mappings&lt;/li&gt;&lt;li&gt;Simplifying Models&lt;/li&gt;&lt;/ul&gt;I hope that you find the topics interesting and please do not be put off because I am writing about RoR. I am not one of those people who now hates Java and believes that Ruby is better, I am just a believer in learning and growing.&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-5410775855367621240?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/5410775855367621240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=5410775855367621240&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5410775855367621240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5410775855367621240'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/07/how-ruby-made-me-into-better-java.html' title='How Ruby made me into a better Java developer'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-646976664807999425</id><published>2008-07-15T00:41:00.003-04:00</published><updated>2008-07-25T09:35:08.699-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>HELP! My project has no tests!</title><content type='html'>There are a few ways that you can introduce tests if your team is in this situation.&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Thorough Manual Verification!&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;    Hire, outsource, or distribute the work of manual functional testers. Make them run a full suite of regression tests with every build.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Automate It… ALL OF IT!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Convert your current manual functional or exploratory tests scripts to automated “end-to-end” tests.&lt;/li&gt;&lt;li&gt;    Write "end-to-end" system integration tests that "prove" everything really works. For example, write some tests that somehow verify the jobs extract data from a mainframe and then import them to your RDBMS.&lt;/li&gt;&lt;li&gt;    Install code coverage tools and run reports. Get all of the developers to write tests until they see 80-100% coverage!&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;The Pragmatic Approach…&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Slowly add automated tests which, run with every build of your application.&lt;/li&gt;&lt;li&gt;    Write focused automated tests to help identify the root cause of bugs that are currently in production.&lt;/li&gt;&lt;li&gt;    Identify the areas of your application that “break” the most and prioritize them testing/fixing them as features.&lt;/li&gt;&lt;li&gt;    Write focused automated characterization tests for the code/features you are going to change.&lt;/li&gt;&lt;li&gt;    Write focused automated tests only for the code/features you are working on.&lt;/li&gt;&lt;li&gt;    Use manual exploratory testing to validate that the features were implemented correctly.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Results&lt;/span&gt;&lt;br /&gt;The problem with the thorough manual approach is that it is expensive to coordinate and execute. In addition to that, development slows down so revenue generating features don’t make it production fast enough to help pay the salaries of all of those testers.&lt;br /&gt;&lt;br /&gt;Then there is the thorough automated approach. Like its manual counterpart, it is a tedious exercise, which often discourages developers from writing “good” tests that actually provide any value to the product owners. It is also an extremely difficult feat to accomplish because these systems were not built to be testable in the first place. The end result is often a collection of “tests” that do not really verifying if the system is doing the right thing in order to increase statistics.&lt;br /&gt;&lt;br /&gt;There is little return on investment for features that are either; stable and running in production with no reported bugs; or not used enough for anyone to notice if any bugs exist! That’s why I recommend the pragmatic approach. Keep your tests focused and small, don’t feel obligated to write automate tests for every single part of your application; some things just don’t break once you’ve performed exploratory tests.&lt;br /&gt;&lt;br /&gt;Not only does it allow you to start providing coverage for your application, but it also immediately improves your ability to provide working features. This will not only increase your teams’ confidence and self worth, but you’ll be making money for your product owners in the process!&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-646976664807999425?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/646976664807999425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=646976664807999425&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/646976664807999425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/646976664807999425'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/07/help-my-project-has-no-tests.html' title='HELP! My project has no tests!'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7412807111368460595.post-5106643628856912005</id><published>2008-07-12T15:47:00.006-04:00</published><updated>2008-07-28T08:58:45.410-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='ranting'/><title type='text'>I'm angry</title><content type='html'>I recently received some feedback from a few of my esteemed coworkers. They said that my posts are interesting because they seem to be filled with quite a bit of anger. They also gave me some practical advice like, “&lt;span style="font-style: italic;"&gt;run your posts through grammar checkers so that you don’t sound like a tool&lt;/span&gt;”.&lt;br /&gt;&lt;br /&gt;After reflecting on the former statement, I realized that I &lt;span style="font-style: italic;"&gt;am &lt;/span&gt;filled with anger! Like most of my fellow XPers, I’ve had to endure years of suffering under a regime of SDLC monkeys! Now this pain is manifesting itself as wrath and I have vowed to rid the world of these wankers one by one.&lt;br /&gt;&lt;br /&gt;From this day forward, I bring you Angry XP!&lt;div class="blogger-post-footer"&gt;[Disclaimer: The opinions expressed herein are those of the author and not of his employer.]&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7412807111368460595-5106643628856912005?l=blog.arielvalentin.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.arielvalentin.com/feeds/5106643628856912005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7412807111368460595&amp;postID=5106643628856912005&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5106643628856912005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7412807111368460595/posts/default/5106643628856912005'/><link rel='alternate' type='text/html' href='http://blog.arielvalentin.com/2008/07/im-angry.html' title='I&apos;m angry'/><author><name>Ariel Valentin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_BUuazU3o2f8/SmfBLl04FSI/AAAAAAAAAD8/YFg0utizWXA/S220/Picture+1.png'/></author><thr:total>1</thr:total></entry></feed>
