tag:blogger.com,1999:blog-63670238639064500172024-03-05T11:47:33.646-05:00Craic PropagationMichael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.comBlogger123125tag:blogger.com,1999:blog-6367023863906450017.post-61277194557701918532014-05-26T11:21:00.000-04:002014-05-26T11:21:31.227-04:00Gateway Drugs<!-- jQuery --> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <!- MathJax --> <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <!-- Google translate --> <div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --> <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis5wOfwyKYVqI4Qd58Mjg14umvYjZWMQ3s1JORdF19IhmhYGPO3mxjMddFvPv3H4lUwRmrz_axpRv8sLKCua4dCzIYi6Rr_AdCrVCUlC5xcaWYnSURwDf_gQFPzUducrlBtok0dyTpBk2m/s1600/gateway-2000.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis5wOfwyKYVqI4Qd58Mjg14umvYjZWMQ3s1JORdF19IhmhYGPO3mxjMddFvPv3H4lUwRmrz_axpRv8sLKCua4dCzIYi6Rr_AdCrVCUlC5xcaWYnSURwDf_gQFPzUducrlBtok0dyTpBk2m/s320/gateway-2000.jpg" /></a></div><br />
In the summer of 1993 I taught my first graduate course at Rensselaer in Hartford. It was the math course required for all incoming mechanical engineers in pursuit of a Masters degree. I had gotten my Ph.D. a year earlier. I thought this would be a good way to find out if I could teach. I was a placeholder for a friend who taught the course on a regular basis. He didn't want to teach summer school; he didn't want to give up the spot. He asked me if I'd be his proxy, knowing that I'd willingly give it up when the fall rolled around.<br />
<br />
The course went well. It was hard work. I created all my own notes from scratch. Sometimes they worked out. Other nights I'd go home wondering what I was thinking. The homework was a good guide: if their responses went off the trail, it meant that I'd led them there.<br />
<br />
At the end of the course I got a nice check as adjunct faculty. The money was burning a hole in my pocket. I had another objective besides exploring my suitability for tenured professor-ship: I wanted to buy my first personal computer. I'd spent my career working with and programming computers for engineering analysis. These were usually Unix workstations from Sun Microsystems - powerful machines for the time, probably less than the iPhones of today. What would I do with a personal computer running Windows 3.1?<br />
<br />
I excitedly called <a href="https://www.youtube.com/watch?v=N5HGhZaLUMc">Gateway 2000</a> to place my order. I don't remember the specs anymore. I know it had a 3.5" floppy drive. I believe it had a CD ROM drive. The processor might have been the Intel Pentium. I'm fuzzy on the hard drive and RAM: 100MB and 2MB, respectively? In any case, it wasn't much. It has Microsoft Word running on it. I wanted to program, but I didn't know Basic. I got ahold of a Pascal compiler, which was the closest thing to FORTRAN I could find. I found it frustrating to try and do any serious calculations on it. As a result, it sat idle most of the time.<br />
<br />
I finally hit upon a use that would force me to sit down to use the machine daily: I started keeping an electronic journal on this day 20 years ago. I wrote most days for many years: a lot at first, less as time went on. I've had a few stretches where the thread was broken and I didn't write for months at a time. But I've never let it die off entirely.<br />
<br />
It's interesting to go back and read it now. Some of the entries are detailed and wonderful. Happy times either aren't documented because I'm in the midst of them and can't be bothered writing, or preserved after the fact. I used it as therapy when things were troubling me. Those can be difficult.<br />
<br />
My equipment has improved a great deal over time. It's possible to do incredible things nowadays. We're awash in computing power, software, and data. It's fun to reflect on how far we've come in a very short time.<br />
<br />
<br />
<!-- Stackoverflow.com flair --> <a href="http://stackoverflow.com/users/37213/duffymo"> <img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> </a> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com2tag:blogger.com,1999:blog-6367023863906450017.post-67538821495308968832014-05-03T11:11:00.000-04:002014-05-03T11:11:00.801-04:00Toastmasters Advanced Leader Bronze<!-- jQuery --> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <!- MathJax --> <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <!-- Google translate --> <div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --> <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMG2sP_68us6ZGkMVd9m2UMzyNvdA46OHnYY5NIycx8cxCx-ZDkDZEuVi8B6b7olru9C81caOecZzDhFrjLKVp7eMDrKzHRX9Bcx264jYoDJSg4h6EbZ6EZEF71AJYz2oO8Q2zloLZZLdD/s1600/advanced-leader-bronze.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMG2sP_68us6ZGkMVd9m2UMzyNvdA46OHnYY5NIycx8cxCx-ZDkDZEuVi8B6b7olru9C81caOecZzDhFrjLKVp7eMDrKzHRX9Bcx264jYoDJSg4h6EbZ6EZEF71AJYz2oO8Q2zloLZZLdD/s320/advanced-leader-bronze.jpg" /></a></div><br />
It's been a good year for Toastmasters. The fiscal year runs from 1-Jul through the following 30-Jun. During 2014 I've knocked off three designations: Advanced Communicator Silver, Competent Leader and Advanced Leader Bronze. A club earns the Distinctive Club designation by meeting 10 milestones. I'm 30% of a Distinguished Club all on my own.<br />
<br />
I haven't suddenly become a person of great energy and ambition. It's partly an accounting trick, like boosting sales for a particular quarter by forward or back dating other sales. The Advanced Communicator Silver was earned in this fiscal year. I prepared and presented 12 speeches to fulfill the requirement. The Leadership side of the house has been sadly neglected by me for years. I didn't know how it worked, so I never kept track even as I fulfilled the requirements. The Competent Leader can easily be had by diligently attending meetings and volunteering for roles. The Bronze Leader requires that you become a club officer. I did that a few years back, but never thought to get credit for it because I hadn't bothered with its predecessor.<br />
<br />
There are two hurdles left to becoming a Distinguished Toastmaster: Advanced Communicator Gold and Advanced Leader Silver. The former is "get a shovel stuff": prepare and deliver ten more speeches. If I can do it, I'll have written and delivered around 50 speeches since I first joined in 2008. The latter means I have to serve as area or division governor. I'm hoping to become area governor for the term starting on 1-Jul-2014. If I can manage it, I think I can achieve both by 30-Jun-2015 and become a DTM.<br />
<br />
I don't think this makes me the best speaker. I still have issues with formulating, rehearsing, memorizing, making it a performance. But there's never been fear. Some people fear public speaking more than death. I'm not one of them. <br />
<br />
There are only three DTMs in our club. I never would have guessed that I could be one of them. It'd feel good to achieve this milestone. Let's see what this year brings.<br />
<br />
<br />
<!-- Stackoverflow.com flair --> <a href="http://stackoverflow.com/users/37213/duffymo"> <img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> </a> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-84237594509718965902014-04-19T14:28:00.000-04:002014-04-19T14:28:00.200-04:00Rotator Cuff Update<!-- jQuery --> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <!- MathJax --> <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <!-- Google translate --> <div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --> <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtjXP7J_xOzYV0i2VsVb-4uj3-U_hv6yZlzDOT8zwwEW-Diq1KT0v7GK0C1bsnngNgOR5xBHsOKjCTiBoEAMAEWOKCy3dqBSfzU6hkjRAQB5v1I3sCR3NrfHqaXgLx9b3P6bwK-2GOVlwP/s1600/rotator-cuff-tear.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtjXP7J_xOzYV0i2VsVb-4uj3-U_hv6yZlzDOT8zwwEW-Diq1KT0v7GK0C1bsnngNgOR5xBHsOKjCTiBoEAMAEWOKCy3dqBSfzU6hkjRAQB5v1I3sCR3NrfHqaXgLx9b3P6bwK-2GOVlwP/s320/rotator-cuff-tear.jpg" /></a></div><br />
I had surgery on my left shoulder back in January. I thought I'd post an update in the hope that it might help some other middle aged person who's facing a similar situation. <br />
<br />
I hinted at the problem in my <a href="http://craicpropagation.blogspot.com/2013/12/another-year-looking-back.html">2013 retrospective</a>. I did my best to manage it as a chronic condition. I even went back to swimming, albeit at a greatly reduced effort, frequency, and intensity. But by the time my surgery date approached, I noticed that the muscles behind my left scapula felt markedly worse. I was grateful to be on the surgical calendar.<br />
<br />
It was the first time I've ever been under the knife. I tried to remain calm, but when they took my heart rate and blood pressure on arrival at the surgery center both were sky high. The anesthesiologist put some valium in the solution when they prepared me for the nerve block "to take the edge off". I found out later that I had fibrillation again when they intubated me. They were worried enough to send me to a cardiologist for an echo cardiogram after I returned home. All was well. It was fear!<br />
<br />
I was wheeled into surgery at 11:15 am. I believe it was 3:30 pm when I woke up in the recovery area. They found out that I had a bone spur on my collarbone that was abrading my labrum. Some time with power tools took care of everything. The nerve block worked wonders for 36 hours - I had no pain at all. I took the pain medication to stay ahead of it, but I hate taking pills. I weaned myself down to one at a time, then off completely after a few days. I never experienced any pain at all.<br />
<br />
I was in physical therapy the day after surgery. The exercises were little more than moving and stretching, but they were key for avoiding excessive scar tissue buildup and stiffness. I went to physical therapy faithfully three times a week and did the exercises on my own at home. At first they were difficult and frustrating. One of the worst was the 1 kg medicine ball. I had to put it on a spot on the wall at shoulder height, then rotate the ball about that point ten times in each direction, three times each. Those small muscles in my shoulder needed to control the ball simply weren't firing. I could barely keep the ball on the spot, and just a few reps left my shoulder exhausted. But I stayed with it, going so far as to order a ball of my own so I could do those exercises at home along with the hand weights.<br />
<br />
The physical therapist was terrific. He said there's a controversy in the field over when to start physical therapy. If the surgeon lacks confidence in his repair s/he's likely to recommend remaining in a sling and immobile for up to five weeks. The typical repair technique calls for drilling two holes in shoulder bone and inserting pins to hold the stitch and muscle to the bone. Pulling the pins out is catastrophic. My surgeon drilled all the way through the bone and looped the stitch through the holes. The only way to pull it out is to destroy the shoulder. The more reliable attachment, combined with arthroscopic minimally invasive cuts, made it possible to start on therapy right away.<br />
<br />
The therapy room was always filled. Old and young: the former because of long use and the latter from sports injuries. One afternoon I was doing my exercises next to a man my age who was struggling with a range of motion exercise that I'd endured eight weeks earlier. "What are you here for?" I asked. He'd had his elbow repaired. When I told him I'd had my rotator cuff fixed, he said "I had that done last year by another surgeon. I was in a sling for five weeks; I couldn't drive for five weeks; I slept in a recliner for five weeks. I started physical therapy after discarding the sling and endured it for six months, and <i>it's still not right</i>. You look like you're doing pretty well." His eyes popped out of his head when I told him I'd had my procedure just eight weeks ago.<br />
<br />
I was in a sling for ten days. I was driving once I left it behind. I started on physical therapy the day after. Seven weeks after surgery did my first lengths in a pool. I was discharged after eleven weeks and feel almost 100%. I'm still doing the exercises on my own at home once or twice a day. I'm working my way back to regular swimming, including Masters. I'm back out on the road running and feeling good.<br />
<br />
So if you're reading this and considering a procedure, take heart. It's possible to come back. I'm on my way. <br />
<br />
<!-- Stackoverflow.com flair --> <a href="http://stackoverflow.com/users/37213/duffymo"> <img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> </a> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-82196713592134940002014-04-12T14:15:00.002-04:002014-04-12T14:16:06.968-04:00Heartbleed and Passphrase<!-- jQuery --> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <!- MathJax --> <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <!-- Google translate --> <div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --> <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgubkw1NusXo-BJB-qIaiMQruCN5vcQaa9oZKcTocZBNXj5mmnF0X9yWJ1rVOnsph2QbpiYmUYKq6uwuYkwsHsJ8OsLj_xo1xG9JLe0HulsOOZYxZ_JbVS3J0Oxgvj3RDMm3MYBCIaeGm8r/s1600/heartbleed.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgubkw1NusXo-BJB-qIaiMQruCN5vcQaa9oZKcTocZBNXj5mmnF0X9yWJ1rVOnsph2QbpiYmUYKq6uwuYkwsHsJ8OsLj_xo1xG9JLe0HulsOOZYxZ_JbVS3J0Oxgvj3RDMm3MYBCIaeGm8r/s320/heartbleed.jpg" /></a></div><br />
The news has been filled with stories about <a href="http://whtc.com/news/articles/2014/apr/09/heartbleed-bug-in-web-technology-seen-as-major-threat-to-user-data/">Heartbleed</a>, a flaw in OpenSSL that puts web sites and information at risk. We're told to change passwords immediately.<br />
<br />
What a pain! I've got usernames and passwords all over the web. Changing all of them, keeping track, and remembering later will be incredibly difficult. The Internet has a <a href="http://www.buzzfeed.com/charliewarzel/the-internet-has-a-password-problem">password problem</a>. I can't wait until I have my own quantum cryptographic key generator so I don't have to remember. <br />
<br />
So what to do? I came across a nice site called <a href="http://world.std.com/~reinhold/diceware.html">Diceware</a> that spells out a recipe for generating pass phrases. I have a backgammon board in the house, which means that I have four dice handy at all times. But a fifth? I can't use the doubling cube very easily, can I? The idea of manually rolling dice to generate a key, going to the <a href="http://world.std.com/~reinhold/diceware.wordlist.asc">wordlist </a> to look up a word, and recording that pass phrase for a given site seems like too much work, too many steps. So low tech! <br />
<br />
Being a computer programmer, I'd rather spend a day coding a solution to a problem that would take five minutes to do by hand. So that's what I started working on last night. I finished it today and uploaded the result to a <a href="https://github.com/duffymo/passphrase-generator">Github repository</a>. It includes the source code for two Java classes: <code>Die</code> (a six-sided die that uses a random number generator to produce rolls) and <code>PassphraseGenerator</code> (a command line app that generates a random pass phrase using the Diceware recipe), the Diceware word list, and an executable JAR that makes execution in a command shell easy.<br />
<br />
This exercise recalled the wonderful xkcd comic about <a href="https://xkcd.com/936/">password strength</a>. I always loved the entropy calculation that gave a measure of password strength, so I incorporated the calculations into my application. I also gave a way to calculate the entropy of a given pass phrase using command line arguments. The first argument is the pass phrase, surrounded by double quotes if it contains spaces, and the second is the alphabet size used to generate the pass phrase. I've been using simple pass phrases on my work computer for years now. I put the one that I currently use in to see what its entropy was. It has 42 bits of entropy. At 1000 guesses per second, it would take 241 years to crack if my calculations are correct. <br />
<br />
It was a fun and fruitful exercise. It made me happy, like my <a href="http://craicpropagation.blogspot.com/2011/03/mandelbrot-set.html">Mandelbrot solution</a> from a few years back. I need to do more of that.<br />
<br />
The last remaining problem is that most sites have ridiculous rules for passwords (e.g. "between 8 and 15 characters; must include one capital, one number, one special character") that actually make them weaker and harder to remember. I'd much rather generate some four word pass phrases and use those!<br />
<br />
I'm struggling with software development lately. I'm trying to swallow a lot of new techniques. It makes me happy when I can solve a small problem like this once and for all. Uploading it to Github lends an air of permanence that I love: "Don't have to think about that problem anymore!"<br />
<br />
Maybe that's the answer to all hard software problems: Decompose the big problems into lots of small ones that you can solve and upload to Github. Solve and forget that problem, make yourself happy, and move on to the next.<br />
<br />
<br />
<!-- Stackoverflow.com flair --> <a href="http://stackoverflow.com/users/37213/duffymo"> <img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> </a> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-89158633107283798682013-12-31T17:07:00.003-05:002013-12-31T17:12:14.128-05:00Another Year Looking Back<!-- jQuery --> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <!- MathJax --> <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <!-- Google translate --> <div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --> <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggf3AP2DI5lRQoYFaDwe6mBAiSsEAO7lXQxX1jTx_NBC0zFDydwbEQQ_p1R8-EFX7HGWZ4Gr4dts21-60rLGNM-9tEf4VihfgTlyW6gCbiw_gPQEKjHkj3fsujEr1BX21OQ8VjwZj9iltC/s1600/new-years-eve-2013.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggf3AP2DI5lRQoYFaDwe6mBAiSsEAO7lXQxX1jTx_NBC0zFDydwbEQQ_p1R8-EFX7HGWZ4Gr4dts21-60rLGNM-9tEf4VihfgTlyW6gCbiw_gPQEKjHkj3fsujEr1BX21OQ8VjwZj9iltC/s320/new-years-eve-2013.jpg" /></a></div><br />
Goodness, has another year gone by already? I've written a couple of these retrospectives, including last year's effort. I was feeling pretty good after finishing my first half marathon. I had logged 313 miles on roads and trails, the best running total I've ever had. I swam 243,000 yards - subpar compared to my average 346,000 per year, but I was happy about learning how to run again. I had every intention of running another half marathon in 2013 and perhaps trying my hand at a full marathon. I had my training plans all set. I signed up for a half in Simsbury in June and planned to re-enter the Hartford Marathon again in October.<br />
<br />
Unfortunately, I hit a couple of snags.<br />
<br />
I was swimming an IM set during the second week of January when my left shoulder started hurting me. I'm not sure, but I think I was splitting a lane with another swimmer. I remember ticking the lane marker with my left hand when my left arm recovered over the water. Is that when it happened? I tried again the next day and found that it was still sore. I stopped swimming butterfly for 4-6 weeks before trying it again in Mar. I couldn't even complete a length: my shoulder was hurt. I went to see my general practitioner about it. When I told him I did it swimming butterfly he said "Are you crazy? A guy <i>your</i> age shouldn't be swimming that stroke!" He suggested that I had a partial tear in my rotator cuff. He said he could spare me a bunch of co-pays at the physical therapist by recommending rubber band exercises to build up my shoulder. <br />
<br />
I was doing fine until I went out into the yard in April to clear some brush. I started experiencing pain in my neck and numbness in my left thumb. I've had cervical spine issues before: C6-C7 disk bulging caused incessant pain in my right shoulder, down to my elbow. This time the symptoms suggested C5-C6 disk problems. I resigned myself to a visit with an orthopedic surgeon. An MRI confirmed the initial diagnosis. It's not uncommon. It's likely that a random sampling of men my age would turn up several torn rotator cuffs.<br />
<br />
I've never had surgery before. I wanted to do all I could to avoid it this time, too. I went to physical therapy with the goal of managing it as a chronic condition. I gave them a tough task: they had to sort out my neck issues before tackling my shoulder, but I made enough progress to make it back into the pool in August. I decided that I wanted a second opinion, so off I went to another surgeon and physical therapy team. I heard something there that changed my view. The surgeon was an accomplished swimmer (far better than me) who understood my love of the water. At the first session the physical therapist said "If I had a condition that I knew could be sorted out, I'd want to take care of it." That flipped the switch for me. I did all the exercises and planned to add my name to the surgical calendar in 2014.<br />
<br />
So my totals weren't so impressive this year: 220 miles running, none longer than 8 miles; 131,000 yards swimming, my worst total by far since I started keeping track in 1996. I'd like to improve on both next year. It'll start by getting my shoulder sorted out. If it's a simple cleanup operation, I'll be immobile for a week or less. I'll be able to start on regaining full range of motion right away. If things are unstable, and stitches are required to make the shoulder stable again, I will be immobile for a longer period and the therapy will be more difficult. I'm optimistic for a good result. I feel good in the water now. I don't do butterfly anymore, but I can still do a modified version using the dolphin kick and alternating each arm. I don't know if I'll ever have that wonderful feeling again where I'm flying over the water. We'll see!<br />
<br />
One goal for the year was to dive into on-line courses and deepen my knowledge of statistics. I hit a home run there. I completed an intro statistics course at Udacity early in the year. I wanted to learn something and see if online courses suited me, so I didn't commit to a certificate. The next three courses at Coursera.org were a great success. I earned two certificates with distinction and have hopes of meriting a third. I loved the courses and learned a ton. I plan to add more in 2014.<br />
<br />
I had a great year reading, both technical and non-technical. It's not often that you can say you've discovered a favorite poet, but I did this year. Read Billy Collins' <a href="http://www.poetryfoundation.org/poem/176050">Aristole</a> for one reason why.<br />
<br />
I signed up for Twitter. I'm not sure that's a positive. It's a time sink, one that I cannot afford. I've spent too much time reading stuff that makes me laugh, think, and fume. I micro-blog and argue with trolls far more than I should. I rise to the bait easily. This is one habit that I hope I won't embellish in 2014.<br />
<br />
I'm grateful to still be working. It's a year-to-year thing nowadays. We're all temporary employees, all at the pleasure of our employers. The world seems less stable than it was when I was younger. <br />
<br />
I'm still married to the same wonderful woman. We're outliers by a long way.<br />
<br />
My children are both out on their own, laying the foundations for their adult lives. They're still within a car and train ride, which is a great thing. I love seeing them.<br />
<br />
My mother is still with us and doing well.<br />
<br />
I still have plenty of technical goals. I need to write more applications and dive deeper into data analysis. Bayesian analysis and multi-chain Monte Carlo are at the top of my book pile this year.<br />
<br />
I'm glad to still have that sense of optimism and anticipation at the turn of the calendar.<br />
<br />
<!-- Stackoverflow.com flair --> <a href="http://stackoverflow.com/users/37213/duffymo"> <img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> </a> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-85222757198044970552013-12-23T08:00:00.000-05:002013-12-25T11:11:39.660-05:00Favorite Poet<!-- jQuery --> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <!- MathJax --> <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <!-- Google translate --> <div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --> <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh00LuzIr2u_GMMIxlIH8vxFGxCb8Cem_-fWNnINJ5vGw1FaDkh3hCDfZp-_BAX48bN9DZ_zmgrzJOwGUbCPeKmf_wLgbvk8m6ny8cXWH0MwK630vuqI0AGC3xUkNIpCUeScJPMcahbBRrl/s1600/billy-collins.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh00LuzIr2u_GMMIxlIH8vxFGxCb8Cem_-fWNnINJ5vGw1FaDkh3hCDfZp-_BAX48bN9DZ_zmgrzJOwGUbCPeKmf_wLgbvk8m6ny8cXWH0MwK630vuqI0AGC3xUkNIpCUeScJPMcahbBRrl/s320/billy-collins.jpg" /></a></div><br />
I love to read, but poetry has never been my favorite. I've dipped my toe in the water, but I've never dived in with gusto.<br />
<br />
I had a great AP English teacher in high school who fanned the embers of my love of reading into a roaring blaze. He seemed to have read <i>everything</i>. Whenever he'd recommend something I'd run to the library and devour it. More often than not he was right. Why else would I have read the Studs Lonigan trilogy? (Go get it - it's great.)<br />
<br />
But he couldn't duplicate the trick for poetry. He taught us about different meters. I remember iambic pentameter and Robert Frost snippets, but little else. I confuse the names with guitar scales: "Did Shakespeare use mixolydian, or was that Stevie Ray Vaughn?"<br />
<br />
My indifference to poetry persisted until one Saturday morning when I was out and about with the dog, listening to "Wait Wait, Don't Tell Me!" on NPR. The guest was <a href="http://www.amazon.com/s/ref=nb_sb_ss_c_0_12?url=search-alias%3Dstripbooks&field-keywords=billy%20collins&sprefix=billy+collin%2Caps%2C194">Billy Collins</a>. He was so entertaining to listen to that I resolved to give his stuff a try. My local library had a copy of his <a href="http://www.amazon.com/Sailing-Alone-Around-Room-Selected/dp/0375755195/ref=sr_1_3?s=books&ie=UTF8&qid=1387426938&sr=1-3&keywords=billy+collins">"Sailing Alone Around The Room"</a>. It's the best poetry I've ever read: beautiful, not dry or boring, modern and fresh. I can't stop reading the guy. I take a few in every day, re-reading the ones that I like. I've read them aloud to my wife, because they demand to be given voice the way great songs have to be sung. Poems that I <i>like</i>! I'm astonished at the thought.<br />
<br />
<!-- Stackoverflow.com flair --> <a href="http://stackoverflow.com/users/37213/duffymo"> <img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> </a> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-81555468765200219702013-12-18T23:19:00.001-05:002013-12-18T23:19:25.771-05:00Best Coursera Yet<!-- jQuery --> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <!- MathJax --> <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <!-- Google translate --> <div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<!-- Put content here, Michael --> <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ8YBK_0xbI2uum33UfPVELMrwn4UxLefpOoDsGDLq6Ss1PrRbqmPAxfyqiYy_FC8mXtifWKu83lYAHoJbbw6nqGrl8Zy-sk6xLYz2DuDSeUrs4BGiIr1TUQJc3DvppHSFyIFCbc65lJX1/s1600/data-analysis-logo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ8YBK_0xbI2uum33UfPVELMrwn4UxLefpOoDsGDLq6Ss1PrRbqmPAxfyqiYy_FC8mXtifWKu83lYAHoJbbw6nqGrl8Zy-sk6xLYz2DuDSeUrs4BGiIr1TUQJc3DvppHSFyIFCbc65lJX1/s320/data-analysis-logo.jpg" /></a></div><br />
I finished my third Coursera course tonight: Data Analysis, eight weeks of learning R and its application to statistics problems. I've enjoyed all three, but this one topped them all. It was a difficult eight weeks. I spent a lot of hours at night after work and weekend time poring over assignments. It's been tiring but worth it. I've remembered the statistics I'd forgotten, learned a lot of new things like generalized linear models, and deepened my knowledge of R. It's exactly what I set out to accomplish when I started taking on-line classes a year ago at this time. I wanted to see if I could adapt to a new style of learning and self-education. I wanted to prove that I could still absorb challenging material. I'm at an age when it's easy to sit back and tell yourself that you already know it all, that you're too old a dog to learn new tricks. Did I still have it in me? I think I succeeded on all counts.<br />
<br />
The professor was Jeff Leek, who's on the faculty of the Johns Hopkins biostatistics department. They claim to be pre-eminent in the world, and after sitting through this course I believe them. His graduate students are fortunate.<br />
<br />
I've earned certificates with distinction for the two other classes I've taken. I calculated my point totals for quizzes and assignments for 'Data Analysis'. I think I squeezed out another distinguished certificate. I'll have to wait a week or two to see if my numbers match those from Coursera, but I'm confident that it'll turn out well.<br />
<br />
I've got a lot of other tasks lined up. I want to take more of these classes next year, but I'm uncertain about what to take. I want to go further with R and statistics, but there's no clear choice listed in the catalog. I might start haunting Kaggle.com and applying these new skills to problems. I've got some development tasks to get back to. <br />
<br />
I found out that I'm two speeches away from achieving the Toastmasters Advanced Leadership Bronze designation. I'll fulfill those easily in the next few weeks. That would be three awards in one fiscal year. I'll only have ten speeches to achieve Advanced Communicator Gold and the Advanced Leadership Silver to become a Distinguished Toastmaster. Who would have thought it'd culminate in this when I started in 2008? Maybe I can do it by mid 2015.<br />
<br />
I plan to relax a bit over the holidays. It's been a nice way to end the year.<br />
<br />
<br />
<!-- Stackoverflow.com flair --> <a href="http://stackoverflow.com/users/37213/duffymo"> <img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> </a> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-87850561553409322122013-11-10T21:24:00.001-05:002013-11-10T21:24:05.586-05:00More Progress<!-- jQuery --> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <!- MathJax --> <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <br />
<!-- Google translate --> <div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><br />
<script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --> <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUUR2Bn24uFS3-g2fzYzcCnuQpPJmKdnWHLi1BmHQxNK0I4nGuAAUOE6Y6u6UwGHWRyFVIliQC_4h4oEcodFzbIGRwK0wOIRRbi0IZ85Sbecx0t1old6fFv4EK0te9OZr_hlCBs-fy9BR2/s1600/data-analysis-logo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUUR2Bn24uFS3-g2fzYzcCnuQpPJmKdnWHLi1BmHQxNK0I4nGuAAUOE6Y6u6UwGHWRyFVIliQC_4h4oEcodFzbIGRwK0wOIRRbi0IZ85Sbecx0t1old6fFv4EK0te9OZr_hlCBs-fy9BR2/s320/data-analysis-logo.jpg" /></a></div><br />
I received the certificate with distinction for <a href="http://craicpropagation.blogspot.com/2013/10/another-one-bites-dust.html">Coursera Data Analysis Using R</a> tonight. I know it shouldn't matter, but it does to me. I want to hold myself accountable and keep pressing with these courses.<br />
<br />
<a href="https://www.coursera.org/course/dataanalysis">Data Analysis</a> has completed its second week. I'm in the midst of the first data analysis assignment. I have more work to do on it, but I think it's going well. I have a plan of attack that I'm following. I think the writeup portion plays to my strength. I'm slowly becoming more comfortable with R. I need to be reading more statistics books to figure out how to attack problems better.<br />
<br />
Toastmasters is moving along, too. I finally completed the Competent Leader designation. I also finished the requirements for Advanced Communicator Silver designation. Just Gold to go, then two more leadership tracks to become a Distinguished Toastmaster. I don't know if I'll manage the leadership portion, but the speaking track is well within reach.<br />
<br />
But wait - there's more.<br />
<br />
I still have to master user interfaces with HTML5, CSS3, JavaScript, and jQuery. <br />
<br />
And now there's <a href="http://vertx.io/">vert.x</a>, the non-blocking IO framework for Java. <br />
<br />
So much to learn, so little time.<br />
<br />
<!-- Stackoverflow.com flair --> <a href="http://stackoverflow.com/users/37213/duffymo"> <img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> </a> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-47994781902820769162013-10-22T07:25:00.001-04:002013-10-22T07:25:50.090-04:00Another One Bites The Dust<!-- jQuery --> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <!- MathJax --> <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <!-- Google translate --> <div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --> <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbLh4Q3xzAVsHmxurSoXPu64uYgvoYQXUrOs9ywkQ_Z2rusLCX6yXy0YYoj4t89StIUWVg-Z7z1KZm0xmdvTFnOPxtMNNZo5awTGKciHeMMBjphOhrXfnv0quEFdHiLB-wN3e529uXawj4/s1600/data-analysis-using-r-logo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbLh4Q3xzAVsHmxurSoXPu64uYgvoYQXUrOs9ywkQ_Z2rusLCX6yXy0YYoj4t89StIUWVg-Z7z1KZm0xmdvTFnOPxtMNNZo5awTGKciHeMMBjphOhrXfnv0quEFdHiLB-wN3e529uXawj4/s320/data-analysis-using-r-logo.jpg" /></a></div><br />
<br />
I just finished my second Coursera course. It's hard to believe that "Data Analysis Using R" started <a href="http://craicpropagation.blogspot.com/2013/09/computing-for-data-analysis-using-r.html">just four weeks ago</a>. <br />
<br />
This wasn't a terribly difficult course, but lecture time added up. The assignments weren't hard conceptually, but I found myself struggling with the API and the docs. "How do I do that?" was a common question. It was easy to think how I'd do something in a language that I knew better, like Java or Python, but I wasn't always able to conjure up the R equivalent at will. I had to do small experiments on the fly to figure out how to make the language do my bidding. <br />
<br />
The third programming assignment set was time-consuming. I was behind the eight ball because I was out of town at a family wedding the weekend before it was due. Thankfully we were given an allotment of late days that we could apply as needed. I used up three of them after returning from MN so I could get the assignment in late without penalty.<br />
<br />
Debugging in the R environment is crude, reminiscent of the gbd command line debugger that comes with Java. It's a comedown for a person who's used to using the <a href="http://www.jetbrains.com">best IDEs in the world</a> to work with Java and Python. I started using the R plugin for IntelliJ for the fourth assignment. I hope they keep expanding and improving it. <br />
<br />
R does have some rudimentary object-oriented features, but it's firmly in the functional camp. A friend pointed out that R looks similar to JavaScript. As usual, he's right. I started eschewing the '<-' assignment notation in favor of '=' to make the visual resemblance stronger. The Renjin interpreter makes it possible to run R inside Java. I found out that you can also run <a href="http://cran.r-project.org/web/packages/gputools/index.html">R on CUDA</a>. I'm looking forward to trying those packages and seeing what performance benchmarks would look like.<br />
<br />
This one was a sprint. The next one, <a href="https://www.coursera.org/course/dataanalysis">"Data Analysis"</a>, will emphasize problems that R is used for, diving deeper into regression and analysis. I'm looking forward to getting back in touch with my mathematics roots. It begins next Monday.<br />
<br />
<br />
<!-- Stackoverflow.com flair --> <a href="http://stackoverflow.com/users/37213/duffymo"> <img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> </a> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-81933462359397159012013-09-23T21:14:00.000-04:002013-09-24T19:07:59.012-04:00Computing For Data Analysis Using R<!-- jQuery --> <br />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <br />
<!- MathJax --> <br />
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <br />
<!-- Google translate --> <br />
<div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><br />
<script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --> <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizJk2cTKjy-QIBtVRjZeRFbERchn2N9dSU4kGvdCDwqYG8d1J9s1CB5vBrTxco-RU_NT0oE0jdaoD90a2_T95aPIkog2nt69_mRg1YTw4eG71EXGh_EL-YHMk6oL9OsB7dtzG6qf2U83C0/s1600/data-analysis-using-r-logo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br />
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizJk2cTKjy-QIBtVRjZeRFbERchn2N9dSU4kGvdCDwqYG8d1J9s1CB5vBrTxco-RU_NT0oE0jdaoD90a2_T95aPIkog2nt69_mRg1YTw4eG71EXGh_EL-YHMk6oL9OsB7dtzG6qf2U83C0/s320/data-analysis-using-r-logo.jpg" /><br />
</a><br />
</div><br />
I start the next step with <a href="https://www.coursera.org/">Coursera </a>tonight: It's opening night for "Computing For Data Analysis" from Roger Peng at Johns Hopkins University. It's a four week introduction to using R that should be good. He blogs at <a href="http://simplystatistics.org/">Simply Statistics</a>, which looks like it'll be a good resource for stretching my brain.<br />
<br />
I'm running on my Windows 7 desktop. I've downloaded the latest version of <a href="http://cran.us.r-project.org/">R 3.0.1</a>. There's an IDE called <a href="http://sourceforge.net/projects/tinn-r/">Tinn-R</a> that might be okay. I'm sure it won't replace <a href="http://www.jetbrains.com/idea/">IntelliJ</a> from <a href="http://www.jetbrains.com">JetBrains </a>as the world's greatest IDE. Until those brilliant Russians come up with an R environment for me I'll make do.<br />
<br />
My friend Steve Roach pointed out a port of R that runs on the JVM called <a href="http://www.renjin.org/">Renjin</a>. I think this statement is surprising:<br />
<br />
<blockquote>We built Renjin, a new interpreter for the JVM because we wanted the beauty, the flexibility, and power of R with the performance of the Java Virtual Machine.</blockquote><br />
My first thought was that it'll be hard to beat LAPACK in C or Fortran. But perhaps a version that leverages parallelism could tip the balance.<br />
<br />
So this will be sucking up some of my time and energy for the next four weeks. I hope the lessons diffuse into my brain quickly.<br />
<br />
<!-- Stackoverflow.com flair --> <br />
<a href="http://stackoverflow.com/users/37213/duffymo"> <br />
<img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> <br />
</a> <br />
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <br />
<script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-2199839800379297502013-08-23T20:23:00.000-04:002013-08-24T14:34:47.483-04:00A Good Reading Year<!-- jQuery --> <br />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <br />
<br />
<!- MathJax --> <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <br />
<br />
<!-- Google translate --> <br />
<div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><br />
<script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --> <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWW2SycC4tpVYUElIz1YHgSo9gxXE_EqXMMWSjoRjixHIdN7W8eVh0-OLoI6d2m8Y_cnajiqdF_Cyq6Ll4HtrW0ZoND-ygTPbZUKWRNG27-Nw3wmPurzcQdOtqKa-gMaN2tjOIhXIMI6iC/s1600/reading-books.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWW2SycC4tpVYUElIz1YHgSo9gxXE_EqXMMWSjoRjixHIdN7W8eVh0-OLoI6d2m8Y_cnajiqdF_Cyq6Ll4HtrW0ZoND-ygTPbZUKWRNG27-Nw3wmPurzcQdOtqKa-gMaN2tjOIhXIMI6iC/s320/reading-books.jpg" /></a></div><br />
This has been a difficult year for me physically (more about that another time), but I'm having a great year reading. I've been on a tear lately, thanks to my local library and my oldest daughter.<br />
<br />
My dog is pretty smart. He knows Saturdays are different from any other day of the week. He follows me around the house, tail wagging, from the moment we get up. He comes running if I make a move towards my car keys on the table in the mud room: "Are you going out? In the <i>car</i>? Will you take me with you?" I leave him behind if conditions are too hot or cold to leave him unattended in the car, but on mild days I'm happy to take him with me. We go to the bank, the post office, the barber shop, Dunkin Donuts, or the town library. It amazes me to see how often I'll find something good.<br />
<br />
I started this recent tear with <a href="http://www.amazon.com/Going-Clear-Scientology-Hollywood-Prison/dp/0307700666/ref=sr_1_1?s=books&ie=UTF8&qid=1377301695&sr=1-1&keywords=going+clear">"Going Clear"</a> by Lawrence Wright. It's the history of Scientology, from L. Ron Hubbard's World War II record through to the present day. I didn't know the details before. I found them educational and amusing.<br />
<br />
I enjoyed it so much that I picked up Lawrence Wright's <a href="http://www.amazon.com/Looming-Tower-Al-Qaeda-Road-11/dp/1400030846/ref=sr_1_2?s=books&ie=UTF8&qid=1377301859&sr=1-2">"The Looming Towers"</a>. It's the riveting story of al Qaeda from Sayyid Qutb in the prisons of Egypt to the crashing of planes into the World Trade Center on 2001-Sep-11. The references to Ali Soufan, the FBI agent who investigated the bombing of the U.S.S. Cole and interrogated captured al Qaeda, led me to <a href="http://www.amazon.com/Black-Banners-Inside-Against-al-Qaeda/dp/0393079422/ref=sr_1_1?s=books&ie=UTF8&qid=1377302218&sr=1-1&keywords=the+black+banners+soufan">"The Black Banners"</a>. This is a wonderfully written, but ultimately sad and frustrating book. You <i>know </i>how it ends. You can see how it might have been possible to connect the dots beforehand if the right people had been privy to certain facts, perhaps preventing disaster. Ali Soufan presents evidence for something that I suspected was true: harsh interrogation methods don't work. Zero Dark Thirty would lead us to believe that waterboarding turned up the information that led to Osama bin Laden's compound in Pakistan, but all the actionable intelligence the U.S. got from captured al Qaeda came from Ali and traditional interrogation methods.<br />
<br />
After all this serious stuff I was ready for some fun. I heard Gillian Flynn on NPR's "Wait Wait, Don't Tell Me" on the way to the library one day. She was so smart and funny when talking about her book <a href="http://www.amazon.com/Gone-Girl-Novel-Gillian-Flynn/dp/030758836X/ref=sr_1_1?s=books&ie=UTF8&qid=1377302566&sr=1-1&keywords=gone+girl+gillian+flynn">"Gone Girl"</a> that I had to read it. One of the panelists said "After reading this book, I think you're one of those people who could murder someone and get away with it." <br />
<br />
I agree. <br />
<br />
The writing device was unusual. The book opens with a young husband and wife on the morning of their fifth wedding anniversary. They argue before the man leaves for work. When he comes home, he finds the front door open, the cat sitting on stoop, the house torn up, and his wife gone. What happened to her? Chapters alternate from the husband's point of view in the present to the wife's voice in flashback. Things get nuttier with each turn of the page. It was most entertaining!<br />
<br />
My oldest daughter recommended Ellen Ullman's <a href="http://www.amazon.com/Blood-Novel-Ellen-Ullman/dp/1250023963/ref=sr_1_1?s=books&ie=UTF8&qid=1377303040&sr=1-1&keywords=by+blood+ellen+ullman">"By Blood"</a>. It's set in San Francisco in the 1970s. An academic who's struggling to finish a project decides to rent an office in a seedy part of town. He finds out that it's next door to a psychiatrist's office. He starts listening in on a young woman's weekly session and finds himself identifying closely with her. He becomes secretly involved in her thread. Terrific writing!<br />
<br />
Wait, there's more. My oldest daughter also suggested that I take a look at a piece of non-fiction by Cheryl Strayed: <a href="http://www.amazon.com/Wild-Found-Pacific-Crest-Vintage/dp/0307476073/ref=sr_1_1?s=books&ie=UTF8&qid=1377303275&sr=1-1&keywords=wild+cheryl+strayed">"Wild"</a>. It's the true story of a 22-year-old woman who loses her not-even-fifty single mother to cancer in 1995. Her family and marriage fall apart over the next four years. When she hits rock bottom she decides to hike the Pacific Crest Trail from Mexico to Canada. Think Appalachian Trail on the West Coast, except at 10,000 feet along the peaks of the Sierra Nevada mountains. It made me wish I was a hiker. I thought the author was incredibly brave to be so forthright and honest.<br />
<br />
Amazon should just garnish my wages. I love the instant gratification of Kindle. When I finished "Wild" I couldn't wait to get back to the library. I downloaded Colum McCann's <a href="http://www.amazon.com/TransAtlantic-Novel-Colum-McCann/dp/1400069599/ref=sr_1_1?s=books&ie=UTF8&qid=1377303539&sr=1-1&keywords=transatlantic+colum+mccann">"Transatlantic"</a>. I'm only a little way into it, but it's a series of stories that all center on Ireland. The writing is wonderful.<br />
<br />
All this is on top of the books on the technical pile. I picked up <a href="http://www.amazon.com/Learn-You-Haskell-Great-Good/dp/1593272839/ref=sr_1_1?s=books&ie=UTF8&qid=1377303657&sr=1-1&keywords=learn+you+a+haskell+for+great+good">"Learn You A Haskell For Great Good!"</a> to try and grok functional programming. And I have <a href="https://www.coursera.org/course/compdata">another Coursera course</a> coming up in a month. <br />
<br />
It's like bailing the ocean with a plastic bucket. I can't take it all in fast enough. <br />
<br />
<!-- Stackoverflow.com flair --> <br />
<a href="http://stackoverflow.com/users/37213/duffymo"> <br />
<img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> <br />
</a> <br />
<br />
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <br />
<br />
<script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script><br />
Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-88717382170936559092013-07-26T09:20:00.000-04:002013-07-26T09:20:33.366-04:00First Coursera Certification<!-- jQuery --> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <br />
<!- MathJax --> <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <br />
<!-- Google translate --> <div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<!-- Put content here, Michael --> <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv7XQmMrkvyCM0ZkqTu81_yHt9deFoLv28KEroudbKJWIIImz6u4OM1n3TkvIsaCqQCBAAJzjvvRqgDc5W5sqckJUftiYYBpqQUmz9x5SgHtdlVpzil9UQflI1Gnd-v0Cs2AgR-r6T1XTj/s1600/coursera-logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv7XQmMrkvyCM0ZkqTu81_yHt9deFoLv28KEroudbKJWIIImz6u4OM1n3TkvIsaCqQCBAAJzjvvRqgDc5W5sqckJUftiYYBpqQUmz9x5SgHtdlVpzil9UQflI1Gnd-v0Cs2AgR-r6T1XTj/s320/coursera-logo.png" /></a></div><br />
I haven't been writing much lately - more on that another time. My <a href="http://craicpropagation.blogspot.com/2013/03/first-mooc.html">last post</a> talked about my first massive open-source on-line course in statistics at Udacity. It went so well, and I enjoyed it so much, but I still hadn't committed myself to signing up and getting a certificate of completion. I wanted to see what that was like, so in May I signed up for <a href="https://class.coursera.org/datasci-001/class/index">Introduction to Data Science</a> at Coursera. It meant eight weeks of lectures and assignments in a new field. <br />
<br />
It's been a long time since I was in school. I finished my last formal degree 21 years ago. I was marching towards yet another one in 2000. I was a course or two and a capstone project away from completing a Masters in computer science when the pilot light inside me blew out. I remember it like it was yesterday: I was sitting in a large lecture hall, listening to a professor drone on about the year long capstone project. I realized that I couldn't do it anymore. The motivation was gone. I stood up, marched over to the bursar's office, withdrew from the course, and never went back. <br />
<br />
I've continued to read and dabble on my own, but I haven't done anything formal since then. All my education was obtained the traditional way: take a class in a classroom, do assignments, pass tests, get a grade. I realized that I needed to add more structure to my efforts, but I couldn't go back to the way I've always done it. The rise of Khan academy and on-line courses was perfect for me. I wasn't sure if a new style would suit me, but I was anxious to try. Statistics at Udacity taught me that I could do it. Now it was time to try it out for real at Coursera.<br />
<br />
I'm impressed with how <a href="http://www.ted.com/talks/daphne_koller_what_we_re_learning_from_online_education.html">Daphne Koller</a> and Andrew Ng are running little experiments on-line to learn about this new educational idiom. It's a challenging problem: How do you handle tens or hundreds of thousands of students in a single course? Lectures, grades, assignments - everything has to be re-thought with this in mind. There were times when mid-course tweaks were added.<br />
<br />
The material and assignments were varied and well done. I love Python, the language of choice for all the programming assignments. I have <a href="http://www.jetbrains.com/pycharm/">PyCharm </a>from JetBrains. They make the best programming tools on the planet, so my local environment was a pleasure. The grading meant <i>immediate </i>feedback - perfect for an impatient American like me. The variety was wonderful - Python, <a href="http://jsmapreduce.com/">an online Map Reduce</a>, Hadoop on<a href="http://aws.amazon.com/"> Amazon Web Services</a>, and data analysis at <a href="http://www.kaggle.com/">Kaggle.com</a>. I thought the online materials were very good. Bill Howe did a fine job with the lectures. I could have taken more advantage of the course site and forums, but there are only so many hours in the day.<br />
<br />
The course finished during the first week of July. It took a while to sort out all those students, but I finally got my certificate, with distinction, the other day. <br />
<br />
I need some time to work on some personal projects, but I've already got my next one lined up. The data analysis using R course that I had my eye on is being offered again in September. I can't wait! <br />
<br />
<!-- Stackoverflow.com flair --> <a href="http://stackoverflow.com/users/37213/duffymo"> <img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> </a> <br />
<!-- Google Analytics --><br />
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-42528889858895280542013-03-13T08:00:00.000-04:002013-03-13T08:00:06.125-04:00First MOOC<!-- jQuery --> <br />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <br />
<!- MathJax --> <br />
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <br />
<!-- Google translate --> <br />
<div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><br />
<script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --> <br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCUIL3-mN1LWWKTS8-rKmya-EwAfGW7f8NzEsDvxUNL3QHx8Nw-aikse3UxOiomhKOWJ_MTSrkDi0UkxVfZlq5ipGrmbQrWVmNrnLU2BwT-3vLWhurvL20uOPoyU2MjwDIREJ56LmHUQ95/s1600/udacity-full-130x140.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCUIL3-mN1LWWKTS8-rKmya-EwAfGW7f8NzEsDvxUNL3QHx8Nw-aikse3UxOiomhKOWJ_MTSrkDi0UkxVfZlq5ipGrmbQrWVmNrnLU2BwT-3vLWhurvL20uOPoyU2MjwDIREJ56LmHUQ95/s320/udacity-full-130x140.png" /></a><br />
<br />
I've always prided myself on being a lifelong learner. I've been watching the rise of massive open-source on-line courses with great interest and curiosity. All of my education was done the traditional way: sit in a classroom with a lecturer and other students on a fixed schedule, do homework, take tests, let material diffuse into your brain over a week or a semester and hope it sticks. <br />
<br />
I've <i>never</i> taken a class on line. How would it feel? Could it be as effective as the traditional approach?<br />
<br />
I was excited when I first heard about <a href="https://www.ai-class.com/">AI class</a> being offered by Peter Norvig and Sebastian Thrun. <a href="http://norvig.com/">Peter Norvig</a> is the Director of Research at Google and the author of <a href="http://www.amazon.com/Artificial-Intelligence-Modern-Approach-3rd/dp/0136042597/ref=sr_1_1?s=books&ie=UTF8&qid=1362620323&sr=1-1&keywords=peter+norvig+artificial+intelligence">Artificial Intelligence: A Modern Approach</a>. He's written some terrific stuff, including <a href="http://norvig.com/21-days.html">Teach Yourself Programming In Ten Years</a> and <a href="http://norvig.com/spell-correct.html">How To Write A Spelling Corrector</a>. The latter is astounding. When I get on an airplane I get myself a drink and decide which movie I'm going to watch; Peter Norvig writes a statistics-based spelling corrector in 21 lines of Python code that's 70-80% accurate. It was a revelation to me when I first saw it.<br />
<br />
I signed up and started with the best of intentions, but then Hurricane Irene knocked our power out for ten days and put me behind the eight ball. No Internet; no computer; no lectures. <br />
<br />
My interest in statistics has been growing over the last few years. I've tried to better understand the Bayes approach - what it means and how it differs from the frequentist view that I've been exposed to. I've read <a href="http://www.amazon.com/Doing-Bayesian-Data-Analysis-Tutorial/dp/0123814855/ref=sr_1_1?s=books&ie=UTF8&qid=1362620940&sr=1-1&keywords=bayes+and+bugs">Doing Bayesian Analysis Using R and BUGS</a> by John K. Kruschke. Don't let the adorable puppies on the jacket fool you: this is a terrific, well-written book. I've got blog posts describing other books about Bayes that have caught my attention.<br />
<br />
But I've still never taken a basic statistics course. I saw that Sebastian Thrun, one of the AI class instructors, was offering <a href="https://www.udacity.com/course/st101">intro statistics at Udacity.</a> I liked the lectures I saw him give for the AI class, so I thought I'd give it a go. I started just after Thanksgiving, with the goal of finishing before the end of the year.<br />
<br />
The key for me is to make regular, concentrated effort, track my progress, and make sure that I avoid long gaps between sessions. I set up an Excel spreadsheet to record the date and units I covered. It was the same approach that got me through my first half marathon: plan the work, work the plan. It made it easy to see when I had a few days without getting another dose of learning.<br />
<br />
I didn't meet my time goal of finishing before the end of 2012, but I didn't miss it by much. More importantly, I got through the entire course - <i>every </i>lecture, <i>every </i>assignment. The programming assignments were in Python, which I loved. I have the latest version of <a href="http://www.jetbrains.com/pycharm/">PyCharm </a>- the Python IDE from JetBrains, makers of the best programming tools on the planet. I have <a href="http://www.numpy.org/">NumPy </a>and <a href="http://www.scipy.org/">SciPy</a>, two terrific libraries for scientific computing and numerical methods. It made programming a pleasure.<br />
<br />
Most importantly, I proved to myself that I can take good advantage of all the courses on-line: MIT, Stanford, Coursera, Udacity, Apple U and others.<br />
<br />
I would still like to revisit AI class. There's a course from Stanford called <a href="https://www.coursera.org/course/pgm">Probabilistic Graphical Models</a> that presents Markov models in depth. <a href="http://ocw.mit.edu/courses/mathematics/18-06-linear-algebra-spring-2010/index.htm">Linear algebra from Gil Strang at MIT</a> would be a treat and a privilege. <br />
<br />
But my next choice is <a href="https://www.coursera.org/course/compdata">Computing for Data Analysis</a> by Roger Peng. Coursera isn't offering it now, but it's available on YouTube from <a href="http://simplystatistics.org/2012/12/14/computing-for-data-analysis-returns/">Simply Statistics</a>. <br />
<br />
All kinds of knowledge is available to anyone with a computer, an Internet connection, and the drive to take it in. What a time to be alive.<br />
<br />
<!-- Stackoverflow.com flair --> <br />
<a href="http://stackoverflow.com/users/37213/duffymo"> <br />
<img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> </a> <br />
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-41403332113453558832013-03-06T20:05:00.001-05:002013-03-06T20:08:10.127-05:00Indexing My Diary<!-- jQuery --> <br />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <br />
<!- MathJax --> <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <br />
<!-- Google translate --> <br />
<div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><br />
<script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --> <br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpmQ70WOzvaDpmjMWggwP9SlDjZ4pS_0cuIa2MNjzAy7qRljCcWkuAlrsYPqnrSFQwqbOGCUbfPUfwsv2APDBisywgfUeM7abTOr80EGuQi0iUL2xH_eDXJVippa-RsUXldQeSRQzuEWoL/s1600/lucene_logo_green_300.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpmQ70WOzvaDpmjMWggwP9SlDjZ4pS_0cuIa2MNjzAy7qRljCcWkuAlrsYPqnrSFQwqbOGCUbfPUfwsv2APDBisywgfUeM7abTOr80EGuQi0iUL2xH_eDXJVippa-RsUXldQeSRQzuEWoL/s320/lucene_logo_green_300.png" /></a> <br />
<br />
We had a winter storm for the ages here last month. January had been relatively mild, with little snow and below-average degree day totals. I ran outside on the road every weekend. My fitness was good; I felt strong. <br />
<br />
This storm dropped three feet of snow in my yard. I went out on Friday night and blew 4" of snow off the driveway at 9 pm. When I went out the next morning the snow spilled over the top of my Honda snow thrower. It measures about 2' from the ground to the gas cap. When I went out the third time it spilled over the top again! The news said the storm cut a swath up the Connecticut River and left 30-36" of snow in its wake. I hit the snow jackpot.<br />
<br />
I know there's no link between being cold and falling ill, but I was wet and chilled to the bone after each pass with the snow thrower. I felt fine that Friday when the snow started. By Sunday night my sinuses were full. On Monday it descended into my lungs. The coughing wouldn't stop. Rather than feel miserable and infect my co-workers, I decided to stay close to home. I had my work laptop with me, so I could have said I was "working from home." But I didn't want to feel guilty if the need to lie down and take a nap came over me, so I called in sick for a few days to beat it once and for all.<br />
<br />
The funny thing is that I didn't take that nap. I've got a backlog of projects that I'm interested in finishing. I'm a little embarrassed about how long some of them have remained on the list, without any progress being made. One of them involved the electronic journal that I've kept for the last 19 years and counting. There's a folder for every year, a Word doc for every month, and an entry of one or more pages for every day that I decided to blather on about myself. It predates the coming of the World Wide Web; I started doing it on the first PC that I ever bought.<br />
<br />
So I've got lots of stuff locked up inside. I found myself wondering "When did such and such happen? When did I last mention so and so?", but I didn't have any way to search. Then came <a href="http://lucene.apache.org/">Lucene</a>, the Java based search engine from Apache. I downloaded the latest version and set about creating an index for my journal. Reading and parsing the Word documents was difficult. I used the <a href="http://poi.apache.org/">Apache POI</a> library, because I started with a Word 97 template; docx didn't come along until much later. I didn't like the API or documentation much, but Google found a <a href="http://sanjaal.com/java/tag/sample-examples-to-read-word-document-in-java/">terrific link</a> that got me off the dime. <br />
<br />
I fell into a nice rhythm: code, test, check in, rinse, repeat. I use Git as my local repository and a GitHub account as my master. There were problems and obstacles to overcome, but I persisted and found my way through all of them. It was a satisfying feeling when I created an index and searched it for a few terms that I knew the answer to. When I typed in "Celine", my youngest sister's name, the first entry that came back was a one-sentence entry that must have been rushed. It puzzled me at first, but I think the frequency of her name was high because the entry was so short. Fortunately her wedding day was high on the list, too. She's mentioned often on that day, but it's a longer entry so the word frequency of her name is smaller. I'll have to dig into the internals to see if I can better understand and optimize my searches.<br />
<br />
I checked the code into GitHub; there's read-only access granted to the curious at git://github.com/duffymo/diary-index.git.<br />
<br />
I plan to put <a href="http://lucene.apache.org/solr/">Apache Solr</a> on top of my index so I can have a lovely web interface. I'd also like to leverage either a timed service or a <a href="http://docs.oracle.com/javase/tutorial/essential/io/notification.html">Java 7 file watcher</a> to update my index on a schedule or whenever I make a new entry. I'm also considering abandoning Word and keeping my diary in <a href="http://www.tug.org/texworks/">TeX</a>. Keeping all my thoughts in plain text will insulate me from the whims of format changes in Word...and I <i>love </i>TeX. (I typeset my dissertation myself using LaTeX.) PDFs can be beautiful.<br />
<br />
I felt healthy again by the time I went back to work. It was also a reminder of how much fun it is to fall into a long, sustained coding trance and produce something that's useful and beautiful at the end.<br />
<br />
I'm onto the next project on my To-Do list. More to come soon. <br />
<br />
<!-- Stackoverflow.com flair --> <br />
<a href="http://stackoverflow.com/users/37213/duffymo"> <br />
<img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> <br />
</a> <br />
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-46521974233379126542013-01-01T17:44:00.000-05:002013-01-01T20:39:17.591-05:00Looking Forward To 2013<!-- jQuery --> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <!- MathJax --> <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <!-- Google translate --> <div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --> <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnXqgmonN4N5D-DYFIcCmTthw9hjzyTk6-t5r2myfdTqn6qbJgcc3JJh7KTNt0RNulDddOSLNPAOKLdxmLe2fag1WKPONStRCHcvAx4VO9TSDrUYuxwqLiDWyQUxlmszog2NJZOfeXHkm6/s1600/New_Year_2013Champagne.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"><img border="0" height="193" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnXqgmonN4N5D-DYFIcCmTthw9hjzyTk6-t5r2myfdTqn6qbJgcc3JJh7KTNt0RNulDddOSLNPAOKLdxmLe2fag1WKPONStRCHcvAx4VO9TSDrUYuxwqLiDWyQUxlmszog2NJZOfeXHkm6/s320/New_Year_2013Champagne.jpg" /></a></div><br />
We're all starting another year today. I haven't written in a while, in spite of all the activity that's been going on. Like most people, I usually find myself in a Janus mood at this time of year: looking back, looking ahead.<br />
<br />
I'd say that 2012 was a good year for me. I saw both of my beloved daughters earn Master of Science degrees and start on their careers. Both are handling their business and pushing forward on their own. What more could any parent ask for?<br />
<br />
I had the chance to travel with my youngest brother this summer. We attended a fantastic family wedding and got to spend some great time together. I enjoyed every moment of it, never to be forgotten.<br />
<br />
I wanted to learn how to run again in 2011. By June of 2012 I had been on the road for a whole year without significant injury. So I set a <a href="http://craicpropagation.blogspot.com/2012/10/race-day.html">new goal</a>: train for and finish a half marathon. I fulfilled it in fine style, finishing in less than two hours. It was such a satisfying, enjoyable experience. I've continued to run regularly since. I tripled the mileage that I logged in 2010. I'd like to up the ante in 2013 and finish my first marathon. I don't know if it'll be the Hartford marathon or something earlier, but I know I'll be able to do it. Past history is a fine predictor.<br />
<br />
It wasn't my best swimming year. I was on track for something special at the end of June. I decided to try an experiment: Was swimming in chlorinated water having an adverse effect on my lungs? I took two full months off, not swimming a yard, running full time. I'm happy to report that my lungs are better. I've been back in the water in December. The pool that I use has dropped their water temperature down to 80 F and gotten the chlorine levels under control. I've enjoyed being back in the water again. I plan to mix running and swimming all year in 2013.<br />
<br />
Now that I can manage all three events - run, bike, and swim - I'd love to enter one of the sprint triathlons they have over the summer in Lake Terramuggus in Marlborough CT and see how I fare.<br />
<br />
I had a great year reading, both technical stuff and fiction. It's one of life's greatest pleasures for me. I've described some of the books in this blog. Two that I didn't write about were <a href="http://www.amazon.com/Swerve-How-World-Became-Modern/dp/0393343405/ref=sr_1_1?s=books&ie=UTF8&qid=1357079444&sr=1-1&keywords=the+swerve">The Swerve</a> and <a href="http://www.amazon.com/Republic-Lost-Money-Corrupts-Congress--/dp/0446576433/ref=sr_1_1?s=books&ie=UTF8&qid=1357079478&sr=1-1&keywords=lawrence+lessig+republic+lost">Republic, Lost</a>. Both describe how dogma holds back society and progress. Let's hope we can make headway against it in 2013.<br />
<br />
I've always prided myself on being a lifelong learner, but I realized this year that I needed to go back to the beginning and learn something difficult. I would like to become far more proficient with machine learning software like <a href="http://mahout.apache.org/">Mahout</a> and <a href="http://www.cs.waikato.ac.nz/ml/weka/">Weka</a>. <br />
<br />
I would like to upgrade my understanding of fundamentals in statistics. I finally understand the Bayes point of view after reading <a href="http://www.amazon.com/dp/0300188226">The Theory That Wouldn't Die</a>, <a href="http://www.indiana.edu/~kruschke/DoingBayesianDataAnalysis/">Doing Bayesian Analysis</a>, and <a href="http://www.amazon.com/Signal-Noise-Many-Predictions-Fail/dp/159420411X/ref=sr_1_1?s=books&ie=UTF8&qid=1357080135&sr=1-1&keywords=signal+and+the+noise">The Signal and the Noise</a>. I want to deepen my knowledge and apply it in significant ways in 2013.<br />
<br />
I'm taking my first on-line course at Udacity. I'm on track to finish it sometime in the next two weeks. Then I'll take another, and another. I'd like to widen the set of topics I'm knowledgeable about in 2013.<br />
<br />
I signed up for an Amazon Web Services account. I'm still amazed at how much it offers at such low cost. I plan to learn it deeply in 2013.<br />
<br />
I signed up for a Twitter account during the autumn. Aside from the time wasting and humor, it's been educational to see the the different kinds of people out there. It's been good to be exposed to different points of view.<br />
<br />
It's exciting to start another year. I can't wait to see how this one goes.<br />
<br />
<br />
<br />
<!-- Stackoverflow.com flair --> <br />
<a href="http://stackoverflow.com/users/37213/duffymo"> <img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> </a> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-19363499275775317612012-10-20T10:30:00.000-04:002012-10-20T10:31:53.678-04:00Mythbuster<!-- jQuery --> <br />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <br />
<br />
<!- MathJax --> <br />
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <br />
<br />
<!-- Google translate --> <br />
<div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggYldCWxFJ6weSBUtZxT9rF-d8IwRahoBBU96NWG7uI4v2t_21bZXOplDmHjw6QptTdwkvSK55YSGA1wq2aeRF3LKr5bPxnz7sOo0w-F0YgLjKz50azSyI_ZtGP6GgHf0r1b_ghE9RI1FI/s1600/mythbusters.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"><img border="0" height="158" width="319" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggYldCWxFJ6weSBUtZxT9rF-d8IwRahoBBU96NWG7uI4v2t_21bZXOplDmHjw6QptTdwkvSK55YSGA1wq2aeRF3LKr5bPxnz7sOo0w-F0YgLjKz50azSyI_ZtGP6GgHf0r1b_ghE9RI1FI/s320/mythbusters.jpg" /></a></div><br />
I'm asked to use an automated code review tool at work. It's not FindBugs; nevermind the name. Given a repository URL, it checks for architectural integrity, programming practices, and documentation. It reports scores on the academic scale, with zero being the worst and 4.0 being the best possible score. It flags offensive components and presents citations to buttress its arguments.<br />
<br />
I'm particularly bothered by one offense against architectural integrity. It says that instantiation of objects inside a loop is inefficient and gives the lowest possible architectural score. The goal is to avoid instantiation of too many objects.<br />
<br />
How on earth is a developer supposed to populate a list of objects?<br />
<br />
Besides, this might have been a serious issue on the earliest versions of the JVM. But object creation now rivals C in speed, and newer generational garbage collectors are also big improvements.<br />
<br />
Rather than rail against the injustice, I decided to create a small benchmark and see for myself.<br />
<br />
I started with a simple Person class:<br />
<br />
<pre class="prettyprint">package cast;
import org.apache.commons.lang3.StringUtils;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Person
* @author mduffy
* @since 9/19/12 7:38 AM
*/
public class Person {
private static final DateFormat BIRTH_DATE_FORMATTER;
private final String firstName;
private final String lastName;
private final Date birthDate;
static {
BIRTH_DATE_FORMATTER = new SimpleDateFormat("yyyy-MMM-dd");
BIRTH_DATE_FORMATTER.setLenient(false);
}
public Person(String firstName, String lastName, Date birthDate) {
this.firstName = (StringUtils.isBlank(firstName) ? "" : firstName);
this.lastName = (StringUtils.isBlank(lastName) ? "" : lastName);
this.birthDate = ((birthDate == null) ? new Date() : new Date(birthDate.getTime()));
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public Date getBirthDate() {
return new Date(birthDate.getTime());
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("Person");
sb.append("{firstName='").append(firstName).append('\'');
sb.append(", lastName='").append(lastName).append('\'');
sb.append(", birthDate=").append(BIRTH_DATE_FORMATTER.format(this.birthDate));
sb.append('}');
return sb.toString();
}
}
</pre><br />
I needed to keep statistics on wall time and heap used, so I wrote a Statistics class: <br />
<br />
<pre class="prettyprint">package cast;
import org.apache.commons.lang3.StringUtils;
import java.util.Collection;
/**
* Statistics accumulates simple statistics for a given quantity "on the fly" - no array needed.
* Resets back to zero when adding a value will overflow the sum of squares.
* @author mduffy
* @since 9/19/12 8:16 AM
*/
public class Statistics {
private String quantityName;
private int numValues;
private double x;
private double xsq;
private double xmin;
private double xmax;
/**
* Constructor
*/
public Statistics() {
this(null);
}
/**
* Constructor
* @param quantityName to describe the quantity (e.g. "heap size")
*/
public Statistics(String quantityName) {
this.quantityName = (StringUtils.isBlank(quantityName) ? "x" : quantityName);
this.reset();
}
/**
* Reset the object in the event of overflow by the sum of squares
*/
public synchronized void reset() {
this.numValues = 0;
this.x = 0.0;
this.xsq = 0.0;
this.xmin = Double.MAX_VALUE;
this.xmax = -Double.MAX_VALUE;
}
/**
* Add a List of values
* @param values to add to the statistics
*/
public synchronized void addAll(Collection<double> values) {
for (Double value : values) {
add(value);
}
}
/**
* Add an array of values
* @param values to add to the statistics
*/
public synchronized void allAll(double [] values) {
for (double value : values) {
add(value);
}
}
/**
* Add a value to current statistics
* @param value to add for this quantity
*/
public synchronized void add(double value) {
double vsq = value*value;
++this.numValues;
this.x += value;
this.xsq += vsq; // TODO: how to detect overflow in Java?
if (value < this.xmin) {
this.xmin = value;
}
if (value > this.xmax) {
this.xmax = value;
}
}
/**
* Get the current value of the mean or average
* @return mean or average if one or more values have been added or zero for no values added
*/
public synchronized double getMean() {
double mean = 0.0;
if (this.numValues > 0) {
mean = this.x/this.numValues;
}
return mean;
}
/**
* Get the current min value
* @return current min value or Double.MAX_VALUE if no values added
*/
public synchronized double getMin() {
return this.xmin;
}
/**
* Get the current max value
* @return current max value or Double.MIN_VALUE if no values added
*/
public synchronized double getMax() {
return this.xmax;
}
/**
* Get the current standard deviation
* @return standard deviation for (N-1) dof or zero if one or fewer values added
*/
public synchronized double getStdDev() {
double stdDev = 0.0;
if (this.numValues > 1) {
stdDev = Math.sqrt((this.xsq-this.x*this.x/this.numValues)/(this.numValues-1));
}
return stdDev;
}
/**
* Get the current number of values added
* @return current number of values added or zero if overflow condition is encountered
*/
public synchronized int getNumValues() {
return this.numValues;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("Statistics");
sb.append("{quantityName='").append(quantityName).append('\'');
sb.append(", numValues=").append(numValues);
sb.append(", xmin=").append(xmin);
sb.append(", mean=").append(this.getMean());
sb.append(", std dev=").append(this.getStdDev());
sb.append(", xmax=").append(xmax);
sb.append('}');
return sb.toString();
}
}
</pre><br />
Then I wrote a test method to exercise creating a million instances and compared the two idioms:<br />
<br />
<pre class="prettyprint">package cast;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
/**
* InstantiationInsideLoopTest attempts to answer the question: Is it bad to instantiate an object inside a loop
* with a modern JVM?
* @author mduffy
* @since 9/19/12 7:35 AM
*/
public class InstantiationInsideLoopTest {
private static final int DEFAULT_INSTANCES = 1000000;
private static final int DEFAULT_REPETITIONS = 5;
private static final String[] FIRST_NAMES = {
"Abel", "Bob", "Charlie", "David", "Edward", "Fred",
};
private static final String[] LAST_NAMES = {
"Smith", "Jones", "Carver", "Brown",
};
private Random random;
private Statistics begHeapStats = new Statistics("beg heap (MB)");
private Statistics endHeapStats = new Statistics("end heap (MB)");
private Statistics wallTimeStats = new Statistics("wall time (sec)");
public static void main(String[] args) {
int numRepetitions = ((args.length > 0) ? Integer.valueOf(args[0]) : DEFAULT_REPETITIONS);
int numInstances = ((args.length > 1) ? Integer.valueOf(args[1]) : DEFAULT_INSTANCES);
boolean isInside = (args.length > 2) && "inside".equalsIgnoreCase(args[2]);
System.out.println(String.format("# reps: %d # instances: %d inside? %b", numRepetitions, numInstances, isInside));
InstantiationInsideLoopTest tester = new InstantiationInsideLoopTest();
if (isInside) {
tester.instantiateInside(numInstances, numRepetitions);
} else {
tester.instantiateOutside(numInstances, numRepetitions);
}
}
public InstantiationInsideLoopTest() {
this(System.currentTimeMillis());
}
public InstantiationInsideLoopTest(long seed) {
this.random = new Random(seed);
}
private void instantiateOutside(int numInstances, int numRepetitions) {
this.begHeapStats = new Statistics("beg heap (MB)");
this.endHeapStats = new Statistics("end heap (MB)");
this.wallTimeStats = new Statistics("wall time (sec)");
for (int i = 0; i < numRepetitions; ++i) {
long begTime = System.currentTimeMillis();
long begHeap = Runtime.getRuntime().freeMemory();
List<Person> persons = new LinkedList<person>();
Person p;
for (int j = 0; j < numInstances; ++j) {
p = new Person(getFirstName(), getLastName(), getBirthDate());
persons.add(p);
}
long endHeap = Runtime.getRuntime().freeMemory();
long endTime = System.currentTimeMillis();
this.begHeapStats.add(begHeap/1024L/1024L);
this.endHeapStats.add(endHeap/1024L/1024L);
this.wallTimeStats.add((endTime - begTime)/1000.0);
// summarize("outside", i, begTime, endTime, maxHeap, begHeap, endHeap, persons);
}
System.out.println(this.begHeapStats);
System.out.println(this.endHeapStats);
System.out.println(this.wallTimeStats);
}
private void instantiateInside(int numInstances, int numRepetitions) {
this.begHeapStats = new Statistics("beg heap (MB)");
this.endHeapStats = new Statistics("end heap (MB)");
this.wallTimeStats = new Statistics("wall time (sec)");
for (int i = 0; i < numRepetitions; ++i) {
long begTime = System.currentTimeMillis();
long begHeap = Runtime.getRuntime().freeMemory();
List<Person> persons = new LinkedList<person>();
for (int j = 0; j < numInstances; ++j) {
Person p = new Person(getFirstName(), getLastName(), getBirthDate());
persons.add(p);
}
long endHeap = Runtime.getRuntime().freeMemory();
long endTime = System.currentTimeMillis();
this.begHeapStats.add(begHeap/1024L/1024L);
this.endHeapStats.add(endHeap/1024L/1024L);
this.wallTimeStats.add((endTime-begTime)/1000.0);
// summarize("inside", i, begTime, endTime, maxHeap, begHeap, endHeap, persons);
}
System.out.println(this.begHeapStats);
System.out.println(this.endHeapStats);
System.out.println(this.wallTimeStats);
}
private String getFirstName() {
return FIRST_NAMES[this.random.nextInt(FIRST_NAMES.length)];
}
private String getLastName() {
return LAST_NAMES[this.random.nextInt(LAST_NAMES.length)];
}
private Date getBirthDate() {
return new Date(this.random.nextLong());
}
private void summarize(String testName, int repetition, long begTime, long endTime, long maxHeap, long begHeap, long endHeap, List objects) {
System.out.println(String.format("test name : %s", testName));
System.out.println(String.format("repetition # : %d", repetition));
System.out.println(String.format("list size : %d", objects.size()));
System.out.println(String.format("beg heap (MB): %d", begHeap / 1024L / 1024L));
System.out.println(String.format("end heap (MB): %d", endHeap / 1024L / 1024L));
System.out.println(String.format("max heap (MB): %d", maxHeap / 1024L / 1024L));
System.out.println(String.format("wall time (s): %10.3f", (endTime - begTime) / 1000.0));
for (int i = 0; i < 5; ++i) {
System.out.println(objects.get(i));
}
}
}
</pre>
I ran this test case on two different machines - one running Windows XP, another using Windows 7 - and both running Sun JVMs for Java 6. The results consistently said that the idiom recommended by the automated code review suite was incorrect.
I understand the dangers of benchmarks like these, but it's comforting to attempt to be scientific rather than merely complain.
<br/>
<!-- Stackoverflow.com flair -->
<a href="http://stackoverflow.com/users/37213/duffymo"> <img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> </a> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com3tag:blogger.com,1999:blog-6367023863906450017.post-16693155119264061582012-10-14T09:21:00.001-04:002012-10-14T19:27:28.052-04:00Race Day<!-- jQuery --> <br />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript"></script> <br />
<br />
<!-- MathJax --><br />
<script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js" type="text/javascript">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <br />
<br />
<!-- Google translate --> <br />
<div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --> <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlyrHjcWkfXYYDjumHz8blIi304-rY8JN8FWWQ5vRSx3UHjIAGRR0Lh201-V386NFzhZ9C0cLLincSmW9wfnWBiEpwMLSEoT0GOxS-592OwInnsZjARzIsms9zR0EbvLt_wUJhlRc6l5VI/s1600/IMG_20121013_074920.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"><img border="0" height="239" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlyrHjcWkfXYYDjumHz8blIi304-rY8JN8FWWQ5vRSx3UHjIAGRR0Lh201-V386NFzhZ9C0cLLincSmW9wfnWBiEpwMLSEoT0GOxS-592OwInnsZjARzIsms9zR0EbvLt_wUJhlRc6l5VI/s320/IMG_20121013_074920.jpg" /></a></div><br />
I was nervous during the week leading up to the race. My last long run went very well. I did another six mile run the following Saturday, followed by an easy three mile jaunt the next day that included my first taste of gel packs, those doses of instant fuel that could keep me from hitting the wall at the end of the race. I followed the "don't introduce anything new on the day of the race" mantra and tried one. The vanilla flavor was delicious; it went down easily but took time to get out of the package; most importantly, it didn't upset my stomach.<br />
<br />
It was a week to taper, according to my plan, but I ended up doing nothing. Yoga was cancelled due to Columbus Day. I didn't run at all, because my wife was in the midst of a cold for the entire week, as were my co-workers. Disease was all around me! I was concerned about waking up on race day with a whopper of a cold that would put me on the sidelines. So I went to bed early every night and hoped that my immune system would fight the good fight.<br />
<br />
Race Day dawned bright and cold. Temperatures were below freezing overnight. What to wear? I decided to run in shorts and forego the tights. I had an Under Armor shirt with the half-marathon long-sleeved t-shirt over the top. I wore the same baseball cap that I'd done all my training in; no hat over my ears. I heeded the "no changes on race day" advice and ran in my minimals. I was determined to not give in to sneaker fear. My one concession to the cold was gloves. That turned out to be a very smart thought. <br />
<br />
We drove into the city, parked in the convention center garage, and walked over to Bushnell Park. We had time, but there wouldn't be too much standing around. I was in line, right next to the "9 minute mile" sign, with only twenty minutes til race time. The crowd was shoulder to shoulder. Would the start be as viscous as the Manchester Road Race? It only took me two minutes to cross the starting line, and I was running comfortably right away. I hit the start button on my stopwatch and fell into my cadence - ninety right leg strikes per minute. The full and half marathon groups ran in one pack at the beginning. My biggest concern was taking a wrong turn and getting lost. But that turned out fine. There was a big sign at Main Street telling full marathons to turn left and half marathoners to turn right. After that, all I had to do was follow the crowd. <br />
<br />
I didn't feel warm for the first mile or two, but everything was calm and relaxed. My breathing was smooth and comfortable. Nothing hurt. There was a Gatorade stop around mile two. I decided to take a cup at each stop to make sure that I didn't dehydrate. I didn't hurry. I'd stop, take the cup, gulp it down, and then head off. Drinking and running don't mix any more than drinking and driving do. I made sure that all my paper cups made it into a bin. The street was covered with crushed cups and spilled Gatorade. The volunteers would have a big cleanup job.<br />
<br />
The training plan works. There were no official mile markers, but I got the idea that I was maintaining a nine-minute per mile pace without any strain. When I ran under the halfway arch the clock read 59 minutes. It was the first time I thought that I could actually break two hours. I noticed a woman wearing a yellow shirt that said "2:00 finish" on the back. She was the pace keeper: as long as I could stay with her I'd have a chance of meeting my time goal. <br />
<br />
I was ahead of her when I entered Elizabeth Park, but some gentle slopes slowed me down more than I realized. I could see the Travelers tower ahead when I ran down Albany Ave past the eleven mile marker. The pace lady was within sight but ahead of me, surrounded by suffering acolytes who hoped for the reward of a two hour finish time. I had to decide: settle into a relaxed pace, call it a nice effort, and miss out on a two hour finish, or pick up my cadence and catch her. It was uncomfortable, but I decided on the latter course. I heard her say "You wanna bring it home?" as I passed her. I kept going until I couldn't hear her voice anymore. Less than two miles to go? That was all I could manage when I started this journey 16 months ago, but now it was easy. I pumped my arms and legs the whole way, under the Bushnell arch, into the chute, and under the finish arch. The clock read 1:59. My watch said 1:57. My average speed was a shade under nine minutes per mile, which was better than any training run I'd done. <br />
<br />
I surprised my wife. I walked along like a veal calf to pick up a medal, a water bottle, and a bag with a banana and some other snacks. She sounded surprised when I called her on my cell phone. "Are you done?" she asked incredulously. <br />
<br />
I enjoyed both the journey and the destination. It's so satisfying to say that I managed such a thing at my age. I thoroughly enjoyed the experience, so much so that I'm happily thinking about another run in November. <br />
<br />
Most importantly, I've made myself into a runner. What other transformation can I undergo? How else might I remake myself again?<br />
<br />
<!-- Stackoverflow.com flair --> <a href="http://stackoverflow.com/users/37213/duffymo"> <img alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" height="58" src="http://stackoverflow.com/users/flair/37213.png" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" width="208" /> </a> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-59421514065583062352012-10-03T20:39:00.001-04:002012-10-03T20:39:52.256-04:00Ready!<!-- jQuery --> <br />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <br />
<!- MathJax --> <br />
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <br />
<br />
<br />
<!-- Google translate --> <br />
<div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><br />
<script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit">
</script> <br />
<br />
<!-- Put content here, Michael --> <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYjahhoRTn15uQdQrO-QMt1dAQ8mK0vtN3lQNgUjAtzPNYrxTRQY6-j2yDTkGvLIMM7SUi4snd20yR-VtJRi1bRZFFW9eh087BP6umsZhoM6FCAemOigX1Yv-0dnJTe1bfcb4AMJx-gdzA/s1600/IMG_20120915_123547.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"><img border="0" height="239" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYjahhoRTn15uQdQrO-QMt1dAQ8mK0vtN3lQNgUjAtzPNYrxTRQY6-j2yDTkGvLIMM7SUi4snd20yR-VtJRi1bRZFFW9eh087BP6umsZhoM6FCAemOigX1Yv-0dnJTe1bfcb4AMJx-gdzA/s320/IMG_20120915_123547.jpg" /></a></div><br />
Last Saturday I had my last long run before the half marathon on 13-Oct. It was overcast and threatening rain when I hit the Airline Trail at noon, so I had it mostly to myself. There were a few hardy mountain bikers and a dog walker or two, but the traffic was greatly diminished. <br />
<br />
The plan called for 12 miles, but I was ahead of schedule for the last two long runs. I wanted to have the confidence of knowing that I could complete the distance. I had a water bottle filled with ice-cold green Gatorade in hand. I planned to stop every 3-4 miles for 30 seconds to get a drink and stay relaxed. I wanted to simulate my plan for the race.<br />
<br />
The first mile was a warm-up. I had a sweatshirt on that may have been overkill. By the time I stopped for my first drink I was loose and lathered up. The markers for the fourth mile went by quickly. I was at nine minute miles or better the whole way. I never saw the fifth or sixth mile markers, same as the week before. The trail had a gentle upward slope. I felt anxious as I ran: would there be a marker for the turnaround point at mile 3? I crossed a road that intersected the trail, ran to the next gate - and there it was! I was surprised when I checked my watch: I was still maintaining a nine-minute mile pace! I felt good. I had a long, relaxed drink and started down the slope towards my car.<br />
<br />
I have to compliment the folks who put together the plan that I've used to prepare for the race. They know what they're doing. I felt strong on the way back. When I passed the ten mile mark, I had plenty left. I thought back to how I felt at the end of that personal best long run two weeks ago. I was greatly improved. I was slowing down and suffering a bit more when I passed the twelve mile mark. I thought back to how knackered I felt at the end of last Saturday's run. I was beyond that. The last two miles were difficult. But I felt like a running man when I finished in 2:15. <br />
<br />
Now I'm tapering down for the next two weeks. The longest run will be five miles. I'll do some swimming, shorter runs, and yoga. I'm looking forward to that day. I just hope I can dodge catching a cold for the next two weeks. <br />
<br />
<!-- Stackoverflow.com flair --> <br />
<a href="http://stackoverflow.com/users/37213/duffymo"> <br />
<img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> </a> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-50432791368110079832012-09-24T22:16:00.001-04:002012-09-24T22:29:15.835-04:00Uncharted Trails<!-- jQuery --> <br />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <br />
<br />
<!- MathJax --> <br />
<br />
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
jax: ["input/TeX", "output/HTML-CSS"],
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
},
"HTML-CSS": { availableFonts: ["TeX"] }
});
</script> <br />
<br />
<!-- Google translate --> <br />
<br />
<div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><br />
<br />
<script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --> <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiXDIwE_fWppxNd0xSgdfm9xcdZQ9tmwXgJzY-2kW9Ocqisq_CD1QxBWh75pkns1QeTehAYOQWZEJ5tmtFDydoIiXqYc5dTJ5955GPPIdYSR3-UsE83YnakTikLabN1JPcut7On9wFnhur/s1600/IMG_20120915_123553.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"><img border="0" height="239" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiXDIwE_fWppxNd0xSgdfm9xcdZQ9tmwXgJzY-2kW9Ocqisq_CD1QxBWh75pkns1QeTehAYOQWZEJ5tmtFDydoIiXqYc5dTJ5955GPPIdYSR3-UsE83YnakTikLabN1JPcut7On9wFnhur/s320/IMG_20120915_123553.jpg" /></a></div><br />
Saturday morning meant another long run. My training plan called for ten miles, but I'd already accomplished that. It was time to go above and beyond. I was going back to the Airline Trail for a twelve mile run, longer than anything I've attempted.<br />
<br />
Thankfully it was another perfect day. I brought a water bottle filled with Gatorade to carry with me. I resolved to stop for a swig every three miles. I found the starting mile mark at precisely noon and hit the trail. <br />
<br />
The first miles were easy. I had no trouble knocking off the first three at a nine minute mile pace. I stopped for my first drink and felt fine. <br />
<br />
The next three miles were on a part of the trail that was a little rougher: washed out and slightly uphill. I missed the five mile marker the week before. I had a pretty good idea of where it was this time, so I hit my stop watch as I passed it. It's a good thing I did, because thirteen minutes later I hadn't encountered the six mile marker. I stopped for a drink, turned around, and headed back where I came from.<br />
<br />
I was experiencing some discomfort on the way back last week. My feet were sore and tired, and my right inner thigh hurt every time I picked up my foot. Not so this week. I felt strong and determined. My pace was slower, but I was still in the 10-10:30 per mile range. I still had some energy when I passed the ten mile mark. I finished twelve miles in 2 hours 5 minutes. Not bad! Best of all, I felt okay when I walked back to the car during the cool down.<br />
<br />
My legs were tired for the rest of the day, but I was far from wrecked. When I woke up the next day I felt stiff, but not too bad. It was another gorgeous day. I could have followed my plan and done 30 minutes of easy running. I had gas in my tank, but I decided to spend it cutting my grass instead.<br />
<br />
Next Saturday is the last long run before the race. The plan calls for twelve; I'll go above and beyond again and shoot for 14 miles. If I can do that, I know I'll finish this race in fine style. After that, I start tapering down for the race.<br />
<br />
I'm going to hold at this level for a while. I'd like to try a few more half marathons and see how I feel before deciding on my next step. This has been a terrific ten weeks. I doubted whether I'd be able to do this when I started, but those doubts are almost gone.<br />
<br />
<!-- Stackoverflow.com flair --> <br />
<br />
<a href="http://stackoverflow.com/users/37213/duffymo"> <br />
<img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> </a> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-60540279567692436692012-09-20T21:37:00.001-04:002012-09-20T21:37:20.851-04:00Personal Best<!-- jQuery --> <br />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <br />
<!-- Google translate --> <br />
<div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><br />
<script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --> <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAeuz3q9fuolejzrJ_5DnsCyJWuhMFSUXnsX8Hw9l64oAF_iSbmvXYZ_UKNhYis_VEMeqJV2cGNByiCIxqXNyzL_NqjiYA3-QI3USjh39qaorvdig8muwGnB2wr0QMAKwMTqVUW-vhx-5h/s1600/IMG_20120915_132955.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"><img border="0" height="239" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAeuz3q9fuolejzrJ_5DnsCyJWuhMFSUXnsX8Hw9l64oAF_iSbmvXYZ_UKNhYis_VEMeqJV2cGNByiCIxqXNyzL_NqjiYA3-QI3USjh39qaorvdig8muwGnB2wr0QMAKwMTqVUW-vhx-5h/s320/IMG_20120915_132955.jpg" /></a></div><br />
I'm close to the end of week 10 in my training plan. My <a href="http://craicpropagation.blogspot.com/2012/09/feet.html">last entry</a> hinted that my journey to the half marathon might be at a premature end, pending the outcome of a long run.<br />
<br />
The results are in: all is well.<br />
<br />
My training plan called for an eight mile run. The weather was exquisite last Saturday: sunny and cool as befits a late summer day on the cusp of autumn. I decided that long runs were best attempted on the <a href="http://www.ct.gov/dep/lib/dep/greenways/airlinetrailbrochure.pdf">Airline Trail</a>, a rails-to-trails project that runs from East Hampton through Colchester, Hebron, and beyond. It's a straight shot, interrupted periodically by intersecting streets. I drove to a small parking lot off Route 85 and found the wooden post with the numeral ten on the left side of the trail. Miles are marked by numbered posts along the entire length, so keeping track of my progress was mindless and easy.<br />
<br />
The surface is packed, dressed gravel that's easier on the feet than pavment. There's a canopy of leaves overhead. The trees seemed to act like a natural wind tunnel: there was an intermittent, comfortable breeze in my face for most of the run. Lots of other people had the same idea as me: to be out on foot, bike, or horse on a beautiful day. The traffic was still light compared to my usual routes on the road.<br />
<br />
The first five miles felt easy. I was comfortable the whole time. I had trouble seeing the post with the five on it, because it was obscured by shrubs. I ran past it for a minute before turning back and correcting my error. The miles added up with each step. Soon I had matched my previous best of seven miles; then eight and nine went by. That last mile was a struggle mentally. My feet were tired. A muscle in my right inner thigh complained a little every time I lifted my foot. I kept waiting for "runner's high" to make an appearance and ease my suffering, but endorphins were in short supply. I only had two thoughts: to finish the run and to stop. I managed to accomplish both, finishing the run in 1:42. It was the longest run of my life. Now I know that I must have been hallucinating when I recalled a run of that distance when I was 21. There's no way I would have had the patience to run for that long a period of time.<br />
<br />
I was dog tired for the rest of the day, but recovery was swift. I had a good yoga session at home on Sunday, and my regular ninety minute class on Monday night. I soon felt like myself again.<br />
<br />
I've had two more runs since that personal best. I ran four miles inside on the track on Tuesday, because weather threatened to make running impossible after work. Conditions were delightful after work tonight. I ran the three miles that my plan called for. Dare I say it? The run felt <i>easy</i>. I experienced no pain anywhere. I could have done more. I had a lot of gas in the tank when I returned home.<br />
<br />
Saturday will mean twelve miles on the Airline Trail. I'll be in uncharted waters again. My confidence is growing. I think I might succeed in this venture.<br />
<br />
<!-- Stackoverflow.com flair --> <br />
<a href="http://stackoverflow.com/users/37213/duffymo"> <br />
<img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> <br />
</a> <br />
<br />
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <br />
<br />
<script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-70706047021965426172012-09-09T14:37:00.001-04:002012-09-09T19:39:12.563-04:00Feet<!-- jQuery --> <br />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <br />
<!-- Google translate --> <br />
<div id="google_translate_element"></div><br />
<script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><br />
<br />
<script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit">
</script> <br />
<br />
<br />
<!-- Put content here, Michael --> <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaGoXOtnKzYYUE4PiL-hlCSIS7d5VyJOG_M8RO2zISPXCeZEgvxqFoBPq91rsRaN0i-cXoeqqbhHQC_FrkN231be0U097HuEH_eKJnntRuPu5uiAEx6HGJrrmjCmfL4TzYyLs34LE4fc7Y/s1600/feet.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"><img border="0" height="218" width="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaGoXOtnKzYYUE4PiL-hlCSIS7d5VyJOG_M8RO2zISPXCeZEgvxqFoBPq91rsRaN0i-cXoeqqbhHQC_FrkN231be0U097HuEH_eKJnntRuPu5uiAEx6HGJrrmjCmfL4TzYyLs34LE4fc7Y/s320/feet.jpg" /></a></div><br />
I had a setback this week in my preparations for the Hartford half marathon. I did a seven-mile run on Sat 1-Sep. The first two miles were run under threatening clouds; the middle three had steady rain the whole time; the last two were sun-lit. My feet were <i>very</i> tired when I was done, but everything else felt fine.<br />
<br />
The following Monday was the Labor Day holiday from work. The remnants of Hurricane Issac threatened us with rain for most of the week, so I decided to forego the rest day and do a four-mile run. I felt okay, which was good considering the long mileage I'd logged just two days before. I can't recall now if I stepped on something and felt a twinge in my left foot. But I wasn't concerned when I done.<br />
<br />
I woke up the next morning and felt a lot of pain between the balls of my left foot. It was sore enough and in a spot where I feared a stress fracture at first. I put the thought out of my mind, because there wasn't any swelling. But the pain was sufficient to persuade me to take a break and stay off the road.<br />
<br />
I consulted with a number of people about it. I have two daughters who are familiar with such things. My oldest is preparing for her third marathon next month. She got ready last Saturday by running a half marathon in 1:35. The two girls ran 18 miles together a couple of weeks ago, so they know something about running and the injuries that go along with it. Both counseled patience; all I needed was rest and exercises. I got some suggestions for exercises that were sobering. I did calf raises with my heel hanging over a stair that showed my left foot to be dramatically weaker than my right. I have to pay more attention to those. I've done yoga for five years now, but I think I'll have to redouble my efforts. Hips, knees, calves, Achilles, feet - all are connected. My left side is markedly stiffer than my right. A daily morning yoga session before work is an order. <br />
<br />
A co-worker steered me to <a href="http://www.fleetfeethartford.com/">Fleet Feet</a> in West Hartford. I knew that my minimal shoes were due to be replaced; I bought them last year on 22-Oct. The soles are worn away. I picked up a beautiful new pair of blue shoes and a green "Rubz" ball to roll out the knots in my feet. Damn, but that thing hurts! My left arch is in agony when I start using it. The pain subsides after a few minutes, but I'm very tender there. I'll have to be diligent about using the ball, too.<br />
<br />
Conditions outside are spectacular today, so I decided to hit the road for a three-mile jaunt in my new shoes to see how my feet would hold up. I warmed up with 30 minutes of yoga, rolling out the knots with the ball, and some strengthening exercises. My times weren't impressive - they haven't been all along - but my feet withstood the road without a problem. They're tired, but there's no pain - until I step on that damned ball.<br />
<br />
I've lost a week, but I don't think that's the end of the journey. I'm still hoping to run the half in a month. I'll know better after my next long run on Saturday.<br />
<br />
<br />
<!-- Stackoverflow.com flair --> <br />
<a href="http://stackoverflow.com/users/37213/duffymo"> <br />
<img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> <br />
</a> <br />
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <br />
<br />
<script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-39575038169999578502012-08-29T21:05:00.000-04:002012-09-09T14:39:56.028-04:00Running The Half<!-- jQuery --> <br />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript">
</script> <br />
<br />
<!-- Google translate --> <br />
<div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><br />
<script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit">
</script> <br />
<br />
<!-- Put content here, Michael --> <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-6Cz7tnzh_LyIdF7XZhlmaP1GHwpGZAU7ZujpDCLYKjGSQ9jwBz9ylxLSdMlOrmXSPc_S-TX2psPCwM9TFSt4oA3y2JVd8ucAPENZ3UoSw7EIl8ayVb987NENbkz93gcJbkWVJJZIdryR/s1600/ing-half-marathon-logo.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"><img border="0" height="61" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-6Cz7tnzh_LyIdF7XZhlmaP1GHwpGZAU7ZujpDCLYKjGSQ9jwBz9ylxLSdMlOrmXSPc_S-TX2psPCwM9TFSt4oA3y2JVd8ucAPENZ3UoSw7EIl8ayVb987NENbkz93gcJbkWVJJZIdryR/s320/ing-half-marathon-logo.jpg" /></a></div><br />
One of the things that I try to practice is change. I used to work for a guy who insisted that it was impossible to read a book or learn something new or change at all "at my age." <br />
<br />
I think I'm now as old as he was when he made that statement to me.<br />
<br />
It's not necessarily about him, because my choices are solely my own, but I believe it's important to not give up the fight to improve physically and mentally just because we're older. I'm not what I was when I was 20 or 30, but I do what I can. <br />
<br />
I also believe that the best way to make progress on anything is to pick a well-defined goal and take frequent, small, incremental steps in the chosen direction. New skills are best acquired by accretion of lots of small, targeted efforts.<br />
<br />
A year ago <a href="http://craicpropagation.blogspot.com/2011_06_01_archive.html">last June</a> I wrote about starting to run seriously for the first time since I was in my twenties. I spent a year of doing half mile repeats on the road in front of my house, thinking more about pace, cadence, and form instead of distance. I ran the Manchester Road Race on Thanksgiving Day, as tradition demands, but that was the only long run that I tried. I kept it up faithfully throughout the mild, snowless winter. I was still injury-free and feeling good in June.<br />
<br />
Now that I had a good base, I decided that I needed a new goal. At the end of that previous posting I wrote "I'm not trying to run marathons. I don't want to race or be competitive." I don't want to race or be competitive, but I've decided to try completing a half marathon. <br />
<br />
I needed a plan, so I fired up Google and found a <a href="http://running.about.com/od/racetraining/a/basichalf.htm">schedule </a>that I liked. I put the plan into a spreadsheet and set the start date so that race day was Saturday 13-Oct-2012: the ING Hartford half marathon. Plan the work, work the plan. I missed one whole week to attend a family wedding, but I've been faithful with the rest of it. I've completed the first half of the schedule. Now it becomes challenging. I increase the length of the long run by a mile per week until I complete a 12 mile run the week before the race. <br />
<br />
This is uncharted territory for me. I have a vague memory of a long run when I was 20 years old. I was living in my parents' house, home from college, when I ran into a friend when I was out for a run after work. I fell in with him for a long time. I asked him how long the route was that we were taking. He told me it was a ten mile run, but now I'm not sure. The six mile run I completed last Saturday might have been the longest I've ever finished.<br />
<br />
My times won't impress anyone. I feel comfortable at a 9-10 minute per mile pace. If I can keep that up for 13.1 miles I'll finish somewhere between 2:00 and 2:20. The most important thing will be to finish.<br />
<br />
It's not a fait accompli that I'll be able to do it, even thought I've registered and paid my money. My ankles, knees, and hips feel fine so far. I've had no muscle problems at all, not even stiffness or soreness on the day after running. But if something blows out or gives way I'll have to postpone it for another day.<br />
<br />
I'm hoping that won't happen. I'd like very much to see this through.<br />
<br />
I'm most curious about the mental aspect of running for that long a time. I've never experienced "runner's high." I don't know if I'll be able to handle the discomfort and pain that's an inevitable part of crossing the finish line. How do you stay focused when running for more than two hours? I'll find out.<br />
<br />
If I can finish this, who knows? Maybe I'll find a full marathon training plan and just keep going!<br />
<br />
I haven't been in a pool in two months. I'm going to go back, but I've learned that daily exposure to chlorine isn't good for my lungs. I'm going to continue to mix swimming in, but it might be just a once per week Masters swim with my friends.<br />
<br />
After all these years of pounding out yards, the biggest surprise is that I could stop swimming and actually feel better.<br />
<br />
The journey has been a pleasure. I've achieved my real goal: my lungs are feeling much better. I don't wheeze when I run. I recently had to see a doctor. They took my pulse and blood pressure, per usual custom. "Are you a runner?" the nurse asked me. My resting heart rate was 50 bpm; my blood pressure was 98/70. I was startled to see both, because they haven't been that low in a long time.<br />
<br />
I smiled and said "Why yes, I am a runner."<br />
<br />
What will that next objective be? Where else could I use some change in my life? I've got some ideas. <br />
<br />
<!-- Stackoverflow.com flair --> <br />
<a href="http://stackoverflow.com/users/37213/duffymo"> <br />
<img alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" height="58" src="http://stackoverflow.com/users/flair/37213.png" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" width="208" /> <br />
</a> <br />
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <br />
<script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-16172085563110119452012-07-13T21:32:00.000-04:002012-07-13T21:32:35.453-04:00Advanced Communicator Bronze<!-- jQuery --> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <!-- Google translate --> <div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><br />
<br />
<script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit">
</script> <br />
<!-- Put content here, Michael --> <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN9B5sXHt_qimoSvRKaMUJyYllnZV1AWJFsEdpTQldQbQcW6qjA4xPo9lYzHO7EYn5xEUvD3SXHvhFmEd4sl7y9T0ShffYrPf-oR7tb0khVf7MiAQwSDSeuIXaZjuYS7j1J6WhB6M_v3Up/s1600/acb-tm.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"><img border="0" height="150" width="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN9B5sXHt_qimoSvRKaMUJyYllnZV1AWJFsEdpTQldQbQcW6qjA4xPo9lYzHO7EYn5xEUvD3SXHvhFmEd4sl7y9T0ShffYrPf-oR7tb0khVf7MiAQwSDSeuIXaZjuYS7j1J6WhB6M_v3Up/s320/acb-tm.jpg" /></a></div><br />
I gave my tenth and final speech towards the Advanced Communicator Bronze designation two weeks ago. Our VP of education submitted the forms to Toastmasters International last week. They sent the e-mail telling me that the next packet was on its way.<br />
<br />
It took me two years to do it. I wasn't as crisp or diligent as I wanted to be. I chose two booklets with five speeches each. The first was Speaking To Inform; the second was The Professional Speaker. That second one was tough. Most speeches are 5-7 minutes long. The Professional Speaker has five assignments, and every one is 20-40 minutes long. I had a tough time writing and preparing for these. The difficulty slowed me down a great deal. But finally I slogged my way through.<br />
<br />
The last speech was particularly challenging. I had to give a professional seminar. My two professions are mechanical engineering and software development. How could I manage that without losing my audience? Then my youngest daughter had a fine idea - why not talk about the Mandelbrot set that I wrote about back in<a href="http://craicpropagation.blogspot.com/2011/03/mandelbrot-set.html"> March 2011</a>? It gave me a chance to talk about sufficient mathematics to mention complex numbers. I presented some background about Benoit Mandelbrot, the mathematician for whom the set is named. I showed the Java code I wrote to perform the calculation. And then there was the payoff for all those who managed to remain in the room and not fall asleep: a presentation of the image itself.<br />
<br />
It went very well, indeed. People were polite and feigned enthusiasm, even if they didn't feel it deeply. Some people thought I could have done a better job of tying the work and the image into real problems. Would they have been happy if I'd started talking about large eddy simulations of turbulent fluid flow? I was satisfied with how it went and my delivery. I felt comfortable and relaxed.<br />
<br />
I was very glad to get it over with. It's motivating me to move on. I'm starting to think that perhaps I can achieve Distinguished Toastmaster status. Others have - why not me?<br />
<br />
I think the secret is to write ten speeches out, rehearse them, and have them in pocket. Whenever there's an open speaking slot, I need to pounce on it. We have about 45 meetings a year. Each meeting has two speaking slots, so there are only 80-90 opportunities to make progress. I'd have to monopolize 11-12% of all speaking slots for an entire year to achieve my goal of earning Advanced Communicator Silver a year from now. It's a worthy goal.<br />
<br />
<!-- Stackoverflow.com flair --> <br />
<a href="http://stackoverflow.com/users/37213/duffymo"> <br />
<img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> <br />
</a> <br />
<br />
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <br />
<br />
<script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-63173573875216742632012-07-05T11:24:00.000-04:002012-07-05T11:24:23.439-04:00Higgs Boson Announcement<!-- jQuery --> <br />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <br />
<!-- Google translate --> <div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><br />
<br />
<script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --> <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVpSsXQrHeaxrYFyENn7-Uajg-9xGV3_wUNcbwbqJTsTxTUaQeFC0yXuNHW_rpo8t22gUIw5mRBbP7TvViMOIMJAmbc29aDbTnRB2ChwXOGBC_goa1ivaoiUWqMIiRlbbZDLOe-FQl7eKY/s1600/higgs-boson.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"><img border="0" height="180" width="280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVpSsXQrHeaxrYFyENn7-Uajg-9xGV3_wUNcbwbqJTsTxTUaQeFC0yXuNHW_rpo8t22gUIw5mRBbP7TvViMOIMJAmbc29aDbTnRB2ChwXOGBC_goa1ivaoiUWqMIiRlbbZDLOe-FQl7eKY/s320/higgs-boson.jpg" /></a></div><br />
So what's the big news story of the day? The divorce of Scientologist Tom Cruise and his third wife, Kate Holmes? <br />
<br />
Yes, but there's also the announcement that data collected at the CERN Large Hadron Collider in Geneva, Switzerland has gotten over the five sigma hurdle. Scientists are <a href="http://www.nytimes.com/2012/07/05/science/cern-physicists-may-have-discovered-higgs-boson-particle.html?pagewanted=all">saying</a> they've observed a "Higgs-like" particle. The Standard Model says that the Higgs boson is the carrier for the Higgs field, just like the photon is the carrier for the electromagnetic field. It interacts with other particles to characterize their mass.<br />
<br />
It's a big deal for science.<br />
<br />
So how does this affect the unemployment situation in the world? What will this do to correct the banking mess that we find ourselves in? How will this affect peace in the Middle East or the US presidential election in the fall?<br />
<br />
Sadly, it won't affect any of those things.<br />
<br />
I'm happy that the flame of inquiry into the way the world works is still burning, in spite of the damping effects of anti-intellectualism, superstition, magical thinking, and religion. <br />
<br />
It saddens me to think that this was the kind of thing that my country used to lead. We were the first to the moon. Science has been responsible for much of the economic activity that makes up our modern world. There are no modern computers, no Internet, no wireless communications without science. <br />
<br />
The <a href="http://en.wikipedia.org/wiki/Superconducting_Super_Collider">Superconducting Super Collider</a> was envisioned in 1983 and cancelled ten years later in 1993. I'm sure that the arguments against it were "practical" and "serious" and "reasonable".<br />
<br />
Part of the problem is that economics are finite. It's true that we can't afford to do everything we'd like. When resources are scarce, choices have to be made. Those choices reflect what a people consider to be important. You find a way to do what matters.<br />
<br />
But we had no problem anteing up <a href="http://en.wikipedia.org/wiki/Financial_cost_of_the_Iraq_War">$3-4T for wars in Afghanistan and Iraq</a>. Compare that to the runaway $12B that had been spent by the time the SSC was killed. Was the benefit of the wars worth the cost?<br />
<br />
James Clerk Maxwell published his equations for electromagnetism in 1861-1862 when the US Civil War was raging. We still live with the ramifications of that war, but the effect of Maxwell and science on the way we live today is far greater.<br />
<br />
We value adventures in banking more today. A lot of the quants who are cooking up exotic derivatives used to be physicists. I'm sure they make a lot more money working for Goldman and Chase. What a shame!<br />
<br />
It says something about us that we prefer short term profits over long term progress in understanding how the world works. It's a reminder that the progress we've made in enlightenment and reason is fragile. It can always be rolled back by magical, short-term thinking. I'm glad that CERN is keeping us moving forward.<br />
<br />
<br />
<!-- Stackoverflow.com flair --> <a href="http://stackoverflow.com/users/37213/duffymo"> <br />
<img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"></a> <br />
<br />
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <br />
<br />
<script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0tag:blogger.com,1999:blog-6367023863906450017.post-4490257845185510262012-06-18T20:57:00.000-04:002012-06-18T20:57:31.293-04:00Einstein - His Life And Universe<!-- jQuery --> <br />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <br />
<!-- Google translate --> <br />
<div id="google_translate_element"></div><script>
function googleTranslateElementInit() {
new google.translate.TranslateElement({
pageLanguage: 'auto',
includedLanguages: 'af,sq,ar,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,vi,cy,yi',
autoDisplay: false,
gaTrack: true,
gaId: 'UA-4114468-1',
layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
}, 'google_translate_element');
}
</script><br />
<script src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> <br />
<br />
<!-- Put content here, Michael --><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9jvoVcSyIocxpEQsd-lBaxBvssh5PSHO-oQxm2a49ohKFmsQVGFsQmlu8Z6XKPXu8okKCNoTjJBJMTEwIyhDuoQSlft8TJCGYh0KgRkkYzcyNZOos5INSylN2-rxUn2n5yJHxElngHsGC/s1600/einstein-isaacson-cover.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"><img border="0" height="191" width="128" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9jvoVcSyIocxpEQsd-lBaxBvssh5PSHO-oQxm2a49ohKFmsQVGFsQmlu8Z6XKPXu8okKCNoTjJBJMTEwIyhDuoQSlft8TJCGYh0KgRkkYzcyNZOos5INSylN2-rxUn2n5yJHxElngHsGC/s320/einstein-isaacson-cover.jpg" /></a><br />
<br />
I just finished reading Walter Isaacson's biography <a href="http://www.amazon.com/Einstein-Life-Universe-Walter-Isaacson/dp/0743264746/ref=sr_1_1?s=books&ie=UTF8&qid=1340065271&sr=1-1&keywords=isaacson+einstein">"Einstein - His Life and Universe."</a> I didn't think I'd ever have to read another Einstein biography after <a href="http://www.amazon.com/Subtle-Lord-Science-Albert-Einstein/dp/0192806726/ref=sr_1_1?s=books&ie=UTF8&qid=1340065311&sr=1-1&keywords=pais+einstein">"Subtle Is The Lord"</a> by Abraham Pais. <br />
<br />
<a href="http://en.wikipedia.org/wiki/Abraham_Pais">Abraham Pais</a> was a also physicist, a younger protege of Einstein's at the Institute of Advanced Studies at Princeton. He knew Einstein personally; he was versed in the details of his work; he was uniquely qualified to write an intimate biography. His book is remarkable for its level of detail. Book publishers claim that adding a single equation, even one as "simple" and well known to the general public as <a href="http://www.sciweavers.org/upload/Tex2Img_1340065789/eqn.png" imageanchor="1" style=""><img border="0" height="17" width="64" src="http://www.sciweavers.org/upload/Tex2Img_1340065789/eqn.png" /></a>, would reduce the readership by half.<br />
<br />
If that's true, and knowing how rapidly <a href="http://www.sciweavers.org/upload/Tex2Img_1340065882/eqn.png" imageanchor="1" style=""><img border="0" height="36" width="19" src="http://www.sciweavers.org/upload/Tex2Img_1340065882/eqn.png" /></a> converges to zero, then I must have been the only person on earth who ever bought and read Pais' work. Not only did he have plenty of equations, they included generalized tensors with sub-scripts and super-scripts proudly waving. I'm neither a mathematician nor a physicists, but I've taken a course that included generalized tensors. The presence of metric tensors didn't scare me away or detract from my enjoyment.<br />
<br />
As much as I liked "Subtle", I think Isaacson's book was more fun and accessible. He made Einstein seem less like an intellectual, unapproachable deity and more like a real human being. I could appreciate him expressing his frustration towards the folks at Zurich Polytechnic for dithering about a job offer by saying on page 176: "The dear Zurich folks can kiss my..."<br />
<br />
Einstein was a man of great humor. He was quite a hit with the ladies - divorced once, married twice, and amorous with a few more. He loved music, especially Mozart for his violin. He was detached from people, yet he had friendships that lasted his entire life.<br />
<br />
Walter Isaacson is a terrific writer. I enjoyed this book very much. It makes me want to grad his Steve Jobs biography as soon as possible.<br />
<br />
<!-- Stackoverflow.com flair --> <br />
<a href="http://stackoverflow.com/users/37213/duffymo"> <br />
<img src="http://stackoverflow.com/users/flair/37213.png" width="208" height="58" alt="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers" title="profile for duffymo at Stack Overflow, Q&A for professional and enthusiast programmers"> </a> <br />
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> <br />
<br />
<script type="text/javascript">
_uacct = "UA-4114468-1";
urchinTracker();
</script>Michael Duffyhttp://www.blogger.com/profile/10095335205263095695noreply@blogger.com0