<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CEICRn07fyp7ImA9WhRbGEg.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858</id><updated>2012-02-10T00:42:47.307-05:00</updated><category term="buckeyes" /><category term="ajax google-app-engine gwt" /><category term="artificial-intelligence singularity" /><category term="apple tech" /><title>Caffeine Coma</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://garmhold.blogspot.com/" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/CaffeineComa" /><feedburner:info uri="caffeinecoma" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;C0IAQ3o9cCp7ImA9WhZUFE0.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-1270788796689877149</id><published>2011-06-06T18:27:00.001-04:00</published><updated>2011-06-06T19:05:42.468-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-06T19:05:42.468-04:00</app:edited><title>Pixlshare- an image sharing app</title><content type="html">&lt;a href="http://pixlshare.com/"&gt;Pixlshare&lt;/a&gt; is a new image-sharing webapp that I just started working on. It's intended to be a low-friction way to do simple image sharing- upload an image and instantly get a URL that you can share with others. No accounts or logins needed- just click upload and you're done.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://pixlshare.com/images/trzlX8" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="315" src="http://pixlshare.com/images/trzlX8" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
It's built in Wicket and tiny bit of JQuery. It's fairly basic, but it has one fairly novel feature- you can add textual annotations to your uploaded images; the annotations appear as actual searchable text, rather than merely being part of the image bits.&lt;br /&gt;
&lt;br /&gt;
I'm planning to add features like:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;HTML5 drag-n-drop for uploads&lt;/li&gt;
&lt;li&gt;upload multiple pictures at once to create an album&lt;/li&gt;
&lt;li&gt;user comments&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;a href="http://pixlshare.com/"&gt;Give it a try!&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-1270788796689877149?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HWXDipNn3VB9-imgDPKAzHYbbfU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HWXDipNn3VB9-imgDPKAzHYbbfU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HWXDipNn3VB9-imgDPKAzHYbbfU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HWXDipNn3VB9-imgDPKAzHYbbfU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/RcWTREulCik" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/1270788796689877149/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2011/06/pixlshare-image-sharing-app.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/1270788796689877149?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/1270788796689877149?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/RcWTREulCik/pixlshare-image-sharing-app.html" title="Pixlshare- an image sharing app" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><thr:total>3</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2011/06/pixlshare-image-sharing-app.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYFQXk6fSp7ImA9WxFXE04.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-1455112594714010704</id><published>2010-05-18T17:27:00.002-04:00</published><updated>2010-05-20T01:08:30.715-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-20T01:08:30.715-04:00</app:edited><title>A New SlimPoints Feature: Food Diary</title><content type="html">It's been a long time coming, but I finally updated &lt;a href="http://slimpoints.appspot.com/"&gt;SlimPoints&lt;/a&gt; to support a kind of Points Tracking, which I refer to as a&amp;nbsp;&lt;a href="http://slimpoints.appspot.com/Points/Points.html#diary"&gt;Food Diary&lt;/a&gt;. &amp;nbsp;What's points tracking? &amp;nbsp;Briefly, you keep a running total of the number of "points" you eat during the day, and try not to exceed a daily limit. &amp;nbsp;It's very easy to follow (especially if you have a tool!) &amp;nbsp;Previously I had used an iPhone app for this, but it was riddled with so many bugs that I decided to scratch my own itch and create the diary for SlimPoints.&lt;br /&gt;
&lt;br /&gt;
Supporting this feature represents a fairly big change, as it means using App Engine's Datastore for persistence and&amp;nbsp;(obviously) requires an account in order to maintain the diary. &amp;nbsp;Since I run on App Engine, I chose the path of least resistance, which is to use Google's own UserService API for supporting users via Google Accounts.&lt;br /&gt;
&lt;br /&gt;
Interacting directly with App Engine's Datastore is kind of painful, but &lt;a href="http://code.google.com/p/objectify-appengine/"&gt;Objectify&lt;/a&gt; made it as simple as it could be. &amp;nbsp;I highly recommend it if you need to run on App Engine. &lt;br /&gt;
&lt;br /&gt;
Another challenge was that I wanted the rest of the app to remain useful for people who didn't want to take time to create an account. Sites that immediately require you to sign up are kind of a turn-off; it's helpful if your users can kick the tires a bit before deciding they want to invest the time to sign up. For this I relied heavily on GWT's history management via URL, and tabs to separate open vs "account required" features. &lt;a href="http://code.google.com/events/io/2009/sessions/GoogleWebToolkitBestPractices.html"&gt;Ray Ryan's advice&lt;/a&gt; to "get history management right up front" was truly gold, for this feature.&lt;br /&gt;
&lt;br /&gt;
I also took the dive and started using &lt;a href="http://code.google.com/webtoolkit/doc/latest/DevGuideUiBinder.html"&gt;UIBinder&lt;/a&gt;, and I'm damn glad I did. &amp;nbsp;UIBinder takes the best part of Wicket- the ability to lay out and style your components in HTML, and brings it into GWT. &amp;nbsp;It was totally worth the 15 minutes it took to learn it.&lt;br /&gt;
&lt;br /&gt;
There are lots of changes in this release, please &lt;a href="http://slimpoints.appspot.com/#diary"&gt;check it out&lt;/a&gt;!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_ix4Bk4u8y0E/S_L99k8QObI/AAAAAAAAAEY/5eyQNr1BsTE/s1600/SlimPoints.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="347" src="http://3.bp.blogspot.com/_ix4Bk4u8y0E/S_L99k8QObI/AAAAAAAAAEY/5eyQNr1BsTE/s400/SlimPoints.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-1455112594714010704?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rPiSszs6bGU-D2ipaDcVpewZzBk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rPiSszs6bGU-D2ipaDcVpewZzBk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rPiSszs6bGU-D2ipaDcVpewZzBk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rPiSszs6bGU-D2ipaDcVpewZzBk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/TZnW7ykdDiE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/1455112594714010704/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2010/05/new-slimpoints-feature-food-diary.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/1455112594714010704?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/1455112594714010704?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/TZnW7ykdDiE/new-slimpoints-feature-food-diary.html" title="A New SlimPoints Feature: Food Diary" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ix4Bk4u8y0E/S_L99k8QObI/AAAAAAAAAEY/5eyQNr1BsTE/s72-c/SlimPoints.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2010/05/new-slimpoints-feature-food-diary.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8ESHY9eSp7ImA9WxFQEEs.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-385270272418202773</id><published>2010-05-05T08:50:00.000-04:00</published><updated>2010-05-05T08:50:09.861-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-05T08:50:09.861-04:00</app:edited><title>Pause your Web History- break Google Maps</title><content type="html">For a few days &lt;a href="http://maps.google.com/"&gt;Google Maps&lt;/a&gt; stopped working for me.  I first noticed it while trying to get directions to the airport.  I use Safari, and the Maps page would just sit there with "Still loading..." forever.  I thought it was a momentary glitch, but 2 days later it was still happening.  I fired up Chrome on the same machine, which worked fine.  Back in Safari, I tried clearing the cache, restarting the browser, etc. all to no avail.&lt;br /&gt;
&lt;br /&gt;
Today I figured it out- I had paused my &lt;a href="https://www.google.com/history/"&gt;web history&lt;/a&gt; some time back.  On a whim I tried unpausing it, and lo and behold, Maps now works again in Safari.  Pausing it again results in the same breakage, so the problem is repeatable.&amp;nbsp;Having to enable Web History to use Maps is a little unsettling, but this sounds like a bug.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_ix4Bk4u8y0E/S-Fo5pjZ56I/AAAAAAAAAEQ/34KXtsf80mY/s1600/Still+Loading.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="195" src="http://3.bp.blogspot.com/_ix4Bk4u8y0E/S-Fo5pjZ56I/AAAAAAAAAEQ/34KXtsf80mY/s640/Still+Loading.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-385270272418202773?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ChSMR8_jt-CX8o2a5ZXgQyWvMAg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ChSMR8_jt-CX8o2a5ZXgQyWvMAg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ChSMR8_jt-CX8o2a5ZXgQyWvMAg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ChSMR8_jt-CX8o2a5ZXgQyWvMAg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/5Dh9v5MiEbU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/385270272418202773/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2010/05/pause-your-web-history-break-google.html#comment-form" title="10 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/385270272418202773?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/385270272418202773?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/5Dh9v5MiEbU/pause-your-web-history-break-google.html" title="Pause your Web History- break Google Maps" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ix4Bk4u8y0E/S-Fo5pjZ56I/AAAAAAAAAEQ/34KXtsf80mY/s72-c/Still+Loading.png" height="72" width="72" /><thr:total>10</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2010/05/pause-your-web-history-break-google.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUAQ3k6eyp7ImA9WxBaEk4.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-1876927316710287590</id><published>2010-03-22T00:43:00.005-04:00</published><updated>2010-03-22T00:47:22.713-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-22T00:47:22.713-04:00</app:edited><title>A Multilingual Password Generator using GWT and Google App Engine</title><content type="html">&lt;style type="text/css"&gt;
    .code {
            font: normal normal normal 1em/normal 'andale mono', 'lucida console', monospace; background-color: #323232; color: #eeeeee; font-size: 15px;line-height: 19px;padding: 1em;
    }

    tt {
        font-size: 13pt;
    }
