<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6447842370303639082</id><updated>2011-10-18T17:46:03.592-07:00</updated><category term='virtualization'/><category term='funny'/><category term='bugs'/><category term='comics'/><category term='web applications'/><category term='jira'/><category term='gnu'/><category term='photos'/><category term='OS X'/><category term='software development'/><category term='atlassian'/><category term='jiradev'/><category term='fisheye'/><category term='user group'/><category term='jdiff'/><category term='agile'/><category term='git'/><category term='python'/><category term='consulting'/><category term='builds'/><category term='family'/><category term='oreilly'/><category term='windows'/><category term='openembedded'/><category term='unicode'/><category term='practical development environments'/><category term='scrabble'/><category term='bitbake'/><category term='preprocessor'/><category term='confluence'/><category term='emacs'/><category term='reviews'/><category term='personal'/><category term='java'/><category term='licenses'/><category term='jsp'/><category term='music'/><category term='ssh'/><category term='customware'/><category term='ipkg'/><category term='hacks'/><category term='pragmatics'/><category term='wandisco'/><category term='o&apos;reilly'/><category term='mac mini'/><category term='braille'/><category term='history'/><category term='version control'/><category term='command line'/><category term='remedy'/><category term='plugins'/><category term='fusion'/><category term='gmail'/><category term='subversion'/><category term='bugzilla'/><category term='atlascamp'/><title type='text'>Consulting Toolsmiths - Matt Doar</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default?start-index=101&amp;max-results=100'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>101</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-6392025100012414207</id><published>2011-10-07T14:34:00.000-07:00</published><updated>2011-10-07T14:34:45.969-07:00</updated><title type='text'>Curiosity and Control</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I've also been thinking about why some people write code and some don't. I think there is indeed the creative aspect, and that's often expressed in other kinds of creative efforts. But there's also the aspect of curiosity about the software that we use. &lt;br /&gt;&lt;br /&gt;Some people &lt;i&gt;really&lt;/i&gt; like to know how things work, including their software. It seems to me that this is connected to a desire to control one's environment. So perhaps part of coding is about being control?&lt;br /&gt;&lt;br /&gt;I must see what &lt;a href="http://en.wikipedia.org/wiki/Computer_Power_and_Human_Reason"&gt;Computer Power and Human Reason&lt;/a&gt; has to say about this.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-6392025100012414207?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/6392025100012414207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=6392025100012414207' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6392025100012414207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6392025100012414207'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2011/10/curiosity-and-control.html' title='Curiosity and Control'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-1159720000981627232</id><published>2011-10-07T14:32:00.000-07:00</published><updated>2011-10-07T14:32:39.692-07:00</updated><title type='text'>Life is Diff and Patch, Diff and Patch</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;There are two common Unix tools named 'diff' and 'patch'. Diff tells you what the difference is between two files. Patch takes what diff told you and merges those differences (aka changes) to another file. Now every tool I've used in the last twenty years has its own need for diff and patch functionality. Consider:&lt;br /&gt;&lt;br /&gt;Word or text documents - show me what's changed, aka 'track changes'. Merge (patch) text from one document to another&lt;br /&gt;&lt;br /&gt;Java API - what changed between two versions of an API&lt;br /&gt;&lt;br /&gt;JIRA (the issue tracker) - show me what's new in this bug, merge this configuration to another instance of JIRA&lt;br /&gt;&lt;br /&gt;So diff and patch seems to be a common theme of what I do for a living. But life is also diff and patch at some level - see what's different between two people and merge those differences to another generation of people. There's more in this analogy than I can get into words right now, I think.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-1159720000981627232?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/1159720000981627232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=1159720000981627232' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1159720000981627232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1159720000981627232'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2011/10/life-is-diff-and-patch-diff-and-patch.html' title='Life is Diff and Patch, Diff and Patch'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-22042084762328905</id><published>2011-09-16T10:18:00.000-07:00</published><updated>2011-09-16T10:18:15.832-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Accounting for Bugs in Agile Development</title><content type='html'>There's always some &lt;a href="http://www.infoq.com/news/2011/09/bug-fixes-velocity"&gt;discussion&lt;/a&gt; about how to account for the time spent fixing bugs in a project. I think it helps to view bugs as incomplete features, as in:&lt;br /&gt;&lt;br /&gt;"I expected the feature to behave like this, but instead it behaves like that"&lt;br /&gt;&lt;br /&gt;So the time spent fixing bugs can be measured in exactly the same way that features can be measured.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-22042084762328905?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/22042084762328905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=22042084762328905' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/22042084762328905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/22042084762328905'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2011/09/accounting-for-bugs-in-agile.html' title='Accounting for Bugs in Agile Development'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-1693305528856471417</id><published>2011-09-02T15:29:00.000-07:00</published><updated>2011-09-02T15:29:56.397-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='customware'/><title type='text'>Joining CustomWare</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-iqEZQpawpKQ/TmFYABjZPkI/AAAAAAAAA8o/pNP7tn3dKt4/s1600/toolsmith_cake.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="320" width="240" src="http://1.bp.blogspot.com/-iqEZQpawpKQ/TmFYABjZPkI/AAAAAAAAA8o/pNP7tn3dKt4/s320/toolsmith_cake.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;My status at CustomWare has changed from subcontractor to a permanent employee. We celebrated with a surprise ice-cream cake with "Chief Toolsmith" iced onto it. I suspect that's something that people are rarely asked to write on a cake.&lt;br /&gt;&lt;br /&gt;Thanks for the welcome!&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-1693305528856471417?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/1693305528856471417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=1693305528856471417' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1693305528856471417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1693305528856471417'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2011/09/joining-customware.html' title='Joining CustomWare'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-iqEZQpawpKQ/TmFYABjZPkI/AAAAAAAAA8o/pNP7tn3dKt4/s72-c/toolsmith_cake.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-5771594596212146573</id><published>2011-03-26T13:08:00.000-07:00</published><updated>2011-03-26T13:08:01.935-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>The Incomplete Image</title><content type='html'>I find it remarkable how the same piece of music can touch me deeply at one time and yet barely affect me at another. The recording hasn't changed, so it must be me. This ties into the idea that art is not just what is created by another, but also depends how it is received at a certain time.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lyrics.wikia.com/Michelle_Shocked:4/4_Troubadour_(The_Incomplete_Image)"&gt;That's all&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-5771594596212146573?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/5771594596212146573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=5771594596212146573' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/5771594596212146573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/5771594596212146573'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2011/03/incomplete-image.html' title='The Incomplete Image'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-2029207897926071894</id><published>2011-03-09T18:14:00.000-08:00</published><updated>2011-03-09T18:14:59.128-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><title type='text'>On Anonymous Bugs</title><content type='html'>Anonymity is a wonderful thing for many serious matters in this world. But posting unexceptional comments anonymously on a bug (or webpage) because you just can't be bothered to fill in your name is not wonderful. It just makes the anonymous author appear to lazy to register. And then the person reading the comment thinks less of the comment because it was made anonymously.&lt;br /&gt;&lt;br /&gt;It's not just what you say, it's how you say it.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-2029207897926071894?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/2029207897926071894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=2029207897926071894' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/2029207897926071894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/2029207897926071894'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2011/03/on-anonymous-bugs.html' title='On Anonymous Bugs'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-585103974731807887</id><published>2011-03-09T16:06:00.000-08:00</published><updated>2011-03-09T16:06:22.480-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><title type='text'>Filing a bug doesn't fix a bug</title><content type='html'>"I filed this bug a year ago and it isn't fixed yet".&lt;br /&gt;"Other bugs were more important than your bug"&lt;br /&gt;"But, but, *I* filed it!" (tantrum follows)&lt;br /&gt;&lt;br /&gt;I'm always surprised by the number of people who think that that a bug should automatically be fixed just because they bothered to file it. All that can be expected is that the reporter is thanked, the bug is looked at, and possibly moved to the next stage of its life. That might be closure or marking as ready for more work.&lt;br /&gt;&lt;br /&gt;A better approach is for the project to explain prominently how their bugs are triaged and how limited their resources are. Details of how to provide more cash resources and what that buys is also helpful.&lt;br /&gt;&lt;br /&gt;~Matt&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-585103974731807887?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/585103974731807887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=585103974731807887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/585103974731807887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/585103974731807887'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2011/03/filing-bug-doesnt-fix-bug.html' title='Filing a bug doesn&apos;t fix a bug'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-7909325902502757707</id><published>2010-11-29T14:19:00.000-08:00</published><updated>2010-11-29T14:19:57.932-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>What if Christmas became a world-changing event again?</title><content type='html'>I came across the &lt;a href="http://www.adventconspiracy.org/"&gt;Advent Conspiracy&lt;/a&gt; today and I like it. And its ideas can be applied to any special day that has become poisoned by profit.&lt;br /&gt;&lt;br /&gt;"What was once a time to celebrate the birth of a savior has somehow turned into a season of stress, traffic jams, and shopping lists.&lt;br /&gt;&lt;br /&gt;And when it's all over, many of us are left with presents to return, looming debt that will take months to pay off, and this empty feeling of missed purpose. Is this what we really want out of Christmas?&lt;br /&gt;&lt;br /&gt;What if Christmas became a world-changing event again?"&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-7909325902502757707?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/7909325902502757707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=7909325902502757707' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7909325902502757707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7909325902502757707'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/11/what-if-christmas-became-world-changing.html' title='What if Christmas became a world-changing event again?'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-227385434585847451</id><published>2010-11-09T15:56:00.000-08:00</published><updated>2010-11-09T15:56:13.195-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='family'/><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>Word for the day: Disintermediation</title><content type='html'>From &lt;a href="http://en.wikipedia.org/wiki/Disintermediation"&gt;Wikipedia&lt;/a&gt;: &lt;i&gt;the removal of intermediaries in a supply chain: "cutting out the middleman"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I've been working as a JIRA specialist for some larger consulting businesses recently and this matter has come up in discussion a few times. I'm glad to see there's a nice long word for such a nasty practice.  It's a sensitive matter for everyone but I naturally err on the side of caution, even if I've had existing business with the same customer that is now using the other consulting business.&lt;br /&gt;&lt;br /&gt;I wonder if I can get my 14-year old to use it correctly in class. I reckon it would make her English teacher's day.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-227385434585847451?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/227385434585847451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=227385434585847451' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/227385434585847451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/227385434585847451'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/11/word-for-day-disintermediation.html' title='Word for the day: Disintermediation'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-9096546692482286807</id><published>2010-10-29T11:28:00.000-07:00</published><updated>2010-10-29T11:28:34.840-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='family'/><title type='text'>Because it is awesome!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_tWiBHHTQAEM/TMsPtSENgKI/AAAAAAAAA6w/ke69uH5gGo8/s1600/kus_it_is_osum.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/_tWiBHHTQAEM/TMsPtSENgKI/AAAAAAAAA6w/ke69uH5gGo8/s200/kus_it_is_osum.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;"Why did you bring it to share?"&lt;br /&gt;"kus it is osum."&lt;br /&gt;&lt;br /&gt;A standard part of US education is show-and-tell. Some classes have the children fill in a form before bringing something in, both to encourage their writing and stem the flow. My 6-year old Luke found a chunk of crystal and filled in a form. His quick and simple dude-style answer to the question "why?"&amp;nbsp;was a lovely explanation of the wonders of our world.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-9096546692482286807?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/9096546692482286807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=9096546692482286807' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/9096546692482286807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/9096546692482286807'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/10/because-it-is-awesome.html' title='Because it is awesome!'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_tWiBHHTQAEM/TMsPtSENgKI/AAAAAAAAA6w/ke69uH5gGo8/s72-c/kus_it_is_osum.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-8962275189618131795</id><published>2010-10-28T11:06:00.000-07:00</published><updated>2010-10-28T11:06:26.372-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Another job that I have more respect for, the more I know of it</title><content type='html'>&lt;u&gt;Gear Designers&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Some clever people at NASA put together a &lt;a href="http://www.google.com/url?url=http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/20020070912_2002115489.pdf&amp;amp;rct=j&amp;amp;sa=U&amp;amp;ei=T7nJTP3LDoaEtgPB0rCoCw&amp;amp;ved=0CBoQFjAC&amp;amp;sig2=aDrMcCWiRSAg7_memugsoQ&amp;amp;q=20020070912_2002115489.pdf&amp;amp;usg=AFQjCNH5RNaeefzYPl6YB6X5Y74yTUX7GQ"&gt;document&lt;/a&gt; describing what goes into making a &lt;a href="http://en.wikipedia.org/wiki/Gear"&gt;gear&lt;/a&gt;. The tooth shape and material questions I was aware of from my undergraduate days, but their calculations about just how different lubricants work around complicated shapes, expected gear lifetimes and dynamic force calculations are impressive. And it's all pretty modern knowledge apparently, mostly since the 1920's.&lt;br /&gt;&lt;br /&gt;After reading it I'm amazed that helicopters don't crash more often!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_tWiBHHTQAEM/TMm56SJngtI/AAAAAAAAA6s/vuPzW7ZdbXE/s1600/gearing.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_tWiBHHTQAEM/TMm56SJngtI/AAAAAAAAA6s/vuPzW7ZdbXE/s320/gearing.png" width="293" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-8962275189618131795?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/8962275189618131795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=8962275189618131795' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8962275189618131795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8962275189618131795'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/10/another-job-that-i-have-more-respect.html' title='Another job that I have more respect for, the more I know of it'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_tWiBHHTQAEM/TMm56SJngtI/AAAAAAAAA6s/vuPzW7ZdbXE/s72-c/gearing.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-4277571814057289180</id><published>2010-10-25T13:18:00.000-07:00</published><updated>2010-10-25T13:18:55.675-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>I signed an oath</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_tWiBHHTQAEM/TMXlAV3lMlI/AAAAAAAAA6o/zIyk3f9UTPg/s1600/Oath+of+Non-Allegiance.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_tWiBHHTQAEM/TMXlAV3lMlI/AAAAAAAAA6o/zIyk3f9UTPg/s1600/Oath+of+Non-Allegiance.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://alistair.cockburn.us/"&gt;Alistair Cockburn&lt;/a&gt; is a well-known programmer who is fed up with&lt;br /&gt;infighting in software development. So he came up with an &lt;a href="http://alistair.cockburn.us/Oath+of+Non-Allegiance"&gt;Oath of Non-Allegiance&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"I promise not to exclude from consideration any idea based on its source, but to consider ideas across schools and heritages in order to find the ones that best suit the current situation."&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Makes sense to me, and for more than software development.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-4277571814057289180?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/4277571814057289180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=4277571814057289180' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/4277571814057289180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/4277571814057289180'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/10/i-signed-oath.html' title='I signed an oath'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_tWiBHHTQAEM/TMXlAV3lMlI/AAAAAAAAA6o/zIyk3f9UTPg/s72-c/Oath+of+Non-Allegiance.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-2256656751509803902</id><published>2010-09-28T17:39:00.000-07:00</published><updated>2010-09-28T17:39:45.268-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Hidden depths, and Things That Will Never Be</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_tWiBHHTQAEM/TKKKI17k8VI/AAAAAAAAA6g/6dmqnvrIiAs/s1600/desert_island.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_tWiBHHTQAEM/TKKKI17k8VI/AAAAAAAAA6g/6dmqnvrIiAs/s1600/desert_island.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;A favorite &lt;a href="http://xkcd.com/731"&gt;xkcd&lt;/a&gt; cartoon and some things that will never be.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Unicode"&gt;Unicode&lt;/a&gt; book that is both concise and useful&lt;/li&gt;&lt;li&gt;A protocol with "Simple" in its title that has remained simple -&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Simple_Network_Management_Protocol"&gt;SNMP&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol"&gt;SMTP&lt;/a&gt;, &lt;a href="http://diglib.stanford.edu:8091/~testbed/doc2/SDLIP/"&gt;SDLIP&lt;/a&gt;&amp;nbsp;are just a few that have not.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Revision_control"&gt;Revision control&lt;/a&gt; merges with absolutely no conflicts&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;~Matt&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-2256656751509803902?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/2256656751509803902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=2256656751509803902' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/2256656751509803902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/2256656751509803902'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/09/hidden-depths-and-things-that-will.html' title='Hidden depths, and Things That Will Never Be'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_tWiBHHTQAEM/TKKKI17k8VI/AAAAAAAAA6g/6dmqnvrIiAs/s72-c/desert_island.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-6600994737610021963</id><published>2010-09-24T09:24:00.000-07:00</published><updated>2010-09-24T09:24:45.269-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='family'/><title type='text'>Appearances and Expectations</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://t3.gstatic.com/images?q=tbn:avkzNk9U8AznlM:http://www.foodutensils.com.au/images/414N36205_Spaghetti_Server_Nylon.jpg&amp;amp;t=1" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="147" src="http://t3.gstatic.com/images?q=tbn:avkzNk9U8AznlM:http://www.foodutensils.com.au/images/414N36205_Spaghetti_Server_Nylon.jpg&amp;amp;t=1" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;I've found that a &lt;a href="http://www.google.com/images?q=spaghetti+server&amp;amp;um=1&amp;amp;ie=UTF-8&amp;amp;source=og&amp;amp;sa=N&amp;amp;hl=en&amp;amp;tab=wi&amp;amp;biw=1666&amp;amp;bih=876"&gt;spaghetti server&lt;/a&gt; is a great tool for scratching my back. We have one in the kitchen for food and different one on a shelf elsewhere. Of course, children like to copy their parents so 6 year-old Luke scratches his back just like his Dad, which I find rather endearing.&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;But sitting at the dinner table a few nights ago, he went very quiet, his eyes widened and asked "Dad,&amp;nbsp;&lt;i&gt;why&lt;/i&gt; is your back scratcher in the pasta?".&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;Just because two things look the same, they aren't necessarily the same.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-6600994737610021963?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/6600994737610021963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=6600994737610021963' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6600994737610021963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6600994737610021963'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/09/appearances-and-expectations.html' title='Appearances and Expectations'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-5166045879035014015</id><published>2010-09-20T17:28:00.000-07:00</published><updated>2010-09-20T17:28:42.651-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Jobs that I have more respect for, the more I see of them</title><content type='html'>&lt;u&gt;Statisticians&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;99% of everything written about statistics is wrong, including this. So when people really do understand how to set up proper clinical trials or fit their data to useful distributions, I'm impressed. What most of us learned in school and university really wasn't enough to understand the traps for the unwary and naive in this area.&lt;br /&gt;&lt;br /&gt;Statisticians also get to use some great words like &lt;a href="http://en.wikipedia.org/wiki/Homoscedasticity"&gt;homoscedasticity&lt;/a&gt;&amp;nbsp;and &lt;a href="http://en.wikipedia.org/wiki/Kurtosis"&gt;kurtosis&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;~Matt&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-5166045879035014015?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/5166045879035014015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=5166045879035014015' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/5166045879035014015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/5166045879035014015'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/09/jobs-that-i-have-more-respect-for-more.html' title='Jobs that I have more respect for, the more I see of them'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-3606940384674183625</id><published>2010-09-16T12:26:00.000-07:00</published><updated>2010-09-16T12:26:11.643-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><category scheme='http://www.blogger.com/atom/ns#' term='atlascamp'/><title type='text'>Here comes AtlasCamp 2010!</title><content type='html'>&lt;a href="http://evbdn.eventbrite.com/s3-s3/eventlogos/102539/631233035.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://evbdn.eventbrite.com/s3-s3/eventlogos/102539/631233035.png" /&gt;&lt;/a&gt;If you develop or maintain &lt;a href="http://www.atlassian.com/"&gt;Atlassian&lt;/a&gt; products (&lt;a href="http://www.atlassian.com/sofware/jira"&gt;JIRA&lt;/a&gt;, Confluence, etc), this event is a great place to be (October 11th - 13th, California, $200).&lt;br /&gt;&lt;br /&gt;I'm looking forward to it again with a relish I rarely find for many group events.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.atlascamp.com/"&gt;http://www.atlascamp.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-3606940384674183625?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/3606940384674183625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=3606940384674183625' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/3606940384674183625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/3606940384674183625'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/09/here-comes-atlascamp-2010.html' title='Here comes AtlasCamp 2010!'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-4492982911678780781</id><published>2010-09-15T13:31:00.000-07:00</published><updated>2010-09-15T13:31:56.931-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='jiradev'/><title type='text'>JIRA articles are now at jiradev.blogspot.com</title><content type='html'>I've started a new blog for JIRA-related posts over at &lt;a href="http://jiradev.blogspot.com"&gt;jiradev.blogspot.com&lt;/a&gt;. Future technical JIRA content will appear there instead of in this blog&lt;br /&gt;&lt;br /&gt;~Matt&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-4492982911678780781?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/4492982911678780781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=4492982911678780781' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/4492982911678780781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/4492982911678780781'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/09/jira-articles-are-now-at.html' title='JIRA articles are now at jiradev.blogspot.com'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-4564800754138444553</id><published>2010-09-01T11:27:00.001-07:00</published><updated>2010-09-01T11:27:24.021-07:00</updated><title type='text'>My Review of Practical Development Environments</title><content type='html'>&lt;div class="hreview"&gt;&lt;div class="item"&gt;&lt;p&gt;&lt;a href="http://oreilly.com/catalog/9780596007966"&gt;Originally submitted at O'Reilly&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;p style="margin-top:0"&gt;&lt;p&gt;Everyone wants a good technical environment for developing their software, and &lt;i&gt;Practical Development Environments&lt;/i&gt; contains helpful guidelines for how to create and maintain a great development environment. It discusses some of the current tools that are available, covering different areas...                            &lt;/p&gt;&lt;/div&gt;&lt;a href="http://oreilly.com/catalog/9780596007966" style="display: none;" class="url fn"&gt;&lt;span class="fn"&gt;Practical Development Environments&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br clear="left"&gt;&lt;p&gt;&lt;strong class="summary"&gt;Good advice, tools sections dated now&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;By &lt;strong&gt;Matt Doar&lt;/strong&gt; from &lt;strong&gt;San Jose, CA&lt;/strong&gt; on &lt;strong&gt;&lt;abbr title="201091T1200-0800" class="dtreviewed" style="border: none; text-decoration: none;"&gt;9/1/2010&lt;/abbr&gt;&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&lt;div style="margin: 0.5em 0; height: 15px; width: 83px; background-image: url(http://images.powerreviews.com/images/stars_small.gif); background-position: 0px -144px;" class="prStars prStarsSmall"&gt;&amp;nbsp;&lt;/div&gt;&lt;/p&gt;&lt;div style="display: none"&gt;&lt;span class="rating"&gt;4&lt;/span&gt;out of 5&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Pros: &lt;/strong&gt;Concise, Well-written, Accurate&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Cons: &lt;/strong&gt;Partly outdated&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Best Uses: &lt;/strong&gt;Intermediate, Toolsmith, Novice&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Describe Yourself: &lt;/strong&gt;Consultant, Sys Admin, Developer, Author, Toolsmith&lt;/p&gt;&lt;p style="margin-top:1em" class="description"&gt;I'm the author and the book still works as intended. Each chapter has a section on using software development tools (version control, builds, bug trackers etc). The second half of each chapter refers to tools in each area that were current five years ago, so these parts have aged correctly. &lt;br xmlns:pr="xalan://com.pufferfish.core.beans.xmlbuilders.xsl.Functions"&gt;&lt;br&gt;I've run a consulting business for the past four years based around many of the ideas in this book and find that, for the most part, they are working well for my clients.&lt;br&gt;&lt;br&gt;~Matt&lt;/p&gt;&lt;p style="margin-top:0.5em"&gt;(&lt;a href="http://www.powerreviews.com/legal/terms_of_use.html" rel="license"&gt;legalese&lt;/a&gt;)&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-4564800754138444553?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/4564800754138444553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=4564800754138444553' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/4564800754138444553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/4564800754138444553'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/09/my-review-of-practical-development.html' title='My Review of Practical Development Environments'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-6160141048279062713</id><published>2010-09-01T11:04:00.000-07:00</published><updated>2010-09-01T11:18:41.356-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='practical development environments'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='family'/><title type='text'>Action, Expectation, Observation</title><content type='html'>I remember writing some parts of &lt;a href="http://www.oreilly.com/catalog/practicalde"&gt;Practical Development Environments&lt;/a&gt; vividly, despite the sleep deprivation that writing a book and having a new child will produce. One such section summarizes what goes into a good bug report:&lt;br /&gt;&lt;br /&gt;The three key points to bear in mind when creating a bug report should be:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;How to reproduce the bug, as precisely as possible, and how often this will make the bug appear&lt;/li&gt;&lt;br /&gt;&lt;li&gt;What should have happened, at least in your opinion&lt;/li&gt;&lt;br /&gt;&lt;li&gt;What actually happened, or at least as much information as you have recorded&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;I still like what I wrote. And now I think it's good advice for other situations. For example,&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Action: I was taking my brother's toy from him. It was his new toy.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Expectation: He should have let me take it because he wasn't using it anymore&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Observation: He hit me!&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Maybe I'll get it printed on my next batch of business cards: &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Action, Expectation,  Observation&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;~Matt&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-6160141048279062713?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/6160141048279062713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=6160141048279062713' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6160141048279062713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6160141048279062713'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/09/action-expectation-observation.html' title='Action, Expectation, Observation'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-5016834648539171363</id><published>2010-08-18T18:27:00.000-07:00</published><updated>2010-08-19T12:01:43.041-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scrabble'/><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Distribution of Scrabble word scores</title><content type='html'>If you take each word in &lt;code&gt;/usr/share/dict/words&lt;/code&gt; (OSX 10.5) that is 7 letters or fewer and can be created with the &lt;a href="http://en.wikipedia.org/wiki/Scrabble_letter_distributions"&gt;standard set of Scrabble letters&lt;/a&gt;, and calculate its simple value in &lt;a href="http://www.scrabble.com/"&gt;Scrabble&lt;/a&gt;, then the histogram of the data looks like this.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;1 | 10&lt;br /&gt;2 | 52&lt;br /&gt;3  | 240&lt;br /&gt;4       | 753&lt;br /&gt;5             | 1541&lt;br /&gt;6                         | 3061&lt;br /&gt;7                                       | 4744&lt;br /&gt;8                                                   | 6220&lt;br /&gt;9                                                             | 7462&lt;br /&gt;10                                                         | 7043&lt;br /&gt;11                                                    | 6439&lt;br /&gt;12                                           | 5276&lt;br /&gt;13                                 | 4061&lt;br /&gt;14                        | 2959&lt;br /&gt;15                 | 2078&lt;br /&gt;16              | 1713&lt;br /&gt;17        | 979&lt;br /&gt;18      | 714&lt;br /&gt;19    | 414&lt;br /&gt;20   | 255&lt;br /&gt;21  | 171&lt;br /&gt;22 | 90&lt;br /&gt;23 | 47&lt;br /&gt;24 | 32&lt;br /&gt;25 | 22&lt;br /&gt;26 | 5&lt;br /&gt;27 | 6&lt;br /&gt;28 | 3&lt;br /&gt;29 | 1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The most valuable word? "jackbox".&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-5016834648539171363?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/5016834648539171363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=5016834648539171363' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/5016834648539171363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/5016834648539171363'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/08/distribution-of-scrabble-word-scores.html' title='Distribution of Scrabble word scores'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-7155765693785682024</id><published>2010-08-17T11:47:00.001-07:00</published><updated>2010-08-17T11:53:33.081-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gmail'/><title type='text'>Marking ALL mail in gmail as read</title><content type='html'>To mark all Google mail as read without having to page through lots of old messages&lt;br /&gt;&lt;br /&gt;1. In the search box, type "is:unread", no quotes&lt;br /&gt;2. In the dropdown that looks like a checkbox (yes, it does) select "All"&lt;br /&gt;3. A link will magically appear that says "Select all conversations that match this search". When clicked, it selects all the messages that are not shown as well as the ones that are shown.&lt;br /&gt;4. Finally, select "Mark All as Read" from wherever it is for you and wait a few minutes.&lt;br /&gt;&lt;br /&gt;(via http://www.woodwardweb.com/technology/marking_all_mai.html)&lt;br /&gt;&lt;br /&gt;It turns out that the search doesn't select messages in your Drafts folder.&lt;br /&gt;&lt;br /&gt;~Matt&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-7155765693785682024?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/7155765693785682024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=7155765693785682024' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7155765693785682024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7155765693785682024'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/08/marking-all-mail-in-gmail-as-read.html' title='Marking ALL mail in gmail as read'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-1961438174314704187</id><published>2010-08-16T15:56:00.001-07:00</published><updated>2010-08-16T16:16:28.627-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>A fine and confusing error message from Java</title><content type='html'>&lt;pre&gt;&lt;br /&gt;public String myFirstMethod() {&lt;br /&gt;    String result = "Hello world";&lt;br /&gt;    return result;;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A straightforward piece of code that rudely produces a compile-time error "unreachable statement at line 3". "What's so unreachable about that line?" you might ask. Those experienced in the way of Java compilers simply smile and point out the double semi-colon. Accordingly to the compiler, there is an (empty) Java statement between the two semi-colons and it is never reached because the methods always returns before it reaches it. &lt;br /&gt;&lt;br /&gt;If I had written writing that error messages, I might have made it say "double semi-colon on line 3".&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-1961438174314704187?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/1961438174314704187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=1961438174314704187' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1961438174314704187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1961438174314704187'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/08/fine-and-confusing-error-message-from.html' title='A fine and confusing error message from Java'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-5971957191260950877</id><published>2010-08-12T16:56:00.001-07:00</published><updated>2010-08-17T09:40:58.821-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pragmatics'/><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>What price is a company's reputation worth? Answer: $4600</title><content type='html'>&lt;blockquote&gt;A reputation once broken may possibly be repaired, but the world will always keep their eyes on the spot where the crack was. &lt;br /&gt; - &lt;a href="http://en.wikipedia.org/wiki/Joseph_Hall_(Maine)"&gt;Joseph Hall&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;I've been lucky for the last four years as a consultant to not have any major problems with getting paid. So the story of the first client to behave really badly is worth telling. &lt;br /&gt;&lt;br /&gt;Back in January 2010 I contracted with an organisation to do $12,000 worth of consulting work for them over the next few months.  After two months I sent an intermediate invoice for $9,600 for the work completed so far. Around then the organisation decided due to a strategy change that they no longer wanted the work that I was doing. So they simply went quiet on me and wouldn't acknowledge any email or phone calls. I didn't know what was going on, just got a bit annoyed at the late payment and lack of communication.&lt;br /&gt;&lt;br /&gt;Last week I dropped by their offices to sort this out. I received a rather chilly reception and was offered $5,000 as a final payment. Fed up with the five month delay and their lack of communication, I took the offer. &lt;br /&gt;&lt;br /&gt;So I lost $4,600, and they lost all my trust and respect. When future clients ask me about that particular organisation's products, I'll probably say "tech is ok, but &lt;span style="font-style:italic;"&gt;terrible&lt;/span&gt; business practices". Would I work for the same organization again? I'm a pragmatist so probably yes, but with 50% payment or more up-front.&lt;br /&gt;&lt;br /&gt;Companies spend thousands of dollars on trade shows and advertising then throw the resulting gains away by treating another business badly. Crazy.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-5971957191260950877?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/5971957191260950877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=5971957191260950877' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/5971957191260950877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/5971957191260950877'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/08/what-price-is-companys-reputation-worth.html' title='What price is a company&apos;s reputation worth? Answer: $4600'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-8283272621407922865</id><published>2010-07-02T15:34:00.000-07:00</published><updated>2010-07-02T15:47:07.803-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><title type='text'>How irritated customers obey a power law</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_tWiBHHTQAEM/TC5pbn4l78I/AAAAAAAAA4o/a-itMYey48k/s1600/jiravotes.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 259px;" src="http://4.bp.blogspot.com/_tWiBHHTQAEM/TC5pbn4l78I/AAAAAAAAA4o/a-itMYey48k/s320/jiravotes.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5489440919094947778" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are over 4000 open issues about &lt;a href="http://www.atlassian.com/software/jira/"&gt;JIRA&lt;/a&gt; that people have voted for. The &lt;a href="http://jira.atlassian.com/browse/JRA#selectedTab=com.atlassian.jira.plugin.system.project%3Apopularissues-panel"&gt;most popular&lt;/a&gt; vote has 592 votes but most issues have zero votes. I found a suprisingly good line to fit the data with a correlation coefficient 0.9882, if Excel is to be believed. I'm not sure that I actually believe in predicting what people vote for, but I guess this is one way of measuring your progress is how the coefficients of the predictor change over time. The flatter the line, the better job you are doing of evenly spreading out customers' irritation with your product.&lt;br /&gt;&lt;br /&gt;As of July 2010, the coefficient of irriration for JIRA is -0.65.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-8283272621407922865?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/8283272621407922865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=8283272621407922865' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8283272621407922865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8283272621407922865'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/07/how-irritated-customers-are-obeys-power.html' title='How irritated customers obey a power law'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_tWiBHHTQAEM/TC5pbn4l78I/AAAAAAAAA4o/a-itMYey48k/s72-c/jiravotes.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-8192461528380609642</id><published>2010-07-01T10:56:00.000-07:00</published><updated>2010-07-01T11:13:29.531-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='funny'/><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><title type='text'>ASCII art in log files and showing my age</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_tWiBHHTQAEM/TCzXHQAQgdI/AAAAAAAAA4g/hOCR70crKCQ/s1600/jira_line_noise.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://4.bp.blogspot.com/_tWiBHHTQAEM/TCzXHQAQgdI/AAAAAAAAA4g/hOCR70crKCQ/s320/jira_line_noise.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5488998565412897234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What &lt;span style="font-style:italic;"&gt;is&lt;/span&gt; that? Well, let me tell you. It's &lt;span style="font-style:italic;"&gt;supposed&lt;/span&gt; to be some &lt;a href="http://en.wikipedia.org/wiki/ASCII_art"&gt;ASCII art&lt;/a&gt; that my new-fangled &lt;a href="http://www.atlassian.com/software/jira/"&gt;JIRA&lt;/a&gt; bug tracker spits out into its log file at start up. It's &lt;span style="font-style:italic;"&gt;supposed&lt;/span&gt; to serve some useful purpose. It fails (fails, I tell you) because when you view ASCII art that is longer than 80 characters in a terminal (this is a log file, remember) that text art just wraps around and resembles &lt;a href="http://en.wikipedia.org/wiki/Noise_(electronics)"&gt;line noise&lt;/a&gt;. Yes, line noise like they used to have in the last century.&lt;br /&gt;&lt;br /&gt;What's that? You think ASCII art is cool? Well so do I, in it's place. Which isn't my darn log files. What am I going to do about it?&lt;a href="http://jira.atlassian.com/browse/JRA-21428"&gt; I'll tell you, I'll show 'em&lt;/a&gt;! Now get off my lawn.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-8192461528380609642?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/8192461528380609642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=8192461528380609642' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8192461528380609642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8192461528380609642'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/07/ascii-art-in-log-files-and-showing-my.html' title='ASCII art in log files and showing my age'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_tWiBHHTQAEM/TCzXHQAQgdI/AAAAAAAAA4g/hOCR70crKCQ/s72-c/jira_line_noise.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-550306592050264405</id><published>2010-06-25T13:35:00.000-07:00</published><updated>2010-06-25T13:57:04.183-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='funny'/><title type='text'>My wife as a sea star</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_tWiBHHTQAEM/TCUXuCWMHcI/AAAAAAAAA4Y/13x88io4tYk/s1600/seastar_k.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://4.bp.blogspot.com/_tWiBHHTQAEM/TCUXuCWMHcI/AAAAAAAAA4Y/13x88io4tYk/s320/seastar_k.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5486817800692178370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vacation Bible School ended today with the inimitable &lt;a href="http://www.bananaslugstringband.com/"&gt;Banana Slug String Band&lt;/a&gt;. Katherine was their guest Sea Star. It opened up a whole new echinodermic side of her character to me. She certainly was moving around.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-550306592050264405?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/550306592050264405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=550306592050264405' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/550306592050264405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/550306592050264405'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/06/my-wife-as-sea-star.html' title='My wife as a sea star'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_tWiBHHTQAEM/TCUXuCWMHcI/AAAAAAAAA4Y/13x88io4tYk/s72-c/seastar_k.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-5439036352861189568</id><published>2010-06-22T12:00:00.000-07:00</published><updated>2010-06-22T12:05:12.562-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='funny'/><title type='text'>Drawing a line in the sand</title><content type='html'>&lt;a href="http://www.joelonsoftware.com"&gt;Joel Spolsky&lt;/a&gt; writing on his &lt;a href="http://www.joelonsoftware.com/items/2010/06/22.html"&gt;latest project &lt;/a&gt; concludes with&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"Area 51 is not for everyone. If you don’t know what it’s for, or why it’s going to work, or you can’t figure it out, it’s not, actually for you."&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Snark programmer, snark!&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-5439036352861189568?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/5439036352861189568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=5439036352861189568' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/5439036352861189568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/5439036352861189568'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/06/drawing-line-in-sand.html' title='Drawing a line in the sand'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-6643502316226664760</id><published>2010-06-17T11:47:00.001-07:00</published><updated>2010-06-17T11:59:21.790-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gnu'/><category scheme='http://www.blogger.com/atom/ns#' term='licenses'/><title type='text'>GNU license complexity</title><content type='html'>The compatibility table at the &lt;a href="http://www.gnu.org/licenses/gpl-faq.html#AllCompatibility"&gt;GNU License FAQ&lt;/a&gt; makes my head swim. If this were for the different versions of an application, it would be taken out and shot.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tWiBHHTQAEM/TBpv7qqC8UI/AAAAAAAAA4Q/ZpSfS7BK1MI/s1600/gpl_compatibility.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 294px;" src="http://1.bp.blogspot.com/_tWiBHHTQAEM/TBpv7qqC8UI/AAAAAAAAA4Q/ZpSfS7BK1MI/s320/gpl_compatibility.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5483818567130607938" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-6643502316226664760?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/6643502316226664760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=6643502316226664760' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6643502316226664760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6643502316226664760'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/06/gnu-license-complexity.html' title='GNU license complexity'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_tWiBHHTQAEM/TBpv7qqC8UI/AAAAAAAAA4Q/ZpSfS7BK1MI/s72-c/gpl_compatibility.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-825514886682372653</id><published>2010-06-04T08:49:00.001-07:00</published><updated>2010-06-04T09:08:33.560-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='builds'/><category scheme='http://www.blogger.com/atom/ns#' term='funny'/><title type='text'>I'll not spoil the punchline</title><content type='html'>Too true.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef0133ed964b97970b-800wi"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 800px; height: 1133px;" src="http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef0133ed964b97970b-800wi" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://geekandpoke.typepad.com/geekandpoke/2010/05/how-to-become-invaluable.html"&gt;Geek and Poke&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-825514886682372653?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/825514886682372653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=825514886682372653' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/825514886682372653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/825514886682372653'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/06/too-true.html' title='I&apos;ll not spoil the punchline'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-8025988943189888186</id><published>2010-04-29T12:13:00.000-07:00</published><updated>2010-05-14T10:15:18.697-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><category scheme='http://www.blogger.com/atom/ns#' term='user group'/><title type='text'>One Bug, Multiple Branches</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.oreillynet.com/network/2005/12/09/graphics/one_bug_multi_rel.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 460px; height: 160px;" src="http://www.oreillynet.com/network/2005/12/09/graphics/one_bug_multi_rel.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I enjoyed presenting and discussing some new ideas about how to use JIRA to track bugs in different branches along with their associated builds. This was all at the April &lt;a href="http://confluence.atlassian.com/display/AUG/SFAUG+Meeting+April+2010"&gt;San Francisco Atlassian User Group&lt;/a&gt; last night, kindly hosted by &lt;a href="http://www.atlassian.com"&gt;Atlassian&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My idea is to create a new issue type named "Build" and then create a new build issue for every build. Ordinary bugs in JIRA can then have regular JIRA links named "Present in Build" and "Absent from Build" connecting them to the specific builds in which they are found or fixed. The interesting part is that if you link the Build issues to other Build issues, you get a tree of related builds such as the diagram above that you can then use to deduce which bugs are present in any given release, and also which releases a given bug is likely to be in. Useful information that is rarely available in current issue trackers.&lt;br /&gt;&lt;br /&gt;My presentation is available via &lt;a href="http://docs.google.com/present/edit?id=0AagzITL_ZQMrZGhncWZ4bjlfNzY4Z2Z6aGRoZnQ&amp;hl=en"&gt;Google Docs&lt;/a&gt;. Feedback welcome, as are beta testers for the ideas in JIRA.&lt;br /&gt;&lt;br /&gt;Verification code for &lt;a href="http://www.empireavenue.com"&gt;Empire Avenue&lt;/a&gt;: EAVB_KMCAYMVSLW&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-8025988943189888186?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/8025988943189888186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=8025988943189888186' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8025988943189888186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8025988943189888186'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/04/one-bug-multiple-branches.html' title='One Bug, Multiple Branches'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-7727885634860695780</id><published>2010-04-26T09:28:00.000-07:00</published><updated>2010-04-26T09:38:51.094-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Software Engineering and Academia</title><content type='html'>Bertrand Meyer has an &lt;a href="http://bertrandmeyer.com/2010/04/25/the-other-impediment-to-software-engineering-research/"&gt;excellent article&lt;/a&gt; about why academic computer science has a smaller impact than other academic disciplines do in their respective fields. As he puts it, "academic research has had its part, honorable but limited."&lt;br /&gt;&lt;br /&gt;"Researchers in experimental physics or mechanical engineering employ technicians: often highly qualified personnel who help researchers set up the experiments and process results. In software engineering the equivalent would be programmers, software engineers, testers, technical writers; in the environments that I have seen, getting financing for such positions from a research agency is impossible."&lt;br /&gt;&lt;br /&gt;"The only software we can produce, if we limit ourselves to official guidelines, is demo software. ... many of us work around the restrictions ... by spending considerable time away from research on programming and maintenance tasks that would be far more effectively handled by specialized personnel. The question indeed is efficiency."&lt;br /&gt;&lt;br /&gt;For me, that's what a software toolsmith does.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-7727885634860695780?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/7727885634860695780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=7727885634860695780' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7727885634860695780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7727885634860695780'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/04/software-engineering-and-academia.html' title='Software Engineering and Academia'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-8568319807717809915</id><published>2010-04-08T14:28:00.000-07:00</published><updated>2010-04-08T14:44:16.856-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='command line'/><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><title type='text'>How to change your OSX terminal color for ssh sessions</title><content type='html'>Sometimes I have lots of terminal windows open for ssh sessions to multiple machines. It can all be a bit confusing even if I use the remote machine name in the shell prompt. So I got terminal colorization working for me with help from &lt;a href="http://stackoverflow.com/questions/157959/how-do-i-make-the-apple-terminal-window-auto-change-colour-scheme-when-i-ssh-to-a"&gt;here&lt;/a&gt; and &lt;a href="http://akrabat.com/php/osx-terminal-colours"&gt;here&lt;/a&gt;. &lt;br /&gt;There is a default color for all screens that are using ssh and you can also customize the colors for different remote machines. When you end the ssh session, the terminal returns to black on white.&lt;br /&gt;&lt;br /&gt;This is for OS X because it uses the osascript command to change the colors but the rest of the shell script should be just fine for Unix.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ cat /usr/local/bin/ssh&lt;br /&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;# Color the OSX Terminal app according the hostname used in ssh&lt;br /&gt;# Assumes you log in with a simple "ssh myuserid@remotehost"&lt;br /&gt;# Place in a directory such as /usr/local/bin that is before the real ssh location&lt;br /&gt;&lt;br /&gt;# The value of whatever was after the @ in the command&lt;br /&gt;HOSTNAME=`echo $@ | sed s/.*@//`&lt;br /&gt;&lt;br /&gt;set_bg () {&lt;br /&gt;  osascript -e "tell application \"Terminal\" to set background color of window 1 to $1"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;set_text () {&lt;br /&gt;  osascript -e "tell application \"Terminal\" to set normal text color of window 1 to $1"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# Return to black text on white background&lt;br /&gt;on_exit () {&lt;br /&gt;    # echo exited&lt;br /&gt;  set_bg "{65535,65535,65535}"&lt;br /&gt;  set_text "{0, 0, 0}"&lt;br /&gt;}&lt;br /&gt;trap on_exit EXIT&lt;br /&gt;&lt;br /&gt;# My color names&lt;br /&gt;#  green   10000,40000,40000 &lt;br /&gt;#  blue    10000,20000,60000 &lt;br /&gt;#  orange  60000,40000,00000 &lt;br /&gt;#  red     60000,00000,00000 &lt;br /&gt;#  yellow  60000,60000,40000 &lt;br /&gt;&lt;br /&gt;case $HOSTNAME in&lt;br /&gt;  fisheye) set_bg "{60000,60000,40000}" ; set_text  "{0,0,0}" ;;&lt;br /&gt;  jira|jira2) set_bg "{10000,40000,40000}" ; set_text  "{0,0,0}" ;;&lt;br /&gt;# unused colors follow&lt;br /&gt;#   blue) set_bg "{10000,20000,60000}" ; set_text  "{65535,65535,65535}" ;;&lt;br /&gt;#  orange) set_bg "{60000,40000,00000}" ; set_text  "{0,0,0}" ;;&lt;br /&gt;#  red) set_bg "{60000,00000,00000}" ; set_text  "{0,0,0}" ;;&lt;br /&gt;#  yellow) set_bg "{60000,60000,40000}" ; set_text  "{0,0,0}" ;;&lt;br /&gt;#  gray) set_bg "{60000,57000,55000}" ; set_text  "{0,0,0}" ;;&lt;br /&gt;  *) set_bg "{60000,57000,55000}" ; set_text  "{0,0,0}" ;;&lt;br /&gt;esac&lt;br /&gt;&lt;br /&gt;/usr/bin/ssh "$@"&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-8568319807717809915?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/8568319807717809915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=8568319807717809915' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8568319807717809915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8568319807717809915'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/04/how-to-change-your-osx-terminal-color.html' title='How to change your OSX terminal color for ssh sessions'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-6289211106542892253</id><published>2010-03-31T14:33:00.000-07:00</published><updated>2010-03-31T14:37:27.532-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>There's a way to do that in emacs</title><content type='html'>Given a number of lines of text such as &lt;br /&gt;&lt;code&gt;&lt;br /&gt;foopy charlie&lt;br /&gt;foo  bravo&lt;br /&gt;food alpha&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;and you want to sort them by their second field so they end up like&lt;br /&gt;&lt;code&gt;&lt;br /&gt;food alpha&lt;br /&gt;foo  bravo&lt;br /&gt;foopy charlie&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;the right emacs incantation is:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;C-u 2 M-x sort-fields&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;That's all.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-6289211106542892253?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/6289211106542892253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=6289211106542892253' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6289211106542892253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6289211106542892253'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/03/theres-way-to-do-that-in-emacs.html' title='There&apos;s a way to do that in emacs'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-6965169137489847248</id><published>2010-03-29T09:19:00.001-07:00</published><updated>2010-03-29T09:30:05.634-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Michelle Shocked concert</title><content type='html'>Katherine and I went on our yearly pilgrimage to &lt;a href="http://www.moesalley.com/"&gt;Moe's Alley&lt;/a&gt; to see &lt;a href="http://www.michelleshocked.com"&gt;Michelle Shocked&lt;/a&gt; last Saturday. Steve Wozniak was there too, quietly enjoying this tiny "Reggae Pub". As ever, Michelle was truly amazing. Her energy, her humility and that soaring voice. Mostly her older songs, but with lots of local guests and backing from a band lead by &lt;a href="http://www.jamesnash.com"&gt;James Nash&lt;/a&gt; who just &lt;i&gt;smoked&lt;/i&gt; that guitar!&lt;br /&gt;&lt;br /&gt;As Michelle says of herself,&lt;br /&gt;&lt;blockquote&gt;I've been through some dark times but I've experienced joy too. Now that joy can't be suppressed.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-6965169137489847248?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/6965169137489847248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=6965169137489847248' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6965169137489847248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6965169137489847248'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/03/michelle-shocked-concert.html' title='Michelle Shocked concert'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-3487018394764661333</id><published>2010-03-18T08:47:00.000-07:00</published><updated>2010-03-18T09:04:45.386-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='o&apos;reilly'/><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='practical development environments'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>97 Things Every Programmer Should Know</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tWiBHHTQAEM/S6JMYrSyQzI/AAAAAAAAA3c/y5vJIL0FSZI/s1600-h/97things_cover.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://1.bp.blogspot.com/_tWiBHHTQAEM/S6JMYrSyQzI/AAAAAAAAA3c/y5vJIL0FSZI/s320/97things_cover.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5450002485893808946" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Another useful book in the "97 Things" series from O'Reilly has been published, this time for programmers. My contribution is "How To Use A Bug Tracker". There are more details at &lt;a href="http://oreilly.com/catalog/9780596809492"&gt;O'Reilly&lt;/a&gt; and &lt;a href="http://www.amazon.com/Things-Every-Programmer-Should-Know/dp/0596809484"&gt;Amazon&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This book was created by each person adding their contributions to a &lt;a href="http://programmer.97things.oreilly.com/wiki/index.php/97_Things_Every_Programmer_Should_Know"&gt;Wiki&lt;/a&gt;, where it was edited and discussed. The whole process worked really well due to the editor, Kevlin Henney.&lt;br /&gt;&lt;br /&gt;p.s. My photo on the cover is four rows down, third from the left, just in case you're looking.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-3487018394764661333?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/3487018394764661333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=3487018394764661333' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/3487018394764661333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/3487018394764661333'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/03/97-things-every-programmer-should-know.html' title='97 Things Every Programmer Should Know'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_tWiBHHTQAEM/S6JMYrSyQzI/AAAAAAAAA3c/y5vJIL0FSZI/s72-c/97things_cover.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-3977404459740722522</id><published>2010-03-17T10:41:00.000-07:00</published><updated>2010-03-17T11:48:01.137-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Ambiguity everywhere</title><content type='html'>I use &lt;a href="http://www.gnu.org/software/emacs"&gt;emacs&lt;/a&gt; for writing code, which is considered a bit old-school by many Java programmers. One of them recently commented that "watching someone use emacs is like watching ballet". Was that a compliment or not? "Graceful" and "efficient" come to mind, but maybe he just doesn't like watching ballet.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-3977404459740722522?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/3977404459740722522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=3977404459740722522' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/3977404459740722522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/3977404459740722522'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/03/ambiguity-everywhere.html' title='Ambiguity everywhere'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-7263574079543730293</id><published>2010-03-10T10:19:00.000-08:00</published><updated>2010-03-10T10:30:39.775-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>One of those mornings</title><content type='html'>6am. Our eldest child woke me from my slumbers with "Daaaad, the toilet's overflowed!". Turns out it had thoroughly clogged itself late last night and then a leaky tank valve had allowed water to gradually drip into the bowl overnight. Ugg. However, the rather questionable design of many American low-flush toilets is not the point of this post. In the process of clearing the clog I realized that this was where an education comes in useful. I asked her to flush another toilet in the house which created a partial vacuum in the sewer line and helped my efforts with the plunger. It worked wonderfully! A discussion of the physics involved ensued, but the best bit was seeing my daughter continue to believe that her Dad could fix anything.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-7263574079543730293?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/7263574079543730293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=7263574079543730293' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7263574079543730293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7263574079543730293'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2010/03/one-of-those-mornings.html' title='One of those mornings'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-1909927737275795769</id><published>2009-12-23T12:55:00.000-08:00</published><updated>2009-12-23T13:04:27.211-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Which letters are never doubled in English words?</title><content type='html'>There is now a &lt;a href="http://www.visca.com/regexdict"&gt;handy website&lt;/a&gt; for searching an English dictionary using &lt;a href="http://en.wikipedia.org/wiki/Regular_expression"&gt;regular expressions&lt;/a&gt;. It appears that the only letters that are never doubled are 'j', 'q', and 'x'. Mind you, you have to go to Uzbekistan to get their unit of currency which is named a "tyyn". &lt;br /&gt;&lt;br /&gt;Perhaps I should make up a word such as "sajjaqquixx" to fix the missing ones. I'm not sure what it means yet, and neither is Google. Suggestions welcome.&lt;br /&gt;&lt;br /&gt;Happy Christmas,&lt;br /&gt;&lt;br /&gt;~Matt&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-1909927737275795769?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/1909927737275795769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=1909927737275795769' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1909927737275795769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1909927737275795769'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/12/which-letters-are-never-doubled-in.html' title='Which letters are never doubled in English words?'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-864337005652071893</id><published>2009-12-08T18:16:00.000-08:00</published><updated>2009-12-08T18:18:21.852-08:00</updated><title type='text'>Testing, testing</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_tWiBHHTQAEM/Sx8IwD_e7HI/AAAAAAAAA2U/cENokitmhaM/s1600-h/1225_Pine_Ave_1948.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://4.bp.blogspot.com/_tWiBHHTQAEM/Sx8IwD_e7HI/AAAAAAAAA2U/cENokitmhaM/s320/1225_Pine_Ave_1948.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5413054898920942706" /&gt;&lt;/a&gt;&lt;br /&gt;This log post should also appear on my Facebook page, along with a picture of our house as it was in 1948.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-864337005652071893?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/864337005652071893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=864337005652071893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/864337005652071893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/864337005652071893'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/12/testing-testing.html' title='Testing, testing'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_tWiBHHTQAEM/Sx8IwD_e7HI/AAAAAAAAA2U/cENokitmhaM/s72-c/1225_Pine_Ave_1948.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-664151744026208527</id><published>2009-11-19T09:17:00.000-08:00</published><updated>2009-11-19T09:36:19.070-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comics'/><title type='text'>Christmas book ideas</title><content type='html'>I've recently read two different graphic novels that I've been very impressed by. I recommend both of them for smart teens and older.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Logicomix-Search-Truth-Apostolos-Doxiadis/dp/0747597200"&gt;Logicomix&lt;/a&gt;,  Apostolos Doxiadis and Christos Papadimitriou&lt;br /&gt;&lt;br /&gt;The story of Bertrand Russell and his mathematical (and other) passions. An entertaining story with enough of the history of logic to make me think. Beautiful art of Athens too.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/Grandville-Bryan-Talbot/dp/1595823972"&gt;Grandville&lt;/a&gt;, Bryan Talbot&lt;br /&gt;&lt;br /&gt;A well-written steampunk detective story using animals. But it's more than that, lots of references to all sorts of interesting things and people. The art is captivating and left me wanting more of it.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-664151744026208527?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/664151744026208527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=664151744026208527' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/664151744026208527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/664151744026208527'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/11/christmas-book-ideas.html' title='Christmas book ideas'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-826085589884903474</id><published>2009-10-27T16:44:00.001-07:00</published><updated>2009-11-17T09:21:37.620-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='ipkg'/><category scheme='http://www.blogger.com/atom/ns#' term='openembedded'/><category scheme='http://www.blogger.com/atom/ns#' term='bitbake'/><title type='text'>BitBake and reusing existing ipkg files</title><content type='html'>I've spent a few days helping a customer with &lt;a href="http://bitbake.berlios.de"&gt;BitBake&lt;/a&gt;, a python-based build tool for embedded systems. One of the distributions that uses BitBake is &lt;a href="http://www.openembedded.org/"&gt;OpenEmbedded&lt;/a&gt;, a "build-every-single-thing-from-source" Linux distro.&lt;br /&gt;&lt;br /&gt;The customer had a number of existing &lt;a href="http://en.wikipedia.org/wiki/Ipkg"&gt;ipkg&lt;/a&gt; packages and wanted to add them to the BitBake'd image. That turns out to be an undocumented use case, so here's the information to save other people the time we spent.&lt;br /&gt;&lt;br /&gt;For a target architecture of armv5te, the recipe file for a package with an ipkg file named mypackage-1.2.0.3-1_armv5te.ipk looks like the code below.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;DESCRIPTION = "My Package"&lt;br /&gt;DEPENDS = ""&lt;br /&gt;LICENSE = "GPL"&lt;br /&gt;&lt;br /&gt;PN = "mypackage"&lt;br /&gt;PV = "1.2.0.3"&lt;br /&gt;PR = "1"&lt;br /&gt;PACKAGES = "${PN}"&lt;br /&gt;&lt;br /&gt;# Just fetch and place the ipkg in the correct place to build the rootfs.&lt;br /&gt;&lt;br /&gt;# As used in openembedded/classes/image.bbclass via rootfs_ipk.bbclass&lt;br /&gt;PACKAGE_INSTALL_append = ${DEPLOY_DIR_IPK}/armv5te/${P}_armv5te.ipk&lt;br /&gt;&lt;br /&gt;SRC_URI = "\&lt;br /&gt;  http://ipkg-repository.example.com/subdir/${P}_armv5te.ipk \&lt;br /&gt;  "&lt;br /&gt;&lt;br /&gt;do_unpack() {&lt;br /&gt;  echo "Null unpack method"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;do_patch() {&lt;br /&gt;  echo "Null patch method"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;do_configure() {&lt;br /&gt;  echo "Null configure method"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;do_compile() {&lt;br /&gt;  echo "Null compile method"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;do_stage() {&lt;br /&gt;  echo "Null stage method"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;do_install() {&lt;br /&gt;  oenote Creating directory ${WORKDIR}/install/${PN}&lt;br /&gt;  # A directory is needed for each member of PACKAGES&lt;br /&gt;  mkdir -p ${WORKDIR}/install/${PN}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;do_package() {&lt;br /&gt;  echo "Null package method"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;do_package_stage() {&lt;br /&gt;  echo "Null package_stage method"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;do_distribute_sources() {&lt;br /&gt;  echo "Null distribute_sources method"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;do_package_write() {&lt;br /&gt;  oenote Copying the downloaded ipkg package from ${DL_DIR} to\&lt;br /&gt; ${DEPLOY_DIR_IPK}/armv5te&lt;br /&gt;  install ${DL_DIR}/${P}_armv5te.ipk ${DEPLOY_DIR_IPK}/armv5te&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Version: BitBake 1.8.3&lt;br /&gt;&lt;br /&gt;It doesn't look like much by itself, but the work behind it was, er, significant. BitBake and OpenEmbedded have a good number of layers, moderate documentation and great power.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Other tips:&lt;br /&gt;&lt;br /&gt;Don't execute BitBake in a subdirectory or it will rebuild the world in a new tmp directory there.&lt;br /&gt;&lt;br /&gt;OpenEmbedded apparently doesn't check the return code from the ipkg install commands, so if your files aren't appearing in your image (rootfs) directory, then check their dependencies or run the explicit ipkg command that can be found in the relevant run* command file.&lt;br /&gt;&lt;br /&gt;If ipkg asks for user input about overwriting a configuration file, then the OpenEmbedded do_rootfs() function will hang and you will need to kill both the ipkg and bitbake commands manually.&lt;br /&gt;&lt;br /&gt;See &lt;a href="http://bec-systems.com/web/content/view/79/9/"&gt;http://bec-systems.com/web/content/view/79/9/&lt;/a&gt; for more information about adding new packages to images.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-826085589884903474?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/826085589884903474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=826085589884903474' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/826085589884903474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/826085589884903474'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/10/bitbake-and-reusing-existing-ipkg-files.html' title='BitBake and reusing existing ipkg files'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-8687426282107901336</id><published>2009-10-15T15:11:00.001-07:00</published><updated>2010-06-17T10:31:45.836-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>There's no such thing as a unique name</title><content type='html'>Reading an old post by James Clark about &lt;a href="http://blog.jclark.com/2007/12/thai-personal-names.html"&gt;Thai personal names&lt;/a&gt;, I wondered how many different names I am addressed by. Surprisingly, I came up with eight.&lt;br /&gt;&lt;br /&gt;John Matthew Simon Doar (birth certificate)&lt;br /&gt;Matthew Doar (school name, birth family usage)&lt;br /&gt;Matt Doar (work name)&lt;br /&gt;Matthew Baginski Doar (family name after marriage)&lt;br /&gt;Matthew B. Doar (shortened family name used for publications)&lt;br /&gt;Matthew Baginski (used by systems that can't handle two words in a family name)&lt;br /&gt;J. Matthew Doar (occasional form letters)&lt;br /&gt;&lt;br /&gt;and strangest of all is the U.S. Immigration Service who refer to me as "John M. Doar" and once forced me to make up a signature for it on the spot! All I really want these days is to be &lt;a href="http://xkcd.com/about/"&gt;unique enough for Google&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-8687426282107901336?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/8687426282107901336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=8687426282107901336' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8687426282107901336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8687426282107901336'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/10/reading-old-post-by-james-clark-about.html' title='There&apos;s no such thing as a unique name'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-8037811958909275714</id><published>2009-10-09T12:39:00.000-07:00</published><updated>2009-10-09T12:56:04.277-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='jsp'/><category scheme='http://www.blogger.com/atom/ns#' term='hacks'/><title type='text'>Handling large numbers of JIRA projects</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_tWiBHHTQAEM/Ss-U7xHGkAI/AAAAAAAAA2M/qRxpxcLQZow/s1600-h/categories.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 96px;" src="http://3.bp.blogspot.com/_tWiBHHTQAEM/Ss-U7xHGkAI/AAAAAAAAA2M/qRxpxcLQZow/s320/categories.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5390691033502093314" /&gt;&lt;/a&gt;&lt;br /&gt;Once you have a large number of projects in JIRA creating an issue can become a bit tedious, scrolling through the long list of projects to choose just the right one. JIRA (Enterprise edition) already provides &lt;a href="http://www.atlassian.com/software/jira/docs/v3.13/project_management.html"&gt;Project Categories&lt;/a&gt; that you can group projects into, so without further ado, here's a JSP hack to reduce the size of that list of projects by letting you select a project category first.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Installation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The modified file for JIRA 3.13 is &lt;a href="http://confluence.atlassian.com/download/attachments/170494153/createissue-start.jsp"&gt;createissue-start.jsp&lt;/a&gt; and replaces the file of the same name in your JIRA instance. There should be no need to restart JIRA. The usual disclaimers apply, drink responsibly, don't drive and derive etc.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-8037811958909275714?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/8037811958909275714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=8037811958909275714' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8037811958909275714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8037811958909275714'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/10/handling-large-numbers-of-jira-projects.html' title='Handling large numbers of JIRA projects'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_tWiBHHTQAEM/Ss-U7xHGkAI/AAAAAAAAA2M/qRxpxcLQZow/s72-c/categories.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-7445741389906704497</id><published>2009-10-09T12:21:00.000-07:00</published><updated>2009-10-09T12:35:50.249-07:00</updated><title type='text'>My first build tool question</title><content type='html'>&lt;a href="http://groups.google.com/group/gnu.misc.discuss/msg/6936de70faf3a494?dmode=source"&gt;&lt;br /&gt;gnu.misc.discuss&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The post above from me in August 1994 asking for help with gnumake reminds me that I never did learn how to use a build tool in college. Fifteen years later, I still don't know the answer to the question that I asked, but I do know that make is still not my favourite build tool.&lt;br /&gt;&lt;br /&gt;Still, at least the books about Make have improved with John Graham-Cumming's &lt;a href="http://www.lulu.com/content/2584447"&gt;GNU Make Unleashed&lt;/a&gt; and Robert Mecklenburg's &lt;a href="http://oreilly.com/catalog/9780596006105"&gt;Managing Projects with GNU Make, Third Edition&lt;/a&gt;. That "Third Edition" part is important.&lt;br /&gt;&lt;br /&gt;~Matt&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://covers.oreilly.com/images/9780596006105/cat.gif"&gt;&lt;img style="cursor: pointer; width: 180px; height: 236px;" src="http://covers.oreilly.com/images/9780596006105/cat.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://static.lulu.com/items/volume_63/2584000/2584447/1/preview/320_2584447.jpg?2584447-1212672714"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://static.lulu.com/items/volume_63/2584000/2584447/1/preview/320_2584447.jpg?2584447-1212672714"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 212px; height: 320px;" src="http://static.lulu.com/items/volume_63/2584000/2584447/1/preview/320_2584447.jpg?2584447-1212672714" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-7445741389906704497?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/7445741389906704497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=7445741389906704497' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7445741389906704497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7445741389906704497'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/10/my-first-build-tool-question.html' title='My first build tool question'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-5611054834992444159</id><published>2009-09-23T10:31:00.000-07:00</published><updated>2009-09-23T10:48:26.969-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='confluence'/><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><category scheme='http://www.blogger.com/atom/ns#' term='atlascamp'/><title type='text'>Should you go to AtlasCamp? Hint: yes!</title><content type='html'>This post is a friendly sales job for &lt;a href="http://blogs.atlassian.com/developer/2008/09/join_us_for_atlascamp.html"&gt;AtlasCamp&lt;/a&gt;, the Atlassian developers get-together that's happening &lt;span style="font-weight:bold;"&gt;October 21-23&lt;/span&gt; in &lt;a href="http://maps.google.com/?q=Half+Moon+Bay,+CA&amp;sll=37.0625,-95.677068&amp;sspn=23.875,57.630033&amp;ie=UTF8&amp;source=embed&amp;ll=37.479217,-122.361603&amp;spn=0.680039,1.170044&amp;z=10&amp;iwloc=A"&gt;Half Moon Ba&lt;/a&gt;y, California.&lt;br /&gt;&lt;br /&gt;Cons&lt;br /&gt;&lt;br /&gt;- Costs a bit of money this year ($200 instead of free)&lt;br /&gt;- er ...&lt;br /&gt;- that's it!&lt;br /&gt;&lt;br /&gt;Pros&lt;br /&gt;&lt;br /&gt;+ If your company depends on JIRA or Confluence and you've changed them somehow, this is the best place I've found for technical questions&lt;br /&gt;+ Friendly people who write useful code at this conference, not just vapid schmoozing&lt;br /&gt;+ Good presentations about what's changing in the products you depend on&lt;br /&gt;+ Plenty of opportunities to tell the core Atlassian developers and top management &lt;span style="font-style:italic;"&gt;exactly&lt;/span&gt; what you think of their products&lt;br /&gt;&lt;br /&gt;See you there.&lt;br /&gt;&lt;br /&gt;~Matt&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-5611054834992444159?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/5611054834992444159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=5611054834992444159' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/5611054834992444159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/5611054834992444159'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/09/should-you-go-to-atlascamp-hint-yes.html' title='Should you go to AtlasCamp? Hint: yes!'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-4122225079851677218</id><published>2009-09-03T10:41:00.000-07:00</published><updated>2009-09-03T10:54:05.019-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>She found it 13 years later</title><content type='html'>Some stuff from old web pages when "Lizi", aka Elizabeth Shardon Baginski Doar, was first born. And indeed she did find them, all by herself, just the other day. I'm not sure she exactly loved it, but it was certainly a surprise!&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;I was born October 14th 1996 and am much loved by my parents. I like not sitting still and asking "why?". Below is an excerpt from my first email.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;fuukyiki7z x z&gt;8jlj .l[&lt;br /&gt;&gt;'00 uyjkklglylewl;ghju7j &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;An interesting graph of contraction times during our daughter's birth. I think she'll love this page one day. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tWiBHHTQAEM/SqABkJWub6I/AAAAAAAAA2E/xPbiA760XWk/s1600-h/birth-time.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_tWiBHHTQAEM/SqABkJWub6I/AAAAAAAAA2E/xPbiA760XWk/s400/birth-time.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5377299675578527650" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-4122225079851677218?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/4122225079851677218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=4122225079851677218' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/4122225079851677218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/4122225079851677218'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/09/she-found-it-13-years-later.html' title='She found it 13 years later'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_tWiBHHTQAEM/SqABkJWub6I/AAAAAAAAA2E/xPbiA760XWk/s72-c/birth-time.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-418268307836869885</id><published>2009-08-27T17:22:00.000-07:00</published><updated>2009-08-27T17:37:36.900-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><title type='text'>Does this bug tracker make me look whiny?</title><content type='html'>I submitted a bug about &lt;a href="http://www.atlassian.com/software/jira/"&gt;JIRA&lt;/a&gt; to Atlassian recently and wondered who reported most of the bugs in their very public database. No surprise, about half of the ones in the last year are from Atlassian employees. &lt;br /&gt;&lt;br /&gt;Over the last three years, it's a tie between &lt;a href="http://www.linkedin.com/pub/neal-applebaum/0/99/99b"&gt;Neal Applebaum&lt;/a&gt; and Sergiy Lizenko (&lt;a href="http://ua.landsystems.com"&gt;ILS-Ukraine&lt;/a&gt;) who each submitted 81 issues, and myself trailing in third place with 39 issues.&lt;br /&gt;&lt;br /&gt;~Matt&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-418268307836869885?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/418268307836869885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=418268307836869885' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/418268307836869885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/418268307836869885'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/08/does-this-bug-tracker-make-me-look.html' title='Does this bug tracker make me look whiny?'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-8075716832199578659</id><published>2009-08-04T11:35:00.000-07:00</published><updated>2009-08-04T11:37:55.648-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><category scheme='http://www.blogger.com/atom/ns#' term='atlascamp'/><title type='text'>AtlasCamp 2009</title><content type='html'>&lt;a href="http://www.atlassian.com/about/events/atlascamp/"&gt;AtlasCamp&lt;/a&gt; is back, and it's moved to Half Moon Bay. It also costs something this year, but after the great time I had last year I'm looking forward to it.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-8075716832199578659?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/8075716832199578659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=8075716832199578659' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8075716832199578659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8075716832199578659'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/08/atlascamp-2009.html' title='AtlasCamp 2009'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-1200826350964560669</id><published>2009-07-22T15:11:00.000-07:00</published><updated>2009-07-22T15:22:58.124-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unicode'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python Unicode oddness</title><content type='html'>If you have a Python string with an invalid character for the current character set, then other characters may get removed unexpectedly. For instance:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; a = 'FOO\xe0BAR'&lt;br /&gt;&gt;&gt;&gt; print '%r' % a&lt;br /&gt;'FOO\xe0BAR'&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; print '%r' % unicode(a, 'utf8')&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt; File "&lt;stdin&gt;", line 1, in &lt;module&gt;&lt;br /&gt; File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/encodings/utf_8.py", line 16, in decode&lt;br /&gt;   return codecs.utf_8_decode(input, errors, True)&lt;br /&gt;UnicodeDecodeError: 'utf8' codec can't decode bytes in position 3-5: invalid data&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Fair enough, &lt;tt&gt;\xe0&lt;/tt&gt; isn't a valid utf8 character. But if I tell the decoder to just ignore any characters it doesn't understand, it also eats the "B" and "A" characters!&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; print '%r' % unicode(a, 'utf8', 'replace')&lt;br /&gt;u'FOO\ufffdR'&lt;br /&gt;&gt;&gt;&gt; print '%r' % unicode(a, 'utf8', 'ignore')&lt;br /&gt;u'FOOR'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That was unexpected. One day I'm sure someone will explain why it happens to me.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-1200826350964560669?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/1200826350964560669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=1200826350964560669' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1200826350964560669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1200826350964560669'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/07/python-unicode-oddness.html' title='Python Unicode oddness'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-149494918250003654</id><published>2009-07-01T16:43:00.001-07:00</published><updated>2009-07-01T17:05:55.874-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='jsp'/><category scheme='http://www.blogger.com/atom/ns#' term='hacks'/><title type='text'>Making it easier to maintain JIRA workflows</title><content type='html'>This is one for JIRA admins. &lt;br /&gt;&lt;br /&gt;I've had to track down a few problems recently that were related to fields not appearing on screens, especially when issues were changing their status. The cause turned out to be customized Transition Screens. A Transition Screen is the screen that is shown while you are moving from one status to another, and it's easy to forget which screen goes with each transition. &lt;br /&gt;&lt;br /&gt;Sure, you can click on each transition and look for which screen is being used, or you can look at the list of screens and see which transitions used each screen. However, as the number of transitions and screens begins to grow, workflows become harder to maintain. The precision hack shown here helps with this. Click on the image to enlarge and look at the "Transitions" column. Each line has had the text "with the screen "added. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_tWiBHHTQAEM/Skv1H9grJoI/AAAAAAAAA1k/rBogJr3JiPk/s1600-h/BetterWorkflowSteps.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 77px;" src="http://4.bp.blogspot.com/_tWiBHHTQAEM/Skv1H9grJoI/AAAAAAAAA1k/rBogJr3JiPk/s400/BetterWorkflowSteps.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5353642099179464322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When you view any JIRA workflow with the "View Workflow Steps" screen, the transitions between steps (statuses) now have their screen information shown as well. At a glance, you can now look at a single workflow and see which of your transitions have those troublesome custom transition screens.&lt;br /&gt;&lt;br /&gt;The file to change is &lt;pre&gt;atlassian-jira/secure/admin/views/workflow/viewworkflowsteps.jsp&lt;/pre&gt; and the modified version can be found &lt;a href="http://confluence.atlassian.com/download/attachments/170494153/viewworkflowsteps.jsp"&gt;here&lt;/a&gt;. This was tested with JIRA 3.13.2 and is also a good example of what you can do with JSP if you have to.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-149494918250003654?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/149494918250003654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=149494918250003654' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/149494918250003654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/149494918250003654'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/07/making-it-easier-to-maintain-jira.html' title='Making it easier to maintain JIRA workflows'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_tWiBHHTQAEM/Skv1H9grJoI/AAAAAAAAA1k/rBogJr3JiPk/s72-c/BetterWorkflowSteps.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-7612596237501817078</id><published>2009-06-23T10:27:00.000-07:00</published><updated>2009-06-23T10:44:04.281-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='remedy'/><title type='text'>Remedy - free the attachments!</title><content type='html'>I've inspected a lot of issue tracking databases in the last few months - JIRA, Bugzilla, TeamTrack, ClearQuest, Trac, GNATS and Remedy&lt;sup&gt;1&lt;/sup&gt; - but the one I want to consider in this post is Remedy (a.k.a. the "Remedy Action Request System", part of BMC Remedy Service Management from &lt;a href="http://www.bmc.com"&gt;BMC&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Remedy stores attached files in the database and compresses them to save space. That's fine, and they provide a compiled API library to talk to the running server application and extract and decompress the files. But if you're trying to get the data straight from the database, you're out of luck. Searching suggests that the file compression is some proprietary form of zlib but that's it. No source, no algorithm, nothing!&lt;br /&gt;&lt;br /&gt;If you're providing an API to extract the data, why not show the customers the source? I suppose they might want to hide changes in the compression algorithm from users, but I can handle seeing that. I'm all for using carefully constructed APIs but not at the cost of the data being locked into one database.&lt;br /&gt;&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt; I know, I know, you're thinking "wow, those toolsmiths sure do live life in the large!"&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-7612596237501817078?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/7612596237501817078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=7612596237501817078' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7612596237501817078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7612596237501817078'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/06/remedy-free-attachments.html' title='Remedy - free the attachments!'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-8429197347785901371</id><published>2009-04-29T12:39:00.000-07:00</published><updated>2009-04-29T12:44:49.451-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>I found a bolt-hole</title><content type='html'>I finally rented an office near home. The main things I needed were:&lt;br /&gt;&lt;br /&gt;* an internet connection&lt;br /&gt;* reasonable airconditioning and heating&lt;br /&gt;* peace and quiet&lt;br /&gt;&lt;br /&gt;The last item is why working at home isn't always as easy as one might imagine. And it's not just the kids!&lt;br /&gt;&lt;br /&gt;~Matt&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-8429197347785901371?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/8429197347785901371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=8429197347785901371' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8429197347785901371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8429197347785901371'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/04/i-found-bolt-hole.html' title='I found a bolt-hole'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-2598024800901215950</id><published>2009-04-01T10:06:00.000-07:00</published><updated>2009-04-01T10:26:44.799-07:00</updated><title type='text'>Names for Bug States</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_tWiBHHTQAEM/SdOjgTCfjjI/AAAAAAAAA08/zhdK5V5APRI/s1600-h/integer_states.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 218px; height: 59px;" src="http://2.bp.blogspot.com/_tWiBHHTQAEM/SdOjgTCfjjI/AAAAAAAAA08/zhdK5V5APRI/s400/integer_states.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5319775360116559410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There is an interesting discussion going on over in a &lt;a href="http://groups.google.com/group/mozilla.dev.planning/browse_thread/thread/a1ff5677d97b9ea6/2e79a56064b7328b?#2e79a56064b7328b"&gt;Bugzilla group&lt;/a&gt; about changing the default workflow (Open, Fixed, Closed etc) that comes with Bugzilla. My thoughts are that whatever they choose, everyone will want to change it to match their own thoughts on what states a bug should have.&lt;br /&gt;&lt;br /&gt;What is really needed are some state names to guide users on how to use a workflow. So in the spirit of the day, I propose doing away with those vague and language-specific words such as "Open" and "Closed" and using integers instead. The first state that a bug starts in would be 0 (or perhaps 1 for non-engineering groups), then the next state should be 1, and then 2, and so on. Next, remove all transitions between states except to the next state and the possibly the previous state.&lt;br /&gt;&lt;br /&gt;We now have a simple measure of the state of a bug, acceptable to all!&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-2598024800901215950?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/2598024800901215950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=2598024800901215950' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/2598024800901215950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/2598024800901215950'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/04/names-for-bug-states.html' title='Names for Bug States'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_tWiBHHTQAEM/SdOjgTCfjjI/AAAAAAAAA08/zhdK5V5APRI/s72-c/integer_states.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-892477738583696386</id><published>2009-03-26T09:55:00.000-07:00</published><updated>2009-03-26T12:20:57.944-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='bugzilla'/><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><title type='text'>Tracking Those Personal Issues</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.geekherocomic.com/comics/2009-03-26-the-real-benefits-of-bug-tracking.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 730px; height: 227px;" src="http://www.geekherocomic.com/comics/2009-03-26-the-real-benefits-of-bug-tracking.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.geekherocomic.com/comics/2009-03-26-the-real-benefits-of-bug-tracking.png"&gt;&lt;br /&gt;Geek Hero Comic&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I suspect that some people use bug trackers for even odder things. JIRA has a personal license for just those sort of, well, personal, things.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-892477738583696386?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/892477738583696386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=892477738583696386' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/892477738583696386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/892477738583696386'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/03/geek-hero-comic-i-suspect-that-some.html' title='Tracking Those Personal Issues'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-7796997452611030602</id><published>2009-03-20T10:37:00.001-07:00</published><updated>2009-03-20T10:39:49.475-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><title type='text'>I'm off to the summit!</title><content type='html'>&lt;a href="http://www.atlassian.com/summit?kwcid=summitbadge" title="Atlassian Summit"&gt;&lt;img border="0" width="320" height="250" alt="Atlassian Summit" src="http://www.atlassian.com/summit/images/headline_box_large.png"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I went to the San Jose Atlassian User Group yesterday in the San Jose Museum of Art (great place for a meeting). And I won the drawing for a ticket to the Atlassian Summit!&lt;br /&gt;&lt;br /&gt;Hope to see you there.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-7796997452611030602?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/7796997452611030602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=7796997452611030602' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7796997452611030602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7796997452611030602'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/03/im-off-to-summit.html' title='I&apos;m off to the summit!'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-8414925119365971690</id><published>2009-01-23T13:01:00.000-08:00</published><updated>2009-01-23T13:35:35.978-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web applications'/><title type='text'>Neat solution for CSS footers</title><content type='html'>When navigating a website, it's a bit disconcerting to see the text at the bottom of the page moving up and down the screen as the amount of text on each screen changes. &lt;br /&gt;&lt;br /&gt;There's a neat fix using CSS over at &lt;a href="http://www.cssstickyfooter.com"&gt;http://www.cssstickyfooter.com&lt;/a&gt;. It apparently works on every browser I could think of.&lt;br /&gt;&lt;br /&gt;~Matt&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-8414925119365971690?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/8414925119365971690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=8414925119365971690' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8414925119365971690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8414925119365971690'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2009/01/neat-solution-for-css-footers.html' title='Neat solution for CSS footers'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-6031077986195876003</id><published>2008-11-08T10:30:00.000-08:00</published><updated>2008-11-08T10:33:13.862-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><category scheme='http://www.blogger.com/atom/ns#' term='atlascamp'/><title type='text'>JIRA Customization Guidelines</title><content type='html'>These are a few slides written at AtlasCamp today. The slides contain some general guidelines for customizing JIRA.&lt;br /&gt;&lt;br /&gt;&lt;iframe src='http://docs.google.com/EmbedSlideshow?docid=dhgqfxn9_605f6nm5kcc&amp;amp;size=m' frameborder='0' width='555' height='451'&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-6031077986195876003?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/6031077986195876003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=6031077986195876003' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6031077986195876003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6031077986195876003'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/11/jira-customization-guidelines.html' title='JIRA Customization Guidelines'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-6493911095000733094</id><published>2008-10-31T13:36:00.000-07:00</published><updated>2008-10-31T13:47:28.091-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='braille'/><title type='text'>Braille typos</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_tWiBHHTQAEM/SQtsw6YCjMI/AAAAAAAAAzE/OZtQb1zyuWk/s1600-h/ADA62.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 400px;" src="http://3.bp.blogspot.com/_tWiBHHTQAEM/SQtsw6YCjMI/AAAAAAAAAzE/OZtQb1zyuWk/s400/ADA62.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5263420177072164034" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I was on &lt;a href="http://www.caltrain.com"&gt;Caltrain&lt;/a&gt; recently and noticed that the Braille for many of the signs must either have typos, or uses some other version of Braille than I've heard of. How can I tell? Well, the places where the same letter occurs have different symbols in each place. The picture above is of a similar sign, and I notice that it also has errors, though different from ones on Caltrain's signs.&lt;br /&gt;&lt;br /&gt;Is this sort of thing common with Braille transliterations? Or perhaps this is &lt;a href="http://en.wikipedia.org/wiki/Braille#Braille_transcription"&gt;Grade 2 Braille&lt;/a&gt;?&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-6493911095000733094?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/6493911095000733094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=6493911095000733094' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6493911095000733094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6493911095000733094'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/10/i-was-on-caltrain-recently-and-noticed.html' title='Braille typos'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_tWiBHHTQAEM/SQtsw6YCjMI/AAAAAAAAAzE/OZtQb1zyuWk/s72-c/ADA62.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-7129358040416233239</id><published>2008-10-21T10:18:00.000-07:00</published><updated>2008-10-21T13:27:44.107-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Can you see what I see?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cs.unm.edu/~aaron/images/largeImages/red_blind.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://www.cs.unm.edu/~aaron/images/largeImages/red_blind.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Can you see anything in the pattern of this image?&lt;br /&gt;&lt;br /&gt;If you choose colors for a software application, then &lt;span style="font-style:italic;"&gt;make sure you print out a screen-shot of every screen on a regular black and white printer&lt;/span&gt;. If you can't understand something from looking at the printout, then you've used only colors to indicate something, and this will be a problem for up to 10% of your target audience.&lt;br /&gt;&lt;br /&gt;The image above is part of a &lt;a href="http://www.militantplatypus.com/blog/archives/3103"&gt;reverse&lt;/a&gt; &lt;a href="http://www.cs.unm.edu/~aaron/creative/colorTest.htm"&gt;colorblindness test&lt;/a&gt;. The image embedded in it is supposedly only visible to color blind people. I can see a circle very clearly but it would obviously be foolish to rely on color-typical people being able to see it.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-7129358040416233239?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/7129358040416233239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=7129358040416233239' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7129358040416233239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7129358040416233239'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/10/can-you-see-what-i-see.html' title='Can you see what I see?'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-3687908648468830128</id><published>2008-10-20T10:19:00.000-07:00</published><updated>2008-10-31T13:35:47.251-07:00</updated><title type='text'>USS Pampanito is a Steampunk Submarine</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.maritime.org/tour/img/tftr.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 504px; height: 378px;" src="http://www.maritime.org/tour/img/tftr.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I had forgotten that the &lt;a href="http://www.maritime.org/pamphome.htm"&gt;USS Pampanito&lt;/a&gt; was built at a time closer to Queen Victoria's reign than to today. Polished brass, great big chains, hydraulic lines and knobs everywhere! &lt;br /&gt;There is also a great set of 360-views at http://www.maritime.org/tour/tatrvr.htm&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-3687908648468830128?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/3687908648468830128/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=3687908648468830128' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/3687908648468830128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/3687908648468830128'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/10/uss-pampanito-is-steampunk-submarine.html' title='USS Pampanito is a Steampunk Submarine'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-9215469322703440728</id><published>2008-10-16T16:32:00.000-07:00</published><updated>2008-10-16T16:34:16.166-07:00</updated><title type='text'>Scientific Computing Survey</title><content type='html'>-----------------------------------------------------------------&lt;br /&gt;Interesting looking survey from Greg Wilson and others. If you're a scientist, I'd encourage you to add your information.&lt;br /&gt;&lt;br /&gt;~Matt&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Computers are as important to modern scientists as test tubes,&lt;br /&gt;but we know surprisingly little about how scientists develop&lt;br /&gt;and use software in their research.  To find out, the University&lt;br /&gt;of Toronto, Simula Research Laboratory, and the National Research&lt;br /&gt;Council of Canada have launched an online survey in conjunction&lt;br /&gt;with "American Scientist" magazine. If you have 20 minutes to take&lt;br /&gt;part, please go to:&lt;br /&gt;&lt;br /&gt;http://softwareresearch.ca/seg/SCS/scientific-computing-survey.html&lt;br /&gt;&lt;br /&gt;Thanks in advance for your help!&lt;br /&gt;&lt;br /&gt;Jo Hannay (Simula Research Laboratory)&lt;br /&gt;Hans Petter Langtangen (Simula Research Laboratory)&lt;br /&gt;Dietmar Pfahl (Simula Research Laboratory)&lt;br /&gt;Janice Singer (National Research Council of Canada)&lt;br /&gt;Greg Wilson (University of Toronto)&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-9215469322703440728?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/9215469322703440728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=9215469322703440728' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/9215469322703440728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/9215469322703440728'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/10/interesting-looking-survery-from-greg.html' title='Scientific Computing Survey'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-1889758488686960299</id><published>2008-10-07T11:07:00.000-07:00</published><updated>2008-10-16T16:34:46.155-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pragmatics'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='version control'/><category scheme='http://www.blogger.com/atom/ns#' term='preprocessor'/><title type='text'>Preprocessor Warning Signs</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Using #if 0 makes searching hard&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Some symbol is not defined so you grep for it and you find it in a file. But you've forgotten that you commented that part of the file out. So the symbol exists in the source but not in the .o file, leading to puzzled head-scratching. A better idea is to delete the unwanted lines since you can find them in your version control whenever you want them, and perhaps even leave a message about what they were.&lt;br /&gt;&lt;br /&gt;Try this to see how many times you've done this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[mdoar]$ find . -name \*.[ch] | xargs grep '#if 0' | wc&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;#ifdefs for unit tests mean that the code tested differs from the code used in the product&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If #ifdef has to be used to make a function testable, then perhaps the function needs refactoring? If possible, use the build tool to create the tests, not the preprocessor. Some sample quotes at random from the web:&lt;br /&gt;&lt;br /&gt;"I don't ever use ifdefs for unit testing because code should never know it's being unit tested."&lt;br /&gt;&lt;br /&gt;"Tests must be non-invasive. I don't want to have to add #ifdef UNIT_TEST declarations into my production codebase as it'll end up making a mess and worse, could actually change behaviours. The framework and test code will be in an externally compiled project"&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-1889758488686960299?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/1889758488686960299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=1889758488686960299' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1889758488686960299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1889758488686960299'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/10/preprocessor-warning-signs.html' title='Preprocessor Warning Signs'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-1932047438604074446</id><published>2008-09-09T10:07:00.000-07:00</published><updated>2008-09-09T10:19:05.935-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='confluence'/><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>AtlasCamp</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://confluence.atlassian.com/download/attachments/167183769/atlascamp.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px;" src="http://confluence.atlassian.com/download/attachments/167183769/atlascamp.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So I've booked my place at &lt;a href="http://www.atlassian.com/atlascamp"&gt;AtlasCamp&lt;/a&gt;, Atlassian's first customer/developer love-in happening this November up in Marin County, CA. I'm not really sure what to expect except lots of product discussions, and I suspect a drink or two. Maybe we'll write some code, I don't know. I'm looking forward to it.&lt;br /&gt;&lt;br /&gt;Anyway, if you're also going and would like to carpool from around San Jose, I'll have a couple of places in my car. &lt;br /&gt;&lt;br /&gt;~Matt&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-1932047438604074446?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/1932047438604074446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=1932047438604074446' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1932047438604074446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1932047438604074446'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/09/atlascamp.html' title='AtlasCamp'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-7942444879266623724</id><published>2008-06-17T10:31:00.000-07:00</published><updated>2008-06-17T13:02:19.530-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oreilly'/><category scheme='http://www.blogger.com/atom/ns#' term='practical development environments'/><title type='text'>Response to "What is it like to write a technical book?"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.geocities.com/mattdoar/pde_progress.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px;" src="http://www.geocities.com/mattdoar/pde_progress.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.xaprb.com/blog/2008/06/15/what-is-it-like-to-write-a-technical-book/"&gt;This is a fair and honest summary&lt;/a&gt; by Baron Schwartz of what it's really like. I wrote a book (and proof-read it better than this post) in 2005 and probably won't get a chance to do it again ("at least not with this wife!" says my dearest).&lt;br /&gt;&lt;br /&gt;What a well-established publisher brought to the table for me was a guaranteed outlet for the book, more marketing than I would have had the energy or time to do, and a US$6K advance. They also provided high-quality images, indexing and copy-editing.&lt;br /&gt;&lt;br /&gt;There's a nice progress chart of my work shown above and &lt;a href="http://www.pobox.com/~doar/pde_progress.jpg"&gt;here&lt;/a&gt;  with the total word count and words/day over time. If I were ever to do it again, I would estimate an overall rate of 500 words/day requiring at least 200 7-hour sessions, so 1400 hours. For comparison, my 120-page doctoral thesis took about 4 months of 6 day weeks with 10 to 12 hours/day, so about 1000 hours.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-7942444879266623724?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/7942444879266623724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=7942444879266623724' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7942444879266623724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7942444879266623724'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/06/response-to-what-is-it-like-to-write.html' title='Response to &quot;What is it like to write a technical book?&quot;'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-3321195999980908103</id><published>2008-06-14T09:25:00.000-07:00</published><updated>2008-06-14T09:41:35.320-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>Consulting is like waiting for a bus</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cisco.com/en/US/i/000001-100000/55001-60000/56501-57000/56570.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://www.cisco.com/en/US/i/000001-100000/55001-60000/56501-57000/56570.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Every few weeks I am contacted by people wanting help with their development environments. This is a Good Thing for a consultant, but I've started to notice something very odd; the new contacts always come in groups, just like buses. I never get one new contact in a day, it's always either none, two or three.&lt;br /&gt;&lt;br /&gt;Now this might be explained if I did more public talks, or groups of colleagues recommended me, but I haven't been able to spot a pattern yet. It's not related to the day of the week either, though I know the budget cycle in companies affects when consultants are hired and fired. Anyone got any ideas? I wondered about &lt;a href="http://salt.uaa.alaska.edu/dept/metro.html"&gt;synchronization theory&lt;/a&gt; but it seems like a stretch.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-3321195999980908103?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/3321195999980908103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=3321195999980908103' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/3321195999980908103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/3321195999980908103'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/06/consulting-is-like-waiting-for-bus.html' title='Consulting is like waiting for a bus'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-1332424020596867851</id><published>2008-05-28T13:51:00.000-07:00</published><updated>2010-08-18T14:16:38.483-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugzilla'/><category scheme='http://www.blogger.com/atom/ns#' term='hacks'/><title type='text'>Making Bugzilla Read-only</title><content type='html'>I finally got this working after a few frustrating attempts. So, what not to do first.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Change database-level user permissions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I actually got this working once but it took three or four iterations since Bugzilla needs to be able to write to some tables to let you log in. Also, once you have messed with the permissions, I find restoring them to the prior state to be fiddly. This approach is really at the wrong level.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;The editbugs group&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There's a system level group in Bugzilla named "editbugs" that is apparently related to allowing a user to edit bugs. However removing a user from the group does nothing that I could see.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;What Worked For Me&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. For each product, check the Closed checkbox so that the product does not appear in the list of products where bugs can be created. This effectively stops new bugs from being created, though perhaps using the right URL might still work.&lt;br /&gt;&lt;br /&gt;2. Define a new group named something like "CanStillEdit" that can be used for bugs and add it to all products. Don't add anyone to the new group yet.&lt;br /&gt;&lt;br /&gt;3. For each product, edit the group memberships at the end of the configuration page and set the "Can Edit" checkbox for just the CanStillEdit group.&lt;span style="font-style:italic;"&gt; Leave all of the other groups unchanged&lt;/span&gt;. Now only members of the CanStillEdit group can edit bugs. It took a few passes through the documentation about this feature to see what they meant.&lt;br /&gt;&lt;br /&gt;If all goes well then trying to save a change to a bug will produce a big red box with an error message in it. Usually the error message is helpful ("you do not have permission to do that"), but sometimes it says things like "you tried to update X from to 123" which is confusing but harmless. Search works just as before.&lt;br /&gt;&lt;br /&gt;Other details:&lt;br /&gt;&lt;br /&gt;1. The other settings for the groups I was working with were Shown/NA. &lt;br /&gt;2. Administrators can also still edit issues. &lt;br /&gt;3. All this is for Bugzilla 2.x - I would hope that there are better ways to do this in the latest versions.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-1332424020596867851?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/1332424020596867851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=1332424020596867851' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1332424020596867851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1332424020596867851'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/05/making-bugzilla-read-only.html' title='Making Bugzilla Read-only'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-817279530345915330</id><published>2008-05-26T12:34:00.000-07:00</published><updated>2008-05-26T12:44:57.849-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Big Red Button as a Psych Test</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.instrumentresponse.com/image.php/ip286_s_telemecanique_emergency_stop_button.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px;" src="http://www.instrumentresponse.com/image.php/ip286_s_telemecanique_emergency_stop_button.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In a recent &lt;a href="http://blogs.msdn.com/oldnewthing/archive/2008/05/13/8497704.aspx"&gt;post&lt;/a&gt; Raymond Chen talks about Big Red Switches and various people weigh in with recollections about pressing such things. Well, I have in my possession a Big Red Button that I found at the excellent &lt;a href="http://trianglemachinery.com/"&gt;Triangle Machinery &amp; Tool Co&lt;/a&gt; in San Jose. When I had a desk, I used to have it mounted with a thick cable running from it to under my desk. It wasn't connected to anything but it told me lots about the people around me.&lt;br /&gt;&lt;br /&gt;Most people would ask "what's that for?" or "is it connected?", but occasionally there  would be someone who would press the button and &lt;span style="font-style:italic;"&gt;then&lt;/span&gt; ask the same questions. Those are the people you should never let into a server room!&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-817279530345915330?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/817279530345915330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=817279530345915330' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/817279530345915330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/817279530345915330'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/05/big-red-button-as-psych-test.html' title='Big Red Button as a Psych Test'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-6211503905544123849</id><published>2008-05-14T11:52:00.000-07:00</published><updated>2008-05-14T12:00:28.562-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Emacs, OS X and the EDITOR variable</title><content type='html'>This took a bit of fiddling to get right, so I offer it up to the Great Google Index with the hope that it may save someone else some time. The EDITOR environment variable is what is used by Unix applications (such as Subversion and git) when they want to start an editor for input. Starting emacs from the command line in OS X uses the open command.&lt;br /&gt;&lt;br /&gt;To get this working with emacs and OS X Leopard I had to make the file &lt;span style="font-family: courier new;"&gt;/usr/bin/emacs&lt;/span&gt; contain:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;#!/bin/sh&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;open -nWa /Applications/Emacs.app/Contents/MacOS/Emacs "$@"&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;This opens a file using a new instance of emacs and waits until emacs exits.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-6211503905544123849?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/6211503905544123849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=6211503905544123849' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6211503905544123849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6211503905544123849'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/05/emacs-os-x-and-editor-variable.html' title='Emacs, OS X and the EDITOR variable'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-8989897697714278875</id><published>2008-05-14T08:41:00.000-07:00</published><updated>2008-05-14T12:01:29.190-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>Three Hard Lessons in Consulting</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://members.ozemail.com.au/~lbrash/msjokes/BILL-GATES-bsod.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://members.ozemail.com.au/~lbrash/msjokes/BILL-GATES-bsod.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;1. Don't start the project until everything is ready. If a machine needs more memory to run the next version of an application, wait for the memory.&lt;br /&gt;&lt;br /&gt;2. Stop working after the agreed period of time. It's better to disappoint a client and renegoiate than to surprise them with unexpected billable hours.&lt;br /&gt;&lt;br /&gt;3. Windows infrastructure has a price. Locked directories, having to use Notepad, Wordpad or install Emacs, debugging complex service configurations: all of these things add up to about 25% more time taken during major tasks such as upgrades. &lt;br /&gt;&lt;br /&gt;I'm officially and practically platform-independent in the services I provide. Linux, Unix, Windows, OS X, I do them all. But from now on I'm going to start charging different rates for Windows environments. Not a lot, just enough to offset the extra time and effort that they require.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-8989897697714278875?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/8989897697714278875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=8989897697714278875' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8989897697714278875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8989897697714278875'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/05/three-hard-lessons-in-consulting.html' title='Three Hard Lessons in Consulting'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-7956548304391833739</id><published>2008-05-02T10:39:00.000-07:00</published><updated>2008-05-14T12:01:06.312-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='consulting'/><title type='text'>My Dash Express</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e)http://www.blogger.com/img/gl.link.gif {}" href="http://shop.dash.net/img/de_frnt_2dmap_338x276.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://shop.dash.net/img/de_frnt_2dmap_338x276.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Funnily enough, I'm not much a tech fan-boy. Generally what happens is that our friends are first adopters, and then we use their cast offs a few years later. I wrote a &lt;a href="http://www.oreilly.com/catalog/practicalde"&gt;book&lt;/a&gt; on a discarded laptop and I watch films on a second-hand screen, while sitting on a pre-loved sofa. It's not just that I'm cheap, it's also a green thing.&lt;br /&gt;&lt;br /&gt;So what on earth persuaded me to spend $400 last month on a new &lt;a href="http://en.wikipedia.org/wiki/Global_Positioning_System"&gt;GPS&lt;/a&gt;, the &lt;a href="http://www.dash.net/"&gt;Dash Express&lt;/a&gt;? That's just what my dearest wife wanted to know as well. Now, she has no use for such navigation devices having spent most of her life in the Bay Area. But now that I travel to different clients &lt;a href="http://www.pobox.com/~doar"&gt;for work&lt;/a&gt; I was getting lost more often than seemed sensible, even for my relaxed approach to navigation.&lt;br /&gt;&lt;br /&gt;The attractions of the Dash over other GPS systems for me are:&lt;br /&gt;&lt;br /&gt;- GPS, cellphone and wifi antennae are all used. The GPS is for positioning, the cellphone for traffic information and internet connections while on the road, and wifi for updates at home&lt;br /&gt;- I can right click on an address in a web page and send it to my car. No more typing on tiny screens. This is great.&lt;br /&gt;- I can search while I'm on the road. For example, when I get near my destination I realize I have to park somewhere, so I can search for parking right then.&lt;br /&gt;&lt;br /&gt;The downsides are:&lt;br /&gt;&lt;br /&gt;- $10/month subscription fee, though the first three months are free&lt;br /&gt;- Routing is slow and favors highways&lt;br /&gt;- I had to screw a bracket onto my dash to secure it since CA doesn't allow anything to be mounted on the windscreen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So far I've been happy with it, though I'm expecting great things from the first few software updates later this year. It has certainly saved me from some major blunders since I've been using it. And my wife refers to the Dash as my mistress!&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-7956548304391833739?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/7956548304391833739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=7956548304391833739' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7956548304391833739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7956548304391833739'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/05/my-dash-express.html' title='My Dash Express'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-4518446427236725107</id><published>2008-05-02T10:19:00.000-07:00</published><updated>2008-05-02T10:39:37.700-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><title type='text'>Atlassian User Group, Palo Alto</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.atlassian.com/images/devnet.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px;" src="http://www.atlassian.com/images/devnet.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Well, I &lt;span style="font-style:italic;"&gt;enjoyed&lt;/span&gt; the &lt;a href="http://confluence.atlassian.com/display/AUG/1-May-2008+-+San+Francisco%2C+CA"&gt;Atlassian User Group&lt;/a&gt; yesterday at Stanford. I'd forgotten just how complex getting a parking spot can be there, but I made it with only a few surprised comments from my &lt;a href="http://dash.net"&gt;new mistress&lt;/a&gt;. I gave a summary of my &lt;a href="http://toolsmiths.blogspot.com/2008/02/evaluating-jira-multisite.html"&gt;JIRA MultiSite post&lt;/a&gt;, but the things that I enjoyed most were:&lt;br /&gt;&lt;br /&gt;- seeing what's coming up in JIRA 4.0 (nice work from Nick Menere and others)&lt;br /&gt;&lt;br /&gt;- asking Mike (CEO) both technical and business questions and seeing him handle both well&lt;br /&gt;&lt;br /&gt;- meeting lots of smart people using JIRA, with an eye to new clients of course.&lt;br /&gt;&lt;br /&gt;The sponsors Stanford and &lt;a href="http://www.wandisco.com"&gt;WANdisco&lt;/a&gt; provided a good spread of food, which always helps such things. I'd recommend any JIRA administrators in the Bay Area come to the next one.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-4518446427236725107?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/4518446427236725107/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=4518446427236725107' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/4518446427236725107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/4518446427236725107'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/05/atlassian-user-group-palo-alto.html' title='Atlassian User Group, Palo Alto'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-6457128674943352646</id><published>2008-04-22T15:45:00.000-07:00</published><updated>2008-04-22T15:57:09.236-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>More bugs than revisions</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://master.debian.org/~ajt/graph.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://master.debian.org/~ajt/graph.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;(Debian bug count from http://master.debian.org/~ajt)&lt;/blockquote&gt;&lt;br /&gt;Heard as an aside: "&lt;span style="font-weight:bold;"&gt;that project's got more bugs than revisions!&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;Which made me think what kind of project might reasonably expect that statement to be true. The space shuttle software as a whole, perhaps? Lots of testing implies lots of bugs, and scrupulous code reviews means fewer commits. &lt;br /&gt;&lt;br /&gt;At the other end of things, many small projects might get a few hundred revisions and then a few hundred bugs over time. Of course, most bugs will end up closed in one way or another.&lt;br /&gt;&lt;br /&gt;Anybody able to point to a real project with more bugs than revisions?&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-6457128674943352646?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/6457128674943352646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=6457128674943352646' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6457128674943352646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6457128674943352646'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/04/more-bugs-than-revisions.html' title='More bugs than revisions'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-5143295175277251776</id><published>2008-04-16T16:44:00.000-07:00</published><updated>2008-04-16T16:55:30.864-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Just costs you double</title><content type='html'>Me: "just" costs you double.&lt;br /&gt;Them: Huh?&lt;br /&gt;Me: Every time you use "just" to describe a feature or a process it tells me you've made a gross assumption about what I'll need to do ...&lt;br /&gt;&lt;br /&gt;That &lt;a href="http://codeclimber.blogspot.com/2008/04/all-i-need-is-programmer.html?showComment=1208385000000#c5730977533961153555"&gt;comment&lt;/a&gt; on a post titled &lt;a href="http://codeclimber.blogspot.com/2008/04/all-i-need-is-programmer.html"&gt;All I Need Is A Programmer&lt;/a&gt; made me nod in agreement. "Just" is a warning sign in conversations for me, like "always", "never", and the dreaded "trust me". &lt;br /&gt;&lt;br /&gt;All those phrases make me think of exceptions. "Always? Well, there is that edge case ...". "Just? Why 'just'? What about ..." and I begin to wonder whether the person really knows what they're talking about.&lt;br /&gt;&lt;br /&gt;Just say 'no' to 'just'. (You knew that was coming, right?)&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-5143295175277251776?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/5143295175277251776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=5143295175277251776' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/5143295175277251776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/5143295175277251776'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/04/just-costs-you-double.html' title='Just costs you double'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-581100276439098247</id><published>2008-03-17T20:26:00.000-07:00</published><updated>2008-03-17T20:42:06.886-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac mini'/><category scheme='http://www.blogger.com/atom/ns#' term='fusion'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualization'/><title type='text'>The Mac Mini as a Laptop and VMWare Fusion</title><content type='html'>I needed a new laptop because the one I had borrowed had disk errors in the Windows registry, as disks do after too long running Windows. Since I find laptop screens, keyboards and mice uniformly awkward, I bought a laptop without the keyboard, mouse or screen - a &lt;a href="http://www.apple.com/macmini/specs.html"&gt;Mac Mini&lt;/a&gt;. (Frys, US$750)&lt;br /&gt;&lt;br /&gt;The upsides, apart from being less than half the price of a decent Mac laptop, are that it &lt;span style="font-style:italic;"&gt;really is &lt;/span&gt;compact and there are some decent virtualization choices (Bootcamp, Parallels and Fusion). I went with VMWare Fusion and overall, it behaves as you might wish. Easy to install, cheap at $100 and runs most VMWare images. &lt;br /&gt;&lt;br /&gt;The downsides of not buying a laptop are that power outages become more significant without a battery, and perhaps the disk drive isn't mounted in a suitable manner for carrying the box in a bag every day? Swapping from VM to VM, or VM to host OS sent the swap rate soaring, so I installed an extra 1GB of RAM to help with that. While installing the extra memory, I took a good look at the hard disk and it seems to be mounted just as it would be in a laptop, so I'm hoping that the disk will survive being moved every day. If anyones else has experience with mac mini hard disk lifetimes, I'd be interested to hear from you.&lt;br /&gt;&lt;br /&gt;And so today, I had another "virtualization is great" moment. The server that I had traveled an hour to work on was busy having its motherboard replaced. Since I actually wanted to work on was the OS configuration, so I booted the Windows server image with Fusion on my little Mac Mini, did the necessary work, and moved right along. Very neat.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-581100276439098247?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/581100276439098247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=581100276439098247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/581100276439098247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/581100276439098247'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/03/mac-mini-as-laptop-and-vmware-fusion.html' title='The Mac Mini as a Laptop and VMWare Fusion'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-2884239071975162422</id><published>2008-02-26T09:35:00.000-08:00</published><updated>2008-02-26T09:50:58.093-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'></title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://pymag.phparch.com/img/pymag/issues/covers/68.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://pymag.phparch.com/img/pymag/issues/covers/68.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://pymag.phparch.com/c/issue/view/68"&gt;February issue of Python Magazine&lt;/a&gt; is out and contains my article "Using Python and SOAP to create a CLI for JIRA" about the &lt;a href="http://confluence.atlassian.com/display/JIRAEXT/Jira+CLI"&gt;Python CLI&lt;/a&gt; that I wrote for JIRA a while ago. The article's summary reads:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Many web applications include an API that lets you interact with them from the command line as well as with a browser. In this article, Matthew shows how to build a command line interface for JIRA, a well-known issue tracking system, using Python and SOAP. JIRA is a Java application, but using SOAP allows you access to many of its features using just Python.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;One hint that I wish I had remembered to add is that when you have a redirect to your JIRA server, for instance when http://jira.mycompany.com is redirected by Apache or IIS to http://jira.mycompany.com:&lt;span style="font-weight:bold;"&gt;8080&lt;/span&gt;, you may see your login mysteriously fail. The answer is that you have to use the redirected URL with the JIRA CLI. You can find out what the redirected URL is by running the CLI with the argument -v10 to increase the logging verbosity and look at the line that starts with "Host". This example shows that the port to use is 8080.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;*** Outgoing HTTP headers **********************************************&lt;br /&gt;POST /rpc/soap/jirasoapservice-v2 HTTP/1.0&lt;br /&gt;Host: localhost:&lt;span style="font-weight:bold;"&gt;8080&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-2884239071975162422?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/2884239071975162422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=2884239071975162422' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/2884239071975162422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/2884239071975162422'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/02/february-issue-of-python-magazine-is.html' title=''/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-7164424718520179106</id><published>2008-02-20T17:28:00.000-08:00</published><updated>2011-04-07T17:26:53.198-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><title type='text'>Finally, a use for those JIRA user properties</title><content type='html'>One of the most useful JIRA plugins I've found is the &lt;a href="http://confluence.atlassian.com/display/JIRAEXT/JIRA+Toolkit"&gt;JIRA Toolkit&lt;/a&gt;, described as "a bunch of neat custom fields Atlassian have developed for their own use". As an aside, if they're so neat and useful then why aren't they in the core product?&lt;br /&gt;&lt;br /&gt;One of the more recently developed fields is the &lt;a href="http://developer.atlassian.com/jira/browse/JTOOL-22"&gt;View User Property&lt;/a&gt; custom field, which is currently only documented in the issue that last link refers to. This handy little field allows you to display properties that you previously added to a user, as a read-only field in each issue. &lt;br /&gt;&lt;br /&gt;For example, add a property named "Company" to some of your users in JIRA, then install the JIRA toolkit and create an instance of the View User Property field. Now configure it with "reporter:Company". Add the new field to some screens and the value of the reporter's Company field will show up in the issue. This also works with "assignee:Company". You can even get a user name with "My Custom Field:Company". This will use the user name found in the custom field named "My Custom Field". Just use the JIRA custom field name, including any spaces.&lt;br /&gt;&lt;br /&gt;I've just used this to associate a company name with every customer user, and I'm sure there are a number of other pieces of per-user information that could be displayed with this field. One missing piece for this field is the &lt;a href="http://developer.atlassian.com/jira/browse/JTOOL-37"&gt;ability to search for issues with particular values&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-7164424718520179106?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/7164424718520179106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=7164424718520179106' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7164424718520179106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7164424718520179106'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/02/finally-use-for-those-jira-user.html' title='Finally, a use for those JIRA user properties'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-8045978815543410650</id><published>2008-02-14T09:57:00.000-08:00</published><updated>2008-02-14T10:36:14.132-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='wandisco'/><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><title type='text'>Evaluating JIRA Multisite</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.wandisco.com/images/products/jira/header.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://www.wandisco.com/images/products/jira/header.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Given the number of organizations already using &lt;a href="http://www.atlassian.com/software/jira/"&gt;JIRA&lt;/a&gt; across a WAN, there is plenty of interest in finding ways to improve the experience. I've had a few clients suggest using distributed databases, changing HTTP caching behaviour or not using HTTPS. None of these are really great fixes, and are complicated by the fact that JIRA keeps much of its data in a local &lt;a href="http://lucene.apache.org/java/docs/"&gt;Lucene&lt;/a&gt; index outside the database for performance reasons.&lt;br /&gt;&lt;br /&gt;So when &lt;a href="http://www.wandisco.com/"&gt;WANdisco&lt;/a&gt; announced a beta of &lt;a href="http://www.wandisco.com/jira"&gt;JIRA Multisite&lt;/a&gt; last &lt;a href="http://blogs.atlassian.com/news/2007/11/introducing_wan.html"&gt;November&lt;/a&gt; in partnership with Atlassian, I was interested to see what it would do. It's billed as a high availability solution and in doing that it gives you local JIRA servers with all your data nicely synchronized. There is another approach that was announced at about the same time, the JIRA clustering solution &lt;a href="http://scarlet.sourceforge.net/"&gt;Scarlet&lt;/a&gt;. I haven't evaluated Scarlet yet but it appears to have a single point of failure by default.&lt;br /&gt;&lt;br /&gt;I contacted WANdisco to ask for an evaluation copy and they were happy to help. They have an existing replication tool for CVS and Subversion that they've connected to JIRA. You need their tool and their instance of JIRA. As an aside, though they are keeping up with each release of JIRA, I'd rather have instructions about how to modify my existing instance of JIRA to work with their tool, but I'll take what I can get for now.&lt;br /&gt;&lt;br /&gt;To provide high availability you have to have 3 or more instances of JIRA, but since I was mainly interested in how each sites' performance changed, I just set up two instances of JIRA, one in San Jose, CA and the other in Bangalore, India. The connection between the two sites is a clogged T1 at best and the team in India often have sluggish response times from JIRA.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Setup Experience&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;WANdisco wanted to set the tool up, but I did it myself in an hour for the two nodes. Instructions were beta quality, but not bad. After that piece of stubbornness, their tech founder worked out what I had done wrong in about an hour, and then together we had it all working in another hour. Three hours from scratch is pretty good as these things go.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Testing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I modified a bug in San Jose and watched the change appear in India a second or two later. Then I modified a bug in India and saw the change locally in about the same time. Just as expected. Then we stopped one of the JIRA servers, made some changes, waited a bit, restarted the server and saw the changes all get synchronized. Other users updated issues over the next month and the changes appeared just as expected. The big win was that the users in India saw their local response improve dramatically. The underlying WANdisco replication tool was rock solid for the month's evaluation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Restrictions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The version I tested didn't synchronize attachments, but that has been added since then. You do have to use the same OS (and database I believe) for all the instances of JIRA. This was not a problem for me, but if you have a Windows server in one location and Linux in another, it won't work.&lt;br /&gt;&lt;br /&gt;I didn't try https, but I did set up LDAP authentication and that worked as expected&lt;br /&gt;&lt;br /&gt;I'm pretty sure that if I wanted to go back to one instance of JIRA I could have exported the data and then reimported it into a non-multisite instance of JIRA.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Cost&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pricing is &lt;a href="http://www.wandisco.com/jira/pricing.php?jiratype=MultiSite"&gt;public&lt;/a&gt; and is US $7500 per instance of JIRA, which is about 50% more than the current Enterprise license cost. This seems about right given the cost of the tool and the target customers. Support comes from WANdisco and JIRA, in that order.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Summary&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;JIRA Multisite is still in its early stages, but it is very promising. It worked well for me with little effort, and provides good value for the price.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-8045978815543410650?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/8045978815543410650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=8045978815543410650' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8045978815543410650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8045978815543410650'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2008/02/evaluating-jira-multisite.html' title='Evaluating JIRA Multisite'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-7560896881001580746</id><published>2007-11-28T10:46:00.000-08:00</published><updated>2008-12-11T20:55:06.148-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Perspective of a 3-year old</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_tWiBHHTQAEM/R027QLYShXI/AAAAAAAAAeM/ef2_PaT4nC0/s1600-h/Home+013.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_tWiBHHTQAEM/R027QLYShXI/AAAAAAAAAeM/ef2_PaT4nC0/s320/Home+013.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5137968636506572146" /&gt;&lt;/a&gt;&lt;br /&gt;A few choice observations from my youngest son in the past few months. I'm posting them as reminders that not everyone thinks as we expect them to.&lt;br /&gt;&lt;br /&gt;During the minor earthquake in San Jose, we all went outside. Afterwards he kept running outside then back inside again. When asked why, he said he was "looking for more earthquakes." (I guess we found one outside the first time?)&lt;br /&gt;&lt;br /&gt;We came across a dried-up deer carcass, and I was teaching him to use a stick instead of his hands to touch roadkill. This lead to a discussion about death and whether the deer would come back to life. I gently explained that the deer was done with its body now. He looked thoughtful for a moment, and then drove the stick through the carcass, exclaiming "you &lt;span style="font-weight:bold;"&gt;stay &lt;/span&gt;dead then!"&lt;br /&gt;&lt;br /&gt;When asked during the Christmas Pageant rehearsal what kinds of animals were in the manager with Jesus, he piped up with "pterodactyls!". To his disappointment, he is going to be a lamb instead.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-7560896881001580746?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/7560896881001580746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=7560896881001580746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7560896881001580746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7560896881001580746'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/11/perspective-of-3-year-old.html' title='Perspective of a 3-year old'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_tWiBHHTQAEM/R027QLYShXI/AAAAAAAAAeM/ef2_PaT4nC0/s72-c/Home+013.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-6198871637218757988</id><published>2007-11-13T10:27:00.000-08:00</published><updated>2008-12-11T20:55:06.364-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='o&apos;reilly'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Choosing Project Names</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_tWiBHHTQAEM/Rzny3gUxQhI/AAAAAAAAAeE/wMbQaXWJpeo/s1600-h/pde_med.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_tWiBHHTQAEM/Rzny3gUxQhI/AAAAAAAAAeE/wMbQaXWJpeo/s320/pde_med.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5132400285749166610" /&gt;&lt;/a&gt;&lt;br /&gt;The discussion &lt;a href="http://www.codinghorror.com/blog/archives/000996.html"&gt;What' in a Project Name?&lt;/a&gt; over at &lt;a href="http://www.codinghorror.com/blog"&gt;Coding Horror&lt;/a&gt; reminded me of section 3.6.1 of my book &lt;a href="http://www.oreilly.com/catalog/practicalde"&gt;Practical Development Environments&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;Project names are usually chosen by engineering groups, with one name for each significantly different version of the products that they are working on. There should be no need to change a project's name once it has been chosen. Product names, on the other hand, are the names that customers see, and these names are usually chosen to help a product sell or to become popular. Product names can change at the whim of a market research poll or a new VP of Sales.&lt;br /&gt;&lt;br /&gt;Some general guidelines for choosing names for projects are:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Keep it short&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Since project names may appear in filenames or source code, shorter project names are preferable; four to six characters is common. Longer names will only be abbreviated anyway, and usually in two different ways.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Use distinctive sounds&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Project names should sound different from each other when spoken aloud by people whose native language is not the one used by the rest of the group. Even if everyone  speaks English, having two projects named "ctest" and "seebest" is too close for comfort.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Use low-frequency letters&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's much easier to be confident that all references to a project name can be found if the name contains characters that are less common in the local language. This is a good argument for choosing project names that use unusual characters, such as the letters q and z for English.&lt;br /&gt;&lt;br /&gt;Apocryphal aside: a few years ago there was a project named IDS that apparently had a function named IDSConnect. Then the project was renamed DIS and all its functions were renamed accordingly, which led to their function for creating connections being renamed to DISConnect. The letters d, i, and s are too common in English to simply reuse them in &lt;br /&gt;such an anagram.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Make it unmarketable&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sometimes a project name will be reused as a product name, but not if it is already trademarked, or if you make it odd or crude enough! Project names don't have to have a theme, though that can be fun. They don't even have to be meaningful, just memorable with an obvious way of pronouncing the word. You can choose a number of suitable names once and then let people decide which one they want to use next. Names of stars, types of sushi, rare diseases, and characters from comic books are some ideas to start with for project names.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-6198871637218757988?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/6198871637218757988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=6198871637218757988' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6198871637218757988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6198871637218757988'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/11/choosing-project-names.html' title='Choosing Project Names'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_tWiBHHTQAEM/Rzny3gUxQhI/AAAAAAAAAeE/wMbQaXWJpeo/s72-c/pde_med.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-3515131228949695798</id><published>2007-10-10T13:29:00.000-07:00</published><updated>2007-10-10T13:44:06.668-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='hacks'/><title type='text'>Unexepected side effects in shell scripts</title><content type='html'>Shell scripts that fail to preserve the expected environment are a waste of everyone's time. For instance, you call a function which changes the current directory to somewhere else for its own purposes but fails to change back on all exit paths from the function. Trying to remember which directory you might be in later on becomes combinatorially difficult as more conditional statements are added over time. To make it more concrete:&lt;br /&gt;&lt;br /&gt;BAD: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function MyFunction() {&lt;br /&gt;   cd some_random_directory&lt;br /&gt;   # Do something useful&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;GOOD:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function MyFunction() {&lt;br /&gt;   # Change to the necessary directory&lt;br /&gt;  &lt;span style="font-weight:bold;"&gt; pushd some_random_directory&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;   # Do something useful&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight:bold;"&gt;# Now pop the directory off the stack    &lt;br /&gt;   cd -&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If you have conditional statements, then make sure you catch them too:&lt;br /&gt;&lt;br /&gt;BAD:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function MyFunction() {&lt;br /&gt;   # Change to the necessary directory&lt;br /&gt;   pushd some_random_directory&lt;br /&gt;&lt;br /&gt;   # Do something useful and test something&lt;br /&gt;   if [ "${test}" == "value" ]; then&lt;br /&gt;       return # &lt;span style="font-weight:bold;"&gt;Oops, this function left us somewhere unexpected&lt;/span&gt;&lt;br /&gt;   fi&lt;br /&gt;&lt;br /&gt;   # Now pop the directory off the stack    &lt;br /&gt;   cd -&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;GOOD:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;function MyFunction() {&lt;br /&gt;   # Change to the necessary directory&lt;br /&gt;   pushd some_random_directory&lt;br /&gt;&lt;br /&gt;   # Do something useful and test something&lt;br /&gt;   if [ "${test}" == "value" ]; then&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;       # Don't forget to pop the directory off the stack    &lt;br /&gt;       cd -&lt;/span&gt;&lt;br /&gt;       return&lt;br /&gt;   fi&lt;br /&gt;&lt;br /&gt;   # Now pop the directory off the stack    &lt;br /&gt;   cd -&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Basically, preserve an expected and known state between function calls, just like any modern other programming language.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-3515131228949695798?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/3515131228949695798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=3515131228949695798' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/3515131228949695798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/3515131228949695798'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/10/unexepected-side-effects-in-shell.html' title='Unexepected side effects in shell scripts'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-408491782367466673</id><published>2007-10-09T08:34:00.000-07:00</published><updated>2007-10-09T08:51:39.334-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='version control'/><title type='text'>Why tags are rarely used as you would expect</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://svnbook.red-bean.com/en/1.0/images/ch02dia7.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://svnbook.red-bean.com/en/1.0/images/ch02dia7.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As a recent &lt;a href="http://betterexplained.com/articles/a-visual-guide-to-version-control/"&gt;introduction to version control&lt;/a&gt; explains, a &lt;span style="font-weight:bold;"&gt;tag&lt;/span&gt; is a way to record a snapshot of the state of some files at a moment in time. When I ask clients why they want to tag their source code, one reason is always "so we can reproduce a build later on". And we generally nod our heads and move on.&lt;br /&gt;&lt;br /&gt;The funny thing is that I've never actually seen a tag used for that purpose. Tags do get used to decide whether a particular bug fix was in a certain build, or as references for released builds. But as a developer if I need an earlier build, it's probably to debug a customer problem, which means that the software was already released. Since my build process will have carefully preserved any build artifacts such as debug symbol files, I already have the files that I need.&lt;br /&gt;&lt;br /&gt;The other observation is that build systems are designed to be able to use different branches. So if I &lt;span style="font-style:italic;"&gt;really &lt;/span&gt; needed to recreate a build, I could always branch from the tag and then build using the head of the new branch. Of course, this assumes that nothing else in the environment has changed.&lt;br /&gt;&lt;br /&gt;In summary, tags are necessary, but maybe it's not for the reasons that we usually assume.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-408491782367466673?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/408491782367466673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=408491782367466673' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/408491782367466673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/408491782367466673'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/10/why-tags-are-rarely-used-as-you-would.html' title='Why tags are rarely used as you would expect'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-1513767601596309424</id><published>2007-10-09T08:13:00.000-07:00</published><updated>2007-10-09T08:32:39.270-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><category scheme='http://www.blogger.com/atom/ns#' term='hacks'/><title type='text'>Thoughts on Making Things</title><content type='html'>It's time to get some thoughts out of my head about making things. Physical things, software things, relationship things. You know, &lt;span style="font-style:italic;"&gt;things&lt;/span&gt;. That's what engineers do after all.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Nothing is Monolithic&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nothing created by people is a &lt;a href="http://www.google.com/url?sa=t&amp;ct=res&amp;cd=2&amp;url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2F2001%3A_A_Space_Odyssey_(film)&amp;ei=4ZsLR7LcDZyMeuHD_KAF&amp;usg=AFQjCNHRMCiJJo_1clRHL1_cgT_gBSxyKQ&amp;sig2=pJn2hhv7F7EmGn7kSJRL9w"&gt;monolith&lt;/a&gt;. It's always made up of smaller things. Something may seem &lt;a href="http://en.wikipedia.org/wiki/Emergence"&gt;greater than the sum of its parts&lt;/a&gt;, but only by how we treat it. Really, it is just a number of things put together.&lt;br /&gt;For instance, a beautiful painting may well move me greatly, but at one level it is still flecks of paint on canvas.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Everything is a Hack&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;"&lt;a href="http://www.eps.mcgill.ca/jargon/jargon.html#hack"&gt;Hack&lt;/a&gt;" in the sense of  changing a thing to work around a problem. Nothing created by humans springs fully formed into existence; everything is an extension of what came before. Whatever you see around you has taken multiple versions to become what it is now.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Everything looks different when you think about how it was made&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This was an epiphany for me at eighteen, when I began to look around me and ask "how was that thing made?". Once you consider how a thing could have been produced, you understand that thing in a different way. And just as children are no less marvelous after you've read a book on reproductive science, software and hardware is still amazing even when you're the one creating it.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-1513767601596309424?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/1513767601596309424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=1513767601596309424' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1513767601596309424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1513767601596309424'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/10/thoughts-on-making-things.html' title='Thoughts on Making Things'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-6319103132765175268</id><published>2007-10-03T17:41:00.000-07:00</published><updated>2007-10-05T07:33:48.359-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='hacks'/><title type='text'>Python + bash + ssh = too many layers!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ec1.images-amazon.com/images/I/018FEQEFHTL.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px;" src="http://ec1.images-amazon.com/images/I/018FEQEFHTL.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I was reminded by a recent project that many (most?) hardware failures occur at the connections between things. That's why &lt;a href="http://www.urbandictionary.com/define.php?term=Percussive+Maintenance"&gt;percussive maintenance&lt;/a&gt; gets results. I was writing a tool to execute lots of commands remotely on multiple machines, with the different commands being synchronized from one machine. I chose to write the tool in python, and that made creating it nice and easy. &lt;br /&gt;&lt;br /&gt;But the shell commands to be executed had to be communicated to each machine. Now I could have written all the commands and their arguments (some of which contained the dreaded spaces) into separate files, copied them over with scp and executed them remotely. Except that there was a fair amount of analyzing of results and deciding what to run next based on the results of the analysis. This is generally tedious to do with bash and can be hard to maintain.&lt;br /&gt;&lt;br /&gt;So I decided to keep the control logic in the python tool and use ssh to send each command separately to the remote machines. Which works, but the extra headache of getting all the spaces escaped and quoted added a major amount of maintenance pain to the tool. I could have encapsulated it all more cleanly, I'm sure, but it all "just grew" in scope and size.&lt;br /&gt;&lt;br /&gt;The final block in this tottering tower was that some of the commands had to be run using sudo, but not all of them. Getting all those sudo strings in the right place took a few hours of my life from me without feeling that I got much for it. So it goes.&lt;br /&gt;&lt;br /&gt;I've tried using CORBA, WebServices etc over the years, but they feel pretty heavyweight for this sort of thing. So the question I'm asking myself is: how could I have done it better?&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-6319103132765175268?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/6319103132765175268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=6319103132765175268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6319103132765175268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6319103132765175268'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/10/python-bash-ssh-too-many-layers.html' title='Python + bash + ssh = too many layers!'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-1120777768693178425</id><published>2007-09-03T15:19:00.000-07:00</published><updated>2008-12-11T20:55:06.622-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jdiff'/><title type='text'>JDiff 1.1.0 released</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tWiBHHTQAEM/RtyMEC7-awI/AAAAAAAAAd8/8vNVpr1Rgsw/s1600-h/jdiff_logo.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_tWiBHHTQAEM/RtyMEC7-awI/AAAAAAAAAd8/8vNVpr1Rgsw/s200/jdiff_logo.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5106110078667090690" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I finally got around to incorporating a few patches into a release for &lt;a href="http://jdiff.org"&gt;JDiff&lt;/a&gt;, the Java doclet I wrote years ago to generate Javadoc-like reports about the changes between two versions of a Java API. I still think it's a cool tool, in my opinion. And in the opinion of &lt;a href="http://developer.apple.com/documentation/WebObjects/Reference/API5.2.4/index.html"&gt;Apple&lt;/a&gt;, &lt;a href="http://www.oracle.com/technology/products/jdev/tips/muench/9051api/changes/changes-summary.html"&gt;Oracle &lt;/a&gt;and &lt;a href="http://blogs.sun.com/tony/entry/the_mustang_regressions_challenge"&gt;Sun &lt;/a&gt;too.&lt;br /&gt;&lt;br /&gt;I took the opportunity to rearrange all the source files to make it easier to work on, and combined all the Ant files into one big build.xml file. I noticed when I was updating the documentation that I had to tell some Java developers what Ant was in 2001, which is not the case now. I'm still trying to wrestle the repository into Subversion in SourceForge.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-1120777768693178425?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/1120777768693178425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=1120777768693178425' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1120777768693178425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1120777768693178425'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/09/jdiff-110-released.html' title='JDiff 1.1.0 released'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_tWiBHHTQAEM/RtyMEC7-awI/AAAAAAAAAd8/8vNVpr1Rgsw/s72-c/jdiff_logo.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-7666196823797428200</id><published>2007-08-21T10:24:00.000-07:00</published><updated>2007-08-21T10:44:55.230-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comics'/><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Scott McCloud at Hijinx Comics</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.scottmccloud.com/makingcomics/cover-mc2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px;" src="http://www.scottmccloud.com/makingcomics/cover-mc2.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I had a great time last night hanging out with my son Jacob (8) at our local comic store &lt;a href="http://www.hijinxcomics.com/"&gt;Hijinx Comics&lt;/a&gt; with &lt;a href="http://www.scottmccloud.com/makingcomics/"&gt;Scott McCloud&lt;/a&gt;, his family and a bunch of other locals in the know. Scott McCloud is probably the most self-aware and thoughtful person creating comics at the moment. I liken the year-long tour he is just finishing to a professor travelling the world to spread his knowledge. His original book &lt;a href="http://www.scottmccloud.com/store/books/uc.html"&gt;Understanding Comics&lt;/a&gt; has been worth re-reading every few years - it's one of &lt;span style="font-style:italic;"&gt;those&lt;/span&gt; books, like &lt;a href="http://www.edwardtufte.com/tufte/"&gt;Edward Tufte's&lt;/a&gt;. Any kind of collaboration between them would be an amazing thing to behold.&lt;br /&gt;&lt;br /&gt;The other thing we really enjoyed was his family being there. Jacob was amazed to find any girl who liked Pokemon as much as he does, and Scott's wife Ivy is also a great presence in any room. Many thanks to &lt;a href="http://www.hijinxcomics.com/blog/topics/store/"&gt;Dan Shahin&lt;/a&gt; for organizing the get-together.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-7666196823797428200?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/7666196823797428200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=7666196823797428200' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7666196823797428200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7666196823797428200'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/08/scott-mccloud-at-hijinx-comics.html' title='Scott McCloud at Hijinx Comics'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-1691724893594608116</id><published>2007-08-01T17:21:00.000-07:00</published><updated>2007-08-01T17:50:48.235-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><category scheme='http://www.blogger.com/atom/ns#' term='fisheye'/><title type='text'>Atlassian has acquired Cenqua</title><content type='html'>Which is not surprising, given how many of my customers use both &lt;a href="http://www.atlassian.com/software/jira/"&gt;Jira&lt;/a&gt; for bugtracking and &lt;a href="http://www.cenqua.com"&gt;FishEye&lt;/a&gt; as a front-end browser for their version control. What's funny to me is that I suggested it to &lt;a href="http://confluence.atlassian.com/display/%7Escott@atlassian.com"&gt;Scott Farquhar&lt;/a&gt;, the CEO of &lt;a href="http://www.atlassian.com"&gt;Atlassian&lt;/a&gt; last month at the Silicon Valley Atlassian User Group meeting, but I didn't pick up on why he looked a bit surprised by my suggestion that "hey, y'know, Atlassian should buy those FishEye guys!". Next time, I'll just ask if he wants to play poker.&lt;br /&gt;&lt;br /&gt;No word on the terms of the deal, but from my perspective, it's great news. Best wishes to all involved.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-1691724893594608116?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/1691724893594608116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=1691724893594608116' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1691724893594608116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/1691724893594608116'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/08/atlassian-has-acquired-cenqua.html' title='Atlassian has acquired Cenqua'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-7360061814751790309</id><published>2007-07-27T09:10:00.000-07:00</published><updated>2007-07-27T09:27:07.996-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hacks'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><title type='text'>The largest, longest-lasting hack ever?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.bk.tudelft.nl/dks/publications/hp/img/lower.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://www.bk.tudelft.nl/dks/publications/hp/img/lower.gif" alt="" border="0" /&gt;&lt;/a&gt;Hack, in the sense of "workaround", created by humans, elegant or not, and not restricted to computing.&lt;br /&gt;&lt;br /&gt;My current contender is upper and lower case letters in English. It's like mixing two fonts in the same document. If scribes and early printers wanted ways to break up text, making different shapes for the same letters is an odd way to do it. Maybe space constraints were their real problem?&lt;br /&gt;&lt;br /&gt;And what about double quotes? Someone came up with the idea of using a small mark before and after a word or phrase to set apart. Then someone else decided to just use the same marks twice. I'm surprised we haven't seen triple and quad quotes appear over the centuries.&lt;br /&gt;&lt;br /&gt;What's your vote for the longest-living and largest hack in the history of humanity?&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-7360061814751790309?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/7360061814751790309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=7360061814751790309' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7360061814751790309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/7360061814751790309'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/07/largest-longest-living-hack-ever.html' title='The largest, longest-lasting hack ever?'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-5539597331619479602</id><published>2007-07-25T13:56:00.000-07:00</published><updated>2008-12-11T20:55:06.875-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='fisheye'/><title type='text'>Useful "FishEye for Jira" plugin</title><content type='html'>&lt;a href="http://www.atlassian.com/software/jira/"&gt;Jira&lt;/a&gt; is easy to integrate with CVS and Subversion, but there's a &lt;a href="http://confluence.atlassian.com/display/JIRAEXT/FishEye+for+JIRA"&gt;FishEye for Jira&lt;/a&gt; plugin that can give you even better integration. If you are using &lt;a href="http://www.cenqua.com/fisheye"&gt;FishEye&lt;/a&gt; (think &lt;a href="http://www.viewvc.org/"&gt;ViewVC&lt;/a&gt; on steroids, plus change logs) as a front-end to your CVS or Subversion repositories, you should definitely investigate this plugin.&lt;br /&gt;&lt;br /&gt;The screenshot below shows how the plugin replaces the &lt;span style="font-style: italic;"&gt;Commit &lt;/span&gt;tab in Jira with a new &lt;span style="font-style: italic;"&gt;FishEye &lt;/span&gt;tab.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tWiBHHTQAEM/Rqe8qZtKJgI/AAAAAAAAAd0/wawUX87fxQY/s1600-h/fisheye-for-jira.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_tWiBHHTQAEM/Rqe8qZtKJgI/AAAAAAAAAd0/wawUX87fxQY/s400/fisheye-for-jira.png" alt="" id="BLOGGER_PHOTO_ID_5091245340406457858" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Why is this a better approach?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The default mechanism used by Jira to connect issues to commits is by looking for issue identifiers in commit messages. For example, a commit with the message "Fixing TST-1234 again" is probably referring to the issue TST-1234. So far, so good.&lt;br /&gt;&lt;br /&gt;The problem is that getting this information from CVS and tracking ongoing changes involves running "cvs log" and parsing the output. I recently came across one such file that was 90MB and took 10 minutes of churn to produce. Since the commit is only connected to the issue when this file is reparsed, there is often a sizable delay between making a commit and seeing it appear for the issue in Jira. Subversion integration with Jira is less of a load on the Subversion server, but still suffers from the same delay.&lt;br /&gt;&lt;br /&gt;The FishEye plugin is much smarter than that. It uses the FishEye API to remotely query your FishEye instance each time that you refresh the FishEye tab of an issue inside Jira. FishEye has already indexed all the commits for its own purposes, so it can provide up-to-date results far faster than the out-of-the-box approach. Another benefit is that Jira no longer needs to load down the CVS server, or even contact the Subversion server.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Nitty Gritty&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Installation is just like any other plugin, with some configuration in a &lt;span style="font-family: courier new;"&gt;.properties&lt;/span&gt; file. Remember to enable the API access in FishEye, and use the same names for repositories in the configuration file that you used when defining them in FishEye.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-5539597331619479602?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/5539597331619479602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=5539597331619479602' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/5539597331619479602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/5539597331619479602'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/07/useful-fisheye-for-jira-plugin.html' title='Useful &quot;FishEye for Jira&quot; plugin'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_tWiBHHTQAEM/Rqe8qZtKJgI/AAAAAAAAAd0/wawUX87fxQY/s72-c/fisheye-for-jira.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-8209136239641471201</id><published>2007-07-18T09:04:00.001-07:00</published><updated>2007-07-18T09:04:46.583-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Priority Inflation</title><content type='html'>In most companies and projects, limited resources mean that as the ship date for a release approaches, only bugs with Priority 1 and 2 get fixed; the others are closed or deferred. Over time this practice leads to priority inflation. Someone entering a bug knows that this bug won't stop the product, but she remembers that none of her Priority 3 bugs got fixed last time and she really wants this one fixed, so she makes it a Priority 2. In the extreme, by a process of induction, all bugs become Priority 1 bugs and the purpose of the field is lost.&lt;br /&gt;&lt;br /&gt;There's not much you can do about this except be aware of it happening and remind people what the priority fields are actually for.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-8209136239641471201?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/8209136239641471201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=8209136239641471201' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8209136239641471201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8209136239641471201'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/07/priority-inflation.html' title='Priority Inflation'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-3343591915071767841</id><published>2007-07-18T08:09:00.000-07:00</published><updated>2007-07-18T13:17:39.776-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='o&apos;reilly'/><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>The Lack of Difference between Priority, Severity, and Urgency</title><content type='html'>Chapter 7 of &lt;a href="http://www.oreilly.com/catalog/practicalde"&gt;Practical Development Environment&lt;/a&gt; discusses tracking bugs. This article expands on ideas about bug priorities from there. The short version is "life is simpler if you rename all your priority fields to show who cares about one."&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.bugbash.net/strips/bug-bash20060417.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://www.bugbash.net/strips/bug-bash20060417.gif" alt="" border="0" /&gt;&lt;/a&gt;The strip is from Hans Bjordahl's very funny &lt;a href="http://www.bugbash.net/comic/48.html"&gt;Bug Bash site&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Priority, Severity, Urgency, ... huh?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Most bugs have a field to indicate how serious the bug is. A common series of values goes something like this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;1 - The bug stops the product, and no workaround is possible&lt;/li&gt;&lt;li&gt;2 - The bug stops the product, but a workaround is possible&lt;/li&gt;&lt;li&gt;3 - The bug breaks a minor part of the product&lt;/li&gt;&lt;li&gt;4 - The bug is cosmetic or an irritation&lt;/li&gt;&lt;/ul&gt;To make this field useful,  you have to make it really easy for users to find out what each value is supposed to mean, right when they are entering the bug. Some people expect higher values to mean that the bug is more important. Some bug trackers provide&lt;span style="font-size:78%;"&gt;  &lt;/span&gt;&lt;span style="font-size:78%;"&gt;tiny little icons&lt;/span&gt; to confuse you still further because you can't remember what each icon means.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Where's that Thesaurus?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But there are more serious problems with this field in practice. The first problem is that English has a lot of words for some rather similar ideas. Quick, does "priority" mean the same as "importance"? What's the difference between "urgency" and "severity"? If English is not a user's first language, this makes using your bug tracker much harder work. Yes, the words do have specific meanings but if you have to stop and think about those meanings, then they're not good words to use. My suggestion is to pick one word and use it exclusively. I'm going to use "Priority" for the rest of this discussion, but you can choose your own favorite.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Priority for Who?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;"But that's not right!"you mutter, "priority doesn't mean the same as urgency." Well, actually, I think it does, &lt;span style="font-style: italic;"&gt;depending on who's priority we're referring to&lt;/span&gt;. For instance, the priority of a particular bug for the engineering team is a totally different thing from the priority of the very same bug for a Sales Engineer on site with a customer breathing down their neck. The different words usually mean priority for different groups of people. If they really do mean different things, then make it more obvious.  For instance, use "Due Date" instead of "Urgency" to make the sense of time explicit.&lt;br /&gt;&lt;br /&gt;My key suggestion is to have multiple priorities for a bug but name them per team. For example, the fields could be Development Priority, QA Priority, Support Priority, and so on. You can even have a "CFO Priority" for bugs that are stopping a contract being signed at the end of a quarter. That way, everyone gets to record which bugs really matter to them, and then they can work out which ones get worked on first. And as a side benefit, no-one gets offended when their favorite bug's priority is reduced to "Minor".&lt;br /&gt;&lt;br /&gt;Of course, this approach means that the leaders of the teams involved in producing the product have to talk to each other regularly about what they actually want the teams to work on. Call me crazy, but that seems like a good idea to me.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Priorities that are set by Customers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One last thought: some companies allow customers to enter a priority when filing a bug. This usually becomes a "how irritated are you right now?"  field. Which is useful data, but perhaps not what you originally expected to record in that field. However, when you change the value of the customer's Prioritity field, it's always a problem. If you increase the severity, the customer worries whether the problem is perhaps part of a bigger issue. If you decrease the severity, you appear to be minimizing his distress. If you provide this kind of field for customers, I suggest you allow them change the values themselves.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-3343591915071767841?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/3343591915071767841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=3343591915071767841' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/3343591915071767841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/3343591915071767841'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/07/lack-of-difference-between-priority.html' title='The Lack of Difference between Priority, Severity, and Urgency'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-19195280846022392</id><published>2007-07-12T11:47:00.000-07:00</published><updated>2007-07-12T11:54:25.962-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Unit Testing and the New Testament</title><content type='html'>Taken out of context and not the intended meaning, but last Sunday it struck me that this reads like a quote from some article about unit testing:&lt;br /&gt;&lt;span id="en-NIV-29177" class="sup"&gt;&lt;/span&gt;&lt;blockquote&gt;"Each one should test his own actions. Then he can take pride in himself, without comparing himself to somebody else, &lt;span id="en-NIV-29178" class="sup"&gt;&lt;/span&gt;for each one should carry his own load."&lt;/blockquote&gt;Galatians 6:4,5 (NIV)&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-19195280846022392?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/19195280846022392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=19195280846022392' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/19195280846022392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/19195280846022392'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/07/unit-testing-and-new-testament.html' title='Unit Testing and the New Testament'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-4375283763675479546</id><published>2007-07-11T09:10:00.000-07:00</published><updated>2007-07-11T15:53:02.915-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='o&apos;reilly'/><category scheme='http://www.blogger.com/atom/ns#' term='reviews'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Review: Beautiful Code</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.oreilly.com/catalog/covers/9780596510046_cat.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://www.oreilly.com/catalog/covers/9780596510046_cat.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Rating:&lt;br /&gt;&lt;br /&gt;10/10&lt;/span&gt; for all developers beyond their first project.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9/10&lt;/span&gt; for beginners who may not see as much of the beauty yet.&lt;br /&gt;&lt;br /&gt;Edited by longtime O'Reilly editor &lt;a href="http://www.oreillynet.com/pub/au/36"&gt;Andy Oram&lt;/a&gt; and pragmatic academic &lt;a href="http://www.third-bit.com/"&gt;Greg Wilson&lt;/a&gt;, their new book &lt;a href="http://www.oreilly.com/catalog/9780596510046"&gt;Beautiful Code&lt;/a&gt; (O'Reilly, June 2007,  618 pages, US $44.99)  is a collection of 33 chapters written by a number of people who have all written lots of ugly code, and then written some very beautiful code.  Each chapter is a chance for them to describe the ideas and code that they feel stand out in a humdrum world of temporary workarounds that last forever.&lt;br /&gt;&lt;br /&gt;The list of authors is impressive, including "K&amp;R" Kernighan, "Pearls" Bentley, and many of the names behind some substantial modern software projects, but the first thing that I noticed about this book was &lt;span style="font-style: italic;"&gt;lots &lt;/span&gt;of code snippets, in languages that range from Fortran to Python. And the code snippets are indeed beautifully formatted (with a good lay-flat binding). But in the end the beautiful code is included to make the ideas behind it all the more concrete, in which it surely succeeds.&lt;br /&gt;&lt;br /&gt;The range of topics is the next obvious aspect, from writing a regex matcher, to what makes an API useful. I've included the whole list at the end of this review and you'll likely see something that catches your own interest.&lt;br /&gt;&lt;br /&gt;Another theme of the book is that almost no-one gets it right first time, but just look at what can be done when you keep trying.  As we hear in preschool, "the process is as important as the product", and watching any expert at work is always educational. This book describes experts' mistakes, their wrong paths, "aha!" moments and then their final successes with admirable honesty.&lt;br /&gt;&lt;br /&gt;So how much of a developer do you have to be to appreciate this book? My guess is that you should have written a good-sized project, and then admitted to yourself that your creation was ugly. Only then can you see beauty by comparison. This book is destined to become a classic.&lt;br /&gt;&lt;p&gt;~Matt&lt;/p&gt;&lt;p&gt;Disclaimer: Greg Wilson reviewed my book &lt;a href="http://www.oreilly.com/catalog/practicalde"&gt;Practical Development Environments&lt;/a&gt; in 2005, and O'Reilly sent me a copy of &lt;span style="font-style: italic;"&gt;Beautiful Code&lt;/span&gt; for this review.&lt;br /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;br /&gt;The book includes:&lt;p&gt;Chapter 1, &lt;span style="color:red;"&gt;&lt;em&gt;A Regular Expression Matcher&lt;/em&gt;&lt;/span&gt;, by Brian Kernighan, shows how deep insight into a language and a problem can lead to a concise and elegant solution.&lt;/p&gt; &lt;p&gt;Chapter 2, &lt;span style="color:red;"&gt;&lt;em&gt;Subversion's Delta Editor: Interface as Ontology&lt;/em&gt;&lt;/span&gt;, by Karl Fogel, starts with a well-chosen abstraction and demonstrates its unifying effects on the system's further development.&lt;/p&gt; &lt;p&gt;Chapter 3, &lt;span style="color:red;"&gt;&lt;em&gt;The Most Beautiful Code I Never Wrote&lt;/em&gt;&lt;/span&gt;, by Jon Bentley, suggests how to measure a procedure without actually executing it.&lt;/p&gt; &lt;p&gt;Chapter 4, &lt;span style="color:red;"&gt;&lt;em&gt;Finding Things&lt;/em&gt;&lt;/span&gt;, by Tim Bray, draws together many strands in Computer Science in an exploration of a problem that is fundamental to many computing tasks.&lt;/p&gt; &lt;p&gt;Chapter 5, &lt;span style="color:red;"&gt;&lt;em&gt;Correct, Beautiful, Fast (In That Order): Lessons From Designing XML Verifiers&lt;/em&gt;&lt;/span&gt;, by Elliotte Rusty Harold, reconciles the often conflicting goals of thoroughness and good performance.&lt;/p&gt; &lt;p&gt;Chapter 6, &lt;span style="color:red;"&gt;&lt;em&gt;Framework for Integrated Test: Beauty through Fragility&lt;/em&gt;&lt;/span&gt;, by Michael Feathers, presents an example that breaks the rules and achieves its own elegant solution.&lt;/p&gt; &lt;p&gt;Chapter 7, &lt;span style="color:red;"&gt;&lt;em&gt;Beautiful Tests&lt;/em&gt;&lt;/span&gt;, by Alberto Savoia, shows how a broad, creative approach to testing can not only eliminate bugs but turn you into a better programmer.&lt;/p&gt; &lt;p&gt;Chapter 8, &lt;span style="color:red;"&gt;&lt;em&gt;On-the-Fly Code Generation for Image Processing&lt;/em&gt;&lt;/span&gt;, by Charles Petzold, drops down a level to improve performance while maintaining portability.&lt;/p&gt; &lt;p&gt;Chapter 9, &lt;span style="color:red;"&gt;&lt;em&gt;Top-Down Operator Precedence&lt;/em&gt;&lt;/span&gt;, by Douglas Crockford, revives an almost forgotten parsing technique and shows its new relevance to the popular JavaScript language.&lt;/p&gt; &lt;p&gt;Chapter 10, &lt;span style="color:red;"&gt;&lt;em&gt;The Quest for an Accelerated Population Count&lt;/em&gt;&lt;/span&gt;, by Henry S. Warren, Jr., reveals the impact that some clever algorithms can have on even a seemingly simple problem.&lt;/p&gt; &lt;p&gt;Chapter 11, &lt;span style="color:red;"&gt;&lt;em&gt;Secure Communication: The Technology of Freedom&lt;/em&gt;&lt;/span&gt;, by Ashish Gulhati, discusses the directed evolution of a secure messaging application that was designed to make sophisticated but often confusing cryptographic technology intuitively accessible to users.&lt;/p&gt; &lt;p&gt;Chapter 12, &lt;span style="color:red;"&gt;&lt;em&gt;Growing Beautiful Code in BioPerl&lt;/em&gt;&lt;/span&gt;, by Lincoln Stein, shows how the combination of a flexible language and a custom-designed module can make it easy for people with modest programming skills to create powerful visualizations for their data.&lt;/p&gt; &lt;p&gt;Chapter 13, &lt;span style="color:red;"&gt;&lt;em&gt;The Design of the Gene Sorter&lt;/em&gt;&lt;/span&gt;, by Jim Kent, combines simple building blocks to produce a robust and valuable tool for gene researchers.&lt;/p&gt; &lt;p&gt;Chapter 14, &lt;span style="color:red;"&gt;&lt;em&gt;How Elegant Code Evolves With Hardware: The Case Of Gaussian Elimination&lt;/em&gt;&lt;/span&gt;, by Jack Dongarra and Piotr Luszczek, surveys the history of LINPACK and related major software packages, to show how assumptions must constantly be re-evaluated in the face of new computing architectures.&lt;/p&gt; &lt;p&gt;Chapter 15, &lt;span style="color:red;"&gt;&lt;em&gt;The Long-Term Benefits of Beautiful Design&lt;/em&gt;&lt;/span&gt;, by Adam Kolawa, explains how attention to good design principles many decades ago helped CERN's widely used mathematical library (the predecessor of LINPACK) stand the test of time.&lt;/p&gt; &lt;p&gt;Chapter 16, &lt;span style="color:red;"&gt;&lt;em&gt;The Linux Kernel Driver Model: The Benefits of Working Together&lt;/em&gt;&lt;/span&gt;, by Greg Kroah-Hartman, explains how many efforts by different collaborators to solve different problems led to the successful evolution of a complex, multithreaded system.&lt;/p&gt; &lt;p&gt;Chapter 17, &lt;span style="color:red;"&gt;&lt;em&gt;Another Level of Indirection&lt;/em&gt;&lt;/span&gt;, by Diomidis Spinellis, shows how the flexibility and maintainability of the FreeBSD kernel is promoted by abstracting operations done in common by many drivers and filesystem modules.&lt;/p&gt; &lt;p&gt;Chapter 18, &lt;span style="color:red;"&gt;&lt;em&gt;Python's Dictionary Implementation: Being All Things to All People&lt;/em&gt;&lt;/span&gt;, by Andrew Kuchling, explains how a careful design combined with accommodations for a few special cases allows a language feature to support many different uses.&lt;/p&gt; &lt;p&gt;Chapter 19, &lt;span style="color:red;"&gt;&lt;em&gt;Multi-Dimensional Iterators in NumPy&lt;/em&gt;&lt;/span&gt;, by Travis E. Oliphant, takes you through the design steps that succeed in hiding complexity under a simple interface.&lt;/p&gt; &lt;p&gt;Chapter 20, &lt;span style="color:red;"&gt;&lt;em&gt;A Highly Reliable Enterprise System for NASA's Mars Rover Mission&lt;/em&gt;&lt;/span&gt;, by Ronald Mak, uses industry standards, best practices, and Java technologies to meet the requirements of a NASA expedition where reliability cannot be in doubt.&lt;/p&gt; &lt;p&gt;Chapter 21, &lt;span style="color:red;"&gt;&lt;em&gt;ERP5: Designing for Maximum Adaptability&lt;/em&gt;&lt;/span&gt;, by Rogerio Atem de Carvalho and Rafael Monnerat, shows how a powerful ERP system can be developed with free software tools and a flexible architecture.&lt;/p&gt; &lt;p&gt;Chapter 22, &lt;span style="color:red;"&gt;&lt;em&gt;A Spoonful of Sewage&lt;/em&gt;&lt;/span&gt;, by Bryan Cantrill, lets the reader accompany the author through a hair-raising bug scare and a clever solution that violated expectations.&lt;/p&gt; &lt;p&gt;Chapter 23, &lt;span style="color:red;"&gt;&lt;em&gt;Distributed Programming with MapReduce&lt;/em&gt;&lt;/span&gt;, by Jeff Dean and Sanjay Ghemawat, describes a system that provides an easy-to-use programming abstraction for large-scale distributed data processing at Google that automatically handles many difficult aspects of distributed computation, including automatic parallelization, load balancing, and failure handling.&lt;/p&gt; &lt;p&gt;Chapter 24, &lt;span style="color:red;"&gt;&lt;em&gt;Beautiful Concurrency&lt;/em&gt;&lt;/span&gt;, by Simon Peyton Jones, removes much of the difficulty of parallel program through Software Transactional Memory, demonstrated here using Haskell.&lt;/p&gt; &lt;p&gt;Chapter 25, &lt;span style="color:red;"&gt;&lt;em&gt;Syntactic Abstraction: The syntax-case Expander&lt;/em&gt;&lt;/span&gt;, by Kent Dybvig, shows how macros-a key feature of many languages and systems-can be protected in Scheme from producing erroneous output.&lt;/p&gt; &lt;p&gt;Chapter 26, &lt;span style="color:red;"&gt;&lt;em&gt;Labor-Saving Architecture: An Object-Oriented Framework for Networked Software&lt;/em&gt;&lt;/span&gt;, by William Otte and Douglas C. Schmidt, applies a range of standard object-oriented design techniques, such as patterns and frameworks, to distributed logging to keep the system flexible and modular.&lt;/p&gt; &lt;p&gt;Chapter 27, &lt;span style="color:red;"&gt;&lt;em&gt;Integrating Business Partners the RESTful Way&lt;/em&gt;&lt;/span&gt;, by Andrew Patzer, demonstrates a designer's respect for his programmers by matching the design of a B2B web service to its requirements.&lt;/p&gt; &lt;p&gt;Chapter 28, &lt;span style="color:red;"&gt;&lt;em&gt;Beautiful Debugging&lt;/em&gt;&lt;/span&gt;, by Andreas Zeller, shows how a disciplined approach to validating code can reduce the time it takes to track down errors.&lt;/p&gt; &lt;p&gt;Chapter 29, &lt;span style="color:red;"&gt;&lt;em&gt;Treating Code as an Essay&lt;/em&gt;&lt;/span&gt;, by Yukihiro Matsumoto, lays out some challenging principles that drove his design of the Ruby programming language, and that, by extension, will help produce better software in general.&lt;/p&gt; &lt;p&gt;Chapter 30, &lt;span style="color:red;"&gt;&lt;em&gt;When a Button Is All That Connects You to the World&lt;/em&gt;&lt;/span&gt;, by Arun Mehta, takes you on a tour through the astounding interface design choices involved in a text editing system that allow people with severe motor disabilities, like Professor Stephen Hawking, to communicate via a computer.&lt;/p&gt; &lt;p&gt;Chapter 31, &lt;span style="color:red;"&gt;&lt;em&gt;Emacspeak: The Complete Audio Desktop&lt;/em&gt;&lt;/span&gt;, by TV Raman, shows how Lisp's advice facility can be used with Emacs to address a general need-generating rich spoken output-that cuts across all aspects of the Emacs environment, without modifying the underlying source code of a large software system.&lt;/p&gt; &lt;p&gt;Chapter 32, &lt;span style="color:red;"&gt;&lt;em&gt;Code in Motion&lt;/em&gt;&lt;/span&gt;, by Laura Wingerd and Christopher Seiwald, lists some simple rules that have unexpectedly strong impacts on programming accuracy.&lt;/p&gt; &lt;p&gt;Chapter 33, &lt;span style="color:red;"&gt;&lt;em&gt;Writing Programs for "The Book,"&lt;/em&gt;&lt;/span&gt; by Brian Hayes, explores the frustrations of solving a seemingly simple problem in computational geometry, and its surprising resolution. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-4375283763675479546?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/4375283763675479546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=4375283763675479546' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/4375283763675479546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/4375283763675479546'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/07/review-beautiful-code.html' title='Review: Beautiful Code'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-8839681982296759574</id><published>2007-07-10T10:05:00.000-07:00</published><updated>2007-07-11T14:45:18.666-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pragmatics'/><title type='text'>Using computers in another way</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://oldcomputers.net/pics/ZX81-doorstop.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px;" src="http://oldcomputers.net/pics/ZX81-doorstop.jpg" alt="doorstop" border="0" /&gt;&lt;/a&gt;It seems to be the final destination for many machines - the doorstop. The lucky ones may become a foot rest or supports for the next generation of monitors. I'll have to bear that in mind next time I spend money on a machine - what else can I use that box for?&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-8839681982296759574?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/8839681982296759574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=8839681982296759574' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8839681982296759574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8839681982296759574'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/07/it-seems-to-be-final-destination-for.html' title='Using computers in another way'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-2844360955233934483</id><published>2007-07-06T09:45:00.000-07:00</published><updated>2008-12-11T20:55:07.074-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><title type='text'>Field-level permissions in Jira</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tWiBHHTQAEM/Ro6jfkRWI8I/AAAAAAAAAdQ/QGhPMKziteI/s1600-h/read-only-fix-versions.PNG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_tWiBHHTQAEM/Ro6jfkRWI8I/AAAAAAAAAdQ/QGhPMKziteI/s400/read-only-fix-versions.PNG" alt="" id="BLOGGER_PHOTO_ID_5084180792055571394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Notice how the Fix Version/s field is read-only? This is something that &lt;a href="http://jira.atlassian.com/browse/JRA-1330"&gt;many people&lt;/a&gt; have wanted for a while with Jira. I've posted a description of how I restricted who can edit individual fields on the &lt;a href="http://confluence.atlassian.com/display/JIRAEXT/Using+Templates+to+control+edit+of+an+issue"&gt;wiki for Atlassian Jira&lt;/a&gt;. It doesn't handle the case of completely hiding a field from a group of people, but It Worked For Me.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;~Matt&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-2844360955233934483?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/2844360955233934483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=2844360955233934483' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/2844360955233934483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/2844360955233934483'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/07/notice-how-fix-versions-field-is-read.html' title='Field-level permissions in Jira'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_tWiBHHTQAEM/Ro6jfkRWI8I/AAAAAAAAAdQ/QGhPMKziteI/s72-c/read-only-fix-versions.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-2944776189554566670</id><published>2007-07-03T16:28:00.000-07:00</published><updated>2007-07-03T16:37:30.663-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><title type='text'>Writing an Effective Bug Report</title><content type='html'>&lt;b&gt;&lt;/b&gt;This is a short excerpt from &lt;a href="http://www.oreilly.com/catalog/practicalde"&gt;Practical Development Environments&lt;/a&gt; and contains a number of useful links to other guidelines.&lt;br /&gt;&lt;br /&gt;~Matt&lt;br /&gt;&lt;br /&gt;The three key points to bear in mind when creating a bug report should be:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;How to reproduce the bug, as precisely as possible, and how often this will make the bug appear&lt;/li&gt;&lt;li&gt;What should have happened, at least in your opinion&lt;/li&gt;&lt;li&gt;What actually happened, or at least as much information as you have recorded&lt;/li&gt;&lt;/ul&gt; Many applications can generate a textual description of how they have been installed and configured. If such a description is available, you should always add it to the bug. The application may also contain some tests to check that it is still configured correctly. If so, you should run the tests and attach their results too.&lt;br /&gt;&lt;br /&gt;As well as providing correct and useful information in the bug, it's important to check that you behave as expected for the project. This is especially true for open source projects. Maybe you should ask questions first on a users' mailing list before escalating the issue to a developers' mailing list? Or you may mark a bug as maximum priority, because it's stopping your work, only to see it downgraded because no one else is blocked by that bug. Etiquette is important, and imperious commands to "fix this bug immediately" rarely help anything.&lt;br /&gt;&lt;br /&gt;One common cause of frustration with bug tracking systems is related to how their information is added. Bugs are too often added with vague descriptions, missing information, premature conclusions, or a best guess at the real build label. A classic situation is when a complex program has a bug deep inside it, but the only error message that is visible is one from some unrelated area. That area often gets bugs from the deeper level assigned to it, much to the frustration of the developer responsible for it. Adding some good local documentation to wherever people add new bugs can go a long way to improving the quality of all the bugs.&lt;br /&gt;&lt;br /&gt;Some useful documents with general advice about creating bugs include the Mozilla Project's&lt;a href="http://www.mozilla.org/quality/bug-writing-guidelines.html"&gt; Bug Writing Guidelines&lt;/a&gt; and Simon Tatham's &lt;a href="http://www.chiark.greenend.org.uk/%7Esgtatham/bugs.html"&gt;How to Report Bugs Effectively&lt;/a&gt;. There are also many examples of more site-specific documents about writing bug reports; these contain product specific information such as descriptions of what each part of the product does. Two of these are Opera's &lt;a href="http://www.opera.com/support/bugs/guidelines"&gt;Guidelines for Filing Good Bug Reports&lt;/a&gt;  and FreeBSD's &lt;a href="http://www.freebsd.org/doc/en_US.ISO8859-1/articles/problem-reports/article.html"&gt;Writing FreeBSD Problem Reports&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Slightly off-topic, but also useful, is Eric S. Raymond and Rick Moen's classic article &lt;a href="http://www.catb.org/%7Eesr/faqs/smart-questions.html"&gt;How to&lt;br /&gt;Ask Questions the Smart Way&lt;/a&gt;. This document has some excellent reminders and strong opinions about how to interact well with groups of technical volunteers.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-2944776189554566670?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/2944776189554566670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=2944776189554566670' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/2944776189554566670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/2944776189554566670'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/07/writing-effective-bug-report.html' title='Writing an Effective Bug Report'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-4283859073650810044</id><published>2007-06-27T11:44:00.000-07:00</published><updated>2007-06-29T08:15:59.631-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><title type='text'>Using Jira for Test Tracking</title><content type='html'>I'm giving a brief talk tomorrow on using Jira for Test Tracking at the first California Atlassian User Group tomorrow. More details on the user group may be found &lt;a href="http://confluence.atlassian.com/display/AUG/June+28%2C+2007+Atlassian+User+Group+in+Palo+Alto%2C+CA+USA"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;(update: here are the &lt;a href="http://www.pobox.com/%7Edoar/UsingJiraForTestTracking.zip"&gt;slides&lt;/a&gt; and they're also attached to the Atlassian page)&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-4283859073650810044?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/4283859073650810044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=4283859073650810044' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/4283859073650810044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/4283859073650810044'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/06/using-jira-for-test-tracking.html' title='Using Jira for Test Tracking'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-412254327487682709</id><published>2007-06-19T10:23:00.000-07:00</published><updated>2007-07-10T10:13:04.531-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pragmatics'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>On the Naming of Protocols</title><content type='html'>Words to never use in your protocol name: "simple", "trivial", "lightweight", since the results never are.&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-412254327487682709?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/412254327487682709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=412254327487682709' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/412254327487682709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/412254327487682709'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/06/on-naming-of-protocols.html' title='On the Naming of Protocols'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-77354812377138591</id><published>2007-06-19T10:07:00.000-07:00</published><updated>2007-06-19T14:35:20.909-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Signs That You Are Not Comfortable With The Command Line</title><content type='html'>Some signs that you aren't as comfortable as you could be when using a command line. Drawn from observations over twenty years at many companies.&lt;br /&gt;&lt;h4&gt;Runs all over the Tennis Court&lt;/h4&gt;To see what's in a directory, you type:&lt;br /&gt;&lt;pre&gt;cd  very/long/path&lt;br /&gt;ls&lt;br /&gt;&lt;/pre&gt;or even worse&lt;br /&gt;&lt;pre&gt;cd very&lt;br /&gt;cd long&lt;br /&gt;cd  path&lt;br /&gt;ls&lt;br /&gt;&lt;/pre&gt;This is the easy way: &lt;p&gt;&lt;/p&gt;&lt;pre&gt;ls very/long/path&lt;br /&gt;&lt;/pre&gt;&lt;h4&gt;Drives With Accelerator, Brake, Accelerator, Brake, ...&lt;/h4&gt;&lt;p&gt;You start an editor to look at a file, then quit the editor to list the directory, then start the editor to look at the file again. Repeat. At least bring up another window and edit the file from there. Or browse the directory from inside your editor. &lt;/p&gt;&lt;h4&gt;Tells Jokes With Too Much Detail&lt;/h4&gt;&lt;p&gt;You type every character in file or directory names. Autocompletion comes with almost every shell and will do the typing for you. &lt;/p&gt;&lt;h4&gt;Never Takes Elevators&lt;/h4&gt;&lt;p&gt;You move around the command line only with the arrow keys. Sometimes doesn't even hold them down for repeat but instead presses the desired key many, many times. Keboard shortcuts to move around and delete larger blocks of text such as words not used. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-77354812377138591?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/77354812377138591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=77354812377138591' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/77354812377138591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/77354812377138591'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/06/signs-that-you-are-not-comfortable-with.html' title='Signs That You Are Not Comfortable With The Command Line'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-6533730755055958836</id><published>2007-06-19T10:00:00.000-07:00</published><updated>2007-06-19T14:35:47.898-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Word Doesn't Play Nicely With Code</title><content type='html'>&lt;div id="page"&gt;    &lt;div id="pagecontent"&gt;             Don't cut and paste from Word or Outlook into Eclipse, Jira or any non-Windows application. Or if you do, then at least disable the smart-quotes stuff in Word  How to disable smart quotes in word:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tools, AutoCorrect Options, AutoCorrect - uncheck all correct and capitalize boxes &lt;/li&gt;&lt;li&gt;Tools, AutoCorrect Options, AutoFormat As You Type - uncheck all correct and capitalize boxes &lt;/li&gt;&lt;li&gt;Tools, AutoCorrect Options, AutoFormat - uncheck all correct and capitalize boxes &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Windows applications use a character set that is not UTF-8, which is what is used by most browsers, editors, etc. This is usually not a problem since the Windows character set is mostly compatible, but if you have smart-anything enabled inWord (smart-quotes, auto-format etc) then character such as double quotes and hyphens get quietly converted into characters that look nicer on the screen but don't work in source code.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;The following pipeline will tell you which Java files contain non-ASCII characters. These might be valid instances of non-ASCII characters, but they ought to be checked. &lt;/p&gt; &lt;span style="font-weight: bold;"&gt;&lt;/span&gt;   &lt;pre&gt;[mdoar@toolsdev Projects]$ find SystemServices/ -name "*.java" | xargs perl -nwe 'print "$ARGV\n" if /[^[:ascii:]]/'  | sort | uniq -c | sort -rn | more&lt;br /&gt;19 SystemServices/src/java/com/packetmotion/sysservice/exception/SystemException.java&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;To see the line numbers in each file: &lt;/p&gt; &lt;pre&gt;[mdoar@toolsdev Projects]$ find SystemServices/ -name "*.java" | xargs perl -nwe 'print "$ARGV:$.\n" if /[^[:ascii:]]/'&lt;br /&gt;&lt;/pre&gt;       &lt;/div&gt;    &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-6533730755055958836?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/6533730755055958836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=6533730755055958836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6533730755055958836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/6533730755055958836'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/06/word-doesnt-play-nicely-with-code.html' title='Word Doesn&apos;t Play Nicely With Code'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6447842370303639082.post-8992151190321216081</id><published>2007-06-19T09:55:00.000-07:00</published><updated>2007-06-19T14:36:08.370-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><title type='text'>Some Different Approaches to Integration</title><content type='html'>&lt;div id="page"&gt;    &lt;div id="pagecontent"&gt;               &lt;p&gt;"Customers buy this as a single product, so think of it as a single product!"&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;The recommended approach if you want to make a change that you know will break other people's code (and it's &lt;b&gt;your&lt;/b&gt; responsibility to test for that as far as possible), then &lt;b&gt;you&lt;/b&gt; should communicate (not a one-way email) with the people involved and agree which of the methods below you are going to use to minimize disruption to the rest of the organization. &lt;/p&gt; &lt;h4 id="section-SomeDifferentApproachesToIntegration-Example"&gt;Example&lt;/h4&gt; &lt;p&gt;Vivek wants to remove a method named &lt;tt&gt;getFunky()&lt;/tt&gt; from a class used by the Client, and maybe by other components. &lt;/p&gt; &lt;ol&gt;&lt;li&gt;He makes his changes in his sandbox and checks that they work, then builds as much of the whole product as he can. &lt;/li&gt;&lt;li&gt;He notices that as expected he will break the Client &lt;/li&gt;&lt;li&gt;Just to make sure, he also looks at the Javadoc or uses Eclipse to identify other users of the method, and finds out that the Manager now uses &lt;tt&gt;getFunky&lt;/tt&gt; too. Good thing he checked! &lt;/li&gt;&lt;li&gt;He communicates with two developers who are comfortable with changing the affected code in the Client and Manager, and together they decide how to make the necessary changes (see the choices below for some ideas) &lt;/li&gt;&lt;li&gt;Just to repeat the obvious - an email sent to a group and gets no responses is not communication, it's just a feeble excuse at teamwork. Integration requires two-way exchanges. &lt;/li&gt;&lt;li&gt;The changes are committed and life moves on. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;No prizes for guessing that I don't think much of approach #2 (Break the Build), but if you decide to do this, make sure that you mail &lt;tt&gt;all-eng@example.com&lt;/tt&gt; so that everyone else in the team is aware and isn't inconvenienced by the broken build. &lt;/p&gt; &lt;p&gt;Handy tip: your local address book may show who is in each email alias &lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h4 id="section-SomeDifferentApproachesToIntegration-DifferentApproaches"&gt;Different Approaches&lt;/h4&gt; &lt;h4 id="section-SomeDifferentApproachesToIntegration-1.DonTRemoveTheExistingFunctionalityJustAddTheNewFunctionality"&gt;1. Don't remove the existing functionality, just add the new functionality&lt;/h4&gt; &lt;p&gt;Pros: Nothing should break &lt;/p&gt; &lt;p&gt;Cons: Can be fiddly to get right, leads to overly complex code that eventually needs removing anyway &lt;/p&gt; &lt;h4 id="section-SomeDifferentApproachesToIntegration-2.CheckItInBreakTheBuildAndWaitForOtherPeopleToFixIt"&gt;2. Check it in, break the build, and wait for other people to fix it&lt;/h4&gt; &lt;p&gt;Pros: Quick and easy, for you at least. &lt;/p&gt; &lt;p&gt;Cons: Can bring development for the rest of the company to a halt. Not a career-enhancing approach if used too often. &lt;/p&gt; &lt;h4 id="section-SomeDifferentApproachesToIntegration-3.SendOutTheChangedFilesInEmailForPeopleToDevelopAgainstBeforeYouCommitThem"&gt;3. Send out the changed files in email for people to develop against before you commit them&lt;/h4&gt; &lt;p&gt;Pros: Simple &lt;/p&gt; &lt;p&gt;Cons: You may miss some, tedious for people to use. Generally, a bit 20th century. &lt;/p&gt; &lt;h4 id="section-SomeDifferentApproachesToIntegration-4.SendOutAPatchForAllTheChangedFiles"&gt;4. Send out a patch for all the changed files&lt;/h4&gt; &lt;p&gt;Pros: less likely to miss files, a bit easier to apply &lt;/p&gt; &lt;p&gt;Cons: harder to send multiple changes as multiple patches &lt;/p&gt; &lt;h4 id="section-SomeDifferentApproachesToIntegration-5.CreateAPrivateBranchMakeYourChangesThereTellPeopleWhichDirectoriesToUseTheBranchedVersionFor."&gt;5. Create a private branch, make your changes there, tell people which directories to use the branched version for.&lt;/h4&gt; &lt;p&gt;Pros: Easier to continue working on your changes and for other people to accept them when ready &lt;/p&gt; &lt;p&gt;Cons: A bit more work to set up the branch in the first place &lt;/p&gt;      &lt;/div&gt;    &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Matt Doar, Consulting Toolsmiths.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6447842370303639082-8992151190321216081?l=toolsmiths.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://toolsmiths.blogspot.com/feeds/8992151190321216081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6447842370303639082&amp;postID=8992151190321216081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8992151190321216081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6447842370303639082/posts/default/8992151190321216081'/><link rel='alternate' type='text/html' href='http://toolsmiths.blogspot.com/2007/06/some-different-approaches-to.html' title='Some Different Approaches to Integration'/><author><name>Matt Doar</name><uri>http://www.blogger.com/profile/02360651363519410698</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_tWiBHHTQAEM/RmRe1X6jBAI/AAAAAAAAAAM/sr1ljo3vrBY/s320/mdoar.jpg'/></author><thr:total>0</thr:total></entry></feed>
