<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-7818018</id><updated>2010-01-14T22:00:39.670-08:00</updated><title type='text'>shinyblog</title><subtitle type='html'>"did you take an awkward pill today?" "no, i'm always like this." (west wing)</subtitle><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default?start-index=26&amp;max-results=25'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sbshine.net/blog/rss.xml'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>242</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7818018.post-5415573440182227284</id><published>2009-10-14T11:57:00.000-07:00</published><updated>2009-10-14T12:16:02.056-07:00</updated><title type='text'>Java foreach loops on empty collections</title><content type='html'>I've been worrying about whether I need to check for null when invoking a foreach loop on a collection that might be empty. The answer is, nope, I don't need to check for an empty list; java just Does The Right Thing. &lt;br /&gt;&lt;pre&gt;List&amp;lt;Object&amp;gt; list = new ArrayList&amp;lt;Object&amp;gt;();&lt;br /&gt;logger.info("here's a list that was always empty: " + list.toString());&lt;br /&gt;for (Object o: list) {&lt;br /&gt;    logger.info("here's an object: " + o.toString());&lt;br /&gt;}&lt;br /&gt;logger.info("done");&lt;/pre&gt;&lt;br /&gt;...yields this output: &lt;br /&gt;&lt;pre&gt;INFO: here's a list that was always empty: []&lt;br /&gt;INFO: done&lt;/pre&gt;&lt;br /&gt;These alternate ways of expressing the same loop also all execute without a problem, even for an empty list: &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for (int i = 0; i &lt; list.size(); i++) {&lt;br /&gt;    Object o = list.get(i);&lt;br /&gt;    logger.info("here's an object: " + o.toString());&lt;br /&gt;}&lt;br /&gt;for (int i = 0; i &lt; list.size(); i++) {&lt;br /&gt;    Object o = list.get(i);&lt;br /&gt;    logger.info("here's an object: " + o.toString());&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;That's just a detail that's been bugging me, and now I understand the behavior. For what it's worth, I couldn't find this issue addressed in the JSR.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-5415573440182227284?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/5415573440182227284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=5415573440182227284' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/5415573440182227284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/5415573440182227284'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2009/10/java-foreach-loops-on-empty-collections.html' title='Java foreach loops on empty collections'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-4787617331464208904</id><published>2009-04-22T19:33:00.000-07:00</published><updated>2009-04-22T19:37:19.247-07:00</updated><title type='text'>best of ben</title><content type='html'>&lt;a href="http://delicious.com/sbshine/bestofben"&gt;Ben Shine's Recent Work&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-4787617331464208904?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/4787617331464208904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=4787617331464208904' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/4787617331464208904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/4787617331464208904'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2009/04/best-of-ben.html' title='best of ben'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-2688653196252840211</id><published>2009-04-19T15:33:00.000-07:00</published><updated>2009-04-19T15:42:51.684-07:00</updated><title type='text'>graphical diff for git on mac os x</title><content type='html'>I just configured git to use FileMerge for diffs. FileMerge is a pretty graphical diff tool. I couldn't find quite the right invocation via google, so here's what I did:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Create &lt;tt&gt;~/bin/git-diff-driver.sh&lt;/tt&gt; with these contents:&lt;br /&gt;&lt;pre&gt;#!/bin/sh&lt;br /&gt;/usr/bin/opendiff "$2" "$5"&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Make it executable &lt;br /&gt;&lt;pre&gt;chmod ugo+x ~/bin/git-diff-driver.sh&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Make git use this little script for diffs. Edit &lt;tt&gt;~/.gitconfig&lt;/tt&gt; to include these lines:&lt;br /&gt;&lt;pre&gt;[diff] &lt;br /&gt;        external = "/Users/ben/bin/git-diff-driver.sh"&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;Now the next time that you call &lt;tt&gt;git diff HEAD&lt;/tt&gt; FileMerge will open. GUI sweetness.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-2688653196252840211?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/2688653196252840211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=2688653196252840211' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/2688653196252840211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/2688653196252840211'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2009/04/graphical-diff-for-git-on-mac-os-x.html' title='graphical diff for git on mac os x'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-1829501950310126104</id><published>2009-02-23T11:04:00.001-08:00</published><updated>2009-02-23T11:10:00.055-08:00</updated><title type='text'>missing out on flex?</title><content type='html'>Last week I finally started using an AIR application, TweetDeck, because my brother said it was cool. Now I'm reading about Flex and AIR, and I have to say, I might have been missing out on a good thing. It looks to me like Flex and AIR are together a powerful front-end platform for building &lt;em&gt;nice&lt;/em&gt; applications... where by &lt;em&gt;nice&lt;/em&gt; I mean the things that Ben Shine traditionally loves: smooth, swoopy, delicate, rounded, subtle, surprising, &lt;em&gt;shiny&lt;/em&gt;. &lt;br /&gt;This bears investigation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-1829501950310126104?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/1829501950310126104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=1829501950310126104' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/1829501950310126104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/1829501950310126104'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2009/02/missing-out-on-flex.html' title='missing out on flex?'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-9169450460189214405</id><published>2009-02-19T21:46:00.000-08:00</published><updated>2009-02-19T22:07:30.144-08:00</updated><title type='text'>what's running on port 8080?</title><content type='html'>I learned an important new unix command today: &lt;tt&gt;lsof&lt;/tt&gt;. The name seems to stand for "&lt;tt&gt;&lt;b&gt;l&lt;/b&gt;i&lt;b&gt;s&lt;/b&gt;t &lt;b&gt;o&lt;/b&gt;pen &lt;b&gt;f&lt;/b&gt;iles&lt;/tt&gt;." The purpose of the command is to list information about the process who has opened a file. In unix-y OS's, sockets are file-ish, so &lt;tt&gt;lsof -i :8080&lt;/tt&gt; lists the process who opened the file named port 8080 on localhost, where ":8080" is interpreted as the address of a network file.&lt;br /&gt;In my case, I traced the rogue 8080 to an instance of tomcat being started up by ~/Library/Caches/IntelliJIDEA70/tomcat_Unnamed_adomainahexid. I could tell from the domain name that this was a tomcat that I was developing with four months ago. Ouch. &lt;br /&gt;I don't know why it was starting at system startup, but I'm not in the mood to dork around (anymore than I have already), so I &lt;tt&gt;rm -rf&lt;/tt&gt;'d the cache directory and moved the tomcat install to &lt;tt&gt;apache-tomcat-6.0.18-hideme&lt;/tt&gt;. It's gone now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-9169450460189214405?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/9169450460189214405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=9169450460189214405' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/9169450460189214405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/9169450460189214405'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2009/02/whats-running-on-port-8080.html' title='what&apos;s running on port 8080?'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-6370390385620401864</id><published>2009-02-06T14:43:00.000-08:00</published><updated>2009-02-06T14:49:46.822-08:00</updated><title type='text'>something else to hate about outlook 2003</title><content type='html'>When I reply to an email in Outlook 2003, the display of the original email in my inbox updates with the helpful annotation, "You replied on 2/6/2009 at 2:41 PM." That's fine. &lt;br /&gt;What sucks, though, is that Outlook applies that annotation &lt;em&gt;before I've actually sent the reply&lt;/em&gt;. There's a time period when I'm composing the reply during which Outlook &lt;em&gt;claims&lt;/em&gt; that I've sent a reply to a message, but I &lt;em&gt;I haven't actually replied yet.&lt;/em&gt; &lt;br /&gt;Ways in which this might be disastrous are left as an exercise to the reader.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-6370390385620401864?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/6370390385620401864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=6370390385620401864' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/6370390385620401864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/6370390385620401864'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2009/02/something-else-to-hate-about-outlook.html' title='something else to hate about outlook 2003'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-3832969397478019619</id><published>2009-01-06T22:53:00.000-08:00</published><updated>2009-01-06T23:18:07.140-08:00</updated><title type='text'>o glorious patterns (of enterprise application architecture)</title><content type='html'>Two years ago, I started reading Martin Fowler's book, &lt;span style="font-style:italic;"&gt;Patterns of Enterprise Application Architecture&lt;/span&gt;, on the recommendation of Adam Wolff, whose technical acumen I respect deeply. My first few times attempting the the book, the pages seemed to be made of a soporific variety of lead. I understood the words and the sentences and the paragraphs, but couldn't summon any interest in them.  &lt;br /&gt;Today at work, I somehow signed up to give an introductory talk on design patterns, so I went looking for my copy of the Gang of Four. I couldn't find it, but I did find &lt;span style="font-style:italic;"&gt;PEAA&lt;/span&gt;. I opened the cover and found a list of The Most Amazing Things Ever. Four patterns describing ways to represent complex class hierarchies in databases! Two different patterns for storing session state! Query objects! Remote facade! Value object! Service stub! Finally, here was a vocabulary for the architectural problems that have challenged and puzzled me for the last two years! O glorious book! Just reading the inside front cover has crystallized hours of design discussions and a comparative analysis of a dozen web application frameworks. This is beautiful stuff! &lt;br /&gt;Now I see why Adam was so excited about PEAA two years ago, and why I wasn't, and why I am now. If you're &lt;span style="font-style:italic;"&gt;not&lt;/span&gt; building enterprise applications, there's no reason to care about the patterns. Studying them is dry and, joyless. If you &lt;span style="font-style:italic;"&gt;are&lt;/span&gt; building enterprise applications, you spend your &lt;span style="font-style:italic;"&gt;best moments&lt;/span&gt; thinking about the issues addressed by these patterns. If you're lucky enough to work with other people -- and really, who builds an enterprise app alone? -- then you spend hours each day &lt;span style="font-style:italic;"&gt;talking&lt;/span&gt; about these issues. Beautiful, beautiful, glorious book!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-3832969397478019619?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/3832969397478019619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=3832969397478019619' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/3832969397478019619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/3832969397478019619'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2009/01/o-glorious-patterns-of-enterprise.html' title='o glorious patterns (of enterprise application architecture)'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-2539971740793469153</id><published>2008-12-25T21:54:00.000-08:00</published><updated>2008-12-25T22:34:40.977-08:00</updated><title type='text'>SOLUTION for "Rails requires RubyGems &gt;= 1.3.1" problem</title><content type='html'>If you don't care about running Rails 2.2, you can safely ignore this post. If you ran into the same problem I did, this post will help you solve it.&lt;br /&gt;I'm running Aptana Studio 1.2.1 with RadRails 1.0.0, and I'm creating a new Rails project using Rails 2.2.2. The wizard for a new RadRails project seemed to basically work, but it failed on starting the rails server with this error message: "Rails requires RubyGems &gt;= 1.3.1 (you have 1.2.0). Please `gem update --system` and try again." I tried that several times and it didn't work. Some googling revealed a solution, but the solution isn't quite spelled out in n00b-friendly language. (cwilliams on the aptana support site does &lt;a href="http://forums.aptana.com/viewtopic.php?t=7652"&gt;the best job yet&lt;/a&gt;, though) So here we go.&lt;br /&gt;Prologue: A lecture from your friendly sysadmin. &lt;em&gt;Never run commands that start with "su" if you don't know what they mean. &lt;/em&gt; &lt;br /&gt;Body: (much cribbed from &lt;a href="http://forums.aptana.com/viewtopic.php?p=27452#27452"&gt;cwilliams&lt;/a&gt; again)&lt;br /&gt;&lt;pre&gt;[ben@pro ~]$ sudo gem update rails   # get the latest version of rails&lt;br /&gt;[ben@pro ~]$ sudo gem update --system     # update the RubyGems system software&lt;br /&gt;[ben@pro ~]$ gem install linecache        # install the "linecache" gem &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;linecache is a requirement of RadRails that &lt;a href="http://support.aptana.com/asap/browse/ROR-1078"&gt;isn't listed in the requirements.&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;[ben@pro ~]$ ruby -S gem --version&lt;br /&gt;1.2.0&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;That tells me that I've got version 1.2.0 of gem installed. Gem is ruby's package manager. So let's install a gem whose purpose is to update the gem system. This is a little complicated, but it works:&lt;br /&gt;&lt;pre&gt;[ben@pro ~]$ sudo ruby -S gem install rubygems-update &lt;br /&gt;Password:&lt;br /&gt;Successfully installed rubygems-update-1.3.1&lt;br /&gt;1 gem installed&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Good. Now run the script that updates rubygems...&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[ben@pro ~]$ sudo ruby -S update_rubygems&lt;br /&gt;Installing RubyGems 1.3.1&lt;br /&gt;mkdir -p /Library/Ruby/Site/1.8&lt;br /&gt;mkdir -p /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;At the end of the output of the update_rubygems command, you'll see a long message from the RubyGems team. I'm pretty sure you can safely ignore it. Make sure you have the right version of gem installed now:&lt;br /&gt;&lt;pre&gt;[ben@pro ~]$ ruby -S gem --version&lt;br /&gt;1.3.1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Good. Now go back to Aptana and start your Rails server again: Window -&gt; Show Views -&gt; Servers. Right-click on the server named &amp;lt;project&amp;gt;Server. Select "Start server in debug mode" from the context menu. The status of the server should switch to "Starting." Right click on the server name again; select "Open Console/Shell." This should show a lovely shell whose output ends with &lt;br /&gt;&lt;pre&gt;** Mongrel 1.1.4 available at 127.0.0.1:3001&lt;br /&gt;** Use CTRL-C to stop. &lt;/pre&gt;&lt;br /&gt;Don't be frightened that all that text is in red. You're good, you're golden; rails is up and running.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-2539971740793469153?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/2539971740793469153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=2539971740793469153' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/2539971740793469153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/2539971740793469153'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2008/12/solution-for-rails-requires-rubygems.html' title='SOLUTION for &quot;Rails requires RubyGems &gt;= 1.3.1&quot; problem'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-3857098800809365986</id><published>2008-12-03T22:06:00.000-08:00</published><updated>2008-12-03T22:33:37.359-08:00</updated><title type='text'>two firsts</title><content type='html'>One, &lt;span style="font-weight: bold;"&gt;I wrote code with GOTOs&lt;/span&gt;. I'm setting up a highly constrained dev environment for my current contract. It has to be Windows XP, and it can't use cygwin. There are at least two different builds I have to run: one uses ant 1.6.5 and a vendor-specific implementation of jdk 1.4.2; the other uses Sun's jdk 1.4.2 and ant 1.7.0. In bash land, I'd just write a setup-foo.sh script and be done with it. In pure-windows windows, that's not going to fly.  (Even if I could use cygwin or mingw, ant command-line parameters in cmd.exe get really messy when invoked from bash. You can only do backtick cygpath -w so many times before going insane.) So, finally, a generation after it was released, I had to learn a little bit of dos scripting. I started with a book called "&lt;a href="http://safari.oreilly.com/1592000851"&gt;Microsoft Windows Shell Script Programming for the Absolute Beginner&lt;/a&gt;" and I felt like an absolute beginner. How do I express conditional logic? [if cond ( ... ) else ( ... ) actually kind of easier than bash] How do I accept command-line parameters?  [%1%, %2%, not unlike bash]. How do I call procedures? OMFG. CALL :SetupFoo. How do I return from procedures? Aiee! GOTO. I got to experience the joy of debugging code with GOTOs without an interactive debugger. Thanks, but no. Props to all of you who lived through that (hi, Pop) but I'm way happier with structured programming. Object-oriented programming, now, that's for the young kids... (Just kidding -- people my age can handle OOP; &lt;span style="font-style: italic;"&gt;aspect-oriented programming&lt;/span&gt; is for the young kids.)&lt;br /&gt;Two, &lt;span style="font-weight: bold;"&gt;I spontaneously generated a really nice roast chicken recipe&lt;/span&gt;. Occasional post-&lt;a href="http://body-mechanix.com/"&gt;workout&lt;/a&gt; brunches at &lt;a href="http://www.bouletteslarder.com/"&gt;Boulette's Larder&lt;/a&gt; have encouraged me to experiment with  embarassing amounts of butter and carmelized onions. Spud has been delivering a frozen organic bone-in chicken breast each week, and they were stacking up in my freezer; plus Trader Joe's had some really cute multicolor pearl onions. And there are insane cranberry sauces everywhere these days; I went with one from &lt;a href="http://www.biritemarket.com/"&gt;Bi-Rite&lt;/a&gt; that included apples and ginger. Combine that with my housemate's well-seasoned cast iron pan and a gas oven... Mmm. Yummies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-3857098800809365986?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/3857098800809365986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=3857098800809365986' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/3857098800809365986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/3857098800809365986'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2008/12/two-firsts.html' title='two firsts'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-1620378491308282313</id><published>2008-11-28T10:38:00.000-08:00</published><updated>2008-11-28T11:11:59.015-08:00</updated><title type='text'>aptana studio upgrades the IDE paradigm</title><content type='html'>&lt;a href="http://www.aptana.com/studio"&gt;Aptana Studio&lt;/a&gt; is a sweet little IDE, but it gets even sweeter now that they've added in &lt;a href="http://www.aptana.com/jaxer"&gt;Jaxer&lt;/a&gt; and &lt;a href="http://www.aptana.com/cloud"&gt;Cloud&lt;/a&gt;.&lt;br /&gt;My development life has been veering away from Java and towards JavaScript lately. I'd been coding in IntelliJ IDEA 7.04. It's got intense suites of features for java web development. IntelliJ IDEA 7 is pretty darn nice for javascript, css, and html; until Wednesday, it was my editor of choice. (Version 8 has added some &lt;a href="http://www.jetbrains.com/idea/features/javascript_editor.html"&gt;promising javascript support&lt;/a&gt;, but I haven't upgraded yet.)&lt;br /&gt;&lt;br /&gt;But &lt;a href="http://www.aptana.com/studio"&gt;Aptana Studio&lt;/a&gt; has delivered a game-changer: &lt;span style="font-weight: bold;"&gt;the IDE provides integrated deployment to  cloud servers. &lt;/span&gt;This is sick, sick, sick. Usually, in order to make a web site available publicly, a developer has to sign up with a hosting provider, register a domain, point DNS to the right name servers, configure Apache, and upload files to the right place, configure Apache some more, etc. That's not rocket science, but it's not what I want to spend my time doing. I want to sit down in the morning and have a proof-of-concept site running by midnight. (Registering a domain and provisioning a site usually takes at least 24 hours.)&lt;br /&gt;&lt;br /&gt;Aptana Studio delivered my one-day web 2.0 proof-of-concept deployment goal. Here's how!&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Aptana provides a virtual hosting service, Aptana Cloud. &lt;/li&gt;&lt;li&gt;I can sign up for and provision a cloud server from within Aptana Studio; they've got a brilliant 21-day-free-trial for a cloud server.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Standard stuff I'd expect from a virtual hosting provider: Aptana gives me a subdomain, name of my choice, and handles routing. At install time, I can choose which servers I wan to install.  &lt;/li&gt;&lt;li&gt;I write some javascript and html code -- pretty standard stuff.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In one operation, inside the IDE, I deploy my site to the cloud. Boom. There it is. &lt;/li&gt;&lt;li&gt;I edit the code. Another cloud sync, and my modified code is running on the remote site.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I can monitor my cloud's logs within the IDE.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Really, that's more like ten minutes -- so I got to spend the rest of the day actually writing code. Which is what I'm going to do now -- my review of Jaxer will have to wait.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-1620378491308282313?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/1620378491308282313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=1620378491308282313' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/1620378491308282313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/1620378491308282313'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2008/11/aptana-studio-upgrades-ide-paradigm.html' title='aptana studio upgrades the IDE paradigm'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-9221929436165597270</id><published>2008-10-09T15:46:00.000-07:00</published><updated>2008-10-09T15:53:57.316-07:00</updated><title type='text'>a lovely error message</title><content type='html'>I'm playing with &lt;a href="http://www.blogger.com/https//hudson.dev.java.net/"&gt;hudson, an extensible continuous integration engine&lt;/a&gt;. One of its optional tasks is to archive build artifacts. Using the ant syntax, I told it to archive everything named &lt;span style="font-family: courier new;"&gt;*.war&lt;/span&gt; in the &lt;span style="font-family: courier new;"&gt;dist&lt;/span&gt; directory. When I entered that string into its lovely ajax configuration page, Hudson immediately informed me of a problem:  &lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(204, 0, 0);"&gt;'dist/**/*.war' doesn't match anything: even 'dist' doesn't exist&lt;br /&gt;&lt;/span&gt;The best part of this error message is "even 'dist' doesn't exist."&lt;br /&gt;I could explain what's so cool about this, but if you don't know now, you'll never care, even if I do explain it. If you do see what's cool about it, go check out  &lt;a href="https//hudson.dev.java.net/"&gt;hudson.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-9221929436165597270?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/9221929436165597270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=9221929436165597270' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/9221929436165597270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/9221929436165597270'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2008/10/lovely-error-message.html' title='a lovely error message'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-2824379421856285011</id><published>2008-05-06T10:59:00.001-07:00</published><updated>2008-05-06T11:34:09.548-07:00</updated><title type='text'>gowebtop calendar: my current project</title><content type='html'>&lt;a href="http://www.gowebtop.com"&gt;gowebtop.com&lt;/a&gt; (free registration required) is now live with a preview of my current project, a calendar application within the gowebtop framework. For the highlights, see &lt;a href="http://gowebtop.com/blog/2008/05/05/introducing-laszlo-calendar/"&gt;the gowebtop blog&lt;/a&gt;. I worked on this project as a freelancer through &lt;a href="http://www.elasticprocess.com"&gt;Elastic Process&lt;/a&gt;, a San Francisco software consultancy, for our client, &lt;a href="http://www.laszlosystems.com"&gt;Laszlo Systems&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-2824379421856285011?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/2824379421856285011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=2824379421856285011' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/2824379421856285011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/2824379421856285011'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2008/05/gowebtop-calendar-my-current-project.html' title='gowebtop calendar: my current project'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-7957412110615111655</id><published>2008-02-17T11:38:00.000-08:00</published><updated>2008-02-17T12:00:44.550-08:00</updated><title type='text'>give them what they (say they) want</title><content type='html'>I feel guilty about walking past a hungry person and not helping them get some food, but I find it hard to believe that everyone claiming to be hungry in downtown San Francisco is only craving nutritional sustenance. An easy solution: when approached by a "hungry" person, I hand them some &lt;em&gt;actual food!&lt;/em&gt; I usually carry a snack with a long shelf life in my backpack: a baggie of nuts, a chocolate bar, some dried fruit. So when I'm approached by someone who says they're hungry, I offer them an actual treat looking just as yummy and nutritious as it was on the shelves of Whole Foods. &lt;br /&gt;The reaction I get to such offers is illuminating. An aggressive beggar in the big Westfield mall downtown literally recoiled at the offer of a bag of grape &lt;a href="http://www.clifbar.com/food/products_shot_bloks/"&gt;Clif Blox.&lt;/a&gt;. Sorry, buddy, but you need detox, not glucose. And yeah: the homeless community knows &lt;a href="http://www.svdp-sf.org/ozanam.htm"&gt;exactly where to go for free detox services&lt;/a&gt;, and they talk about it with more respect and dread than prison. (How do I know? Because I've talked to people who got sober for good after their 15th or 20th time through Ozanam.) &lt;br /&gt;I'm not saying that I can cure poverty or drug addiction or homelessness with a 300 calorie snack. I'm just saying, here's an ethical way to cope with pleas from which our society should not ignore. &lt;em&gt;Give them what they say they want.&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-7957412110615111655?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/7957412110615111655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=7957412110615111655' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/7957412110615111655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/7957412110615111655'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2008/02/give-them-what-they-say-they-want.html' title='give them what they (say they) want'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-6049092246911012289</id><published>2008-02-01T12:01:00.000-08:00</published><updated>2008-02-01T12:10:24.451-08:00</updated><title type='text'>"unsubscribe"</title><content type='html'>One of the best developments in the web this year: one-click unsubscribe links in promotional emails I must have signed up for at some point. Here's the scenario: I get some email from Random Business. I gave Random Business my email two years ago when I was interested in their random thing; I am no longer interested. I want to unsubscribe. &lt;br /&gt;&lt;b&gt;The old way:&lt;/b&gt; I'd follow a link in their email to a login screen. If I didn't remember my username and password, which I probably don't since it's been a while, I have to go through the forgot-my-password link, wait for email to arrive, then at least log in again, go to my preferences, edit my preferences, then click save and verify that I &lt;i&gt;really&lt;/i&gt; want to unsubscribe. &lt;br /&gt;&lt;b&gt;The new way:&lt;/b&gt; At the bottom of the promotional email, there's a link that says "Click here to unsubscribe." In the very best implementation, I click on that link and get a page which says, "myemail@mysite.com has been unsubscribed from all Random Business mailings." &lt;br /&gt;This was a very simple technology to put together, and could have been done a decade ago. &lt;b&gt;By focusing on an everyday annoyance felt by most email users, someone was able to vastly improve the user experience.&lt;/b&gt; I won't quite say this builds brand loyalty (I am, after all, unsubscribing) but it does decrease lingering annoyance. &lt;br /&gt;Companies with one-click unsubscribe, I salute you!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-6049092246911012289?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/6049092246911012289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=6049092246911012289' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/6049092246911012289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/6049092246911012289'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2008/02/unsubscribe.html' title='&quot;unsubscribe&quot;'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-4379353094566217054</id><published>2008-01-31T13:27:00.000-08:00</published><updated>2008-01-31T13:48:54.982-08:00</updated><title type='text'>linear time sorting, or, why remedial courses are not just for dullards</title><content type='html'>I've been listening to &lt;a href="http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-046JFall-2005/CourseHome/index.htm"&gt;an introductory course on algorithms&lt;/a&gt; from &lt;a href="http://ocw.mit.edu/OcwWeb/web/about/about/index.htm"&gt;MIT OpenCourseware&lt;/a&gt;. Today I learned that &lt;b&gt;it is possible to sort integers in linear time!&lt;/b&gt;! The technique I learned this morning, counting sort, only works for a particular kind of input: a list of &lt;span style="font-style:italic;"&gt;n&lt;/span&gt; integers in the range &lt;span style="font-style:italic;"&gt;0..k&lt;/span&gt;. (Or any known range; map it to &lt;span style="font-style:italic;"&gt;0..k&lt;/span&gt; for convenience.) If &lt;span style="font-style:italic;"&gt;k&lt;/span&gt; is much smaller than &lt;span style="font-style:italic;"&gt;n&lt;/span&gt;, you can sort in &lt;span style="font-style:italic;"&gt;Θ(n + k)&lt;/span&gt;. That's linear time, people! &lt;br /&gt;I'm 33, an Ivy League graduate, and I just discovered it's possible to sort in linear time! Where was I in (ahem) 1998 when &lt;a href="http://www.cs.brown.edu/~rt/"&gt;Roberto Tamassia&lt;/a&gt; was teaching this? Well, it looks like this year's equivalent class at Brown (now cs0160, then cs21) doesn't counting sort in the lecture notes. Or maybe I slept through it; I was a &lt;i&gt;sophomore&lt;/i&gt;. &lt;br /&gt;My point: reviewing a subject you used to know, from a different perspective and with more experience than you had at 18, can blow your mind with mind-blowing information that you might have missed the first time through. &lt;br /&gt;&lt;b&gt;WE CAN SORT INTEGERS IN LINEAR TIME!&lt;/b&gt; (for sets of integers meeting the requirement above.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-4379353094566217054?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/4379353094566217054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=4379353094566217054' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/4379353094566217054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/4379353094566217054'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2008/01/linear-time-sorting-or-why-remedial.html' title='linear time sorting, or, why remedial courses are not just for dullards'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-7804822114188156456</id><published>2008-01-08T12:06:00.001-08:00</published><updated>2008-01-08T12:06:52.635-08:00</updated><title type='text'>in praise of display calibration</title><content type='html'>I've been watching tv shows and dvd's on my giant LCD monitor, and wondering why it's so dark and moody and why everyone looks feverish. Somehow I convinced myself that I just shouldn't worry about it -- absolutely ridiculous when the whole point of a giant LCD display is fantastic picture quality. So here's what finally hit me, while I'm snuggled up with the sniffles: maybe calibrating my display would help. Boom! It just so happens that Mac OS X (Leopard baby!) has an expert-mode display calibration that crafts a custom gamma profile from about a dozen data points provided by the most advanced optics on the planet: my eyes. &lt;br /&gt;Now people on Studio 60 have normal skin tone and it doesn't look moody so much as, well, ebullient. Which is exactly what Aaron Sorkin and Thomas Schlamme were going for, I'm pretty sure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-7804822114188156456?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/7804822114188156456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=7804822114188156456' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/7804822114188156456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/7804822114188156456'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2008/01/in-praise-of-display-calibration.html' title='in praise of display calibration'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-2559900080597467455</id><published>2008-01-04T10:11:00.000-08:00</published><updated>2008-01-04T10:33:53.204-08:00</updated><title type='text'>naive users suffer</title><content type='html'>Yesterday I wrote about discovering that my mac became distressingly slow when paired with some peripherals I hadn't used with that particular machine before. I investigated and eventually deduced that the problem was the version of USB supported by my machine's hardware. A naive user, or even a moderately powerful software user, would not have a chance of figuring out a bus bandwidth mismatch. To determine that I only had USB 1.0 support, I looked at Apple's tech specs for this powerbook, which is in itself a challenge, because the powerbooks are differentiated by parenthetical keywords like "DVI" and "Gigabit Ethernet". Again, if I'm a naive user, there's no way I could figure out which one I have. Consulting the tech specs, I found that I had two 12 Mbps USB ports. When I do the math, that sounds slow for disk access: 1 gig = 1000 Mb = around 80 seconds if everything is cruising at top speed -- bleck. But it didn't say "USB 1.0" anywhere. Tech specs of later powerbooks explicitly said USB 2.0. Combined with the observed performance problems, I concluded that the problem was the USB version. &lt;br /&gt;There's no way a naive user could have figured this out. Even if they took the machine into a genius bar, they probably would have left the peripherals home, and the genius would just say, "it's operating as well as we could expect for a machine this old; if you want it faster you'd better buy a new machine." &lt;br /&gt;I'm not saying I'm such a whiz with diagnosing hardware issues; far from it! My point is that many people are subject to sub-optimal user experiences because of subtle hardware and software incompatibilities. &lt;br /&gt;All of which I suppose points to a more general idea: naive users of any technology or discipline suffer from their lack of expertise. My car could be tuned better; my taxes could be lower; my house could be heated more efficiently; my cel phone probably has superpowers it's hiding from me. I'm not sure what to do about this, though. Learn everything about everything? Okay! Good thing I've got another 60 years to live.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-2559900080597467455?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/2559900080597467455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=2559900080597467455' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/2559900080597467455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/2559900080597467455'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2008/01/naive-users-suffer.html' title='naive users suffer'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-4446818199897679578</id><published>2008-01-03T11:44:00.000-08:00</published><updated>2008-01-03T11:56:15.240-08:00</updated><title type='text'>slowed to a crawl by I/O</title><content type='html'>I'm using my PowerBook G4 Titanium as my main machine for a while -- hopefully not long, because this is insanely slow. I'm trying to understand how it was wonderful five years ago, and now painfully slow, when I'm just running a browser and iTunes and gmail notifier and not even a terminal. I figured it out: the I/O is making it seem hellaciously slow. I used to have a FireWire iPod; now I'm using a USB iPod (thank you, Marshall). I used to be satisfied with my built-in 30 gig hard disk; now I'm using an external half-terabyte disk. Here's the kicker: &lt;em&gt;this machine doesn't support USB 2!&lt;/em&gt; It was built back when firewire seemed like it was going to win. Firewire lost, though, at least for commodity consumer peripherals, and I'm hamstrung by slow IO. &lt;br /&gt;I'm picking out my next mac, and I'm having a hell of a time deciding between almost all the form factors. I need one &lt;em&gt;now&lt;/em&gt;, can't wait until after Macworld, so buying a monster macbook pro seems like a bad idea; I'll just be kicking myself when the prices drop and a new mindblower comes out in two weeks. The iMacs have the combination of tons more computing power and disk space for less money, but I've already got a huge wonderful display. (Hmm, could I use an iMac with the built-in display &lt;em&gt;and&lt;/em&gt; my widescreen external display? Mmm, tasty!) And of course, I adore the idea of a Mac Pro, but I got one of those a few years ago and immediately discovered I would rather have a laptop. The one that I can totally rule out is the mini; 2GB ram just isn't how I roll. Probably the thing to do is to get a Mac Pro now, and plan on getting the rumored new subnotebook as my next planned purchase. Buying components instead of all-in-one's is the most flexible, but least portable, solution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-4446818199897679578?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/4446818199897679578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=4446818199897679578' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/4446818199897679578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/4446818199897679578'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2008/01/slowed-to-crawl-by-io.html' title='slowed to a crawl by I/O'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-5213822900124215607</id><published>2007-12-30T11:46:00.001-08:00</published><updated>2007-12-30T11:57:21.189-08:00</updated><title type='text'>get your backstreet boys off my network!</title><content type='html'>If you're going to use a neighbor's open wifi connection, it's probably not a great idea to share your iTunes library. I opened my network a few days ago because I was having trouble getting my Powerbook G4 online; I couldn't get it to connect using any of the password-based security schemes. I thought I turned on MAC filtering, but the netgear router adminstration page was a bit confusing -- it shows a "Wireless Card Access List" but doesn't actually do MAC address filtering unless you've checked a box above the access list. So I thought I had a closed network, but I was wrong. Fine, I deserve to have neighbors find and share my connection. &lt;br /&gt;And then I launched iTunes and saw "Ernesto's LimeWire Library" under the "shared libraries" tag. (Not really his name.) Bwahhahha! Apparently Ernesto found my open network! I bet he had no idea that he was sharing his music.&lt;br /&gt;I returned to the netgear router admin, &lt;em&gt;actually&lt;/em&gt;  turned on MAC addr filtering, and bye-bye Ernesto! Whee! Now he's looking around going, damn, what happened to that open wifi? &lt;br /&gt;This is a nice feeling -- I did something kind of mean but I had every right to do it. That is so rare!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-5213822900124215607?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/5213822900124215607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=5213822900124215607' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/5213822900124215607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/5213822900124215607'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2007/12/get-your-backstreet-boys-off-my-network.html' title='get your backstreet boys off my network!'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-2953644506476741943</id><published>2007-11-24T19:06:00.000-08:00</published><updated>2007-11-24T19:38:53.306-08:00</updated><title type='text'>nutritious syntactic sugar</title><content type='html'>Is syntactic sugar just tasty, or does it actually improve the language? Depends on your definition of "improve," I suppose. I just found &lt;b&gt;a ruby idiom&lt;/b&gt; in &lt;a href="http://books.pragprog.com/titles/rails2"&gt;Agile Web Development with Rails&lt;/a&gt; that can make a very common, wordy coding task short and clear. We often have to say "give me a thing, and if it doesn't exist yet, make one for me." &lt;br /&gt;In Java:&lt;br /&gt;&lt;pre&gt;public cart findCart() {&lt;br /&gt;        if (cart == null) cart = new Cart();&lt;br /&gt;        return cart;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;In Ruby, this can be expressed as...&lt;br /&gt;&lt;pre&gt;def find_cart &lt;br /&gt;    session[:cart] ||= Cart.new &lt;br /&gt;end&lt;/pre&gt; &lt;br /&gt;The &lt;b&gt;or-equals operator&lt;/b&gt; belongs in a dynamic language, where expressions that evaluate to booleans can also be very nice rvalues. These three lines of code show off a few things about Ruby that might be mistaken for syntactic sugar, but &lt;em&gt;actually make the language better:&lt;/em&gt;&lt;ul&gt; &lt;br /&gt;        &lt;li&gt;Avoid unnecessary punctuation.&lt;/li&gt;&lt;br /&gt;        &lt;li&gt;Clean syntax for hashes make them almost as readable as member data accessors&lt;/li&gt;&lt;br /&gt;        &lt;li&gt;Most statements are also expressions.&lt;/li&gt;&lt;br /&gt;        &lt;li&gt;Implicit returns.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;em&gt;It's delicious... and nutritious!&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-2953644506476741943?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/2953644506476741943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=2953644506476741943' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/2953644506476741943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/2953644506476741943'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2007/11/nutritious-syntactic-sugar.html' title='nutritious syntactic sugar'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-2418910263574023871</id><published>2007-11-23T11:21:00.000-08:00</published><updated>2007-11-23T11:41:12.543-08:00</updated><title type='text'>Over-Preparedness Vindicated!</title><content type='html'>Last winter I posted the contents of my &lt;a href="http://sbshine.net/blog/2007/02/personal-geek-security-pack.html"&gt;personal geek security pack&lt;/a&gt;: some money, some painkiller, some duct tape, a BART ticket, a snack, that sort of thing. Since then I've been carrying it around in my backpack.&lt;br /&gt;&lt;br /&gt;In an incident involving an ice cream sandwich and an intra-pocket butter malfunction, I lost my wallet a few days ago. In Berkeley -- that's a large bay away from San Francisco. No problem! Well, okay, yeah, it was a problem, but the problem-ness was much ameliorated by having a BART ticket and twenty dollars cash in my personal geek security pack. I used the money to buy a bus ticket back to look for my wallet at the site of the ice-cream-sandwich incident, then retreated to San Francisco with the loaded BART ticket.&lt;br /&gt;&lt;br /&gt;The wallet hasn't turned up, but I've got spare ID tucked away in a safe place (not at home!) and a bunch more cash on my refrigerator door. Over-preparedness: vindicated!&lt;br /&gt;&lt;br /&gt;Now-- everybody go back up your data! And store the backups off-site! And put twenty bucks in a secret spot in your backpack! And for the love of Pete, don't put butter in your pockets!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-2418910263574023871?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/2418910263574023871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=2418910263574023871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/2418910263574023871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/2418910263574023871'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2007/11/over-preparedness-vindicated.html' title='Over-Preparedness Vindicated!'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-7171952851622664015</id><published>2007-11-22T10:58:00.000-08:00</published><updated>2007-11-22T11:12:01.909-08:00</updated><title type='text'>Slow news is good news?</title><content type='html'>I rarely read news online. You might think that leaves me out of crucial blogosphere zeitgeist or military-industrial-political news, but nope: my co-workers filter the web for me, forwarding articles about OpenLaszlo, net neutrality, software-as-a-service, and media business models; and I read messenger-bag-loads of books and magazines. Each month, I read &lt;a href="http://www.harpers.org/"&gt;Harper's&lt;/a&gt; cover-to-cover, with a liberal (heh) dose of the Atlantic, Utne Reader, MIT Technology Review, San Francisco, and occasional forays into The Economist, and the Sunday New York Times. Then a year or two after things happen, I read non-fiction books: &lt;a href="http://www.lawrencewright.com/books.html"&gt;The Looming Tower&lt;/a&gt;, the &lt;a href="http://books.google.com/books?id=gxNlbTCdr5kC&amp;amp;dq=great+deluge&amp;amp;pg=PP1&amp;amp;ots=cx-rDa-NPQ&amp;amp;sig=01bRcoM4r27x43jN5wdbQeMYofg&amp;amp;prev=http://www.google.com/search%3Fq%3Dgreat%2Bdeluge%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dorg.mozilla:en-US:official%26client%3Dfirefox-a&amp;amp;sa=X&amp;amp;oi=print&amp;amp;ct=title&amp;amp;cad=one-book-with-thumbnail"&gt;Great Deluge,&lt;/a&gt; &lt;a href="http://www.amazon.com/Assault-Reason-Al-Gore/dp/1594201226"&gt;the Assault on Reason&lt;/a&gt;, &lt;a href="http://www.naomiklein.org/shock-doctrine"&gt;the Shock Doctrine&lt;/a&gt;, that sort of thing.&lt;br /&gt;Reasoned slow analysis with editors and proofreaders and fact-checkers, passages I can go back to years later (without the internet way-back machine), passages that authors will have to stand by for decades, &lt;span style="font-style: italic;"&gt;footnotes&lt;/span&gt; -- yeah, I'll pay for that. What would the invasion of Iraq look like two years later? A &lt;a href="http://www.amazon.com/Fiasco-American-Military-Adventure-Iraq/dp/159420103X/"&gt;fiasco&lt;/a&gt;. What about the Thanskgiving 2007 travel breakdown? Check back in two years and I'll have read some reasoned analysis, complete with footnotes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-7171952851622664015?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/7171952851622664015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=7171952851622664015' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/7171952851622664015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/7171952851622664015'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2007/11/slow-news-is-good-news.html' title='Slow news is good news?'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-6216669271854124444</id><published>2007-10-17T11:02:00.000-07:00</published><updated>2007-10-17T11:10:58.546-07:00</updated><title type='text'>TurboTax Wins Me Over</title><content type='html'>After I &lt;a href="http://sbshine.net/blog/2007/10/turbotax-web-vs-turbotax-desktop.html"&gt;posted a complaint yesterday&lt;/a&gt;, TurboTax responded to me with superstar customer service. Bob Meighan, the VP of TurboTax, posted a response to my blog entry, and Becca from customer support wrote me a long detailed response, in which she offered to refund my fee for the online service. She explained that with a situation like that, real-time tech support would probably have been able to help me, and pointed out that perhaps my anti-virus software was the culprit. On my PC, I run an out-of-date version of Symantec Anti-Everything, which I haven't tweaked at all (assuming that I'm just hosed no matter what) so Becca might well be right about my anti-virus software interfering. &lt;br /&gt;&lt;br /&gt;So, &lt;em&gt;I'm getting my $109 back, and next year I'll use TurboTax Online again.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;My original point, with all of this, was that sometimes RIA's can be better than desktop applications, even for single-user applications where security matters. By sending all the information over the relatively straightforward, universal https protocol, application developers can shield users from network vicissitudes, while still providing as much security as direct connections from desktop to server. &lt;br /&gt;&lt;br /&gt;Granted, in an RIA model for TurboTax, I'm sending my financial information to Intuit, who then has the chance to do Evil Things with it -- but really, when I hit send on TurboTax Desktop, I have no more reason to believe that Intuit isn't caching and analyzing my data than I do with TurboTax Online. Once my financial information leaves my LAN, it's basically "out there," and I have no illusions about "privacy."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-6216669271854124444?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/6216669271854124444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=6216669271854124444' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/6216669271854124444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/6216669271854124444'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2007/10/turbotax-wins-me-over.html' title='TurboTax Wins Me Over'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-5424394364977108107</id><published>2007-10-16T10:38:00.000-07:00</published><updated>2007-10-16T11:27:37.193-07:00</updated><title type='text'>TurboTax Web vs TurboTax Desktop</title><content type='html'>I just finished filing my 2006 taxes, an activity made significantly more difficult by TurboTax. The desktop edition of TurboTax was unable to update itself, on my PC running Windows XP, despite hours and hours of trying. The one-click update didn't work; it didn't give me any feedback at all about whether it succeeded. The manual update looked like it worked, but the application kept telling me that I needed to get updated forms, which were not yet available from TurboTax. In September of 2007, the software promised that the forms would be ready by January 12, 2007. Er, what? In October of 2007, I got email from TurboTax saying that those forms were now ready -- bizarre since everyone else needed these forms in April 2007. (I'm not talking about obscure forms here; just Schedule C.) So I try &lt;em&gt;again&lt;/em&gt; to update my desktop TurboTax, and once again it fails. I go through some insane machinations from the support site ("open the command prompt and run this command: &lt;tt&gt;ping -mysterious -incantation&lt;/tt&gt;) to discover that my fragment size was insufficent. More TurboTax forums, and I learn that I have to set the MTU size on my router. Joy, joy -- my cable gateway (blazingly fast, blazingly expensive) doesn't allow the user to set the MTU. I don't blame Cisco, here -- I blame TurboTax, for not being able to cope with a net connection that handles everything else I throw at it. BitTorrent? Fine! Downloading 50mb installers? Fine! Sustained ssh connections for days? Fine! Downloading tax forms: nope. Ridiculous. &lt;br /&gt;At this point I mailed Intuit for support. They got back to me a few days later, and told me to do the things I had already done, which I had explained in my support request that I'd already done them. They told me to call them for support during business hours. &lt;em&gt;I have a job, people.&lt;/em&gt; TurboTax was supposed to be &lt;em&gt;convenient&lt;/em&gt; and there was supposed to be &lt;em&gt;readily available technical support.&lt;/em&gt; &lt;br /&gt;But &lt;em&gt;I needed to get my taxes done&lt;/em&gt;, and I could see that getting on the phone with them wasn't going to be helpful. I realized that I could avoid this subtle network incompatibility if I used the web-based TurboTax. Alas, web-based TurboTax can't import an incomplete return from desktop TurboTax, so I had to re-enter all my information. The tab key didn't work as nicely to move between fields as it did on the desktop application, but it was usable. After spending an hour or two filling out forms, my taxes were submitted and accepted. &lt;br /&gt;The lesson for TurboTax is... if connecting with your big fragment sizes fails with a desktop application, try making the connection over http or https. Yes, even desktop applications can connect over http.  &lt;br /&gt;And: Intuit, make live tech support available by phone 24/7 before October 15, not just before April 15.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-5424394364977108107?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/5424394364977108107/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=5424394364977108107' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/5424394364977108107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/5424394364977108107'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2007/10/turbotax-web-vs-turbotax-desktop.html' title='TurboTax Web vs TurboTax Desktop'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7818018.post-3416420651639885663</id><published>2007-10-12T10:37:00.000-07:00</published><updated>2007-10-12T11:24:28.400-07:00</updated><title type='text'>GORE OBAMA CLINTON CLINTON</title><content type='html'>Al Gore for President. &lt;br /&gt;Barack Obama for Vice President.&lt;br /&gt;Bill Clinton for Ambassador to the United Nations. &lt;br /&gt;Hillary Clinton for Secretary of Health and Human Services. &lt;br /&gt;Wes Clark for Secretary of State.&lt;br /&gt;Dennis Kucinich for Secretary of Labor. &lt;br /&gt;Ron Paul for Secretary of Homeland Security.  &lt;br /&gt;John McCain for Secretary of Defense. &lt;br /&gt;Max Cleland for Secretary of Veterans' Affairs. &lt;br /&gt;Jerry Brown for Secretary of Housing and Urban Development. &lt;br /&gt;Michael Pollan for Secretary of Agriculture.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7818018-3416420651639885663?l=sbshine.net%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/3416420651639885663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=7818018&amp;postID=3416420651639885663' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/3416420651639885663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7818018/posts/default/3416420651639885663'/><link rel='alternate' type='text/html' href='http://sbshine.net/blog/2007/10/gore-obama-clinton-clinton.html' title='GORE OBAMA CLINTON CLINTON'/><author><name>benjamin shine</name><uri>http://www.blogger.com/profile/10627836049284994114</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='11644432350980599129'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>