&lt;/style&gt;&lt;br /&gt;
My fascination with GWT and Google App Engine continues. This weekend I created a&lt;br /&gt;
&lt;a href="http://create-a-password.appspot.com/"&gt;multi-lingual memorable password generator&lt;/a&gt;.&lt;br /&gt;
&lt;p&gt;In order to create memorable passwords I took the &lt;a href="http://world.std.com/~reinhold/diceware.html"&gt;Diceware&lt;/a&gt; approach.  The idea is simple: create a list of English words, and assign a five digit number to each of them.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="code"&gt;23542 click
23543 cliff
23544 climb
23545 clime
23546 cling
23551 clink
&lt;/pre&gt;&lt;p&gt;To build up a password,  you select some number of these words and combine them (preferably with some further randomization of the case, as well as perhaps inserting some digits or symbols between the words).&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;To select each word, you roll a die (or fire up a pseudo-random number generator) five times. If you roll 2, 3, 5, 4 and then 3, that corresponds to the word with index 23543.  In our case, that's &lt;tt&gt;cliff&lt;/tt&gt;. Keep selecting words in this manner until you've built up a sufficiently long/complex password.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;There are a number of password generator sites that seem to be using lots of server-side entropy for password generation, but then blithely download the generated passwords across the Internet to your browser.  That doesn't seem like such a good idea.  With &lt;a href="http://create-a-password.appspot.com"&gt;create-a-password&lt;/a&gt;, it all happens right in your browser window, thanks to the magic of GWT.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;On the downside, the dictionaries used for word selection are in fact downloaded (and they are well-known anyway). Despite this shortcoming, it still seems safer to me than shipping generated passwords  across the network. Using a longer password (Wikipedia recommends &lt;a href="http://en.wikipedia.org/wiki/Diceware"&gt;5 or more dice words&lt;/a&gt;) can help with this.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Diceware dictionaries are available in several languages, so it was pretty straightforward to go ahead and use GWT's &lt;a href="http://code.google.com/webtoolkit/doc/latest/DevGuideI18n.html"&gt;i18n&lt;/a&gt; to make this program available in a few different languages.  Hopefully I haven't butchered the &lt;a href="http://create-a-password.appspot.com/Password/Password_es.html"&gt;Spanish&lt;/a&gt; too badly.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I was a little disappointed to learn that GWT doesn't &lt;a href="http://stackoverflow.com/questions/156412/why-does-gwt-ignore-browser-locale"&gt;seem to support automatically recognizing the user's browser locale&lt;/a&gt;. I expected to be able to automatically detect this, and then offer localized content, but that doesn't seem to be the case. I ended up having to embed a property into each of my localized html pages:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="code"&gt;&amp;lt;meta name='gwt:property' content='locale=fr'/&amp;gt;
&lt;/pre&gt;&lt;p&gt;Another approach is to &lt;a href="http://learngwt.com/articles/mdamour1976/AutomaticGWTInternationalizationdetection.html"&gt;use a JSP&lt;/a&gt;.  Despite this,  I think it turned out pretty well.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-1876927316710287590?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FcC4S-QBJsuxBMRdofLxL4wUkJs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FcC4S-QBJsuxBMRdofLxL4wUkJs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FcC4S-QBJsuxBMRdofLxL4wUkJs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FcC4S-QBJsuxBMRdofLxL4wUkJs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/3QBfwjNoHV4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/1876927316710287590/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2010/03/password-generator.html#comment-form" title="11 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/1876927316710287590?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/1876927316710287590?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/3QBfwjNoHV4/password-generator.html" title="A Multilingual Password Generator using GWT and Google App Engine" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><thr:total>11</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2010/03/password-generator.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UDQ3s7fSp7ImA9WxBbFkg.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-8903738812890999672</id><published>2010-03-15T09:21:00.000-04:00</published><updated>2010-03-15T09:21:12.505-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-15T09:21:12.505-04:00</app:edited><title>The Weekend Hack: 13-14 March, 2010</title><content type="html">Inspired by &lt;a href="http://news.ycombinator.com/item?id=1133613"&gt;this recent post&lt;/a&gt; over at Hacker News, I was itching for a fun weekend project. &amp;nbsp;My criteria for the project were the following:&lt;br /&gt;
&lt;div&gt;&lt;ul&gt;&lt;li&gt;be small &amp;amp; well-defined- doable in a weekend&lt;/li&gt;
&lt;li&gt;produce something useful for &lt;i&gt;someone&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;give my rusty Google App Engine and GWT skills a workout&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;div&gt;I use&amp;nbsp;&lt;a href="http://wicket.apache.org/"&gt;Wicket&lt;/a&gt;&amp;nbsp;for my livelihood these days, but&amp;nbsp;&lt;a href="http://code.google.com/webtoolkit/"&gt;GWT&lt;/a&gt;&amp;nbsp;is my true love. I miss working with it.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;So I decided to create a searchable database of Weight Watchers "food points" values. &amp;nbsp;Last year, the company that I was working for held weekly WW meetings in our lunch room. &amp;nbsp;For about 6 months it was all but impossible to avoid hearing "how many points for X?" type questions several times daily.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;There are a lot of existing sites for this kind of thing, but I found the interfaces somewhat lacking (are we really still producing sites with MIDI soundtracks in 2010?)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Thus was born&amp;nbsp;&lt;a href="http://slimpoints.appspot.com/"&gt;this weekend's project&lt;/a&gt;. At least until&amp;nbsp;WW decides to shut it down. Here's the breakdown of where the time went:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;2 hours brainstorming&lt;/li&gt;
&lt;li&gt;4 hours getting Intellij, GWT and Google App Engine to all play nicely (this was the most painful part, really)&lt;/li&gt;
&lt;li&gt;3 hours basic coding, page layout, getting the tabs to work&lt;/li&gt;
&lt;li&gt;45 minutes with an Emacs macro converting HTML tables with food point values into a nice, CSV-style GWT properties file&lt;/li&gt;
&lt;li&gt;2 hours playing around with font sizes and colors. &amp;nbsp;I'm still not 100% happy with this, but the project was time-limited by definition.&lt;/li&gt;
&lt;li&gt;1/2 hour enabling AdSense, getting things to look relatively nice&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;div&gt;A grand total of&amp;nbsp;260 lines of code. &amp;nbsp;GWT's SuggestBox made autocomplete so much easier than Wicket Extensions' AutoCompleteTextField, which I had to use recently.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;The project is "done" in the sense that I am happy with it, and would feel content if I never spent another hour of time on it; that was part of my criteria for something doable in a weekend. &amp;nbsp;But that doesn't mean I'll never revisit it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;One potential idea is to make an iPhone-friendlier version of it, with some big calculator-style buttons right on the page to facilitate data entry. &amp;nbsp;I might come back to this idea in the future if the site analytics tell me it's worthwhile. &amp;nbsp;(As a side note, compared to the time and effort required to get an &lt;a href="http://itunes.apple.com/us/app/another-tip-calculator-yatc/id316488754?mt=8"&gt;iPhone app of equivalent complexity&lt;/a&gt; published, this was a piece of cake.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;So, what fun projects are you working on?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-8903738812890999672?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6F0Ws9StdlqCRzeDKnIuBOZ-s0M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6F0Ws9StdlqCRzeDKnIuBOZ-s0M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6F0Ws9StdlqCRzeDKnIuBOZ-s0M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6F0Ws9StdlqCRzeDKnIuBOZ-s0M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/v0GqCQCkAQs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/8903738812890999672/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2010/03/weekend-hack-13-14-march-2010.html#comment-form" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/8903738812890999672?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/8903738812890999672?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/v0GqCQCkAQs/weekend-hack-13-14-march-2010.html" title="The Weekend Hack: 13-14 March, 2010" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><thr:total>9</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2010/03/weekend-hack-13-14-march-2010.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4NSHk7eyp7ImA9WxBbFUU.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-2096621923956980954</id><published>2010-03-14T00:56:00.001-05:00</published><updated>2010-03-14T12:43:19.703-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-14T12:43:19.703-04:00</app:edited><title>How to Disable "Top Sites" in Safari</title><content type="html">&lt;div style="text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;a href="http://1.bp.blogspot.com/_ix4Bk4u8y0E/S2RNnnqEjaI/AAAAAAAAADs/zgnsKZGZQoc/s1600-h/Top+Sites+Demo.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5432552393571339682" src="http://1.bp.blogspot.com/_ix4Bk4u8y0E/S2RNnnqEjaI/AAAAAAAAADs/zgnsKZGZQoc/s400/Top+Sites+Demo.png" style="cursor: hand; cursor: pointer; display: block; height: 400px; margin: 0px auto 10px; text-align: center; width: 378px;" /&gt;&lt;/a&gt;&lt;br /&gt;
Although it might be pretty eye-candy, I do not find the Top Sites feature in Safari4 to be terribly useful for anything.  You open a new tab or window, and Safari sits there spinning while loading a bunch of web sites you may or may not be interested in going to.  I find Safari to be a whole lot faster with the feature turned off.&lt;br /&gt;
&lt;br /&gt;
It's simple. &amp;nbsp;Open Preferences, and tweak the settings for "New windows open with" and "New tabs open with" to be either an &lt;b&gt;Empty Page&lt;/b&gt;, or whatever &lt;b&gt;Home Page&lt;/b&gt; you prefer.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5432552810915130594" src="http://3.bp.blogspot.com/_ix4Bk4u8y0E/S2RN_6YlbOI/AAAAAAAAAD0/2erZD2-Cx_0/s400/Disable+Top+Sites.png" style="cursor: pointer; display: block; height: 400px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 359px;" /&gt;&lt;a href="http://1.bp.blogspot.com/_ix4Bk4u8y0E/S2RNnnqEjaI/AAAAAAAAADs/zgnsKZGZQoc/s1600-h/Top+Sites+Demo.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_ix4Bk4u8y0E/S2RNnnqEjaI/AAAAAAAAADs/zgnsKZGZQoc/s1600-h/Top+Sites+Demo.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_ix4Bk4u8y0E/S2RNnnqEjaI/AAAAAAAAADs/zgnsKZGZQoc/s1600-h/Top+Sites+Demo.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-2096621923956980954?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dl2l12-qOPQtd_R1gcU-XYsqySo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dl2l12-qOPQtd_R1gcU-XYsqySo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dl2l12-qOPQtd_R1gcU-XYsqySo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dl2l12-qOPQtd_R1gcU-XYsqySo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/AeTVmle3AVo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/2096621923956980954/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2010/03/how-to-disable-top-sites-in-safari4.html#comment-form" title="10 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/2096621923956980954?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/2096621923956980954?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/AeTVmle3AVo/how-to-disable-top-sites-in-safari4.html" title="How to Disable &quot;Top Sites&quot; in Safari" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_ix4Bk4u8y0E/S2RNnnqEjaI/AAAAAAAAADs/zgnsKZGZQoc/s72-c/Top+Sites+Demo.png" height="72" width="72" /><thr:total>10</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2010/03/how-to-disable-top-sites-in-safari4.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcBRX86eCp7ImA9WxBbEEw.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-5076794859272087621</id><published>2010-03-07T20:50:00.001-05:00</published><updated>2010-03-07T20:50:54.110-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-07T20:50:54.110-05:00</app:edited><title>Why no "Here" Documents for Java?</title><content type="html">&lt;span class="Apple-style-span" style="color: #333333; font-family: Georgia, serif; font-size: 13px; line-height: 20px;"&gt;Many languages support the notion of &amp;nbsp;"&lt;a href="http://en.wikipedia.org/wiki/Here_document"&gt;here documents&lt;/a&gt;".&amp;nbsp;&amp;nbsp;This is a handy way of embedded string literals that would normally have to be escaped right into your program text. &amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: Georgia, serif; font-size: 13px; line-height: 20px;"&gt;&lt;span class="Apple-style-span" style="color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 18px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;pre class="highlight" style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: #323232; background-image: initial; background-repeat: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 14px; font-style: inherit; font-weight: inherit; font: normal normal normal 1em/normal 'andale mono', 'lucida console', monospace; line-height: 1.5; margin-bottom: 1.5em; margin-left: 0px; margin-right: 0px; margin-top: 1.5em; padding-bottom: 1.5em; padding-left: 1.5em; padding-right: 1.5em; padding-top: 1.5em; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="color: #eeeeee;"&gt;#!/bin/sh
cat &amp;lt;&amp;lt; "EOF"
Here is some text, embedded

  "right in the middle"

