<?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-6367023863906450017</id><updated>2012-01-13T06:13:45.604-05:00</updated><category term='cape cod'/><category term='summers'/><category term='2009'/><category term='toastmasters'/><category term='web'/><category term='software synthetic biology standards building blocks'/><category term='books'/><category term='coders'/><category term='death'/><category term='junit'/><category term='competition'/><category term='assemble'/><category term='phone'/><category term='self-awareness geek social skills'/><category term='corporate'/><category term='stackoverflow'/><category term='practice'/><category term='summer'/><category term='iphone'/><category term='job'/><category term='testng'/><category term='lack relational database modeling design'/><category term='spring'/><category term='ladder'/><category term='changing jobs'/><category term='2010 moving'/><category term='mathjax'/><category term='procrastination'/><category term='bayes'/><category term='review'/><category term='bed'/><category term='dance'/><category term='little brown'/><category term='notebook'/><category term='transactional'/><category term='2010 python pycharm django learning programming'/><category term='reading'/><category term='2011 nietzsche music ipod'/><category term='ssd'/><category term='java'/><category term='security'/><category term='tracking'/><category term='success'/><category term='Moore&apos;s Law'/><category term='usa national debt gaap rudeawakening'/><category term='hierarchy'/><category term='greenspan'/><category term='digital photography writers block daily post'/><category term='pushups'/><category term='climate change'/><category term='computers'/><category term='asthma'/><category term='c'/><category term='2010 breakfast meeting'/><category term='irish'/><category term='fragile friendships'/><category term='obama'/><category term='rain'/><category term='climbing'/><category term='interview'/><category term='android'/><category term='ikea'/><category term='desktop'/><category term='practice code kata binary tree'/><category term='build'/><category term='autumn'/><category term='swimming'/><category term='TeX'/><category term='statistics'/><category term='testing'/><category term='president'/><category term='google'/><category term='jetbrains'/><category term='seibel'/><category term='gail collins'/><category term='moving'/><category term='resolutions'/><category term='when everything changed'/><category term='2011'/><category term='cupcake'/><category term='change'/><category term='mandelbrot'/><category term='winter'/><category term='oireachtas'/><category term='jsMath'/><category term='Godot Beckett Broadway literature Roundabout Theater'/><category term='Blackberry'/><category term='riding'/><category term='moleskine'/><category term='bicycle'/><category term='python'/><category term='planning'/><category term='jsMath TeX LaTeX math typesetting'/><category term='new year'/><category term='cycling'/><category term='code'/><category term='born'/><category term='learning'/><category term='upgrades'/><category term='Facebook'/><category term='hardware'/><category term='database'/><category term='new england'/><category term='LaTeX mathematics typesetting learning'/><category term='first day'/><category term='rubin'/><category term='pycharm'/><category term='math'/><category term='practice code kata binary tree iterators preord'/><category term='pov'/><category term='pbs'/><category term='election'/><category term='speaking'/><category term='vacation'/><category term='vietnam'/><category term='programming'/><category term='r'/><category term='2011 reading essex whaling'/><category term='2010'/><category term='GAAP accounting debt economy'/><category term='communication'/><category term='frontline'/><category term='electronics'/><category term='derivatives'/><category term='running'/><category term='2010 books lewis &quot;wall street&quot;'/><category term='abstraction'/><category term='mathematics'/><category term='UML software design agile waterfall'/><category term='spolsky'/><category term='snow'/><category term='data'/><category term='fiction'/><category term='raking'/><category term='2011 desktop computer build assemble'/><category term='LaTeX'/><category term='fitness'/><category term='leaves'/><category term='typesetting'/><title type='text'>Craic Propagation</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>92</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-6552824348998198185</id><published>2012-01-11T20:48:00.001-05:00</published><updated>2012-01-11T21:26:55.437-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interview'/><category scheme='http://www.blogger.com/atom/ns#' term='job'/><title type='text'>First Job</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-vGSvwmW1Kz0/Tw43ay9kyaI/AAAAAAAAAQI/I_gcZBf0WIM/s1600/first-job.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="273" width="185" src="http://4.bp.blogspot.com/-vGSvwmW1Kz0/Tw43ay9kyaI/AAAAAAAAAQI/I_gcZBf0WIM/s320/first-job.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;  &lt;br /&gt;&lt;br /&gt;I got a phone call tonight that I've been anxiously awaiting.  My oldest daughter called from New York City to share happy news: She accepted an offer for her first full-time job.  She'll be working for a small firm in New York City that advises clients on how to preserve and archive audio-visual collections.&lt;br /&gt;&lt;br /&gt;I'm so proud of her.  She graduated with a bachelor of arts degree from a small liberal arts college in May 2008 as the economy in the United States came to a crashing halt.  Friends who graduated one year earlier had several offers to choose from, but months of applications and pounding the sidewalks turned up nothing.  She had to come back home to live while she continued her search.  &lt;br /&gt;&lt;br /&gt;She hustled.  She was a tutor at the high school in town.  She coached her beloved cross-country and track teams.  The girls loved her for it, but she was biding her time until the economy improved.  She lived frugally, saved her money, and made plans for two years.  She went to New York City to get a Masters degree from Queens College, completing it just a few weeks ago in December.&lt;br /&gt;&lt;br /&gt;I've worried that her efforts might not be rewarded.  We've always believed in the promise of education.  What would happen if a second degree, paid for out of the money she squirreled away for two years, failed to deliver a job that could provide independence?  All that dissolved when the phone call came at 6:20 pm.  She was asked to come in at 6 pm tonight for a second interview to meet the founder of the company.  It wasn't a long conversation.  They liked her.  I imagine a scene that looked something like this:&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/-_ezztB66TbU/Tw5DwcWxbRI/AAAAAAAAAQU/9_aHfGz79_4/s1600/my-first-job-interview.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="173" width="292" src="http://3.bp.blogspot.com/-_ezztB66TbU/Tw5DwcWxbRI/AAAAAAAAAQU/9_aHfGz79_4/s320/my-first-job-interview.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I saw a great link &lt;a href="http://www.hunterwalk.com/2011/12/14-dos-donts-upon-taking-new-job.html"&gt;"14 Do's and Don'ts Upon Taking A New Job"&lt;/a&gt;, with advice for anyone starting a new job, be it their first or one in a long line.  I think it's spot on, worth keeping in mind.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;I've had a &lt;a href="http://craicpropagation.blogspot.com/2009/03/last-day-first-day.html"&gt;lot of first days&lt;/a&gt; on new jobs.  I can't wait to hear how her first of first days goes.  &lt;br /&gt;&lt;br /&gt;Congratulations, my love.  Well done; well deserved.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt; &lt;br /&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt; &lt;img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers"&gt; &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt; &lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-6552824348998198185?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/6552824348998198185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=6552824348998198185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/6552824348998198185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/6552824348998198185'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2012/01/first-job.html' title='First Job'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-vGSvwmW1Kz0/Tw43ay9kyaI/AAAAAAAAAQI/I_gcZBf0WIM/s72-c/first-job.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-686085744306436912</id><published>2012-01-08T12:41:00.000-05:00</published><updated>2012-01-08T12:43:55.436-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='build'/><category scheme='http://www.blogger.com/atom/ns#' term='ssd'/><category scheme='http://www.blogger.com/atom/ns#' term='desktop'/><title type='text'>Speed</title><content type='html'>&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-CtfxlmP5DVg/TwnR7_geCLI/AAAAAAAAAP8/e8DeDHE-ECw/s1600/go-speed.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="198" width="254" src="http://1.bp.blogspot.com/-CtfxlmP5DVg/TwnR7_geCLI/AAAAAAAAAP8/e8DeDHE-ECw/s320/go-speed.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;That new computer that I assembled in 2011 (read &lt;a href="http://craicpropagation.blogspot.com/2011/04/building-desktop-computer.html"&gt;here &lt;/a&gt;and &lt;a href="http://craicpropagation.blogspot.com/2011/10/my-new-computer-is-finally-operational.html"&gt;there&lt;/a&gt;) is screaming along now.  &lt;br /&gt;&lt;br /&gt;My original idea was to install the operating system on my first SSD.  When I placed my order at Newegg.com, only a 40GB SSD was available in my price range.  I found that the disk was almost full after installing Windows 7.  Not good!  I put the OS up on the 1TB mechanical hard drive so I could get the machine up and running.&lt;br /&gt;&lt;br /&gt;But my delay and procrastination had one benefit: it gave Moore's Law time to work its magic.  The size of SSDs has been going up while the prices have come down.  I see rough prices of $1.50 per GB for SSDs now; I can get 120 or 240GB disks without too much trouble.&lt;br /&gt;&lt;br /&gt;I decided to spring for a 120GB SSD and start again.  I had invested in a lovely two-disk tray that makes installing a new one as easy as inserting it into the drawer and snapping it into place.  Now I have two: the operating system is installed on the 120GB SSD, while the 40GB drive houses data and software projects.&lt;br /&gt;&lt;br /&gt;It's amazing to see how responsive this machine is.  I have 6 CPUs, 8GB of RAM, and a Nvidia video card.  I still have a 1TB internal hard drive and an external 1TB drive that connects via USB.  I use the external drive as a backup.  &lt;br /&gt;&lt;br /&gt;What to do with that 1TB internal drive?&lt;br /&gt;&lt;br /&gt;I decided to install Ubuntu on the mechanical hard drive and set it up to dual boot with Windows 7.  Now I have a Unix machine with gcc available to me.  I'd love to install the CUDA SDK and start writing C++ to exercise their linear algebra and FFT libraries.  It's one of the projects that I have in mind for 2012.&lt;br /&gt;&lt;br /&gt;I've installed R and Tinn-R.  I've begun working my way through "Doing Bayesian Data Analysis" by John Kruschke.  It's been a revelation; I'll be writing more about that soon.  That's another project for 2012.&lt;br /&gt;&lt;br /&gt;2011 was a decent year for technical learning, but I need to step things up quite a bit.  This new machine will be a great platform for doing so.&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt; &lt;br /&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt; &lt;img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers"&gt; &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt; &lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-686085744306436912?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/686085744306436912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=686085744306436912' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/686085744306436912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/686085744306436912'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2012/01/speed.html' title='Speed'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-CtfxlmP5DVg/TwnR7_geCLI/AAAAAAAAAP8/e8DeDHE-ECw/s72-c/go-speed.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-5809072286879458093</id><published>2011-12-29T10:50:00.000-05:00</published><updated>2011-12-29T16:29:25.981-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='reading'/><title type='text'>The First Law</title><content type='html'>&lt;!-- Put content here, Michael --&gt;  &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-uGhwPcfDeI8/TvyDjR1SrDI/AAAAAAAAAPw/YIWYbKtfmK8/s1600/bladeitself.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="160" width="104" src="http://2.bp.blogspot.com/-uGhwPcfDeI8/TvyDjR1SrDI/AAAAAAAAAPw/YIWYbKtfmK8/s320/bladeitself.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;No, this isn't a posting about thermodynamics.  I've been on a fantasy reading streak in 2011.  It started when I went to my local library one Saturday morning and saw a copy of George R. R. Martin's "Game of Thrones" on the shelf.  I don't subscribe to HBO, so I've never seen the series.  I'd heard enough about it to kindle a spark of book lust in my heart.  When I went back to work, I found out that some friends were already deeply into it.  Buy.com was selling a &lt;a href="http://www.amazon.com/George-Martins-Thrones-4-Book-Boxed/dp/0345529057/ref=pd_sim_b_3"&gt;four-book boxed set&lt;/a&gt; for cheap.  Soon I was off and running.&lt;br /&gt;&lt;br /&gt;"Game of Thrones" was great fun to read - think "Lord of the Rings" with lots of sex and violence.  The characters are memorable.  The plot lines are tangled and convoluted.  There are bogeymen still waiting behind the wall to jump out and scare all of us in future books.  I was very happy when the fifth book, &lt;a href="http://www.amazon.com/Dance-Dragons-Song-Fire-Book/dp/0553801473/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1325171952&amp;sr=1-1"&gt;"A Dance with Dragons"&lt;/a&gt;, came out just as I was finishing the fourth book.  The first book was published in 1996.  Long-suffering fans had to wait six whole years between the fourth and fifth books; my wait was as long as finishing the last page of "A Feast For Crows" and then downloading the newly-minted book onto my Kindle.&lt;br /&gt;&lt;br /&gt;But I found that there were problems with the series.&lt;br /&gt;&lt;br /&gt;Each book is a daunting task - they average 800-1000 pages each.  That means a lot of characters to keep track of, a lot of balls for the juggler to keep in the air, and a lot of filler material.  There were times when some of my favorite characters (Jon Snow and his sister Arya) got short shrift, while others that I cared about less dominated the story line.&lt;br /&gt;&lt;br /&gt;Repetition has been with us since Homer's &lt;i&gt;Iliad  &lt;/i&gt;: it's wasn't enough for Odysseus to go sailing; he had to do it on the "wine-dark sea".  Homer knew that repetition would help lengthen the story and make it easier for the poet to memorize all those lines.  George Martin knows it, too.  It's always "Myrrish lace" and "Valyrian steel".  &lt;br /&gt;&lt;br /&gt;There's more than a passing nod to J.R.R. Tolkien and his "Lord of the Rings" - still the greatest fantasy work I've read.  Tolkien made up maps, history, languages, and whole alphabets to flesh out his stories.  You're a true fan if you've read his "Silmarillion", the detailed pre-history to the trilogy.  He's famous for stopping the story to tell you about people, places, and events that seem to be well-known to all his characters, but you haven't a clue.  George R. R. Martin - are those initials real or an affectation? - takes this to another level.  He's obviously a Grateful Dead fan: &lt;a href="http://www.dead.net/song/i-need-miracle"&gt;"Too much of everything is just enough"&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Most of all, there were several times when I thought Mr. Martin could have used an editor.  The books would have benefited from having a detached, objective adviser to tighten things up.  I felt like the odd numbered books were all excellent.  The even numbered books dragged a bit by comparison.  There's a lot of set-up material that pays off eventually, but it's a long time coming.&lt;br /&gt;&lt;br /&gt;Joe Abercrombie obviously had an editor when he wrote his "First Law" trilogy: &lt;a href="http://www.amazon.com/Blade-Itself-First-Law-Book/dp/159102594X/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1325173027&amp;sr=1-1"&gt;"The Blade Itself"&lt;/a&gt;, &lt;a href="http://www.amazon.com/Before-They-Are-Hanged-First/dp/1591026415/ref=sr_1_3?s=books&amp;ie=UTF8&amp;qid=1325173027&amp;sr=1-3"&gt;"Before They Are Hanged"&lt;/a&gt;, and &lt;a href="http://www.amazon.com/Last-Argument-Kings-First-Law/dp/0575084162/ref=sr_1_6?s=books&amp;ie=UTF8&amp;qid=1325173027&amp;sr=1-6"&gt;"The Last Argument Of Kings"&lt;/a&gt;.  The books are more manageable in size - 500-800 pages - but the characters are equally vivid as Mr. Martin's.  I had some trouble getting started with the first book, because I had some distractions that kept me from focusing.  But once it grabbed me I was hooked.&lt;br /&gt;&lt;br /&gt;The thing that I liked best about Joe Abercrombie's writing is that he takes timeless elements and gives them a twist.  There are standbys like a small group that journeys to a remote location in search of a precious artifact.   The group faces dangers that alter characters for better or worse, that bind or split them apart.  There's conflict and war and long odds to be overcome.  But there's always a perturbation that sets his take apart.  For example, there's a wizard named Bayaz who may appear to be Gandalf-like at first, but there's deep, dark water underneath.&lt;br /&gt;&lt;br /&gt;I've finished my non-technical backlog.  It's time to jump back on my technical stack.   I received John K. Kruschke's &lt;a href="http://www.amazon.com/Doing-Bayesian-Data-Analysis-Tutorial/dp/0123814855/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1325173645&amp;sr=1-1"&gt;"Doing Bayesian Data Analysis"&lt;/a&gt;.  I'll be writing about it as soon as I manage to make some headway.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt; &lt;br /&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;   &lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt; &lt;br /&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt; &lt;img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers"&gt; &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-5809072286879458093?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/5809072286879458093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=5809072286879458093' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/5809072286879458093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/5809072286879458093'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2011/12/first-law.html' title='The First Law'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-uGhwPcfDeI8/TvyDjR1SrDI/AAAAAAAAAPw/YIWYbKtfmK8/s72-c/bladeitself.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-1890173642681359886</id><published>2011-11-30T20:00:00.000-05:00</published><updated>2011-11-30T20:00:02.895-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2011'/><category scheme='http://www.blogger.com/atom/ns#' term='learning'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='practice'/><title type='text'>How Do Your Get To Carnegie Hall?</title><content type='html'>&lt;!-- Put content here, Michael --&gt;  &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/-9Pg8zYoKykk/TtLkGZwpkuI/AAAAAAAAAPA/nhdk5n90yJY/s1600/carnegie-hall.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="200" width="252" src="http://3.bp.blogspot.com/-9Pg8zYoKykk/TtLkGZwpkuI/AAAAAAAAAPA/nhdk5n90yJY/s320/carnegie-hall.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It's an old joke: &lt;br /&gt;&lt;br /&gt;A man stops a New Yorker on the sidewalk and asks him, "How do you get to Carnegie Hall?"  The native answers: "Practice, practice, practice!"&lt;br /&gt;&lt;br /&gt;Except it's not quite true.  Practice is necessary, but not sufficient.&lt;br /&gt;&lt;br /&gt;It's &lt;i&gt;perfect &lt;/i&gt;practice that makes perfect.  It won't do to simply burn bad habits into your muscle and brain memories.  You have to repeat the right behavior to be able to recall it at a moment's notice.&lt;br /&gt;&lt;br /&gt;I knew this after years of doing scales and arpeggio studies on the classical guitar.  Sometimes I felt like I was practicing in my bad habits, because I wasn't focused enough on what I was doing.&lt;br /&gt;&lt;br /&gt;Peter Norvig made me aware of the rule of 10,000 hours in his &lt;a href="http://norvig.com/21-days.html"&gt;"Teach Yourself Programming In Ten Years"&lt;/a&gt;.  He presents five citations, including Malcolm Gladwell.  &lt;br /&gt;&lt;br /&gt;Now the &lt;a href="http://www.freakonomics.com/2011/11/25/to-develop-expertise-motivation-is-necessary-but-insufficient/"&gt;Freakonomics&lt;/a&gt; guys have added their two cents: "The how of learning is deliberate practice."&lt;br /&gt;&lt;br /&gt;This is true in sports, music, math, programming - everything.  Technique matters; it's how you do it.&lt;br /&gt;&lt;br /&gt;I've found that to be true in my new running venture.  My new-found techniques learned by running barefoot have made it possible for me to run the Manchester Road Race without pain or stiffness.  I was able to run the next day without any discomfort, although I will confess that my legs were tired.  The only after-effect that consistently follows a run is tiredness in my feet.  They're finally waking up after years of slumbering in their shoe cocoons.  I think I've succeeded in learning how to run injury-free in middle age.&lt;br /&gt;&lt;br /&gt;I have to remember that more when I work on my programming skills.  I need to identify objectives better and be more aggressive about conquering them and making them mine.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt; &lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt; &lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt; &lt;img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers"&gt; &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-1890173642681359886?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/1890173642681359886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=1890173642681359886' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/1890173642681359886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/1890173642681359886'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2011/11/how-do-your-get-to-carnegie-hall.html' title='How Do Your Get To Carnegie Hall?'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-9Pg8zYoKykk/TtLkGZwpkuI/AAAAAAAAAPA/nhdk5n90yJY/s72-c/carnegie-hall.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-3364630099251670536</id><published>2011-11-23T17:25:00.001-05:00</published><updated>2011-11-29T19:25:14.196-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2011'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='bayes'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>Clocks and Roulette Wheels</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Vdax8rKiDCc/Ts-4Gl_J70I/AAAAAAAAAO0/qOz8GUopiNg/s1600/the-theory-that-would-not-die.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-Vdax8rKiDCc/Ts-4Gl_J70I/AAAAAAAAAO0/qOz8GUopiNg/s320/the-theory-that-would-not-die.jpg" width="212" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I've studied a fair amount of math during my education.  Engineers were required to take four math classes: two semesters of calculus, differential and integral; multivariate calculus; ordinary differential equations.  A fifth course in partial differential equations was recommended but optional.  The engineering courses reinforced and built on this base.  The prevailing wisdom was that the engineering department taught the same stuff as the math department, but better.  I guess we all liked it better when the engineering department presented the material because it came with a context that fixed the ideas in your head.&lt;br /&gt;&lt;br /&gt;I took all those and kept going.  I decided to sign up for complex variables and linear algebra, just because I liked math.  There were also two grad classes that presented integral transforms, calculus of variations, differential geometry, and generalized tensors.  The numerical methods that I studied followed the same track: linear algebra for solving large systems of equations and eigenvalues; numerical integration; evaluation of special functions.&lt;br /&gt;&lt;br /&gt;I never took a formal course in statistics or probability.  The last two graduate classes that I took were in the statistics department: analysis of variance and design of experiments.  I was glad to have taken them, but it certainly didn't turn me into a statistician.&lt;br /&gt;&lt;br /&gt;I recount all this because it's finally occurred to me that I've missed out on something important. When faced with quantum mechanics and the loss of determinism, Einstein said the God did not play dice.  I can't claim to know the gaming habits of God, but I can say that probability and statistics imbue everything around us.  They're stand-ins for ignorance, an expression of what we don't know or are uncertain about.&lt;br /&gt;&lt;br /&gt;Classical physicists, like Newton, Laplace and Einstein, viewed the universe as a clockwork.  Anything could be predicted, given enough information.  This is ironic in light of the great service that Laplace rendered to Bayes' theorem by putting it on such a firm mathematical footing.  Quantum mechanics killed this idea in the small; non-linearity did the deed in the large.  It's &lt;i&gt;all &lt;/i&gt;a roulette wheel.  Does that mean the universe is really a big casino?&lt;br /&gt;&lt;br /&gt;I became aware of two schools of thought in statistics: frequentists and Bayesians.  I read hints about the food fight that has been going on between the camps for two centuries, but I didn't understand exactly what it was about - until I read &lt;a href="http://www.amazon.com/s/ref=nb_sb_ss_i_1_12?url=search-alias%3Dstripbooks&amp;field-keywords=the+theory+that+would+not+die+how+bayes%27+rule+cracked+the+enigma+code&amp;x=0&amp;y=0&amp;sprefix=the+theory+t"&gt;"The Theory That Would Not Die"&lt;/a&gt; by Bertsch MyGrayne.  The writing style was a bit repetitive, but the story was wonderful.  &lt;br /&gt;&lt;br /&gt;There were two bits that I especially liked.  The first was a quote from Jerry Cornfield to his two daughters as he lay dying: "You spend your whole life practicing your humor for the times when you really need it."&lt;br /&gt;&lt;br /&gt;The second was from a section about Jimmie Savage and Dennis Lindley.  As the amount of data increases, subjectivists move into agreement, the way scientists come to a consensus as evidence accumulates: "That's the way science is done."&lt;br /&gt;&lt;br /&gt;I recently saw &lt;a href="http://www.amazon.com/Doing-Bayesian-Data-Analysis-Tutorial/dp/0123814855/ref=pd_cp_b_2"&gt;"Doing Bayesian Data Analysis: A Tutorial with R and BUGS"&lt;/a&gt; by John Kruschke on Amazon.  I was intrigued.  I knew Bayes and R; what was this BUGS thing about?  But now I know, thanks to "The Theory That Would Not Die": it stands for Bayesian Inference Using Gibbs Sampling.  There's even an &lt;a href="http://www.mrc-bsu.cam.ac.uk/bugs/"&gt;open source project&lt;/a&gt; that implements it as a framework.  I hope to check it out in the coming months.&lt;br /&gt;&lt;br /&gt;I'm planning to add a few items to my must-read list.  Probability will be on the list.  So will Kruschke's book.  &lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt; &lt;br /&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt; &lt;img alt="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" height="58" src="http://stackoverflow.com/users/flair/37213.png" title="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" width="208" /&gt; &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-3364630099251670536?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/3364630099251670536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=3364630099251670536' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3364630099251670536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3364630099251670536'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2011/11/clocks-and-roulette-wheels.html' title='Clocks and Roulette Wheels'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-Vdax8rKiDCc/Ts-4Gl_J70I/AAAAAAAAAO0/qOz8GUopiNg/s72-c/the-theory-that-would-not-die.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-8172585068073892937</id><published>2011-10-22T12:55:00.001-04:00</published><updated>2011-10-22T12:55:25.524-04:00</updated><title type='text'>"Boomerang"</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-gHFXlwYnivQ/TqLw-IutXZI/AAAAAAAAAOE/fRUFFNsnTOI/s1600/boomerang-cover.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="280" width="184" src="http://2.bp.blogspot.com/-gHFXlwYnivQ/TqLw-IutXZI/AAAAAAAAAOE/fRUFFNsnTOI/s320/boomerang-cover.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt; &lt;!-- Put content here, Michael --&gt;  &lt;br /&gt;&lt;br /&gt;It's an interesting time to be alive.  I love to read, and I'm awash in opportunities and technologies to make that possible.  I'm connected to the Internet 24x7.  I picked up a Kindle this year and like it very much, although it leaves something to be desired for reading technical material.  I'm reading the third edition ofPeter Norvig's "Artificial Intelligence: A Modern Approach" on the Kindle, but I find myself going back to the first edition because the figures don't read well and don't zoom in when the text is resized.&lt;br /&gt;&lt;br /&gt;No matter how technology marches on, I still love holding a &lt;i&gt;real &lt;/i&gt;book in my hand.  Going to the library is still and will always be one of my favorite things to do.  &lt;br /&gt;&lt;br /&gt;I was out and about this morning when I decided to pull into the town library to see what new books were on the shelves.  I have a lot to do this weekend, so kicking back with a book wasn't on the schedule.  &lt;br /&gt;&lt;br /&gt;I couldn't resist when I saw Michael Lewis's newest offering entitled &lt;a href="http://www.amazon.com/dp/0393081818/?tag=googhydr-20&amp;hvadid=7341179768&amp;ref=pd_sl_gb7f6o92k_b"&gt;"Boomerang"&lt;/a&gt;.  He had me at "boom".&lt;br /&gt;&lt;br /&gt;Michael Lewis has become one of my favorite authors.  I've written about how much I enjoyed his books &lt;a href="http://craicpropagation.blogspot.com/2010/04/big-short.html"&gt;"The Big Short"&lt;/a&gt; and &lt;a href="http://craicpropagation.blogspot.com/2010/10/liars-poker.html"&gt;"Liar's Poker"&lt;/a&gt;.   His experience on Wall Street selling bonds for Salomon Brothers gave him an insider's understanding of an industry that's driving our news.  There are few stories that compare to seeing the world's financial system teetering on the brink of collapse. &lt;br /&gt;&lt;br /&gt;That's not to take any credit away from Lewis's writing.  I've only read the prologue, but he finds a way to make the people and events memorable and entertaining.  What a great insight: "I think I'll travel to the countries that are on the brink to see why they went awry."  He's acting as the proxy for the hedge fund managers betting against foreign countries that they've never visited.  His voice is so clear, so uniquely his.  It's the essence of great story telling.  He manages to take an arcane, dry subject like finance and turn that straw into page-turning gold.  I admire him so much for developing that distinctive style and zeroing in on his subject.&lt;br /&gt;&lt;br /&gt;I've got a list of things to accomplish today, but I plan to spend a little time with Michael Lewis later on.  I can't wait!&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt; &lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt; &lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt; &lt;img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers"&gt; &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-8172585068073892937?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/8172585068073892937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=8172585068073892937' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/8172585068073892937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/8172585068073892937'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2011/10/boomerang.html' title='&quot;Boomerang&quot;'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-gHFXlwYnivQ/TqLw-IutXZI/AAAAAAAAAOE/fRUFFNsnTOI/s72-c/boomerang-cover.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-3529764792684325290</id><published>2011-10-15T15:38:00.000-04:00</published><updated>2011-10-15T15:38:37.965-04:00</updated><title type='text'>Operational At Last</title><content type='html'>&lt;!-- Put content here, Michael --&gt; &lt;br /&gt;&lt;br /&gt;My new computer is finally operational and on-line.&lt;br /&gt;&lt;br /&gt;I've never seen a modular power supply before, so it wasn't a surprise when my best assembly efforts were for naught.  &lt;br /&gt;&lt;br /&gt;Will did his best to sort me out over a cell phone, sight unseen. &lt;br /&gt;&lt;br /&gt;Steve and John tried to figure out what I'd done wrong by looking at photographs that I e-mailed, but the detail wasn't sufficient.&lt;br /&gt;&lt;br /&gt;It took a breakfast with Matt and Karim to see what my problem was.  I brought my non-functioning PC in the back of my car one Sunday, and the two of them opened it up and had at it when we were done eating.  They quickly diagnosed where I'd gone wrong and gave me the key to sorting it out.&lt;br /&gt;&lt;br /&gt;I had to order a couple more items: a fourth G-Skill DDR, to bring my total RAM to 8GB, and a 3.5" bay for my SSD so I could move it up in the case, right under the CD drive.&lt;br /&gt;&lt;br /&gt;When I first powered it up, using the wireless keyboard that is attached to my old machine, I was helpless.  No drivers were available for the wireless keyboard, so I picked up a wired keyboard for $19.&lt;br /&gt;&lt;br /&gt;I fired it up this afternoon and installed the Windows 7 64-bit OS.  After adding the drivers I was fully operational - except for my SSD.  I can see it in the BIOS; I can even see it listed as a disk drive in my device manager.  But Windows 7 only finds my hard drive, not the SSD.  I have to sort that out.  The hardware graphics acceleration is disabled as well; I think that's a BIOS setting.&lt;br /&gt;&lt;br /&gt;But it's nice to finally have this machine on-line and operational.  It took me a while, but I learned a lot.  There's still a lot of work to do installing software and moving documents from my old machine.  &lt;br /&gt;&lt;br /&gt;But I have a great sense of satisfaction today.  &lt;br /&gt;&lt;br /&gt;My sincerest thanks to Will, Steve, John, Matt, and Karim for the inspiration, patience, and advice.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt; &lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;   &lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt; &lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt; &lt;img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers"&gt; &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-3529764792684325290?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/3529764792684325290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=3529764792684325290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3529764792684325290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3529764792684325290'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2011/10/my-new-computer-is-finally-operational.html' title='Operational At Last'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-3003259203793509861</id><published>2011-09-18T14:54:00.001-04:00</published><updated>2011-09-18T14:54:43.644-04:00</updated><title type='text'>A Shock To The System</title><content type='html'>&lt;!-- Put content here, Michael --&gt;  &lt;br /&gt;&lt;br /&gt;I received shocking news at home last night: a friend sent a note telling me that my roommate from college, Luis DePina, &lt;a href="http://www.legacy.com/obituaries/norwichbulletin/obituary.aspx?n=luis-depina&amp;pid=153670483&amp;fhid=7008"&gt;passed away from brain stem cancer yesterday&lt;/a&gt;.  Born on 10-Aug-1957, he was just 54 years old.&lt;br /&gt;&lt;br /&gt;I remember the first time I met Lou like it was yesterday.  My parents brought me up to Storrs to move me into Colt House, an all-male dorm that was home to 60 young men, before the start of classes in Sep 1975.  They helped to lug my few possessions up the stairs to the fourth floor, got me sorted out, and then left me to my own devices.  I was reading on my newly-made bed when the door opened - and all light coming in from the hallway was blocked by the 6'4", 220 lbm man who stood in the doorway.  He stuck out his hand, said "Hi, I'm Lou DePina", and proceeded to move in.&lt;br /&gt;&lt;br /&gt;It helps to understand that I grew up in Greenwich, CT - as white bread, as homogeneous a place as there was.  I had never been past the steel-decked bridge near Sikorsky Aircraft in Stratford, CT.  I could have told you who the mayor of New York City was, but I didn't know who was the governor of Connecticut.  I had gone to a small Catholic high school, with a graduating class of 125.  There were two African-American students in my class during those four years.  One of them left before graduation to transfer to Greenwich High School to play football.  I didn't have a personal relationship with either of them.&lt;br /&gt;&lt;br /&gt;So it was a big change to be exposed to somebody so different from myself.  Lou was an engineering major too, but we couldn't have been more different.  I was awkward, worried, excessively religious, and had trouble connecting with all these strange people who thought so differently from me.  Lou was a gifted athlete - he had been recruited to play on the varsity baseball team, and could have played on the basketball team in Connecticut's pre-Big East days.  &lt;br /&gt;&lt;br /&gt;But most of all, he was a genius at making people like him.  &lt;br /&gt;&lt;br /&gt;He was immediately given the nickname "Rook", short for "Rookie", by the upperclassmen.  He then proceeded to ride roughshod over everyone in every competitive venue - be it basketball, foosball, or frisbee golf in the hallway.  He was elected president of the dorm.  Everyone who lived there knew and liked him.&lt;br /&gt;&lt;br /&gt;We would go out into the quad on nice days and throw a baseball back and forth.  I wasn't a baseball player, but I was game.  Lou was an outfielder with a terrific arm.  You had to pay attention when you were throwing with Lou, because you could &lt;i&gt;hear &lt;/i&gt;the ball whizzing through the air when it got close.  If you didn't position the pocket of the glove correctly you'd get a stinger that you wouldn't forget quickly.&lt;br /&gt;&lt;br /&gt;I don't know how Lou managed to play baseball and keep up with school in the spring.  I remember him coming back to the dorm exhausted after practice in the afternoon.  The irony was that he was throwing to warm-up one day when he took a ball in the eye.  He was talking with a teammate, and his throwing partner didn't realize that Lou's head was turned when he let the ball go.  That was the end of his baseball career at Connecticut.&lt;br /&gt;&lt;br /&gt;I found out later that Lou wasn't pleased at first with his new roommate.  He talked with others about switching up after the first semester, because  I wasn't having much fun.  But things started looking up during the spring after I learned how to drink alcohol.  The drinking age in Connecticut was 18 at the time.  I was of legal age in high school, but I wasn't a drinker.  I maintained that stance after going to college.  We used to get home-made pizza for dinner on Friday nights from time to time, which was accompanied by a keg of beer (try &lt;i&gt;that &lt;/i&gt;in today's litigious atmosphere).  A friend asked me if I wanted to play racquet ball at the fieldhouse one Friday afternoon.  When we returned from the game the pizza was gone, the keg was tapped, and there was a card game getting started in the cafeteria.  I sat down next to Lou and started to play.  He kept refilling my cup so I couldn't count how many beers I had drunk.  By the time the game was over I was under the influence for the first time.  They piled me into a car and took me to a party at another dorm, where they proceeded to introduce me to every girl we met by saying "He's drunk for the first time in his life."&lt;br /&gt;&lt;br /&gt;The spell was broken.  Lou taught me how to relax, to stop worrying so much, to enjoy myself, and to be interested in other people.  If I took some of those lessons too far for a time and had to correct course, that was my fault.  The lessons were well-needed and much appreciated.&lt;br /&gt;&lt;br /&gt;We parted on the best of terms after three years of living together because both of us accepted positions as resident assistants in the dorms.  It meant living alone in a single room.  Both of us were busy with school and other things.  Lou switched out of the college of engineering, so we didn't have classes together.  We didn't see as much of each other on campus after that.  I graduated in December and started working; Lou was still pursuing his degree.  We didn't see each other after that.  There was no e-mail, cell phones, Internet, or Facebook to help keep the connection alive.&lt;br /&gt;&lt;br /&gt;I ran into him again at a Hershey Track and Field meet in New Britain years later.  My oldest daughter was competing.  The skies opened after we arrived, so everyone had to take refuge under the bleachers.  There's where I saw Lou.  He was director of recreation in Norwich.  He had brought a group from the Y to the meet, including a young man with a beautiful, fluid sprinting style.  (We stood to the side in between downpours and admired his form, with Lou critiquing it for me.)  He told me that he was married and had a couple of young children in diapers.  He had suffered an Achilles injury that stopped him from playing basketball, so he'd taken up golf as a substitute.  It allowed him to continue to demonstrate his athletic prowess while doing what he did best - charming the people he played with.  I wasn't surprised to hear that Lou was a central figure in Norwich politics.&lt;br /&gt;&lt;br /&gt;It was the last time I saw him.&lt;br /&gt;&lt;br /&gt;I'm sad to think that someone who was so important to me for those three years could have slipped away.  It's a common thing, I suppose.  As I've progressed through each phase of my life - high school, college, and a myriad of jobs in two disparate fields - I've had the pleasure of meeting lots of people that I loved spending time with.  Lots of them are pleasant memories for me now.  There are only so many hours in the day, so much emotion and energy that one can expend in maintaining relationships.  Spouse, children, and family have to be the first priority.&lt;br /&gt;&lt;br /&gt;But it doesn't diminish the affection I have for those people in the least.&lt;br /&gt;&lt;br /&gt;There are three lessons here.  First, relationships take energy and effort to keep up.  You have to spend time in &lt;i&gt;face-to-face contact&lt;/i&gt;.  Sorry, Facebook.  A long-distance electronic relationship is better than nothing, but it's a poor substitute for the immediacy of being there.  Second, choose carefully.  If it's not possible to hang onto every single person that you ever thought highly of, then you have to pick and choose.  Let those people know that they're worth the effort.  Write that e-mail, pick up the phone, and arrange contact.  It can be breakfast, it can be a beer at a bar, it can be a stroll in the park.  Just &lt;i&gt;be &lt;/i&gt;there - early, late, and often.  Don't let years go by and be left to wonder what the hell happened.&lt;br /&gt;&lt;br /&gt;Third, and perhaps most important, is to not wait forever.  Our time here is finite, and you don't know when it will end.  If I've been waiting until my children were grown and settled to start picking up the thread with my old friend Lou, then I'm afraid that I waited too long.  The opportunity is passed, never to come again.  I hope I don't repeat that mistake.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt; &lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;   &lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt; &lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt; &lt;img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers"&gt; &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-3003259203793509861?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/3003259203793509861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=3003259203793509861' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3003259203793509861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3003259203793509861'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2011/09/shock-to-system.html' title='A Shock To The System'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-9202681899099674147</id><published>2011-09-11T20:37:00.001-04:00</published><updated>2011-09-11T20:37:54.352-04:00</updated><title type='text'>Born To Run</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-wyCd3viycW0/Tm1NFSY74dI/AAAAAAAAANA/Oyeky1Drvcg/s1600/born-to-run-cover_pb.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-wyCd3viycW0/Tm1NFSY74dI/AAAAAAAAANA/Oyeky1Drvcg/s320/born-to-run-cover_pb.jpg" width="208" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I wrote &lt;a href="http://craicpropagation.blogspot.com/2011_06_01_archive.html"&gt;earlier &lt;/a&gt;about my desire to learn to run again.  It's gone fairly well.  I have not pushed myself too hard in terms of mileage or frequency, but I'm happy to say that I've enjoyed it.  I've been trying to feel a good pace (on the order of 8 minutes per mile) and avoid injury.  It's been short, frequent repeats: half mile at a time on the road; quarter mile laps on a track.&lt;br /&gt;&lt;br /&gt;My oldest daughter returned from a summer spent working in San Francisco.  She had a pair of Vibram shoes and an autographed copy of Christopher McDougall's &lt;a href="http://www.amazon.com/Born-Run-Superathletes-Greatest-Vintage/dp/0307279189/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1315785270&amp;amp;sr=1-1"&gt;Born To Run&lt;/a&gt;.  I asked her if I could read it.&lt;br /&gt;&lt;br /&gt;I was hooked on the first page.  &lt;br /&gt;&lt;br /&gt;It's a riveting story, even if you're not interested in running.  I recommend it to everyone.  It begins with a visit to his doctor and a question: "Why does my foot hurt?"  He's a middle aged runner, like me, trying to figure out why this activity is breaking his body down.  &lt;br /&gt;&lt;br /&gt;He learns about the Tarahumara, a Mexican Indian tribe that is legendary for their ultra-marathon prowess.  It's a journey of discovery; he goes to the Copper Canyons to find them and learn their secrets.&lt;br /&gt;&lt;br /&gt;That's a compelling beginning, but I think it was the way he wove other characters and places into the narrative that grabbed me.  He introduced American runners and events.  It all culminates with a race over rugged terrain between the Tarahumara and American challengers, including the author.  &lt;br /&gt;&lt;br /&gt;It's great stuff.&lt;br /&gt;&lt;br /&gt;I loved the tie-in with evolution and biology.  Homo sapiens is the ultimate marathon running species.  Our bodies have evolved a unique combination of attributes that make us great runners (e.g. temperature regulation via sweating through the skin; Achilles tendon; a tendon to keep our heads from wobbling when we run; the capability to take multiple breaths per stride).&lt;br /&gt;&lt;br /&gt;The day after I finished the book I went to the place where I swim to get a workout in before heading over to work.  I noticed one of the fitness counselors had the book cover in the collage hanging on the wall that described his interests.  I was astonished to see a newspaper clipping showing Christopher McDougall leading a group of barefoot runners in Bushnell Park last October!&lt;br /&gt;&lt;br /&gt;I decided that I'd give barefoot running a try.&lt;br /&gt;&lt;br /&gt;There's a small track upstairs from the pool.  It's a mere 1/11th of a mile long, but it seemed like a safe place to try out barefoot running.  I went up one day and ran two miles in bare feet.  It felt strange but good.&lt;br /&gt;&lt;br /&gt;The next days were difficult.  My calves have not been worked like that in a long time, and the soles of my feet were on fire!  But I was willing, even eager, to try it again.&lt;br /&gt;&lt;br /&gt;My next effort was outside on a rubberized track at my local high school.  It was far too much sensation for my poor feet, so I had to run on the grass instead.  One visit turned into another.  I ran again in bare feet tonight.  It felt fine.  I may begin to enjoy this.&lt;br /&gt;&lt;br /&gt;I also picked up a copy of Ken Bob Saxon's&lt;a href="http://www.amazon.com/Barefoot-Running-Step-Shoeless-Technique/dp/1592334652/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1315787330&amp;amp;sr=1-1"&gt; Running Barefoot&lt;/a&gt;.  I learned a lot reading it; I'm looking forward to putting it into practice.  I was checking my cadence all afternoon.  I wasn't able to make the 180+ per minute cadence, but I was consistently in the 160-180 range.  I was easy, light, and smooth.&lt;br /&gt;&lt;br /&gt;My latest goal is still in sight.  The journey's been a good one so far.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt;&lt;br /&gt;&lt;img alt="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" height="58" src="http://stackoverflow.com/users/flair/37213.png" title="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" width="208" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-9202681899099674147?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/9202681899099674147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=9202681899099674147' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/9202681899099674147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/9202681899099674147'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2011/09/born-to-run.html' title='Born To Run'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-wyCd3viycW0/Tm1NFSY74dI/AAAAAAAAANA/Oyeky1Drvcg/s72-c/born-to-run-cover_pb.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-5441504292465918730</id><published>2011-08-09T19:59:00.007-04:00</published><updated>2011-08-09T20:14:14.755-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='2011'/><category scheme='http://www.blogger.com/atom/ns#' term='assemble'/><category scheme='http://www.blogger.com/atom/ns#' term='desktop'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>A New Computer</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-UpTNgJP-gX0/TkHKjsT-LjI/AAAAAAAAAMk/Mmyh0Jb7FBA/s1600/my-computer-closed.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-UpTNgJP-gX0/TkHKjsT-LjI/AAAAAAAAAMk/Mmyh0Jb7FBA/s320/my-computer-closed.jpg" alt="" id="BLOGGER_PHOTO_ID_5639010922983730738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;I spent the afternoon assembling the hardware I bought &lt;a href="http://craicpropagation.blogspot.com/2011/04/building-desktop-computer.html"&gt;three months ago&lt;/a&gt;.  Why the delay?  It was a near-fatal combination of being busy, ill, and a terrible procrastinator.  But there was nothing on the schedule today, so I decided that it was time to tackle it.&lt;br /&gt;&lt;br /&gt;It went far better than I thought it would.  I would put it right up there with IKEA.  The instructions were pretty good, and almost everything fit together nicely.  I started just after one o'clock this afternoon, and all the pieces were assembled before four o'clock.&lt;br /&gt;&lt;br /&gt;I was worried about the CPU and cooler, but they slid right into place.&lt;br /&gt;&lt;br /&gt;It wasn't clear at first where the solid-state disk drive would go, but the case was as ready as promised.&lt;br /&gt;&lt;br /&gt;Everything is in the case, ready to go.  Here's a shot with the side panel removed:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-FB1iYlCOeG4/TkHL9MKQ7qI/AAAAAAAAAMs/hWEab64qLNw/s1600/my-computer-open.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-FB1iYlCOeG4/TkHL9MKQ7qI/AAAAAAAAAMs/hWEab64qLNw/s320/my-computer-open.jpg" alt="" id="BLOGGER_PHOTO_ID_5639012460541308578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have a few questions I'd like to review with some friends who are more experienced than I am.  But once I have those resolved it'll be time to power up, set up the BIOS, and install the OS and software.&lt;br /&gt;&lt;br /&gt;It's going to be a terrific machine once it comes on line.  I'll wonder why it took me so long to get around to it.&lt;br /&gt;&lt;br /&gt;Thanks to Will, Steve, John, Karim, and Matt for their encouragement and inspiration.&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt;&lt;img src="http://stackoverflow.com/users/flair/37213.png" alt="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" height="58" width="208" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-5441504292465918730?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/5441504292465918730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=5441504292465918730' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/5441504292465918730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/5441504292465918730'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2011/08/new-computer.html' title='A New Computer'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-UpTNgJP-gX0/TkHKjsT-LjI/AAAAAAAAAMk/Mmyh0Jb7FBA/s72-c/my-computer-closed.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-1054014849406309223</id><published>2011-07-26T21:35:00.004-04:00</published><updated>2011-07-26T21:59:53.501-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2011'/><category scheme='http://www.blogger.com/atom/ns#' term='toastmasters'/><category scheme='http://www.blogger.com/atom/ns#' term='speaking'/><title type='text'>Keynote</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-9FV7cJcqJsU/Ti9rh3S0rBI/AAAAAAAAAMM/O07R7wAVH7o/s1600/keynote.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 188px; height: 125px;" src="http://1.bp.blogspot.com/-9FV7cJcqJsU/Ti9rh3S0rBI/AAAAAAAAAMM/O07R7wAVH7o/s320/keynote.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5633839888386534418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;I'm going to speak at my next Toastmasters meeting on Thu.  It's the sixth out of ten speeches required to earn the Advanced Communicator Bronze designation.  I'm working out of a manual entitled "The Professional Speaker."  The first assignment is to deliver a 15-20 keynote address.  It's easily the longest speech I've ever been asked to give.  &lt;br /&gt;&lt;br /&gt;I'm looking forward to it.&lt;br /&gt;&lt;br /&gt;Here's the text of the speech.  I thought I'd post it here for the hell of it.  Plus if I lose the text before I speak I can always come here and fetch it.&lt;br /&gt;&lt;br /&gt;“The Professional Speaker” &lt;br /&gt;Assignment 1: The Keynote Speech&lt;br /&gt;&lt;br /&gt;Target organization: young professionals at the start of their career.&lt;br /&gt;&lt;br /&gt;Mr. Toastmaster, fellow Toastmasters, and welcome guests:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Opening:&lt;/span&gt; One of the things that I love about working for a company like Travelers is seeing so many young people joining the firm.  You see them walking through The Link, well-dressed, clutching a Travelers red umbrella like it’s a lost-and-found family heirloom.  Eyes wide, ears open, frantically trying to remember the names in this maze of buildings so they’ll have a hope of appearing at their first meetings on time.  &lt;br /&gt;&lt;br /&gt;For some, this is their first job after earning a college degree.  They’re walking with ten league boots: separating themselves from their parents, living on their own, paying bills, being adults.  What a huge change!  If we view life as a series of decades, each its own transition, this is the foundation for adulthood.  This is when you start your career trajectory, think about marriage, and decide how you feel about children.  It’s the basis for our entire society.&lt;br /&gt;&lt;br /&gt;I remember &lt;span style="font-style:italic;"&gt;my &lt;/span&gt;first day on the job very well, but my gray hair gives me away.  It’s a distant memory: it’s been a long time since then.  Let’s inject some humor into this keynote, shall we?&lt;br /&gt;&lt;br /&gt;• There was no cable; no CNN or Fox or ESPN.&lt;br /&gt;• There was no Internet; no Facebook or Twitter.&lt;br /&gt;• There were no cell phones; no iPhone, Android, or BlackBerry.&lt;br /&gt;• There was &lt;span style="font-style:italic;"&gt;no e-mail&lt;/span&gt;.&lt;br /&gt;• Computers were kept in a separate room, with its own air-conditioning under the floor, and shared by an entire department.&lt;br /&gt;• Communicating with that computer meant some interactive terminals, but it also included punched paper cards.&lt;br /&gt;• There was a vault in which vellum blueprints were stored for each component.  Computer aided design and manufacturing was in its infancy.&lt;br /&gt;&lt;br /&gt;Compared to today’s office, those early state-of-the-art facilities felt like a scene out of Dicken’s “A Christmas Carol.”  More coal for the fire?&lt;br /&gt;&lt;br /&gt;The scope and scale of technological change is breathtaking, but the human elements are unchanged.  As I look back on my career, I thought about what I might have wanted to tell that younger version of myself.  Here are a few nuggets of wisdom that I offer for your consideration.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Story 1: &lt;/span&gt;Figure out what’s important to you.&lt;br /&gt;&lt;br /&gt;What’s your goal?  Is it money?  Climbing to the top of a corporate ladder?  Being an effective individual contributor with deep technical knowledge?  Whatever that goal is, spend some time figuring out what is important to you.  You can’t reach a goal unless you know what it is and the steps you’ll need to execute to get there.&lt;br /&gt;&lt;br /&gt;There is a price to pay for everything.  Positions of high reward come with great responsibility.  No one will ask about your child’s upcoming weekend activity when they send the limo to your house to whisk you off for a business trip.&lt;br /&gt;&lt;br /&gt;Pausing on the advancement ladder has a price as well.  Choosing to be an individual contributor might mean enduring the frustration of Cassandra: a prophetess whose advice was ignored when she told the Trojans to leave that wooden horse left by the Greeks outside the city gates.&lt;br /&gt;&lt;br /&gt;Know what you want.  &lt;br /&gt;&lt;br /&gt;Be prepared for the consequences of every decision you make.&lt;br /&gt;&lt;br /&gt;Make your own measure of success.  Take an alternate path.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Story 2: &lt;/span&gt;Consider alternative paths to success.&lt;br /&gt;&lt;br /&gt;I grew up in a different time.  The prevailing wisdom went like this: “Get a job with a well-regarded company.  Work your way up the ladder as high as you can, then retire on the terrific benefits they provided.”  There was an implied contract: be loyal to a company, and they’d repay you in kind.&lt;br /&gt;&lt;br /&gt;That contract is long gone.  Companies require greater labor flexibility, so employees need to take on more of the burden of managing and directing their careers.&lt;br /&gt;&lt;br /&gt;Alternative paths are on everyone’s radar now.  Your choice depends on your appetite for risk.  Perhaps you’d prefer being a contractor to full employee status.  Or maybe you’d rather go all in and start your own business.  This is not for the faint of heart.  There are no off days; all the success or failure will be yours to own.  You have to learn how to do the work and all the marketing, too.  It’s a balancing act: keeping just enough work coming in to make it possible to build your brand and deliver without working every waking moment or waiting for the phone to ring.&lt;br /&gt;&lt;br /&gt;Each of the past three decades has seen defining technologies and companies that drove them: personal computers and Microsoft in the 80s; the Internet and companies like Sun, Cisco, and Amazon in the 90s; search and Google at the start of this century; mobile and Apple going on right now.  All these sea changes produce opportunities that a smart person can capitalize on.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Story 3: &lt;/span&gt;Keep an eye on market forces.&lt;br /&gt;&lt;br /&gt;This leads to my next bit of advice: stay informed about your field and those that affect it.  You don’t want to be caught unprepared when the world changes.  No matter how comfortable and successful you might be, it pays to keep an eye on world events and extrapolate.  Have you noticed that every person in this room is likely to have an iPhone, Android, or Blackberry mobile device?  If you’re a software developer, and you aren’t writing for one of these mobile devices, you might be doing your future prospects a disservice.&lt;br /&gt;&lt;br /&gt;I went to a wedding recently.  One young man, whose first job out of school is sales for Microsoft, was rhapsodizing about a recent company meeting he attended.  As excited as he was about hearing Steve Ballmer speak, I hope he’s kept his eye on the rise of the mobile computer and the cloud, and the decline of the desktop.  His company may not figure out how to replace their desktop operating system and Office monopolies, but I’m sure he’ll have to soon.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Story 4: &lt;/span&gt;Keep learning.&lt;br /&gt;&lt;br /&gt;The people who were most expert in those technologies that predominated at the start of my career had to change and learn new things or be pushed aside.  The cruel truth is that this situation is only getting worse every day.  The pace at which new information is added to the world is only increasing.  &lt;br /&gt;&lt;br /&gt;I resisted the temptation to insert a statistic stating how many terabytes of information are added to the Internet every day, translating it into Library of Congress equivalents to make it meaningful to the audience.  But for ever page of fundamental new knowledge there are probably tens or hundreds of pages of celebrity gossip and other meaningless chaff to sift through.  I’ll summarize by saying that there are 6.8 billion people living on earth today, and those who are actively adding their bricks to the wall of knowledge are doing it at a rate that is increasing exponentially.&lt;br /&gt;&lt;br /&gt;Chances are good that all of us will have several careers during our working lives.  I can speak from personal experience: I’ve had two, and I’m expecting that I might have a third act in me.  I would not have had that second opportunity if I hadn’t kept learning.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Story 5: &lt;/span&gt;Enjoy what you do.&lt;br /&gt;&lt;br /&gt;“Choose a job you love, and you will never have to work a day in your life.”  This quote is attributed to Confucius and others; it’s still just as true today.  You’ll see a lot of stuff written about following your bliss, your passion.  The implication is that you just might be able to turn doing something you love into that custom fit career.  Whether it is photography or cooking or programming or speaking or something else, your chances of finding happiness pursuing a beloved activity are good.  If you’re lucky, financial success and fame might even accompany it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Story 6: &lt;/span&gt;Remember your co-workers.&lt;br /&gt;&lt;br /&gt;I was laid off from the first job I got out of school.  The economy was not very good at that time; in some ways it was worse off than it is now.  Interest rates, inflation, oil prices, and unemployment were all high.  A friend of mine recommended that I contact the Navy research lab in New London, CT.  It was a department loaded with Ph.D.s; I saw no good reason why they would want a young man without a graduate degree.  &lt;br /&gt;&lt;br /&gt;Art Carlson, the man who headed Code 44, took pity on me and offered me a job.  The two years that I spent there made all the difference in the world.  I completed a Masters degree, learned a skill that I loved, and – most important of all – got my confidence back.  I moved on from that job and managed to earn a Ph.D. of my own.  After graduation I wrote a letter to Art Carlson to thank him for giving me that chance.  I said that everything that happened to me subsequent to that interview was because of him.&lt;br /&gt;&lt;br /&gt;I was told later by people I worked with that Art showed that letter to everyone he encountered at the lab.  It might have meant as much to him as it did to me.&lt;br /&gt;&lt;br /&gt;Work is a team sport.  All of us are dependent on the good will of fellow contributors to meet our goals.  Remember to be the kind of person that co-workers can recall with respect at minimum and fondness at best.  You never know when you’ll encounter them again as you progress through your career.&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Story 7: &lt;/span&gt;Don’t sell yourself short.&lt;br /&gt;&lt;br /&gt;My father was an immigrant who came to America from Ireland.  He didn’t want to be a farmer, so he left home to find economic opportunity in America.  When he landed in New York and came to CT, he thought he’d died and gone to heaven.  He worked at the utility company that maintained the water system in town.  He was a backhoe operator; a union guy, through and through.&lt;br /&gt;&lt;br /&gt;I grew up imbued with his work ethic.  I worked for that water company during the summer between semesters in college, so I had a taste of what manual labor was like.  I was grateful to study something that made brain work possible for me.&lt;br /&gt;&lt;br /&gt;I’ve always loved the details of technical work, but I think I also absorbed the lesson that managing and directing work wasn’t for me.  Underneath it all, I’m also a union guy, a laborer.  &lt;br /&gt;&lt;br /&gt;Part of me knows that this was a good thing, because I’m an emotional person with a thin skin.  &lt;br /&gt;&lt;br /&gt;But there’s another part of me that wonders why I never aspired to be the person who directed the activities of others.  The people I’ve observed who have been in charge of things where I worked have been a mixed bag.  A few have been inspirational, brilliant leaders, but when I think of the majority of them I can’t help but look back and wonder if I couldn’t have done at least as well.&lt;br /&gt;&lt;br /&gt;The first step in becoming a leader is believing in your heart that you’re someone worth following; the second is persuading others that they ought to believe it, too.  Work hard to have an idea of your own, a vision for how things could be, and then get to work persuading others that you’re right.  Don’t hesitate to put yourself forward.  You might surprise yourself. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Conclusion:&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;If I could choose one message that my younger self could have heard and taken to heart, I think it would have been the one about alternative paths to success.  Oh, and maybe something like “Bill Gates will become the world’s richest man by writing a Quick Basic compiler and having the nerve to call IBM’s bluff over DOS” or “Page and Brin will make themselves the kings of search by solving an eigenvalue problem; you know what that is.”.  All of us are limited by what we don’t know.  People who prepare themselves well, are attuned to the opportunities that come along are the ones, and are bold enough to act on them are the ones who have the greatest career success.&lt;br /&gt;&lt;br /&gt;If you’re one of those well-dressed, wide-eyed young people that I see walking through The Link, I hope that you’ll profit by taking my lessons that still apply to heart, that you are astute enough to spot the changes in the world that will invalidate some of my dogma, and that you derive as much pleasure from your life’s work as I have.  Thank you.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt;&lt;img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-1054014849406309223?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/1054014849406309223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=1054014849406309223' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/1054014849406309223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/1054014849406309223'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2011/07/keynote.html' title='Keynote'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-9FV7cJcqJsU/Ti9rh3S0rBI/AAAAAAAAAMM/O07R7wAVH7o/s72-c/keynote.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-3706749225129272135</id><published>2011-06-26T14:59:00.003-04:00</published><updated>2011-07-01T21:31:07.402-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2011'/><category scheme='http://www.blogger.com/atom/ns#' term='fitness'/><category scheme='http://www.blogger.com/atom/ns#' term='asthma'/><category scheme='http://www.blogger.com/atom/ns#' term='running'/><title type='text'>Running</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-OZfwDAqQ27A/TgeBvw4S9QI/AAAAAAAAAK8/-2i2jxIMdBc/s1600/homer-running.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 262px; height: 192px;" src="http://3.bp.blogspot.com/-OZfwDAqQ27A/TgeBvw4S9QI/AAAAAAAAAK8/-2i2jxIMdBc/s320/homer-running.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5622605317370213634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;It's almost halfway through 2011.  We've passed the summer solstice, the happiest day of the year.  This was what I was longing for back in January when there were ice dams on my roof that wouldn't yield to repeated blows from a steel hammer.&lt;br /&gt;&lt;br /&gt;2010 was far and away my best swimming year ever - an absolute blow-out in yardage totals, attendance, and every other measure you can think of.&lt;br /&gt;&lt;br /&gt;2011 will not top it.  By the end of Jun 2010 I had 318,100 yards under my belt.  Right now, my total for the year is only 158,100 yards.  Half the total!  &lt;br /&gt;&lt;br /&gt;The reason is easy to see: poorer attendance and effort.  Five of the first six months in 2010 were "best monthly yardage totals."  This year I fell short in January and never caught up.  I haven't been regular about making it to Masters workouts.  My standard morning workout was 2500 yards last year.  This year I've put in 2000-2400 yards a day, rarely reaching that 2500 yard mark.  Those small differences accumulate over time.&lt;br /&gt;&lt;br /&gt;I had two bouts of poor health.  There was a feverish weekend back in March that left me flat on my back.  But I went back to my swimming regimen as soon as I finished the course of antibiotics and recovered sufficient strength.  I don't think I was fully recovered.  When the trees popped in May, spewing pollen everywhere, my health collapsed.  I couldn't breathe, couldn't stop coughing.  I was able to recover thanks to extreme measures, a smart doctor and wonderful health coverage.&lt;br /&gt;&lt;br /&gt;But I found myself back at square one when it came to fitness.  I've always been lung-limited while swimming.  Now I had to figure out how to get it back.  I had to do something different.  &lt;br /&gt;&lt;br /&gt;Swimming and biking are great, but there's nothing like running to tax the lungs and expand capacity.  I decided that I had to learn how to run again.&lt;br /&gt;&lt;br /&gt;I started swimming back when I was 21 because I wanted to avoid the toll that pounding the roads would take on my ankles, shins, knees, and hips.  That was prescient - no replacement surgery for me.  I ran every day then, but I haven't since.  I'm lucky if I run the Manchester Race on Thanksgiving Day and hit the road half a dozen other times in a year.&lt;br /&gt;&lt;br /&gt;There's a speed limit sign exactly a half mile from my driveway.  I started running half-mile repeats, with a two-minute rest in-between.  The key is to be regular and focused.  I want to run four times a week.  Don't take days off.  Don't be shy about two workouts in a day.  Keep working my lungs, getting a sweat on, and building my metabolism and lung capacity up.&lt;br /&gt;&lt;br /&gt;It's worked out well this week.  I swam at noon on Monday, squeezing in 1500 yards that included some nice 100 repeats.  I had a yoga class at the grammar school just up the street after work.  I measured the distance from my driveway to the school: 1.3 miles.  A run to yoga would be doable.  I persuaded my youngest daughter to join me.  It was fun to have a running partner.&lt;br /&gt;&lt;br /&gt;We had a 90 minute yoga class that felt great.  I felt strong and loose.  Wouldn't a run home complete the day?  My daughter was game, so we ran home in the dusk followed by clouds of fireflies.  It was a beautiful experience.&lt;br /&gt;&lt;br /&gt;I'm not trying to run marathons.  I don't want to race or be competitive.  I just want to get my lungs back and feel fit again.  I've learned the hard way that running is the only way.  I've neglected this activity for too long.  If this week is any indication, it's like seeing an old friend again after many years.&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt;&lt;img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-3706749225129272135?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/3706749225129272135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=3706749225129272135' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3706749225129272135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3706749225129272135'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2011/06/uacct-ua-4114468-1urchintracker.html' title='Running'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-OZfwDAqQ27A/TgeBvw4S9QI/AAAAAAAAAK8/-2i2jxIMdBc/s72-c/homer-running.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-531902382655090044</id><published>2011-04-27T11:00:00.001-04:00</published><updated>2011-04-27T11:00:13.470-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2011 nietzsche music ipod'/><title type='text'>The Power Of Music</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-Ca5L8e5_RZw/TamxQ3WqnAI/AAAAAAAAAKo/RyQd3F6XFOg/s1600/nietzsche-biography.jpg"&gt;&lt;img style="float:left; margin:0 10px 1http://www.blogger.com/img/blank.gif0px 0;cursor:pointer; cursor:hand;width: 300px; height: 300px;" src="http://1.bp.blogspot.com/-Ca5L8e5_RZw/TamxQ3WqnAI/AAAAAAAAAKo/RyQd3F6XFOg/s400/nietzsche-biography.jpg" alt="" id="BLOGGER_PHOTO_ID_5596198915279592450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;I mentioned in my last blog that I've been on a reading roll for the past month.&lt;br /&gt;&lt;br /&gt;One of the books I picked up at the library during one fruitful visit was "Thus Spoke Zarathustra" by Nietzsche.  I've never read anything by the great philosopher.  I thought this might be a good time to remedy my ignorance.&lt;br /&gt;&lt;br /&gt;I know nothing about his life either, so I also found &lt;a href="http://www.amazon.com/Nietzsche-Philosophical-Biography-R%C3%BCdiger-Safranski/dp/0393323803/ref=ntt_at_ep_dpi_1"&gt;"Nietzsche: A Philosophical Biography"&lt;/a&gt; by Rüdiger Safranski.  I hoped it would give me context and let me fill in the gaps before I started on the main event.&lt;br /&gt;&lt;br /&gt;It used to be that when I started a book I felt a moral obligation to finish it, all the way to the last page.  But that's fallen by the wayside.  Sometimes you know early on that something's not working for you.  Time is precious.  Why not take an economist's view, forget about sunk costs, and cease with further investment?&lt;br /&gt;&lt;br /&gt;I tried, I &lt;span style="font-style:italic;"&gt;really &lt;/span&gt;tried, with Joyce's "Ulysses".  I got halfway through.  I found Leopold Bloom in a bar spouting gibberish and waded right into pages of nonsense syllables.  That's where I got stuck.  I couldn't push through.&lt;br /&gt;&lt;br /&gt;The Nietzsche biography was the same.  I read about a quarter of it.  It's not that the author didn't do a fine job.  It was meticulous and well-researched.  I just didn't care about Nietzsche.  The book went back to the library last weekend, along "Zarathustra".  I'll have to try again someday when I'm feeling more inspired.  There were others in the pile that I was anxious to get to, and I only had three weeks.&lt;br /&gt;&lt;br /&gt;One feature of Nietzsche's life struck me: his passion for music.  Here's a paragraph from the overture that sums it up:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Over the course of many years, Nietzsche used the music of Wagner to gauge his aesthetic pleasure.  After hearing the overture to the 'Meistersinger' for the first time, before his personal encounter with Wagner, he wrote to Rohde: 'Every fiber and nerve of my being is tingling.  It has been a long time since I experienced such a sustained feeling of rapture.'&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;And this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;In 'The Birth of Tragedy', Nietzsche called this ecstatic life in music the 'rapture of the Dionysian state, which eradicates the ordinary bounds and limits of existence.'&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Does that kind of passion still exist today?  Has the ubiquity of music diminished its power to move us?&lt;br /&gt;&lt;br /&gt;Music was rare back in those days.  If you wanted to hear a musician or composer you either had to go where they lived or hope that a tour brought them to your town.  Performances were &lt;span style="font-style:italic;"&gt;live&lt;/span&gt;.  There was no radio, no albums, no cassette tapes, no CDs, no Internet, no .mp3 downloads, no iPods.&lt;br /&gt;&lt;br /&gt;Now it's hard to find &lt;span style="font-style:italic;"&gt;silence&lt;/span&gt;.  You can have music everywhere you go.  Pop in some ear buds and you can have a hand-picked soundtrack for your life, excluding all other sounds.  You can see any artist, &lt;a href="http://www.youtube.com/watch?v=wHaRAfxLd7g"&gt;alive &lt;/a&gt;or &lt;a href="http://www.youtube.com/watch?v=nlk9Sj4Ns2k"&gt;dead&lt;/a&gt;, who has a performance posted on the Internet.  I've seen more of &lt;a href="http://blues.about.com/b/2010/12/01/albert-king-with-stevie-ray-vaughan-on-pbs.htm"&gt;Stevie Ray Vaughn&lt;/a&gt;, one of my favorite guitar players, since he passed away in 1990 than I ever saw during his lifetime.&lt;br /&gt;&lt;br /&gt;What we might perceive as a superior musical past, when giants walked the earth, is survivor bias.  The dross musicians that were &lt;a href="http://www.youtube.com/watch?v=mGL4btEIoTo"&gt;The Archies&lt;/a&gt; of their day had their music die off.  There were a lot of bands and performers in the golden ages of classical music, jazz, rock and roll, and every decade since I've been alive that were terrible.  They inspired little more than groans from all but their most devoted, die hard fans.  We don't hear much about them anymore.&lt;br /&gt;&lt;br /&gt;I asked my oldest daughter her opinion.  She says that live performance, and the experience of seeing an artist with a large group, can still evoke that feeling of ecstacy.  She assures me that an opportunity to see &lt;a href="http://www.youtube.com/watch?v=sFZjqVnWBhc"&gt;Daft Punk&lt;/a&gt; live, especially in their native Paris, would evoke a response that Nietzsche would both identify with and approve of.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt;&lt;img src="http://stackoverflow.com/users/flair/37213.png" alt="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" height="58" width="208" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put your Javascript at the bottom, now that you know better --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-531902382655090044?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/531902382655090044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=531902382655090044' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/531902382655090044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/531902382655090044'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2011/04/power-of-music.html' title='The Power Of Music'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-Ca5L8e5_RZw/TamxQ3WqnAI/AAAAAAAAAKo/RyQd3F6XFOg/s72-c/nietzsche-biography.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-2155380896421624966</id><published>2011-04-20T10:00:00.003-04:00</published><updated>2011-04-20T10:00:07.754-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2011 reading essex whaling'/><title type='text'>The Power Of Reading</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-7_ZQpBoXLV0/TampT2-BfsI/AAAAAAAAAKg/aN2YtUFAvjk/s1600/in-the-heart-of-the-sea-essex-cover.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 160px; height: 160px;" src="http://4.bp.blogspot.com/-7_ZQpBoXLV0/TampT2-BfsI/AAAAAAAAAKg/aN2YtUFAvjk/s400/in-the-heart-of-the-sea-essex-cover.jpg" alt="" id="BLOGGER_PHOTO_ID_5596190170622820034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;I've been on a nice roll reading books lately.  I always have two stacks in play at once: non-technical and technical.  The latter backlog is always longer, because I've allowed the right side of my brain to atrophy a bit as I've gotten older.  I used to be more balanced, but I've had to devote more care and feeding to my technical side to keep up.&lt;br /&gt;&lt;br /&gt;It started when I fell ill in the beginning of March and was confined to bed for several days to overcome a fever.  I had a &lt;span style="font-style:italic;"&gt;lot &lt;/span&gt;of time on my hands.  A friend at work was kind enough to loan me a paperback copy of &lt;a href="http://www.amazon.com/s/ref=nb_sb_ss_c_1_15?url=search-alias%3Dstripbooks&amp;amp;field-keywords=essex+whaleship&amp;amp;x=0&amp;amp;y=0&amp;amp;sprefix=essex+whaleship"&gt;"In the Heart of the Sea: The Tragedy of the Whaleship Essex"&lt;/a&gt; by Nathaniel Philbrick.  It was one of those recommendations that I feared would be returned without being opened.  I'd have to embarrass myself and explain why I hadn't bothered to give it a look if I didn't try, so I started reading it.&lt;br /&gt;&lt;br /&gt;Was I wrong.  I was engrossed in the first few pages and quickly fell into a reading trance.&lt;br /&gt;&lt;br /&gt;The story of the Essex was well known at the start of the 20th century.  It was the inspiration for Herman Melville's "Moby Dick".  That name was on the tip of the tongue of every schoolchild back then.  This book brought it back for me.&lt;br /&gt;&lt;br /&gt;The Essex was a whaling boat that left Nantucket in 1819, at its height of economic power, in search of sperm whales.  Whales were harder to find by that time, so captains headed around the tip of South America and into the Pacific in search of their prey.  A whaling ship would be away for two or three years at a time.  It was not a journey for the faint of heart: nothing in common with Princess Cruise Lines.  I don't recall any mention of a midnight dessert buffet, but I might have missed it in my feverish state.&lt;br /&gt;&lt;br /&gt;The descriptions of life on the boat were harrowing.  I would imagine that the young men taken along to learn the trade suffered from some variant of post-traumatic stress syndrome.  Killing a whale with harpoons, stripping the carcass with knives, boiling the blubber for oil, and storing it in the bowels of the boat sounds like one of the worst jobs ever invented.&lt;br /&gt;&lt;br /&gt;The ship had only a quarter of its hold filled with oil when it was attacked by an unusually large whale and sunk off the coast of South America.  It must have been a rebel that finally took the systematic murder of his pod personally.  He rammed the ship, damaged the hull, and forced the crew into three whaling boats to survive.&lt;br /&gt;&lt;br /&gt;The really hair-raising part of the story was just beginning.&lt;br /&gt;&lt;br /&gt;They made poorly informed choices and ended up spending three months in open water on the Pacific.  If only they'd known that a westerly tack towards Polynesia would have ended their troubles!  The irony was that they feared Pacific atolls populated with cannibals.  Instead they turned south and east, trying to make their way back to the South American coast.&lt;br /&gt;&lt;br /&gt;Their only relief in those three months was a brief stop on a small, rocky, uninhabited island that provided some fresh water for drinking and tortoises for protein.  Their food situation became dire enough to force the crew to resort to cannibalism.  The captain shot his sister's son, along for the journey as a cabin boy, after he drew the short straw.  They ate him with neither chianti nor fava beans.&lt;br /&gt;&lt;br /&gt;Even worse, that man survived the journey and had to go home and tell his sister what had happened to her son.&lt;br /&gt;&lt;br /&gt;It made me wonder how much of what we think of as our better nature is completely dependent on our ability to secure fundamental needs like sufficient water to drink, a regular supply of food, security from threats, adequate sleep, etc.  All of us would be surprised at what we might become and how low we'd stoop given such horrible circumstances.  So much of what we think of as civilization is dependent on the illusion that we can meet our needs with no more effort than it takes to walk into a grocery store and swipe a debit card in a reader.  We're far more dependent on a fragile web of providers than we'd care to admit.&lt;br /&gt;&lt;br /&gt;I enjoyed this book far more than I would have guessed when it was offered to me.  It made me think of &lt;a href="http://www.amazon.com/Perfect-Storm-True-Story-Against/dp/0393337014/ref=sr_1_4?s=books&amp;amp;ie=UTF8&amp;amp;qid=1302965173&amp;amp;sr=1-4"&gt;"The Perfect Storm: A True Story of Men Against the Sea"&lt;/a&gt; by Sebastian Junger, a more modern take on the dangers faced by men in boats on the water.&lt;br /&gt;&lt;br /&gt;After I finished "Essex", I went to the library in town and trolled for four more books.  I'll write more about those soon.&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt;&lt;img src="http://stackoverflow.com/users/flair/37213.png" alt="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" height="58" width="208" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put JavaScript at the bottom, because you know better now. --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-2155380896421624966?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/2155380896421624966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=2155380896421624966' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/2155380896421624966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/2155380896421624966'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2011/04/power-of-reading.html' title='The Power Of Reading'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-7_ZQpBoXLV0/TampT2-BfsI/AAAAAAAAAKg/aN2YtUFAvjk/s72-c/in-the-heart-of-the-sea-essex-cover.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-6323385321140686025</id><published>2011-04-17T09:00:00.004-04:00</published><updated>2011-04-17T12:36:06.971-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2011 desktop computer build assemble'/><title type='text'>Building A Desktop Computer</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-cQdm-rcqmlM/Tan7reqP83I/AAAAAAAAAKw/mB9iNoSo5GU/s1600/desktop-computer.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 225px; height: 225px;" src="http://4.bp.blogspot.com/-cQdm-rcqmlM/Tan7reqP83I/AAAAAAAAAKw/mB9iNoSo5GU/s400/desktop-computer.jpg" alt="" id="BLOGGER_PHOTO_ID_5596280736367768434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;I bought my first PC back in 1994.  I spent a summer as adjunct faculty at the Hartford Graduate Center (now &lt;a href="http://www.rh.edu/"&gt;Rensselaer@Hartford&lt;/a&gt;, a much more prestigeous name) teaching partial differential equations to first semester masters candidates and earned a cool two grand.  That was the going rate for a desktop PC back in those days; it was before Moore's Law kicked into overdrive.  I had money in hand.  More importantly, I had my wife's approval.  After a career spent using Digital Equipment VAX minicomputers and Sun SPARC Unix workstations, I was finally going to have a machine in my own home.&lt;br /&gt;&lt;br /&gt;I think I was vaguely aware of the World Wide Web.  If my memory is correct, I had a Mosaic browser available to me on my computer at work.  It was chicken, meet egg: I could have placed an order for my first PC on the Internet, but I needed a PC and Internet access at home.&lt;br /&gt;&lt;br /&gt;I called Gateway 2000 to place my order.  '2000' seemed so futuristic, so far away at the time.  They were a serious player in the crowded PC market.  The person on the other end of the phone was most pleasant and helpful.  Windows 3.1?  Very good, sir.  Would you like two 3.5" floppy drives, or would you prefer one plus a CD ROM drive?  Excellent choice, sir.  512MB of RAM?  What will you &lt;span style="font-style:italic;"&gt;do &lt;/span&gt;with all that?  It arrived soon after with a monitor that I had to bundle into my arms to pick up.&lt;br /&gt;&lt;br /&gt;I couldn't do much with the damn thing.  I had to buy a slow modem to access the Internet, which was frustrating as it could be.  I couldn't do serious engineering work on it - I could barely do the kind of work that I wanted on the most powerful workstations available to me.  The compilers were limited.  But I loved having it.  I wrote code and prose as best I could.  It served me well, but by the time it reached the end of its life I couldn't bear it anymore.  I &lt;span style="font-style:italic;"&gt;loathed &lt;/span&gt;that machine by the time I got rid of it.&lt;br /&gt;&lt;br /&gt;I added a second hard drive and maxed out the RAM slots, but those last years weren't kind.  I wasn't a hardware guy, so I didn't know how to do anything.  I told myself that I was an engineer first, then a software guy.  Hardware was someone else's problem.  I would have studied electrical engineering if I wanted to know a lot about it.&lt;br /&gt;&lt;br /&gt;I don't remember exactly how long I kept it, but it overstayed its welcome.  I swore off Gateway, which was in trouble and about to be subsumed in a contraction of the overcrowded market.  I went with a proven winner for my second computer: Dell.  Their stock had risen and split several times during that period of irrational exuberance.  If I'd been smart enough to invest whatever funds I had on hand early in the process I would have been a rich man.&lt;br /&gt;&lt;br /&gt;Once again, I placed my order over the phone.  The person on the other end of the phone was most pleasant and helpful.  I don't remember much about the specs now.  I think the operating system was Windows 95.  I thought that this machine would last me a very long time, but I was disappointed again.  Dell's stock might have been a winner, but their customer service wasn't.  I had some long and memorable phone calls with their tech support that were worthy of the comedy series "Outsourced".  Once again, I added a second hard drive and maxed out the RAM slots, but those last years weren't kind.  I still wasn't a hardware guy; I still didn't know how to do anything.&lt;br /&gt;&lt;br /&gt;If I loathed the Gateway, I &lt;span style="font-style:italic;"&gt;detested &lt;/span&gt;the Dell.  I swore I'd never touch another machine of theirs again.  Surely HP would be better!  I had the Internet at my fingertips in 2005, so I placed this order on line.  I didn't need the approval of a salesperson.  It was click! click! click! and I had the machine of my dreams: Windows XP!  4GB RAM!  Dual core Intel processors!  A 220GB hard drive!  Surely this one wouldn't disappoint me!&lt;br /&gt;&lt;br /&gt;That's the machine that I'm still using now.  I'm happy to say that after six years I don't hate this set-up.  It's long in the tooth, but Moore's Law gave me something that has weathered the storm better than the others.  I can still do what I need to do.  I've written a lot of prose, a lot of code, browsed a lot of Internet on this thing.&lt;br /&gt;&lt;br /&gt;But I'm still not a hardware guy; I still don't know how to do anything.  It's time to do something about that.&lt;br /&gt;&lt;br /&gt;I've wanted to build my own machine ever since reading Jeff Atwood's Coding Horror &lt;a href="http://www.codinghorror.com/blog/2007/07/building-a-pc-part-i.html"&gt;blog &lt;/a&gt;about building a PC back in 2007.  My HP was only two years old at the time, so I didn't think I needed to be in the market for another one so soon.&lt;br /&gt;&lt;br /&gt;Now it's four years later, and I could use another machine.  Capabilities have gone up and prices have come down.  The world of hardware continues to race along.  If I was going to buy another OEM PC I would go for an Apple and see what that's like.  &lt;br /&gt;&lt;br /&gt;But I've decided that I want to try my hand at assembling my own and installing a operating system for the first time.  It's almost a professional requirement.&lt;br /&gt;&lt;br /&gt;I'll have lots of help: a friend at work has done this in his sleep, so he was kind enough to offer a complete parts recommendation from Newegg.&lt;br /&gt;&lt;br /&gt;So I finally pulled the trigger this afternoon: I set up an account at Newegg and placed an order.  My federal tax return will more than cover it.  I have my wife's blessing.&lt;br /&gt;&lt;br /&gt;This won't make me a hardware guy, but it's a start.  I hope it'll give me some base experience and enough awareness to do what's needed to keep the machine up as the years go by.&lt;br /&gt;&lt;br /&gt;I want to install an operating system - no, make that several operating systems - from scratch.  After spending an engineering career working on nothing but Unix hardware, I've been unable to get away from Windows during my second act as a software professional.  When I was an engineer I thought like a guy who didn't care about being an admin on his machine.  I used what I was given; I didn't install software.  &lt;br /&gt;&lt;br /&gt;I'd like to get back to Linux and rediscover what I missed.  Setting up my own machine to dual boot to Ubuntu would be fabulous.  I want to learn why software professionals say Unix/Linux is a great environment in which to write software.  I want to learn sed and awk and rediscover tools that could make my software development life better.&lt;br /&gt;&lt;br /&gt;Most of all, it's a chance to keep growing and expanding and learning.  Stagnation and satisfaction are death; we all need to keep doing new things that we're afraid of, to expand that circle of light where knowledge and comfort live, and erode that ignorant darkness that's all around us.&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt;&lt;img src="http://stackoverflow.com/users/flair/37213.png" alt="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" height="58" width="208" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put your JavaScript at the bottom, now that you know better --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-6323385321140686025?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/6323385321140686025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=6323385321140686025' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/6323385321140686025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/6323385321140686025'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2011/04/building-desktop-computer.html' title='Building A Desktop Computer'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-cQdm-rcqmlM/Tan7reqP83I/AAAAAAAAAKw/mB9iNoSo5GU/s72-c/desktop-computer.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-335819007851698856</id><published>2011-03-06T17:54:00.005-05:00</published><updated>2011-03-06T20:37:09.626-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mandelbrot'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='2011'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Mandelbrot Set</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-mZI9R3iuj4Q/TXQQ8V7Re_I/AAAAAAAAAKI/Nj4CfNWzmW4/s1600/mandelbrot.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 320px; height: 303px;" src="http://1.bp.blogspot.com/-mZI9R3iuj4Q/TXQQ8V7Re_I/AAAAAAAAAKI/Nj4CfNWzmW4/s320/mandelbrot.jpg" alt="" id="BLOGGER_PHOTO_ID_5581104467082836978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I just finished a trivial but entertaining programming project: rendering a Mandelbrot set using Java.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mathworld.wolfram.com/MandelbrotSet.html"&gt;Mandelbrot sets&lt;/a&gt; are named after &lt;a href="http://www.nytimes.com/2010/10/17/us/17mandelbrot.html"&gt;Benoit Mandelbrot&lt;/a&gt;, the recently deceased mathematician that "discovered" them.  He took a simple recursive relationship and mapped it onto the complex plane by counting how many iterations were required to observe the magnitude diverge when repeatedly squaring the value at each point:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://mathworld.wolfram.com/images/equations/MandelbrotSet/NumberedEquation1.gif"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 76px; height: 19px;" src="http://mathworld.wolfram.com/images/equations/MandelbrotSet/NumberedEquation1.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've known about Mandelbrot sets for more than twenty years.  Chaos theory was all the rage in the late 80s; James Glieck wrote a terrific, accessible book entitled &lt;a href="http://www.amazon.com/Chaos-Making-Science-James-Gleick/dp/0140092501/ref=sr_1_6?s=books&amp;amp;ie=UTF8&amp;amp;qid=1299454985&amp;amp;sr=1-6"&gt;"Chaos: Making A New Science"&lt;/a&gt; that summarizes the history beautifully.&lt;br /&gt;&lt;br /&gt;Knowing about Mandelbrot sets and having successfully coded them for oneself are two very different things.  I saw a question about an implementation on Stack Overflow.  Having not gone through it for myself I had nothing to contribute, so I decided to tackle it.&lt;br /&gt;&lt;br /&gt;It took me a little while.  It all starts with a good Complex class.  I implemented the basic arithmetic operators using a fluent style, because it seemed cleaner to me.  I wrote a nice JUnit test and asked &lt;a href="http://www.jetbrains.com/idea/"&gt;IntelliJ &lt;/a&gt;to tell me about code coverage.&lt;br /&gt;&lt;br /&gt;I haven't done any Swing programming in a very long time.  I had the set in black and white displaying quickly, but then I had to get a nice color map.  It was a happy moment when I saw the picture that accompanies this posting.&lt;br /&gt;&lt;br /&gt;That wasn't enough; I had to be able to use the mouse to select a sub-region and zoom in.  Once that was working I wanted to be able to save the lovely images to a file.  Adding a "save" button would be nice, but my first try just writes the image to an output file when the window closes:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-1Mm6RA3olT0/TXQfs84dk2I/AAAAAAAAAKQ/yjiUydNRyXM/s1600/mandelbrot-zoom.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 379px;" src="http://3.bp.blogspot.com/-1Mm6RA3olT0/TXQfs84dk2I/AAAAAAAAAKQ/yjiUydNRyXM/s400/mandelbrot-zoom.png" alt="" id="BLOGGER_PHOTO_ID_5581120695336538978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I checked all my code into my local Subversion.  I have 100% code coverage for my two model classes (Complex and Mandelbrot, which implements an IterativeFunction iterface) and two view classes (MandelbrotPanel and PixelMapper).&lt;br /&gt;&lt;br /&gt;It's not much more than a nice undergraduate problem, but it made me happy to get through it and get such a satisfying result.&lt;br /&gt;&lt;br /&gt;I've created an open source project on SourceForge.net and uploaded the code to their Subversion repository.  Anyone with a Subversion client can download the code and give it a look: &lt;br /&gt;&lt;br /&gt;&lt;code&gt;svn co https://mandelbrotset.svn.sourceforge.net/svnroot/mandelbrotset mandelbrotset&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt;&lt;img src="http://stackoverflow.com/users/flair/37213.png" alt="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" height="58" width="208" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-335819007851698856?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/335819007851698856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=335819007851698856' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/335819007851698856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/335819007851698856'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2011/03/mandelbrot-set.html' title='Mandelbrot Set'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-mZI9R3iuj4Q/TXQQ8V7Re_I/AAAAAAAAAKI/Nj4CfNWzmW4/s72-c/mandelbrot.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-8299809378897576028</id><published>2011-01-31T20:13:00.002-05:00</published><updated>2011-01-31T20:13:00.803-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='2011'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Password Card</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9ZfLzIk1dQU/TUDG21hej6I/AAAAAAAAAJ8/h02dffXf-k8/s1600/your-pc-can-be-hijacked.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 261px; height: 193px;" src="http://4.bp.blogspot.com/_9ZfLzIk1dQU/TUDG21hej6I/AAAAAAAAAJ8/h02dffXf-k8/s320/your-pc-can-be-hijacked.jpg" alt="" id="BLOGGER_PHOTO_ID_5566667784812662690" 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;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;It seems like every day we see articles about personal information being compromised.  Authorities like Bruce Schneier have &lt;a href="http://www.schneier.com/blog/archives/2010/11/changing_passwo.html"&gt;recommendations &lt;/a&gt;on how often to change passwords.&lt;br /&gt;&lt;br /&gt;I'm trying something different when it comes to computer security.&lt;br /&gt;&lt;br /&gt;I found a site called &lt;a href="http://www.passwordcard.org/en"&gt;PasswordCard.org&lt;/a&gt; that has a solution that flies in the face of the "don't write your passwords down" admonition.&lt;br /&gt;&lt;br /&gt;The site is based on a simple assumption: We all know how to protect our wallets.  The site provides a printable card that can be laminated and kept in a wallet.  There are randomly generated strong passwords of varying length showing.  The idea is to pick a password starting from any row and column, of sufficient length, and use that for a site.  Go left to right, right to left, up or down, diagonally - it doesn't matter.  Keep the site associated with a password safe and you're in good shape.  Even if the card fell into someone else's hands, they'd have a herculean task to figure out the combination and site it applied to.&lt;br /&gt;&lt;br /&gt;I want to be sure that Facebook, e-mail, financial accounts, etc. are safe.  I won't be using a common password everywhere anymore, thanks to PasswordCard.org.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt;&lt;img src="http://stackoverflow.com/users/flair/37213.png" alt="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" height="58" width="208" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-8299809378897576028?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/8299809378897576028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=8299809378897576028' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/8299809378897576028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/8299809378897576028'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2011/01/password-card.html' title='Password Card'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_9ZfLzIk1dQU/TUDG21hej6I/AAAAAAAAAJ8/h02dffXf-k8/s72-c/your-pc-can-be-hijacked.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-6789701580922917319</id><published>2011-01-26T20:30:00.000-05:00</published><updated>2011-01-26T20:30:00.914-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='procrastination'/><category scheme='http://www.blogger.com/atom/ns#' term='2011'/><category scheme='http://www.blogger.com/atom/ns#' term='tracking'/><category scheme='http://www.blogger.com/atom/ns#' term='planning'/><title type='text'>Pro-crastination</title><content type='html'>&lt;!-- Google Analytics --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;!-- image goes here --&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9ZfLzIk1dQU/TUCeg8jPrqI/AAAAAAAAAJ0/sKEBrBJZ8dA/s1600/procrastination.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 244px; height: 207px;" src="http://1.bp.blogspot.com/_9ZfLzIk1dQU/TUCeg8jPrqI/AAAAAAAAAJ0/sKEBrBJZ8dA/s320/procrastination.jpg" alt="" id="BLOGGER_PHOTO_ID_5566623428276891298" 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;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;My character flaws are like grains of sand at the beach - too numerous to count.  Like my sweet tooth.  Pepperidge Farm's double chocolate Milano is a special weakness.  Do they lace those things with crack cocaine?  I think they must have hired the chemists from the tobacco companies who specialize in keeping users addicted.  They probably got a &lt;span style="font-style: italic;"&gt;sweet &lt;/span&gt;rate for their trouble, too.&lt;br /&gt;&lt;br /&gt;Did I mention my awful sense of humor?&lt;br /&gt;&lt;br /&gt;But one of my very worst traits is my procrastination and laziness.&lt;br /&gt;&lt;br /&gt;I had a sad reminder of that this morning.  The Taking Care Center where I swim is in the basement of a building across the street from where I work, two floors below street level.  I had a very nice swim, during which time I played "stroke golf" to measure my efficiency and speed, did a set of 5x100 IM, and finished with a 1x200 kick with board set that left my poor hips tired and sore.  I showered, dressed, and put my stuff back in my locker before trudging up four flights of stairs to get back to street level.&lt;br /&gt;&lt;br /&gt;For some reason a memory popped into my head while I was walking.  I found myself back in the insurance industry after I left Kaman Aerospace for The Hartford in Jan 2005.  Soon after I arrived I had a good idea.  The engineering education that I received left me with a wealth of mathematical knowledge that was lying fallow since I left engineering back in 1995.  But actuaries are the lifeblood of the insurance industry.  Why not leverage something that I already had in this new field?  At worst, it would improve my industry knowledge and make me a better developer.  At best, it could become a new career path in case I needed one.&lt;br /&gt;&lt;br /&gt;I contacted the head of the actuarial program at The Hartford and went so far as to order study guides for the first two actuarial exams.  I found out right away that my knowledge was long on calculus of continuous functions and physics, but short on discrete math, statistics, and probability.  I had a lot of work ahead of me to refresh my memory of the things I used to know and to fill in the gaps in my background by learning the new material.&lt;br /&gt;&lt;br /&gt;As I trudged up those stairs this morning, I realized that &lt;span style="font-style: italic;"&gt;six years&lt;/span&gt; have passed and I've made &lt;span style="font-style: italic;"&gt;no progress whatsoever&lt;/span&gt; towards achieving this goal.&lt;br /&gt;&lt;br /&gt;The thought depressed me terribly.&lt;br /&gt;&lt;br /&gt;Six whole years gone by.  It seemed daunting at the time, but if I'd been able to summon the energy and dedication to make a little progress every day I would have been able to get through it in spades.  A long, steady accumulation of small steps does the trick every time.&lt;br /&gt;&lt;br /&gt;How do you make something like this happen?  There are lots of technical topics that I want to master (Python, Android, jQuery) and books to get through ("The Algorithm Design Manual", John C. Hull's derivatives and options text, etc.), but my efforts are too scattered, diffuse, and sporadic.&lt;br /&gt;&lt;br /&gt;I could take the Nike approach - "Just Do It" - but that hasn't worked so far.&lt;br /&gt;&lt;br /&gt;I've had great success in my fitness life with tracking.  Just the act of writing it down and seeing progress helps.  But what to write?  Problems completed?  Chapters read?  What's the metric that I should track?  My new &lt;a href="http://craicpropagation.blogspot.com/2011/01/one-hundred-pushups.html"&gt;One Hundred Push-ups&lt;/a&gt; regimen not only has the counting metric going for it, but it also mandates a Mon-Wed-Fri weekly schedule.&lt;br /&gt;&lt;br /&gt;What's standing in my way besides my natural laziness?&lt;br /&gt;&lt;br /&gt;The Internet isn't helping me.  StackOverflow, Facebook, StumbleUpon - all are time sinks.  I need to kill my television.  It's like the hearth in my house - it's always on.  It's too easy for me to surf over to a Celtics game and become an anti-athlete.  I love the game, and know it well from a youth misspent trying to master it, but it's been years since I played myself.  When did watching others do things become a worthy use of my precious time?&lt;br /&gt;&lt;br /&gt;Seneca's &lt;a href="http://www.fourhourworkweek.com/blog/2009/04/24/on-the-shortness-of-life-an-introduction-to-seneca/"&gt;"On The Shortness Of Life"&lt;/a&gt; says it best:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;It’s not that we have a short time to live, but that we waste a lot of it.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I'm desperate for a plan.  How can I fix this?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt;&lt;img src="http://stackoverflow.com/users/flair/37213.png" alt="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" height="58" width="208" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-6789701580922917319?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/6789701580922917319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=6789701580922917319' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/6789701580922917319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/6789701580922917319'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2011/01/pro-crastination.html' title='Pro-crastination'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9ZfLzIk1dQU/TUCeg8jPrqI/AAAAAAAAAJ0/sKEBrBJZ8dA/s72-c/procrastination.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-6330247106953485463</id><published>2011-01-15T11:18:00.004-05:00</published><updated>2011-01-26T20:26:00.654-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pushups'/><category scheme='http://www.blogger.com/atom/ns#' term='2011'/><category scheme='http://www.blogger.com/atom/ns#' term='fitness'/><title type='text'>One Hundred Pushups</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9ZfLzIk1dQU/TTHJCPMQXNI/AAAAAAAAAJs/PVaBvjoL1hw/s1600/one-hundred-pushups-outline700.gif"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 320px; height: 119px;" src="http://4.bp.blogspot.com/_9ZfLzIk1dQU/TTHJCPMQXNI/AAAAAAAAAJs/PVaBvjoL1hw/s320/one-hundred-pushups-outline700.gif" alt="" id="BLOGGER_PHOTO_ID_5562448055054130386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;br /&gt;I'm already obsessively tracking my swim progress each and every year.  While my yardage totals and performance in the water would not be impressive for a trained swimmer, I've been pleased enough with my old guy efforts.&lt;br /&gt;&lt;br /&gt;One of the joys of swimming is also a problem: buoyancy.  The water holds me up when I'm swimming.  It's gentle on joints - knees, ankles, and hips don't take the pounding that something like running or basketball would dish out.  But you don't get the benefit of a weight-bearing activity.&lt;br /&gt;&lt;br /&gt;We all lose muscle mass as we age.  I've been thinking for a while that I need to mix some strength training into my routine.  I've never been a machine or weight lifting kind of guy.  The place where I swim today offers a lot of interesting alternatives besides swimming, but I'm not sure that they fit into my day as nicely as the early morning, before work swim does.&lt;br /&gt;&lt;br /&gt;So what's my solution?  I'm trying a regimen that I Stumbled Upon: &lt;a href="http://hundredpushups.com/"&gt;One Hundred Pushups&lt;/a&gt;.  The idea is to build strength by working your way up to 100 &lt;span style="font-style: italic;"&gt;good &lt;/span&gt;push-ups per day over a six week period.&lt;br /&gt;&lt;br /&gt;I like it, because it can fit into any day, it doesn't use machines, and I don't have to go to a special place in order to do it.  I can also work it in with yoga, so I'd have all three legs of the fitness stool: aerobics, strength, and flexibility.&lt;br /&gt;&lt;br /&gt;Today was my first day.  I know, the web site says to work on Mon-Wed-Fri with weekends off, but I swam last night and wasn't up to doing pushups when I returned home.  I did the test on Wed and found that I was average for a guy my age.  So I'm starting at the beginning at Week 1. &lt;br /&gt;&lt;br /&gt;I'm hoping that having a routine laid out will help me stay with it.  I'll be tracking it in my Excel spreadsheet.  I'll report back on my progress in six weeks.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt;&lt;img src="http://stackoverflow.com/users/flair/37213.png" alt="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" height="58" width="208" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-6330247106953485463?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/6330247106953485463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=6330247106953485463' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/6330247106953485463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/6330247106953485463'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2011/01/one-hundred-pushups.html' title='One Hundred Pushups'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_9ZfLzIk1dQU/TTHJCPMQXNI/AAAAAAAAAJs/PVaBvjoL1hw/s72-c/one-hundred-pushups-outline700.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-4604558095722602377</id><published>2011-01-12T20:14:00.007-05:00</published><updated>2011-01-12T21:03:50.328-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2011'/><category scheme='http://www.blogger.com/atom/ns#' term='climate change'/><category scheme='http://www.blogger.com/atom/ns#' term='winter'/><category scheme='http://www.blogger.com/atom/ns#' term='snow'/><title type='text'>A Record Snow Event</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9ZfLzIk1dQU/TS5XjYjov7I/AAAAAAAAAJk/xk9x4YwyNs0/s1600/DSCF0339.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_9ZfLzIk1dQU/TS5XjYjov7I/AAAAAAAAAJk/xk9x4YwyNs0/s320/DSCF0339.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5561478855248101298" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;br /&gt;We had a record snow event here today.  &lt;br /&gt;&lt;br /&gt;The forecast was bad enough where people were planning to work from home before leaving the office last night.  I was one of them.  I made sure that I had my laptop and power cord before I left.  As long as the electricity and Internet stayed up I'd be able to work.&lt;br /&gt;&lt;br /&gt;It wasn't snowing when I went to bed last night.&lt;br /&gt;&lt;br /&gt;I slept in a little bit this morning, since I didn't have to catch the early bus.  I got up at 6:30 when the dog started flapping his ears and whimpering to let me know that he needed to go outside.  We both had a shock waiting for us when I opened the back door to let him out: 18" of snow had fallen overnight, and it was still snowing hard!  Somebody had a cold, wet tummy when he came back inside.&lt;br /&gt;&lt;br /&gt;I made some tea, ate a quick breakfast, and headed outside to start clearing off the driveway.  I didn't have plans to leave, but I knew that I'd need a couple of passes on the driveway to keep it clear.&lt;br /&gt;&lt;br /&gt;A year ago I finally broke down and bought a Honda snow thrower.  I had cleared my modest driveway and sidewalks with a shovel all my life, but a December nor'easter convinced me that I should spare my back and get some help.  I was happy with my purchase right away, but today it was a life saver.  The snow spilled over the top of my 18" tall snow thrower when I started.  It was still a chore to push it through all that snow, but it kept up nicely.  &lt;br /&gt;&lt;br /&gt;A modest snowfall would usually require 45-60 minutes of effort with a shovel to clear off the driveway.  Today it took me two hours, even with the help of the thrower.  The stuff that was packed into the end of the driveway by the snow plows was truly heart attack snow.  I don't know that I could have gotten through it without mechanical assistance.&lt;br /&gt;&lt;br /&gt;The snow was falling so fast that there were 2" on the part where I started by the time I was done.  I had to do a second pass right away!  But the worst was over.&lt;br /&gt;&lt;br /&gt;I went inside, fired up the laptop, and drove revenue for my employer all day.  I went out again at dusk to take another shot at it.  A fresh 6" had fallen since morning, bringing our total for the day into the neighborhood of &lt;span style="font-style:italic;"&gt;two feet&lt;/span&gt; of snow.  &lt;br /&gt;&lt;br /&gt;Yes, it's a record for this area.&lt;br /&gt;&lt;br /&gt;If winter ended tomorrow, and we didn't get another flake of snow until next winter, we'd &lt;span style="font-style:italic;"&gt;already &lt;/span&gt;be over the average snowfall for the year. &lt;br /&gt;&lt;br /&gt;The last memorable years for snowfall were 1995-1996.  They were two record totals in a row.  We seemed to get a fresh storm every week, usually in the middle of the work week to maximize the inconvenience.  Our kids had to attend makeup days almost until the Fourth of July.&lt;br /&gt;&lt;br /&gt;It looks like 2011 is poised to challenge them.&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt;&lt;img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-4604558095722602377?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/4604558095722602377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=4604558095722602377' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/4604558095722602377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/4604558095722602377'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2011/01/uacct-ua-4114468-1urchintracker-we-had.html' title='A Record Snow Event'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9ZfLzIk1dQU/TS5XjYjov7I/AAAAAAAAAJk/xk9x4YwyNs0/s72-c/DSCF0339.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-3195228856326195946</id><published>2010-12-30T10:29:00.006-05:00</published><updated>2010-12-31T12:04:28.989-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='resolutions'/><category scheme='http://www.blogger.com/atom/ns#' term='2010'/><category scheme='http://www.blogger.com/atom/ns#' term='new year'/><title type='text'>The End Of 2010</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9ZfLzIk1dQU/TRyllhfc3PI/AAAAAAAAAJc/mPh4Ve_KqFE/s1600/new-years-eve.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 272px; height: 186px;" src="http://1.bp.blogspot.com/_9ZfLzIk1dQU/TRyllhfc3PI/AAAAAAAAAJc/mPh4Ve_KqFE/s320/new-years-eve.jpg" alt="" id="BLOGGER_PHOTO_ID_5556498104332377330" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;Another year has come and gone.  Time to write another retrospective on the year.  Turn back now if this is too self-serving or boring!&lt;br /&gt;&lt;br /&gt;Any year in which you maintain your health, family, and economic base is a good one, so 2010 was a good year.&lt;br /&gt;&lt;br /&gt;My mother is ensconced in her new home.  I thought we'd be doing well if she was transitioned by spring, but she's well ahead of that deadline.   She sounds happy in the new place whenever I talk to her.  What a relief!  She's a marvel of good humor and optimism.  I hope I can follow her example through my life changes to come.&lt;br /&gt;&lt;br /&gt;My youngest sister had her second child, a boy.  What a happy occasion!  My oldest sister's son announced that he and his wife are expecting their first child in the spring of 2011.  It'll be my mother's first great-grandchild.  We're all happy to see the first of another generation arrive.&lt;br /&gt;&lt;br /&gt;I was lucky enough to change groups at my current employer.  The new gang is doing work that I enjoy a great deal more and the people are terrific.  It's such a pleasure to work with folks that actually smile and laugh once in a while.  There's a lot to be done, but I'm grateful for the chance to do something good with people I like.&lt;br /&gt;&lt;br /&gt;My oldest daughter has moved to New York City to work and go to grad school.  She's doing a great job of figuring out how to manage herself as an adult.  My youngest daughter continues to make progress towards her undergraduate degree.  We're still on track to get both of them through school without debt.&lt;br /&gt;&lt;br /&gt;This fall was the first time my wife and I have been alone in the house for an extended period since our eldest was born.  I was concerned at first: would I be enough?  Would my wife be happy with the children gone?  I was relieved to find that everything was great.  My wife still has the capacity to surprise and delight me, even after 29 years of marriage.&lt;br /&gt;&lt;br /&gt;As usual, my athletic and technical goals were the most measurable things I did all year.&lt;br /&gt;&lt;br /&gt;I had my best swimming yardage total ever in 2010, topping my "unbeatable" record set in 2008.  I started the year off with a bang: I had "best month" totals in seven of the first eight months of the year.  My attendance was stellar.  I had resolved to make 2500 yards my new daily standard, and I kept to it.  "90% of success is showing up" rings true in this case. &lt;br /&gt;&lt;br /&gt;I was on a pace to exceed 600,000 yards for the year back in June, but I tailed off in the last third of the year.  The last four months weren't nearly as good as the first eight.  Work pressures start to get in the way.&lt;br /&gt;&lt;br /&gt;I expect that the trend will continue in 2011, but that's not a bad thing.  Rather than pushing myself to greater heights, I'm planning to take another direction.  A yardage total exceeding 400,000 yards would still be in my top five totals ever, so that's what I'll be shooting for. &lt;br /&gt;&lt;br /&gt;Instead of merely piling up yards, I'd like to change the way I swim.  One thing that I did this year was train myself to breathe every other stroke.  I've always been comfortable with breathing to either side, but now I can do waltz time over long distances.  I think it makes my stroke more balanced and efficient.&lt;br /&gt;&lt;br /&gt;I tried an experiment before the holidays: if breathing every three strokes is good, would every five strokes be better?  It takes greater lung capacity and discipline.  I did a set of 20x50 on 1:00 one morning, breathing every fifth stroke.  It was hard, but I was able to do it.  I counted strokes per length the whole time.  I found that my stroke count ranged between 16-19; my three breath stroke usually takes 19-21 strokes per length.  Making five strokes per breath my new standard will be a goal for 2011.&lt;br /&gt;&lt;br /&gt;I'd still love to work my way up to 200 yard butterfly.  That's a stretch goal.&lt;br /&gt;&lt;br /&gt;Mostly I'd like to weave more cross-training into my life.  I've maintained my yoga practice all year.  It's making my flexibility, balance, and core strength better.  I think I need to work in some strength training.  Muscle mass is something that declines with age.  I need to start fighting the good fight on that front.&lt;br /&gt;&lt;br /&gt;My cycling fell off a long way when compared to 2009.  I still rode to work with my friend Michael, but not nearly as much as I had the previous year.  My cycling mileage dropped by almost 50% in 2010, and it was a small fraction of the 2,500 miles that Michael logged for the year.  I'll try to improve on that next year.&lt;br /&gt;&lt;br /&gt;I had a pretty good technical year.  I made a lot of progress in learning Python.  I have a new IDE in PyCharm to help.  I've been poring over some good books.  I wrote a lot of code on my own.  Now I need a focused effort at an application to pound it into my head.  I've got some ideas that are worth pursuing.  I'll see if I can bring that home in 2011.  In the meantime, I'm glad to have more of a development role during my core hours.  It helps to not have to do all my saw sharpening on my time.&lt;br /&gt;&lt;br /&gt;I had a fine year with Toastmasters.  I achieved "Competent Communicator" status by completing ten speeches, entered and won a competition, and was elected an officer of my club.  I'm actually a mentor for two newer members of our club.  I hope to complete my "Advanced Communicator Bronze" and "Competent Leader" designations for 2011.&lt;br /&gt;&lt;br /&gt;The economic debacle that I feared back in 2008 didn't happen, but I'm concerned that nothing significant has been done to prevent it.  We're in a holding pattern, convinced that our past behavior can continue without change.  The alterations to come could be neither orderly nor our choice.  I don't want to find out how deadly hyperinflation can be.  I fear the rise of the political and religious right in our country.  2011 will bring a new Congress to power in the United States.  I hope they don't accelerate our slide in the coming year.&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt;&lt;img src="http://stackoverflow.com/users/flair/37213.png" alt="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" height="58" width="208" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-3195228856326195946?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/3195228856326195946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=3195228856326195946' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3195228856326195946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3195228856326195946'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/12/new-year-2010.html' title='The End Of 2010'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9ZfLzIk1dQU/TRyllhfc3PI/AAAAAAAAAJc/mPh4Ve_KqFE/s72-c/new-years-eve.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-6416092518213163275</id><published>2010-12-12T13:37:00.002-05:00</published><updated>2010-12-12T14:25:28.529-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2010 breakfast meeting'/><title type='text'>Keeping Faith, Keeping Contact</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9ZfLzIk1dQU/TQUWp2NMwoI/AAAAAAAAAJQ/p1SNyi2ALBY/s1600/breakfast-waffles.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 259px; height: 194px;" src="http://3.bp.blogspot.com/_9ZfLzIk1dQU/TQUWp2NMwoI/AAAAAAAAAJQ/p1SNyi2ALBY/s320/breakfast-waffles.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5549867023985328770" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;It's a cold, rainy Sunday morning here.  Icing conditions were predicted, because the jet stream has dipped down and brought arctic Canadian air all week.  I heard a sanding truck drive down the street early this morning.  &lt;br /&gt;&lt;br /&gt;I was concerned about driving conditions because I had agreed to have breakfast with two friends, one of whom had left the company about eight months ago.  We've sent messages back and forth on Facebook, but there's been no face to face contact since he departed.  I was looking forward to the meeting.  I hoped the weather wouldn't interfere.&lt;br /&gt;&lt;br /&gt;I was relieved to find warm conditions and rain when I went out to get the paper.  The ice line was north of us.&lt;br /&gt;&lt;br /&gt;Breakfast was great fun for me.  The two young men aren't too far in age from my oldest daughter.  It's more likely that they'd come by to chat her up and ask for a date than to spend time with her father.  I'm flattered that they'd want to.  &lt;br /&gt;&lt;br /&gt;We fell into a little work talk to catch up, but not too much.  We talked about working life, women, car problems, and strength training.  I've had a great swimming year - my best ever; more about that in a later entry - but I've neglected strength training all my life.  My flexibility problems are less critical now that I've made yoga a regular feature of my week.  I'm thinking that a good objective for 2011 would be to work something into my routine to help improve strength and retain muscle mass.  These two guys are perfect sources of information.  I was glad to be able to ask questions and soak in their knowledge.&lt;br /&gt;&lt;br /&gt;I've accumulated a long list of people that I like very much after hopping between jobs as often as I have over the last fifteen years.  The problem is that they leave my life once we lose the shared context of work.&lt;br /&gt;&lt;br /&gt;It seems to me that regular, face to face contact is the only anecdote there is for this malady.  Technology won't do: all the cell phones, e-mail, instant messaging, chat, and Facebook applications you can think of can never fill the void.&lt;br /&gt;&lt;br /&gt;Breakfast is the perfect way to sort this out.&lt;br /&gt;&lt;br /&gt;It's a meal that's unobtrusive: early in the day is transparent to my wife.  It takes at least an hour to order and consume, so you have time to sit and chat.  It's inexpensive - we met at a diner and had simple breakfast food with coffee.    I met the man who is the best friend I have early in my engineering career.  Since I've switched to software development we've made it a point to get together for breakfast once a month before work.  We get to catch up, discuss our favorite topics, and make it to work without a hitch.  I wouldn't miss these get-togethers.  &lt;br /&gt;&lt;br /&gt;I enjoyed the conversation so much.  This morning's meal was a reminder that I should expand its reach.  I need to make sure that all these terrific folks I've met don't diffuse out of my life.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt;&lt;img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-6416092518213163275?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/6416092518213163275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=6416092518213163275' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/6416092518213163275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/6416092518213163275'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/12/keeping-faith-keeping-contact.html' title='Keeping Faith, Keeping Contact'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9ZfLzIk1dQU/TQUWp2NMwoI/AAAAAAAAAJQ/p1SNyi2ALBY/s72-c/breakfast-waffles.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-93952072220279513</id><published>2010-12-04T17:10:00.005-05:00</published><updated>2010-12-05T16:31:33.601-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2010 moving'/><title type='text'>Like A Little Death</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9ZfLzIk1dQU/TPq8eg_Y0BI/AAAAAAAAAJI/wFyyhttrEto/s1600/orchard-street2.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://3.bp.blogspot.com/_9ZfLzIk1dQU/TPq8eg_Y0BI/AAAAAAAAAJI/wFyyhttrEto/s320/orchard-street2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5546953123498086418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;I helped my mother to move out of the house that she and my father moved me and my two older sisters into a few months before my first birthday.&lt;br /&gt;&lt;br /&gt;She decided that keeping the house up was more than she could manage on her own.  The yard is spacious by the standards of the town.  It's one of the property's best features, but all that grass doesn't cut itself.  The housing market in the US isn't as frothy and wild as it was two or three years ago, but interest rates were still low enough to keep buyers off the sidelines.  She put the house on the market in the spring with a starting price that was reasonable, below the median for the area.  She entertained a steady stream of viewers in several open houses throughout the spring and summer, but no offers were forthcoming.  &lt;br /&gt;&lt;br /&gt;While she was waiting for a nibble she was looking at places to move into .  She  found a lovely condominium in town had the location and features she was looking for.  It was in a community that was mixed in age, not one of those warehouses for seniors.  &lt;br /&gt;&lt;br /&gt;She got her first sign of interest late in the season, but the low ball offer wasn't acceptable.  A few months later, the buyer came back with a serious offer.  Things moved quickly: she negotiated an acceptable price that allowed her to buy the condo and left her with cash in her pocket, even after paying the capital gains taxes.&lt;br /&gt;&lt;br /&gt;Next came the hard part: playing Solomon for decades of accumulated stuff, deciding what to keep, pack, and move and what to discard.  A stack of cardboard boxes and many rolls of bubble wrap was procured for the keepers; a dumpster was dropped in the driveway that became the final resting place for the discards.  It took several weekends of work to sort it all out, but the day finally came this week.  The movers arrived early on Tuesday morning to ferry it all across town to the new location.  &lt;br /&gt;&lt;br /&gt;My youngest brother was the last into the house; he was also the last to leave.  He stayed in the house to direct the movers.  My assignment was the new condo.  The hardwood floors were bare, so it was the perfect time to wash and clean every surface for the new occupant.  I had a bucket, a sponge, some heavy duty knee pads, several squeeze bottles of Murphy's Oil Soap, and cleaning agents for the tile, bathroom, and kitchen.  I emptied a dozen buckets of hot, black water into the drain after a morning of hard labor.  By the time the movers arrived at mid-morning the place was spotless and ready to accept furniture.&lt;br /&gt;&lt;br /&gt;The movers did a brilliant job.  It pays to have professionals do these things.  The whole job was done by the time darkness enveloped us at five o'clock.  The hard work of unpacking and settling lay ahead, but the emotional job of leaving the house and all its history behind was done.&lt;br /&gt;&lt;br /&gt;My youngest brother took some beautiful photos of the house, including the picture that accompanies this entry.  It was a fittingly overcast, somber day.  We were all left with our memories.  This was the house where my mother spent her entire adult life with her husband and six children.  All of her children had their own memories of time spent together in the house, yard, and neighborhood.  We celebrated lots of birthdays, including memorable surprise parties for milestone birthdays for our mother and one brother.  Two sisters were married in town and had unforgettable parties in the house at the end of their wedding days.  Our father passed away in the house; one brother was nursed almost to the end in the living room.&lt;br /&gt;&lt;br /&gt;I kept my mind on the work at hand all day.  I did my best to be grateful for our mother's courage to make such a decision.  I didn't dwell on the past.  I reminded myself that home was where our mother was; the house was a mere building.  The time that I've lived away from that address is now twice that of the time I called it home.&lt;br /&gt;&lt;br /&gt;But the enormity of it all hit me when I returned to my own home.  Maybe it was the time of day: dusk on a quiet, cold December weekend.  The waning of the day, year, life itself.  It's like a little death.  It's final; it's a bifurcation point in our history, dividing time into Before Move and ever after.  It's a reminder that our mother still has her health, her marbles, and her grace, but time is passing by.  &lt;br /&gt;&lt;br /&gt;It says I'm not young anymore, either.  Someday my children will be faced with a similar chore and remember all the time they spent in my house.&lt;br /&gt;&lt;br /&gt;I'm glad that we had the time that we did.  It's time to move on.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt;&lt;img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-93952072220279513?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/93952072220279513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=93952072220279513' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/93952072220279513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/93952072220279513'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/12/like-little-death.html' title='Like A Little Death'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9ZfLzIk1dQU/TPq8eg_Y0BI/AAAAAAAAAJI/wFyyhttrEto/s72-c/orchard-street2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-393990347707495071</id><published>2010-11-07T09:00:00.001-05:00</published><updated>2010-11-07T09:00:06.970-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2010 python pycharm django learning programming'/><title type='text'>Progress With Python</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9ZfLzIk1dQU/TM4Oknscg5I/AAAAAAAAAI4/21YU4PKliYw/s1600/python-logo.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 108px;" src="http://3.bp.blogspot.com/_9ZfLzIk1dQU/TM4Oknscg5I/AAAAAAAAAI4/21YU4PKliYw/s320/python-logo.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5534377014378398610" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br /&gt;I finished a first reading of Wesley Chun's "Core Python Programming" at last.  I have slowed down on completing the exercises, but I do plan to continue burning the language into my brain so I can feel completely comfortable.  &lt;br /&gt;&lt;br /&gt;Thank you, John D. Cook.  His blog, "The Endeavor", is one of my favorites.   I track his writings faithfully using Google Reader.  John &lt;a href="http://www.johndcook.com/blog/2009/02/04/book-review-expert-python/"&gt;recommended &lt;/a&gt;this book back on 4-Feb-2009.  If it was good enough for John, it was good enough for me.  I think he was spot on.  I found the book to be well written and fine introduction to the language.&lt;br /&gt;&lt;br /&gt;My efforts were accelerated by the availability of &lt;a href="http://www.jetbrains.com/pycharm/"&gt;PyCharm&lt;/a&gt;, the wonderful new Python IDE from the geniuses at JetBrains.  I've used IntelliJ, their Java IDE, for many years and loved it.  I'm ecstatic to have an equally good tool at my disposal for learning this new language.  The Python console is built right in.  So is Django support.  &lt;br /&gt;&lt;br /&gt;I took my first, tottering steps with Django this weekend.  I'm having some trouble with it, because it's so unfamiliar.  My goal is to find out just how capable it is at creating robust web sites.&lt;br /&gt;&lt;br /&gt;A good friend of mine would rib me about the Java work we did: "If we were writing this application in Python we'd be done by now!" he'd say with a smile.  I've always been intrigued to find out for myself if this was hyperbole from a fan-boy or the truth.&lt;br /&gt;&lt;br /&gt;If I can manage the trick, I'd like to see if Grails compares as well.&lt;br /&gt;&lt;br /&gt;Another friend of mine has a web site that he'd like to upgrade from VB6.  When he proposed doing it in Python, I immediately offered myself as slave labor.  It'll be a great opportunity for me to apply these tools on a real, live problem.&lt;br /&gt;&lt;br /&gt;Getting through that book, and achieving some measure of comfort with Python, was one of my technical goals for 2010.  I'm happy with my progress, and there are still two months left to go in the year.&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt;&lt;img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;A for professional and enthusiast programmers"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-393990347707495071?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/393990347707495071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=393990347707495071' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/393990347707495071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/393990347707495071'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/11/progress-with-python.html' title='Progress With Python'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9ZfLzIk1dQU/TM4Oknscg5I/AAAAAAAAAI4/21YU4PKliYw/s72-c/python-logo.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-8574115034248639932</id><published>2010-11-04T20:12:00.003-04:00</published><updated>2010-11-04T20:29:24.989-04:00</updated><title type='text'>2010 Was A Fine Year, Indeed</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Image --&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9ZfLzIk1dQU/TNNMTs11neI/AAAAAAAAAJA/fvlJhnTkhrI/s1600/swimming_2.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 320px; height: 256px;" src="http://1.bp.blogspot.com/_9ZfLzIk1dQU/TNNMTs11neI/AAAAAAAAAJA/fvlJhnTkhrI/s320/swimming_2.jpg" alt="" id="BLOGGER_PHOTO_ID_5535852268306669026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;I swam before work again this morning.  I logged 2,000 yards, which is typical these days when I manage to catch the second bus to work that leaves the commuter lot at 6:30 am.  When I make it to the first bus that leaves at 6:10 am I have time to put in 2,500 yards. &lt;br /&gt;&lt;br /&gt;I did make that first bus today, but I cut down on the distance to do something I've never done before.  I was talking to my friend Slaven at Masters swimming last night about the butterfly stroke.  We both agreed that we'd like to be better at it.  I've been pretty diligent at working on IM on a regular basis.  But the longest distance I can endure when doing butterfly is 100 yards.  I'd love to feel comfortable with 200 yard fly.&lt;br /&gt;&lt;br /&gt;They had a 200 yard fly event at the last Masters meet I signed up for in 2004.  Several brave souls signed up for it.  The winner was a specialist whose technique was fast and smooth the whole way.  He was the best flier I've ever seen who wasn't competing in the Olympics on television.  How I'd like to build myself up to that level!&lt;br /&gt;&lt;br /&gt;Slaven and I talked about a good fly set.  I said I thought I might be able to handle a 10x50 fly set on a 1:30 interval, but I wasn't sure.  (We nixed the idea in favor of 5x100 IM instead.)  I've never tried it to test my limits.  The most strenuous set I do is a descending IM pyramid: 1x400 IM on 8:00/1x300 IM on 6:00/1x200 IM on 4:00/1x100 IM on 2:00.&lt;br /&gt;&lt;br /&gt;So after I warmed up and finished a set of 5x100 free on 1:45, I decided to submit to that test: Could I hold up through a 10x50 fly set?  I finished the first one in under 50 seconds, so I decided that a 1:30 interval was too long.  Would my heart explode by the end if I held to an interval of 1:15?  I surprised myself by completing it in style.  I was so pleased with myself.  I'll have to make this a regular feature of my workouts.  Perhaps I can make 200 fly a goal for 2011.  &lt;br /&gt;&lt;br /&gt;It was a milestone workout, too.  My best yearly yardage total (524,200 yards) came in 2008.  When I added this morning's total to my tracking spreadsheet the running total was 500,050 yards.  I've already topped 500K yards for only the second time in the 17 years I've been keeping track.  And it's only the first week in November!  2010 will be a difficult year to top.&lt;br /&gt;&lt;br /&gt;But that's what I said at the end of 2008. &lt;br /&gt;&lt;br /&gt;It feels good.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt;&lt;img src="http://stackoverflow.com/users/flair/37213.png" alt="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" height="58" width="208" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-8574115034248639932?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/8574115034248639932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=8574115034248639932' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/8574115034248639932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/8574115034248639932'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/11/2010-was-fine-year-indeed.html' title='2010 Was A Fine Year, Indeed'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9ZfLzIk1dQU/TNNMTs11neI/AAAAAAAAAJA/fvlJhnTkhrI/s72-c/swimming_2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-556822862805039764</id><published>2010-10-31T20:20:00.004-04:00</published><updated>2010-10-31T20:46:11.893-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2010 books lewis &quot;wall street&quot;'/><title type='text'>"Liar's Poker"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9ZfLzIk1dQU/TM4M1Rrwz2I/AAAAAAAAAIw/dNHwAwG37vQ/s1600/liars-poker.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 198px; height: 302px;" src="http://2.bp.blogspot.com/_9ZfLzIk1dQU/TM4M1Rrwz2I/AAAAAAAAAIw/dNHwAwG37vQ/s320/liars-poker.jpg" alt="" id="BLOGGER_PHOTO_ID_5534375101504474978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;My mother is in the process of down-sizing.  She's selling the house that she and my father moved into a few months before my first birthday.  She's going to move into a condo not too far away, still in the same town.&lt;br /&gt;&lt;br /&gt;Being a people of books, the house is loaded with them: first editions signed by the author, collections, and a dizzying range of topics.&lt;br /&gt;&lt;br /&gt;One of the treasures I found while helping her to pack was "Liar's Poker" by Michael Lewis.  I've &lt;a href="http://craicpropagation.blogspot.com/2010/04/big-short.html"&gt;written &lt;/a&gt;about another of his books, "The Big Short".  I was surprised to find that my mother had a copy via my younger brother.  I asked her if I could take it home with me.  She was glad to comply.&lt;br /&gt;&lt;br /&gt;I've been reading it this weekend while I convalesced from a minor illness.  (My immune system started fighting off a cold in earnest on Thursday night.)  I'm squeezing it in alongside technical reading. &lt;br /&gt;&lt;br /&gt;It's as engaging as the later work.  It's especially remarkable to read now because it's set in the 80s, when the roots of our current financial mess first took hold.  &lt;br /&gt;&lt;br /&gt;Michael Lewis was hired as an art major out of Princeton by Salomon Brothers, the venerable Wall Street firm that was founded in 1919, acquired by Travelers and Citigroup in 1998, and disappeared from the public eye after a series of scandals in 2003.&lt;br /&gt;&lt;br /&gt;He went through their training program and worked in the mortgage bond department.  Salomon pioneered the idea of packaging mortgages as bonds.  Everything that has happened in the thirty years since that is described in "The Big Short" had its genesis in his department.&lt;br /&gt;&lt;br /&gt;I'm only halfway through the book.  It's entertaining but sobering.  I'm sure that no one understood the significance of the change to the tax code that was passed in 1981 would have the effect that it did.  It was one step on a road that included the Community Reinvestment Act of 1977, the establishment of Fannie Mae and Freddy Mac, the gutting of Glass-Steagall, and the invention of the collateralized debt obligations and credit default swaps.&lt;br /&gt;&lt;br /&gt;Small outcomes, big effects.&lt;br /&gt;&lt;br /&gt;I'll have to finish the book to find out if Michael Lewis was in the right place at the right time, wallowing in millions that financed his subsequent writing career.  That we should all be so fortunate.&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;a href="http://stackoverflow.com/users/37213/duffymo"&gt;&lt;img src="http://stackoverflow.com/users/flair/37213.png" alt="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&amp;amp;A for professional and enthusiast programmers" height="58" width="208" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-556822862805039764?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/556822862805039764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=556822862805039764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/556822862805039764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/556822862805039764'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/10/liars-poker.html' title='&quot;Liar&apos;s Poker&quot;'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9ZfLzIk1dQU/TM4M1Rrwz2I/AAAAAAAAAIw/dNHwAwG37vQ/s72-c/liars-poker.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-3807496977372064323</id><published>2010-10-05T21:56:00.003-04:00</published><updated>2010-10-05T22:02:29.308-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vietnam'/><category scheme='http://www.blogger.com/atom/ns#' term='pov'/><category scheme='http://www.blogger.com/atom/ns#' term='pbs'/><category scheme='http://www.blogger.com/atom/ns#' term='2010'/><title type='text'>The Most Dangerous Man In America</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9ZfLzIk1dQU/TKvYfHsKVQI/AAAAAAAAAIY/0JKhNvP_nJc/s1600/mostdangerousman144.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 144px; height: 90px;" src="http://4.bp.blogspot.com/_9ZfLzIk1dQU/TKvYfHsKVQI/AAAAAAAAAIY/0JKhNvP_nJc/s320/mostdangerousman144.jpg" alt="" id="BLOGGER_PHOTO_ID_5524747397051864322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p/&gt;&lt;br /&gt;&lt;br /&gt;I'm watching &lt;a href="http://www.pbs.org/pov/mostdangerousman/index.php"&gt;"The Most Dangerous Man In America"&lt;/a&gt;, the story of Daniel Ellsberg, the Pentagon Papers, and the Vietnam War.&lt;br /&gt;&lt;br /&gt;It's quaint and sad. &lt;br /&gt;&lt;br /&gt;Our government is doing far worse things, all in the name of keeping us safe, yet no one is protesting or getting agitated about it.  There's nothing in our national media to compare to the risk that the New York Times took in publishing them.&lt;br /&gt;&lt;br /&gt;What will we look like in hindsight forty years from now?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-3807496977372064323?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/3807496977372064323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=3807496977372064323' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3807496977372064323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3807496977372064323'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/10/most-dangerous-man-in-america.html' title='The Most Dangerous Man In America'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_9ZfLzIk1dQU/TKvYfHsKVQI/AAAAAAAAAIY/0JKhNvP_nJc/s72-c/mostdangerousman144.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-195948146478924527</id><published>2010-08-22T17:12:00.001-04:00</published><updated>2010-08-22T17:27:01.788-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='2010'/><category scheme='http://www.blogger.com/atom/ns#' term='summer'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>"That Deaf, Dumb, and Blind Kid...."</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9ZfLzIk1dQU/THGS9G8fb6I/AAAAAAAAAII/mtlMa1fPEKU/s1600/tommy-the-who.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 225px; height: 225px;" src="http://3.bp.blogspot.com/_9ZfLzIk1dQU/THGS9G8fb6I/AAAAAAAAAII/mtlMa1fPEKU/s320/tommy-the-who.jpg" alt="" id="BLOGGER_PHOTO_ID_5508345397784833954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I work in a small-scale downtown area now.  I commute to and from work on a bus.  I see a lot of people every day, scurrying from place to place.  Everyone seems to have earbuds jammed into their ears, with ubiquitous white cords dangling down to connect them to "their music", the soundtrack to their lives that makes them the individual they are - along with the millions of others making identical choices.  So many of them are simultaneously scrolling through e-mail messages on their iPhone or Blackberry or Android, furiously tapping out a text message, or browsing something on the web.&lt;br /&gt;&lt;br /&gt;They're completely cut off from their surroundings, any random contact with people around them, snug in a digital cocoon.&lt;br /&gt;&lt;br /&gt;The ear buds and extreme focus make me think of that 60s rock opera "Tommy":&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;He ain't got no distractions&lt;br /&gt;Can't hear those buzzers and bells&lt;br /&gt;Don't see lights a flashin'&lt;br /&gt;Plays by sense of smell&lt;br /&gt;Always gets a replay&lt;br /&gt;Never tilts at all&lt;br /&gt;That deaf, dumb and blind kid&lt;br /&gt;Sure plays a mean pinball&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;It drives me crazy to see someone on a bicycle with ear buds in.  Hearing what's going on around me is a key component of keeping myself safe when I ride.  &lt;br /&gt;&lt;br /&gt;It's always someone else that's interesting in this cocoon: the person you could be talking to.  Anyone within reach is fair game to be ignored or interrupted in favor of the next incoming packet of stimulation.&lt;br /&gt;&lt;br /&gt;All this technology is re-wiring us and re-writing the rules of etiquette for social interaction.  Sometimes it's good, but not always.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-195948146478924527?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/195948146478924527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=195948146478924527' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/195948146478924527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/195948146478924527'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/08/that-deaf-dumb-and-blind-kid.html' title='&quot;That Deaf, Dumb, and Blind Kid....&quot;'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9ZfLzIk1dQU/THGS9G8fb6I/AAAAAAAAAII/mtlMa1fPEKU/s72-c/tommy-the-who.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-8506019365798191813</id><published>2010-08-22T11:55:00.004-04:00</published><updated>2010-08-22T12:27:53.040-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2010'/><category scheme='http://www.blogger.com/atom/ns#' term='rain'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='summer'/><title type='text'>Rain</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9ZfLzIk1dQU/THFIgVx4jnI/AAAAAAAAAIA/zhDI8CVUWo0/s1600/rain-images.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 258px; height: 195px;" src="http://1.bp.blogspot.com/_9ZfLzIk1dQU/THFIgVx4jnI/AAAAAAAAAIA/zhDI8CVUWo0/s320/rain-images.jpg" alt="" id="BLOGGER_PHOTO_ID_5508263539690212978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We're experiencing a rare morning of sustained rain here.  It's been a dry summer, so the sound of droplets drumming on the shingles was most welcome.&lt;br /&gt;&lt;br /&gt;I've spent most of the morning at a computer with the television off.  The only sounds I can hear are the computer's fan, birds chirping in celebration of the moisture coming down, and the occasion splash of a car going by.  The dog is being his usual handsome, lazy self lounging on the sofa.  I'm puttering around: paying bills, writing some code in Python, and killing time with this blog.&lt;br /&gt;&lt;br /&gt;I'm conscious of the end of another summer.  My beloved eldest daughter is in Brooklyn awaiting the start of classes and grad school.  My adored youngest daughter will be leaving us again in six days to renew her pursuit of an undergraduate degree in molecular cell biology.  My wife will mourn the end of the period of renewal and head back to work in the schools on Wednesday.  We'll be empty nesters for the first time this fall.&lt;br /&gt;&lt;br /&gt;I rode my bike into work last Tuesday.  It was dark enough when I left the house that cars had to put their lights on.  I had a strobe light on the rear pannier to give those drivers their best chance to avoid hitting me.  I may have another morning ride or two left in me, but the season for riding to work is rapidly coming to a close.&lt;br /&gt;&lt;br /&gt;This is a solemn time of year for me.  It's a reminder of the period fifteen years ago this year when a younger brother passed away.  That was a hot, dry summer; just like this one.  &lt;br /&gt;&lt;br /&gt;I'm spending time learning a new language, &lt;a href="http://xkcd.com/353/"&gt;Python&lt;/a&gt;, by working my way through "Core Python Programming".  I'm enjoying it very much, now that I have a great IDE: PyCharm from JetBrains.  "Develop with pleasure", indeed: it's fun to have a nice tool to help lighten the load.  Python is fun after years of writing Java.  It just feels light and fast.  I like the combination of functional and object-oriented styles in one language. I want to remember the math I know and check out SciPy and NumPy; I want to find out if Django is just like Grails and Ruby on Rails. &lt;br /&gt;&lt;br /&gt;I just want to keep learning and continue to do something - programming - that I like to do but rarely get a chance at in my current position at work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-8506019365798191813?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/8506019365798191813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=8506019365798191813' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/8506019365798191813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/8506019365798191813'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/08/rain.html' title='Rain'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9ZfLzIk1dQU/THFIgVx4jnI/AAAAAAAAAIA/zhDI8CVUWo0/s72-c/rain-images.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-1253732873583638432</id><published>2010-08-05T17:35:00.001-04:00</published><updated>2010-08-05T17:35:00.123-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='moving'/><category scheme='http://www.blogger.com/atom/ns#' term='bed'/><category scheme='http://www.blogger.com/atom/ns#' term='2010'/><category scheme='http://www.blogger.com/atom/ns#' term='ikea'/><title type='text'>First IKEA Visit</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9ZfLzIk1dQU/TFXozVUMKuI/AAAAAAAAAH4/-2iZeuo_nl0/s1600/ikea-logo.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 320px; height: 121px;" src="http://1.bp.blogspot.com/_9ZfLzIk1dQU/TFXozVUMKuI/AAAAAAAAAH4/-2iZeuo_nl0/s320/ikea-logo.jpg" alt="" id="BLOGGER_PHOTO_ID_5500558488495729378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I made my first pilgrimage to IKEA this past Sunday.  My oldest daughter will be moving out this month, so we took a trip to find a bed: a decent, full size mattress that will last her for a while. &lt;br /&gt;&lt;br /&gt;I had a similar feeling when I walked into Whole Foods for a first time: a little overwhelmed, awe-struck by the sheer scale of the display in a temple devoted to consumption. &lt;br /&gt;&lt;br /&gt;Those IKEA folks must have taken a page from Disney: they shepherd you along a well-marked trail throughout the store so you have to see everything they have to offer.  The number of path choices are limited and winding.&lt;br /&gt;&lt;br /&gt;We looked at several beds that were nice before settling on one that suited her well.  We asked about pickup and delivery options.  IKEA won't bring it to her new apartment, but there's a store nearby that would make the pickup easier.  (I wasn't thinking today; we should have brought a car that's bigger than a Honda Civic so we could have taken our purchase away.)  We'll probably just go back to this store before she leaves to minimize running around on moving day.&lt;br /&gt;&lt;br /&gt;It's an emotional thing to see one of my children leaving home.  I remember it being a very hard thing for me to do, both when I took the half-step out of the house to go to college and the full, headlong leap into my first job and apartment upon graduation.  The job didn't pay much.  I didn't have a lot of possessions: a bed, a stupid desk bought at a second-hand store that I was convinced was worth refinishing, two guitars, a small all-in-one stereo, my clothes, and a few kitchen items so I could feed myself.&lt;br /&gt;&lt;br /&gt;It wasn't a young man's bachelor pad, by any stretch.  I don't recall either of my parents setting foot in it during the two years I lived there.  No one who came to visit once came back a second time.  I can't tell if it was because the company was poor or the lack of a couch to sit on.&lt;br /&gt;&lt;br /&gt;But it was &lt;span style="font-style: italic;"&gt;my &lt;/span&gt;place.  If I came home from work and wanted to swim or play basketball before cooking dinner, so be it.  One of the reasons I've become such an avid swimmer was that I  had an indoor pool available to me every day.  It was a bathtub - just 20 yards long - but it gave me the chance to practice my poor freestyle in relative privacy without worrying about being run over by better swimmers or cannonballed by flying children.&lt;br /&gt;&lt;br /&gt;I didn't have a television set, so there were few distractions.  I'd listen to the public radio station for company: &lt;a href="http://www.wamc.net/lurtsema.html"&gt;Robert J. Lurtsema&lt;/a&gt; on WFCR was the star of the dial.  His "Morning Pro Musica" program would start every day at 6 AM with themes like Respighi's Ancient Airs and Dances Suite (thanks to Google and &lt;a href="http://10engines.blogspot.com/2009/03/morning-pro-musica.html"&gt;10engines &lt;/a&gt;for this nugget).  There was one piece, whose title escapes me, that I learned how to play on the guitar.  It was always a pleasure to hear it and think to myself "I know how to play that."&lt;br /&gt;&lt;br /&gt;I rekindled my love of classical guitar after a four-year undergraduate hiatus by going to the music store down the street and signing up for lessons.  My teacher was a young Hartt School graduate named Jim Petrie.  He was a terrific teacher.  I wish I could say I was a better student.  I practiced faithfully, usually in the morning before I went to work.  I found the early hours lent themselves to this sort of thing. &lt;br /&gt;&lt;br /&gt;When I married my wife she was the one who brought "stuff": a huge, comfortable couch from her parents that was long enough to stretch out and take naps on; lamps; end tables.  One point of friction at first was the television.  If I liked listening to the radio for company, she liked to have the television on.  I chafed under the new regime at first - until the NBA playoffs rolled around.  I was happy to be able to watch a young Larry Bird face down the Houston Rockets.&lt;br /&gt;&lt;br /&gt;You never forget your first apartment.  I hope my daughter makes good memories in hers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-1253732873583638432?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/1253732873583638432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=1253732873583638432' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/1253732873583638432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/1253732873583638432'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/08/first-ikea-visit.html' title='First IKEA Visit'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9ZfLzIk1dQU/TFXozVUMKuI/AAAAAAAAAH4/-2iZeuo_nl0/s72-c/ikea-logo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-3080968410233740368</id><published>2010-08-01T11:07:00.002-04:00</published><updated>2010-08-01T11:32:14.804-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jetbrains'/><category scheme='http://www.blogger.com/atom/ns#' term='2010'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='pycharm'/><title type='text'>Python and PyCharm</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9ZfLzIk1dQU/TFWN3ByqT9I/AAAAAAAAAHw/tQtvuJuTMkg/s1600/pycharm-logo.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 102px; height: 102px;" src="http://2.bp.blogspot.com/_9ZfLzIk1dQU/TFWN3ByqT9I/AAAAAAAAAHw/tQtvuJuTMkg/s320/pycharm-logo.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5500458496416174034" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I bought a book entitled &lt;a href="http://www.amazon.com/Core-Python-Programming-Wesley-Chun/dp/0132269937/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1280675549&amp;sr=1-1"&gt;"Core Python Programming"&lt;/a&gt; by Wesley J. Chun at the urging of &lt;a href="http://www.johndcook.com/blog/category/python/"&gt;John D. Cook&lt;/a&gt;.  It's a wonderful book, but I stopped reading about three-quarters of the way through.  I wanted very much to learn Python, but I didn't have a motivating problem.  I was also lacking a good IDE.  As a Java developer, I'm used to having &lt;a href="http://www.jetbrains.com/"&gt;IntelliJ by Jetbrains&lt;/a&gt; on hand at all times.  I think it's the best IDE there is.  I buy a personal license every year, because I don't want to work without it.&lt;br /&gt;&lt;br /&gt;I've been trying to do more coding on my own time lately, because my architecture day job doesn't afford me any opportunity to write code.  (We draw UML diagrams, write documentation, and act as a go-between for the business and the developers.)&lt;br /&gt;&lt;br /&gt;I've been aware of &lt;a href="http://norvig.com/spell-correct.html"&gt;Peter Norvig's brilliant spelling corrector&lt;/a&gt; in Python for a while.  He makes magic happen in just 21 lines of Python 2.5 code.  It inspired a cottage industry of efforts to match his functionality and succinctness in other languages, including Java and Groovy.&lt;br /&gt;&lt;br /&gt;This weekend I thought I'd revisit his spelling checker and see if I could reproduce it in Java.  I wasn't concerned with minimizing lines of code.  My goal was to maximize my understanding.  &lt;br /&gt;&lt;br /&gt;The shell of the code is simplicity itself, but when I got to the heart of the matter I didn't understand the Python idiom well enough to see my way through in Java, so I got my "Core Python Programming" off the shelf and started trying to piece things together.  Running the code in a debugger would help.  What tools could I use?&lt;br /&gt;&lt;br /&gt;That's when Jetbrains came to my rescue again: I downloaded the latest version of &lt;a href="http://www.jetbrains.com/pycharm/download/"&gt;PyCharm&lt;/a&gt;, their new Python IDE that's now in beta.  It offers the same wonderful feel that I've enjoyed in IntelliJ for years.  &lt;br /&gt;&lt;br /&gt;It was easy to create a new project and add Norvig's code and seed file.  I didn't know how to run a module in the console - that's how green I am - but it didn't take long to figure out how to import.  Then there was the problem of command line arguments.  I knew how to enter them in Java - how to duplicate the trick in Python?  Thank god for Google; the &lt;a href="http://www.faqs.org/docs/diveintopython/kgp_commandline.html"&gt;answer &lt;/a&gt;was soon at hand.  &lt;br /&gt;&lt;br /&gt;The script took a very long time to run when I tried it the first time.  What was taking so long?  The debugger clued me in: the first command line argument was the full path to the script being executed, which drove the poor spelling corrector crazy.  How to avoid processing the first argument?  With Python, the answer is easy.  You change this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;    for arg in sys.argv:&lt;br /&gt;        print arg, correct(arg)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;to this: &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;    for arg in sys.argv[1:]:&lt;br /&gt;        print arg, correct(arg)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;It felt great to work through some simple difficulties that are challenging to a newbie like me.  I'd love to develop a comfort level with Python sufficient to start taking advantage of its terrific scientific programming libraries like &lt;a href="http://numpy.scipy.org/"&gt;NumPy and SciPy&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm going to continue working to port the spelling corrector over to Java.  It's a terrific application of Bayesian statistics.  &lt;br /&gt;&lt;br /&gt;But I hope that having a world-class IDE at my disposal will re-inspire my Python efforts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-3080968410233740368?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/3080968410233740368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=3080968410233740368' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3080968410233740368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3080968410233740368'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/08/python-and-pycharm.html' title='Python and PyCharm'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9ZfLzIk1dQU/TFWN3ByqT9I/AAAAAAAAAHw/tQtvuJuTMkg/s72-c/pycharm-logo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-2339276137140637757</id><published>2010-07-20T21:10:00.003-04:00</published><updated>2010-07-20T21:19:02.933-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2010'/><category scheme='http://www.blogger.com/atom/ns#' term='vacation'/><category scheme='http://www.blogger.com/atom/ns#' term='cupcake'/><category scheme='http://www.blogger.com/atom/ns#' term='cape cod'/><title type='text'>Hostess With The Mostess</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9ZfLzIk1dQU/TEZJM_PmF2I/AAAAAAAAAHo/9Qz9z1YhuUI/s1600/cupcake-charlies-front_store.gif"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 320px; height: 201px;" src="http://2.bp.blogspot.com/_9ZfLzIk1dQU/TEZJM_PmF2I/AAAAAAAAAHo/9Qz9z1YhuUI/s320/cupcake-charlies-front_store.gif" alt="" id="BLOGGER_PHOTO_ID_5496160882736371554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="if(typeof(jsCall)=='function'){jsCall();}else{setTimeout('jsCall()',500);}" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Two of our oldest and best friends invited us to join them at Cape Code this past Saturday.  We couldn't stay the weekend because we had a previous obligation to attend a one-year-old's birthday party on Sunday afternoon.  We spent a lovely day at the beach: swimming out to a raft and back, lolling on the beach, having a craic - all our favorites.  At the end of the afternoon we showered, changed, and headed out for some lovely seafood for dinner.  The food was inexpensive but delicious.&lt;br /&gt;&lt;br /&gt;We were strolling after dinner when we found &lt;a href="http://www.cupcakecharlies.com/"&gt;Cupcake Charlie's&lt;/a&gt;.  The moment I walked in the door I had to have a &lt;a href="http://www.cupcakecharlies.com/menu.html"&gt;Hostess With The Mostest&lt;/a&gt;.  It was an incredible facsimile of the old favorite from my childhood.  The cake was rich devil's food; the center was filled with creme; the icing on top was dense and thick.  It was fantastic!  I'd soon weigh three hundred pounds if I lived within easy reach of these beauties.&lt;br /&gt;&lt;br /&gt;I was so taken with my cupcake that I went back into the store to thank them and compliment them on their handiwork.  They've been in business for three years now.  It sounds like they're doing pretty well.&lt;br /&gt;&lt;br /&gt;With products like this, it's no wonder.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-2339276137140637757?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/2339276137140637757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=2339276137140637757' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/2339276137140637757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/2339276137140637757'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/07/hostess-with-mostess.html' title='Hostess With The Mostess'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9ZfLzIk1dQU/TEZJM_PmF2I/AAAAAAAAAHo/9Qz9z1YhuUI/s72-c/cupcake-charlies-front_store.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-7519030400105224585</id><published>2010-06-27T09:07:00.004-04:00</published><updated>2010-06-27T10:01:31.998-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='toastmasters'/><category scheme='http://www.blogger.com/atom/ns#' term='speaking'/><title type='text'>A Leadership Role</title><content type='html'>&lt;div style="text-align: justify;"&gt;As part of my ongoing efforts at self-improvement, I ran for a leadership position in my local Toastmasters club.  The Toastmasters fiscal year runs from July 1 to June 30 of the following year, so elections are usually held in June.  There are several high level positions, such as president and several vice-presidents, followed by lower level positions such as treasurer, sergeant-at-arms, and secretary.   I decided to try for secretary as my first office.  I thought it would be an opportunity to learn how things worked and observe someone up-close before making a run of my own for a higher office.&lt;br /&gt;&lt;br /&gt;I ran unopposed, so my victory was a fait accompli. &lt;br /&gt;&lt;br /&gt;I'm still pleased by the outcome.  The incoming president is a dynamic, smart individual.  I'm looking forward to supporting him and learning from his experience over the next year.&lt;br /&gt;&lt;br /&gt;Claiming a leadership position means training, so I headed over to a morning of sessions yesterday afternoon.  There was the usual "pump up the crowd" opening and closing gathering sandwiching hour-long sessions on a variety of topics.&lt;br /&gt;&lt;br /&gt;My first session talked about record keeping for secretaries and treasurers.  It was a cautionary tale that merely signing up for Toastmasters doth not a speaker make.  The man who gave the presentation was awful:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;br /&gt;&lt;li&gt;His self-deprecation was merely annoying at first; it quickly made me wonder why he was chosen to speak at all.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;He was unprepared.  He kept telling us about all the other things he had going on in his life (e.g., children, grandchildren, etc.) that made it impossible for him to be ready.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;His slides were simply atrocious.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;His delivery was flat, monotone, and uninspired.  Record keeping may not be an exciting topic, but that's no excuse for informing so poorly.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;His speech was riddled with "ahs" and "ums" and lots of filler words.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;I was nodding off in the back row.   The audience was glad when the hour was over.  There was an evaluation slip to be filled out, but I pulled the punch.  The only criticism I wrote was "update slides".&lt;br /&gt;&lt;br /&gt;I wanted to attend a discussion about &lt;a href="http://www.robertsrules.com/"&gt;Robert's Rules of Order&lt;/a&gt; next, a topic that I've heard about but never read.  But when I peeked in the doorway I saw the presenter from the record keeping talk I'd just left setting up shop for his second presentation.  Thank you sir, I'd rather not have another!  I sprinted over to the "Evaluation Boot Camp" talk, and am I glad I did.  It made the day worthwhile all by itself.&lt;br /&gt;&lt;br /&gt;For those who aren't familiar, Toastmasters promotes the idea of developing speaking and leadership skills in a supportive environment.  We're all familiar with preparing and delivering speeches, but feedback is rarely talked about.  Every speech is given a 2-3 minute long evaluation.  The evaluator has to listen carefully and critically while the speech is delivered, furiously write down their thoughts in the minute that follows, and then deliver an extemporaneous speech for 2-3 minutes that provides actionable recommendations.&lt;br /&gt;&lt;br /&gt;It's not an easy thing to do.  There are some telltale signs that signify "bad evaluation".&lt;br /&gt;&lt;br /&gt;Evaluators need to resist the temptation to recap the speech: "They said this; then we heard this..."  A recap isn't educational.&lt;br /&gt;&lt;br /&gt;The manuals that guides members through a gauntlet of speeches has specific goals for each exercise.  It's easy for an evaluator to read the objectives in a rote manner and check off how the speaker met each objective.  It's slothful.&lt;br /&gt;&lt;br /&gt;The worst of all says "Great job - I couldn't find a single thing to criticize!  It was perfect in every way!"  It might be great for the ego, but I won't learn what to do better from this.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://donesmith.com/"&gt;Don E. Smith&lt;/a&gt; had some wonderful, actionable suggestions.  He had an evaluation template that had space for comments on content, organization, and delivery (COD).  He pointed out that there are only three kinds of speeches (PIE):&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;br /&gt;&lt;li&gt;Persuasive - talk about Feeling, organized logically, with a call to action at the end&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Informative - talk about Knowing, organized logically, without a call to action at the end&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Entertaining - talk about Experience, organized chronologically&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;He recommended citing the type of speech right up front.  This fixes the type of organization right away.  The evaluation dives right into content, organization, and delivery once that's sorted out.&lt;br /&gt;&lt;br /&gt;I think my future evaluations will be better after hearing this.  My speeches will be too, because now I will craft them with an evaluation in mind.&lt;br /&gt;&lt;br /&gt;I've always shunned organizations and forced behavior.  Fraternities are not for me.  Toastmasters is no different.  I'm not a rah-rah cheerleader for the organization. &lt;br /&gt;&lt;br /&gt;But I like the quiet self-improvement and social opportunities.  As I've attended more of the meetings and functions I've started to develop a small circle of folks that I'm comfortable with. &lt;br /&gt;&lt;br /&gt;My goals for this year are to learn about the running of the club, get through the first book towards Advanced Communicator Bronze, and complete the Competent Leader designation to match my Competent Communicator achievement.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-7519030400105224585?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/7519030400105224585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=7519030400105224585' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/7519030400105224585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/7519030400105224585'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/06/leadership-role.html' title='A Leadership Role'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-8574140048812115656</id><published>2010-05-05T21:31:00.004-04:00</published><updated>2010-05-05T21:50:53.735-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='death'/><category scheme='http://www.blogger.com/atom/ns#' term='2010'/><title type='text'>A Good Death</title><content type='html'>One of my good friends from the Masters swimming group was unable to join us a week ago from Friday.  He got a call that his mother had suddenly passed away in South Africa, so another swimmer took him to the airport to catch a plane to Washington DC.  He was going to meet his sister on her way from California so they could travel home together. &lt;br /&gt;&lt;br /&gt;It was a surprise, in spite of the fact that she was 86 years old.  He had been home over the Christmas holidays.  Her health was as good as could be expected for a woman of her age.  There was no hint of long-term illness.&lt;br /&gt;&lt;br /&gt;I saw him again tonight when I went to our Masters workout.  He was his usual self: smiling, calm, and swimming faster than anybody in the pool.  He complained about being out of shape after having been away, but he's still head and shoulders beyond the rest of us.  My typical pace is 75% of his.  If we do a 200 yard freestyle, I'll be making my turn for the final lap when he finishes.&lt;br /&gt;&lt;br /&gt;The remarkable part came after the workout was over.  When we hit the shower I asked him how his trip was: "Good as could be expected?", I asked.&lt;br /&gt;&lt;br /&gt;The story he told me was unbelievable.  She died on her birthday, just like Ingrid Bergman and (allegedly) Shakespeare.  My friend had spoken to her by phone just hours before she died.  There was no hint of a problem.  She was planning to go to a restaurant for a celebration that evening.  When her son came to pick her up, he found her looking pale and sweat was running down her face.  He took her to hospital as a precautionary measure.  She insisted that she'd be fine, that the others should proceed to the restaurant without her.  They came back later to look in on her and found her in good hands with the doctors. &lt;br /&gt;&lt;br /&gt;An hour later they got a call at home to say she had passed away from a heart attack.  There was no history of heart problems or high cholesterol.&lt;br /&gt;&lt;br /&gt;He told the story so calmly, with a smile on his face as he related the details.  It was as if he was talking about someone who wasn't a relative.  It wasn't cold or unemotional, just matter-of-fact.&lt;br /&gt;&lt;br /&gt;I come from a long line of emotional blubber babies.  When my mother leaves me, there will be no one within fifty miles who will miss out on the news.&lt;br /&gt;&lt;br /&gt;My friend is one of the most accomplished people I've had the pleasure of knowing.  You would have to pick up on being in the presence of genius by listening and observing; he'll never tell you that he got his Ph.D. from Cal Tech and did a post-doc at MIT.&lt;br /&gt;&lt;br /&gt;It made me think that this was an example of what I'd call a good death: lucid until the end, possessing all your faculties, not experiencing prolonged pain or convalescence.  Still going out to celebrate your birthday!  We should all hope to do as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-8574140048812115656?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/8574140048812115656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=8574140048812115656' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/8574140048812115656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/8574140048812115656'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/05/good-death.html' title='A Good Death'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-3291705273343960677</id><published>2010-04-30T21:29:00.003-04:00</published><updated>2010-05-01T08:40:46.582-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='riding'/><category scheme='http://www.blogger.com/atom/ns#' term='2010'/><category scheme='http://www.blogger.com/atom/ns#' term='bicycle'/><title type='text'>First Ride Of The Season</title><content type='html'>I rode to work for the first time in 2010 yesterday.  It's a 22.78 mile ride each way - downhill going to work, uphill coming home.  &lt;br /&gt;&lt;br /&gt;Temperatures were cold yesterday.  Some parts of New England got snow.  We experienced temperatures in the low 30 F range.  I bundled up before I left.  I had a hat under my helmet, gloves, tights, a t-shirt, a sweatshirt, and a windbreaker over the top.  You can only put on so many pairs of socks before your shoes won't fit, so I was limited to a single pair.&lt;br /&gt;&lt;br /&gt;I pumped up my tires to 100 PSI and pushed off at 5:55 AM.  It was light enough to be safe, but I hedged my bets by hanging a strobe light on my seat post.&lt;br /&gt;&lt;br /&gt;There's a slight downhill just beyond my driveway, so it's easy to build up some momentum right out of the gate.  That 15-20 mph breeze sure felt cold!  I started pumping my pedals to build up some heat.  Soon my torso felt comfortable, but my fingers and toes stayed cold through the whole ride.&lt;br /&gt;&lt;br /&gt;The plan calls for me to meet my friend at a pre-arranged corner at 6:30 AM. We have the timing down pat, because he was standing at the corner as I steamed down the road.  He said he'd been waiting for less than a minute before I came into sight around the bend.&lt;br /&gt;&lt;br /&gt;The ride was a pleasant one, as always.  I love the riding, especially since I get to do it with my best friend.  We kept up a steady stream of conversation as we made our way down the bike trail.&lt;br /&gt;&lt;br /&gt;We parted ways after ninety minutes.  I continued alone for the short distance to the Founders Bridge that takes me over the Connecticut River and into Hartford.  It was a great feeling to ride into town under my own power in just 1:40.  I parked my bike in the garage and made my way to the place where I swim to get a hot shower.  That warm water was essential - my feet were numb!  I needed a little heat to walk naturally.&lt;br /&gt;&lt;br /&gt;I felt good all day long.  My legs felt fine when I went up and down stairs - a good sign.  When my legs aren't strong I groan with pain on stairs.  &lt;br /&gt;&lt;br /&gt;I made sure to eat a salad for lunch.  Later in the afternoon I bought a bottle of Gatorade that would fit into my water bottle cage and two Cliff Bars (chocolate chip) for a snack.  I ate the first one just before I left to make sure that I had some fuel in the tank. &lt;br /&gt;&lt;br /&gt;I did something different when I left my desk to ride home.  Last year I'd leave my biking clothes in the locker room, which meant having to cross the street to dress and then come back to get the bike.  I carried my stuff in a backpack and changed in the bathroom down the hall from my desk in order to save some time.  I was able to be on my bike in ten minutes after leaving, which makes a big difference.&lt;br /&gt;&lt;br /&gt;I rode back across the Connecticut River and met my friend on the east side.  Going home is always harder than the morning ride: it's uphill and the fatigue from the morning hasn't dissipated.  The wind was gusting out of the west when we left, but temperatures were much more comfortable.  We made good time, but I was starting to feel tired by the time we parted.  My left knee felt sore, too.  I ate my second Cliff bar and finished the last of the Gatorade.  After a few minutes I was able to push my biggest gear without difficulty.  I made it home in 1:46, which is a pretty good time for the first ride of the year.&lt;br /&gt;&lt;br /&gt;My knee felt a little tender that night, but the soreness wasn't too bad.  I went for a swim before work the next morning.  I did the usual 5x200 pull warm-up, a 5x200 IM set, and finished with 5x100 alternating kicking with a board and one-arm drill.  My legs felt great when I was done.  My left knee was fine.  I did a little downward facing dog to stretch out my lower back.  I felt energetic and strong all day.&lt;br /&gt;&lt;br /&gt;I haven't had my best April for swimming.  It was only slightly better than an average April, so my string of "best months" starting 2010 was ended.&lt;br /&gt;&lt;br /&gt;it'll be good to mingle swimming and biking together.  I enjoy riding so much.  As long as I can stay upright and avoid getting hurt, this is a fun time of year for me.  All spring and summer are ahead of us.  This year it'll last forever and never end.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-3291705273343960677?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/3291705273343960677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=3291705273343960677' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3291705273343960677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3291705273343960677'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/04/first-ride-of-season.html' title='First Ride Of The Season'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-3604134308720323388</id><published>2010-04-27T08:00:00.001-04:00</published><updated>2010-04-27T22:06:13.134-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='reading'/><title type='text'>"The Big Short"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9ZfLzIk1dQU/S9SAxrf9AdI/AAAAAAAAAHg/z8z--NI3pRQ/s1600/big-short-inside-doomsday-machine-michael-lewis-hardcover-cover-art.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 168px; height: 254px;" src="http://2.bp.blogspot.com/_9ZfLzIk1dQU/S9SAxrf9AdI/AAAAAAAAAHg/z8z--NI3pRQ/s320/big-short-inside-doomsday-machine-michael-lewis-hardcover-cover-art.jpg" alt="" id="BLOGGER_PHOTO_ID_5464133838885945810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've taken advantage of my local library to do a fair bit of reading on the cheap lately.  I'm interested in the details of how our most recent financial debacle happened.  Any book that sheds light on the subject is on my list.&lt;br /&gt;&lt;br /&gt;"The Big Short" by Michael Lewis fits the bill perfectly.  It's the true story of a cadre of individuals who saw what was going on, well before anyone else did, when the conventional wisdom said they were fools.  They put their money where their mouths were, too.  They bet millions on shorting the mortgage market, knowing that the rate of default didn't have to reach historic proportions for the bet to pay off.  It took great courage, because they were either betting with their own money or that of investors.  They were certain that the crash would come, but they couldn't predict when.  They didn't know if their funds or courage would run out before the payoff would arrive.&lt;br /&gt;&lt;br /&gt;Michael Lewis knows something about the terrain.  He worked for an investment bank back in the 80s.  He wasn't a great success as a financial adviser, but it did start him on the writer's path with &lt;a href="http://www.amazon.com/Liars-Poker-Michael-Lewis/dp/039333869X/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1272221556&amp;sr=1-1"&gt;"Liar's Poker"&lt;/a&gt;.  How fortunate for the rest of us!&lt;br /&gt;&lt;br /&gt;It's a great read, very entertaining.  I recommend it highly.&lt;br /&gt;&lt;br /&gt;There was a lot of negative discussion about short selling when the market came down and Lehman Brothers failed.  CEOs &lt;span style="font-style: italic;"&gt;hate &lt;/span&gt;short sellers.  They complain about their company being hurt by rumors and whispers, implying that the short sellers are merely manipulating the market for their own benefit.&lt;br /&gt;&lt;br /&gt;There might be some truth to this, especially for naked short sellers who don't have to risk their own money.  But people who put up their own money and take a real risk are providing an alternative information source to the market.  If short action is lively, perhaps there's something to it.  It's the sobering other side to the happy talk pumped out by CEOs and the sellers of their stock.&lt;br /&gt;&lt;br /&gt;With congressional testimony going on, it's especially timely to answer a few questions about how this happened to us:&lt;br /&gt;&lt;br /&gt;1. Was this a "perfect storm" of circumstances that no one could have foreseen?&lt;br /&gt;2. Were the financial instruments so inherently complex that they couldn't be understood by anyone?&lt;br /&gt;3. What did CEOs know, and when did they know it?&lt;br /&gt;4. Was it merely the latest example of an Enron-style theft?&lt;br /&gt;&lt;br /&gt;All four contributed, but I think the fourth option is one that will win the day.&lt;br /&gt;&lt;br /&gt;The news from the New York Times today says that Goldman Sachs was offsetting losses in the mortgage market with their own short action.  They can't claim perfect storm or too complex or not knowing what was going on.&lt;br /&gt;&lt;br /&gt;There are lots of great sources for reading about what happened.  &lt;a href="http://www.amazon.com/Black-Swan-Improbable-Robustness-Fragility/dp/081297381X/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1272220388&amp;amp;sr=1-1"&gt;"The Black Swan"&lt;/a&gt; by Nassim Nicholas Taleb spells out the dangers of over-reliance on lovely mathematical models and normal distributions.  (Note to self: There's a second edition available.)  Mark Chu-Carroll's &lt;a href="http://scienceblogs.com/goodmath/2010/04/shocking_fraud_from_financial.php"&gt;"Good Math, Bad Math"&lt;/a&gt; blog has a fine entry on the matter. &lt;br /&gt;&lt;br /&gt;What will we do about this?  There's legislation being crafted right now that claims to reform our banking system.  This will be Chris Dodd's last hurrah, but I fear that it won't be at all effective.  There will be too many amendments to water it down.  Lobbyists from the banking industry will lend their "expertise" to craft the laws.  Senators and representatives on both sides of the aisle have taken too much money from banks and financial services firms to be objective anymore.&lt;br /&gt;&lt;br /&gt;I've maintained all along that the biggest mistake was repealing Glass-Steagall and replacing it with Gramm-Leach-Bliley.  That was done on Bill Clinton's watch, with Goldman Sachs principals Robert Rubin and Lawrence Summers running things.  Goldman Sachs is embedded far too deeply into our government today.  I know I'll be watching the hearings very closely.&lt;br /&gt;&lt;br /&gt;In the meantime, I recommend that you go out and read "The Big Short".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-3604134308720323388?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/3604134308720323388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=3604134308720323388' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3604134308720323388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3604134308720323388'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/04/big-short.html' title='&quot;The Big Short&quot;'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9ZfLzIk1dQU/S9SAxrf9AdI/AAAAAAAAAHg/z8z--NI3pRQ/s72-c/big-short-inside-doomsday-machine-michael-lewis-hardcover-cover-art.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-4749428274510048552</id><published>2010-04-25T11:39:00.005-04:00</published><updated>2010-04-25T13:37:06.701-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='fiction'/><category scheme='http://www.blogger.com/atom/ns#' term='reading'/><title type='text'>"City Of Thieves"</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9ZfLzIk1dQU/S9Rk0myCZaI/AAAAAAAAAHY/BXQeeO--3Iw/s1600/city-of-thieves-cover-1971304.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 98px; height: 148px;" src="http://3.bp.blogspot.com/_9ZfLzIk1dQU/S9Rk0myCZaI/AAAAAAAAAHY/BXQeeO--3Iw/s320/city-of-thieves-cover-1971304.jpg" alt="" id="BLOGGER_PHOTO_ID_5464103102833649058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A friend in my swimming group recommended "City of Thieves" by David Benioff.  It's set in Leningrad during the Nazi siege.  How cheery! &lt;br /&gt;&lt;br /&gt;I was surprised to find that it was the best work of 'fiction' that I've read in a very long time.&lt;br /&gt;&lt;br /&gt;I put fiction in quotes because it was difficult to separate truth from fiction.  The prologue describes the author's visit to his Russian grandparents, who have retired to Florida.  The grandfather has never spoken about his experiences during the war, but the trip inspired a weekend with a tape recorder.  After three straight days of stories, the author says he'll need another session to fill in the details.  "You're a writer, David - make it up!" says the grandfather.&lt;br /&gt;&lt;br /&gt;And so the book begins.&lt;br /&gt;&lt;br /&gt;It's a wonderful page turner that I couldn't put down.  The language was so vivid, the weaving of details so artful, that after I finished it I had to re-read the last chapters to take it in again.&lt;br /&gt;&lt;br /&gt;I expected horror given the setting and time period.  Horrible things did happen, and the author didn't shy away from them.&lt;br /&gt;&lt;br /&gt;But it was the humor and human connections between characters that took me by surprise.  The characters were wonderful.&lt;br /&gt;&lt;br /&gt;I'm recommending this book to everyone I know.  I read a lot of technical and non-fiction stuff these days.  It felt good to enjoy a work like this so much.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-4749428274510048552?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/4749428274510048552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=4749428274510048552' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/4749428274510048552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/4749428274510048552'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/04/city-of-thieves.html' title='&quot;City Of Thieves&quot;'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9ZfLzIk1dQU/S9Rk0myCZaI/AAAAAAAAAHY/BXQeeO--3Iw/s72-c/city-of-thieves-cover-1971304.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-4344562949564678170</id><published>2010-04-15T20:42:00.003-04:00</published><updated>2010-04-16T05:48:29.325-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='competition'/><category scheme='http://www.blogger.com/atom/ns#' term='toastmasters'/><category scheme='http://www.blogger.com/atom/ns#' term='speaking'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>First Competition</title><content type='html'>I took the next step in my Toastmasters competition last night after winning our club contest: the area contest.  I was up against two winners from other local clubs.  The prize?  The chance to move on to the district competition and, perhaps, the international.&lt;br /&gt;&lt;br /&gt;Contests are run very much like regular weekly meetings.  Everything is very formal.  I've been an observer at AA meetings for years.  Toastmasters meetings remind me of them.  They're structured and formal, with lots of applause and encouragement.  The contests have judges and rules, prizes and protocols.  There are two competitions: one for tall tales, where contestants speak for 3-5 minutes about the wildest imaginary stories they can think of, and another for international, which require 5-7 minutes talks on more serious topics.&lt;br /&gt;&lt;br /&gt;I was one of three contestants in the international competition.  I came in third, but I was happy with that.  The other two speakers were both far more experienced that I am, and it showed.  Their writing, rehearsal, and delivery were top-shelf.  I had heard (and evaluated) the winner's speech a month ago, so I knew what I was up against going in.  She didn't disappoint.  It was a most impressive performance.  I would have voted for her as the winner if I were a judge.&lt;br /&gt;&lt;br /&gt;The second-place finisher at my club entered the tall tales battle and won, hands down.  He's an incredibly accomplished guy and a great speaker.  He has an instrument-level pilot's license.  He went to the Caribbean on vacation with his family, piloting a 40 foot sailboat.  His story described how he tied up the boat and went with his family to head into town on a windy day.  They were strolling along the beach when they saw their $750,000 chartered boat had torn free of its mooring and was gliding into the harbor without a pilot.  My friend jumped into a motorboat, climbed aboard, and stopped the vessel just a few feet short of shoals and a wall.  He would have had an embarrassing call to a charter company and their insurance company if he hadn't acted so quickly.&lt;br /&gt;&lt;br /&gt;The name of the boat?  "Vela Via", Italian for "Sail Away".  Delicious irony!&lt;br /&gt;&lt;br /&gt;I enjoyed the competition very much, but it tells me that I can do much, &lt;span style="font-style:italic;"&gt;much &lt;/span&gt;better.  I have to work harder at improving my writing, rehearsal, and delivery.  My inclination towards procrastination will be the death of me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-4344562949564678170?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/4344562949564678170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=4344562949564678170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/4344562949564678170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/4344562949564678170'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/04/first-competition.html' title='First Competition'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-3984313208172090299</id><published>2010-03-27T16:41:00.005-04:00</published><updated>2010-03-27T17:15:31.715-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2010'/><category scheme='http://www.blogger.com/atom/ns#' term='toastmasters'/><category scheme='http://www.blogger.com/atom/ns#' term='speaking'/><title type='text'>Competent Communicator At Last</title><content type='html'>Last Thursday I was working at my desk when an e-mail popped into Outlook.  Thursday is Toastmaster's Day.  I received a note saying that there was an open speaking slot available; the first one to claim it could speak.&lt;br /&gt;&lt;br /&gt;I happened to have a speech written, printed out and ready to go.  I hadn't rehearsed it at all, so I would have to depend on notes, my memory, and my passion for the subject matter.  I immediately replied to say that I wanted the chance.&lt;br /&gt;&lt;br /&gt;I felt some urgency for two reasons: first, it would be my tenth speech in the Competent Communicator series, the lowest rung on the Toastmasters ladder, and second, I would achieve the milestone within two years of giving my icebreaker speech back in Apr 2008.  I had a seven month hiatus from September 2008 through April 2009 where I was utterly silent.  I changed jobs and clubs during that time.  It took me  a while to get used to my new surroundings.  But now I was on a roll.  I wanted to make that first benchmark.&lt;br /&gt;&lt;br /&gt;I bounced up the stairs to the conference room on the tenth floor just before noon, text in hand.  I was the first speaker that day.  I wasn't happy about my failure to rehearse, but I liked the topic and delivered it fairly well.&lt;br /&gt;&lt;br /&gt;The president of our club happened to be talking about the requirements for achieving "distinguished club" status.  Every club has a set of goals to meet in terms of new members, certifications earned, officers trained and such.  When she found out that I was getting my competent communicator designation, she smiled and said "You weren't even on my radar!"  Our club was one step closer to the highest designation as a result of my efforts.&lt;br /&gt;&lt;br /&gt;I felt a great sense of accomplishment.  It took longer than I'd like, but I've really picked up the past since joining this group.   I delivered just three speeches in fifteen months at my first club.  I gave four more from April 2009 through the end of the year.  I've already stepped up three times this year, and March is just ending. &lt;br /&gt;&lt;br /&gt;This club meets once a week, which helps a great deal.  My first club only met on the second and fourth Thursday of the month, so the number of available speaking slots was cut in half.  The drip, drip, drip effect of meeting every week helps - it's too easy to slide back while two weeks go by.&lt;br /&gt;&lt;br /&gt;I have the district competition coming up on 14-Apr.  I'm approaching it as a learning experience, with little or no thought about winning it.  I want to see what accomplished speakers do and use them as an inspiration to progress further along.&lt;br /&gt;&lt;br /&gt;I'm as comfortable as I can be with standing and delivering.  I have no fear of it at all.  I know my technique needs to become more conscious, more deliberate.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But the two things that I need to improve on most are writing and rehearsing.  I should have a stable of talks on hand, ready to deliver at a moment's notice.  People have to cancel all the time due to work obligations.  I can make progress if I can jump in the way I did for my tenth. &lt;br /&gt;&lt;br /&gt;It's the rehearsal that needs the most work.  The way to become more conscious, more deliberate is to practice it in, to observe what you're doing, to think about how it all comes across.  Speakers are no different from actors learning their lines.  I have to have them down cold when I stride to the podium. &lt;br /&gt;&lt;br /&gt;There are very few things in life that I'm naturally good at, but speaking in front of groups seems to be one of them.  I'd like to see if I can polish this skill into something that will have a future use that I can't see right now.  I'm always trying to figure out what my third act in life will be.  First engineering, then software.  If the world has changed, and we all need to change fields several times, I want to be ready.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-3984313208172090299?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/3984313208172090299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=3984313208172090299' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3984313208172090299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3984313208172090299'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/03/competent-communicator-at-last.html' title='Competent Communicator At Last'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-5907948330082116639</id><published>2010-03-13T13:13:00.005-05:00</published><updated>2010-03-13T13:50:15.878-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='competition'/><category scheme='http://www.blogger.com/atom/ns#' term='toastmasters'/><category scheme='http://www.blogger.com/atom/ns#' term='speaking'/><title type='text'>First Toastmasters Competition</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9ZfLzIk1dQU/S5vV4WhO2CI/AAAAAAAAAHQ/stnupUAUSXg/s1600-h/toastmasters-Logo-Color_High_Rez.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 355px;" src="http://1.bp.blogspot.com/_9ZfLzIk1dQU/S5vV4WhO2CI/AAAAAAAAAHQ/stnupUAUSXg/s400/toastmasters-Logo-Color_High_Rez.jpg" alt="" id="BLOGGER_PHOTO_ID_5448183338329102370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I entered my first Toastmasters competition on Thursday. &lt;br /&gt;&lt;br /&gt;I won.&lt;br /&gt;&lt;br /&gt;It was a bit of a shock for me.  There were two other speakers entered, and both of them are among the most talented and prolific speakers in our club.  I had heard the runner up's speech a week earlier at another local club.  He's so talented, so precise, so conscious of what he's doing that I immediately resigned myself to accomplishing nothing more than completing the ninth out of ten speeches required for the Competent Communicator designation, the first rung on the communication ladder.&lt;br /&gt;&lt;br /&gt;I wrote my speech at the last minute.  It was a description of a recent event in my life that served as the basis for the tenth and final speech: "Inspire Your Audience".  It was an emotional topic for me.  As usual, I procrastinated and didn't rehearse as much as I'd like. &lt;br /&gt;&lt;br /&gt;But I knew the story well enough to deliver it extemporaneously.  I had the added advantage of speaking last.  It's natural for people to remember the last thing they heard.  Perhaps that factored into the thinking of the judges.&lt;br /&gt;&lt;br /&gt;I get to try again on 14-Apr against some other local clubs.  If that goes well I'll get to move on to the &lt;a href="http://www.district53toastmasters.org/index.php/conferences/spring-2010-conference"&gt;district competition&lt;/a&gt; on 22-May.&lt;br /&gt;&lt;br /&gt;I've got to present my ninth and last speech soon so I can have that Competent Communicator designation in hand.  I'd like to do it before &lt;a href="http://craicpropagation.blogspot.com/2008/04/first-toastmasters-speech.html"&gt;24-Apr&lt;/a&gt;, because that would mean that I finished the ten speeches in two years.  I gave my first one on 24-Apr-2008.  I had long stretch of six months where I didn't speak at all.  I switched jobs and clubs, so it took me a while to recover my stride.&lt;br /&gt;&lt;br /&gt;I don't know what the next steps will be.  Toastmasters has two tracks: communication and leadership.  I don't know if completing that first booklet and achieving a Competent Leader designation is a requirement, or if I'd have the option of going on to more advanced communication work. &lt;br /&gt;&lt;br /&gt;Whichever I choose, I'd like to start accelerating my rate of progress.  I need to be writing, speaking, practicing more.&lt;br /&gt;&lt;br /&gt;This was a good start.  It's astonishing how you can get better at something with regular practice.  I've appreciated having the opportunity.  I don't know where it will lead, but it feels good to continue to progress, grow, and learn.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-5907948330082116639?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/5907948330082116639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=5907948330082116639' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/5907948330082116639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/5907948330082116639'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/03/first-toastmasters-competition.html' title='First Toastmasters Competition'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9ZfLzIk1dQU/S5vV4WhO2CI/AAAAAAAAAHQ/stnupUAUSXg/s72-c/toastmasters-Logo-Color_High_Rez.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-7854146992629332358</id><published>2010-03-10T08:00:00.000-05:00</published><updated>2010-03-07T18:55:39.286-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='phone'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Hello, Android</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9ZfLzIk1dQU/S5Q5MgkKLZI/AAAAAAAAAHI/pNyRg11uMHQ/s1600-h/android-logo.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 85px; height: 94px;" src="http://3.bp.blogspot.com/_9ZfLzIk1dQU/S5Q5MgkKLZI/AAAAAAAAAHI/pNyRg11uMHQ/s400/android-logo.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5446040736460582290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've done it - I've turned into one of "those guys" who has a phone that's really a computer in their hand.&lt;br /&gt;&lt;br /&gt;My wife bought me an Android phone from Google for Christmas.  I was ambivalent about it.  It's a terrific toy, but I objected and held out on activating it for two reasons:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;The monthly plan for data, text, and phone adds another $30 per month to my bill.  It's easy to say that $30 isn't a lot of money, but it accumulates to $360 over a year.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I didn't want to be one of "those guys" who is always looking at their damn phone.  I find that people pay more attention to the devices than they do the people they're with at any given moment.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;I held out for two months, gladly sticking to my ancient flip phone, until I got my bill for Feb.  It included a $260 equipment charge.  What was that?  I called Verizon to ask.  They told me that I had agreed to "terms and conditions" when the phone was purchased.  If I didn't activate the phone within a certain period of time I had to pay the equipment charge.&lt;br /&gt;&lt;br /&gt;So I sailed over to the local Verizon store to sort it out.  They had a few issues that kept me standing at the counter for longer than I thought was necessary.  When I started to lose patience I said some magic words that got things moving again: "Maybe I should just forget it and get an iPhone..."&lt;br /&gt;&lt;br /&gt;After about 30 minutes of futzing around I was able to take the phone home.  I had a little bit of trouble migrating the contacts from my old phone to the new one.  The MyVerizon.com site wasn't as clear as they'd like to believe.  (All I could think of was Steve Krug's wonderful book on web design entitled &lt;a href="http://www.amazon.com/s/?ie=UTF8&amp;keywords=don%27t+make+me+think&amp;tag=googhydr-20&amp;index=aps&amp;hvadid=4341626939&amp;ref=pd_sl_m4c8i1l81_e"&gt;"Don't Make Me Think!"&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;It seems like a lovely toy.  Android accepts Java; iPhone only allows Objective C.  Android works on Verizon, the wireless carrier my whole family uses; iPhone only works on AT&amp;T.  I'm still figuring out how it all works.  It'll be interesting to see if I can synch it up with my work e-mail and calendar.  One of the biggest problems I have at work is knowing I have to be in a certain place, but not being able to see my calendar because I'm removed from my desk.  The phone might be able to help with that.&lt;br /&gt;&lt;br /&gt;It'll also help me feel a bit more &lt;a href="http://craicpropagation.blogspot.com/2010/01/high-tech.html"&gt;high-tech&lt;/a&gt;.  We'll see how it all works out.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Android is a trademark of Google Inc. Use of this trademark is subject to Google Permissions.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-7854146992629332358?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/7854146992629332358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=7854146992629332358' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/7854146992629332358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/7854146992629332358'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/03/hello-android.html' title='Hello, Android'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9ZfLzIk1dQU/S5Q5MgkKLZI/AAAAAAAAAHI/pNyRg11uMHQ/s72-c/android-logo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-5829080826540005696</id><published>2010-03-07T15:24:00.003-05:00</published><updated>2010-03-07T15:44:30.046-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='riding'/><category scheme='http://www.blogger.com/atom/ns#' term='bicycle'/><category scheme='http://www.blogger.com/atom/ns#' term='fitness'/><category scheme='http://www.blogger.com/atom/ns#' term='cycling'/><title type='text'>First Ride Of 2010</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9ZfLzIk1dQU/S5QLoWFrCyI/AAAAAAAAAHA/XyO4STJz3pM/s1600-h/cycling-4414195826_861aae2325.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 226px; height: 320px;" src="http://3.bp.blogspot.com/_9ZfLzIk1dQU/S5QLoWFrCyI/AAAAAAAAAHA/XyO4STJz3pM/s320/cycling-4414195826_861aae2325.jpg" alt="" id="BLOGGER_PHOTO_ID_5445990637149817634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's a spectacular late winter Sunday.  Temperatures are up above 50 F/10 C and skies are cloudless and blue.&lt;br /&gt;&lt;br /&gt;I usually don't get on my bike until spring is well under way.  I didn't take my first ride last year until 19-Apr-2009.  Sand and pavement broken by ice and snowplows usually combine to scare me off, but I couldn't resist this year.  I pumped up my tires and headed out to circle the lake in Marlborough, a modest ride of 15.9 miles.&lt;br /&gt;&lt;br /&gt;I was dressed for colder conditions.  I had a new pair of fingered gloves that kept my hands nice and toasty.  I wore a hat under my helmet so my ears wouldn't go numb.  I had tights, a sweatshirt, and a windbreaker on.  I worked my way to a good sweat by the time I was done.&lt;br /&gt;&lt;br /&gt;I think the extra 500 yards I've tacked onto my daily swims is paying dividends.  I felt fit today.  There are three decent climbs on this ride, including &lt;a href="http://www.blogger.com/%3Ciframe%20width=" 425="" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=jones+hollow+road+marlborough+ct&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=22.650231,66.181641&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Jones+Hollow+Rd,+Marlborough,+Hartford,+Connecticut+06447&amp;amp;z=12&amp;amp;ll=41.658157,-72.462752&amp;amp;output=embed"&gt;&lt;br /&gt;&lt;small&gt;&lt;/small&gt;&lt;/a&gt;&lt;small&gt;&lt;a href="http://maps.google.com/maps?f=q&amp;amp;source=embed&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=jones+hollow+road+marlborough+ct&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=22.650231,66.181641&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Jones+Hollow+Rd,+Marlborough,+Hartford,+Connecticut+06447&amp;amp;z=12&amp;amp;ll=41.658157,-72.462752" style="color: rgb(0, 0, 255); text-align: left;"&gt;Jones Hollow Road&lt;/a&gt;&lt;/small&gt; in Marlborough.  I downshifted and kept my seat the whole way up instead of standing on the pedals and rocking the bike.  My heart, lungs, and legs all felt good.  I've been doing more kicking with a board lately during my swim workouts.  My legs were up to the task today.&lt;br /&gt;&lt;br /&gt;I had no problems with sand or pavement.  My brakes were squealing loudly when I left the house, but once the pads and rim warmed up the noise went away.&lt;br /&gt;&lt;br /&gt;My equipment was in fine shape.  I replaced my pedals last year.  A chronic problem with flat rear tires was corrected with a new rubber seal on the spokes.  I added a strobe light that hangs off my seat post, at the cost of having to remove the carrier I used to bring my clothes to work.  It'll help to keep me safer in the morning if I start riding to work again in April.  I'll have to find another way to transport my clothes.  Perhaps a backpack will do the trick....&lt;br /&gt;&lt;br /&gt;I loved being back on my bike again.  It means that winter is on its way out, that spring isn't far away, that I'll be back on the road to work with my friend Michael again soon.  Of course I tracked my riding last year in the same spreadsheet that I used to track my swimming totals.  I'm starting earlier than last year.  If I could work my way up to two rides to work per week on average I'd have no problem besting the 625 mile total that I accumulated last season.  Maybe I can break the 1,000 mile barrier this summer.&lt;br /&gt;&lt;br /&gt;If only I could translate this goal and metric oriented thinking to my entire life.  I'd accomplish far more than I have to date if I could only figure out how.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-5829080826540005696?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/5829080826540005696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=5829080826540005696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/5829080826540005696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/5829080826540005696'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/03/first-ride-of-2010.html' title='First Ride Of 2010'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9ZfLzIk1dQU/S5QLoWFrCyI/AAAAAAAAAHA/XyO4STJz3pM/s72-c/cycling-4414195826_861aae2325.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-141970095670197793</id><published>2010-02-28T09:38:00.002-05:00</published><updated>2010-02-28T09:54:02.663-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='swimming'/><category scheme='http://www.blogger.com/atom/ns#' term='tracking'/><title type='text'>Swimming 2010</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9ZfLzIk1dQU/S4qADauuLMI/AAAAAAAAAG4/bZje3Mc8pGw/s1600-h/butterfly-4061314614_45de6e0947_t.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 67px;" src="http://4.bp.blogspot.com/_9ZfLzIk1dQU/S4qADauuLMI/AAAAAAAAAG4/bZje3Mc8pGw/s320/butterfly-4061314614_45de6e0947_t.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5443303895833914562" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I had my best yardage total ever back in 2008, the year after I hurt my neck.  I topped 520,000 yards for the year.  Last year was very good - 405,000 yards, my third-best total ever - but not up to the blowout standard set in 2008.&lt;br /&gt;&lt;br /&gt;2010 is shaping up to be a monstrous year for me.  I'm only two months in, and I've already logged 115,200 yards.  January was my best single month ever, and February was my third best by only 900 yards.  One more workout would have made it my second best month; as it was, Feb 2010 was the best February total I've ever had.&lt;br /&gt;&lt;br /&gt;I would have made it too, except for unfortunate circumstances on Friday night.  I was planning to attend a Masters swim after work.  But I just missed catching the first bus from work back to my commuter lot.  The snowy conditions and traffic had the second bus crawling along the highway, so I didn't get to my car until fifteen minutes before the workout started.  It takes 35 minutes on a good day to drive from the commuter lot to the pool, so I knew I'd be late.  And, to top it off, I did a 2500 yard workout before work.  I was planning to "double up" and squeeze in two swims in one day.&lt;br /&gt;&lt;br /&gt;I was already tired from a long week.  So I got into my car, drove home, ate linguini with clam sauce for dinner, and drank wine while watching "Copenhagen", starring Daniel Craig as Heisenberg an Stephen Rea as Bohr.&lt;br /&gt;&lt;br /&gt;If I extrapolate this total, I'll approach 700,000 yards for the year.&lt;br /&gt;&lt;br /&gt;I don't expect to be able to keep up this pace.  Spring is coming, and if all goes according to plan I'll be riding my bicycle to work two days a week.  It will shave two workouts off my torrid pace until summer ends.&lt;br /&gt;&lt;br /&gt;But I'm very happy with my efforts so far.  Three factors have contributed:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;I've been healthy.  I haven't missed a workday of swimming yet.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I've increased my morning workout from 2000 to 2500 yards every day.  The extra 500 yards of kicking and drills only takes another 13 minutes, but the yards add up.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I've managed two Masters swims a week.  Those give a big boost to the yardage total, because they're at least 4000 yards each.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;If only I could manage to apply the same dedication and consistent effort to other areas of my life, like my technical and learning aspirations.  They don't lend themselves as easily to the tracking and measurement that motivate me so much in my athletic pursuits.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-141970095670197793?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/141970095670197793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=141970095670197793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/141970095670197793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/141970095670197793'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/02/swimming-2010.html' title='Swimming 2010'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_9ZfLzIk1dQU/S4qADauuLMI/AAAAAAAAAG4/bZje3Mc8pGw/s72-c/butterfly-4061314614_45de6e0947_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-8443288629626676047</id><published>2010-02-21T11:35:00.008-05:00</published><updated>2010-02-21T12:58:21.561-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='greenspan'/><category scheme='http://www.blogger.com/atom/ns#' term='rubin'/><category scheme='http://www.blogger.com/atom/ns#' term='derivatives'/><category scheme='http://www.blogger.com/atom/ns#' term='pbs'/><category scheme='http://www.blogger.com/atom/ns#' term='summers'/><category scheme='http://www.blogger.com/atom/ns#' term='frontline'/><category scheme='http://www.blogger.com/atom/ns#' term='born'/><title type='text'>The Warning</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9ZfLzIk1dQU/S4FhimHR63I/AAAAAAAAAGw/lrNHq_3XEB0/s1600-h/frontline-logo.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 256px; height: 69px;" src="http://3.bp.blogspot.com/_9ZfLzIk1dQU/S4FhimHR63I/AAAAAAAAAGw/lrNHq_3XEB0/s320/frontline-logo.gif" alt="" id="BLOGGER_PHOTO_ID_5440737071814798194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Original Google Analytics script; this one seems to work --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- &lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;I just finished watching &lt;a href="http://www.pbs.org/wgbh/pages/frontline/warning/view/?utm_campaign=homepage&amp;amp;utm_medium=top5&amp;amp;utm_source=top5"&gt;Frontline's "The Warning"&lt;/a&gt; for the second time.  I'm outraged, bemused, fearful, and saddened all at the same time.&lt;br /&gt;&lt;br /&gt;Having lived through that time, I remember how magical the stock market's run-up was.  The frightening crash on "Black October" in 1986 had the opposite of the expected reaction: the market recovered quickly.  It wasn't a disaster or a wipeout - it was a &lt;span style="font-style: italic;"&gt;buying opportunity&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Ironically, it was the first crisis of Alan Greenspan's career as Fed chairman.  I wonder how much the orderly, swift recovery validated his ideology?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Everyone &lt;/span&gt;I knew was buying stocks, whether they liked it or not.  We were all being moved out of fixed benefit retirement plans and into 401k.  Who wouldn't want that?  Where else could you get 10% annual returns except in the market?  You were a sucker to do otherwise. &lt;br /&gt;&lt;br /&gt;The apocryphal story of the Great Depression was that Joe P. Kennedy withdrew all his money from the market when he got stock tips from a shoe shine boy.  If those kinds of folks were in the market, it was a sure sign to Kennedy that it was time to get out.  What about legions of engineers and software developers snapping up Microsoft, Dell, Intel, Cisco, and Apple?  That was just smart business.  All those companies were in their heyday in the 90s.  Remember when Microsoft was a growth stock?  Everybody expected 10% returns on their investments back then.&lt;br /&gt;&lt;br /&gt;I know my thoughts on the market still reflected the view that fundamentals mattered.  Knowing a company's products and markets and financial situation was the key to choosing wisely.  I wasn't comfortable with the day trading mentality of ignoring fundamentals and buying on movement.&lt;br /&gt;&lt;br /&gt;But I always thought that the dizzying growth we experienced back then was due to the emergence of new technologies like computers and the Internet.  I believed the mantra that said productivity was increasing, because I could see it in the industries I worked in.  I certainly didn't understand derivatives or the risky behavior they encourage.&lt;br /&gt;&lt;br /&gt;I did read the Wall Street Journal, which touted Mr. Greenspan as "The Oracle."  His trips to Capitol Hill were legendary.  Parsing his obscure statements for clues about the economy took on the character of examining the entrails of chickens to predict the future.&lt;br /&gt;&lt;br /&gt;There haven't been many public figures in my memory that have had a more glowing reputation, only to see it tarnished it so badly.  Mr. Greenspan has wounded this country twice: once by his encouragement of unfettered free markets and again by &lt;a href="http://money.cnn.com/2001/01/25/economy/greenspan/"&gt;backing the Bush tax cuts&lt;/a&gt; in 2001.  Our budgets have gone from surplus to raging deficits and off-budget war expenditures.  The total debt is on the order of an entire year's worth of production and growing.&lt;br /&gt;&lt;br /&gt;The Frontline program demonstrates clearly that this is not a problem of Democrats or Republicans.  The entire political class is guilty here.  Glass-Steagall was repealed on Clinton's watch as Rubin, Greenspan, and Summers cheered from the sidelines.  The &lt;a href="http://en.wikipedia.org/wiki/Community_Reinvestment_Act"&gt;Community Reinvestment Act&lt;/a&gt; of 1978, passed under Jimmy Carter, contributed to our latest housing bubble by requiring banks to require credit to the entire community, regardless of ability to repay.  Mr. Obama hasn't done enough to contain and reverse the damage in his first year in office.&lt;br /&gt;&lt;br /&gt;It's been eighteen months since the failure of Lehman Brothers.  There's a sense of unease caused by high, stubborn unemployment, but the panic that gripped the country has subsided.  The rescue effort architected by the Treasury, Goldman Sachs, and the rest of Wall Street has had a calming effect.  It feels like we've all rolled over, pulled the covers over our heads, and gone back to sleep in hope of better dreams.&lt;br /&gt;&lt;br /&gt;But we still don't have any regulation of derivatives, in spite of the lessons from Long Term Capital Management and AIG.  Banks are still too big to fail.  Risk is still being masked and encouraged to a dangerous degree.  The people who brought us to this place are still wielding power.  The fourth branch of government, K Street and lobbyists, have been given a new weapon: their unregulated political contributions are now free speech similar to that of an individual.&lt;br /&gt;&lt;br /&gt;There was a time in my life when there still seemed to be individuals running things that still put the general good ahead of their own.  But that time is over.  We've reached a dangerous spot where ideology and religion are trumping what used to be called rational, liberal thought.  (Not "liberal" in the political spectrum sense; more of the "enlightened" meaning it had during Revolutionary times).  Global corporations owe no allegiance to the country they're based in.  After all, their workers live in many countries.&lt;br /&gt;&lt;br /&gt;After watching "The Warning" I believe we're far from done.  There will be more, worse shocks to come.&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-8443288629626676047?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/8443288629626676047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=8443288629626676047' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/8443288629626676047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/8443288629626676047'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/02/warning.html' title='The Warning'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9ZfLzIk1dQU/S4FhimHR63I/AAAAAAAAAGw/lrNHq_3XEB0/s72-c/frontline-logo.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-1121257901012896581</id><published>2010-02-10T19:33:00.008-05:00</published><updated>2010-02-10T20:21:53.952-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='corporate'/><category scheme='http://www.blogger.com/atom/ns#' term='ladder'/><category scheme='http://www.blogger.com/atom/ns#' term='hierarchy'/><category scheme='http://www.blogger.com/atom/ns#' term='climbing'/><category scheme='http://www.blogger.com/atom/ns#' term='success'/><title type='text'>Climbing The Corporate Ladder</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9ZfLzIk1dQU/S3NQ3PhBPvI/AAAAAAAAAGo/sebG5CeYE1o/s1600-h/corporate-ladder-iStock_000005052080XSmall.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 209px; height: 320px;" src="http://3.bp.blogspot.com/_9ZfLzIk1dQU/S3NQ3PhBPvI/AAAAAAAAAGo/sebG5CeYE1o/s320/corporate-ladder-iStock_000005052080XSmall.jpg" alt="" id="BLOGGER_PHOTO_ID_5436778085154373362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Original Google Analytics script; this one seems to work --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"/&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br/&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- &lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;I had an interesting experience last week.  I was walking to a meeting at work when I thought I saw a woman that my wife and I knew at university.  She was two years behind us, living in the same dorm as my wife; a math major specializing in actuarial science.  She and her husband came to our wedding.  We visited back and forth after marriage, but we lost track after both having children.  She visited on her own after her first daughter was born, just before her maternity leave ended.  We've exchanged Christmas cards every year since, keeping track of the passage of years and the progress of our children via picture greeting cards.&lt;br /&gt;&lt;br /&gt;I recognized her right away, even though she was out of context and the glimpse was fleeting.  My memory for names and such is not what it used to be, but I've always been pretty good about remembering faces.  I had the advantage over her in this case.  She still looked terrific, very much like her younger self.  The last time she saw me I had lots more hair that was dark instead of white, didn't wear glasses, and my face was covered with a full beard.&lt;br /&gt;&lt;br /&gt;I went back to my desk and looked her up in the corporate directory.  Sure enough, my memory was spot on.  I didn't realize that ten months ago I'd landed at the same company where she's spent most of her career.  She's in a different line of business, which is one reason why we never crossed paths.  Another is that she's on the executive staff, just three steps below the CEO of a $30B company.  I'm a lowly IT guy, a lifelong cubicle denizen.  We move in different circles.&lt;br /&gt;&lt;br /&gt;I sent an e-mail, wondering if I'd get a response back.  There was a delay, which made me think that perhaps I'd overstepped my bounds.  I was delighted to find out that she'd been out of town and would like very much to get together.  She asked her admin to put a lunch date on our calendars.&lt;br /&gt;&lt;br /&gt;When the day came, something came up that forced her to cancel.  I replied back saying that was fine with me, but I didn't need an elaborate lunch meeting.  How about a cup of coffee?  She agreed, and we sat down fifteen minutes later over tea.&lt;br /&gt;&lt;br /&gt;I always thought very highly of our friend, and time hasn't diminished that opinion.  It was a fun conversation, filled mostly with our respective pairs of daughters.  Hers are both still in high school, so she was pumping me for information about the college experience and life after children.&lt;br /&gt;&lt;br /&gt;We talked for about half an hour - quite a gift from a person so highly placed in a large organization.  We agreed not to wait so long before getting together again.  Our spouses will make the trek downtown for a dinner foursome sooner rather than later.  It was a terrific meeting.&lt;br /&gt;&lt;br /&gt;I can't think of another person that I know who's done as well in corporate America.  The ladder is narrow and shaky.  Everyone who joins a big company imagines themselves being quickly identified as superior and swept along to the upper rungs.  But we all learn that the ladder is wobbly and narrow, and the gifts that we do possess aren't always the best fit for climbing.&lt;br /&gt;&lt;br /&gt;What are the qualities that cause one person to stand out and rise up?  These would be true both for entrepreneurs and executives.&lt;br /&gt;&lt;br /&gt;I think one of the first qualities is the self-awareness that makes you raise your eyes up from a narrow specialty and take a broader view.  You've got to wake up one day and start thinking in terms of steps to take towards a different goal.&lt;br /&gt;&lt;br /&gt;Another is a belief that you can and should be in charge.  The confidence that's necessary to direct the efforts of others is essential.  &lt;br /&gt;&lt;br /&gt;Education is necessary but not sufficient.  If it was I'd be in great shape.  I went to school either as a student or a professor every semester except two from the time I was five years old until I hit forty-three.  That's a lot of classes, a lot of grades, a lot of material.  Most of it was quite challenging, in areas that I hear our country is falling short in.  I wasn't the best student, but I certainly can claim to be dogged.&lt;br /&gt;&lt;br /&gt;There are many ways to be smart.  Someone who is good at taking that wider view, spotting risks, articulating a path to take or avoid, and anticipating consequences is going to be more valuable than a person who has mastered the latest computer language du jour.&lt;br /&gt;&lt;br /&gt;It's a fascinating question.  Why didn't it work for me? &lt;br /&gt;&lt;br /&gt;Lots of possible reasons.  I could have been limited by my working class, union upbringing: "Don't think too much of yourself.  Don't get a big head!" &lt;br /&gt;&lt;br /&gt;It might be a generational thing, because when I started my working life the idea was to stick with one large, well connected, reliable firm all your life and go as far as you could.  I started with that mindset but started hopping around mid-way through.&lt;br /&gt;&lt;br /&gt;I don't think I had that self-awareness that told me to aspire to that kind of thing.  No matter how many crazy people I met in middle and upper management, it never occurred to me that I could do at least as well or better.&lt;br /&gt;&lt;br /&gt;I love technical work.  That's what I like to do.  Tearing myself away from it and supervising others was losing twice: I'd have to do something I didn't enjoy and give up something I did.  When I was asked to do such a thing during my engineering career, I turned it down.&lt;br /&gt;&lt;br /&gt;It could be that I'm not nearly as smart as I think I am.  There are many ways to be smart: emotional intelligence, reading people, persuading others to take your point of view, etc.  It could be that a deficiency in one of those kept me in a cubicle.&lt;br /&gt;&lt;br /&gt;Another, more comforting, reason is that there is a price to pay for everything.  When you're an executive, you're expected to get into the limo when they send it to your house.  Your life isn't entirely your own anymore.  Cubicle dwellers generally get to leave it behind when they go home at night.  I chose balance.&lt;br /&gt;&lt;br /&gt;I hope that my children think seriously about what they want and where they see themselves when they're my age.  What do you really value?  Satisfying work?  Money?  Status?  Being your own boss?  Owning a company?  Meeting a payroll?  Balancing family and work?  Raising children?  Having a tribe of friends?  Being involved in lots of activities?  Being artistic?&lt;br /&gt;&lt;br /&gt;I'd love to hear my friend talk at length about her journey.  If I get the chance, perhaps I'll write about it.&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-1121257901012896581?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/1121257901012896581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=1121257901012896581' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/1121257901012896581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/1121257901012896581'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/02/climbing-corporate-ladder.html' title='Climbing The Corporate Ladder'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9ZfLzIk1dQU/S3NQ3PhBPvI/AAAAAAAAAGo/sebG5CeYE1o/s72-c/corporate-ladder-iStock_000005052080XSmall.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-7097486446254800655</id><published>2010-01-20T18:00:00.002-05:00</published><updated>2010-01-20T18:00:01.624-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='obama'/><category scheme='http://www.blogger.com/atom/ns#' term='president'/><category scheme='http://www.blogger.com/atom/ns#' term='election'/><category scheme='http://www.blogger.com/atom/ns#' term='change'/><title type='text'>Not As Excited</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9ZfLzIk1dQU/S1ZUuSUuISI/AAAAAAAAAGc/GKeI0bRkYLM/s1600-h/white-house-2680912499_6a0464cc05_t.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 60px;" src="http://4.bp.blogspot.com/_9ZfLzIk1dQU/S1ZUuSUuISI/AAAAAAAAAGc/GKeI0bRkYLM/s400/white-house-2680912499_6a0464cc05_t.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5428619555011174690" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Original Google Analytics script; this one seems to work --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br/&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;&lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;A year ago &lt;a href="http://craicpropagation.blogspot.com/2009_01_01_archive.html"&gt;I wrote about how excited I was&lt;/a&gt; to see Barack Obama in the White House.  I was happy to see the Bush administration end after eight years and hopeful that things would change for the better.&lt;br /&gt;&lt;br /&gt;Some things are better, but I'm disappointed that we haven't gone far enough: &lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Guantanamo is still open.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Goldman Sachs still runs the Treasury Department.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The Patriot Act, Department of Homeland Security, and other measures put in place to make us safer have not had the desired effect.  We have given up liberty for safety and ended up with neither.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Deficits continue to climb.  Our debt is reaching the point where we won't be able to turn back.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;We're still at war in Afghanistan and Iraq, with no end in sight.  Yemen might be next.  Sabre-rattling continues with Iran.  At this rate we'll be fighting with the whole Middle East soon.  How will we know "victory" when we see it?  When does a war on terror end?  At $1M per year per soldier, how long before we can't afford any more?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Jobs continue to disappear and don't look like they'll be coming back soon.  Part of the reason for unrest in the Middle East is a large population of educated young people who can't get jobs and establish themselves as adults.  How long before our country finds itself in a similar predicament?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Lobbyists and K-Street continue to represent a fourth branch of government that the founders never envisioned.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Glass%E2%80%93Steagall_Act"&gt;Glass Steagall&lt;/a&gt; is still repealed.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;The economy did not crater, as I feared it might back in September 2008.  But it has not recovered much, either.  The fundamentals are simply terrible.  We cannot continue to spend and consume more than we save and produce.  Eventually the Chinese and Japanese won't want any more of our bonds.  &lt;br /&gt;&lt;br /&gt;We're increasingly a country that indulges in magical thinking.  Excessive belief in belief isn't getting us anywhere.  &lt;br /&gt;&lt;br /&gt;Our ruling class isn't telling us the truth: "We cannot have all-you-can-eat health care and low mortgages and billions on wars and still cut taxes.  Hard choices will be forced on us soon if we don't make them ourselves.  Let's start the discussion now before it's too late."  Instead we have Fox News and talk radio.&lt;br /&gt;&lt;br /&gt;Our educational system is falling behind.  Our kids are encouraged to spend more time playing sports and game consoles and surfing the Internet and keeping up with the Kardashians and texting on iPhones instead of reading or doing science.  Our colleges are turning out plenty of lawyers and MBAs and fewer scientists and engineers.  Where do people think that innovations like iPhones and netbooks come from?&lt;br /&gt;&lt;br /&gt;I'm still glad that Mr. Obama is in charge.  But I hoped for more.  &lt;br /&gt;&lt;br /&gt;Our problems are bigger than any president.  It should not take catastrophe for us to look inside ourselves and decide that we need to reconsider the path we're taking.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-7097486446254800655?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/7097486446254800655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=7097486446254800655' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/7097486446254800655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/7097486446254800655'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/01/not-as-excited.html' title='Not As Excited'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_9ZfLzIk1dQU/S1ZUuSUuISI/AAAAAAAAAGc/GKeI0bRkYLM/s72-c/white-house-2680912499_6a0464cc05_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-7627231587964917409</id><published>2010-01-19T17:52:00.004-05:00</published><updated>2010-01-19T21:56:30.357-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='notebook'/><category scheme='http://www.blogger.com/atom/ns#' term='moleskine'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>High Tech</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9ZfLzIk1dQU/S1Y6MYClr0I/AAAAAAAAAGU/rm5InR5bAAE/s1600-h/moleskine-yhst-71326348041790_2089_3441784.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 170px; height: 94px;" src="http://3.bp.blogspot.com/_9ZfLzIk1dQU/S1Y6MYClr0I/AAAAAAAAAGU/rm5InR5bAAE/s400/moleskine-yhst-71326348041790_2089_3441784.gif" border="0" alt="" id="BLOGGER_PHOTO_ID_5428590385127862082" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Original Google Analytics script; this one seems to work --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br/&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- &lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;I left a meeting this afternoon and headed towards the elevator to go back to my desk.  I had the small &lt;a href="http://www.moleskines.com/?gclid=CL-HtsLFsZ8CFdA65QodUyb-1A"&gt;Moleskine &lt;/a&gt; pocket notebook that I carry with me to jot down notes and reminders in my hand.&lt;br /&gt;&lt;br /&gt;I suddenly flashed back to the memory of one of my &lt;a href="http://www.moleskines.com/?gclid=CL-HtsLFsZ8CFdA65QodUyb-1A"&gt;all-time favorite co-workers&lt;/a&gt;, a brilliant guy who got a 4.0 GPA in computer science from St. John's University and currently works for Microsoft.  Throughout my engineering career I made it a habit to keep a notebook/daily journal in which I scribbled technical details, derivations, sketches, handy tidbits, etc.  I would date and index them for "easier" cross-reference, but being paper my ability to recall things was limited.&lt;br /&gt;&lt;br /&gt;I'd write small personal notes in the margins.  For example, each time my wife called with news that we were expecting one of our daughters I made a note of it.  &lt;br /&gt;&lt;br /&gt;After abandoning engineering and embarking on my software development adventure I tossed them all out.  &lt;br /&gt;&lt;br /&gt;I might have thrown away the now-useless notes when I stopped being an engineer, but I kept the habit.  When I met my friend at the employer we had in common for a year, he gushed about the fact that I carried a notebook and wrote stuff down.  He told his wife about it, who said it sounded like a great thing to do.  I felt "cool" and high-tech, pleased and a little embarrassed by his effusive praise.&lt;br /&gt;&lt;br /&gt;Flash forward twelve years.  I still have my Moleskine in my hand, but now that I'm surrounded by young bucks with iPhones I don't feel very high-tech or cool anymore.&lt;br /&gt;&lt;br /&gt;I felt quaint today.  How quickly things change.&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-7627231587964917409?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/7627231587964917409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=7627231587964917409' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/7627231587964917409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/7627231587964917409'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/01/high-tech.html' title='High Tech'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9ZfLzIk1dQU/S1Y6MYClr0I/AAAAAAAAAGU/rm5InR5bAAE/s72-c/moleskine-yhst-71326348041790_2089_3441784.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-7607308250328743281</id><published>2010-01-16T10:55:00.012-05:00</published><updated>2010-01-16T14:28:47.899-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stackoverflow'/><category scheme='http://www.blogger.com/atom/ns#' term='spolsky'/><category scheme='http://www.blogger.com/atom/ns#' term='learning'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><category scheme='http://www.blogger.com/atom/ns#' term='abstraction'/><title type='text'>Sacred Text</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9ZfLzIk1dQU/S1HvPNh9oAI/AAAAAAAAAGM/BQ6yBmtjrrs/s1600-h/sacred-texts-2192886247_d76d892503_t.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 75px; height: 100px;" src="http://1.bp.blogspot.com/_9ZfLzIk1dQU/S1HvPNh9oAI/AAAAAAAAAGM/BQ6yBmtjrrs/s400/sacred-texts-2192886247_d76d892503_t.jpg" alt="" id="BLOGGER_PHOTO_ID_5427382070567346178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Original Google Analytics script; this one seems to work --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br/&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- &lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;There's a question over on &lt;a href="http://stackoverflow.com/questions/2077913/what-are-possible-benefits-of-knowing-how-low-level-stuff-works"&gt;Stackoverflow&lt;/a&gt; about the value of knowing how low-level details work.  The questioner cited an &lt;a href="http://www.joelonsoftware.com/articles/fog0000000319.html"&gt;article &lt;/a&gt;written by one of the founders of Stackoverflow.com, Joel Spolsky.  His point is that modern programmers tend to focus on learning high level abstractions like Java and .NET and forget about the byte-level details.  He goes on to cite stories about storage of strings in C to bolster his argument.  The questioner wants to hear specific examples of how knowing C can make one a better programmer.&lt;br /&gt;&lt;br /&gt;Joel is a terrifically smart guy.  His degree from Yale is wonderful; he's got a Microsoft pedigree; his Fog Creek software company has been in business for years now; he's one of the best known bloggers about software on the web; he founded Stackoverflow with Jeff Atwood.  Seeing how much time I spend there for no more renumeration than reputation points, the thrill of helping others, and learning a few things along the way I'd say that Joel is a tremendous success in this field by every measure.&lt;br /&gt;&lt;br /&gt;I've even agreed with his point on &lt;a href="http://craicpropagation.blogspot.com/2009/01/when-did-ignorance-become-good-thing.html"&gt;this blog&lt;/a&gt;.  Who can argue in favor of ignorance?  "Please tell the court when you stopped beating your wife, sir."  There's no winning that point.&lt;br /&gt;&lt;br /&gt;But the answer that I started to write in response to the question was negative.  I recommended taking Joel with a grain of salt, since the post was written in 2001.  I was surprised by this, because I'm generally in favor of learning regardless of its commercial payoff.  So I decided to explore the idea a bit more here.&lt;br /&gt;&lt;br /&gt;I learned C while I was still a mechanical engineer.  The only language I ever knew was FORTRAN, of course.  One day my employer disconnected us from the VAX computer we were all sharing and gave &lt;span style="font-style:italic;"&gt;individual &lt;/span&gt;Sun workstations.  I had Unix at my fingertips.  I was fortunate enough to sit in an aisle with a brilliant guy named Kim Perlotto.  He worked in another group that didn't have anything to do with the numerical analysis gang that I ran with, but he was wonderfully smart and terrific to talk to.  I didn't appreciate the computer science knowledge that was spewing out of him all the time, because I was so focused on engineering that I was too ignorant to even know what he was talking about.  ("Software objects?  Since they're 'soft', they must be deformable - maybe viscoplastic.  We'll need an appropriate large strain measure, like Green-Lagrange and its energy conjugate stress measure, 2nd Piola-Kirchoff, maybe a viscoplastic material model by Kevin Walker or &lt;a href="http://iaea.org/OurWork/ST/NE/inisnkm/nkm/aws/fnss/fulltext/28042999.pdf"&gt;Chaboche&lt;/a&gt;...")&lt;br /&gt;&lt;br /&gt;I was walking by Kim's cube one day when I spied his well-thumbed copy of pre-ANSI K&amp;amp;R sitting on the corner of his desk.  I picked it up and asked about it.  He smiled and said, "Wanna learn C?  You can borrow it if you like."&lt;br /&gt;&lt;br /&gt;I struggled through that book.  The whole idea of pointers escaped me for a while.  I remember the day I figured out how function pointers worked.  I was able to change the way a program worked simply by asking a pointer to refer to a new function.  Magic!  I was so happy when a friend complained about a C routine that was returning nonsense results from the input arrays that were passed in.  My suggestion that C arrays being zero-based required subtracting one from the input pointers saved the day.  I was able to bask in glory for an entire afternoon.&lt;br /&gt;&lt;br /&gt;It was my first step away from engineering and towards software development.  When C++ came along, it was close enough to C to entice me to learn it.  (Much like you can entice a fruit-loving dog out of a crate with a wedge of apple.)  I wrote C++ for a living when I first left engineering, allowing me to dip my toes into the vast ocean of object-orientation.  Then Java came along, and now C#.&lt;br /&gt;&lt;br /&gt;I'm happy to say that I did learn C and C++ well enough to feel comfortable and conversant with both.  But if asked to write either one now I'd have to remember a lot of the syntactical subtleties.  It's been eight years since I last wrote in either language.&lt;br /&gt;&lt;br /&gt;So when I started to think about the Stackoverflow question, I was hard-pressed to think of a specific example of how knowing C has made me a &lt;span style="font-style: italic;"&gt;better &lt;/span&gt;programmer.  It changed me into a programmer in the first place, but I don't write C anymore.&lt;br /&gt;&lt;br /&gt;I'd say I'm a &lt;span style="font-style: italic;"&gt;much &lt;/span&gt;better programmer now than I was when I first picked up K&amp;amp;R.  All those years of learning, context, and experience have helped.  I find it impossible to tease my knowledge of C out of that tangle and hold it up to the light.&lt;br /&gt;&lt;br /&gt;The follow-up question should be: Are all the layers of abstraction being used in software development harmful?  Are the generations of programmers plying their trade today inferior to their &lt;a href="http://craicpropagation.blogspot.com/2009/11/coders-at-work.html"&gt;predecessors&lt;/a&gt;, who were worried about making every byte count?  I would say "it depends", in the same way that &lt;a href="http://www.ted.com/talks/lang/eng/brian_cox_on_cern_s_supercollider.html"&gt;Brian Cox&lt;/a&gt; is both Isaac Newton's inferior and superior in physics.  Brian is a brilliant guy who has internalized all that Newton gave us and has gone far beyond it, but he'd be the first to admit that he's standing on the shoulders of giants.&lt;br /&gt;&lt;br /&gt;The difference is that it's not possible for Brian to practice physics without a thorough understanding of everything Newtonian.  Calculus is the mathematics of dynamic systems.  I think it is possible to make a living as a developer and never write C.  The cursory knowledge of C to understand pointers and manual memory management that a skim through K&amp;amp;R would give you might be sufficient.&lt;br /&gt;&lt;br /&gt;Peering behind the curtain to understand everything beneath the abstractions is a laudable impulse, but it has to be indulged given constraints of energy and time.  There are only so many hours in the day, and lots to learn.  Economists would tell us to be mindful of opportunity costs.  Joel Spolsky is a smart guy, but his blog isn't a sacred text - yet.&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-7607308250328743281?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/7607308250328743281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=7607308250328743281' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/7607308250328743281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/7607308250328743281'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/01/sacred-text.html' title='Sacred Text'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9ZfLzIk1dQU/S1HvPNh9oAI/AAAAAAAAAGM/BQ6yBmtjrrs/s72-c/sacred-texts-2192886247_d76d892503_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-5767324233852009783</id><published>2010-01-08T20:00:00.001-05:00</published><updated>2010-01-08T20:00:01.940-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='transactional'/><category scheme='http://www.blogger.com/atom/ns#' term='testng'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='junit'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Spring Transactional DatabaseTests</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9ZfLzIk1dQU/S0P5MJpwQtI/AAAAAAAAAF8/q3WSVnyo7u4/s1600-h/spring-source-logo.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 106px; height: 33px;" src="http://2.bp.blogspot.com/_9ZfLzIk1dQU/S0P5MJpwQtI/AAAAAAAAAF8/q3WSVnyo7u4/s320/spring-source-logo.jpg" alt="" id="BLOGGER_PHOTO_ID_5423452363429003986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Original Google Analytics script; this one seems to work --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br/&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- &lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;I've had a programming problem that's been bugging me for a while.  I'm a Java developer who's a fan of both &lt;a href="http://www.springframework.org/"&gt;Spring &lt;/a&gt; and unit testing.  So whenever I create a data access object (DAO) for persisting objects I like to unit test it to make sure that I've coded everything properly.&lt;br /&gt;&lt;br /&gt;One of the special problems with database testing, especially for those cases where you share a relational database with others, is relying on data being present to make your tests pass.  What happens if the data that made my tests run at 100% success is removed by someone else?&lt;br /&gt;&lt;br /&gt;One solution is to use an isolated database with the identical schema that is completely under your control.  This may not be practical for large schemas.&lt;br /&gt;&lt;br /&gt;Another solution is to make your tests transactional: start the test, open a transaction, populate the database with data, run your tests, and roll them back.  That way you're operating on the real, live schema.  You seed the database with data you can rely on.  Transactions wipe out your footprints and make it look like you never modified the database at all.&lt;br /&gt;&lt;br /&gt;Spring provides base classes to accomplish exactly this: one for &lt;a href="http://www.junit.org/"&gt;JUnit &lt;/a&gt;version 4 and another for &lt;a href="http://www.testng.org/"&gt;TestNG&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've become a fan of TestNG, but I'm unhappy to report that I couldn't make this ideal situation work for TestNG.  I went back to the &lt;a href="http://static.springsource.org/spring/docs/2.5.6/reference/testing.html"&gt;Spring reference docs&lt;/a&gt; in frustration and started again with JUnit version 4.  Section 8.3.7.4. "Transaction management" lays it out perfectly.  My tests were 100% successful.  If I stopped in a debugger and looked at the database, I could see the seed data rows.  When the test was completed, the table rolled back to its undisturbed state, as expected.&lt;br /&gt;&lt;br /&gt;It should have been as simple as exchanging a single JUnit annotation for its TestNG equivalent, but autowiring of beans wasn't working as it should.  When I tried to inject the bean manually from the application context I had another problem.  I'll have to dig into this a bit more to see if I can make TestNG work with Spring.&lt;br /&gt;&lt;br /&gt;I used a simple model object Product:&lt;br /&gt;&lt;br /&gt;&lt;pre font=""&gt;&lt;br /&gt;package tutorial.model;&lt;br /&gt;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;import java.text.DecimalFormat;&lt;br /&gt;&lt;br /&gt;public class Product implements Serializable&lt;br /&gt;{&lt;br /&gt;private Integer id;&lt;br /&gt;private String name;&lt;br /&gt;private double price;&lt;br /&gt;private int quantity;&lt;br /&gt;&lt;br /&gt;public Product(String name, double price, int quantity)&lt;br /&gt;{&lt;br /&gt;this(null, name, price, quantity);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Product(Integer id, String name, double price, int quantity)&lt;br /&gt;{&lt;br /&gt;this.id = id;&lt;br /&gt;this.name = name;&lt;br /&gt;this.price = price;&lt;br /&gt;this.quantity = quantity;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Integer getId()&lt;br /&gt;{&lt;br /&gt;return id;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setId(Integer id)&lt;br /&gt;{&lt;br /&gt;this.id = id;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getName()&lt;br /&gt;{&lt;br /&gt;return name;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setName(String name)&lt;br /&gt;{&lt;br /&gt;this.name = name;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public double getPrice()&lt;br /&gt;{&lt;br /&gt;return price;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setPrice(double price)&lt;br /&gt;{&lt;br /&gt;this.price = price;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public int getQuantity()&lt;br /&gt;{&lt;br /&gt;return quantity;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setQuantity(int quantity)&lt;br /&gt;{&lt;br /&gt;this.quantity = quantity;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public boolean equals(Object o)&lt;br /&gt;{&lt;br /&gt;if (this == o)&lt;br /&gt;{&lt;br /&gt;    return true;&lt;br /&gt;}&lt;br /&gt;if (o == null || getClass() != o.getClass())&lt;br /&gt;{&lt;br /&gt;    return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Product product = (Product) o;&lt;br /&gt;&lt;br /&gt;if (Double.compare(product.price, price) != 0)&lt;br /&gt;{&lt;br /&gt;    return false;&lt;br /&gt;}&lt;br /&gt;if (quantity != product.quantity)&lt;br /&gt;{&lt;br /&gt;    return false;&lt;br /&gt;}&lt;br /&gt;if (id != null ? !id.equals(product.id) : product.id != null)&lt;br /&gt;{&lt;br /&gt;    return false;&lt;br /&gt;}&lt;br /&gt;if (name != null ? !name.equals(product.name) : product.name != null)&lt;br /&gt;{&lt;br /&gt;    return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public int hashCode()&lt;br /&gt;{&lt;br /&gt;int result;&lt;br /&gt;long temp;&lt;br /&gt;result = id != null ? id.hashCode() : 0;&lt;br /&gt;result = 31 * result + (name != null ? name.hashCode() : 0);&lt;br /&gt;temp = price != +0.0d ? Double.doubleToLongBits(price) : 0L;&lt;br /&gt;result = 31 * result + (int) (temp ^ (temp &gt;&gt;&gt; 32));&lt;br /&gt;result = 31 * result + quantity;&lt;br /&gt;return result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public String toString()&lt;br /&gt;{&lt;br /&gt;return "Product{" +&lt;br /&gt;    "id=" + id +&lt;br /&gt;    ", name='" + name + '\'' +&lt;br /&gt;    ", price=" + DecimalFormat.getNumberInstance().format(price) +&lt;br /&gt;    ", quantity=" + quantity +&lt;br /&gt;    '}';&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There's a ProductDao interface:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package tutorial.persistence;&lt;br /&gt;&lt;br /&gt;import tutorial.model.Product;&lt;br /&gt;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;public interface ProductDao&lt;br /&gt;{&lt;br /&gt;  List&amp;lt;Product&amp;gt; find();&lt;br /&gt;  Product find(Integer id);&lt;br /&gt;  List&amp;lt;Product&amp;gt; find(String name);&lt;br /&gt;  List&amp;lt;Product&amp;gt; find(double minPrice, double maxPrice);&lt;br /&gt;  void save(Product product);&lt;br /&gt;  void update(Product product);&lt;br /&gt;  void delete(Product product);&lt;br /&gt;  void delete();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The ProductDaoImpl uses Spring JDBC:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package tutorial.persistence.jdbc;&lt;br /&gt;&lt;br /&gt;import org.springframework.jdbc.core.PreparedStatementCreator;&lt;br /&gt;import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;&lt;br /&gt;import org.springframework.jdbc.support.GeneratedKeyHolder;&lt;br /&gt;import org.springframework.jdbc.support.KeyHolder;&lt;br /&gt;import org.springframework.stereotype.Repository;&lt;br /&gt;import tutorial.model.Product;&lt;br /&gt;import tutorial.persistence.ProductDao;&lt;br /&gt;&lt;br /&gt;import java.sql.Connection;&lt;br /&gt;import java.sql.PreparedStatement;&lt;br /&gt;import java.sql.SQLException;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;@Repository&lt;br /&gt;public class ProductDaoImpl extends SimpleJdbcDaoSupport implements ProductDao&lt;br /&gt;{&lt;br /&gt;  public static final String BASE_SELECT = "select id, name, price, quantity from product ";&lt;br /&gt;  public static final String FIND_ALL = BASE_SELECT + " order by id ";&lt;br /&gt;  public static final String FIND_BY_ID = BASE_SELECT + " where id = ? ";&lt;br /&gt;  public static final String FIND_BY_NAME = BASE_SELECT + " where name = ? ";&lt;br /&gt;  public static final String FIND_BY_PRICE_RANGE = BASE_SELECT + " where price between ? and ? ";&lt;br /&gt;  public static final String INSERT_SQL = "insert into product(name, price, quantity) values(?,?,?)";&lt;br /&gt;  public static final String UPDATE_SQL = "update product set name = ?, price = ?, quantity = ? where id = ?";&lt;br /&gt;  public static final String DELETE_ALL_SQL = "delete from product ";&lt;br /&gt;  public static final String DELETE_BY_ID = DELETE_ALL_SQL + " where id = ?";&lt;br /&gt;&lt;br /&gt;  public List&amp;lt;Product&amp;gt; find()&lt;br /&gt;  {&lt;br /&gt;      ProductRowMapper productRowMapper = new ProductRowMapper();&lt;br /&gt;&lt;br /&gt;      return getSimpleJdbcTemplate().query(FIND_ALL, productRowMapper);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public Product find(Integer id)&lt;br /&gt;  {&lt;br /&gt;      return this.getSimpleJdbcTemplate().queryForObject(FIND_BY_ID, new ProductRowMapper(), id);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public List&amp;lt;Product&amp;gt; find(String name)&lt;br /&gt;  {&lt;br /&gt;      return this.getSimpleJdbcTemplate().query(FIND_BY_NAME, new ProductRowMapper(), name);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public List&amp;lt;Product&amp;gt; find(double minPrice, double maxPrice)&lt;br /&gt;  {&lt;br /&gt;      return this.getSimpleJdbcTemplate().query(FIND_BY_PRICE_RANGE, new ProductRowMapper(), minPrice, maxPrice);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void save(final Product product)&lt;br /&gt;  {&lt;br /&gt;      KeyHolder keyHolder = new GeneratedKeyHolder();&lt;br /&gt;&lt;br /&gt;      this.getJdbcTemplate().update(new PreparedStatementCreator()&lt;br /&gt;      {&lt;br /&gt;          public PreparedStatement createPreparedStatement(Connection connection) throws SQLException&lt;br /&gt;          {&lt;br /&gt;              PreparedStatement ps = connection.prepareStatement(INSERT_SQL, new String [] { "id" });&lt;br /&gt;              ps.setString(1, product.getName());&lt;br /&gt;              ps.setDouble(2, product.getPrice());&lt;br /&gt;              ps.setInt(3, product.getQuantity());&lt;br /&gt;              return ps;&lt;br /&gt;          }&lt;br /&gt;      }, keyHolder);&lt;br /&gt;&lt;br /&gt;      product.setId(keyHolder.getKey().intValue());&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void update(final Product product)&lt;br /&gt;  {&lt;br /&gt;      this.getSimpleJdbcTemplate().update(UPDATE_SQL, product.getName(), product.getPrice(), product.getQuantity(), product.getId());&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void delete(final Product product)&lt;br /&gt;  {&lt;br /&gt;      this.getSimpleJdbcTemplate().update(DELETE_BY_ID, product.getId());&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void delete()&lt;br /&gt;  {&lt;br /&gt;      this.getSimpleJdbcTemplate().update(DELETE_ALL_SQL);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void update(String sql, final Product product)&lt;br /&gt;  {&lt;br /&gt;      Map parameters = new HashMap()&lt;br /&gt;      {{&lt;br /&gt;          put("id", product.getId());&lt;br /&gt;          put("name", product.getName());&lt;br /&gt;          put("price", product.getPrice());&lt;br /&gt;          put("quantity", product.getQuantity());&lt;br /&gt;      }};&lt;br /&gt;&lt;br /&gt;      this.getSimpleJdbcTemplate().update(sql, parameters);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The Spring application context uses the DataSourceTransactionManager:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt;      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;      xmlns:aop="http://www.springframework.org/schema/aop"&lt;br /&gt;      xmlns:tx="http://www.springframework.org/schema/tx"&lt;br /&gt;      xsi:schemaLocation="&lt;br /&gt;          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;br /&gt;          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd&lt;br /&gt;          http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;tx:annotation-driven transaction-manager="txManager"/&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="dataSourceProperties" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer"&amp;gt;&lt;br /&gt;      &amp;lt;property name="location" value="classpath:product-datasource.properties"/&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&amp;gt;&lt;br /&gt;      &amp;lt;property name="driverClassName" value="${datasource.driver}"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="url" value="${datasource.url}"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="username" value="${datasource.username}"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="password" value="${datasource.password}"/&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="productDao" class="tutorial.persistence.jdbc.ProductDaoImpl"&amp;gt;&lt;br /&gt;      &amp;lt;property name="dataSource" ref="dataSource"/&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&amp;gt;&lt;br /&gt;      &amp;lt;property name="dataSource" ref="dataSource"/&amp;gt;&lt;br /&gt;  &amp;lt;/bean&amp;gt;      &lt;br /&gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The Spring transactional JUnit 4 unit test has all the annotations from Chapter 8 of the reference manual:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package tutorial.persistence;&lt;br /&gt;&lt;br /&gt;import org.junit.After;&lt;br /&gt;import org.junit.Before;&lt;br /&gt;import org.junit.BeforeClass;&lt;br /&gt;import org.junit.Test;&lt;br /&gt;import org.junit.runner.RunWith;&lt;br /&gt;import org.springframework.test.annotation.Rollback;&lt;br /&gt;import org.springframework.test.context.ContextConfiguration;&lt;br /&gt;import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;&lt;br /&gt;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;&lt;br /&gt;import org.springframework.test.context.transaction.AfterTransaction;&lt;br /&gt;import org.springframework.test.context.transaction.BeforeTransaction;&lt;br /&gt;import org.springframework.test.context.transaction.TransactionConfiguration;&lt;br /&gt;import org.springframework.transaction.annotation.Transactional;&lt;br /&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;br /&gt;&lt;br /&gt;import tutorial.model.Product;&lt;br /&gt;&lt;br /&gt;import javax.annotation.Resource;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;@ContextConfiguration(locations = { "file:resources/product-*.xml" })&lt;br /&gt;@Transactional&lt;br /&gt;@TransactionConfiguration(transactionManager="txManager", defaultRollback=true)&lt;br /&gt;public class ProductDaoTest extends AbstractTransactionalJUnit4SpringContextTests&lt;br /&gt;{&lt;br /&gt;  @Autowired&lt;br /&gt;  private ProductDao productDao;&lt;br /&gt;  Product [] testProducts =&lt;br /&gt;  {&lt;br /&gt;      new Product("Dell", 1000.0, 100),&lt;br /&gt;      new Product("HP", 2000.0, 200),&lt;br /&gt;      new Product("Cisco", 3000.0, 300),&lt;br /&gt;      new Product("Microsoft", 4000.0, 400),&lt;br /&gt;  };&lt;br /&gt;  private static final double TOLERANCE = 1.0E-8;&lt;br /&gt;&lt;br /&gt;  @BeforeTransaction&lt;br /&gt;  public void verifyInitialDatabaseState()&lt;br /&gt;  {&lt;br /&gt;      List&amp;lt;Product&amp;gt; products = this.productDao.find();&lt;br /&gt;&lt;br /&gt;      assert products != null &amp;amp;&amp;amp; products.size() == 0;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Before&lt;br /&gt;  public void populateDatabase()&lt;br /&gt;  {&lt;br /&gt;      for (Product product : testProducts)&lt;br /&gt;      {&lt;br /&gt;          productDao.save(product);&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Test&lt;br /&gt;  @Rollback(true)&lt;br /&gt;  public void testFindAll()&lt;br /&gt;  {&lt;br /&gt;      List&amp;lt;Product&amp;gt; actual = this.productDao.find();&lt;br /&gt;&lt;br /&gt;      assert actual != null &amp;amp;&amp;amp; actual.size() == testProducts.length;&lt;br /&gt;      for (Product product : testProducts)&lt;br /&gt;      {&lt;br /&gt;          assert actual.contains(product);&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Test&lt;br /&gt;  @Rollback(true)&lt;br /&gt;  public void testById()&lt;br /&gt;  {&lt;br /&gt;      List&amp;lt;Product&amp;gt; actual = this.productDao.find();&lt;br /&gt;&lt;br /&gt;      assert actual != null &amp;amp;&amp;amp; actual.size() == testProducts.length;&lt;br /&gt;      for (Product product : testProducts)&lt;br /&gt;      {&lt;br /&gt;          Product byId = productDao.find(product.getId());&lt;br /&gt;          assert byId.equals(product);&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Test&lt;br /&gt;  @Rollback(true)&lt;br /&gt;  public void testFindByName()&lt;br /&gt;  {&lt;br /&gt;      List&amp;lt;Product&amp;gt; actual = this.productDao.find();&lt;br /&gt;&lt;br /&gt;      assert actual != null &amp;amp;&amp;amp; actual.size() == testProducts.length;&lt;br /&gt;      for (Product product : testProducts)&lt;br /&gt;      {&lt;br /&gt;          List&amp;lt;Product&amp;gt; byName = productDao.find(product.getName());&lt;br /&gt;          assert byName != null &amp;amp;&amp;amp; byName.size() == 1 &amp;amp;&amp;amp; byName.get(0).equals(product);&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Test&lt;br /&gt;  @Rollback(true)&lt;br /&gt;  public void testFindByPriceRange()&lt;br /&gt;  {&lt;br /&gt;      List&amp;lt;Product&amp;gt; actual = this.productDao.find();&lt;br /&gt;&lt;br /&gt;      assert actual != null &amp;amp;&amp;amp; actual.size() == testProducts.length;&lt;br /&gt;      for (Product product : testProducts)&lt;br /&gt;      {&lt;br /&gt;          double minPrice = product.getPrice() - 10.0;&lt;br /&gt;          double maxPrice = product.getPrice() + 10.0;&lt;br /&gt;          List&amp;lt;Product&amp;gt; byPriceRange = productDao.find(minPrice, maxPrice);&lt;br /&gt;          assert byPriceRange != null &amp;amp;&amp;amp; byPriceRange.size() == 1 &amp;amp;&amp;amp; byPriceRange.get(0).equals(product);&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Test&lt;br /&gt;  @Rollback(true)&lt;br /&gt;  public void testUpdate()&lt;br /&gt;  {&lt;br /&gt;      List&amp;lt;Product&amp;gt; actual = this.productDao.find();&lt;br /&gt;&lt;br /&gt;      assert actual != null &amp;amp;&amp;amp; actual.size() == testProducts.length;&lt;br /&gt;      double priceIncrease = 1000.0;&lt;br /&gt;      for (Product product : testProducts)&lt;br /&gt;      {&lt;br /&gt;          double oldPrice = product.getPrice();&lt;br /&gt;          product.setPrice(oldPrice + priceIncrease);&lt;br /&gt;          productDao.update(product);&lt;br /&gt;          Product byId = productDao.find(product.getId());&lt;br /&gt;          assert Math.abs(byId.getPrice() - (oldPrice+priceIncrease)) &amp;lt; TOLERANCE;&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Test&lt;br /&gt;  @Rollback(true)&lt;br /&gt;  public void testDelete()&lt;br /&gt;  {&lt;br /&gt;      List&amp;lt;Product&amp;gt; before = this.productDao.find();&lt;br /&gt;&lt;br /&gt;      assert before != null &amp;amp;&amp;amp; before.size() == testProducts.length;&lt;br /&gt;      productDao.delete(testProducts[0]);&lt;br /&gt;&lt;br /&gt;      List&amp;lt;Product&amp;gt; after = this.productDao.find();&lt;br /&gt;&lt;br /&gt;      assert after != null &amp;amp;&amp;amp; after.size() == (before.size()-1) &amp;amp;&amp;amp; !after.contains(testProducts[0]);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  @AfterTransaction&lt;br /&gt;  public void verifyFinalDatabaseState()&lt;br /&gt;  {&lt;br /&gt;      List&amp;lt;Product&amp;gt; products = this.productDao.find();&lt;br /&gt;&lt;br /&gt;      assert products != null &amp;amp;&amp;amp; products.size() == 0;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Since all the transactional annotations are Spring, I thought that switching from JUnit 4 to TestNG would be as simple as the following three steps:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Remove the @RunWith annotation calling the JUnit 4 runner&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Switch the base class&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Replace the JUnit 4 @Before annotation with its closest TestNG equivalent (@BeforeSuite)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately, there's some autowiring magic that's lost in the translation.  I get a NullPointerException for the ProductDao reference in the populateDatabase method.  When I added code to inject the bean from the application context it failed as well.&lt;br /&gt;&lt;br /&gt;If anyone has any advice that would get me off the dime with TestNG I'd appreciate hearing it.  In the meantime, I know that Spring's transactional database tests work exactly as advertised with JUnit 4.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-5767324233852009783?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/5767324233852009783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=5767324233852009783' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/5767324233852009783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/5767324233852009783'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/01/spring-transactional-databasetests.html' title='Spring Transactional DatabaseTests'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9ZfLzIk1dQU/S0P5MJpwQtI/AAAAAAAAAF8/q3WSVnyo7u4/s72-c/spring-source-logo.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-2030753427598121260</id><published>2010-01-05T14:15:00.003-05:00</published><updated>2011-11-12T16:46:47.703-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='2009'/><category scheme='http://www.blogger.com/atom/ns#' term='oireachtas'/><category scheme='http://www.blogger.com/atom/ns#' term='new england'/><category scheme='http://www.blogger.com/atom/ns#' term='dance'/><category scheme='http://www.blogger.com/atom/ns#' term='irish'/><title type='text'>New England Oireachtas 2009 Results</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9ZfLzIk1dQU/Swi6pwDPulI/AAAAAAAAAFU/7pHaGAkw8zY/s1600/shoes-1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_9ZfLzIk1dQU/Swi6pwDPulI/AAAAAAAAAFU/7pHaGAkw8zY/s320/shoes-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5406776579094198866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Original Google Analytics script; this one seems to work --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;_uacct = "UA-4114468-1";urchinTracker();&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- &lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;The New England Oireachtas was held in Providence RI the weekend before Thanksgiving.  Oireachtas is a Gaelic word that means "gathering of the tribes,", but in this case it's the name of the regional championships for Irish dance.  Even if you've never seen Irish dance, it's likely that you're familiar with &lt;a href="http://www.riverdance.com/"&gt;Riverdance&lt;/a&gt;, the internationally famous show that brought the art form into the collective consciousness.  Or perhaps you've seen send-ups of the dancing on Saturday Night Live.&lt;br /&gt;&lt;br /&gt;Riverdance was a revelation.  It sparked a huge interest in Irish dance.  Schools that had been dormant for years were suddenly overwhelmed by a generation of little girls who decided they wanted to dance like Jean Butler.  A dance competition was called a "feis" (pronounced "FESH") in the singular and "feisanna" in the plural.  There was an explosion in the sales of all the paraphernalia that attended it: shoes, dresses, trophies, wigs, etc.&lt;br /&gt;&lt;br /&gt;My daughter Erin fell under its spell the first time she saw it on a video.  We signed her up at Duffy Academy in East Hartford, where she took instruction every Saturday morning from Mary Duffy.  I would drive her over every weekend, bring a book, and read while she practiced.  I loved that time with her.  She was at the age where her father could do no wrong.  I'd do silly, fun things like pretend that I'd forgotten the way to the school and force her to tell me when to turn.  When I walked to and from the car I'd hold her hand and give it two quick squeezes, simulating the beating of a heart.  She'd pump back twice, and we'd alternate all the way to our destination.  If one of us stopped, a panic would ensue and CPR would have to be administered until all was well again.&lt;br /&gt;&lt;br /&gt;I wasn't the right parent to fulfill her ambitions.  We changed schools when Mary Duffy's health started to fail her.  My wife took over chauffeur duties to lessons and competitions.  Dresses were made and sold, each more elaborate than the one before.&lt;br /&gt;&lt;br /&gt;Erin progressed rapidly when she started competing.  She quickly rose to the ranks of the best dancers in New England, placing in the New England and North American championships regularly, but she never ranked high enough to qualify for the World Championships in Ireland.&lt;br /&gt;&lt;br /&gt;Until this year.&lt;br /&gt;&lt;br /&gt;She had a great day in Providence and placed fifth in her age group, her best showing yet.  She qualified to compete in Glasgow at Easter 2010.&lt;br /&gt;&lt;br /&gt;It's a great accomplishment, of course.  But even better is her humility and graciousness after winning.  She's a competitor who still manages to enjoy the dancing and interacting with her fellow dancers.  We experienced a spike in our phone bill after the competition, because she was fielding so may congratulatory text messages from the other girls in her age group.&lt;br /&gt;&lt;br /&gt;Riverdance is coming to an end this year, but Erin plans to continue dancing for a little longer - at least until the coming Easter.&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-2030753427598121260?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/2030753427598121260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=2030753427598121260' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/2030753427598121260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/2030753427598121260'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2009/11/new-england-oireachtas-2009-results.html' title='New England Oireachtas 2009 Results'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9ZfLzIk1dQU/Swi6pwDPulI/AAAAAAAAAFU/7pHaGAkw8zY/s72-c/shoes-1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-4754635736672620960</id><published>2010-01-03T09:00:00.000-05:00</published><updated>2010-01-03T09:00:01.873-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='statistics'/><category scheme='http://www.blogger.com/atom/ns#' term='data'/><category scheme='http://www.blogger.com/atom/ns#' term='mathematics'/><category scheme='http://www.blogger.com/atom/ns#' term='r'/><title type='text'>Beautiful Data</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9ZfLzIk1dQU/Sz98ew0DmVI/AAAAAAAAAF0/jKl23UuoUNs/s1600-h/beautiful-data-cover.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 180px; height: 236px;" src="http://4.bp.blogspot.com/_9ZfLzIk1dQU/Sz98ew0DmVI/AAAAAAAAAF0/jKl23UuoUNs/s400/beautiful-data-cover.gif" alt="" id="BLOGGER_PHOTO_ID_5422189344318527826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Original Google Analytics script; this one seems to work --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br/&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- &lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;I finished reading &lt;a href="http://oreilly.com/catalog/9780596157128"&gt;"Beautiful Data"&lt;/a&gt; a couple of weeks ago.  It's an O'Reilly book edited by Toby Segaran (of &lt;a href="http://www.amazon.com/Programming-Collective-Intelligence-Building-Applications/dp/0596529325/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1262451965&amp;amp;sr=1-1"&gt;"Programming Collective Intelligence"&lt;/a&gt; fame) and Jeff Hammerbacher.&lt;br /&gt;&lt;br /&gt;I love the topic.  We're awash in data, thanks to the Internet, but there will be a greater premium placed on gleaning insight from it all in the future.  This book doesn't provide lessons on how to do that, but it does list some wonderful examples.  The fields are diverse: biology, social sciences, criminology, space exploration, and others.&lt;br /&gt;&lt;br /&gt;I thought the book was a little uneven, as compendiums of essays often are.  It's hard to establish and meet a high quality standard consistently when many authors are involved. &lt;br /&gt;&lt;br /&gt;Three essays stood out for me.&lt;br /&gt;&lt;br /&gt;Peter Norvig is a new technical hero of mine.  If a B.S. from Brown in applied math, a Ph.D. in computer science from Cal Berkeley, and Director of Research at Google isn't enough, maybe &lt;a href="http://norvig.com/21-days.html"&gt;"Teach Yourself Programming In Ten Years"&lt;/a&gt; and &lt;a href="http://norvig.com/spell-correct.html"&gt;"How To Write A Spelling Corrector"&lt;/a&gt; will put you over the top.  His essay entitled "Natural Language Corpus Data" discusses the &lt;a href="http://www.ldc.upenn.edu/Catalog/CatalogEntry.jsp?catalogId=LDC2006T13"&gt;trillion word data set&lt;/a&gt; published by Thorsten Brants and Alex Franz of Google and its applications.  This includes a predecessor of the spelling corrector I cited earlier. &lt;br /&gt;&lt;br /&gt;Biology is an up-and-coming field that I'm largely ignorant of.  The little I know is being spoon fed to me by my brilliant youngest daughter, but I'm a messy, inattentive eater who gets as much on the floor as I do into my gob.  "Life in Data: The Story of DNA" by Matt Wood and Ben Blackburne gives a nice overview with a data slant that I enjoyed.&lt;br /&gt;&lt;br /&gt;"Superficial Data Analysis: Exploring Millions of Social Stereotypes" by Brendan O'Connor and Lukas Biewald took data from &lt;a href="http://facestat.com/"&gt;FaceStat.com&lt;/a&gt;, which is down 'temporarily', and mined it for relationships between gender and attractiveness, gender bias in word usage, etc.  I thought it was a brilliant use of a public data source.&lt;br /&gt;&lt;br /&gt;I'd give an honorable mention to "Building Radiohead's House Of Cards" by Aaron Koblin with Valdean Klump.  I love the band.  I ran right over to YouTube to see the &lt;a href="http://www.youtube.com/watch?v=8nTFjVm9sTQ"&gt;video &lt;/a&gt;after reading the piece.  It's brilliant stuff.&lt;br /&gt;&lt;br /&gt;There are lots of &lt;a href="http://www.grouplens.org/taxonomy/term/14"&gt;large data sets&lt;/a&gt; that are publicly available.  The &lt;a href="http://blog.stackoverflow.com/2009/06/stack-overflow-creative-commons-data-dump/"&gt;Stackoverflow.com data&lt;/a&gt; is available under a Creative Commons license.  It would be a great source of information about the millions of programmers who frequent it.&lt;br /&gt;&lt;br /&gt;It doesn't require expensive tools, either.  The R statistics package is free to &lt;a href="http://www.r-project.org/"&gt;download&lt;/a&gt;.  The learning curve is steep, but there are resources available &lt;a href="http://cran.r-project.org/doc/contrib/Verzani-SimpleR.pdf"&gt;here&lt;/a&gt;, &lt;a href="http://www.johndcook.com/R_language_for_programmers.html"&gt;here&lt;/a&gt;, and &lt;a href="http://www.r-project.org/"&gt;there &lt;/a&gt;to be your sherpa on your way to the summit.&lt;br /&gt;&lt;br /&gt;My list of goals for 2010 is growing.  If a goal is a dream with deadline, I need to become much better at setting deadlines for myself.  Too many dreams remain unfulfilled.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-4754635736672620960?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/4754635736672620960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=4754635736672620960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/4754635736672620960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/4754635736672620960'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2010/01/beautiful-data.html' title='Beautiful Data'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_9ZfLzIk1dQU/Sz98ew0DmVI/AAAAAAAAAF0/jKl23UuoUNs/s72-c/beautiful-data-cover.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-8790236112546828014</id><published>2009-12-31T18:38:00.005-05:00</published><updated>2009-12-31T18:47:32.942-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mathjax'/><category scheme='http://www.blogger.com/atom/ns#' term='typesetting'/><category scheme='http://www.blogger.com/atom/ns#' term='TeX'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><category scheme='http://www.blogger.com/atom/ns#' term='LaTeX'/><category scheme='http://www.blogger.com/atom/ns#' term='jsMath'/><title type='text'>Still More LaTeX On The Web</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9ZfLzIk1dQU/Sz02OBiTYsI/AAAAAAAAAFs/9cMwOxIwV0s/s1600-h/mathjax-logo-MJsmall.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 267px; height: 80px;" src="http://3.bp.blogspot.com/_9ZfLzIk1dQU/Sz02OBiTYsI/AAAAAAAAAFs/9cMwOxIwV0s/s320/mathjax-logo-MJsmall.png" alt="" id="BLOGGER_PHOTO_ID_5421549140982325954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Original Google Analytics script; this one seems to work --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br/&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- &lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;A good friend has brought yet another library for embedding LaTeX into an HTML page to my attention.  It's a JavaScript library called &lt;a href="http://www.mathjax.org/"&gt;MathJax&lt;/a&gt;.  It looks like MathJax builds on &lt;a href="http://craicpropagation.blogspot.com/2009/11/jsmath-typesetting-math-in-browser.html"&gt;jsMath&lt;/a&gt;, a 2004 vintage JavaScript library.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.mathjax.org/?page_id=13"&gt;results &lt;/a&gt;look beautiful to me.  If you're a scientist, it's got to be great to have such wonderful tools so freely available.  The typesetting is taken care of for you; all you have to do now is imagine great applications.  And the proof is left for you!  QED, baby.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-8790236112546828014?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/8790236112546828014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=8790236112546828014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/8790236112546828014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/8790236112546828014'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2009/12/still-more-latex-on-web.html' title='Still More LaTeX On The Web'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9ZfLzIk1dQU/Sz02OBiTYsI/AAAAAAAAAFs/9cMwOxIwV0s/s72-c/mathjax-logo-MJsmall.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-7124299126806842977</id><published>2009-12-31T17:38:00.002-05:00</published><updated>2009-12-31T18:09:21.730-05:00</updated><title type='text'>New Year's Eve</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9ZfLzIk1dQU/Sz0n_NIQArI/AAAAAAAAAFk/ZV4HQVvC-yQ/s1600-h/new-years-eve-3062757865_6eedc2e74b_t.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 75px; height: 100px;" src="http://4.bp.blogspot.com/_9ZfLzIk1dQU/Sz0n_NIQArI/AAAAAAAAAFk/ZV4HQVvC-yQ/s320/new-years-eve-3062757865_6eedc2e74b_t.jpg" alt="" id="BLOGGER_PHOTO_ID_5421533493233451698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Original Google Analytics script; this one seems to work --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br/&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- &lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;2009 is almost in the book.  Like everyone else, I usually look back on the year and ponder what I've done, resolve to fix what I've done poorly, and maintain or improve on what went well.&lt;br /&gt;&lt;br /&gt;I'm a fortunate man, because I have some wonderful things that I've been lucky enough to be able to take for granted. &lt;br /&gt;&lt;br /&gt;My mother is still with us - living in her own home, taking care of all her business.  She still has all her wits about her and is as good looking as ever.  Same for my in-laws.  Seeing what people go through when they lose a parent, I'm grateful that the three that I still have left are all doing amazingly well.&lt;br /&gt;&lt;br /&gt;I've been married now for 28 years and counting.  In a time of 50% divorce, I'd say we're breaking the curve.&lt;br /&gt;&lt;br /&gt;I have one daughter through her undergraduate degree and another that's half paid for.  My goal is to have two smart girls educated without any of us having to take on a mountain of debt.&lt;br /&gt;&lt;br /&gt;I'm still working.  When 10% of America is reported as out of work, with the shadowy bits that have stopped looking unreported, I'm humbled to have a job that doesn't appear to be shaky.  I try my best to always make it worthwhile to my employer by pushing myself to continue to learn and stay sharp.  That won't change in 2010.&lt;br /&gt;&lt;br /&gt;My health was excellent last year.  The problem I had with a bulging disk has not resurfaced.  More on this topic to come.&lt;br /&gt;&lt;br /&gt;The two things that I usually focus on are technical education and exercise.  They're the two easiest things to quantify, especially that second one.&lt;br /&gt;&lt;br /&gt;I think I had a pretty good technical year.  I made a special effort to go against the grain of my architect title by trying to write code each and every day.  It's important to practice, or the skill goes away.  I didn't always succeed, but I think I've done a better job of it lately.  That will ramp up in 2010.  More languages (C#, Python), more math (Mathematica and LaTeX), and more coding will help.  I've got a good list of projects to work through.&lt;br /&gt;&lt;br /&gt;I signed up at Stack Overflow in Oct 2008, but I didn't answer my first question until Christmas Eve 2008.  Since then, I've amassed over 29K points, rising as high as #47 in their point ranking.  The negative side of that is that I spend far too much time on the site; the positive side is that I've learned a fair amount and (hopefully) helped a few people.&lt;br /&gt;&lt;br /&gt;This blog still has a long way to go, but I've managed 27 posts this year, more than twice as many as all of 2008.  I'm happy with this year's progress.  I hope I'll find my voice in 2010.&lt;br /&gt;&lt;br /&gt;I've got seven out of ten speeches under my belt towards a Competent Communicator rank in Toastmasters.  I hope to finish that off early in 2010 and reach for the next rung.  I'd love to try a competition and see how I do.&lt;br /&gt;&lt;br /&gt;I'm going to start tracking my reading in the coming year, just to get a baseline for how much material I'm taking in.&lt;br /&gt;&lt;br /&gt;I have something of an anal-retentive streak when it comes to exercise.  I've been tracking my swimming yardage and attendance using an Excel spreadsheet since 1994.  Last year was a blowout swimming year for me.  I exceeded 524K yards for the year, averaging 10K yards per week for the first time ever.  My previous best was 429K yards in 2006, the year before I hurt my neck.  I managed 407K yards this year.  I'm pleased to say that I've topped 400K yards three times, and all have come after I turned 50.  I know I can't get back the youth and speed that I had when I was 20 or 30, but I'm still swimming pretty well.  The younger me never had the courage (or the time) to attempt a Masters workout.  Now it's a big part of my social life.&lt;br /&gt;&lt;br /&gt;When I look at the difference between 2008 and 2009, it's obvious what happened.  I swim in the morning before work and with a Masters group.  My morning attendance and yardage was unchanged from 2008 to 2009, but my Masters yardage declined by 50%. &lt;br /&gt;&lt;br /&gt;I have an easy scheme for improving on my 2009 totals: swim more.  My standard was to swim a mile during my noon and morning workouts.  One day I decided that 2000 yards per day would be my new minimum.  I've maintained that for the last five years.  Next year I plan to up the ante and shoot for 2200-2500 yards in the morning.  If I can be more consistent with the Masters workouts I'll have a shot at matching my 2008 totals.&lt;br /&gt;&lt;br /&gt;I rediscovered the joy of riding my bicycle to work this summer.  I had my best year on a bike in about fifteen years.  It was great to spend time with my best friend doing something I love.  Next year I'll make the goal 1,000 miles for the summer.  I'll start earlier in April and work my way to two rides per week. &lt;br /&gt;&lt;br /&gt;I kept up with yoga all year.  I averaged 90 minutes of yoga every week for the whole year.  I've attended a weekly class faithfully and managed to do it fairly often on my own.  I think it's helped my flexibility and core strength.&lt;br /&gt;&lt;br /&gt;2009 was a pretty good year for me.  I hope I can maintain it in 2010.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-7124299126806842977?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/7124299126806842977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=7124299126806842977' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/7124299126806842977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/7124299126806842977'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2009/12/new-years-eve.html' title='New Year&apos;s Eve'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_9ZfLzIk1dQU/Sz0n_NIQArI/AAAAAAAAAFk/ZV4HQVvC-yQ/s72-c/new-years-eve-3062757865_6eedc2e74b_t.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-3592022109669690585</id><published>2009-11-29T10:54:00.002-05:00</published><updated>2009-11-29T11:01:48.878-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='typesetting'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><category scheme='http://www.blogger.com/atom/ns#' term='LaTeX'/><title type='text'>More LaTeX On The Web</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9ZfLzIk1dQU/SxKavzrd7mI/AAAAAAAAAFc/vLwun_b9RJk/s1600/equation-sheet-dot-com-logo.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 120px; height: 54px;" src="http://1.bp.blogspot.com/_9ZfLzIk1dQU/SxKavzrd7mI/AAAAAAAAAFc/vLwun_b9RJk/s320/equation-sheet-dot-com-logo.gif" alt="" id="BLOGGER_PHOTO_ID_5409556248542441058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;!-- Original Google Analytics script; this one seems to work --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br/&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- &lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sometimes I find myself in need of a GIF image of an equation or two.  I want to be able to generate them quickly and easily, but I find that my MikTeX setup on Windows isn't helping.&lt;br /&gt;&lt;br /&gt;Fortunately, Google found a utility that converts LaTeX to an image at &lt;a href="http://www.equationsheet.com/textoimage.php"&gt;EquationSheet.com&lt;/a&gt;.  All I have to do is type in a snippet of LaTeX, hit the "convert" button, and I can see the equation rendered as an image.  Even better, I can copy the URL and paste it into another HTML page as an image tag.  Just what the doctor ordered!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-3592022109669690585?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/3592022109669690585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=3592022109669690585' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3592022109669690585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3592022109669690585'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2009/11/more-latex-on-web.html' title='More LaTeX On The Web'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9ZfLzIk1dQU/SxKavzrd7mI/AAAAAAAAAFc/vLwun_b9RJk/s72-c/equation-sheet-dot-com-logo.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-250396080386522183</id><published>2009-11-21T12:11:00.005-05:00</published><updated>2009-11-21T14:12:04.001-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coders'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='review'/><category scheme='http://www.blogger.com/atom/ns#' term='reading'/><category scheme='http://www.blogger.com/atom/ns#' term='seibel'/><title type='text'>Coders At Work</title><content type='html'>&lt;!-- Original Google Analytics script; this one seems to work --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br/&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- &lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9ZfLzIk1dQU/SwgfTnbQgoI/AAAAAAAAAFE/DvRe5WH0TSg/s1600/coders-at-work-cover.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 167px; height: 246px;" src="http://1.bp.blogspot.com/_9ZfLzIk1dQU/SwgfTnbQgoI/AAAAAAAAAFE/DvRe5WH0TSg/s320/coders-at-work-cover.jpg" alt="" id="BLOGGER_PHOTO_ID_5406605774519566978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I finished reading Peter Seibel's &lt;a href="http://www.amazon.com/Coders-at-Work-Peter-Seibel/dp/1430219483/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1258830533&amp;amp;sr=1-1"&gt;Coders At Work: Reflections on the Craft of Programming&lt;/a&gt; yesterday.  I thought it was terrific and would recommend it highly to anyone who writes code for a living.  It's an impressive follow-up to his &lt;a href="http://www.amazon.com/Practical-Common-Lisp-Peter-Seibel/dp/1590592395/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1258826024&amp;amp;sr=1-1"&gt;Practical Common Lisp&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Peter drew his inspiration from the Paris Review Writers At Work.  Great creativity is required to recognize an idea that's good in one context and reuse it in another.&lt;br /&gt;&lt;br /&gt;The roster of interviewees is impressive, especially after having read the book.  I only knew a minority when I opened the book.  Only Knuth and Ken Thompson were long-familiar names.  I knew of JWZ by hearsay.  I have a copy of Peter Norvig's &lt;a href="http://www.amazon.com/Artificial-Intelligence-Modern-Approach-2nd/dp/0137903952/ref=sr_1_4?ie=UTF8&amp;amp;s=books&amp;amp;qid=1258828111&amp;amp;sr=1-4"&gt;"AI: A Modern Approach"&lt;/a&gt;, it's been over my head forever.&lt;br /&gt;&lt;br /&gt;Donald Knuth is the biggest name; Peter holds him back for the last chapter.  He seemed to me to be from another planet.  I've written about my love of LaTeX; this is the man who spent ten years of his life coming up with TeX.  I especially liked this bit on page 598:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;With TeX I was interacting with hundreds of years of human history and I didn't want to throw out all of the things that book designers have learned over the centuries and start anew and say, "Well, forget that guys; you now, we're going to be logical now."&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The more I learn about Peter Norvig, the more impressed I am.  The people who are exposed to his genius at Google are fortunate indeed.&lt;br /&gt;&lt;br /&gt;Guy Steele didn't disappoint.  He's brilliant, but he can't help working the fact that he went to MIT into the very first answer he gives.  My informal survey tells me that this is true of each and every MIT graduate I've ever known personally - except for one.  (My friend is one of the most brilliant, most accomplished people I know, but I didn't hear that his Ph.D. came from MIT until after I'd known him for a long time, until I heard it from a mutual friend.)  Thank you for another data point, Guy.&lt;br /&gt;&lt;br /&gt;Some of these folks are younger than I am, but most are my contemporaries.  All are far more accomplished as programmers and computer scientists than I am.  They were doing their best work in this field when I was a mechanical engineer.  I'm doing my best to try and catch up, but I still have a very long way to go.  I envy them their accomplishments.&lt;br /&gt;&lt;br /&gt;It seems to me that Peter Seibel struck a very nice balance between scripting his questions and letting the conversation lead him.  There was a thread of common questions that ran through all the interviews (e.g., "How do you debug?", "Do you read code?", "Do you consider yourself a scientist, engineer, craftsman, or artist?", "How much math is needed to be a good programmer?"), but each interviewee contributed special insights that would have been hard to anticipate.&lt;br /&gt;&lt;br /&gt;The book brought home two things to me: how much computing has changed since these people were in their heydays and how much wonderful stuff is being lost to time.  I haven't read "The Art of Computer Programming".  I feel like I should, but I'm not sure that it'll provide a payoff for all that effort in the corporate enterprise computing world in which I earn my living today.  Those with the talent and good fortune to be working for Google and firms that value deep knowledge are a minority.&lt;br /&gt;&lt;br /&gt;Every one of the individuals interviewed by Peter Seibel is a giant in the field.  Is that so because they did their best work early in the history of computer science?  If 2% of people are wired to be programmers, and there are 6.67 billion people on earth, that means there are about 133,400,000 potential writers of C#, Java, Cobol, Lisp, or what have you.  Will we find giants to compare to the early ones?&lt;br /&gt;&lt;br /&gt;I've read that Shakespeare and Babe Ruth stood out in their fields because there were comparatively fewer contemporaries who were their equals.  Now that we have everyone blogging on the Internet and full-time professional athletes it's harder to stand out.&lt;br /&gt;&lt;br /&gt;Programming is often compared to building buildings or manufacturing widgets or god knows what else.  Like these other productive activities, it's often outsourced by American firms to be done by individuals in parts of the world that will do it for far less than their domestic counterparts.  Will the next generation of great achievers come from their ranks?  Will Peter Seibel have to travel further afield to hear about their exploits?&lt;br /&gt;&lt;br /&gt;I enjoyed the book very much and recommend it highly.&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-250396080386522183?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/250396080386522183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=250396080386522183' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/250396080386522183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/250396080386522183'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2009/11/coders-at-work.html' title='Coders At Work'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9ZfLzIk1dQU/SwgfTnbQgoI/AAAAAAAAAFE/DvRe5WH0TSg/s72-c/coders-at-work-cover.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-3565594068717180525</id><published>2009-11-11T09:00:00.004-05:00</published><updated>2009-11-11T09:00:00.875-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='leaves'/><category scheme='http://www.blogger.com/atom/ns#' term='raking'/><category scheme='http://www.blogger.com/atom/ns#' term='autumn'/><title type='text'>Raking Leaves</title><content type='html'>&lt;!-- Original Google Analytics script; this one seems to work --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br/&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;&lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9ZfLzIk1dQU/Svd52vYK1KI/AAAAAAAAAE0/MbG8zrsWXJE/s1600-h/raking-leaves-1752963040_7eabadfb84_t.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 67px;" src="http://2.bp.blogspot.com/_9ZfLzIk1dQU/Svd52vYK1KI/AAAAAAAAAE0/MbG8zrsWXJE/s320/raking-leaves-1752963040_7eabadfb84_t.jpg" alt="" id="BLOGGER_PHOTO_ID_5401920259391935650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The weather on the East Coast was unseasonably beautiful this weekend.  It was sunny and warm both on Saturday and Sunday.  It afforded me an opportunity to get the leaves off my yard and into a pile in the woods.  My lot is 1.1 acres, with woods separating my house from the one behind me.  There's a mountain of leaves taller than me in those woods tonight.  It grew one tarp load at a time over the course of two days.&lt;br /&gt;&lt;br /&gt;I always think of my father when I rake leaves.  Some kids went to ball games with their dad; I raked leaves with mine.&lt;br /&gt;&lt;br /&gt;He was an Irish immigrant who came to this country with the equivalent of a high school education.   He got a job working for the water company in town.  He was a member of the crew that worked to maintain the system of pipes and valves buried under the roads.  They led from the treatment plants situated next to the reservoirs to the metered 1" diameter copper pipes that were the "last mile" into each and every house in town.  He knew every pipe, both size and material, every valve in the system, because he had either put them in place or repaired them at one time or another.  He had an unmatched encyclopedic knowledge of roads in town.  He could associate each one with one job or another: "We had an 8 inch main break on Sinoway Road last night."&lt;br /&gt;&lt;br /&gt;It was a good union job, but with six kids at home he didn't mind hustling for a few extra bucks.  So on Saturdays he would go out and do yard work for people.  He had regular customers that would have him cut the grass in the summer and rake the leaves in the fall.  It meant getting up early on Saturday mornings and spending the day going from house to house.  The last stop was always my grandmother's.&lt;br /&gt;&lt;br /&gt;I was his eldest son.  By my best recollection I was nine or ten years old the first time I went with him on a Saturday morning.  I was less than useless.  I didn't have the strength or stamina to help much in the beginning, but young legs can serve a purpose when you don't want to walk back to get a tool.  He was easing me into the idea of helping.&lt;br /&gt;&lt;br /&gt;As I became capable of contributing more, I remember going more frequently.  I can't recall anymore how regular I was about the task.  I'm sure that my faithfulness fell short.  But I do remember going on more than a haphazard basis.  I knew the names of all the customers, and they knew me.  I can still point out the houses that haven't fallen victim to time and been knocked down to make way for McMansions.&lt;br /&gt;&lt;br /&gt;These were quiet trips.  We'd both get up early on Saturday mornings, load the appropriate tools into the car, and go on our appointed rounds.  We didn't get coffee or chat a lot.  He would thank me for helping, but whatever checks exchanged hands went into his pocket.  I never questioned the arrangement.  It was understood that it was my duty to help.&lt;br /&gt;&lt;br /&gt;My father was very methodical and meticulous about raking leaves.  He always had a large tarp that we'd spread out on a part of the lawn that was covered with leaves.  "Don't rake onto a piece that you've already cleaned," he'd tell me.  He would start in one corner and work in one direction, sweeping the area until there wasn't a leaf to be seen.  He bought a gas-powered blower, the first one that I'd ever seen, that would speed the work and spare our hands the raking until we had a pile worthy of pushing into the tarp to be carried away.&lt;br /&gt;&lt;br /&gt;After I went to college I didn't join him on Saturdays anymore.  It's been too long - I can't pinpoint when he gave it up.  Perhaps it was after my grandmother passed away.  I never asked if the task fell to either of my younger brothers when I dropped the torch.  I don't remember any of them joining us on Perryridge Road.&lt;br /&gt;&lt;br /&gt;As I look back on it now, I like to think that I was chosen to go because I had the temperament for it.  Maybe he liked doing it with me as much as I was proud to be chosen by him.  It was something that I did with my father that no one else did.&lt;br /&gt;&lt;br /&gt;Some kids went to ball games with their dad; I raked leaves with mine.&lt;br /&gt;&lt;br /&gt;I still carry that experience with me to this day.  I rake leaves the way he taught me.  He would have been happy with my handiwork this weekend.  At the end of a day of work - the sky red from the setting sun; the chilled air reminding me that it's the waning of another year; the dead silence at the end of a late autumn day - I think of my father.&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-3565594068717180525?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/3565594068717180525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=3565594068717180525' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3565594068717180525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3565594068717180525'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2009/11/raking-leaves.html' title='Raking Leaves'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9ZfLzIk1dQU/Svd52vYK1KI/AAAAAAAAAE0/MbG8zrsWXJE/s72-c/raking-leaves-1752963040_7eabadfb84_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-5276552233759026212</id><published>2009-11-09T21:19:00.004-05:00</published><updated>2009-11-09T21:55:32.245-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gail collins'/><category scheme='http://www.blogger.com/atom/ns#' term='little brown'/><category scheme='http://www.blogger.com/atom/ns#' term='when everything changed'/><title type='text'>When Everything Changed</title><content type='html'>&lt;!-- Original Google Analytics script; this one seems to work --&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br/&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9ZfLzIk1dQU/SvjN1_UcfQI/AAAAAAAAAE8/COXSvphftA4/s1600-h/when-everything-changed.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 240px; height: 240px;" src="http://2.bp.blogspot.com/_9ZfLzIk1dQU/SvjN1_UcfQI/AAAAAAAAAE8/COXSvphftA4/s320/when-everything-changed.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5402294080444857602" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've finished reading Gail Collins' &lt;a href="http://www.amazon.com/When-Everything-Changed-Amazing-American/dp/0316059544/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1257819542&amp;sr=8-1"&gt;"When Everything Changed: The Amazing Journey of American Women From 1960 To The Present."&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Amazing, indeed.&lt;br /&gt;&lt;br /&gt;I've lived through the period described by the book, although I was awfully young for the earliest years.  I remembered as I read, but having the changes spelled out so clearly was astonishing.  Seeing how much has changed in such a short period of time, I had a feeling of disbelief as I read: "Did we really live like that?  Is that what people thought back then?"&lt;br /&gt;&lt;br /&gt;I can't fully identify because of my gender, but I can appreciate the difference as the father of two daughters.  My sisters had to fight the good fight to go to college; my daughters grew up with the &lt;span style="font-style:italic;"&gt;expectation &lt;/span&gt;that they'd go.  Such a difference in the span of one or two generations.&lt;br /&gt;&lt;br /&gt;Gail's writing style mirrors her columns on the editorial pages of the New York Times: part historian, part educator, part wry observer, all glued together by a dry wit.  I happen to love it.  I laughed out loud in places.&lt;br /&gt;&lt;br /&gt;Of course I'll have my daughters read the book.  It'll be a good lesson for them to see how their choices have expanded.  I recommend it highly.&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-5276552233759026212?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/5276552233759026212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=5276552233759026212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/5276552233759026212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/5276552233759026212'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2009/11/when-everything-changed.html' title='When Everything Changed'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9ZfLzIk1dQU/SvjN1_UcfQI/AAAAAAAAAE8/COXSvphftA4/s72-c/when-everything-changed.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-2216102743755917923</id><published>2009-11-08T20:56:00.003-05:00</published><updated>2009-11-08T21:07:15.005-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jsMath TeX LaTeX math typesetting'/><title type='text'>jsMath: Typesetting Math In A Browser</title><content type='html'>&lt;!-- Original Google Analytics script; this one seems to work --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br/&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- &lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Put content here, Michael --&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9ZfLzIk1dQU/Svd24vl-JjI/AAAAAAAAAEs/MwefxpxEKQM/s1600-h/jsMath40.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 40px; height: 40px;" src="http://2.bp.blogspot.com/_9ZfLzIk1dQU/Svd24vl-JjI/AAAAAAAAAEs/MwefxpxEKQM/s320/jsMath40.jpg" alt="" id="BLOGGER_PHOTO_ID_5401916995274679858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I just became aware of &lt;a href="http://www.math.union.edu/%7Edpvc/jsMath/"&gt;jsMath&lt;/a&gt;, a JavaScript library from the Math Union for typesetting mathematics in a browser. &lt;br /&gt;&lt;br /&gt;The content from the web site says it far better than I will, but it looks like jsMath was inspired by the slow adoption of MathML support in browsers running under Windows, Mac, and *nix machines. &lt;br /&gt;&lt;br /&gt;The examples that the web site offers look beautiful.  It's based on TeX, so it's no surprise that the results look so good.  I didn't get a chance to dive into it this weekend.  Unseasonably nice weather on the East Coast made it possible for me to clean up all the leaves that were covering my yard, so time to program was hard to come by.  But I'll be looking into this gem soon.  It's a nice complement to my &lt;a href="http://craicpropagation.blogspot.com/2009/11/i-love-latex.html"&gt;recent rediscovery of LaTeX&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It amazes me to see how smart people can come up with things like this.  It's also another example of the increasing reach of JavaScript.  Brendan Eich's language is becoming more important every day.&lt;br /&gt;&lt;br /&gt;&lt;!-- Stackoverflow.com flair --&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-2216102743755917923?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/2216102743755917923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=2216102743755917923' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/2216102743755917923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/2216102743755917923'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2009/11/jsmath-typesetting-math-in-browser.html' title='jsMath: Typesetting Math In A Browser'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9ZfLzIk1dQU/Svd24vl-JjI/AAAAAAAAAEs/MwefxpxEKQM/s72-c/jsMath40.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-4586634795419544154</id><published>2009-11-01T07:22:00.007-05:00</published><updated>2009-11-01T21:10:48.028-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LaTeX mathematics typesetting learning'/><title type='text'>I Love LaTeX</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br/&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;&lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9ZfLzIk1dQU/Su2PRJuS0XI/AAAAAAAAAEk/wfE7QWyG4_o/s1600-h/latex-logo.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 104px; height: 45px;" src="http://2.bp.blogspot.com/_9ZfLzIk1dQU/Su2PRJuS0XI/AAAAAAAAAEk/wfE7QWyG4_o/s320/latex-logo.jpg" alt="" id="BLOGGER_PHOTO_ID_5399129053117731186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If I've never said it before, I &lt;span style="font-style: italic;"&gt;love &lt;/span&gt;LaTeX.  &lt;span style="font-style: italic;"&gt;No&lt;/span&gt;, not "latex"!  If you thought I meant rubber clothing, you've been spending too much time searching adult sites on the web. &lt;br /&gt;&lt;br /&gt;TeX is a typesetting program developed by &lt;a href="http://www-cs-faculty.stanford.edu/%7Eknuth/"&gt;Donald Knuth&lt;/a&gt;, the genius who gave us &lt;a href="http://www.amazon.com/Art-Computer-Programming-Volumes-Boxed/dp/0201485419/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1257082841&amp;amp;sr=8-1"&gt;"The Art Of Computer Programming."&lt;/a&gt;  All the work behind those tomes would have been a life's work for anyone, but Professor Knuth also found time to plumb the depths of typesetting to come up with TeX as well.  LaTeX is a set of macros built on top of TeX to make writing easier.&lt;br /&gt;&lt;br /&gt;The most brilliant thing about LaTeX, in my opinion, is the mathematics typesetting.  It's gorgeous.  I've never liked WYSIWYG equation editors, like Microsoft Word.  The "write-generate" cycle never bothered me.  &lt;a href="http://www.johndcook.com/blog/2009/07/15/microsoft-word-equation-editor/"&gt;John D. Cook&lt;/a&gt; revisited the Microsoft Word equation editor a few months back and concluded that it's shown great improvement, sufficient to warrant an apology to Microsoft.  John is a bigger man than me (and a far better mathematician).  I won't let new information change a perfectly serviceable prejudice, and I won't be apologizing to Microsoft.&lt;br /&gt;&lt;br /&gt;I still prefer LaTeX.&lt;br /&gt;&lt;br /&gt;I was first introduced to LaTeX back in 1991.  I was in the home stretch on my dissertation, and I was looking around for the best way to typeset a lot of equations.  I was fortunate to be surrounded by a group of smart people.  One day I was talking to Peter Denno, one of the computer scientists who was working on artificial intelligence and shop floor optimization.  He recommended that I try LaTeX and let me borrow his copy of Leslie Lamport's user's guide and reference manual.  It was the perfect choice.  I typeset the entire document myself on a Unix workstation, including signature pages, figures, and derivations.  I'm still proud of how good the end product looks.&lt;br /&gt;&lt;br /&gt;I haven't had an occasion to use LaTeX since.  A number of factors played into it: I stopped practicing as a mechanical engineer; I don't do much math as part of my software engineering career; I work exclusively on Windows machines.&lt;br /&gt;&lt;br /&gt;But recently events have conspired to bring it back.&lt;br /&gt;&lt;br /&gt;I still do little math beyond simple calculations for business rules in my current software work.  But my youngest daughter called the other night to ask a question about getting the "best line fit" for some (x,y) data pairs she had in Excel.  I wrote out some detailed steps on paper after a brief phone explanation.  Then I thought of my old friend LaTex: How hard would it be to typeset some instructions for her?  LaTeX made it easy.  I had a good looking document after one evening's work:&lt;br /&gt;&lt;br /&gt;&lt;a title="View Least Squares Fit on Scribd" href="http://www.scribd.com/doc/21983425/Least-Squares-Fit" style="margin: 12px auto 6px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;"&gt;Least Squares Fit&lt;/a&gt; &lt;object codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" id="doc_258278566622906" name="doc_258278566622906" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" align="middle" height="500" width="100%"&gt;  &lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf?document_id=21983425&amp;amp;access_key=key-1uhizsynrotq677okt5p&amp;amp;page=1&amp;amp;version=1&amp;amp;viewMode=list"&gt;   &lt;param name="quality" value="high"&gt;   &lt;param name="play" value="true"&gt;  &lt;param name="loop" value="true"&gt;   &lt;param name="scale" value="showall"&gt;  &lt;param name="wmode" value="opaque"&gt;   &lt;param name="devicefont" value="false"&gt;  &lt;param name="bgcolor" value="#ffffff"&gt;   &lt;param name="menu" value="true"&gt;  &lt;param name="allowFullScreen" value="true"&gt;   &lt;param name="allowScriptAccess" value="always"&gt;   &lt;param name="salign" value=""&gt;            &lt;param name="mode" value="list"&gt;       &lt;embed src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=21983425&amp;amp;access_key=key-1uhizsynrotq677okt5p&amp;amp;page=1&amp;amp;version=1&amp;amp;viewMode=list" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" play="true" loop="true" scale="showall" wmode="opaque" devicefont="false" bgcolor="#ffffff" name="doc_258278566622906_object" menu="true" allowfullscreen="true" allowscriptaccess="always" salign="" type="application/x-shockwave-flash" mode="list" align="middle" height="500" width="100%"&gt;&lt;/embed&gt; &lt;/object&gt; &lt;br /&gt;&lt;br /&gt;It was such a pleasure to remember.&lt;br /&gt;&lt;br /&gt;As you would expect, LaTeX is easily available on Windows machines.  &lt;a href="http://miktex.org/"&gt;MiKTeX &lt;/a&gt;works beautifully on my home desktop.&lt;br /&gt;&lt;br /&gt;So it appears that all I need is the motivation to continue.  Where will it come from?&lt;br /&gt;&lt;br /&gt;After I finished my dissertation, I saved the electronic version on electronic media of some kind.  Alas, I lost that electronic representation somewhere after all the job moves and computer upgrades I've experienced since 1992.  I still have the printed, hard-bound version.  I've thought about going back and reproducing the document in MiKTeX.  It'd be a fun, if labor-intensive, exercise.&lt;br /&gt;&lt;br /&gt;I've dreamed of taking the actuarial exams in the past.  All my software development is for insurance companies.  Why not forge the two careers I've had into a third?&lt;br /&gt;&lt;br /&gt;I'm great for talk, but not so good on follow-through.  I went out and bought the study guides for the first two exams and quickly found out that my mechanical engineering background was heavy on the calculus but light on the probability and statistics.  I'd have to spend a great deal of time preparing for that first exam.  Getting that intuition for how it all works takes time.&lt;br /&gt;&lt;br /&gt;But something's changed recently.  Lately I've found it easier to spend time on learning things for my software life.  The pace of learning appears to be accelerating for me.  I'm reading more, idling less.  I've writing more code on my time.  Perhaps a more disciplined approach to shoring up my math would yield better results.  Certainly notes and problems sets typeset beautifully in LaTeX would be a great inspiration.  It could take a year, but I'll be a year older at this time next year regardless of what I do.  Why not take that time and add to my skills?&lt;br /&gt;&lt;br /&gt;If nothing else, a public proclamation like this can be a motivator.  Stay tuned.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-4586634795419544154?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/4586634795419544154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=4586634795419544154' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/4586634795419544154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/4586634795419544154'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2009/11/i-love-latex.html' title='I Love LaTeX'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9ZfLzIk1dQU/Su2PRJuS0XI/AAAAAAAAAEk/wfE7QWyG4_o/s72-c/latex-logo.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-3243588652620037312</id><published>2009-10-29T19:35:00.007-04:00</published><updated>2009-11-02T21:03:30.849-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='digital photography writers block daily post'/><title type='text'>A New Old Idea</title><content type='html'>&lt;!-- Original Google Analytics script; this one seems to work --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br/&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;&lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9ZfLzIk1dQU/SuonpuYDtHI/AAAAAAAAAEc/VwTLpQLwIPs/s1600-h/DSCF0006.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_9ZfLzIk1dQU/SuonpuYDtHI/AAAAAAAAAEc/VwTLpQLwIPs/s320/DSCF0006.jpg" alt="" id="BLOGGER_PHOTO_ID_5398170701134017650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This blog entry is different from all the others I've posted to date.  Whenever I've uploaded a photo, I've gotten it by searching &lt;a href="http://www.flickr.com/"&gt;Flickr.com&lt;/a&gt; Creative Commons for something that fit the theme of the post.&lt;br /&gt;&lt;br /&gt;I took the picture that accompanies today's entry.  I wanted to try something new.&lt;br /&gt;&lt;br /&gt;Writer's block is a problem for me.  I've had trouble for a while with finding my voice here.  I love to write, but I've had a hard time making up my mind what I should focus on.  A purely technical blog, like Jeff Atwood's &lt;a href="http://www.codinghorror.com/blog/"&gt;Coding Horror&lt;/a&gt;, would be worthwhile, but I have a hard time filtering out more personal and non-technical thoughts.  I feel a little exposed putting &lt;span style="font-style: italic;"&gt;too&lt;/span&gt; much personal information out on the Internet.  The frequency of posts shows my problem: when I have long gaps, I'm having trouble coming up with a topic.&lt;br /&gt;&lt;br /&gt;The funny thing is that inspiration is all around us.  I see all kinds of small details that are interesting to me.  But they're often forgotten in the bustle of getting through busy weeks.&lt;br /&gt;&lt;br /&gt;I used to keep an electronic journal.  I have entries dating back to 1994 that comprise a special personal history.  Sadly, it's fallen into decay.  I don't have the same inspiration for it.&lt;br /&gt;&lt;br /&gt;At one time I thought that learning to draw from Betty Edward's wonderful &lt;a href="http://www.amazon.com/New-Drawing-Right-Side-Brain/dp/0874774195/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1256860459&amp;amp;sr=8-1"&gt;"Drawing On The Right Side Of The Brain"&lt;/a&gt; would be my inspiration.  I did the exercises faithfully.  I would draw random things while sitting in meetings, just to hone my skills, my eye, and the shift to right-brain mode.  I loved it - until I hit the chapter on portrait drawing.  My left brain was too critical.  I couldn't find a way to quiet it.  I would still love to find a way over the barrier, but to date I've been unsuccessful. &lt;br /&gt;&lt;br /&gt;I have learned how to adopt ideas from people who are smarter than me.  I have no problem emulating and following when I see someone doing something that I admire. &lt;br /&gt;&lt;br /&gt;I went to Boston this past weekend to see the just-completed renovation job on my beloved second sister's house (it's spectacular).  My beloved oldest sister was taking photos using a Fuji digital camera that had a big view finder, took great photos, and fit into a shirt pocket.  I've never been a photographer.  I've tried to concentrate on experiencing the moment rather than preserving it.  But watching her snap away unobtrusively made me think "I could do that, too."&lt;br /&gt;&lt;br /&gt;So I went out the other night and picked up a Fuji Finepix J38 - same model as hers; same color, black.  Did I say "no problem emulating"?  That meant "slavishly copying."  I grabbed a case sturdy enough to protect the view finder and still slide into a pocket without looking too bulky.  ("Is that a Fuju Finepix J38 in your pocket or are you just glad to see me?")&lt;br /&gt;&lt;br /&gt;My idea is that I'll try to have the camera on hand as much as possible.  If I see something interesting, I'll snap it, upload it later, and perhaps write about it here.  I'm not going to worry so much about what comes out; I'm going to just keep practicing and writing.&lt;br /&gt;&lt;br /&gt;I failed at drawing; now this jewel of technology will be my cache for ideas.  It's got to piss off every truly skilled photographer who has spent a lifetime mastering film, technology, light, developing techniques, and the all-important artist's eye.  Digital cameras have become so cheap and so good that any fool can trick themselves into thinking that they're Ansel Adams. &lt;br /&gt;&lt;br /&gt;I tried it this morning when I went to work.  The light and the view when I came out of the pool before work was enticing, so I unselfconsciously took out my camera, stood on the sidewalk, and snapped away.  I took a few on the way out as well.  I liked this picture the best of all.&lt;br /&gt;&lt;br /&gt;I'm going to emulate my beloved, beautiful, brilliant eldest daughter, too.  She's been writing a &lt;a href="http://illicitexhibitions.blogspot.com/"&gt;blog on street art&lt;/a&gt; for almost a year.  The amazing thing about it, besides the content, is that she posts an entry &lt;span style="font-style:italic;"&gt;every single weekday&lt;/span&gt;, without fail.  &lt;br /&gt;&lt;br /&gt;How does she do it?  By treating it like a job.  She lines up her sources, writes the pieces, and queues them up for daily release.  Her dedication, discipline, and work ethic are as impressive as the material she elicits from all over the world.&lt;br /&gt;&lt;br /&gt;I'd like to try that, too.  I need to be more focused on what I'm pumping out there.  I shouldn't have only one or two posts per month.  I can do better.&lt;br /&gt;&lt;br /&gt;What does all this mean?  Probably nothing.  I'm just another guy on the Internet, taking pictures and blabbing about himself, putting it out because Blogger makes it easy, thinking that it's terribly interesting and world-changing.  How self-indulgent and boring!  Right?&lt;br /&gt;&lt;br /&gt;I'll concede that point.&lt;br /&gt;&lt;br /&gt;I like the mental stimulation of trying to do something that I've never done.  I want to keep thinking and challenging myself.  I prefer this to coming home and settling in front of a television every night.  I don't bloody well care if anybody notices.  I'm doing this solely for myself, for its own sake.  &lt;br /&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-3243588652620037312?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/3243588652620037312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=3243588652620037312' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3243588652620037312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3243588652620037312'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2009/10/new-old-idea.html' title='A New Old Idea'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9ZfLzIk1dQU/SuonpuYDtHI/AAAAAAAAAEc/VwTLpQLwIPs/s72-c/DSCF0006.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-7006027334152514488</id><published>2009-10-24T22:33:00.013-04:00</published><updated>2009-11-02T21:03:56.801-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='practice code kata binary tree iterators preord'/><title type='text'>Binary Tree Iterators</title><content type='html'>&lt;!-- Original Google Analytics script; this one seems to work --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br/&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;&lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9ZfLzIk1dQU/SuPD_WlMJOI/AAAAAAAAAEM/5YfRBc2-_U8/s1600-h/more-practice-3425022158_6ffeb11daa_t.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 140px;" src="http://3.bp.blogspot.com/_9ZfLzIk1dQU/SuPD_WlMJOI/AAAAAAAAAEM/5YfRBc2-_U8/s320/more-practice-3425022158_6ffeb11daa_t.jpg" alt="" id="BLOGGER_PHOTO_ID_5396372271680726242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In my &lt;a href="http://craicpropagation.blogspot.com/2009/10/practice-practice-practice.html"&gt;last post&lt;/a&gt;, I presented code (and unit tests) for a binary tree implementation in Java.  I alluded to the fact that there was a depth-first iterator in one of the test classes.  This time I'll discuss iterators and present more practice code.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.oodesign.com/iterator-pattern.html"&gt;Iterator &lt;/a&gt;is one of the behavioral patterns described by the Gang of Four in their classic &lt;a href="http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1256438933&amp;amp;sr=8-1"&gt;"Design Patterns&lt;/a&gt;".  It provides the means for walking through a data structure without having to expose the details of how it's done.&lt;br /&gt;&lt;br /&gt;Timothy Budd provides an excellent explanation of binary trees and iterators in chapter 10 of his &lt;a href="http://www.amazon.com/Classic-Data-Structures-Timothy-Budd/dp/0201508893/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1256439516&amp;amp;sr=1-1"&gt;"Classic Data Structures In C++"&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Binary trees are interesting data structures.  If the n nodes in a binary tree are independent, then there are n! = n*(n-1)*...*2*1 different orderings by which one could visit every node.&lt;br /&gt;&lt;br /&gt;But the fact that the tree is arranged so that each parent has, at most, a left and right child limits the number of choices for walking the tree to six:&lt;br /&gt;&lt;br /&gt;&lt;ol start="1"&gt;&lt;br /&gt;&lt;li&gt;Process value, then left child, then right child&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Process left child, then value, then right child&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Process left child, then right child, then value&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Process value, then right child, then left child&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Process right child, then value, then left child&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Process right child, then left child, then value&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Subtrees are usually traversed from left to right, so the first three possibilities are the most common.  Each is given a name that may be more familiar and memorable.  The first is called &lt;i&gt;preorder&lt;/i&gt; or depth-first traversal; the second &lt;i&gt;in-order&lt;/i&gt; or symmetric traversal; and the third &lt;i&gt;post-order&lt;/i&gt; traversal.  There is also &lt;i&gt;level order&lt;/i&gt; or breadth-first traversal, where all the nodes at one level are visited before proceeding to the next.&lt;br /&gt;&lt;br /&gt;Java has an &lt;a href="http://www.docjar.com/docs/api/java/util/Iterator.html"&gt;Iterator&lt;/a&gt; interface in its java.util package that defines the methods that all classes that implement it must provide.  The &lt;code&gt;next()&lt;/code&gt; returns a generic value.  For my binary tree iterator I knew there'd be times when I wanted to get the next Node instead of the value, so I extended the Iterator interface and added a next method that returned a Node&amp;lt;T&amp;gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package tree;&lt;br /&gt;&lt;br /&gt;import java.util.Iterator;&lt;br /&gt;&lt;br /&gt;public interface BinaryTreeIterator&amp;lt;T extends Comparable&amp;lt;T&amp;gt;&amp;gt; extends Iterator&amp;lt;T&amp;gt;&lt;br /&gt;{&lt;br /&gt;  Node&amp;lt;T&amp;gt; nextNode();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then I created an abstract class that provided default behavior for all methods except the ones that provided the next Node value and whether or not the walk through the tree was complete:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package tree;&lt;br /&gt;&lt;br /&gt;import org.apache.commons.logging.Log;&lt;br /&gt;import org.apache.commons.logging.LogFactory;&lt;br /&gt;&lt;br /&gt;import java.util.Iterator;&lt;br /&gt;&lt;br /&gt;public abstract class AbstractBinaryTreeIterator&amp;lt;T extends Comparable&amp;lt;T&amp;gt;&amp;gt; implements BinaryTreeIterator&amp;lt;T&amp;gt;&lt;br /&gt;{&lt;br /&gt;  public static final Log LOGGER = LogFactory.getLog(AbstractBinaryTreeIterator.class);&lt;br /&gt;&lt;br /&gt;  public void remove()&lt;br /&gt;  {&lt;br /&gt;     throw new UnsupportedOperationException("cannot remove from a binary tree");&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public T next()&lt;br /&gt;  {&lt;br /&gt;     Node&amp;lt;T&amp;gt; nextNode = nextNode();&lt;br /&gt;&lt;br /&gt;     return nextNode.getValue();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The post-order traversal examines the left child first, then the right child, then the value in a recursive manner.  It uses a last in, first out (LIFO) stack to hold the nodes in the opposite order they are to be visited.  The iteration starts by pushing the root node onto the stack and recursing down the tree:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package tree;&lt;br /&gt;&lt;br /&gt;import java.util.NoSuchElementException;&lt;br /&gt;import java.util.Stack;&lt;br /&gt;&lt;br /&gt;public class PostOrderIterator&amp;lt;T extends Comparable&amp;lt;T&amp;gt;&amp;gt; extends AbstractBinaryTreeIterator&amp;lt;T&amp;gt;&lt;br /&gt;{&lt;br /&gt;protected Stack&amp;lt;Node&amp;lt;T&amp;gt;&amp;gt; stack = new Stack&amp;lt;Node&amp;lt;T&amp;gt;&amp;gt;();&lt;br /&gt;&lt;br /&gt;public PostOrderIterator(BinaryTree&amp;lt;T&amp;gt; tree)&lt;br /&gt;{&lt;br /&gt; init(tree.getRoot());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void init(Node&amp;lt;T&amp;gt; root)&lt;br /&gt;{&lt;br /&gt; if (root != null)&lt;br /&gt; {&lt;br /&gt;    stack.clear();&lt;br /&gt;    stackChildren(root);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void stackChildren(Node&amp;lt;T&amp;gt; node)&lt;br /&gt;{&lt;br /&gt; stack.push(node);&lt;br /&gt; Node&amp;lt;T&amp;gt; next = node.getRight();&lt;br /&gt; if (next != null)&lt;br /&gt; {&lt;br /&gt;    stackChildren(next);&lt;br /&gt; }&lt;br /&gt; next = node.getLeft();&lt;br /&gt; if (next != null)&lt;br /&gt; {&lt;br /&gt;    stackChildren(next);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Node&amp;lt;T&amp;gt; nextNode()&lt;br /&gt;{&lt;br /&gt; if (!hasNext())&lt;br /&gt; {&lt;br /&gt;    throw new NoSuchElementException();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; Node&amp;lt;T&amp;gt; x = null;&lt;br /&gt;&lt;br /&gt; if (!stack.empty())&lt;br /&gt; {&lt;br /&gt;    if (LOGGER.isDebugEnabled())&lt;br /&gt;    {&lt;br /&gt;       LOGGER.debug(stack);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    x = stack.pop();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return x;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public boolean hasNext()&lt;br /&gt;{&lt;br /&gt; return !stack.isEmpty();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Of course there are unit tests:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package tree;&lt;br /&gt;&lt;br /&gt;import org.springframework.test.context.ContextConfiguration;&lt;br /&gt;import static org.testng.Assert.assertFalse;&lt;br /&gt;import static org.testng.AssertJUnit.assertEquals;&lt;br /&gt;import org.testng.annotations.DataProvider;&lt;br /&gt;import org.testng.annotations.Test;&lt;br /&gt;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import java.util.Iterator;&lt;br /&gt;import java.util.Map;&lt;br /&gt;import java.util.NoSuchElementException;&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;@ContextConfiguration(locations = "classpath:app-context.xml, classpath:app-context-test.xml")&lt;br /&gt;public class BinaryTreeIteratorTest&lt;br /&gt;{&lt;br /&gt;public void testHasNextEmptyTree()&lt;br /&gt;{&lt;br /&gt;  BinaryTree&amp;lt;String&amp;gt; empty = new BinaryTree&amp;lt;String&amp;gt;();&lt;br /&gt;  AbstractBinaryTreeIterator&amp;lt;String&amp;gt; iterator = new DepthFirstIterator&amp;lt;String&amp;gt;(empty);&lt;br /&gt;&lt;br /&gt;  assertFalse(iterator.hasNext());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Test(expectedExceptions = UnsupportedOperationException.class)&lt;br /&gt;public void testRemove()&lt;br /&gt;{&lt;br /&gt;  BinaryTree&amp;lt;String&amp;gt; empty = new BinaryTree&amp;lt;String&amp;gt;();&lt;br /&gt;  AbstractBinaryTreeIterator&amp;lt;String&amp;gt; iterator = new DepthFirstIterator&amp;lt;String&amp;gt;(empty);&lt;br /&gt;  iterator.remove();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void testNextDepthFirst()&lt;br /&gt;{&lt;br /&gt;  Integer[] data = {5, 3, 9, 1, 4, 6,};&lt;br /&gt;  BinaryTree&amp;lt;Integer&amp;gt; tree = new BinaryTree&amp;lt;Integer&amp;gt;();&lt;br /&gt;  tree.insert(data);&lt;br /&gt;&lt;br /&gt;  String expected = "5,3,1,4,9,6,";&lt;br /&gt;  AbstractBinaryTreeIterator&amp;lt;Integer&amp;gt; iterator = new DepthFirstIterator&amp;lt;Integer&amp;gt;(tree);&lt;br /&gt;  String actual = createCommaSeparatedString(iterator);&lt;br /&gt;&lt;br /&gt;  assertEquals(actual.toString(), expected);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void testNextPostOrder()&lt;br /&gt;{&lt;br /&gt;  Integer[] data = {5, 3, 9, 1, 4, 6,};&lt;br /&gt;  BinaryTree&amp;lt;Integer&amp;gt; tree = new BinaryTree&amp;lt;Integer&amp;gt;();&lt;br /&gt;  tree.insert(data);&lt;br /&gt;&lt;br /&gt;  String expected = "1,4,3,6,9,5,";&lt;br /&gt;  AbstractBinaryTreeIterator&amp;lt;Integer&amp;gt; iterator = new PostOrderIterator&amp;lt;Integer&amp;gt;(tree);&lt;br /&gt;  String actual = createCommaSeparatedString(iterator);&lt;br /&gt;&lt;br /&gt;  assertEquals(actual.toString(), expected);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private static String createCommaSeparatedString(Iterator iterator)&lt;br /&gt;{&lt;br /&gt;  StringBuffer actual = new StringBuffer(1024);&lt;br /&gt;  while (iterator.hasNext())&lt;br /&gt;  {&lt;br /&gt;     actual.append(iterator.next()).append(',');&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return actual.toString();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@DataProvider(name = "emptyTreeIterators")&lt;br /&gt;public Object[][] createEmptyTreeIterators()&lt;br /&gt;{&lt;br /&gt;  BinaryTree&amp;lt;String&amp;gt; tree = new BinaryTree&amp;lt;String&amp;gt;();&lt;br /&gt;&lt;br /&gt;  return new Object[][]{&lt;br /&gt;     {new BreadthFirstIterator&amp;lt;String&amp;gt;(tree)},&lt;br /&gt;     {new DepthFirstIterator&amp;lt;String&amp;gt;(tree)},&lt;br /&gt;     {new InOrderIterator&amp;lt;String&amp;gt;(tree)},&lt;br /&gt;     {new PostOrderIterator&amp;lt;String&amp;gt;(tree)},&lt;br /&gt;  };&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@Test(expectedExceptions = NoSuchElementException.class, dataProvider = "emptyTreeIterators")&lt;br /&gt;public void testNextEmptyTree(AbstractBinaryTreeIterator&amp;lt;String&amp;gt; iterator)&lt;br /&gt;{&lt;br /&gt;  iterator.next();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void testNext()&lt;br /&gt;{&lt;br /&gt;  String[] data = {"F", "B", "A", "D", "C", "E", "G", "I", "H",};&lt;br /&gt;  BinaryTree&amp;lt;String&amp;gt; tree = new BinaryTree&amp;lt;String&amp;gt;();&lt;br /&gt;  tree.insert(data);&lt;br /&gt;&lt;br /&gt;  Map&amp;lt;String, String&amp;gt; expected = new HashMap&amp;lt;String, String&amp;gt;();&lt;br /&gt;  expected.put("depth-first", "F,B,A,D,C,E,G,I,H,");&lt;br /&gt;  expected.put("in-order", "A,B,C,D,E,F,G,H,I,");&lt;br /&gt;  expected.put("post-order", "A,C,E,D,B,H,I,G,F,");&lt;br /&gt;  expected.put("breadth-first", "F,B,G,A,D,I,C,E,H,");&lt;br /&gt;&lt;br /&gt;  String name = "depth-first";&lt;br /&gt;  AbstractBinaryTreeIterator&amp;lt;String&amp;gt; iterator = new DepthFirstIterator&amp;lt;String&amp;gt;(tree);&lt;br /&gt;  AbstractBinaryTreeIterator.LOGGER.debug(name);&lt;br /&gt;  assertEquals(name, expected.get(name), createCommaSeparatedString(iterator));&lt;br /&gt;&lt;br /&gt;  name = "in-order";&lt;br /&gt;  iterator = new InOrderIterator&amp;lt;String&amp;gt;(tree);&lt;br /&gt;  AbstractBinaryTreeIterator.LOGGER.debug(name);&lt;br /&gt;  assertEquals(name, expected.get(name), createCommaSeparatedString(iterator));&lt;br /&gt;&lt;br /&gt;  name = "post-order";&lt;br /&gt;  iterator = new PostOrderIterator&amp;lt;String&amp;gt;(tree);&lt;br /&gt;  AbstractBinaryTreeIterator.LOGGER.debug(name);&lt;br /&gt;  assertEquals(name, expected.get(name), createCommaSeparatedString(iterator));&lt;br /&gt;&lt;br /&gt;  name = "breadth-first";&lt;br /&gt;  iterator = new BreadthFirstIterator&amp;lt;String&amp;gt;(tree);&lt;br /&gt;  AbstractBinaryTreeIterator.LOGGER.debug(name);&lt;br /&gt;  assertEquals(name, expected.get(name), createCommaSeparatedString(iterator));&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Tests are great, but being a visual person I like to be able to see a picture.  There's a terrific package called &lt;a href="http://graphviz.org/"&gt;graphviz &lt;/a&gt;from AT&amp;amp;T that lets you generate graph plots in an elegant way.  I wrote a quick program to walk the binary tree { F,B,A,D,C,E,G,I,H } using an iterator and spit out the dot representation, like so:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;digraph simple_hierarchy {&lt;br /&gt;F-&gt;B [label="L"]&lt;br /&gt;F-&gt;G [label="R"]&lt;br /&gt;B-&gt;A [label="L"]&lt;br /&gt;B-&gt;D [label="R"]&lt;br /&gt;D-&gt;C [label="L"]&lt;br /&gt;D-&gt;E [label="R"]&lt;br /&gt;G-&gt;I [label="R"]&lt;br /&gt;I-&gt;H [label="L"]&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I can use this as the input to dot.exe to render the tree as .png or .svg file:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9ZfLzIk1dQU/SuPH-MxdPmI/AAAAAAAAAEU/cziWC9GuLE8/s1600-h/binary-tree-1.png"&gt;&lt;img style="cursor: pointer; width: 214px; height: 320px;" src="http://3.bp.blogspot.com/_9ZfLzIk1dQU/SuPH-MxdPmI/AAAAAAAAAEU/cziWC9GuLE8/s320/binary-tree-1.png" alt="" id="BLOGGER_PHOTO_ID_5396376649914465890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'll post the other iterators next time.&lt;br /&gt;&lt;br /&gt;All this work just to answer a single interview question!  This tells me that doing it justice would be hard in such a short period of time.  I would flunk such an interview.&lt;br /&gt;&lt;br /&gt;Thanks to my friend Steve Roach, who was the first person to bring graphviz (and so many other things) to my attention.  He's one of the most talented developers I've had the pleasure of working with, but it's his teaching ability that's his greatest strength.  He's one of those people who makes everyone around him better.  Such intellectual generosity is rare indeed.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-7006027334152514488?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/7006027334152514488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=7006027334152514488' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/7006027334152514488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/7006027334152514488'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2009/10/binary-tree-iterators.html' title='Binary Tree Iterators'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9ZfLzIk1dQU/SuPD_WlMJOI/AAAAAAAAAEM/5YfRBc2-_U8/s72-c/more-practice-3425022158_6ffeb11daa_t.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-9063068994164095898</id><published>2009-10-18T17:41:00.006-04:00</published><updated>2009-11-02T21:04:34.329-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='practice code kata binary tree'/><title type='text'>Practice, Practice, Practice</title><content type='html'>&lt;!-- Original Google Analytics script; this one seems to work --&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br/&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;&lt;script type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;try {var pageTracker = _gat._getTracker("UA-4114468-1");pageTracker._trackPageview();} catch(err) {}&lt;/script&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9ZfLzIk1dQU/StuLuCfBKbI/AAAAAAAAAD8/ztDJ_9CUpx8/s1600-h/kata-practice-2451107262_03f3d200ae.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_9ZfLzIk1dQU/StuLuCfBKbI/AAAAAAAAAD8/ztDJ_9CUpx8/s200/kata-practice-2451107262_03f3d200ae.jpg" alt="" id="BLOGGER_PHOTO_ID_5394058601763514802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I spent several hours last week interviewing Java developers.  We needed to bring in some contractors.  It was decided that we'd ask candidates to write some Java code as part of the interview process.  We had a list of twenty quiz questions that ranged in difficulty.  Since our time was limited, we'd restrict ourselves to one or two quiz questions per candidate.&lt;br /&gt;&lt;br /&gt;I had mixed feelings about the quiz questions.  I'm familiar with Joel Spolsky's &lt;a href="http://www.joelonsoftware.com/articles/GuerrillaInterviewing3.html"&gt;Guerrilla Guide to Interviewing&lt;/a&gt;.  I didn't want to be a Quiz Show Interviewer.&lt;br /&gt;&lt;br /&gt;But there was something else nagging me.  How would &lt;span style="font-style: italic;"&gt;I&lt;/span&gt; fare if presented with this quiz?&lt;br /&gt;&lt;br /&gt;One of the questions was: "Traverse a binary tree in depth-first order."  I'd bet that anybody fresh out of a good data structures class would be able to whip this out quickly enough to be able to fit into the scope of a 30 minute phone conversation.&lt;br /&gt;&lt;br /&gt;But what about a guy like me?&lt;br /&gt;&lt;br /&gt;The only data structure I was taught as a mechanical engineer was a FORTRAN array.  I was keenly aware of my ignorance when I started down the software path, so I did what I always do: sign up for a degree and start taking courses.  I started down the path of an Master of Science degree in computer science.  It included basics like data structures, but they taught it using Eiffel.  And that was ten years ago.  I'd have to dredge up those memories and express them in Java.&lt;br /&gt;&lt;br /&gt;Even worse, I've been working as an architect for years now.  The big firms that employ me tend to take a dim view of architects that write code.  Programming is considered a low level, commodity, low skill task that's best left to the least expensive off-shore individuals you can find.&lt;br /&gt;&lt;br /&gt;It made me nervous to think about how foolish I'd look taking my own interview.&lt;br /&gt;&lt;br /&gt;So I started working through the interview questions, one by one.  I spent some time this weekend on that binary tree implementation.  I got through it using all the best practices I knew: Java, test driven development using TestNG, IntelliJ and refactoring, etc.  It took more than thirty minutes to finish, but I'm pleased with the result.  I am not fast, but I think I'm conscientious and thorough.&lt;br /&gt;&lt;br /&gt;Practice will help with my speed.  Part of the value of this exercise is to practice, practice, practice.  Individuals that I have a great deal of respect for advocate the &lt;a href="http://slott-softwarearchitect.blogspot.com/"&gt;concept of constant practice&lt;/a&gt;, calling it &lt;a href="http://codekata.pragprog.com/"&gt;code kata&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I think it's especially important for someone with "architect" in their job title.  How on earth can you represent for "best practices" when you're so woefully out of practice yourself?&lt;br /&gt;&lt;br /&gt;The other benefit?  It's fun and satisfying.  There's still a great sense of satisfaction, of an aesthetic for mathematical beauty, whenever I manage to pull myself through whatever rabbit hole I've fallen into.  There's frustration, too, when I struggle and fall and fail.  But when it works, there's nothing like it.&lt;br /&gt;&lt;br /&gt;It's no different from any other profession.  We all have to keep learning, struggling, adding new skills, re-sharpening old ones.&lt;br /&gt;&lt;br /&gt;If you're not a programmer, you can stop reading here.  (Thank you for coming at all and getting this far.)&lt;br /&gt;&lt;br /&gt;If you are a programmer, and you're still interested, here's my solution to the first part of the problem: a binary tree in Java.  I started with a Node class that encapsulated a value plus left and right child references:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package tree;&lt;br /&gt;&lt;br /&gt;public class Node&amp;lt;T extends Comparable&amp;lt;T&amp;gt;&amp;gt;&lt;br /&gt;    implements Comparable&lt;br /&gt;{&lt;br /&gt;  private T value;&lt;br /&gt;  private Node&amp;lt;T&amp;gt; left;&lt;br /&gt;  private Node&amp;lt;T&amp;gt; right;&lt;br /&gt;&lt;br /&gt;  public Node(T value)&lt;br /&gt;  {&lt;br /&gt;     this(value, null, null);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public Node(T value, Node&amp;lt;T&amp;gt; left, &lt;br /&gt;                       Node&amp;lt;T&amp;gt; right)&lt;br /&gt;  {&lt;br /&gt;     this.setValue(value);&lt;br /&gt;     this.left = left;&lt;br /&gt;     this.right = right;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public T getValue()&lt;br /&gt;  {&lt;br /&gt;     return value;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setValue(T value)&lt;br /&gt;  {&lt;br /&gt;     if (value == null)&lt;br /&gt;        throw new IllegalArgumentException("node value &lt;br /&gt;            cannot be null");&lt;br /&gt;&lt;br /&gt;     this.value = value;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public Node&amp;lt;T&amp;gt; getLeft()&lt;br /&gt;  {&lt;br /&gt;     return left;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setLeft(Node&amp;lt;T&amp;gt; left)&lt;br /&gt;  {&lt;br /&gt;     this.left = left;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public Node&amp;lt;T&amp;gt; getRight()&lt;br /&gt;  {&lt;br /&gt;     return right;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setRight(Node&amp;lt;T&amp;gt; right)&lt;br /&gt;  {&lt;br /&gt;     this.right = right;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public boolean isLeaf()&lt;br /&gt;  {&lt;br /&gt;     return ((this.left == null) &amp;amp;&amp;amp; &lt;br /&gt;             (this.right == null));&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public int compareTo(Object o)&lt;br /&gt;  {&lt;br /&gt;     Node&amp;lt;T&amp;gt; other = (Node&amp;lt;T&amp;gt;) o;&lt;br /&gt;&lt;br /&gt;     return this.getValue().compareTo(other.getValue());&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public boolean equals(Object o)&lt;br /&gt;  {&lt;br /&gt;     if (this == o)&lt;br /&gt;     {&lt;br /&gt;        return true;&lt;br /&gt;     }&lt;br /&gt;     if (o == null || getClass() != o.getClass())&lt;br /&gt;     {&lt;br /&gt;        return false;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     Node node = (Node) o;&lt;br /&gt;&lt;br /&gt;     if (!value.equals(node.value))&lt;br /&gt;     {&lt;br /&gt;        return false;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     return true;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public int hashCode()&lt;br /&gt;  {&lt;br /&gt;     return value.hashCode();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public String toString()&lt;br /&gt;  {&lt;br /&gt;     return value.toString();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Of course I wrote a TestNG class to unit test it:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package tree;&lt;br /&gt;&lt;br /&gt;import static org.testng.Assert.*;&lt;br /&gt;import org.testng.annotations.Test;&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public class NodeTest&lt;br /&gt;{&lt;br /&gt;  /**&lt;br /&gt;   * For any non-null reference value x, x.equals(null) &lt;br /&gt;   * must return false.&lt;br /&gt;   */&lt;br /&gt;  public void testNotNull()&lt;br /&gt;  {&lt;br /&gt;     Node&amp;lt;String&amp;gt; x &lt;br /&gt;        = new Node&amp;lt;String&amp;gt;("test");&lt;br /&gt;&lt;br /&gt;     assertFalse(x.equals(null));&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * It is reflexive: For any reference value x, &lt;br /&gt;   * x.equals(x) must return true.&lt;br /&gt;   */&lt;br /&gt;  public void testReflexive()&lt;br /&gt;  {&lt;br /&gt;     Node&amp;lt;String&amp;gt; x &lt;br /&gt;        = new Node&amp;lt;String&amp;gt;("test");&lt;br /&gt;    &lt;br /&gt;     assertTrue(x.equals(x));&lt;br /&gt;     assertEquals(0, x.compareTo(x));&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * It is symmetric: For any reference values x and y, &lt;br /&gt;   * x.equals(y) must return&lt;br /&gt;   * true if and only if y.equals(x) returns true.&lt;br /&gt;   */&lt;br /&gt;  public void testSymmetric()&lt;br /&gt;  {&lt;br /&gt;     Node&amp;lt;String&amp;gt; x &lt;br /&gt;        = new Node&amp;lt;String&amp;gt;("test");&lt;br /&gt;     Node&amp;lt;String&amp;gt; y &lt;br /&gt;        = new Node&amp;lt;String&amp;gt;("test");&lt;br /&gt;     Node&amp;lt;String&amp;gt; z &lt;br /&gt;        = new Node&amp;lt;String&amp;gt;("something else");&lt;br /&gt;&lt;br /&gt;     assertTrue(x.equals(y) &amp;amp;&amp;amp; y.equals(x));&lt;br /&gt;     assertTrue((x.compareTo(y) == 0) &lt;br /&gt;        &amp;amp;&amp;amp; (y.compareTo(x) == 0));&lt;br /&gt;     assertFalse(x.equals(z));&lt;br /&gt;     assertTrue(x.compareTo(z) &amp;gt; 0);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;   * It is transitive: For any reference values x, y, &lt;br /&gt;   * and z, if x.equals(y) returns&lt;br /&gt;   * true and y.equals(z) returns true, &lt;br /&gt;   * then x.equals(z) must return true&lt;br /&gt;   */&lt;br /&gt;  public void testTransitive()&lt;br /&gt;  {&lt;br /&gt;     Node&amp;lt;String&amp;gt; x &lt;br /&gt;        = new Node&amp;lt;String&amp;gt;("test");&lt;br /&gt;     Node&amp;lt;String&amp;gt; y &lt;br /&gt;        = new Node&amp;lt;String&amp;gt;("test");&lt;br /&gt;     Node&amp;lt;String&amp;gt; z &lt;br /&gt;        = new Node&amp;lt;String&amp;gt;("test");&lt;br /&gt;&lt;br /&gt;     assertTrue(x.equals(y) &amp;amp;&amp;amp; &lt;br /&gt;                y.equals(z) &amp;amp;&amp;amp; &lt;br /&gt;                z.equals(x));&lt;br /&gt;     assertTrue((x.compareTo(y) == 0) &amp;amp;&amp;amp; &lt;br /&gt;                (y.compareTo(z) == 0) &amp;amp;&amp;amp; &lt;br /&gt;                (z.compareTo(x) == 0));&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void testHashCode()&lt;br /&gt;  {&lt;br /&gt;     Node&amp;lt;String&amp;gt; x &lt;br /&gt;        = new Node&amp;lt;String&amp;gt;("test");&lt;br /&gt;     Node&amp;lt;String&amp;gt; y &lt;br /&gt;        = new Node&amp;lt;String&amp;gt;("test");&lt;br /&gt;     Node&amp;lt;String&amp;gt; z &lt;br /&gt;        = new Node&amp;lt;String&amp;gt;("something else");&lt;br /&gt;&lt;br /&gt;     assertTrue(x.hashCode() == y.hashCode());&lt;br /&gt;     assertFalse(x.hashCode() == z.hashCode());&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void testToString()&lt;br /&gt;  {&lt;br /&gt;     String expected = "expected";&lt;br /&gt;&lt;br /&gt;     Node&amp;lt;String&amp;gt; node &lt;br /&gt;        = new Node&amp;lt;String&amp;gt;(expected);&lt;br /&gt;     assertEquals(node.toString(), expected);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Test(expectedExceptions = NullPointerException.class)&lt;br /&gt;  public void testCompareToNull()&lt;br /&gt;  {&lt;br /&gt;     Node&amp;lt;String&amp;gt; x &lt;br /&gt;        = new Node&amp;lt;String&amp;gt;("test");&lt;br /&gt;&lt;br /&gt;     x.compareTo(null);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void testCompareTo()&lt;br /&gt;  {&lt;br /&gt;     Node&amp;lt;String&amp;gt; x &lt;br /&gt;        = new Node&amp;lt;String&amp;gt;("x");&lt;br /&gt;     Node&amp;lt;String&amp;gt; y &lt;br /&gt;        = new Node&amp;lt;String&amp;gt;("y");&lt;br /&gt;     Node&amp;lt;String&amp;gt; z &lt;br /&gt;        = new Node&amp;lt;String&amp;gt;("z");&lt;br /&gt;&lt;br /&gt;     assertTrue((x.compareTo(x) == 0) &amp;amp;&amp;amp; &lt;br /&gt;                (x.compareTo(y) &amp;lt;  0) &amp;amp;&amp;amp; &lt;br /&gt;                (x.compareTo(z) &amp;lt;  0));&lt;br /&gt;     assertTrue((y.compareTo(x) &amp;gt;  0) &amp;amp;&amp;amp; &lt;br /&gt;                (y.compareTo(y) == 0) &amp;amp;&amp;amp; &lt;br /&gt;                (y.compareTo(z) &amp;lt;  0));&lt;br /&gt;     assertTrue((z.compareTo(x) &amp;gt;  0) &amp;amp;&amp;amp; &lt;br /&gt;                (z.compareTo(y) &amp;gt;  0) &amp;amp;&amp;amp; &lt;br /&gt;                (z.compareTo(z) == 0));&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Test(expectedExceptions = IllegalArgumentException.class)&lt;br /&gt;  public void testNullValue()&lt;br /&gt;  {&lt;br /&gt;     Node&amp;lt;String&amp;gt; x   &lt;br /&gt;        = new Node&amp;lt;String&amp;gt;(null);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void testIsLeaf()&lt;br /&gt;  {&lt;br /&gt;     Node&amp;lt;String&amp;gt; x &lt;br /&gt;        = new Node&amp;lt;String&amp;gt;("test");&lt;br /&gt;&lt;br /&gt;     assertTrue(x.isLeaf());&lt;br /&gt;&lt;br /&gt;     x.setLeft(new Node&amp;lt;String&amp;gt;("left"));&lt;br /&gt;     x.setRight(new Node&amp;lt;String&amp;gt;("right"));&lt;br /&gt;&lt;br /&gt;     assertFalse(x.isLeaf());&lt;br /&gt;&lt;br /&gt;     assertEquals("left", x.getLeft().getValue());&lt;br /&gt;     assertEquals("right", x.getRight().getValue());&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then I wrote a BinaryTree:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package tree;&lt;br /&gt;&lt;br /&gt;import java.util.Arrays;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;public class BinaryTree&amp;lt;T &lt;br /&gt;    extends Comparable&amp;lt;T&amp;gt;&amp;gt;&lt;br /&gt;{&lt;br /&gt;  private Node&amp;lt;T&amp;gt; root;&lt;br /&gt;&lt;br /&gt;  public BinaryTree()&lt;br /&gt;  {&lt;br /&gt;     this(null);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public BinaryTree(Node&amp;lt;T&amp;gt; root)&lt;br /&gt;  {&lt;br /&gt;     this.root = root;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public Node&amp;lt;T&amp;gt; getRoot()&lt;br /&gt;  {&lt;br /&gt;     return this.root;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public boolean contains(T value)&lt;br /&gt;  {&lt;br /&gt;     return contains(this.root, value);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private boolean contains(Node&amp;lt;T&amp;gt; node, T value)&lt;br /&gt;  {&lt;br /&gt;     // empty tree can't contain the value; value &lt;br /&gt;     // cannot be null&lt;br /&gt;     if ((node == null) || (value == null))&lt;br /&gt;     {&lt;br /&gt;        return false;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     if (value.equals(node.getValue()))&lt;br /&gt;     {&lt;br /&gt;        return true;&lt;br /&gt;     }&lt;br /&gt;     else if (value.compareTo(node.getValue()) &amp;lt; 0)&lt;br /&gt;     {&lt;br /&gt;        return contains(node.getLeft(), value);&lt;br /&gt;     }&lt;br /&gt;     else&lt;br /&gt;     {&lt;br /&gt;        return contains(node.getRight(), value);&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void insert(T value)&lt;br /&gt;  {&lt;br /&gt;     this.root = insert(this.root, value);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void insert(List&amp;lt;T&amp;gt; values)&lt;br /&gt;  {&lt;br /&gt;     if ((values != null) &amp;amp;&amp;amp; &lt;br /&gt;         (values.size() &amp;gt; 0))&lt;br /&gt;     {&lt;br /&gt;        for (T value : values)&lt;br /&gt;        {&lt;br /&gt;           insert(value);     &lt;br /&gt;        }&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void insert(T [] values)&lt;br /&gt;  {&lt;br /&gt;     if ((values != null) &amp;amp;&amp;amp; &lt;br /&gt;         (values.length &amp;gt; 0))&lt;br /&gt;     {&lt;br /&gt;        insert(Arrays.asList(values));&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;  private Node&amp;lt;T&amp;gt; insert(Node&amp;lt;T&amp;gt; node, &lt;br /&gt;                               T value)&lt;br /&gt;  {&lt;br /&gt;     if (node == null)&lt;br /&gt;     {&lt;br /&gt;        return new Node&amp;lt;T&amp;gt;(value);&lt;br /&gt;     }&lt;br /&gt;     else&lt;br /&gt;     {&lt;br /&gt;        if (value.compareTo(node.getValue()) &amp;lt; 0)&lt;br /&gt;        {&lt;br /&gt;           node.setLeft(insert(node.getLeft(), value));&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;           node.setRight(insert(node.getRight(), value));           &lt;br /&gt;        }&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     return node;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public int size()&lt;br /&gt;  {&lt;br /&gt;     return size(root);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private int size(Node&amp;lt;T&amp;gt; node)&lt;br /&gt;  {&lt;br /&gt;     if (node == null)&lt;br /&gt;     {&lt;br /&gt;        return 0;&lt;br /&gt;     }&lt;br /&gt;     else&lt;br /&gt;     {&lt;br /&gt;        return (size(node.getLeft()) + &lt;br /&gt;                1 + &lt;br /&gt;                size(node.getRight()));&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public int height()&lt;br /&gt;  {&lt;br /&gt;     return height(root);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private int height(Node&amp;lt;T&amp;gt; node)&lt;br /&gt;  {&lt;br /&gt;     if (node == null)&lt;br /&gt;     {&lt;br /&gt;        return 0;&lt;br /&gt;     }&lt;br /&gt;     else&lt;br /&gt;     {&lt;br /&gt;        int leftHeight = height(node.getLeft());&lt;br /&gt;        int rightHeight = height(node.getRight());&lt;br /&gt;&lt;br /&gt;        return (Math.max(leftHeight, rightHeight) + 1);&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public boolean isEmpty()&lt;br /&gt;  {&lt;br /&gt;     return (root == null);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And a TestNG unit test:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package tree;&lt;br /&gt;&lt;br /&gt;import static org.testng.Assert.assertFalse;&lt;br /&gt;import static org.testng.Assert.assertTrue;&lt;br /&gt;import static org.testng.AssertJUnit.assertEquals;&lt;br /&gt;import org.testng.annotations.BeforeTest;&lt;br /&gt;import org.testng.annotations.Test;&lt;br /&gt;&lt;br /&gt;import java.util.Arrays;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public class BinaryTreeTest&lt;br /&gt;{&lt;br /&gt;  private BinaryTree&amp;lt;Integer&amp;gt; tree;&lt;br /&gt;  private Integer [] data = { 5, 3, 9, 1, 4, 6, };&lt;br /&gt;&lt;br /&gt;  @BeforeTest&lt;br /&gt;  public void setUp()&lt;br /&gt;  {&lt;br /&gt;     tree = new BinaryTree&amp;lt;Integer&amp;gt;();&lt;br /&gt;     tree.insert(data);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void testIsEmpty()&lt;br /&gt;  {&lt;br /&gt;     assertFalse(tree.isEmpty());&lt;br /&gt;     assertTrue(new BinaryTree&amp;lt;Integer&amp;gt;().isEmpty());&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void testSize()&lt;br /&gt;  {&lt;br /&gt;     assertEquals(tree.size(), data.length);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void testHeight()&lt;br /&gt;  {&lt;br /&gt;     int expected = 3;&lt;br /&gt;     assertEquals(tree.height(), expected);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void testGetRoot()&lt;br /&gt;  {&lt;br /&gt;     Node&amp;lt;Integer&amp;gt; expected &lt;br /&gt;        = new Node&amp;lt;Integer&amp;gt;(data[0]);&lt;br /&gt;     assertEquals(tree.getRoot(), expected);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void testContains()&lt;br /&gt;  {&lt;br /&gt;     for (int value : data)&lt;br /&gt;     {&lt;br /&gt;        assertTrue(tree.contains(value));&lt;br /&gt;        assertFalse(tree.contains(value*1000));&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void testInsertList()&lt;br /&gt;  {&lt;br /&gt;     // When you insert a list, you get it back without &lt;br /&gt;     // alteration using a pre-order, depth-first traversal.&lt;br /&gt;     List&amp;lt;String&amp;gt; data &lt;br /&gt;        = Arrays.asList("F","B","A","D","C","E","G","I","H");&lt;br /&gt;     BinaryTree&amp;lt;String&amp;gt; tree &lt;br /&gt;        = new BinaryTree&amp;lt;String&amp;gt;();&lt;br /&gt;     tree.insert(data);&lt;br /&gt;&lt;br /&gt;     // Check the size&lt;br /&gt;     assertEquals(tree.size(), data.size());&lt;br /&gt;&lt;br /&gt;     // Now check the values&lt;br /&gt;     BinaryTreeIterator&amp;lt;String&amp;gt; iterator &lt;br /&gt;        = new DepthFirstIterator&amp;lt;String&amp;gt;(tree);&lt;br /&gt;     int i = 0;&lt;br /&gt;     while (iterator.hasNext())&lt;br /&gt;     {&lt;br /&gt;        assertEquals("i = " + i, iterator.next(), &lt;br /&gt;                                 data.get(i++));&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void testInsertArray()&lt;br /&gt;  {&lt;br /&gt;     // When you insert a list, you get it back without &lt;br /&gt;     // alteration using a pre-order, depth-first traversal.&lt;br /&gt;     String [] data = {"F","B","A","D","C","E","G","I","H",};&lt;br /&gt;     BinaryTree&amp;lt;String&amp;gt; tree &lt;br /&gt;        = new BinaryTree&amp;lt;String&amp;gt;();&lt;br /&gt;     tree.insert(data);&lt;br /&gt;&lt;br /&gt;     assertEquals(tree.size(), data.length);     &lt;br /&gt;&lt;br /&gt;     BinaryTreeIterator&amp;lt;String&amp;gt; iterator &lt;br /&gt;        = new DepthFirstIterator&amp;lt;String&amp;gt;(tree);&lt;br /&gt;     int i = 0;&lt;br /&gt;     while (iterator.hasNext())&lt;br /&gt;     {&lt;br /&gt;        assertEquals("i = " + i, iterator.next(), &lt;br /&gt;                                 data[i++]);     &lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void testInsertNullList()&lt;br /&gt;  {&lt;br /&gt;     List&amp;lt;String&amp;gt; data = null;&lt;br /&gt;     BinaryTree&amp;lt;String&amp;gt; tree &lt;br /&gt;        = new BinaryTree&amp;lt;String&amp;gt;();&lt;br /&gt;     tree.insert(data);&lt;br /&gt;&lt;br /&gt;     assertEquals(tree.size(), 0);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void testInsertNullArray()&lt;br /&gt;  {&lt;br /&gt;     String [] data = null;&lt;br /&gt;     BinaryTree&amp;lt;String&amp;gt; tree &lt;br /&gt;        = new BinaryTree&amp;lt;String&amp;gt;();&lt;br /&gt;     tree.insert(data);&lt;br /&gt;&lt;br /&gt;     assertEquals(tree.size(), 0);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This was the ground work.  The real solution meant writing iterators to traverse the BinaryTree.  If you're reading closely, you'll see that I used a DepthFirstIterator in the unit test for BinaryTree.&lt;br /&gt;&lt;br /&gt;I'll post those next time.  In the meantime, I'll keep practicing.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-9063068994164095898?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/9063068994164095898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=9063068994164095898' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/9063068994164095898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/9063068994164095898'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2009/10/practice-practice-practice.html' title='Practice, Practice, Practice'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9ZfLzIk1dQU/StuLuCfBKbI/AAAAAAAAAD8/ztDJ_9CUpx8/s72-c/kata-practice-2451107262_03f3d200ae.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-4609215616211439141</id><published>2009-10-12T11:33:00.003-04:00</published><updated>2009-10-12T12:02:30.920-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAAP accounting debt economy'/><title type='text'>Frightening Update</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9ZfLzIk1dQU/StNMmU08TQI/AAAAAAAAAD0/HHDMFuTR7LA/s1600-h/frightening-update-MoneyChart.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 146px;" src="http://3.bp.blogspot.com/_9ZfLzIk1dQU/StNMmU08TQI/AAAAAAAAAD0/HHDMFuTR7LA/s200/frightening-update-MoneyChart.jpg" alt="" id="BLOGGER_PHOTO_ID_5391737400202120450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;I recently wrote about how &lt;a href="http://craicpropagation.blogspot.com/2009/10/frightening.html"&gt;frightening &lt;/a&gt;the financial situation of the United States was.  How could it be that an entity as complex as the United States economy could employ cash based accounting, the same method used by hot dog stands?&lt;br /&gt;&lt;br /&gt;After posting that blog I had breakfast with one of my oldest and best friends.  I met him early in my engineering career.  We branched in graduate school after both of us completed Masters degrees.  I went on with mechanical engineering, while he pursued an MBA.  We branched again when I abandoned engineering and ran down the software track. &lt;br /&gt;&lt;br /&gt;We've managed to stay in contact in spite of the fact that we no longer work together.  We'd meet for lunch until the noon hour stopped being considered a sacred "meeting free" time.  Then we switched to monthly breakfasts before work.  These are coffee-fueled discussions about all our favorite topics - engineering, politics, religion, movies, sports.  I can't think of many people in my life with whom I could spend an hour this way.  I look forward to them like nothing else.&lt;br /&gt;&lt;br /&gt;My friend is a dyed-in-the-wool leftie who's against all things Republican.  I tend to be left of center as well, but it's easier for me to slip into "a pox on both your houses" mode when I think that Democrats aren't living up to their ideals.  It's a position that's easy to assume these days.  Except for the change in tone I don't see much difference between the current administration and the Republican regimes of the last eight years, with two wars in progress and being funded by "off budget" expenditures, the Treasury taken over by Goldman Sachs, the Patriot Act in place, Glass-Steagall rolled back, and Guantanamo in operation.&lt;br /&gt;&lt;br /&gt;During our last breakfast I relayed the essence of my distress: Why doesn't the US government use GAAP?  I thought myself very clever when I said that cash based accounting made us no better than a hot dog vendor.&lt;br /&gt;&lt;br /&gt;My friend drew on the wellspring of knowledge he accumulated during his MBA and shot me down: "Cash-based accounting is the most honest form there is.  You look into the till and report on how much cash you see!"  He pointed out that GAAP is loaded with loopholes and tricks.  Depreciation makes all kinds of shenanigans possible.&lt;br /&gt;&lt;br /&gt;My argument was shot down.  I was an easy target, because I've never studied accounting.&lt;br /&gt;&lt;br /&gt;I'd appreciate it if someone could explain to me where I went wrong.  I realize that it won't be possible to relate or absorb such a vast subject in the space of a web comment, but I could use a nudge in the right direction.&lt;br /&gt;&lt;br /&gt;Perhaps the real answer is that no accounting system is a guarantee of honesty and transparency.  Scandals too numerous to list, such as Baan, Enron, etc., have taught us that outright lying can be done using any accounting system.  GAAP won't stop you from booking loans as income, or moving sales back from one quarter to another to make a bad quarter look better, or shipping product to a warehouse you own and treating them as sales, or ignoring an IOU to Social Security and Medicare because you spent the cash accumulated within back in the Vietnam days.&lt;br /&gt;&lt;br /&gt;The real problem isn't the way the Congressional Budget Office is tallying the numbers.  It's the way we're misled about what the numbers are in the first place.&lt;br /&gt;&lt;br /&gt;One reason for the housing boom is people taking on debts beyond their means, assuming that the value of the house would always appreciate at a rate that would make it possible to flip the house at a profit before paying for it became a problem. &lt;br /&gt;&lt;br /&gt;I think our current fiscal situation is based on an equally flawed assumption: that the United States will always be the world's pre-eminent economic power, that the rest of the world will never catch up, that our economy will always continue to grow fast enough to make it possible to pay off the obligations we're piling up. &lt;br /&gt;&lt;br /&gt;I keep waiting for the Obama administration to start telling us the truth, but it's like waiting for Godot. &lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-4609215616211439141?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/4609215616211439141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=4609215616211439141' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/4609215616211439141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/4609215616211439141'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2009/10/frightening-update.html' title='Frightening Update'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9ZfLzIk1dQU/StNMmU08TQI/AAAAAAAAAD0/HHDMFuTR7LA/s72-c/frightening-update-MoneyChart.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-7523100047588157382</id><published>2009-10-08T21:23:00.004-04:00</published><updated>2009-10-08T22:12:41.299-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UML software design agile waterfall'/><title type='text'>Why Is UML So Hard?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9ZfLzIk1dQU/Ss6Q4VbbfzI/AAAAAAAAADs/EdBa5QaD_FU/s1600-h/UML_logo.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 142px;" src="http://1.bp.blogspot.com/_9ZfLzIk1dQU/Ss6Q4VbbfzI/AAAAAAAAADs/EdBa5QaD_FU/s200/UML_logo.gif" alt="" id="BLOGGER_PHOTO_ID_5390405101508329266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;I changed careers back in 1995.  I jumped from mechanical engineering to software development.  I've worked hard to try and learn what object-oriented programming is all about, what advantages it brings to helping to solve problems in software design and implementation. &lt;br /&gt;&lt;br /&gt;First I learned C++, the great new language that Bjarne Stroustrup gave us.  I thought that figuring out pointers when I moved from FORTRAN to C was hard; wrapping my brain around objects was much more difficult.&lt;br /&gt;&lt;br /&gt;Then Java came along.  I took a one-week class, but I didn't really get it. &lt;br /&gt;&lt;br /&gt;Then I moved along to a company that wrote client-server accounting software using Visual C++.  One day the CTO asked if I was willing to tackle an assignment that required Java.  "Oh sure, I know that language," I said.  I really had no business taking on that problem, but I muddled my way through it well enough to deliver something. &lt;br /&gt;&lt;br /&gt;That company was struggling with the transition from client-server to a distributed, three-tier architecture.  They had a long history with the Microsoft platform, but they liked Java's "write once, run anywhere" promise.  Their clients were banks and businesses, not all of which ran on Windows.  They also wanted to get away from the tight coupling between their user interface and the database tier.  They had all their business logic tied up in stored procedures.  This meant that they had to support Oracle, DB2, Microsoft SQL Server, Informix, Sybase - any flavor of stored procedure language that a client wished to run.  They had a "can do" cowboy attitude that said hacking stored procedure code on site for a new customer was just good business, even if it meant that every installation was a custom.  Why let an out-of-synch source code repository stop you from saying "Yes, sir!" to the customer?&lt;br /&gt;&lt;br /&gt;The CTO brought in a bunch of folks to try and help them move to a more object-oriented approach.  He bought several licenses to the most well-known UML tool of the day.  He hired a consulting firm from the Washington DC area to come up and give us a week's intensive training in the use of this UML tool.  When the pressures of keeping the production version rolling out the door subsided, he took us all to a hotel conference room, away from the office, and had us spend two weeks locked away with our UML tool, flip charts, and markers.  When we were done, we'd have an awe-inspiring object-oriented design for the 21st century accounting system.&lt;br /&gt;&lt;br /&gt;As you can guess, the two weeks were a disaster.  No object-oriented design came out of those sessions.  The company didn't get their distributed accounting system.&lt;br /&gt;&lt;br /&gt;What went wrong?&lt;br /&gt;&lt;br /&gt;We lacked a strong leader with experience at object-oriented design.  We were still learning the tools.  Domain knowledge in accounting and experience with the product varied among the participants. &lt;br /&gt;&lt;br /&gt;Each session would start with something like "Let's do one use case."  We'd draw stuff on flip charts and quickly veer off the road.  Every discussion would descend into a dizzying argument that was a roller coaster ride from the heights of abstraction to the stomach-churning drop into implementation details.  I was trying to persuade them to list the steps for accounts payable when one old hand smirked and said "I can tell you what accounts payable is!  &lt;span style="font-style: italic;"&gt;Pay me!&lt;/span&gt;", holding out his hand with palm facing up.&lt;br /&gt;&lt;br /&gt;The developers would scowl and listen quietly until one of them would stomp out of the room, tossing something like "If you don't make up your mind soon, I'm just going to start coding what I want" over their shoulder as they headed towards the soda machine.&lt;br /&gt;&lt;br /&gt;We couldn't agree on what words meant. We'd have bike shed arguments for hours about what "customer" meant.  We couldn't agree on how to drive from a meaningful description of the problem at hand to artifacts that a developer could use to produce working code.  It's as if we'd get bored or frustrated doing that very hard work and give up before the payoff.&lt;br /&gt;&lt;br /&gt;I left the company soon after those sessions ended.  There was a layoff within six months.  The CTO was forced out in a power struggle with the other two founding partners. &lt;br /&gt;&lt;br /&gt;Fast forward eleven years.  I'm working for another large company that is struggling with a transition from an older platform to a more modern one.  UML has been championed as the cure for what ails us.  Licenses to another UML tool have been procured.  Training will commence.  A large cross-disciplinary team has been convened to go through the UML design process.  Consultants have been hired to shepherd us along the path of righteousness.&lt;br /&gt;&lt;br /&gt;The funny thing is that it feels just like those sessions I sat through eleven years ago.  Every discussion descends into a dizzying argument that's a roller coaster ride from the heights of abstraction to the stomach-churning drop into implementation details.  We can't agree on what words mean. We have bike shed arguments for hours about design minutia.  We can't agree on how to drive from a meaningful description of the problem at hand to artifacts that a developer can use to produce working code. &lt;br /&gt;&lt;br /&gt;We'll see if we get bored or frustrated doing that very hard work and give up before any payoff comes through.&lt;br /&gt;&lt;br /&gt;This might be the growing pains of a new team.   But what if it's something wrong at the heart of UML?  This object-oriented notation for rendering design decisions, codified and maintained by the &lt;a href="http://www.omg.org/"&gt;Object Management Group&lt;/a&gt;, was born out of years of notation wars among the Three Amigos - Booch, Jacobsen, and Rumbaugh.  They created a notation (UML), a company (Rational), a software tool (Rational Rose), and a software development methodology (Rational Unified Process) before selling out to IBM.&lt;br /&gt;&lt;br /&gt;Agile approaches have largely discredited heavy approaches like a full-blown UML design. &lt;br /&gt;&lt;br /&gt;Maybe somebody has found that this is a good way to develop large software systems in a team setting, but I haven't seen it yet.  Things don't seem to have improved a bit in the past eleven years. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-7523100047588157382?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/7523100047588157382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=7523100047588157382' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/7523100047588157382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/7523100047588157382'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2009/10/why-is-uml-so-hard.html' title='Why Is UML So Hard?'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9ZfLzIk1dQU/Ss6Q4VbbfzI/AAAAAAAAADs/EdBa5QaD_FU/s72-c/UML_logo.gif' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-8632263713504485456</id><published>2009-10-03T15:30:00.006-04:00</published><updated>2009-10-03T17:23:18.896-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='usa national debt gaap rudeawakening'/><title type='text'>Frightening</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9ZfLzIk1dQU/Ssemb312kGI/AAAAAAAAADk/e3pA_omTxxg/s1600-h/MindtheGaap1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 148px;" src="http://3.bp.blogspot.com/_9ZfLzIk1dQU/Ssemb312kGI/AAAAAAAAADk/e3pA_omTxxg/s200/MindtheGaap1.jpg" alt="" id="BLOGGER_PHOTO_ID_5388458476948590690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Articles like &lt;a href="http://rudeawakening.agorafinancial.com/2009/10/02/risk-free-is-not-without-risk/"&gt;"Risk Free Is Not Without Risk"&lt;/a&gt; at Rude Awakening scare the living hell out of me.  I've included their image of the US government's outstanding liabilities, calculated using cash accounting and GAAP, to lead off this entry.&lt;br /&gt;&lt;br /&gt;One paragraph from that column says it all:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;The fiscal condition of the United Sates has deteriorated dramatically during the last several years. On the basis of current obligations, U.S. indebtedness totals “only” about $12 trillion. But when utilizing traditional GAAP accounting – the kind of accounting that every public company in the United States MUST use – U.S. indebtedness soars to $74 trillion. This astounding sum is more than six times U.S. GDP. (GAAP accounting includes things like the present value of the Social Security liability and the Medicare liability – i.e. real liabilities.)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The $12T figure is scary enough.  It's the basis for all the rationalizations that our politicians are using for their monetary policies: "We can afford this deficit, because it's still a small percentage of our GDP.  America is still the mightiest economy in the world."  Our overall debt is roughly one year's GDP now.  &lt;br /&gt;&lt;br /&gt;But with a true debt that's six times our GDP it feels we're in an airplane that's nosediving and in gravity's grip.  Pulling out will take all of our strength.&lt;br /&gt;&lt;br /&gt;Does it bother anyone else that our government can hector industries about their poor practices - deservedly so - yet continue to use cash based accounting?  Isn't that the style that one would use to run a small, cash-based business like a hot dog stand?  I suppose that would be fine, as long as we were talking about the world's mightiest hot dog stand.&lt;br /&gt;&lt;br /&gt;There's a fight going on between &lt;a href="http://www.nytimes.com/1988/07/23/business/fresh-water-economists-gain.html"&gt;"fresh water" and "salt water" economists&lt;/a&gt; about the wisdom of continuing to run a large and growing deficit to stimulate the American economy.  The Keynesian school says that massive deficits are the only way to restore our prosperity.&lt;br /&gt;&lt;br /&gt;This argument is based on the kind of wishful thinking that brought about the recent collapse of the real estate market.  It assumes that deficits are a temporary condition and that the economy will always grow.  What politician has ever shut down a program once it was put in place?  What if the economy collapses under the weight of all that debt?&lt;br /&gt;&lt;br /&gt;The only time I can recall running a surplus was at the end of the Clinton years.  Even that was suspect, because it was fueled by an unanticipated windfall from capital gains taxes that were based on "irrational exuberance".  Remember Al Gore and his "Social Security lockbox"?  How did that work out?  How much of our debt was retired after that adventure in creative finance?&lt;br /&gt;&lt;br /&gt;I fear that our situation has become so unmanageable that the economy will never be able to grow its way out of debt.  Neither our people nor our government show any inclination to cut back on consumption and retire our debts.  We continue to hear about new rights (e.g., good jobs, universal health care, retirement with dignity, etc.), but no one wants to pay for them or face up to the obligations we've already incurred.&lt;br /&gt;&lt;br /&gt;The only alternative we have is inflation.  If we continue to debase our currency, perhaps all those dollars that the Chinese and Japanese are sitting on will become worthless.  That'll teach them a lesson!  Too bad that the dollars in my 401(k) will be suffering the same fate.  The joke will be on us.&lt;br /&gt;&lt;br /&gt;I'm glad that the Republicans are out of office after an eight-year nightmare.  I like Mr. Obama and wish him well.  &lt;br /&gt;&lt;br /&gt;But the Democrats have done nothing with their filibuster-proof majority to date.  And neither political party is telling us the truth or doing anything significant about the real problems that we all face.  Our news media would rather tell us about Jon and Kate and their unholy brood rather than let us know how dire our finances have become.  We're encouraged to continue to spend, as if it was our patriotic duty.&lt;br /&gt;&lt;br /&gt;I fret about how right-leaning religious nut cases who believe that our wealth and happiness are mandated by divine right will react if the tide turns.&lt;br /&gt;&lt;br /&gt;We're all going to have to learn to live within our means; our means will be declining.  If we can't do it ourselves, perhaps the Chinese and Japanese will force the lesson on us.  If they decide to stop buying our bonds we're going to see interest rates rise whether we like it or not.&lt;br /&gt;&lt;br /&gt;We won't be a great economy if we don't make things that the rest of the world wants to buy.   Contrary to what a lot of people think, God didn't make the United States the greatest economic power of the 20th century.  &lt;br /&gt;&lt;br /&gt;I think it's misguided to think that a service-based economy can allow us to maintain our pre-eminent position in the world.  If we continue to see industries collapse, without something new coming along to take their place, things could get very ugly here in the coming years.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-8632263713504485456?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/8632263713504485456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=8632263713504485456' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/8632263713504485456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/8632263713504485456'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2009/10/frightening.html' title='Frightening'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9ZfLzIk1dQU/Ssemb312kGI/AAAAAAAAADk/e3pA_omTxxg/s72-c/MindtheGaap1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-4252105764898022906</id><published>2009-09-27T10:32:00.004-04:00</published><updated>2009-09-27T11:30:46.457-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software synthetic biology standards building blocks'/><title type='text'>Synthetic Biology</title><content type='html'>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9ZfLzIk1dQU/Sr97Q1fo-UI/AAAAAAAAADc/DK1I4Nv0g4U/s1600-h/double-helix-2534711033_7e103eda11.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 133px; height: 200px;" src="http://1.bp.blogspot.com/_9ZfLzIk1dQU/Sr97Q1fo-UI/AAAAAAAAADc/DK1I4Nv0g4U/s200/double-helix-2534711033_7e103eda11.jpg" alt="" id="BLOGGER_PHOTO_ID_5386159208526313794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I read a terrific article written by Michael Specter, published in New Yorker Magazine, entitled &lt;a href="http://www.newyorker.com/reporting/2009/09/28/090928fa_fact_specter"&gt;"A Life Of Its Own."&lt;/a&gt;  It asks the question "Where will synthetic biology lead us?" &lt;br /&gt;&lt;br /&gt;I'm fascinated by the question.  It marries science and ethics in equal measure.  I can sympathize with the enthusiastic scientists who envision great benefits - everything from improved health to a way out of our deadly embrace of fossil fuels. &lt;br /&gt;&lt;br /&gt;I can't claim to be that kind of scientist.  Engineers concern themselves with applying the knowledge that the practitioners of fundamental sciences - physicists, chemists, and mathematicians - unearth for us.  We fashion these intellectual raw materials into useful things, and even contribute back what we learn about the fundamentals during process development, but I've been reminded many times that a mechanical engineer is not a physicist.  There was a time when I immersed myself into reading biographies of the great physicists of the 20th century.  Feynman became a hero of mine after reading his autobiographical short stories in "Surely You're Joking, Mr. Feynman!" and James Gleick's wonderful biography "Genius".  I devoured his famous red books, fancying myself a budding physicist. &lt;br /&gt;&lt;br /&gt;Then I got my hands on Veltman's "Diagrammatica", and the dream died.  It was beyond me.  I had neither the physical intuition nor the mathematical chops to see my way through it.&lt;br /&gt;&lt;br /&gt;I'm in a worse position with biology.  The last biology course that I took came in high school.  They taught us the rudiments of DNA, RNA, and the Krebs cycle, but it was well before the &lt;a href="http://sunsite.berkeley.edu/PCR/whatisPCR.html"&gt;polymerase chain reaction&lt;/a&gt; came along.  Chemistry is not my strong suit either, so the changes that are coming will leave me behind.&lt;br /&gt;&lt;br /&gt;Neither of my parents went to college.  I was alone when I went off to study mechanical engineering, because neither of them had experienced what I went through.&lt;br /&gt;&lt;br /&gt;My youngest daughter is studying biology as an undergraduate now.  In spite of all my education, I find myself in a position relative to my daughter similar to what my father had with me.  I can relate my experiences as an undergraduate to hers, and tell her what graduate school was like for me.  I know enough about fundamentals like thermodynamics, physics, etc. to keep the ball rolling when we talk.  But she's already well beyond my capabilities in her chosen field.  She's blazing that path alone.  She's Lewis and Clark sending letters back to me, Thomas Jefferson, describing the wonders she's experiencing.&lt;br /&gt;&lt;br /&gt;I found the New Yorker article particularly interesting, because a number of the phrases evoked things I'd read when the software industry was abandoning older procedural languages like FORTRAN and COBOL and embracing the newer idea of object oriented programming.  The problem was complexity: it's impossible to manage all the details that go into developing software when the number of lines of code explode into the hundreds of thousands or millions.  Problem solving in general, and computer science in particular, depends on being able to decompose large, intractable problems into smaller, more manageable pieces. &lt;br /&gt;&lt;br /&gt;Object oriented programming helps us to manage complexity by mapping software components onto real-world objects and encapsulating the details inside.  If done correctly, users of a component need only concern themselves with what they need to provide and what they get back; all the messiness of how it's done is hidden inside.&lt;br /&gt;&lt;br /&gt;Brad Cox and others used to talk about "software integrated circuits": each component would have its own well-defined inputs and outputs, much like the pins on a hardware integrated circuit.  There would be a marketplace of these software ICs, where you could search for a component that met your needs, plug it in, and off you'd go.&lt;br /&gt;&lt;br /&gt;This phrase on page 5 of the article brought that vision back for me: "The BioBricks registry is a physical repository, but it is also an online catalogue. If you want to construct an organism, or engineer it in new ways, you can go to the site as you would one that sells lumber or industrial pipes." &lt;br /&gt;&lt;br /&gt;It made me stop and think, because to a great degree the promise of software ICs has not been realized.  Writing complex software systems is still a difficult, large scale problem.  Object models claiming to model the industry I work in today have not lived up to their promise.  The ideal presented by the hardware side of the problem has not translated over to software.&lt;br /&gt;&lt;br /&gt;There's still something fundamentally different about software.  It's not all science.  The irony is that software was distinguished from hardware at the dawning of the computer age because it was believed to be more malleable stuff than the circuits it ran on.  You could change it relatively quickly, far more easily than the machine that executed it.&lt;br /&gt;&lt;br /&gt;But that's often precisely the problem.  It's very easy to change, but the coupling and complexity make it difficult to predict what the effect of the change will be.  Brittle software suffers from this problem.  The effect of changes in one part of the code often ripple out, resulting in surprising, disappointing, sometimes catastrophic behavior. &lt;br /&gt;&lt;br /&gt;Reading about the enthusiasm of biologists made me wonder about the brittleness, coupling, and unintended consequences that face them.  Will they have better success than software engineers have to date?  And if they do, what lessons can we learn to improve the lot of software development? &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-4252105764898022906?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/4252105764898022906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=4252105764898022906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/4252105764898022906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/4252105764898022906'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2009/09/synthetic-biology.html' title='Synthetic Biology'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9ZfLzIk1dQU/Sr97Q1fo-UI/AAAAAAAAADc/DK1I4Nv0g4U/s72-c/double-helix-2534711033_7e103eda11.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-3059817637152294552</id><published>2009-09-20T12:25:00.004-04:00</published><updated>2009-09-20T13:04:20.372-04:00</updated><title type='text'>Back From The Dead</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9ZfLzIk1dQU/SrZY8GTP0OI/AAAAAAAAADU/X6336X6aEig/s1600-h/hard-drive-512858811_a37319286c.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 114px;" src="http://4.bp.blogspot.com/_9ZfLzIk1dQU/SrZY8GTP0OI/AAAAAAAAADU/X6336X6aEig/s200/hard-drive-512858811_a37319286c.jpg" alt="" id="BLOGGER_PHOTO_ID_5383588194074743010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"There are two kinds of hard drives: those that have failed, and those that will."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A week ago I fired up my home desktop machine, waited, and got nothing but a blank, black screen staring back at me.  I didn't have another monitor on hand to test it, and no way to diagnose the problem.  I assumed the worst: it was a failed hard drive.  I unplugged all the peripherals, loaded the box into my car, and took it to a local computer shop to be triaged.&lt;br /&gt;&lt;br /&gt;I had to wait a &lt;span style="font-style: italic;"&gt;whole week&lt;/span&gt; just to hear what the problem was, because I had several machines in the queue ahead of me.  I was able to sneak some time on my oldest daughter's Macbook during that dry season, but it was painful.  All my development tools (e.g., IntelliJ, databases, Grails, etc.) were on my desktop.&lt;br /&gt;&lt;br /&gt;I got my machine back yesterday.  I started to think that it wasn't a hard drive problem, and fortunately I was correct.  Diagnostics showed that memory and hard drive were both fine.  My 5 year old monitor gave up the ghost.  So I picked up my machine, turned in the dead monitor, and bought a 22" one for just $149.  Not too bad.&lt;br /&gt;&lt;br /&gt;I'm not that crazy about the place that repaired the machine.  When I called to ask the prognosis, the kid told me that everything was fine, but my anti-virus software found "a bunch of viruses".  He said he could run the cleanup for a mere $118.  I politely declined, but I almost blew my stack: "Are you kidding me?  What are you going to do, stand there and watch Kaspersky do the clean-up?  How can you quote me that figure with a straight face?"  If you look at what Kapersky is identifying, you see that it points out things like denial of service possibilities for the Java JDK that I'm using.  That's not a "virus", and I wouldn't want the software to be removed.&lt;br /&gt;&lt;br /&gt;The machine had dust in it when I picked it up.  When I complained that the kid should have at least blown it out before servicing it, I was told that cleaning is another for-fee service.  What a business.&lt;br /&gt;&lt;br /&gt;So I brought the whole thing home, vacuumed it out, and set up the new monitor.  I spent some time trying to finally sort out my backup and recovery problem.  I've had scheduled Microsoft backups for a long time, but they aren't complete disk images.  I bought a 250GB Passport external hard drive to replace the undersized 140GB one I had.  Now I could copy my entire hard drive if I wanted.  I found an inexpensive disk imaging suite called &lt;a href="http://www.acronis.com/"&gt;Acronis &lt;/a&gt;and set up a nightly backup.  I had my entire hard drive on my Passport this morning, compressed into 15 neat 4GB files.  I think I'll buy a license.&lt;br /&gt;&lt;br /&gt;Just one last problem: How to you boot a PC without the hard drive when you don't have one of those ancient floppy drives?  The answer is a USB key, of course.  I started creating a bootable USB key, following the instructions from Greg Schultz at &lt;a href="http://articles.techrepublic.com.com/5100-10878_11-6160062.html"&gt;this link&lt;/a&gt;.  I was almost done when I ran into another roadblock: I needed the Windows XP Professional installation CDs, but HP didn't give me any when I bought this machine five years ago.  Where was I going to get a copy of Windows XP Professional, now that they don't sell or support it and we've moved through Vista to Windows 7?  E-Bay, of course.  I put in a bid last night and won at $70.  It should arrive next week, and I'll be able to boot from a USB key next time I have a problem.  I'll be able to diagnose any problems that I run into, and I'll be able to restore any failed hard drives from my backup.  Brilliant!&lt;br /&gt;&lt;br /&gt;I'm happy to spend some time thinking about this issue.  I realize now how central the stuff I've got on my machine is to my life.  I use a password generator to create passwords now.  I can't possibly remember them, so I keep them in an encrypted vault called Keeper from &lt;a href="http://www.callpod.com/products/keeper"&gt;Callpod&lt;/a&gt;.  If I can't access it, I can't do on-line banking or pay my daughter's fee bill at university.&lt;br /&gt;&lt;br /&gt;I have a drawer and albums filled with photos from our film camera days.  If my hard drive crashes, I'll lose all those digital snaps I've got.  Until I get into the habit of keeping them in the cloud, there's a significant memory loss if that disk drive head touches the spinning disk.&lt;br /&gt;&lt;br /&gt;There's just one catch: How do you test this arrangement?  I'd like to know that I can recover without any issue, but I don't know how to prove it.  I don't want to wait until the next failure to find out if any of this is worthwhile.&lt;br /&gt;&lt;br /&gt;We all need to think harder about our recovery plans.&lt;br /&gt;&lt;br /&gt;My next thought will be about networked storage.  I can buy a terabyte monstrosity to house all my whole family's data, but I'll want it attached to my network so everyone can see it.  And I suppose I'll need to buy two, so I can backup the backup.  And I should take the backup of the backup to my safety deposit box once a month so it'll be there in case my house burns down.  Geez, where does it end?  Someone with a more apocalyptic vision would be building a hardened data center to go along with the fully-stocked, armed to the teeth underground bunker in the back yard.&lt;br /&gt;&lt;br /&gt;Here's another interesting question: When a new desktop would cost me a mere $500-600, why would I not just toss this relic and buy a new one?  It's easy to calculate the cross-over point when this becomes a fool's errand.  What did I buy yesterday?  New monitor, a larger external hard drive, a USB key devoted to booting, backup and recovery software, and Windows XP Pro CDs.  The total is a significant fraction of the cost of a new machine.&lt;br /&gt;&lt;br /&gt;Am I an eejit to keep this machine going?  I've written about &lt;a href="http://craicpropagation.blogspot.com/2009/03/living-moores-law.html"&gt;Moore's Law&lt;/a&gt; in our lives.  This is the third desktop machine I've bought for home use, and it's the first one that wasn't hopelessly outdated by the time it passed its fifth anniversary.  It's a dual core machine with 4GB of RAM and a hard drive that's still only half full.&lt;br /&gt;&lt;br /&gt;While I'm mulling over my economic trade-offs, I'm glad to have all my data and my familiar development environment back.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://stackoverflow.com/users/flair/37213.js?theme=clean" type="text/javascript"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-3059817637152294552?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/3059817637152294552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=3059817637152294552' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3059817637152294552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/3059817637152294552'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2009/09/back-from-dead.html' title='Back From The Dead'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_9ZfLzIk1dQU/SrZY8GTP0OI/AAAAAAAAADU/X6336X6aEig/s72-c/hard-drive-512858811_a37319286c.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-8728050605709006209</id><published>2009-08-29T13:15:00.004-04:00</published><updated>2009-08-29T14:47:47.050-04:00</updated><title type='text'>Back To Ireland</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9ZfLzIk1dQU/Spli7XZOQLI/AAAAAAAAACs/B30NVPYhLMw/s1600-h/DSC01909.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_9ZfLzIk1dQU/Spli7XZOQLI/AAAAAAAAACs/B30NVPYhLMw/s200/DSC01909.JPG" alt="" id="BLOGGER_PHOTO_ID_5375436402275008690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;My wife and I recently returned from a week's visit to Ireland.  It was her second trip and my third.  We went to visit a dear old friend that we hadn't seen since 2003.&lt;br /&gt;&lt;br /&gt;We weren't planning any big trips this summer.  Our youngest daughter is still in the midst of undergraduate studies.  The US dollar is weak compared to the euro.  I thought our plans would be no more elaborate than perhaps a week in Ogunquit ME.&lt;br /&gt;&lt;br /&gt;But if the American economy isn't doing very well, the Irish situation might be worse.  Their housing bubble has popped.  They still depend on tourism to bring currency into the economy.  One night my wife noticed that air fares on Aer Lingus were ridiculously low.  Could we consider a trip, just the two of us?  Erin was taking two organic chemistry courses this summer, so she couldn't join us.  Meg was in New York City, looking for a job.  We could leave the dog at home with Erin and take off without children for the first time since we had them.  We called our friend to check his plans and booked the flight.&lt;br /&gt;&lt;br /&gt;We flew out of Boston instead of New York.  There's a shuttle to Logan Airport on the Mass Pike that's simply brilliant.  You leave your car in a fenced lot for a week and don't have to fight the traffic in and out of the city.&lt;br /&gt;&lt;br /&gt;The flight couldn't have been smoother.  We took off at 6 PM on an Airbus A330 and arrived at 5:45 AM the next morning.  There was little or no turbulence at 40,000 feet.  The plane had individual screens for each passenger built into the back of the seat in front, with a nice choice of movies.  The food was even good!  I didn't sleep at all, but then I can never sleep on airplanes.  When we arrived in Dublin the car rental counter wasn't even open.  We had to wait until someone came at 6 AM.  We were given a Ford Fiesta with a manual transmission.  It's a small car - we couldn't fit two black bags in the rear, so one had to go into the back seat.&lt;br /&gt;&lt;br /&gt;Driving on the left side was no problem; neither was shifting with my left hand.  The gas, brake, and clutch pedals are arranged exactly as they are in American cars, so I didn't have to adjust too much.  But I could never live in Ireland, because driving there all the time would kill me.  The roads are too narrow; there are walls on either side; there are twists, turns, hills, and bushes that prevent you from seeing more than a few feet ahead.  Every time a truck came at us I was gripping the steering wheel and holding my breath. &lt;br /&gt;&lt;br /&gt;It's about a two hour drive south and west of Dublin to get to our friend's house. Thank God we had precise, detailed directions, because his house is in the middle of a bog between two small towns named Mullingar and Delvin.  We arrived without mishap at around 7:45 AM.  No one was stirring so we sat in the car, resting and reading.  We got extra points for arriving without having to resort to rescue call.&lt;br /&gt;&lt;br /&gt;It was wonderful to see our friend.  It was a quiet, unscheduled visit that alternated quiet days spent hanging around with excursions out.  On the quiet days we'd eat breakfast, read the paper or books, go for walks, sit in front of fires, and talk. &lt;br /&gt;&lt;br /&gt;We went into Dublin one day and had a wonderful time.  We were all dressed to the nines for a night at the Gate Theater.  We had lunch and did some shopping in the afternoon.  We had high tea at the &lt;a href="http://www.merrionhotel.com/"&gt;Merrion Hotel&lt;/a&gt;, which is a five-star establishment that lived up to its reputation.  The service, food and atmosphere were impeccable.  We saw a revival of Noel Coward's "Present Laughter" that was terrific.  &lt;br /&gt;&lt;br /&gt;Maureen and I went alone to Kilkenny.  The 2.5 hour drive was stressful, but we managed.  We had lunch, shopped, and toured Butler Castle.  The Kilkenny Arts Festival ended the day before, but we were still able to tour one of the galleries. &lt;br /&gt;&lt;br /&gt;Our last day out was to a nearby abbey whose first buildings were erected around 650 AD.  Houses in America with plaques indicating that they were built in the 1700s appear old, but that's nothing compared to stone houses in Europe.&lt;br /&gt;&lt;br /&gt;Our flight back was even smoother than the one that brought us to Ireland.  It was another Airbus A330 (sorry, Boeing).  Logan Airport is a first-rate operation.  We arrived early, got through customs in 20 minutes, waited not more than five minutes for our bags, and got right onto the shuttle to take us back to our car. &lt;br /&gt;&lt;br /&gt;This vacation was a lesson in not putting things off forever.  We all assume that we'll go "next year" when we think about opportunities like this one, but you never know if the chance will pass you by.  I was so happy to reconnect with my friend.  Phone calls and e-mail are nice, but there will never be a substitute for face-to-face contact.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://stackoverflow.com/users/flair/37213.html?theme=clean" marginwidth="0" marginheight="0" scrolling="no" width="210" frameborder="0" height="60"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6367023863906450017-8728050605709006209?l=craicpropagation.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craicpropagation.blogspot.com/feeds/8728050605709006209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6367023863906450017&amp;postID=8728050605709006209' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/8728050605709006209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6367023863906450017/posts/default/8728050605709006209'/><link rel='alternate' type='text/html' href='http://craicpropagation.blogspot.com/2009/08/back-to-ireland.html' title='Back To Ireland'/><author><name>Michael Duffy</name><uri>http://www.blogger.com/profile/10095335205263095695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9ZfLzIk1dQU/Spli7XZOQLI/AAAAAAAAACs/B30NVPYhLMw/s72-c/DSC01909.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6367023863906450017.post-8910957956181060101</id><published>2009-06-21T14:30:00.003-04:00</published><updated>2009-06-21T15:05:26.757-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Godot Beckett Broadway literature Roundabout Theater'/><title type='text'>Waiting For Godot</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9ZfLzIk1dQU/Sj58SA7123I/AAAAAAAAACk/mU5AqBJ3NIE/s1600-h/waiting-for-godot-190638666_d412d2bf25_m.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_9ZfLzIk1dQU/Sj58SA7123I/AAAAAAAAACk/mU5AqBJ3NIE/s200/waiting-for-godot-190638666_d412d2bf25_m.jpg" alt="" id="BLOGGER_PHOTO_ID_5349850056293210994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;_uacct = "UA-4114468-1";&lt;br /&gt;urchinTracker();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;When my wife asked me what I wanted for Father's Day I didn't hesitate: "I want to go to see 'Waiting For Godot' in New York".  It's playing at the Roundabout Theater on West 54th Street through 12-July and stars Nathan 
