<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C0QBQnYyeyp7ImA9WhRRFEk.&quot;"><id>tag:blogger.com,1999:blog-16908486</id><updated>2011-11-27T16:49:13.893-08:00</updated><category term="ruby" /><category term="simplicity" /><category term="implementation patterns" /><category term="user experience" /><category term="visualization" /><category term="3EZ" /><category term="kent beck" /><category term="definitions" /><category term="agile_diary" /><category term="pair_programming" /><category term="rails ruby_way" /><category term="time rails activesupport" /><category term="empowerment" /><category term="agile" /><category term="martial_arts" /><category term="conveying_new_ideas" /><category term="software" /><category term="rails" /><category term="shortcuts" /><category term="tdd bdd" /><category term="daycoder" /><category term="microsoft" /><category term="tdd" /><category term="ward" /><category term="revolution" /><category term="bdd" /><category term="david vs goliath" /><category term="agile agile_diary" /><category term="presentations lessig hardt takahashi" /><title>Putting the fun into Funkworks</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://funkworks.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>87</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/PuttingTheFunIntoFunkworks" /><feedburner:info uri="puttingthefunintofunkworks" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CUIHQHY7fSp7ImA9WhRSEEg.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-1207155625795734224</id><published>2011-11-11T11:34:00.001-08:00</published><updated>2011-11-11T15:18:51.805-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-11T15:18:51.805-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><title>ruby-prof</title><content type="html">&lt;div&gt;
When optimizing for performance, one should always run a profiling tool to see exactly where the real bottlenecks are. &amp;nbsp;The results can be surprising. &amp;nbsp;I had written a ruby program to do a data discrepancy report between 2 systems. &amp;nbsp;It was running pretty long (seems extra long since I was developing/tweaking it and had to run the report each time), so I was of the initial impression that after I got it right, I might have to rewrite it in say Java or C++. &amp;nbsp;Fortunately for me, I profiled it first.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The tool was &lt;a href="http://ruby-prof.rubyforge.org/"&gt;ruby-prof&lt;/a&gt;. &amp;nbsp;Ruby-prof runs better on Ruby 1.8.7, which is fine for me in this instance because the target system runs Ruby 1.8.7, but people have been &lt;a href="https://github.com/wycats/ruby-prof"&gt;trying to address the issues&lt;/a&gt;&amp;nbsp;for Ruby 1.9.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
To install the default gem&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;gem install ruby-prof&lt;/span&gt;&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Ruby-prof has many options to run in the your code, but you can just call ruby-prof on your ruby file. &amp;nbsp;I'd recommend the graph_html output (&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;ruby-prof -p graph_html&lt;/span&gt;) as the hyperlinks make it easy to traverse the report.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-xTNBYcX-oWM/Tr2ccQYPOCI/AAAAAAAAAGw/MkQpxtBKiXM/s1600/ruby-prof-graph-html.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-xTNBYcX-oWM/Tr2ccQYPOCI/AAAAAAAAAGw/MkQpxtBKiXM/s1600/ruby-prof-graph-html.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Once you have the report, you can figure out what's taking up a disproportionate amount of time. &amp;nbsp;For my situation it was detect()&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-KWCGVJw6J50/Tr2dJFiVwII/AAAAAAAAAG4/NiNIcarPQQQ/s1600/detect.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-KWCGVJw6J50/Tr2dJFiVwII/AAAAAAAAAG4/NiNIcarPQQQ/s1600/detect.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
It turns out I had 2 large loops that were using detect() in a situation that would be better served with a look up table. &amp;nbsp;Given my development data set was much smaller than the production data set, it performed adequately during development. &amp;nbsp;This was not the case when the data grew that by 1000x. &amp;nbsp; I replaced the detect() calls with look up tables and the run time went from 17 minute to 2.5 minutes. &amp;nbsp;Sweet, no need to convert to another language. &amp;nbsp;Thank goodness for ruby-prof.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-1207155625795734224?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mBKUP4-giqZa3jYJPyaC2mFsyp8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mBKUP4-giqZa3jYJPyaC2mFsyp8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mBKUP4-giqZa3jYJPyaC2mFsyp8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mBKUP4-giqZa3jYJPyaC2mFsyp8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/m7PKIb19FXQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/1207155625795734224/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=1207155625795734224" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/1207155625795734224?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/1207155625795734224?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/m7PKIb19FXQ/ruby-prof.html" title="ruby-prof" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-xTNBYcX-oWM/Tr2ccQYPOCI/AAAAAAAAAGw/MkQpxtBKiXM/s72-c/ruby-prof-graph-html.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2011/11/ruby-prof.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ADQH07fip7ImA9WhRSEE4.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-3773153970929078865</id><published>2011-11-11T11:20:00.001-08:00</published><updated>2011-11-11T11:29:31.306-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-11T11:29:31.306-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="shortcuts" /><title>Sending function keys on OSX</title><content type="html">Just a quick note since it took me a fair amount of googling to find it. &amp;nbsp;If you need to send functions keys to a terminal application, say &lt;a href="http://unixlab.blogspot.com/2009/11/enhancing-terminals-with-byobu-on.html"&gt;byobu&lt;/a&gt;, you need to prepend the command key. &amp;nbsp;On an external keyboard, command - function&amp;lt; whatever&amp;gt;.&amp;nbsp;, on macbook (pro), fn + command + function&amp;lt; whatever&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://int.kateigaho.com/mar04/images/antique-byobu.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="188" src="http://int.kateigaho.com/mar04/images/antique-byobu.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-3773153970929078865?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6mEdMl1Fv1Hxza1m1LXXB4QaF2I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6mEdMl1Fv1Hxza1m1LXXB4QaF2I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6mEdMl1Fv1Hxza1m1LXXB4QaF2I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6mEdMl1Fv1Hxza1m1LXXB4QaF2I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/KMewV7DHYIA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/3773153970929078865/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=3773153970929078865" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/3773153970929078865?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/3773153970929078865?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/KMewV7DHYIA/sending-function-keys-on-osx.html" title="Sending function keys on OSX" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2011/11/sending-function-keys-on-osx.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08HSHo5cCp7ImA9WhRSEE4.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-4214310024887190186</id><published>2011-11-11T08:54:00.001-08:00</published><updated>2011-11-11T10:23:59.428-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-11T10:23:59.428-08:00</app:edited><title>A Git PSA: Git Bisect</title><content type="html">Ever had a time where there were a slew of commits and you don't know which commit caused the build to fail? &amp;nbsp;Finding the bad commit could be approached w/a binary tree traveral sort of approach: &amp;nbsp;go back and find a good commit, pick a commit halfway between that and HEAD, and based on whether the commit breaks the build or not, pick a commit halfway in the appropriate direction, triangulating on the bad commit. &amp;nbsp;If you use git, then you are fortunate enough that git will do this for you via git bisect.&lt;br /&gt;
&lt;br /&gt;
So I spent several hours being a poor man's git bisect before discovering git bisect, and I thought I'd pass the savings to anyone who would listen in this Public Service Announcement.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-Unxxr9Ob92s/Tr1lgpdodOI/AAAAAAAAAGo/p82p36ZqVdE/s1600/the-poor-man-thumb2229955.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Unxxr9Ob92s/Tr1lgpdodOI/AAAAAAAAAGo/p82p36ZqVdE/s1600/the-poor-man-thumb2229955.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
(poor man's image from&amp;nbsp;http://boykembara.com/travel-tips/)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Git bisect, in typical git fashion, has many &lt;a href="http://linux.die.net/man/1/git-bisect"&gt;options&lt;/a&gt;. &amp;nbsp;Being the lazy sort, here's what worked well for me w/a minimum of commands. &amp;nbsp;It depends on having some sort of program you can run to determine whether the commit is good or bad. &amp;nbsp;For us, it's our test suite.&lt;br /&gt;
&lt;br /&gt;
To set up, run this:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;git bisect start HEAD &lt;a commit="" good="" href="http://www.blogger.com/blogger.g?blogID=16908486"&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a commit="" good="" href="http://www.blogger.com/blogger.g?blogID=16908486"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;This sets up the end points of HEAD, where I was when I discovered the problem and I'm going to assume will be a majority of the cases. &amp;nbsp;You can replace this with another start point. The last parameter is some known good point. &amp;nbsp;If you don't have a command that can run to determine good/bad, you can investigate manually and run&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt; git bisect good&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt; or &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;git bisect bad,&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;and keep going until you find the guilty commit. &amp;nbsp;But, if you do have a command, you run this:&lt;/span&gt;&lt;br /&gt;
&lt;a commit="" good="" href="http://www.blogger.com/blogger.g?blogID=16908486"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;git bisect run &lt;your command="" test=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a commit="" good="" href="http://www.blogger.com/blogger.g?blogID=16908486"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;in my case&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;a commit="" good="" href="http://www.blogger.com/blogger.g?blogID=16908486"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;git bisect run rake spec:controllers&lt;/span&gt;&lt;br /&gt;
&lt;a commit="" good="" href="http://www.blogger.com/blogger.g?blogID=16908486"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a commit="" good="" href="http://www.blogger.com/blogger.g?blogID=16908486"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;When it's done, you get a result like this&lt;/span&gt;&lt;br /&gt;
&lt;a commit="" good="" href="http://www.blogger.com/blogger.g?blogID=16908486"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;985 examples, 0 failures, 5 pending&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;ec65d267959dc8e317a4cc535094fd8483b02a14 is the first bad commit&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;bisect run success&lt;/span&gt;&lt;br /&gt;
&lt;a commit="" good="" href="http://www.blogger.com/blogger.g?blogID=16908486"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Now you have the guilty commit. &amp;nbsp;To undo the bisect branch do a&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;a commit="" good="" href="http://www.blogger.com/blogger.g?blogID=16908486"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;git bisect reset&lt;/span&gt;&lt;br /&gt;
&lt;a commit="" good="" href="http://www.blogger.com/blogger.g?blogID=16908486"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Hope to saved someone some time.&lt;/span&gt;&lt;br /&gt;
&lt;a commit="" good="" href="http://www.blogger.com/blogger.g?blogID=16908486"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-4214310024887190186?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zDelcTe-7BBn17PuwUdL3iw8oAM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zDelcTe-7BBn17PuwUdL3iw8oAM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zDelcTe-7BBn17PuwUdL3iw8oAM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zDelcTe-7BBn17PuwUdL3iw8oAM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/MviHqV61UWM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/4214310024887190186/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=4214310024887190186" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/4214310024887190186?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/4214310024887190186?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/MviHqV61UWM/git-psa-git-bisect.html" title="A Git PSA: Git Bisect" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-Unxxr9Ob92s/Tr1lgpdodOI/AAAAAAAAAGo/p82p36ZqVdE/s72-c/the-poor-man-thumb2229955.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2011/11/git-psa-git-bisect.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkACR3Y7fip7ImA9WhdUGEg.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-274702986566076785</id><published>2011-10-03T15:06:00.000-07:00</published><updated>2011-10-05T14:39:26.806-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-05T14:39:26.806-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="microsoft" /><title>A new level of Microsoft goodness!</title><content type="html">So I was installing a Microsoft update and the installer got to the point where the installer detected if any programs needed to be stopped for the installation to continue. &amp;nbsp;It determined that I'd have to shut down Chrome, Safari and Entourage. &amp;nbsp;I expected the last as that's what the update was for, but not the browsers. &amp;nbsp;Consequently I slide the dialog window aside so I could finish reading the article I was reading before the dialog came up. &lt;br /&gt;
&lt;br /&gt;
A little later, the dialog jumped to the middle of my screen and flashed repeatedly. &amp;nbsp; I'd never seen that before. &amp;nbsp; I guess the installer knows better what I should be doing w/my time. &amp;nbsp;Better than my machine rebooting itself w/o my permission like I used to get on windows (and really hated). &amp;nbsp;I just had to laugh at it, and then compose this post&lt;br /&gt;
&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-274702986566076785?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UuVFBkOS77wGCzX3FH5JdHSjX3U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UuVFBkOS77wGCzX3FH5JdHSjX3U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/UuVFBkOS77wGCzX3FH5JdHSjX3U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UuVFBkOS77wGCzX3FH5JdHSjX3U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/7JVcy8xZNBs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/274702986566076785/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=274702986566076785" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/274702986566076785?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/274702986566076785?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/7JVcy8xZNBs/new-level-of-microsoft-goodness.html" title="A new level of Microsoft goodness!" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2011/10/new-level-of-microsoft-goodness.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMASH05fyp7ImA9WhdVF08.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-8497927594088764988</id><published>2011-09-22T13:30:00.000-07:00</published><updated>2011-09-22T13:30:49.327-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-22T13:30:49.327-07:00</app:edited><title>A little bit of Airbrake goodness</title><content type="html">We use &lt;a href="http://airbrakeapp.com/pages/home"&gt;Airbrake&lt;/a&gt; (the service formerly known as Hoptoad) for error collection which is quite useful. &amp;nbsp;I just discovered a little bit of "goodness" that I hadn't seen before. &amp;nbsp;I was duplicating an error on development for an error reported on our production system and I saw this&lt;br /&gt;
&lt;div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-EZrM11dVJBc/TnuaueCCioI/AAAAAAAAAGY/U7lqJoIRilk/s1600/airbrake_goodness.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="204" src="http://3.bp.blogspot.com/-EZrM11dVJBc/TnuaueCCioI/AAAAAAAAAGY/U7lqJoIRilk/s640/airbrake_goodness.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I'm not certain how long that's been there, but it's nice touch to be able to both be able to know an error I'm experiencing has occured in production and having the link the Airbrake (my team can't stop calling it hoptoad, it just falls off the tongue better) right there.&lt;br /&gt;
&lt;br /&gt;
Sweet. &amp;nbsp;Thanks Airbrake.&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-8497927594088764988?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LnYsjY78uwAkyuhtQS9UW152-bQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LnYsjY78uwAkyuhtQS9UW152-bQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LnYsjY78uwAkyuhtQS9UW152-bQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LnYsjY78uwAkyuhtQS9UW152-bQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/O2DZa5VNE-M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/8497927594088764988/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=8497927594088764988" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/8497927594088764988?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/8497927594088764988?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/O2DZa5VNE-M/little-bit-of-airbrake-goodness.html" title="A little bit of Airbrake goodness" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-EZrM11dVJBc/TnuaueCCioI/AAAAAAAAAGY/U7lqJoIRilk/s72-c/airbrake_goodness.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2011/09/little-bit-of-airbrake-goodness.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEECQ387eyp7ImA9WhRSEE4.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-2076123205127094918</id><published>2010-12-17T13:51:00.001-08:00</published><updated>2011-11-11T10:37:42.103-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-11T10:37:42.103-08:00</app:edited><title>Part of today expressed in Ruby</title><content type="html">&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;forrest.drive&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;forrest.hear( flapping_noise )
forrest.look( flat_tire )
flat_tire.found? == false
forrest.look( broken_belt )
broken_belt.found? == false
while( sound_still_happening )
&amp;nbsp;forrest.worry!
end
sound.stop? == true

(forrest.take( car, mechanic )).to_be_sure
forrest.got( the_scoop )

timer.add( 5.pm, lambda { forrest.money -= 1000 })

money.overrated? == APPARENTLY
&lt;/code&gt;
&lt;/pre&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-2076123205127094918?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5FN5bQlii69k_-aoRQwHD718Lhg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5FN5bQlii69k_-aoRQwHD718Lhg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5FN5bQlii69k_-aoRQwHD718Lhg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5FN5bQlii69k_-aoRQwHD718Lhg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/a1tMG324OY4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/2076123205127094918/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=2076123205127094918" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/2076123205127094918?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/2076123205127094918?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/a1tMG324OY4/forrest.html" title="Part of today expressed in Ruby" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2010/12/forrest.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04CQ3g8fyp7ImA9Wx5WF0w.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-2137295578798189554</id><published>2010-09-28T16:19:00.000-07:00</published><updated>2010-09-28T16:19:22.677-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-28T16:19:22.677-07:00</app:edited><title /><content type="html">&lt;span style="font-family: Calibri, Verdana, Helvetica, Arial;"&gt;&lt;span style="font-size: 11pt;"&gt;We just had an Agile Process Overview w/the engineers and customer. &amp;nbsp;Post &lt;a href="http://agileopencalifornia.com/content/view/19/46/"&gt;AOSOCAL&lt;/a&gt;, I wanted to do this for several purposes&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Calibri, Verdana, Helvetica, Arial;"&gt;&lt;span style="font-size: 11pt;"&gt;Make explicit the process we are following  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Calibri, Verdana, Helvetica, Arial;"&gt;&lt;span style="font-size: 11pt;"&gt;Give an assessment where we are on those practices (good, needs improvement, etc.)  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Calibri, Verdana, Helvetica, Arial;"&gt;&lt;span style="font-size: 11pt;"&gt;Address additional process/practices  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Calibri, Verdana, Helvetica, Arial;"&gt;&lt;span style="font-size: 11pt;"&gt;Get team buy/ownership/empowerment&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-family: Calibri, Verdana, Helvetica, Arial;"&gt;&lt;span style="font-size: 11pt;"&gt;&lt;br /&gt;
I drafted up a Google Doc spreadsheet of 3 parts&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Calibri, Verdana, Helvetica, Arial;"&gt;&lt;span style="font-size: 11pt;"&gt;the (&lt;a href="http://en.wikipedia.org/wiki/Extreme_Programming"&gt;eXtreme Programming&lt;/a&gt;) XP practices in various evolutions and categorizations  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Calibri, Verdana, Helvetica, Arial;"&gt;&lt;span style="font-size: 11pt;"&gt;A by practice assessment of where we were  &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: Calibri, Verdana, Helvetica, Arial;"&gt;&lt;span style="font-size: 11pt;"&gt;An additional practices for things outside of XP&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-family: Calibri, Verdana, Helvetica, Arial;"&gt;&lt;span style="font-size: 11pt;"&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;We did this live on Google Docs and iChat (Apple wasn’t lying about the bandwidth improvements to the Snow Leopard — the 3 in the center are actually co-located but we egregiously decided to exploit iChat). &amp;nbsp;&amp;nbsp;I think it went well, and it met my purposes. &amp;nbsp;I’ll say the multi video chat and real time interaction on Google Doc spreadsheets really contributed well.&lt;/span&gt;&lt;/span&gt; &lt;!--EndFragment--&gt;  &lt;br /&gt;
&lt;span style="font-family: Calibri, Verdana, Helvetica, Arial;"&gt;&lt;span style="font-size: 11pt;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_SDJrg5LZEVs/TKJ3zOtrsUI/AAAAAAAAAFw/Tz1NgB5jc9s/s1600/agile_chat.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="146" src="http://2.bp.blogspot.com/_SDJrg5LZEVs/TKJ3zOtrsUI/AAAAAAAAAFw/Tz1NgB5jc9s/s320/agile_chat.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: Calibri, Verdana, Helvetica, Arial;"&gt;&lt;span style="font-size: 11pt;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-2137295578798189554?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IatH0aKsAW2J2_rAq5jOD08V0_0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IatH0aKsAW2J2_rAq5jOD08V0_0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IatH0aKsAW2J2_rAq5jOD08V0_0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IatH0aKsAW2J2_rAq5jOD08V0_0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/aEL8jcIy4t4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/2137295578798189554/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=2137295578798189554" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/2137295578798189554?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/2137295578798189554?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/aEL8jcIy4t4/we-just-had-agile-process-overview-wthe.html" title="" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_SDJrg5LZEVs/TKJ3zOtrsUI/AAAAAAAAAFw/Tz1NgB5jc9s/s72-c/agile_chat.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2010/09/we-just-had-agile-process-overview-wthe.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEGSHg6fip7ImA9Wx5WFk4.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-5249026535815583929</id><published>2010-09-27T16:27:00.000-07:00</published><updated>2010-09-27T16:37:09.616-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-27T16:37:09.616-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="pair_programming" /><category scheme="http://www.blogger.com/atom/ns#" term="agile_diary" /><title>Our new pair station</title><content type="html">&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;The 1st of our new pair stations for the engineering team at &lt;a href="http://hedgeye.com/"&gt;Hedgeye&lt;/a&gt;.  Just a further evolution on a theme used by Hashrocket, Engine Yard and others, taking advantage of Apple's current layout (we're a Ruby on Rails shop, so life is much nicer on Macs).&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_SDJrg5LZEVs/TKEpc0aLtGI/AAAAAAAAAFo/xKeaLYGDyxY/s400/OceansideOffice.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5521740193214477410" /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Components&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;27 inch i5 quad core iMac as the pair station&lt;/li&gt;&lt;li&gt;2 15 inch, i7 Macbook Pro's per each developer, each w/22 inch external monitor&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We're loving it.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-5249026535815583929?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_0RR9uCO2zw_y8q_lMswnBUx7ZY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_0RR9uCO2zw_y8q_lMswnBUx7ZY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_0RR9uCO2zw_y8q_lMswnBUx7ZY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_0RR9uCO2zw_y8q_lMswnBUx7ZY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/NJAt7K-yzBo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/5249026535815583929/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=5249026535815583929" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/5249026535815583929?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/5249026535815583929?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/NJAt7K-yzBo/our-new-pair-station.html" title="Our new pair station" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_SDJrg5LZEVs/TKEpc0aLtGI/AAAAAAAAAFo/xKeaLYGDyxY/s72-c/OceansideOffice.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2010/09/our-new-pair-station.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUFRns9eCp7ImA9WxJXFkw.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-4881952305286479210</id><published>2009-06-09T22:18:00.000-07:00</published><updated>2009-06-09T22:53:37.560-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-09T22:53:37.560-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile agile_diary" /><title>Agile Diary</title><content type="html">&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_SDJrg5LZEVs/Si9H9xJnKrI/AAAAAAAAAFE/EZ4q3_e4V3c/s1600-h/Diary+pages.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 294px;" src="http://4.bp.blogspot.com/_SDJrg5LZEVs/Si9H9xJnKrI/AAAAAAAAAFE/EZ4q3_e4V3c/s400/Diary+pages.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5345570409203313330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Dear Diary:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I had a goal in January to write a series of ongoing blog posts called &lt;i&gt;Agile Diary&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While a lot has been written about various Agile methods, rather than a presenting a methodology or case studies, I thought a regular,  &lt;i&gt;diary entries&lt;/i&gt; might paint a different picture and provide different insights.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I hope to at least talk about:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;The situation&lt;/li&gt;&lt;li&gt;What my initial goals were&lt;/li&gt;&lt;li&gt;The initial plan&lt;/li&gt;&lt;li&gt;how we were able to follow&lt;/li&gt;&lt;li&gt;what we had to adapt to &lt;/li&gt;&lt;li&gt;failures as well as success&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Naturally as situations will always change, we will always iterate through the above  --- Diary Iterations, per se.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I'm 5 months behind, I'll try to write some fill in articles and catch up.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_SDJrg5LZEVs/Si9JUy8J8oI/AAAAAAAAAFM/JCaZTLb7PVI/s1600-h/calendar.jpg"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#551A8B;"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); -webkit-text-decorations-in-effect: none; "&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_SDJrg5LZEVs/Si9JzrnqLDI/AAAAAAAAAFU/bf36v3wkdN4/s1600-h/calendar.jpg"&gt;&lt;img src="http://2.bp.blogspot.com/_SDJrg5LZEVs/Si9JzrnqLDI/AAAAAAAAAFU/bf36v3wkdN4/s400/calendar.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5345572434943290418" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 368px; height: 218px; " /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Forrest&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-4881952305286479210?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sKiB86dCR_9IUZyPbbylydCW53A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sKiB86dCR_9IUZyPbbylydCW53A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sKiB86dCR_9IUZyPbbylydCW53A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sKiB86dCR_9IUZyPbbylydCW53A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/xVpQGGw4igk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/4881952305286479210/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=4881952305286479210" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/4881952305286479210?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/4881952305286479210?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/xVpQGGw4igk/agile-diary.html" title="Agile Diary" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_SDJrg5LZEVs/Si9H9xJnKrI/AAAAAAAAAFE/EZ4q3_e4V3c/s72-c/Diary+pages.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2009/06/agile-diary.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIDQX48eCp7ImA9WxVbF0w.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-7297028524498840475</id><published>2009-04-02T15:47:00.000-07:00</published><updated>2009-04-02T15:49:30.070-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-02T15:49:30.070-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="time rails activesupport" /><title>Creating dates in a time zone w/ActiveSupport</title><content type="html">As easy as 1-2-3&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:-webkit-monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; white-space: pre;"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia;font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; white-space: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;eastern_timezone = &lt;span class="type"&gt;ActiveSupport::TimeZone&lt;/span&gt;[&lt;span class="string"&gt;"Eastern Time (US &amp;amp; Canada)"&lt;/span&gt;]&lt;br /&gt;mon_before_market_opening = eastern_timezone.parse &lt;span class="string"&gt;"3/23/2009 07:59:59 AM"&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-7297028524498840475?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JVQkSK_-R4gWR6K1kbnVc-oKL2g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JVQkSK_-R4gWR6K1kbnVc-oKL2g/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JVQkSK_-R4gWR6K1kbnVc-oKL2g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JVQkSK_-R4gWR6K1kbnVc-oKL2g/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/h6PmPwKLKM0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/7297028524498840475/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=7297028524498840475" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/7297028524498840475?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/7297028524498840475?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/h6PmPwKLKM0/creating-dates-in-time-zone.html" title="Creating dates in a time zone w/ActiveSupport" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2009/04/creating-dates-in-time-zone.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEFQXsyeyp7ImA9WxVVF08.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-9114850766597915668</id><published>2009-03-10T16:41:00.000-07:00</published><updated>2009-03-10T16:43:30.593-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-10T16:43:30.593-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rails ruby_way" /><title>Rails, "do what I mean"</title><content type="html">A pleasant surprise for me just now.  I typed in&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;script/generate migration add_application_to_content_categories application:string&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And the entire migration was generated.  The descriptive name I thought of was the right convention to trigger the instant magic.  Beautiful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-9114850766597915668?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Ltiq2Tl3bvS96UKMqADir3um6j8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ltiq2Tl3bvS96UKMqADir3um6j8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Ltiq2Tl3bvS96UKMqADir3um6j8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ltiq2Tl3bvS96UKMqADir3um6j8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/tk0ZrXul-c8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/9114850766597915668/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=9114850766597915668" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/9114850766597915668?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/9114850766597915668?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/tk0ZrXul-c8/rails-do-what-i-mean.html" title="Rails, &quot;do what I mean&quot;" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2009/03/rails-do-what-i-mean.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04ARn4-cSp7ImA9WhdREkw.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-6903759421652407615</id><published>2009-03-10T14:44:00.000-07:00</published><updated>2011-08-01T09:25:47.059-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-01T09:25:47.059-07:00</app:edited><title>Jack Bauer 94</title><content type="html">I was reminded for some reason of this video I saw last year to share w/my coworkers.  Thought I'd share it here. &lt;a href="http://www.collegehumor.com/video:1788161"&gt;http://www.collegehumor.com/video:1788161&lt;/a&gt;  &lt;br /&gt;
&lt;br /&gt;
It's 24 if shot in 1994.  Amazing how far we've come since&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.collegehumor.com/video:1788161"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5311679394994164178" src="http://4.bp.blogspot.com/_SDJrg5LZEVs/SbbgRGtjkdI/AAAAAAAAAE8/-mTD0wGH4bg/s400/jack.png" style="display: block; height: 220px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-6903759421652407615?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Ac_IMxbdq2L3NqZ01W0fHZZ3BNE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ac_IMxbdq2L3NqZ01W0fHZZ3BNE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Ac_IMxbdq2L3NqZ01W0fHZZ3BNE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Ac_IMxbdq2L3NqZ01W0fHZZ3BNE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/fBX4bZehJVc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/6903759421652407615/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=6903759421652407615" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/6903759421652407615?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/6903759421652407615?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/fBX4bZehJVc/jack-bauer-94.html" title="Jack Bauer 94" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_SDJrg5LZEVs/SbbgRGtjkdI/AAAAAAAAAE8/-mTD0wGH4bg/s72-c/jack.png" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2009/03/jack-bauer-94.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AHSXs9fip7ImA9WxVVF00.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-3052843154420521683</id><published>2009-03-10T11:27:00.001-07:00</published><updated>2009-03-10T11:28:58.566-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-10T11:28:58.566-07:00</app:edited><title>Instant 3 way bi coastal debugging session</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_SDJrg5LZEVs/SbaxQY-omtI/AAAAAAAAAE0/WGeQjXKL-1M/s1600-h/3way_debug.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 265px;" src="http://2.bp.blogspot.com/_SDJrg5LZEVs/SbaxQY-omtI/AAAAAAAAAE0/WGeQjXKL-1M/s400/3way_debug.png" alt="" id="BLOGGER_PHOTO_ID_5311627705671260882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;courtesy via iChat&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-3052843154420521683?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ie62lPVMBWRwlXVOkwwCjh1TmRE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ie62lPVMBWRwlXVOkwwCjh1TmRE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ie62lPVMBWRwlXVOkwwCjh1TmRE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ie62lPVMBWRwlXVOkwwCjh1TmRE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/i70_OeGxKT4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/3052843154420521683/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=3052843154420521683" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/3052843154420521683?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/3052843154420521683?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/i70_OeGxKT4/instant-3-way-bi-coastal-debugging.html" title="Instant 3 way bi coastal debugging session" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_SDJrg5LZEVs/SbaxQY-omtI/AAAAAAAAAE0/WGeQjXKL-1M/s72-c/3way_debug.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2009/03/instant-3-way-bi-coastal-debugging.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUDR384eip7ImA9WhRSEE4.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-191213803077856978</id><published>2009-03-04T12:31:00.000-08:00</published><updated>2011-11-11T10:31:16.132-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-11T10:31:16.132-08:00</app:edited><title>VirtualBox &gt; VirtualPC</title><content type="html">I have available to me a rather muscular 20inch Vista laptop -- that's right, 20 inches, this is a laptop for King Kong.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://upload.wikimedia.org/wikipedia/en/thumb/8/88/Img_kingkong1.jpg/300px-Img_kingkong1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://upload.wikimedia.org/wikipedia/en/thumb/8/88/Img_kingkong1.jpg/300px-Img_kingkong1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Anyways, one of the uses for the laptop is to run a Microsoft provided XP VirtualPC  image with Internet Explorer 6, unfortunately still a dominant browser and the "Great Satan" for web developers everywhere.  As part of the virtualization wars, Microsoft has graciously made VirtualPC 2007 a free download.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://infomyth.com/VirtualPC/virtualpc.jpg"&gt;&lt;img alt="" border="0" src="http://infomyth.com/VirtualPC/virtualpc.jpg" style="cursor: pointer; display: block; height: 235px; margin: 0px auto 10px; text-align: center; width: 340px;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I also planned to setup a CruiseControl.rb instance on a linux VM, and the Vista laptop had plenty of resources to spare (even running Vista).  Naturally since I was already running the XP image on VirtualPC it made sense to try and to reuse VirtualPC for a Linux VM.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.rubyinside.com/wp-content/uploads/2007/03/cruisecontrol-tm.jpg"&gt;&lt;img alt="" border="0" src="http://www.rubyinside.com/wp-content/uploads/2007/03/cruisecontrol-tm.jpg" style="cursor: pointer; display: block; height: 100px; margin: 0px auto 10px; text-align: center; width: 319px;" /&gt;&lt;/a&gt;&lt;br /&gt;
Some googling, and hoop jumpings later I had a Linux VM running, but it was kind of slow, and unstable.  The Linux VM never stayed booted up for more than 2 days.  MS does not officially support Linux VM's, go figure ;).  Apparently there were linux add ons for VirtualPC 2005, but those didn't support Ubuntu, and no one has been able to get them to run with VirtualPC 2007.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.virtualbox.org/graphics/vbox_logo2_gradient.png"&gt;&lt;img alt="" border="0" src="http://www.virtualbox.org/graphics/vbox_logo2_gradient.png" style="cursor: pointer; display: block; height: 180px; margin: 0px auto 10px; text-align: center; width: 140px;" /&gt;&lt;/a&gt;&lt;br /&gt;
So I decided to give VirtualBox a try after hearing good things about it.  The install went very smoothly, and the VM is both stable and quick.  The VirtualBox VM runs our unit tests in about 1/3 the time of the VirtualPC.&lt;br /&gt;
&lt;br /&gt;
In general I seem happier with using VirtualBox, though I'll have to come up with a different solution.  I will say on VirtualPC's behalf, that XP ran fine under VirtualPC&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-191213803077856978?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/x4hXvudu0DXvV2_G5Q6IrMzKJN8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/x4hXvudu0DXvV2_G5Q6IrMzKJN8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/x4hXvudu0DXvV2_G5Q6IrMzKJN8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/x4hXvudu0DXvV2_G5Q6IrMzKJN8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/vBaZf9zHZvk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/191213803077856978/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=191213803077856978" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/191213803077856978?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/191213803077856978?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/vBaZf9zHZvk/virtualbox-virtualpc.html" title="VirtualBox &gt; VirtualPC" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2009/03/virtualbox-virtualpc.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIAR3Y6fSp7ImA9WhRSEE4.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-2452878394844393043</id><published>2009-03-04T12:21:00.000-08:00</published><updated>2011-11-11T10:35:46.815-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-11T10:35:46.815-08:00</app:edited><title>thru-you.com</title><content type="html">Wow, just caught this from @obie &lt;a href="http://thru-you.com/"&gt;http://thru-you.com/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://thru-you.com/"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5309432492679962754" src="http://4.bp.blogspot.com/_SDJrg5LZEVs/Sa7kuLUbIII/AAAAAAAAAEs/sDz-W-zXrfo/s400/thru-u.png" style="display: block; height: 318px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;
It's amazing what "undiscovered talent" there is out there.  Though I imagine he won't be undiscoved that long.  Makes me wanna play again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-2452878394844393043?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pA-mXrGCh26TsoQWuGTRJLpWBgU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pA-mXrGCh26TsoQWuGTRJLpWBgU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pA-mXrGCh26TsoQWuGTRJLpWBgU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pA-mXrGCh26TsoQWuGTRJLpWBgU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/z5Bea9hWdnU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/2452878394844393043/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=2452878394844393043" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/2452878394844393043?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/2452878394844393043?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/z5Bea9hWdnU/thru-youcom.html" title="thru-you.com" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_SDJrg5LZEVs/Sa7kuLUbIII/AAAAAAAAAEs/sDz-W-zXrfo/s72-c/thru-u.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2009/03/thru-youcom.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04NSH4-eSp7ImA9WxVWF0s.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-3775220701169373021</id><published>2009-02-27T11:07:00.000-08:00</published><updated>2009-02-27T11:13:19.051-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-27T11:13:19.051-08:00</app:edited><title>Remote collobaration via 4 Way Video Conference with iChat</title><content type="html">Title says it all.  Mondo cool.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_SDJrg5LZEVs/Sag6mOu_YwI/AAAAAAAAAEk/5cUpWgi2lCI/s1600-h/4way_ichat.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 198px;" src="http://2.bp.blogspot.com/_SDJrg5LZEVs/Sag6mOu_YwI/AAAAAAAAAEk/5cUpWgi2lCI/s400/4way_ichat.jpg" alt="" id="BLOGGER_PHOTO_ID_5307556589320758018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I stayed home to help watch a sick child, but this came in handy.   Normally the 3 on the right are in the same office in Southern California (2 of them are on the call), and the gentlemen at the left is in New Haven, CT.&lt;br /&gt;&lt;br /&gt;Pretty nice for free!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-3775220701169373021?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RGxaiFLuMBZYsXdwc5OV8mmWDY0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RGxaiFLuMBZYsXdwc5OV8mmWDY0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/RGxaiFLuMBZYsXdwc5OV8mmWDY0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RGxaiFLuMBZYsXdwc5OV8mmWDY0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/NsqdI4-JWgk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/3775220701169373021/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=3775220701169373021" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/3775220701169373021?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/3775220701169373021?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/NsqdI4-JWgk/remote-collobaration-via-4-way-video.html" title="Remote collobaration via 4 Way Video Conference with iChat" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_SDJrg5LZEVs/Sag6mOu_YwI/AAAAAAAAAEk/5cUpWgi2lCI/s72-c/4way_ichat.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2009/02/remote-collobaration-via-4-way-video.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IFSHs6eCp7ImA9WxVXFEg.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-8132181570325967395</id><published>2009-02-12T09:22:00.000-08:00</published><updated>2009-02-12T09:25:19.510-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-12T09:25:19.510-08:00</app:edited><title>Rapid progress:  kudos to JRuby</title><content type="html">Courtesy of Facebook&lt;br /&gt;&lt;br /&gt;&lt;span class="status_body"&gt;&lt;a href="http://www.facebook.com/profile.php?id=649925863&amp;amp;ref=nf" class="status_user_name" onclick="'return"&gt;Charles Oliver Nutter&lt;/a&gt; JRuby has had over 850 revisions applied since 1.1.6 was branched in December. That's better than 14 commits per day. And 153 issues fixed.&lt;/span&gt; &lt;span style="font-size:78%;"&gt;&lt;span class="feed_story_meta"&gt;&lt;span class="feed_time"&gt;about an hour ago&lt;/span&gt;&lt;span class="action_links_title"&gt;&lt;span class="action_link_dash action_link_dash_0"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sweet...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-8132181570325967395?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YQfmwZS6Bsvfz__nKawMylncH9I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YQfmwZS6Bsvfz__nKawMylncH9I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YQfmwZS6Bsvfz__nKawMylncH9I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YQfmwZS6Bsvfz__nKawMylncH9I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/DMEO1bAdWx4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/8132181570325967395/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=8132181570325967395" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/8132181570325967395?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/8132181570325967395?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/DMEO1bAdWx4/rapid-progress-kudos-to-jruby.html" title="Rapid progress:  kudos to JRuby" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2009/02/rapid-progress-kudos-to-jruby.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cGQX04fip7ImA9WxVTEE4.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-1892013223054105895</id><published>2008-12-22T17:01:00.000-08:00</published><updated>2008-12-23T04:23:40.336-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-23T04:23:40.336-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tdd bdd" /><title>The significance of Red in Red, Green,Refactor</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NgOcjy-VkEc/SE1r213tE9I/AAAAAAAAAVM/4C5Y5Ug6-LQ/s400/ExecutiveDashboard01.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 286px; height: 400px;" src="http://4.bp.blogspot.com/_NgOcjy-VkEc/SE1r213tE9I/AAAAAAAAAVM/4C5Y5Ug6-LQ/s400/ExecutiveDashboard01.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;(image from http://weepeixin.blogspot.com/2008/06/red-light.html)&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;What a lot of people miss is that the &lt;span style="color: rgb(255, 0, 0);"&gt;Red&lt;/span&gt; part of the &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;TDD&lt;/a&gt; mantra "&lt;span style="color: rgb(255, 0, 0);"&gt;Red&lt;/span&gt;, &lt;span style="color: rgb(0, 153, 0);"&gt;Green&lt;/span&gt;, Refactor" serves as a test of the test (or spec for the &lt;a href="http://en.wikipedia.org/wiki/Behavior_driven_development"&gt;BDD&lt;/a&gt; faithful).  In seeing a test fail prior to the addition of code and seeing the test subsequently pass after the addition of code you learn 2 things&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The test indeed tested something that actually changed with the addition of code&lt;/li&gt;&lt;li&gt;The code added had something to do with that test changing&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;One really appreciates this when they've been bitten -- written a test w/o bothering to see it fail, and writing code that supposedly makes it pass, but in fact did not.  What can happen, albeit infrequently, is that since the test might've passed w/o the addition of new code--- the code added had nothing to with the code passing, or the test didn't test what you thought it did --- both variations of "accidental programming." Unfortunately,  you won't be alerted to this since you never had the red turn into green as  a result of the new code. This will break the normally "debugger free" cycle of TDD and reduce your coding momentum.  I've been bitten, so I'm particularly aware of this phenomenon.  Simply making it habit to always see the &lt;span style="color: rgb(255, 0, 0);"&gt;red&lt;/span&gt;, can avoid this.&lt;br /&gt;&lt;br /&gt;I think side effects of not being able to "test the test" occurs more frequently test last, whether you are doing so by design (non TDD coding) or by necessity (adding tests to legacy code, working on code that is not easily TDD'd).  In such situations, it's often hard, or not worth the ROI to find a way to make the test fail prior to writing the test.  Consequently, writing tests last can often just serve as "documenting how the existing code works", rather than testing it.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blogs.technet.com/blogfiles/seanearp/WindowsLiveWriter/MapActiveDirectoryinVisio_8FEC/fig05_thumb.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 353px; height: 200px;" src="http://blogs.technet.com/blogfiles/seanearp/WindowsLiveWriter/MapActiveDirectoryinVisio_8FEC/fig05_thumb.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;(image from http://blogs.technet.com/seanearp/archive/2007/10/02/map-active-directory-in-visio.aspx)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I fell prey to this effect while putting some tests on some LDAP/ActiveDirectory code that I had to explore to get working .  Normally, I strive to TDD as much as possible, but I couldn't really see how to do so in this case.  I did a spike, exercising the LDAP API until it got the results I needed, then proceeding to refactor and add tests to this "legacy code" (as defined by Michael Feathers).&lt;br /&gt;&lt;br /&gt;The test in question itself was &lt;span style="color: rgb(255, 0, 0);"&gt;wrong&lt;/span&gt; -- it didn't test what I thought it did, but since I never saw it fail, then pass, I didn't know it.   Fortunately, I had a controller test (Rails app) that touched this code which failed and alerted me to the faulty test which also should've &lt;span style="color: rgb(255, 0, 0);"&gt;failed&lt;/span&gt; (yay multi level test coverage).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://en.oreilly.com/rails2008/public/asset/asset/1184"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 75px; height: 100px;" src="http://en.oreilly.com/rails2008/public/asset/asset/1184" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I'm reminded of Micah Martin's &lt;a href="http://rubyconf.org/talks/32"&gt;Ruby Kata and Sparring&lt;/a&gt; presentation at &lt;a href="http://rubyconf.org/"&gt;RubyConf&lt;/a&gt; where Micah did an exercise of live coding w/critiques as a device to improve one's coding.  He mostly did a by the book "red, green, refactor" TDD/BDD with Rspec.  I had pointed out that he had written a test in which he never saw it fail, but went straight ahead wrote the implementation to see the &lt;span style="color: rgb(0, 153, 0);"&gt;green&lt;/span&gt;.  Now it was obvious that Micah had coded this problem before, that he pretty much knew what he was going code here, and that it was probably unlikely that there would be existing code to make this test pass, but none the less it's possible he might've written the wrong test, which would've sent him into a debugging cycle at some later point.  When I brought this up, another attendee thought it was a spurious criticism, something along the lines that "we were judging his coding, not his adherence to TDD."  I feel that person didn't get the significance of &lt;span style="color: rgb(255, 0, 0);"&gt;Red&lt;/span&gt; in &lt;span style="color: rgb(255, 0, 0);"&gt;Red&lt;/span&gt;, &lt;span style="color: rgb(0, 153, 0);"&gt;Green&lt;/span&gt;,Refactor, but perhaps he's never been bitten.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-1892013223054105895?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4PdykMwlSF1xGcw8lOt3uOmygSY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4PdykMwlSF1xGcw8lOt3uOmygSY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4PdykMwlSF1xGcw8lOt3uOmygSY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4PdykMwlSF1xGcw8lOt3uOmygSY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/5E5IGkNlpPM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/1892013223054105895/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=1892013223054105895" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/1892013223054105895?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/1892013223054105895?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/5E5IGkNlpPM/significance-of-red-in-red.html" title="The significance of Red in Red, Green,Refactor" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_NgOcjy-VkEc/SE1r213tE9I/AAAAAAAAAVM/4C5Y5Ug6-LQ/s72-c/ExecutiveDashboard01.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2008/12/significance-of-red-in-red.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMESX84cCp7ImA9WhRSEE4.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-5352085078482124946</id><published>2008-12-21T22:11:00.000-08:00</published><updated>2011-11-11T10:33:28.138-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-11T10:33:28.138-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="implementation patterns" /><category scheme="http://www.blogger.com/atom/ns#" term="kent beck" /><title>Kent Beck is a bloody genius, or How I learned to stop worrying about clean books and love the highligther</title><content type="html">&lt;a href="http://images.pearsoned-ema.com/jpeg/large/9780321413093.jpg"&gt;&lt;img alt="" border="0" src="http://images.pearsoned-ema.com/jpeg/large/9780321413093.jpg" style="cursor: pointer; display: block; height: 324px; margin: 0px auto 10px; text-align: center; width: 244px;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I just started reading Kent Beck's&lt;a href="http://www.pearsoned.co.uk/Bookshop/detail.asp?item=100000000130859"&gt; &lt;span style="font-style: italic;"&gt;Implementation Patterns&lt;/span&gt;&lt;/a&gt; and have been quite impressed.  I've read several of his other books, Extreme Programming Explored, 1st and 2nd Editions as well as Test Driven Development and find him to be remarkably insightful and communicative.    The way he's able to express deep thoughts with clarity and brevity, while making it accessible rather than pedantic and dry is a joy to read.  While I agree with and have often independently come up with many of the same thoughts he has expressed, Kent expresses them much better than I could.  It is definitely useful for me to be able to draw upon his words when trying to express  the same thoughts.  Kent Beck is a genius.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://ecx.images-amazon.com/images/I/514RZ3Y3MTL._SL500_AA300_.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://ecx.images-amazon.com/images/I/514RZ3Y3MTL._SL500_AA300_.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the past I've never taken too much writing in my books.  I suspect it may stem back partly  to the "Don't write in your text books" public school school training.  Other factors may be some residual "keep your books pristine" OCD and the fear of marking the books up with something that I might not agree with later.  As a compromise, I've annotated books w/sticky notes but doing so was often awkward.  Many times, I'll read a section that I've gotten a lot out of, made a mental note to revisit, or write about it, but  usually never got around to doing it. Consequentlym I would lose those ideas.&lt;br /&gt;
&lt;br /&gt;
I started reading this book and mentally noting some great point I might want to discuss w/a co worker or write about, and finally broke down and got out a highlighter and a pencil and proceeded to mark it up.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.valleyhemp.com/usrimage/highlighter%20pipe.jpg"&gt;&lt;img alt="" border="0" src="http://www.valleyhemp.com/usrimage/highlighter%20pipe.jpg" style="cursor: pointer; display: block; height: 303px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Wow, I think I've enjoyed the parts I've read thus far much deeper than I have in past.  I think the effort of highlighting and writing in the blank sections really helped to gel things more than just reading.  I'll note that &lt;a href="http://oreilly.com/store/series/headfirst.csp"&gt;Head First series&lt;/a&gt; tries to actively encourage such as an active learning exercise as well.&lt;br /&gt;
&lt;br /&gt;
Anyways, I've had such a good time doing so, I'll have to go back and reread and annotate my other Kent Beck books doing the same.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-5352085078482124946?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/s7dr6R8eTJj6-GzV-Hfqfbr0nrg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/s7dr6R8eTJj6-GzV-Hfqfbr0nrg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/s7dr6R8eTJj6-GzV-Hfqfbr0nrg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/s7dr6R8eTJj6-GzV-Hfqfbr0nrg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/zq65gVCRdoo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/5352085078482124946/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=5352085078482124946" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/5352085078482124946?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/5352085078482124946?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/zq65gVCRdoo/kent-beck-is-bloody-genius-or-how-i.html" title="Kent Beck is a bloody genius, or How I learned to stop worrying about clean books and love the highligther" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2008/12/kent-beck-is-bloody-genius-or-how-i.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUFQXk4fip7ImA9WxRbGUk.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-4342769791654384491</id><published>2008-12-10T11:28:00.000-08:00</published><updated>2008-12-10T12:50:10.736-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-10T12:50:10.736-08:00</app:edited><title>Done in by truncation</title><content type="html">This was from my LinkedIn Network Updates this morning.  Names removed to protect the innocent..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_SDJrg5LZEVs/SUAdNn0UjOI/AAAAAAAAAEE/CjletcxF3H0/s1600-h/abbreviated_oops.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 49px;" src="http://1.bp.blogspot.com/_SDJrg5LZEVs/SUAdNn0UjOI/AAAAAAAAAEE/CjletcxF3H0/s400/abbreviated_oops.gif" alt="" id="BLOGGER_PHOTO_ID_5278250883142159586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I've highlighted the key part that was "done in by truncation."&lt;br /&gt;&lt;br /&gt;Of course, we know that it was supposed to be "She was a huge asset"...&lt;br /&gt;&lt;br /&gt;Or do we ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-4342769791654384491?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5S_5J98QhkKecsRVmYxi62xBL4o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5S_5J98QhkKecsRVmYxi62xBL4o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5S_5J98QhkKecsRVmYxi62xBL4o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5S_5J98QhkKecsRVmYxi62xBL4o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/hbHVYJaK3uI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/4342769791654384491/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=4342769791654384491" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/4342769791654384491?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/4342769791654384491?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/hbHVYJaK3uI/done-in-by-abbreviation.html" title="Done in by truncation" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_SDJrg5LZEVs/SUAdNn0UjOI/AAAAAAAAAEE/CjletcxF3H0/s72-c/abbreviated_oops.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2008/12/done-in-by-abbreviation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUGSHczeSp7ImA9WB5SFko.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-4337757896855481312</id><published>2007-06-12T10:53:00.000-07:00</published><updated>2007-06-12T12:23:49.981-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-06-12T12:23:49.981-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="user experience" /><category scheme="http://www.blogger.com/atom/ns#" term="david vs goliath" /><title>User Experience and Service</title><content type="html">I have a great mechanic.  Aas an independent, George doesn't have the huge resources a dealer has, but he beats the dealer in every aspect except for free carwashes with each service.  Aside from being an amicable guy, he's honest, only fixes things need fixing -- most repair shops perform services according to mileage whether or not the work needs to be done (blindly following rote process vs doing acting according to context), strives to be preventive rather than reactive, and tries his best to minimize costs for the customer.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://agentz.com/scouts/images/mechanic1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://agentz.com/scouts/images/mechanic1.jpg" alt="" border="0" /&gt;&lt;/a&gt;(image from agentz.com)&lt;br /&gt;&lt;br /&gt;I was supposed to have my car done this morning, except one of George's suppliers didn't come through for the 2nd day in a row.  George offered me a rental car at his own expense.   I replied that he could just drop me off, but George insisted and I eventually relented.  Shortly after, George had to convince another customer, who both just lived up the hill and had an extra car of his own, to accept a rental, as another supplier had failed George wrt that customers service.  I was very impressed how much effort George would go through to right a wrong he had no control over.  Utlimately, my car was ready 90 minutes after I got home.&lt;br /&gt;&lt;br /&gt;In general George goes all out to give the best experience possible. He takes the hit for things out of his control without a second thought.  He has my business for as long he runs his business.&lt;br /&gt;&lt;br /&gt;Low prices and cost cutting have been squeezing out service/user experience in most businesses  It makes sense: people, myself included, like to pay the least amount possible.  Systematically cutting costs allows one to lower prices.  Low prices brings in the customers, which ought to  produce impressive metrics, at least for the short term.  What does this mean in the long term?  Dell used to be renowned for quality, service and the best prices.  This is what shot them to prominence and profitability.  Like many, they outsourced their customer support overseas to cut costs and now they're taking the long term hit of having eroded away their reputation for good support. &lt;br /&gt;&lt;br /&gt;Ironically, they were only following management "best practices" of the time.  Unfortunately, in doing so, they destroyed what made them famous and now HP is beating Dell at the game Dell created.  Don't get me wrong, there is strong value in systematically improving quality, and the capability to create such, but it's the blind following of numbers without paying attention to context and what makes a company unique that can lead you down the wrong road, for example &lt;a href="http://www.businessweek.com/magazine/content/07_24/b4038406.htm"&gt;3M adoption of Six Sigma eroded their innovation culture.&lt;/a&gt; It's all too easy to be short sighted or have tunnel vision when following metrics.  When you reward based on a metric, people will adjust to satisfy that metric w/o context of what is actually supposed to be done.  The 3M article points out "Six Sigma green belt projects" being pursued just to look better.  Context is important and now 3M is trying to keep the efficiency gains Six Sigma brought them in manufacturing, something it needed, while trying rekindle it's innovation culture in R&amp;D, which is what made them what they are via a dual system approach.&lt;br /&gt;&lt;br /&gt;Service/customer experience still lives on where a premium price is paid, i.e. Apple, Lexus, etc.  Google stands out as striving to provide premium user experience w/o charging the user a premium price.   George stands out as a little guy beating out the big guys (i.e. dealers, large auto shops) in pretty much all areas, mostly by doing the right things.  Thing which don't make sense according to mainstream business "best practices" focussed on relentlessly cutting costs.&lt;br /&gt;&lt;br /&gt;There are lessons to learn here in software. Ironically, these lessons are the most appropriate for the entreprenurial, who already seem to know these things.  The right combination of people (top notch, open minded, flexible), with the right technologies (such as Ruby/Ruby on Rails, Django, Erlang for concurrency, etc.) and process (Agile/Lean), backed by the right culture/philosophies (Google innovation culture, striving to provide "kick butt" user experience ala &lt;a href="http://headrush.typepad.com/"&gt;Creating Passionate Users&lt;/a&gt;, etc), can produce better quality, superior user experience products in less time for less cost, far outperforming huge corporations following "best practices."  &lt;a href="http://37signals.com/"&gt;37 Signals&lt;/a&gt; makes for a good example.&lt;br /&gt;&lt;br /&gt;So in closing, Rock on George.  If you're in need of a mechanic in the Laguna Niguel area, drop me a line.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-4337757896855481312?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xpS70lS4jjfBYTwH2hA-gtJFOxo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xpS70lS4jjfBYTwH2hA-gtJFOxo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xpS70lS4jjfBYTwH2hA-gtJFOxo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xpS70lS4jjfBYTwH2hA-gtJFOxo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/2zLt-ZMJhME" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/4337757896855481312/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=4337757896855481312" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/4337757896855481312?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/4337757896855481312?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/2zLt-ZMJhME/user-experience-and-service.html" title="User Experience and Service" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2007/06/user-experience-and-service.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAESX06fyp7ImA9WB5SFko.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-2263110399074684080</id><published>2007-06-06T14:25:00.000-07:00</published><updated>2007-06-12T13:05:08.317-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-06-12T13:05:08.317-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="visualization" /><category scheme="http://www.blogger.com/atom/ns#" term="3EZ" /><title>3 Easy (3EZ)</title><content type="html">&lt;div style="text-align: center;"&gt;&lt;span style="font-size:180%;"&gt;3&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.lifeprint.com/asl101/images-signs/easy.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://www.lifeprint.com/asl101/images-signs/easy.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;At my present job, I work on and/or deal with large, complicated systems, which typically have the following characteristics:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;custom hardware  &lt;/li&gt;&lt;li&gt;many machines &lt;/li&gt;&lt;li&gt;big iron (major processing power) hardware &lt;/li&gt;&lt;li&gt;millions of lines of code &lt;/li&gt;&lt;li&gt;requires several companies working together for years to produce&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;To make this level of complexity manageable I've produced a lot of tools to help visualize, control, test, and automate while having a lot of fun in the process. Looking back, there is a common philosophy, 3EZ that drives what I do in these situations.  As I've also successly applied this philosophy to much less complicated projects, I think 3EZ has a wide range of applicability.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;3EZ&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;When dealing with a system, the following 3 things should be easy:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;It shoud be &lt;span style="font-weight: bold; font-style: italic;"&gt;easy&lt;/span&gt; to understand the state of the system, what is currently going on, or what has happened. We're talking quick, easy and effective visualization, to use the word that Ward gave me, both real time and post mortem. &lt;/li&gt;&lt;li&gt;It should be &lt;span style="font-weight: bold; font-style: italic;"&gt;easy&lt;/span&gt; control behavior.  You be able to pefrom common tasks easily, i.e.  1 click, or a menu entrie.  Editing a bunch of config files and restarting does not qualify for easy.  You should have a high level control without ever having to restart the system&lt;/li&gt;&lt;li&gt;It should be &lt;span style="font-weight: bold; font-style: italic;"&gt;easy&lt;/span&gt; to automate complex behavior and test the system.  In the previous point I talk about easy things being easy.  Complicated things should also be easy.  Once you can automate things in a complex system, you give yourself the abilty for automated self verifying test.  When automation and self verified test are easy, they are likely to happen more often.&lt;/li&gt;&lt;/ol&gt;(updated: cleaned up the wording a bit)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-2263110399074684080?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AZDnnP10BPKqQ4AOvnajZoBXJdE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AZDnnP10BPKqQ4AOvnajZoBXJdE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AZDnnP10BPKqQ4AOvnajZoBXJdE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AZDnnP10BPKqQ4AOvnajZoBXJdE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/JHaq2NBAkqI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/2263110399074684080/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=2263110399074684080" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/2263110399074684080?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/2263110399074684080?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/JHaq2NBAkqI/3-easy-3ez.html" title="3 Easy (3EZ)" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2007/06/3-easy-3ez.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQERXo5cSp7ImA9WB5SFkU.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-6320366488241872651</id><published>2007-06-06T13:53:00.000-07:00</published><updated>2007-06-12T13:31:44.429-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-06-12T13:31:44.429-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ward" /><category scheme="http://www.blogger.com/atom/ns#" term="visualization" /><category scheme="http://www.blogger.com/atom/ns#" term="simplicity" /><title>W.O.W  Wisdom of Ward</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://research.microsoft.com/workshops/SCS2004/pictures/cunningham.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://research.microsoft.com/workshops/SCS2004/pictures/cunningham.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;So I got the chance to spend a little time with my hero &lt;a href="http://en.wikipedia.org/wiki/Ward_Cunningham"&gt;Ward Cunningham&lt;/a&gt; at RailsConf 07.  For those unfamiliar, here's a &lt;a href="http://jutopia.tirsen.com/articles/2007/05/18/ward-quits-again"&gt;bit from Jon Tirsen&lt;/a&gt;, who's basic sentiment about Ward's accomplishments mirror my own.&lt;br /&gt;&lt;br /&gt;Ward has been called what I would call the "master of simplicity."  Martin Fowler has described something similar as &lt;a href="http://www.martinfowler.com/bliki/Wardish.html"&gt;Wardish&lt;/a&gt;.  I've come across this sort of description from several &lt;a href="http://www.peterprovost.org/archive/2005/10/17/8707.aspx"&gt;people &lt;/a&gt;when describing their interactions with Ward.  Since I &lt;a href="http://funkworks.blogspot.com/2005/10/pair-programming-with-ward.html"&gt;last saw Ward at OOPSLA 2005&lt;/a&gt;, I will say I have experienced profound benefits from a number of very subtle things that Ward shared with me.&lt;br /&gt;&lt;br /&gt;I'd like to share some entertaining moments that occurred while having lunch with Ward on the last day of RailsConf.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt; Visualization&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Ward had summed up in a single word something that has been a recurrent theme in my work for many years.  We were talking about making heads or tails of complicated things.  In typical Ward fashion, he said something along the lines of "It's all about &lt;span style="font-style: italic;"&gt;visualizing &lt;/span&gt;the information."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Visualization&lt;/span&gt;.  Wow, that's the 1 word I'd been looking for but not found.&lt;br /&gt;&lt;br /&gt;Not having the 1 word, I'd use several sentences trying to describe how complicated things could be visualized (didn't necessarily use that word at the time) easily or efficiently.  I knew what the problem was, how I would solve it, how the solution would greatly benefit all involved.  Try as I might, I could at best reduce it to a sentence for each part.  Ultimately, I ended up saying too much, causing folks to miss out on the essence of what I was describing.  Now I can tell people how I will allow them to quickly easily visualize the complex activity they're struggling with.&lt;br /&gt;&lt;br /&gt;I'm sure you might be thinking, &lt;span style="font-weight: bold; font-style: italic;"&gt;"Duh!"&lt;/span&gt;, but that's a typical reaction to a Wardish suggestion.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Ward's Secret to Visualization&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Are html tables (FIT anyone?).  If you can quickly tabularize the data in question, you can quickly and easily display it on any platform.&lt;br /&gt;&lt;br /&gt;One of my "secrets to visualization" is quite similar, and involves "real time dynamic workflow diagrams" that show where you are, and where you'll be going.  Definitely involves a bit more work than html tables,  but has served me well.&lt;br /&gt;&lt;br /&gt;Ward did talk about a cool variation of his table approach involving producing swimlanes for test data.  It was cool and gave me ideas to use. I hope to write about it when I get the chance to investigate it in more depth.  I did suggest to him, that they could use swimlanes as real time status rather than just after the fact analysis, which he thought was a good idea.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Lots of testing going on with Rails&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Ward made the comment the huge difference between RailsConf and the Pacific Northwest Software Quality Conference(PNSQC).  He contrasted the atmosphere where at RailsConf testing is thoroughly ingrained in the culture. There is lot of testing and excitement about testing. At the PNSQC it's much gloomier with themes of how hard/painful testing is and how you can't get people to test (Should sound familiar to non Agile groups).  I believe he summed it up with something like "There more testing here than at PNSQC which is supposed to be about testing."&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;I know FIT!&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Ward and I shared the lunch table w/3 RailConf attendees who didn't know was.  Following the previously mentioned testing talk, one of the attendees started to mention success he had with using FIT to make testing more accessible.  He asked if we were familiar with &lt;a href="http://fit.c2.com/"&gt;FIT&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In true down to earth, low key, Ward-like fashion, Ward said, "I know something about FIT".&lt;br /&gt;&lt;br /&gt;Gotta love that about Ward.  So down to earth and approachable and never one to toot his own horn.&lt;br /&gt;&lt;br /&gt;I felt it appropriate to let them know that Ward was the inventor of FIT.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The artist formerly known as Ward&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;The immediate followup to the above moment&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Attendee&lt;/span&gt;: "Oh, I see, so your last name is..."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ward&lt;/span&gt;: "Cunningham, But I like to just go by Ward"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Me&lt;/span&gt;:  "You know, one name, like Bono, Madonna, Cher, Prince..."&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Cool Stuff&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;So Ward gave us a demo of his swimlane with hyperlinks visualzation.I t was part of the testing for the app that the Eclipse Foundation uses to track the workflow of their process.  I'll try to write a bit about this as I get the chance.  Really cool stuff that I will certainly borrow ideas from.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-6320366488241872651?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dx0md6K6qhdA6TMJYOJ-QAcyWpM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dx0md6K6qhdA6TMJYOJ-QAcyWpM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dx0md6K6qhdA6TMJYOJ-QAcyWpM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dx0md6K6qhdA6TMJYOJ-QAcyWpM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/3V4klmrMQ4k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/6320366488241872651/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=6320366488241872651" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/6320366488241872651?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/6320366488241872651?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/3V4klmrMQ4k/wow-wisdom-of-ward.html" title="W.O.W  Wisdom of Ward" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2007/06/wow-wisdom-of-ward.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQCQnwzeip7ImA9WBFaFkk.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-1270397421635122072</id><published>2007-05-20T00:57:00.000-07:00</published><updated>2007-05-20T01:06:03.282-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-05-20T01:06:03.282-07:00</app:edited><title>Simply having a wonderful RailsConf time</title><content type="html">Apologies to Sir Paul McCartney on raiding his line...&lt;br /&gt;&lt;br /&gt;So it's late the 2nd to last night of RailsConf and I figured I should just put in a good word or two.  So RailsConf has exploded to 1600 person cutoff (which sold out in very few days) from say 180 people at RubyConf 05, and I have to say, it's kept much of the quality and intimacy of it's RubyConf roots.&lt;br /&gt;&lt;br /&gt;Good presentations, interesting entertainment -- a ZeFrank keynote which had the highest humor density of any talk I've ever seen to  the "sleazy marching band" they had for lunch, to cool parties in pubs with free as in free beer, beer.  Plenty of movers and shakers to be around to talk to, old faces, new faces, it's all good.  I don't go to all that many tech conferences but I have to wonder if they're all as good as the Ruby and Rails conferences.&lt;br /&gt;&lt;br /&gt;I've been fortunate to be around a number of really great conversations about the most edge stuff, and it's all quite rewarding. &lt;br /&gt;&lt;br /&gt;Forrest&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-1270397421635122072?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mFQqWOyglT02GpccYfjFDzWGIU4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mFQqWOyglT02GpccYfjFDzWGIU4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mFQqWOyglT02GpccYfjFDzWGIU4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mFQqWOyglT02GpccYfjFDzWGIU4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/Gh-1G7r-ixw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/1270397421635122072/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=1270397421635122072" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/1270397421635122072?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/1270397421635122072?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/Gh-1G7r-ixw/simply-having-wonderful-railsconf-time.html" title="Simply having a wonderful RailsConf time" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2007/05/simply-having-wonderful-railsconf-time.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQNQHk9fip7ImA9WxVTEE4.&quot;"><id>tag:blogger.com,1999:blog-16908486.post-5213225040932194115</id><published>2007-05-15T12:26:00.000-07:00</published><updated>2008-12-23T03:56:31.766-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-23T03:56:31.766-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="presentations lessig hardt takahashi" /><title>Lessig Hardt style for kids</title><content type="html">So I helped put together a presentation for my son's presentation on the Aye-Aye (he's in montessori kindergarten).  I naturally took techniques I've been developing for the Lessig/Hardt/Takahashi style that I've been favoring for a while.&lt;br /&gt;&lt;br /&gt;It turned out quite well I think.  Seems to read like a small kid's book.  Seems to me that the same sorts of things you'll do to catch and keep the attention of adults applies to kids, and vice versa.  The combination of very few but the right words, copious and appropriate imagery and flow applies to it all.&lt;br /&gt;&lt;br /&gt;Forrest&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16908486-5213225040932194115?l=funkworks.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mpUKqykEgCRtI4dqfO8fCFZV914/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mpUKqykEgCRtI4dqfO8fCFZV914/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mpUKqykEgCRtI4dqfO8fCFZV914/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mpUKqykEgCRtI4dqfO8fCFZV914/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PuttingTheFunIntoFunkworks/~4/2so393z-9n8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://funkworks.blogspot.com/feeds/5213225040932194115/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=16908486&amp;postID=5213225040932194115" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/5213225040932194115?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/16908486/posts/default/5213225040932194115?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/PuttingTheFunIntoFunkworks/~3/2so393z-9n8/lessig-hardt-style-for-kids.html" title="Lessig Hardt style for kids" /><author><name>Forrest Chang</name><uri>http://www.blogger.com/profile/04290038091668118139</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://funkworks.blogspot.com/2007/05/lessig-hardt-style-for-kids.html</feedburner:origLink></entry></feed>