of my Bourne shell script.
EOF
&lt;/span&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Georgia, serif; font-size: 13px; line-height: 20px;"&gt;Having been a standard feature in the Unix shells for decades, this language structure is supported in many newer languages, such as Ruby. Python, PHP and Perl. &amp;nbsp;But not Java. &amp;nbsp;In Java, this program would look like:&lt;/span&gt;&lt;br /&gt;
&lt;pre class="highlight" style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: #323232; background-image: initial; background-repeat: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 14px; font-style: inherit; font-weight: inherit; font: normal normal normal 1em/normal 'andale mono', 'lucida console', monospace; line-height: 1.5; margin-bottom: 1.5em; margin-left: 0px; margin-right: 0px; margin-top: 1.5em; padding-bottom: 1.5em; padding-left: 1.5em; padding-right: 1.5em; padding-top: 1.5em; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="color: #eeeeee;"&gt;System.out.println("Here is some text, embedded\n" +
"    \"right in the middle\"\n" +
"of my Java program.\n");
&lt;/span&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Georgia, serif; font-size: 13px; line-height: 20px;"&gt;As you can see, the quoting and escaping required to reproduce this text is pretty ugly.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: Georgia, serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: Georgia, serif; font-size: 13px; line-height: 20px;"&gt;Wouldn't it be nice if we could do this kind of thing in Java too? &amp;nbsp;It would be great for things like XML and Unit Tests. &amp;nbsp; How did we get to 2010 without having this as a standard language feature? &amp;nbsp;Has it ever come up in a JSR? &amp;nbsp; I haven't had much luck in digging up any information (the term "here document" is remarkably hard to search on.) If you know something about this, please leave a comment.&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: Georgia, serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-5076794859272087621?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pIBMuJ7uNcp-0TUGbxmEG56Rb8Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pIBMuJ7uNcp-0TUGbxmEG56Rb8Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pIBMuJ7uNcp-0TUGbxmEG56Rb8Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pIBMuJ7uNcp-0TUGbxmEG56Rb8Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/Fk2Txq4uRdE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/5076794859272087621/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2010/03/why-no-here-documents-for-java.html#comment-form" title="15 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/5076794859272087621?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/5076794859272087621?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/Fk2Txq4uRdE/why-no-here-documents-for-java.html" title="Why no &quot;Here&quot; Documents for Java?" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><thr:total>15</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2010/03/why-no-here-documents-for-java.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUESXwzeip7ImA9WxBbEEs.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-188479247636856538</id><published>2010-03-06T17:56:00.015-05:00</published><updated>2010-03-08T10:46:48.282-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-08T10:46:48.282-05:00</app:edited><title>Relax.  You can (mostly) stop using Interfaces in Java now.</title><content type="html">Detractors of Java are correct to point out a rather unfortunate trend in the Java world- there is a common tendency for developers to turn every non-trivial class into an Interface, and then create an "Impl" that actually does the work. &amp;nbsp;As a result, your codebase becomes littered with lots of superfluous interfaces that have only a single implementation. &lt;br /&gt;
&lt;br /&gt;
Why do we do this?&lt;br /&gt;
&lt;br /&gt;
Part of it is simple &lt;a href="http://www.joelonsoftware.com/articles/fog0000000018.html"&gt;architecture astronautics&lt;/a&gt;, but there is actually a very legitimate use case for creating interfaces even when there is only a single implementation- it allows you to mock out your objects so that other classes can be unit tested easily. This is really important in TDD, and so I've come to accept the fact that there will always be some extra "interface noise" in the codebase in order to support a good test infrastructure. &amp;nbsp;C'est la vie, right?&lt;br /&gt;
&lt;br /&gt;
Along comes JMock 2.5, with its &lt;a href="http://www.jmock.org/mocking-classes.html"&gt;ClassImposterizer&lt;/a&gt;,&amp;nbsp;backed by cglib.&lt;br /&gt;
&lt;blockquote&gt;&lt;i&gt;"The&amp;nbsp;&lt;/i&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="font-family: Times;"&gt;&lt;i&gt;ClassImposteriser&lt;/i&gt;&lt;/span&gt;&lt;/code&gt;&lt;i&gt;&amp;nbsp;creates mock instances&amp;nbsp;without&amp;nbsp;calling the constructor of the mocked class. So classes with constructors that have arguments or call overideable methods of the object can be safely mocked."&lt;/i&gt;&lt;/blockquote&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I should point out that this isn't exactly new- JMock 2.5 came out in 2008, so I'm a little late to the game here. &amp;nbsp;But I haven't seen much written about this. &amp;nbsp;It's a really huge change. &amp;nbsp;It&amp;nbsp;means that you can do things like:&lt;/div&gt;&lt;span class="Apple-style-span" style="color: #222222; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 18px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;pre class="highlight" style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: #323232; background-image: initial; background-repeat: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 14px; font-style: inherit; font-weight: inherit; font: normal normal normal 1em/normal 'andale mono', 'lucida console', monospace; line-height: 1.5; margin-bottom: 1.5em; margin-left: 0px; margin-right: 0px; margin-top: 1.5em; padding-bottom: 1.5em; padding-left: 1.5em; padding-right: 1.5em; padding-top: 1.5em; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="color: #eeeeee;"&gt;final java.awt.Graphics2D graphics = mockery.mock(java.awt.Graphics2D.class);
    mockery.checking(new Expectations() {{
    one(graphics).getBackground();
    will(returnValue(java.awt.Color.BLUE));
}});&lt;/span&gt;&lt;/pre&gt;Of course this is great for testing code that uses libraries that weren't designed with mocking in mind, but even better than that- you can use it against your own code, and save yourself from having to create interfaces.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;This means you can go ahead and create your concrete MyComplicatedDAO, without having to create MyComplicatedDAOIFace, MyComplicatedDAOImpl, MyComplicatedDAODummy, etc. &amp;nbsp;When you need to test code that uses it, you just do:&lt;br /&gt;
&lt;pre class="highlight" style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: #323232; background-image: initial; background-repeat: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 14px; font-style: inherit; font-weight: inherit; font: normal normal normal 1em/normal 'andale mono', 'lucida console', monospace; line-height: 1.5; margin-bottom: 1.5em; margin-left: 0px; margin-right: 0px; margin-top: 1.5em; padding-bottom: 1.5em; padding-left: 1.5em; padding-right: 1.5em; padding-top: 1.5em; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: Times;"&gt;&lt;span class="Apple-style-span" style="font-size: medium; line-height: normal; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: #eeeeee; font-family: 'andale mono', 'lucida console', monospace; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 19px; white-space: pre-wrap;"&gt;final MyComplicatedDAO dao = mockery.mock(MyComplicatedDAO.class);
    mockery.checking(new Expectations() {{
    one(dao).getLoggedInUsername();
    will(returnValue("user1"));
}});&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 19px; white-space: pre-wrap;"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div&gt;It's really hard to overstate the significance of this. &amp;nbsp; It's changed the way I write and test code. It's very refreshing to be able to start out with a concrete class and &lt;i&gt;write code that does stuff,&lt;/i&gt; rather than code that merely &lt;i&gt;talks&lt;/i&gt; about doing stuff.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Of course there are still very legitimate reasons for using interfaces. If you're designing a library, using interfaces makes life easier on your users.&amp;nbsp;Interfaces are also a great way to decouple code, to remove circular dependencies, and to support callbacks. &amp;nbsp;All of these are legitimate and appropriate uses, and you shouldn't abandon them.&lt;br /&gt;
&lt;br /&gt;
But use interfaces with reason, and not by reflex.&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-188479247636856538?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xqjI6PsAIqHqn6FUkzw1lGN4c5I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xqjI6PsAIqHqn6FUkzw1lGN4c5I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xqjI6PsAIqHqn6FUkzw1lGN4c5I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xqjI6PsAIqHqn6FUkzw1lGN4c5I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/_PzB3ZF3L54" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/188479247636856538/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2010/03/relax-you-can-mostly-stop-using.html#comment-form" title="90 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/188479247636856538?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/188479247636856538?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/_PzB3ZF3L54/relax-you-can-mostly-stop-using.html" title="Relax.  You can (mostly) stop using Interfaces in Java now." /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><thr:total>90</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2010/03/relax-you-can-mostly-stop-using.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUASHY9fip7ImA9WxBbEEw.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-4474706681478325964</id><published>2010-02-06T17:09:00.134-05:00</published><updated>2010-03-07T21:10:49.866-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-07T21:10:49.866-05:00</app:edited><title>No More Russian Dolls- Respecting the Law of Demeter</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_ix4Bk4u8y0E/S3I2aXPiZEI/AAAAAAAAAEE/AYA7FEu9kl4/s1600-h/RussianDolls.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/S3I2aXPiZEI/AAAAAAAAAEE/AYA7FEu9kl4/s320/RussianDolls.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;My colleagues and I were struggling with some test ugliness- having to construct complicated object graphs so that a particular Class Under Test could get the argument it needed at test time. &amp;nbsp;Typically, the CUT would have some call in it like:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;pre class="highlight" style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: #323232; background-image: initial; background-repeat: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 14px; font-style: inherit; font-weight: inherit; font: normal normal normal 1em/normal 'andale mono', 'lucida console', monospace; line-height: 1.5; margin-bottom: 1.5em; margin-left: 0px; margin-right: 0px; margin-top: 1.5em; padding-bottom: 1.5em; padding-left: 1.5em; padding-right: 1.5em; padding-top: 1.5em; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: Times;"&gt;&lt;span class="Apple-style-span" style="font-size: medium; line-height: normal; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: #eeeeee; font-family: 'andale mono', 'lucida console', monospace; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 19px; white-space: pre-wrap;"&gt;a.getB().getC().getSomeField()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;So in order to test something that used A, we'd need to also construct instances of B and C, and wire them all together like a stack of Russian dolls. &amp;nbsp;For many of our tests, the test &lt;i&gt;scaffolding&lt;/i&gt; dwarfed the test proper, making it hard to tell what was really being tested.&lt;br /&gt;
&lt;br /&gt;
To address this, many of our tests were using the &lt;a href="http://en.wikipedia.org/wiki/Builder_pattern"&gt;Builder Pattern&lt;/a&gt; to build up these graphs. &amp;nbsp;This helped somewhat, by centralizing the construction of the objects, and it also led to some some re-use of the scaffolding code. But it still didn't address the underlying problem of having to build up crazy amounts of superfluous objects for the test.&lt;br /&gt;
&lt;br /&gt;
Anyone who's read Refactoring, or the Pragmatic Programmer series will recognize that the &lt;a href="http://en.wikipedia.org/wiki/Law_of_Demeter"&gt;Law of Demeter&lt;/a&gt; is in play here. &amp;nbsp;A, B, and C are too tightly coupled. We all know this is "bad", but somehow this never really bothered me much in production code. &amp;nbsp;In the age of modern IDEs, it's really easy to track down who is calling whom, and to re-work the code when you feel things have gotten out of hand.&lt;br /&gt;
&lt;br /&gt;
The typical remedy for fixing overly tight coupling is to use encapsulation or a delegate to hide the call chain. This never really struck me as much of an improvement, as it piled &lt;b&gt;yet another interface&lt;/b&gt; on top of the code. &amp;nbsp;Having spent too much time toiling with J2EE megaliths, I was wary of adding yet another layer.&lt;br /&gt;
&lt;br /&gt;
But then when we realized what this &lt;a href="http://c2.com/cgi/wiki?InappropriateIntimacy"&gt;inappropriate intimacy&lt;/a&gt; was doing to our tests, a light bulb went off. Adding a really small interface to class &lt;b&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;A&lt;/span&gt;&lt;/b&gt; doesn't really bloat the code, and most importantly- it gives the test code a hook where it can &lt;b&gt;mock out the single call that it really cares about&lt;/b&gt;, ignoring the rest.&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;&lt;div&gt;&lt;pre class="highlight" style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: #323232; background-image: initial; background-repeat: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 14px; font-style: inherit; font-weight: inherit; font: normal normal normal 1em/normal 'andale mono', 'lucida console', monospace; line-height: 1.5; margin-bottom: 1.5em; margin-left: 0px; margin-right: 0px; margin-top: 1.5em; padding-bottom: 1.5em; padding-left: 1.5em; padding-right: 1.5em; padding-top: 1.5em; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: Times;"&gt;&lt;span class="Apple-style-span" style="font-size: medium; line-height: normal; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: #eeeeee; font-family: 'andale mono', 'lucida console', monospace; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 19px; white-space: pre-wrap;"&gt;class A {
  private B b;
  public String getSomeField() {
     return b.getC().getSomeField();
  }
}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Clients of A now just call A.getSomeField(). &amp;nbsp;Test code that needs an A can get a very simple mock:&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;&lt;pre class="highlight" style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: #323232; background-image: initial; background-repeat: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 14px; font-style: inherit; font-weight: inherit; font: normal normal normal 1em/normal 'andale mono', 'lucida console', monospace; line-height: 1.5; margin-bottom: 1.5em; margin-left: 0px; margin-right: 0px; margin-top: 1.5em; padding-bottom: 1.5em; padding-left: 1.5em; padding-right: 1.5em; padding-top: 1.5em; vertical-align: baseline; white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: Times;"&gt;&lt;span class="Apple-style-span" style="font-size: medium; line-height: normal; white-space: normal;"&gt;&lt;span class="Apple-style-span" style="color: #eeeeee; font-family: 'andale mono', 'lucida console', monospace; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 19px; white-space: pre-wrap;"&gt;A mockedA = new A() { 
  @Override 
  public String getSomeField() {
      return "mockedResult";
  }
}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Yes, class &lt;b&gt;B&lt;/b&gt; is still sharing too much information here, but unless it's causing a problem, you can leave it alone for now, and apply the same fix to it only if it becomes an issue (maybe YAGNI). &lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
Obviously, this isn't some new industry-changing technique; it's been around forever. &amp;nbsp;But as&amp;nbsp;a result of applying it judiciously, our test scaffolding has been drastically reduced, and tests are easier to write and understand.&lt;br /&gt;
&lt;br /&gt;
No more Russian dolls.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;image credit:&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;a href="http://en.wikipedia.org/wiki/File:Russian-Matroshka.jpg"&gt;http://en.wikipedia.org/wiki/File:Russian-Matroshka.jpg&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-4474706681478325964?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LOWUDfbDXZQDdILD-ene-CBAitc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LOWUDfbDXZQDdILD-ene-CBAitc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LOWUDfbDXZQDdILD-ene-CBAitc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LOWUDfbDXZQDdILD-ene-CBAitc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/jCg1dtrSNYg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/4474706681478325964/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2010/02/no-more-russian-dolls-applying-law-of.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/4474706681478325964?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/4474706681478325964?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/jCg1dtrSNYg/no-more-russian-dolls-applying-law-of.html" title="No More Russian Dolls- Respecting the Law of Demeter" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ix4Bk4u8y0E/S3I2aXPiZEI/AAAAAAAAAEE/AYA7FEu9kl4/s72-c/RussianDolls.jpg" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2010/02/no-more-russian-dolls-applying-law-of.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MCRHw7fCp7ImA9WxBVEUU.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-436946958338777031</id><published>2010-01-28T13:46:00.004-05:00</published><updated>2010-02-14T17:11:05.204-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-14T17:11:05.204-05:00</app:edited><title>R.I.P., Mr. Salinger</title><content type="html">&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;i&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;"What I have to do, I have to catch everybody if they start to go over the cliff— I mean if they’re running and they don’t look where they’re going I have to come out from somewhere and catch them. That’s all I’d do all day. I’d just be the catcher in the rye and all."&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;/i&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-436946958338777031?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-JGrYsjMvEWbAR104KpdJL-09Hs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-JGrYsjMvEWbAR104KpdJL-09Hs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-JGrYsjMvEWbAR104KpdJL-09Hs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-JGrYsjMvEWbAR104KpdJL-09Hs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/asRLH4XPgP8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/436946958338777031/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2010/01/rip-mr-salinger.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/436946958338777031?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/436946958338777031?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/asRLH4XPgP8/rip-mr-salinger.html" title="R.I.P., Mr. Salinger" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><thr:total>2</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2010/01/rip-mr-salinger.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QCSHw7eip7ImA9WxBVEUU.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-4935093699936500998</id><published>2010-01-28T08:07:00.002-05:00</published><updated>2010-02-14T17:09:29.202-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-14T17:09:29.202-05:00</app:edited><title>Apple's iPad: One Ring to Rule Them All ?</title><content type="html">&lt;a href="http://3.bp.blogspot.com/_ix4Bk4u8y0E/S2HGTzKAVlI/AAAAAAAAADk/y8Yj6EAgusk/s1600-h/No+Flash.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5431840669037516370" src="http://3.bp.blogspot.com/_ix4Bk4u8y0E/S2HGTzKAVlI/AAAAAAAAADk/y8Yj6EAgusk/s320/No+Flash.png" style="cursor: hand; cursor: pointer; display: block; height: 185px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style="text-align: left;"&gt;Like any Apple fan, I want to run out and buy an iPad today.  I've wanted an eReader for quite some time now, and have been dragging my feet on getting a Kindle only because I wanted to see if Apple could produce something better.  Notwithstanding the current lack of reviews of its text quality, the iPad certainly seems to be the more compelling device.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;But there is a serious question you should ask yourself before taking the plunge.  How would you feel if someone took your current computer (laptop, desktop- whatever it is you use on a daily basis) and told you that you could only install software on it that the manufacturer authorized?  Do you currently check with Dell to see if it's OK to install Photoshop or Chrome on your machine? With the iPad, that will be your Brave New World.   Want to install the latest beta of your favorite program?  Well, &lt;b&gt;unless Apple makes radical changes to the App Store, you won't be able to do that&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;As an iPhone user, I was willing to make &lt;i&gt;some&lt;/i&gt; concessions to Apple regarding what apps could and could not do on the device.  It is after all a phone, and I want my phone to work when I use it.  I don't want the battery to die unexpectedly because some app was running in the background, or to lose my data because another app decided to scribble all over the file system.  A phone is an appliance, and by and large you want an appliance to behave predictably and reliably.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;But a tablet computer isn't quite the same thing.  It sits vaguely between "ebook reader" and "laptop computer".   As time goes on, I expect that laptops in general will start to look more and more like tablets.   As Jobs said,&lt;/div&gt;&lt;blockquote&gt;&lt;blockquote&gt;&lt;div style="text-align: left;"&gt;&lt;i&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="color: #444444;"&gt;"Browsing, Email, Photos, Video, Music, Games, eBooks... if there's gonna be a third category of device, it's gonna have to be better at these kinds of tasks than a laptop or a smartphone, otherwise it has no reason for being."&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;div style="text-align: left;"&gt;Right now you might use the iPad to read the New York Times while waiting for your bus, or to check your email while sitting in a café.  But will you eventually use it for actual work? If the technology gets good enough, will you leave your laptop behind and starting using your tablet for everything?  &lt;b&gt;Once you really come to rely on it for your work, will you still be comfortable with Apple exerting total control over every piece of software you install on it?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Did you notice during the demo that when Steve Jobs went to the NY Times website, there were lots of "missing plugin" icons where the Flash ads should have been?  At first I thought this was just an embarrassing mistake in delivery, but the more I think about it, the more I've come to believe that this was entirely intentional- &lt;b&gt;a message to the NY Times directly from Mr Jobs, saying that their website will look like crap on the device until they dump Flash&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Apple's &lt;a href="http://www.wired.com/gadgetlab/2008/11/adobe-flash-on/"&gt;antipathy towards Flash&lt;/a&gt;, and &lt;a href="http://news.cnet.com/2100-1012-5181434.html"&gt;Adobe in general&lt;/a&gt;, is nothing new.  And as much as I would love to see Flash banished from the web, this kind of complete control by Apple really worries me.  Don't get me wrong- I really want one of these devices.   But I'm not so sure I'm ready to give up that much control to Apple just yet.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-4935093699936500998?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/P4BrWxaivBU_n614GMpwRjhaWI8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/P4BrWxaivBU_n614GMpwRjhaWI8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/P4BrWxaivBU_n614GMpwRjhaWI8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/P4BrWxaivBU_n614GMpwRjhaWI8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/F-UBnh_G9YU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/4935093699936500998/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2010/01/apples-ipad-one-ring-to-rule-them-all.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/4935093699936500998?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/4935093699936500998?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/F-UBnh_G9YU/apples-ipad-one-ring-to-rule-them-all.html" title="Apple's iPad: One Ring to Rule Them All ?" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ix4Bk4u8y0E/S2HGTzKAVlI/AAAAAAAAADk/y8Yj6EAgusk/s72-c/No+Flash.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2010/01/apples-ipad-one-ring-to-rule-them-all.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cNQXc7cSp7ImA9WxBXE0g.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-5756671819621609101</id><published>2010-01-24T10:50:00.000-05:00</published><updated>2010-01-24T11:38:10.909-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-24T11:38:10.909-05:00</app:edited><title>Intellij needs to support more than a single editor window</title><content type="html">&lt;div style="text-align: left;"&gt;I've been a fan of &lt;a href="http://www.jetbrains.com/idea/"&gt;Intellij IDEA&lt;/a&gt; for years, since a friend introduced me to it.  It's &lt;i&gt;by far&lt;/i&gt; the best Java IDE around (this coming from a guy whose IDE used to be a combination of Emacs, "find" and "grep").  I (or my properly, my employer) have gladly paid each year to get the latest version of this awesome tool, along with its excellent tech support.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;But it's kind of absurd that IDEA, now entering its 10th year of existence, still does not support having multiple editor windows.  Yes, you can split the editor window horizontally and vertically, within the same window, but you cannot create two physical windows in which to view code side-by-side.   This leads to absurdities like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img style="text-align: left;float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 200px; height: 150px; " src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/S1xv8PF1pcI/AAAAAAAAAC8/LP20QsoTQEA/s200/intellij_stretched.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5430338331335828930" /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yes, that's a picture of the Intellij editor stretched across two LCDs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It turns out there is a &lt;a href="http://youtrack.jetbrains.net/issue/IDEABKL-67"&gt;feature request&lt;/a&gt; for this in their tracker.  Can you believe that it's been languishing there for over four years?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you're an Intellij user, please &lt;a href="http://youtrack.jetbrains.net/registerUserForm"&gt;create yourself an account&lt;/a&gt; on their tracker and vote for this issue.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-5756671819621609101?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1SnjltgHHIKJUkt27hN9--XUx_Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1SnjltgHHIKJUkt27hN9--XUx_Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1SnjltgHHIKJUkt27hN9--XUx_Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1SnjltgHHIKJUkt27hN9--XUx_Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/q4cOEUUDQGI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/5756671819621609101/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2010/01/intellij-needs-to-support-more-than.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/5756671819621609101?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/5756671819621609101?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/q4cOEUUDQGI/intellij-needs-to-support-more-than.html" title="Intellij needs to support more than a single editor window" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ix4Bk4u8y0E/S1xv8PF1pcI/AAAAAAAAAC8/LP20QsoTQEA/s72-c/intellij_stretched.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2010/01/intellij-needs-to-support-more-than.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUMRHg8fyp7ImA9WxBUGUU.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-6941677604752162852</id><published>2010-01-20T14:15:00.001-05:00</published><updated>2010-03-07T12:18:05.677-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-07T12:18:05.677-05:00</app:edited><title>42 Lines is Hiring</title><content type="html">&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-size: 15px; font-style: inherit; font-weight: inherit; font: normal normal normal 15px/25px Arial, sans-serif; margin-bottom: 20px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;b style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: white;"&gt;Position: Senior Java Engineer&lt;/span&gt;&lt;/b&gt; &lt;/div&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-size: 15px; font-style: inherit; font-weight: inherit; font: normal normal normal 15px/25px Arial, sans-serif; margin-bottom: 20px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;The position is a full time salaried position. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 25px;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;42 Lines is seeking a qualified engineer to become part of our development team. Want to work in an environment that values engineering expertise, minimizes bureaucracy, and focuses on the creation of excellent code? &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-size: 15px; font-style: inherit; font-weight: inherit; font: normal normal normal 15px/25px Arial, sans-serif; margin-bottom: 20px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: #333333; font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;div style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: inherit; font-size: 15px; font-style: inherit; font-weight: inherit; font: normal normal normal 15px/25px Arial, sans-serif; margin-bottom: 20px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span class="Apple-style-span" style="color: #f15a24;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;Read more at&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt; &lt;/span&gt;&lt;a href="http://42lines.net/employment/full_time_java_engineer"&gt;42lines.net&lt;/a&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-6941677604752162852?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/V8yBx6sqZiVvFvMnZufUNZFG4DM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/V8yBx6sqZiVvFvMnZufUNZFG4DM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/V8yBx6sqZiVvFvMnZufUNZFG4DM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/V8yBx6sqZiVvFvMnZufUNZFG4DM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/DwzdZQ0590I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/6941677604752162852/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2010/01/42-lines-is-hiring.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/6941677604752162852?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/6941677604752162852?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/DwzdZQ0590I/42-lines-is-hiring.html" title="42 Lines is Hiring" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><thr:total>1</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2010/01/42-lines-is-hiring.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcESH0_cSp7ImA9WxBRF0w.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-166695216046577239</id><published>2010-01-05T12:05:00.000-05:00</published><updated>2010-01-05T12:20:09.349-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-05T12:20:09.349-05:00</app:edited><title>Cleveland and Rouen Are Sister-Cities</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ix4Bk4u8y0E/S0N0uH8jHDI/AAAAAAAAAC0/J2qOIH4L9Sc/s1600-h/Rouen_Cathedrale.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://1.bp.blogspot.com/_ix4Bk4u8y0E/S0N0uH8jHDI/AAAAAAAAAC0/J2qOIH4L9Sc/s200/Rouen_Cathedrale.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5423306712040021042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;I used to live in Rouen, France.  I recently moved to Cleveland.  Today I learned that &lt;a href="http://francewithbenefits.blogspot.com/2008/01/cleveland-rouen-sister-city-agreement.html"&gt;Cleveland and Rouen became sister cities in 2008&lt;/a&gt;.  Small world!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-166695216046577239?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/b6Bi-XOzrnLkTtJnVVhLq0uB3vs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/b6Bi-XOzrnLkTtJnVVhLq0uB3vs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/b6Bi-XOzrnLkTtJnVVhLq0uB3vs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/b6Bi-XOzrnLkTtJnVVhLq0uB3vs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/vOs4QGg5VSo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/166695216046577239/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2010/01/cleveland-and-rouen-are-sister-cities.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/166695216046577239?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/166695216046577239?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/vOs4QGg5VSo/cleveland-and-rouen-are-sister-cities.html" title="Cleveland and Rouen Are Sister-Cities" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_ix4Bk4u8y0E/S0N0uH8jHDI/AAAAAAAAAC0/J2qOIH4L9Sc/s72-c/Rouen_Cathedrale.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2010/01/cleveland-and-rouen-are-sister-cities.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIMR3o-cSp7ImA9WxBTEEk.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-8841453936554877048</id><published>2009-11-15T19:31:00.000-05:00</published><updated>2009-12-05T16:13:06.459-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-05T16:13:06.459-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="apple tech" /><title>Apple Fails at Customer Service</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwCyQ2BCOwI/AAAAAAAAACI/ci_ucgi8bSA/s1600-h/Bluetooth+Mac.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 150px; height: 200px;" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwCyQ2BCOwI/AAAAAAAAACI/ci_ucgi8bSA/s200/Bluetooth+Mac.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5404515555292101378" /&gt;&lt;/a&gt;&lt;br /&gt;Before I get started, let me say that I've been a big Apple fan for a number of years now.  I've purchased enough Macbooks, iMacs, iPods, iPhones, and iTunes content that I sometimes feel that maybe I should just go ahead and have a portion of my salary direct-deposited to Apple. I've even turned down job offers from companies that "don't do Mac".  So publishing this blog entry feels almost like a betrayal of sorts.&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;In November, I started a new job.  They were kind enough to buy me pretty much whatever kind of top-of-the-line computer equipment I wanted.  I settled on a Mac Pro tower with quad core 2.93GHz, 8GB and 1TB.  A beast of a machine, with a hefty price tag of over $3.5K.  It arrived, and I was thrilled with it.  Until the second day, when it developed a problem with its fans. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;DOA #1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For some reason the fans just started going full-tilt all the time, on a completely unloaded CPU. Even from a totally cold-restart.  It was loud enough for my wife to inquire from another room, "what's that noise?"  I tried all the obvious things you might think of, and then some not-so-obvious things that the Apple tech support had me try over the phone. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nothing seemed to help, so the tech support offered to do a replacement, but told me that I'd have to box the machine up, ship it back to them, and then wait for them to receive it before sending me back a replacement.  Since I was starting a new job in a couple of days and I &lt;b&gt;needed&lt;/b&gt; this computer, this wouldn't work for me.  They suggested I bring it in to my local Apple Store and see if they could fix it.  The tech support guy was even kind enough to schedule me an appointment with a "Genius".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I lugged the tower (all 65 pounds of it) down to the Apple Store.  The tech there was nice, took the machine in the back for a while and ran a few diagnostics on it.  Eventually he came out and told me &lt;b&gt;he could not reproduce the problem,&lt;/b&gt; and that &lt;b&gt;all the diagnostics were normal&lt;/b&gt;. He admitted that it was a "little" loud, but not enough that he could isolate any particular component to replace.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now before I fell in love with Apple, I had been building my own PCs for years, and I can tell you that this was &lt;b&gt;not normal fan behavior&lt;/b&gt;.  It's certainly not normal to be able to hear your computer from the other side of the house.  And it didn't do this on day one; this anomalous behavior began on day two, so it just didn't make any sense that this was "normal".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I guessed that maybe it was just too loud in the back room for the Genius to really appreciate the sound this thing was making.  Or maybe he just didn't know how to fix it. Whatever.  I figured he'd just DOA it, and hand me a replacement on the spot.  Nope- Apple would certainly DOA it for me, &lt;b&gt;but since it was bought online, and not at the local store, I had to ship it back to Apple.&lt;/b&gt;  WTF?  So I had to lug all 65 pounds of it back home, defeated.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I called Apple back up, and tried to negotiate for some kind of "ship ahead replacement", whereby they could send me a replacement ASAP, and I would return the loud-but-functional machine once its replacement arrived (and then I could easy transfer my data, too).  Nope.  "But we paid extra for AppleCare!"  Nope.  I really needed a working computer for my upcoming start date, so I had to get my boss involved.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;He ended up spending over 70 minutes on the phone with them, and managed to "negotiate" a situation whereby he would purchase &lt;b&gt;another&lt;/b&gt;, identical Mac Pro, they would ship it, and after it arrived I'd send back the original machine for a refund.  So yes, they charged him for both machines, and the 2 x $3500 was on the company credit card until I shipped the defective unit back.  Ugh!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I sent a polite, but to-the-point letter to Apple explaining the situation, and how it was not very professional, that Dell does better, etc. etc.  The next day I get a call back from a very pleasant fellow named Ryan.  He explained that my email had reached "the executive level", that the lack of a "ship ahead" for defective units keeps coming up in customer service, and that he was happy to have my feedback.  He gave me his email address and direct phone number, and told me to get in touch if I needed anything.  This was a nice touch, even if he was just trying to make me feel better. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A week or so later, the new Mac arrives.  And it was blessedly silent.  My wife was happy, I was happy.  I transferred my data over, packed the old Mac up and shipped it back.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Bluetooth Blues, aka DOA #2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happy to finally have a machine that I could stand to be in the same room with, I went down to the Apple Store again and bought myself a shiny new &lt;b&gt;Magic Mouse&lt;/b&gt;, for $69.  Went home and tried to use it, but found that the mouse just stuttered all over the screen.  Tried it with my MacBook Pro, and it worked fine.  For some reason it just did not like the tower.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Again, I tried all the obvious things like software update, checking the battery, etc.  No good. Finally I noticed that the mouse would work if I brought it to within about 8 inches of the Mac Pro- any farther than that, and it stopped working.  So yeah you guessed it, a bad Bluetooth system on the new computer.  Ugh!  It turns out this is a &lt;a href="http://2718.us/blog/2009/10/26/mac-pro-2007-bluetooth/"&gt;fairly&lt;/a&gt; &lt;a href="http://www.macosxhints.com/article.php?story=20060928062014272"&gt;common&lt;/a&gt; &lt;a href="http://www.mcelhearn.com/2007/04/19/apple-bungles-bluetooth-in-mac-pro/"&gt;problem&lt;/a&gt;, going back to at least 2006 on the Mac Pro tower.  I called Apple tech support, they had me try a bunch of things, and eventually confirmed my diagnosis.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So this is &lt;b&gt;a second DOA unit&lt;/b&gt;.  You would think that maybe I had finally crossed some threshold where Apple would take pity on me, and just send me a new machine ASAP already, without making me go through all the "send us your bad unit first, and then we'll replace it" bullshit.  And you'd be wrong.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So again, they offered to have it repaired at my local Apple Store, and &lt;b&gt;assured me&lt;/b&gt; that they'd be able to fix it then and there, and not have to ship it away.  They even made the appointment for me.  I intentionally chose an appointment slot 4 days away, so that any parts they might need would be available, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So my Genius appointment arrives on Friday, and I lug the 65 pound box to the store one more time.  My appointment was for 9:30am.   They call my name, and I explain the long and sordid story.  Then Genius tells me "oh, but my tech won't be here until 11".  What?  But my appointment is at 9:30!  Turns out that Apple tech support did not communicate to the store that this would be a repair.  Oh, and another thing- they don't have the parts they need to fix the bluetooth- they'll have to order it, and it'll be another 1-3 days before it arrives.   Are you serious?  You want me to lug this computer back here &lt;b&gt;a third time&lt;/b&gt;?  Needless to say, I was pretty pissed off.  I explained to the guy that I understood that it wasn't &lt;i&gt;his&lt;/i&gt; fault, per se, but Apple needs to get its act together.   He offered to make me an appointment for next week, but I declined.  Frankly I had had enough.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I fired off an email to Ryan explaining what happened.  I get a call back from him, and incredibly, he tries to tell me that Apple has "gone above and beyond" in this situation.  Really? How so?  He says that by &lt;b&gt;letting us purchase a second computer &lt;/b&gt;before sending the defective one back, Apple has more than fulfilled its obligation to us.  Are you serious?  Are you standing within range of Steve Jobs' Reality Distortion Field or something?  I told him that I wasn't really sure why he was calling me, because if the point of his call was to make me feel better,  he's just pissed me off even more.   I say "thanks" and we hang up.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Capitulation&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I am so annoyed at this point that I don't even want to continue trying to get the computer fixed.  I went and bought a $50 Bluetooth USB adapter, and my mouse now works fine. Considering the hassle it would take to ship the damn thing back to Apple again, this is clearly the path of least resistance.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Apple- if this is how you treat business customers, customers who are tech-savvy and can diagnose problems with your equipment, what hope is there for anyone else?  What's the point of buying AppleCare?  After all, &lt;b&gt;even Dell will do a "ship ahead" &lt;/b&gt;for a defective part, even to a non-business home user.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Think Different indeed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-8841453936554877048?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9lrLzkeZ3mwCnVcrNNCgrj6Hr_8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9lrLzkeZ3mwCnVcrNNCgrj6Hr_8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9lrLzkeZ3mwCnVcrNNCgrj6Hr_8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9lrLzkeZ3mwCnVcrNNCgrj6Hr_8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/R326dwD6npk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/8841453936554877048/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2009/11/apple-fails-at-customer-service.html#comment-form" title="13 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/8841453936554877048?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/8841453936554877048?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/R326dwD6npk/apple-fails-at-customer-service.html" title="Apple Fails at Customer Service" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwCyQ2BCOwI/AAAAAAAAACI/ci_ucgi8bSA/s72-c/Bluetooth+Mac.jpg" height="72" width="72" /><thr:total>13</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2009/11/apple-fails-at-customer-service.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMCRn0_cSp7ImA9WxNVF08.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-5998095629040691238</id><published>2009-10-28T06:26:00.000-04:00</published><updated>2009-10-28T07:14:27.349-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-28T07:14:27.349-04:00</app:edited><title>Snow Leopard Migration Assistant Fail</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SuglYsIjclI/AAAAAAAAABg/SfXkgtEmfKQ/s1600-h/MacPro.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SuglYsIjclI/AAAAAAAAABg/SfXkgtEmfKQ/s200/MacPro.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5397605259497665106" /&gt;&lt;/a&gt;I've been using a Mac almost exclusively since about 2006.  Unsurprisingly, I have quite a lot of data on my system, and on its Time Machine backups.  Until recently I have been quite impressed with Apple's Migration Assistant- the tool that (used to!) seamlessly migrate your apps and data from an old machine to a new one.  It's one of those things that us smug Mac users brag about to our PC-using friends.  Recently however, I've been disappointed by it.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, my wife got a new MBPro from her job, which replaced her 3 year old MBPro.  I told her the migration would be a piece of cake.   I expected to do the usual trick where you boot the old machine into Firewire Target Mode, and the new machine sees the old one as a Firewire volume. No such luck- Apple changed the Firewire port on the newer MBPro, so she had to make a trip down to the Apple Store to get a new cable.  Turns out they sold her the wrong one, so at this point I opted for doing the migration using our WiFi.  Despite entering all the appropriate network configuration, the two computers couldn't talk to each other.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I ran a Cat5 cable between the two machines.  I was able to connect this time, but I kept getting thrown into an endless loop where you are prompted to enter a PIN to give the new computer access to the old one- it would connect for an instant, and then loop back to the beginning all over again.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Wife, sensing my frustration level, decided to bring it into her office and have the IT guys deal with it.  They had the appropriate Firewire cable and did the transfer without a hitch.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So fast forward to me getting a new job, and the requisite new toy: a totally decked-out quad-core MacPro with all the bells and whistles.  Time to migrate from my old MBPro to this new tower.  I'm about 4 hours into the transfer using Migration Assistant (we have the right cable now!) and it's still telling me that there are 10+ hours left in the transfer.    This doesn't look good.  So I pop open the Console tool, and lo and behold, I see that MigrateTool has in fact crashed, &lt;b&gt;despite the lack of any error messages on the screen.&lt;/b&gt;  I quit Migration Assistant, and start over. Same deal.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ix4Bk4u8y0E/SugjdNJORmI/AAAAAAAAABY/etiXZKLutdM/s1600-h/Migration+Assistant.png"&gt;&lt;img style="float:left; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 104px;" src="http://1.bp.blogspot.com/_ix4Bk4u8y0E/SugjdNJORmI/AAAAAAAAABY/etiXZKLutdM/s200/Migration+Assistant.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5397603138055063138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So I try erasing the Mac Pro's HD and starting with a fresh OS install from DVD. Migration Assistant &lt;b&gt;still&lt;/b&gt; silently crashes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I try doing a migration from my Time Machine volume as the source volume in Migration Assistant.  Same deal.   So I try doing a "manual" installation using Time Machine.  A few hours in, I finally get a somewhat helpful error message indicating that it cannot continue because &lt;b&gt;the source volume is case-sensitive, the target volume is case-insensitive&lt;/b&gt;, and there is a pair of conflicting files on the source drive "3.3.1.ga"  and "3.3.1.GA" (Hibernate, my favorite!)  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is not totally surprising, and is what I suspected might be the problem- back in 2006 I had made the poor decision to install my MBPro as case-sensitive, since that's what most Unixes use.  That's finally come back to bite me.  Anyway, I remove the duplicate file from the source machine, and carry on. Several hours later, Migration Assistant crashes again.  And since it doesn't print any helpful error message, I can't locate what is likely another duplicate file.  Ugh!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Obviously one solution might be to re-install the machine as case-sensitive, but I don't want to go through this kind of hell again during some future migration; I'd rather pay the piper now and be done with it.  I have a call into Apple Tech Support (you get 90 days free support on any new machine, even without Apple Care.. did you know that?)   I will update as things progress. Any suggestions for solving this are greatly welcome.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-5998095629040691238?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rYPEVQj-X4fj5GQpjj8p0tV5uoA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rYPEVQj-X4fj5GQpjj8p0tV5uoA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rYPEVQj-X4fj5GQpjj8p0tV5uoA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rYPEVQj-X4fj5GQpjj8p0tV5uoA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/5d4yzQEdSao" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/5998095629040691238/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2009/10/snow-leopard-migration-assistant-fail.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/5998095629040691238?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/5998095629040691238?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/5d4yzQEdSao/snow-leopard-migration-assistant-fail.html" title="Snow Leopard Migration Assistant Fail" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SuglYsIjclI/AAAAAAAAABg/SfXkgtEmfKQ/s72-c/MacPro.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2009/10/snow-leopard-migration-assistant-fail.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcCQn09eCp7ImA9WxNWFk4.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-3325654415576203075</id><published>2009-10-15T14:36:00.000-04:00</published><updated>2009-10-15T14:41:03.360-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-15T14:41:03.360-04:00</app:edited><title>Intellij IDEA Open Sourced</title><content type="html">&lt;div&gt;This is great news: &lt;a href="http://blogs.jetbrains.com/idea/2009/10/intellij-idea-open-sourced/"&gt;Intellij IDEA Open-Sourced&lt;/a&gt;.  If you're an Eclipse or Netbeans user you owe it to yourself to try out Intellij, especially now that it's free.   Yes, there are some features that are not included in the free edition, such as Google App Engine or GWT support.  But I really hope this encourages more devs to check it out.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-3325654415576203075?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Vt3lY6_gnuDtlpQz53YzHLuT8CY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Vt3lY6_gnuDtlpQz53YzHLuT8CY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Vt3lY6_gnuDtlpQz53YzHLuT8CY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Vt3lY6_gnuDtlpQz53YzHLuT8CY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/xLnrcIYZmN0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/3325654415576203075/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2009/10/intellij-idea-open-sourced.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/3325654415576203075?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/3325654415576203075?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/xLnrcIYZmN0/intellij-idea-open-sourced.html" title="Intellij IDEA Open Sourced" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2009/10/intellij-idea-open-sourced.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEDQH84eSp7ImA9WxBXFE8.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-6119140578851982145</id><published>2009-10-01T16:26:00.000-04:00</published><updated>2010-01-25T08:37:51.131-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-25T08:37:51.131-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="artificial-intelligence singularity" /><title>The end of AI Winter?</title><content type="html">&lt;div&gt;&lt;div&gt;Is it the &lt;a href="http://machineslikeus.com/the-end-of-AI-winter.html"&gt;end of AI Winter&lt;/a&gt;? machineslikeus.com thinks Spring might be around the corner.&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 20px; font-weight: bold; "&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;An AI Winter is a collapse in the perception of artificial intelligence research. The term was coined by analogy with the relentless spiral of a nuclear winter: a chain reaction of pessimism in the AI community, followed by pessimism in the press, followed by a severe cutback in funding, followed by the end of serious research.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-6119140578851982145?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lhjn5LFPyKXQY3CmkcJHKihaIVg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lhjn5LFPyKXQY3CmkcJHKihaIVg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lhjn5LFPyKXQY3CmkcJHKihaIVg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lhjn5LFPyKXQY3CmkcJHKihaIVg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/8F8_YrpOwDY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/6119140578851982145/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2009/10/end-of-ai-winter.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/6119140578851982145?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/6119140578851982145?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/8F8_YrpOwDY/end-of-ai-winter.html" title="The end of AI Winter?" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2009/10/end-of-ai-winter.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkINQXkyfCp7ImA9WxNXEkk.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-1965095450783394696</id><published>2009-09-29T13:58:00.001-04:00</published><updated>2009-09-29T14:23:10.794-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-29T14:23:10.794-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ajax google-app-engine gwt" /><title>Make your Ajax apps seem snappier with a faster animated gif</title><content type="html">&lt;div&gt;I often lament the slow speed of the &lt;a href="http://code.google.com/appengine/docs/java/gettingstarted/usingdatastore.html"&gt;datastore&lt;/a&gt; used by Google's App Engine, relative to an old-fashioned RDBMS.  While Google's datastore is designed to scale well for many, many simultaneous requests, it's a bit pokey on day-to-day CRUD operations.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To deal with this, I implemented a standard "loading" icon that my app displays when accessing the datastore. This way my users will know that something is happening behind the scenes, and not assume that my app has simply stopped responding.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Recently I decided to pretty things up a bit, and so I used the &lt;a href="http://www.ajaxload.info/"&gt;GIF Generator&lt;/a&gt; at Ajaxload to create a gif that better matched &lt;a href="http://recipeminder.appspot.com"&gt;my app's&lt;/a&gt; color scheme.  I installed it, and quickly forgot about it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Later that same day, I went back to my site and was pleasantly surprised at how quickly App Engine was serving things up- things were noticeably snappier.  Initially I chalked it up to the vagaries of the load on App Engine, but then I remembered the updated GIF I had installed.  In addition to matching my site's color scheme, it also happened to "spin" faster than the old one. I was shocked at what a huge difference this made!  Even though the actual wall-clock time spent is roughly the same, a faster-spinning icon made a huge difference in the &lt;i&gt;perceived&lt;/i&gt; wait time.  And that's what really matters most, isn't it?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PS: I wanted to include examples of the spinners, but Blogspot does not seem to support animated gifs.  :-(&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-1965095450783394696?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8APvOfy8y7riYnUDPj0hBlUXVp8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8APvOfy8y7riYnUDPj0hBlUXVp8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8APvOfy8y7riYnUDPj0hBlUXVp8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8APvOfy8y7riYnUDPj0hBlUXVp8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/8P1zJfOP488" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/1965095450783394696/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2009/09/make-your-ajax-apps-seem-snappier-with.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/1965095450783394696?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/1965095450783394696?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/8P1zJfOP488/make-your-ajax-apps-seem-snappier-with.html" title="Make your Ajax apps seem snappier with a faster animated gif" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><thr:total>0</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2009/09/make-your-ajax-apps-seem-snappier-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EFSX46eyp7ImA9WxNXEEo.&quot;"><id>tag:blogger.com,1999:blog-3562558747791280858.post-4703341800835168720</id><published>2009-09-27T12:54:00.000-04:00</published><updated>2009-09-27T13:13:38.013-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-27T13:13:38.013-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="buckeyes" /><title>Buckeyes Are Dangerous Weapons</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ix4Bk4u8y0E/Sr-cWv-4J4I/AAAAAAAAAA0/psnZp68LqBc/s1600-h/photo.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 150px; height: 200px;" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/Sr-cWv-4J4I/AAAAAAAAAA0/psnZp68LqBc/s200/photo.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5386195594009651074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ix4Bk4u8y0E/Sr-cNOKh77I/AAAAAAAAAAs/bgwlrMhQ1NE/s1600-h/IMG_0247.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_ix4Bk4u8y0E/Sr-cNOKh77I/AAAAAAAAAAs/bgwlrMhQ1NE/s200/IMG_0247.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5386195430312898482" /&gt;&lt;/a&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;I moved to Cleveland recently. Today I encountered my first Buckeye while walking my dog. After it narrowly missed beaming me in the head, it still managed to draw blood when I picked it up and stuck myself on one of its thorns.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once safely disarmed, the inside appears quite edible. I took it home and was planning to eat it, until I read they were poisonous. How is this thing &lt;i&gt;not&lt;/i&gt; a weapon?&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3562558747791280858-4703341800835168720?l=garmhold.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kZz8DJ37VvODE0uAXdZpGAhck_8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kZz8DJ37VvODE0uAXdZpGAhck_8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kZz8DJ37VvODE0uAXdZpGAhck_8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kZz8DJ37VvODE0uAXdZpGAhck_8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/CaffeineComa/~4/Am5qhCdy0II" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://garmhold.blogspot.com/feeds/4703341800835168720/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://garmhold.blogspot.com/2009/09/buckeyes-are-dangerous-weapons.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/4703341800835168720?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3562558747791280858/posts/default/4703341800835168720?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CaffeineComa/~3/Am5qhCdy0II/buckeyes-are-dangerous-weapons.html" title="Buckeyes Are Dangerous Weapons" /><author><name>George Armhold</name><uri>http://www.blogger.com/profile/06389416781463514242</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/_ix4Bk4u8y0E/SwC8CODxrMI/AAAAAAAAACU/r4x2Rq-oizo/S220/george.jpeg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ix4Bk4u8y0E/Sr-cWv-4J4I/AAAAAAAAAA0/psnZp68LqBc/s72-c/photo.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://garmhold.blogspot.com/2009/09/buckeyes-are-dangerous-weapons.html</feedburner:origLink></entry></feed>

