<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Scott Hanselman</title>
    <link>http://www.hanselman.com/blog/</link>
    <description>Scott Hanselman's Thoughts on Programming, Technology, Fatherhood, and Life</description>
    <image>
      <url>http://www.hanselman.com/blog/images/zenicon.jpg</url>
      <title>Scott Hanselman</title>
      <link>http://www.hanselman.com/blog/</link>
    </image>
    <copyright>admin</copyright>
    <lastBuildDate>Wed, 09 May 2012 21:42:10 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.4.279.6007</generator>
    <managingEditor>scott@hanselman.com</managingEditor>
    <webMaster>scott@hanselman.com</webMaster>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ScottHanselman" /><feedburner:info uri="scotthanselman" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/</creativeCommons:license><feedburner:emailServiceId>ScottHanselman</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><item>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=b369ca60-6e05-4d0b-a202-dbcb450ae31d</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=b369ca60-6e05-4d0b-a202-dbcb450ae31d</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=b369ca60-6e05-4d0b-a202-dbcb450ae31d</wfw:commentRss>
      <slash:comments>145</slash:comments>
      <title>The Floppy Disk means Save, and 14 other old people Icons that don't make sense anymore</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=b369ca60-6e05-4d0b-a202-dbcb450ae31d</guid>
      <link>http://feedproxy.google.com/~r/ScottHanselman/~3/Ma18EeSEGLo/TheFloppyDiskMeansSaveAnd14OtherOldPeopleIconsThatDontMakeSenseAnymore.aspx</link>
      <pubDate>Wed, 09 May 2012 21:42:10 GMT</pubDate>
      <description>&lt;div&gt;&lt;blockquote class="twitter-tweet"&gt;   &lt;p&gt;The Floppy Disk Icon means "save" for a whole generation of people who have never seen one.&lt;/p&gt; — Scott Hanselman (@shanselman) &lt;a href="https://twitter.com/shanselman/status/200065169286627328" data-datetime="2012-05-09T03:30:28+00:00"&gt;May 9, 2012&lt;/a&gt;&lt;/blockquote&gt; &lt;script src="//platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;  &lt;p&gt;What happens when all the things we based our icons on don't exist anymore? Do they just become, ahem, iconic glyphs whose origins are shrouded in mystery?&lt;/p&gt;  &lt;h3&gt;Floppy Disk - Save&lt;/h3&gt;  &lt;p&gt;Save? Save where? You know, down there. Adding the Arrow to the 3.5" floppy makes me smile. Is it pointing to under my desk? What's a floppy? Why not a USB key? Maybe a &lt;a href="http://www.hanselman.com/blog/ThereIsOnlyOneCloudIconInTheEntireUniverse.aspx"&gt;cloud icon&lt;/a&gt;? That will be easy since &lt;a href="http://www.hanselman.com/blog/ThereIsOnlyOneCloudIconInTheEntireUniverse.aspx"&gt;there is only One Cloud Icon in the world&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.redorbit.com/education/reference_library/technology_1/computers/2583372/floppy_disk/"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Floppy Disks of Various Sizes, 3.5" border="0" alt="Floppy Disks of Various Sizes, 3.5" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/24_be0e6c259c388444d13de1cdeccb9cbc_15b59a92-f4e8-4fd6-8c39-35f55d3c52dc.jpg" width="394" height="192" 10??="10??" 4?,="4?," 1="1" 5="5" ,="," /&gt;&lt;/a&gt;  &lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="disksave" border="0" alt="disksave" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/disksave_4a90b428-e98a-4189-82cc-fd6163c92f1a.png" width="240" height="192" /&gt;&lt;/p&gt;  &lt;h3&gt;Radio Buttons - Mutually Exclusive Choices&lt;/h3&gt;  &lt;p&gt;Why are they called Radio Buttons? Because my car radio used to have buttons where only one could be pressed at any time.  I miss my 8-track.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ginahoganedwards.wordpress.com/2011/02/05/life-gets-in-the-way-and-other-realities-of-the-human-writer%E2%80%99s-condition/"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="AM Radio from Gina Hogan Edwards' Blog" border="0" alt="AM Radio from Gina Hogan Edwards' Blog" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/car-radio-buttons_2d793f30-b95e-47e8-80ab-956187219e3f.jpg" width="303" height="192" /&gt;&lt;/a&gt;  &lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="The Shutdown Windows Dialog" border="0" alt="The Shutdown Windows Dialog" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/dlgshutdown1_6bfafd56-2812-4328-bcc0-70f45e8f5781.gif" width="323" height="192" /&gt;&lt;/p&gt;  &lt;h3&gt;Clipboards&lt;/h3&gt;  &lt;p&gt;Seriously, short of a doctor's office or the DMV when are we coming in contact with clipboards? And why is the clipboard the icon for Paste? Why not Copy? Or "fill out form?&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="The Paste Icon with a Clipboard" border="0" alt="The Paste Icon with a Clipboard" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/image_9e0e836b-9733-497f-b2c6-cacd7cd1ce5c.png" width="42" height="65" /&gt;&lt;/p&gt;  &lt;h3&gt;Bookmarks&lt;/h3&gt;  &lt;p&gt;We used to use smaller flat dead trees to keep our place in between the dead trees we would read from so that we didn't lose our page. No, books didn't "keep our place when we turned them off."&lt;/p&gt;  &lt;p&gt;&lt;a href="http://desktop-icon.com"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="A bookmark in a book" border="0" alt="A bookmark in a book" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/bookmark_ac472bb6-db95-49b9-8fef-12cdea03b170.jpg" width="142" height="150" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Address Books and Calendars&lt;/h3&gt;  &lt;p&gt;We would write down all our addresses and phone numbers in a dead tree and carry it around with us. Sometimes we'd manage our calendar that way also. Everything was bound together with metal spiral loops. Let me check my Filofax.&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="An address book with a spiral binder" border="0" alt="An address book with a spiral binder" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/address-book-icon-apple-related-photoshop-tutorials_3e1a5df7-c48c-4597-830e-f0ac13ca4684.jpg" width="150" height="150" /&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="A calendar with a spiral binder" border="0" alt="A calendar with a spiral binder" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/calendar_icon_e467c86e-01fc-414e-b29e-7d4974f6c373.jpg" width="164" height="183" /&gt;&lt;/p&gt;  &lt;h3&gt;Voicemail&lt;/h3&gt;  &lt;p&gt;I assume that the Voicemail icon is supposed to be evocative of reel to reel tapes but it always look like a container of 110 Film. I suspect my voicemail is no longer stored on spooled magnetic tape. No, you've never seen either of these before, young person. #getoffmylawn&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="iPhone Voicemail Icon" border="0" alt="iPhone Voicemail Icon" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/iPhone-VisualVoicemail_e14156cd-2aa3-459a-8b49-81f67500d15c.png" width="180" height="150" /&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Reel to Reel Tape" border="0" alt="Reel to Reel Tape" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/voicemailicon_8dc08583-c828-4876-bb12-a25a24a6b1d0.jpg" width="238" height="150" /&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="110 Camera Film" border="0" alt="110 Camera Film" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/2300341103_002d433bca_0ae3789b-595e-41a7-a91c-23a6f84b9a02.jpg" width="217" height="150" /&gt;&lt;/p&gt;  &lt;h3&gt;Manila Folder &lt;/h3&gt;  &lt;p&gt;I suppose the kids use &lt;a href="http://en.wikipedia.org/wiki/Pee_Chee_folder"&gt;Pee Chees&lt;/a&gt; still these days? I use folders because I use the 43 Folders organizational system but I don't see any reason that we couldn't be storing our files in abstract squares rather than folders in the sky.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.hanselman.com/blog/AWorldOfPrettyCloudDriveIconsSkyDriveGoogleDriveDropboxBitBucketAndGitHub.aspx"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Manilla Folders in the Clouds" border="0" alt="Manilla Folders in the Clouds" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/image_b4bae5e0-6cce-4548-976f-851745df5461.png" width="200" height="214" /&gt;&lt;/a&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Manila Folders are where you put things" border="0" alt="Manila Folders are where you put things" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/image_0d5b6950-d3eb-40c3-9274-48b7666730f0.png" width="178" height="200" /&gt;&lt;a href="http://interculturaltalk.org/2010/03/11/3-reasons-a-manila-folder-is-like-intercultural-communications/"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Manila Folders" border="0" alt="Manila Folders" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/manila-file-folder-label-241x300_7e5f1bd2-d37e-4bd9-9256-3278f35c0fd4.jpg" width="161" height="200" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h3&gt;Handset Phone Icon &lt;/h3&gt;  &lt;p&gt;The world's most advanced phones include an icon that looks like a phone handset that you haven't touched in 20 years, unless you've used a pay phone recently. (What's that?)&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="iPhone Phone Icon" border="0" alt="iPhone Phone Icon" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/Phoneicon_c32dc553-7743-4e89-b8c9-0e2f8e7debec.png" width="120" height="120" /&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="And old phone handset plugged into an old cell phone" border="0" alt="And old phone handset plugged into an old cell phone" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/NOVABL2lg_fd77b965-d75b-4593-816b-a8fb9800ebe1.jpg" width="120" height="120" /&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h3&gt;Magnifying Glass and Binoculars&lt;/h3&gt;  &lt;p&gt;At some time in the past the magnifying glass became the "search everywhere" icon, but for some reason binoculars are for searching within a document. This makes no sense as magnifying glasses are for searching things that are near and binoculars imply breadth of search and distance. These two commands should have had their icons reversed!&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="The Find icon from Word" border="0" alt="The Find icon from Word" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/image_d63c84ba-1544-4284-a163-ce35836b049d.png" width="61" height="27" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="A magnifiying glass" border="0" alt="A magnifiying glass" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/Magnifying-Glass-icon_70108ad3-37db-46ee-ba68-15826a384275.png" width="120" height="120" /&gt;  &lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="A black and white icon of binoculars" border="0" alt="A black and white icon of binoculars" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/clipartbinocs_f41f6552-a339-44b4-ba80-a12d960b2a34.png" width="120" height="120" /&gt;&lt;/p&gt;  &lt;h3&gt;Envelopes&lt;/h3&gt;  &lt;p&gt;Soon the envelope itself will go away and the next generation will wonder what this rectangle means and what it has to do with email. We'll still put other arrows and icons on top of these icons to mean reply, forward, delete, and other things. "Daddy, what's a 'stamp'?"&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Envelope" border="0" alt="Envelope" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/Envelope_4e1482cf-55ea-4e8f-bfc2-981081b0e989.jpg" width="168" height="120" /&gt; &lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Various Envelopes with arrows superimposed on them" border="0" alt="Various Envelopes with arrows superimposed on them" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/image_a5d95c03-2333-485b-a942-6a2ec6212e24.png" width="319" height="99" /&gt;&lt;/p&gt;  &lt;h3&gt;Wrenches and Gears - Setup/Settings&lt;/h3&gt;  &lt;p&gt;Want to indicate Settings or Setup to a twenty something? Show them a tool they've never used in their lives.&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="iPhone Settings is a set of gears" border="0" alt="iPhone Settings is a set of gears" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/ipadsettings_9ad59040-2c0f-45ff-bbc4-de95e4610ac2.jpg" width="149" height="150" /&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Screwdriver and Wrench crossed" border="0" alt="Screwdriver and Wrench crossed" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/settings_774e55e7-e9b0-45dd-b859-42c98dba7631.jpg" width="150" height="150" /&gt;&lt;/p&gt;  &lt;h3&gt;Microphones&lt;/h3&gt;  &lt;p&gt;If you don't know who Johnny Carson is, how could you know that this is a old-style microphone?&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Old timey microphone" border="0" alt="Old timey microphone" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/image_51bfe2a5-c508-4e5a-a7ef-0ebf0c8b4c4c.png" width="206" height="57" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="The Siri icon is an old time radio microphone" border="0" alt="The Siri icon is an old time radio microphone" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/siri_icon_lg_5a6cc2ab-a6c0-4102-8863-a78c956e0f22.png" width="200" height="200" /&gt;&lt;/p&gt;  &lt;h3&gt;Photography&lt;/h3&gt;  &lt;p&gt;No one under 30 has seen a Polaroid in years but we keep using them for icons. Instagram sold for $1B with an icon whose subtlety was lost on its target audience. "Shake it like a Polaroid picture."&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Instagram Icon" border="0" alt="Instagram Icon" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/Instagram-icon_d77277a7-2188-4ca6-99a6-9de7588fb67e.png" width="180" height="180" /&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Stack of Polaroids" border="0" alt="Stack of Polaroids" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/gallery-icon_00bbb178-f60a-4953-817b-dc6e461e69ce.jpg" width="240" height="180" /&gt;&lt;/p&gt;  &lt;h3&gt;Televisions&lt;/h3&gt;  &lt;p&gt;Does your TV have "rabbit ears?"&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="A bunch of TVs with CRTs and " border="0" alt="A bunch of TVs with CRTs and " src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/image_bd3ad367-66ed-4666-b3ac-7d40760c0d37.png" width="498" height="156" antennas?="antennas?" ear?="ear?" rabbit="rabbit" /&gt;&lt;/p&gt;  &lt;h3&gt;Carbon Copies and Blueprints&lt;/h3&gt;  &lt;p&gt;I'll "cc" you on that email. Last time I made a carbon copy I was using a &lt;a href="http://en.wikipedia.org/wiki/Mimeograph"&gt;mimeograph&lt;/a&gt; to do it.&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Carbon Copy" border="0" alt="Carbon Copy" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/CarbonCopy256_dae3feef-f50e-4df0-8fd7-10fe321e4796.png" width="180" height="180" /&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Blueprints and Carbon Copies" border="0" alt="Blueprints and Carbon Copies" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8492f6080c35_9A8D/icon_carboncopy_240x120_cedf5d06-2d7a-41f5-a899-23aebd8c8d1f.png" width="240" height="120" /&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;What other icons do we use while the original inspiration fades into obscurity?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Note: If one of these icons is yours let me know and I'll link to your site. I found all these and haven't been able to attribute all of them.&lt;/em&gt;&lt;/p&gt;&lt;br/&gt;&lt;hr/&gt;© 2012 Scott Hanselman. All rights reserved. &lt;br/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=Ma18EeSEGLo:i6II812vFRg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=Ma18EeSEGLo:i6II812vFRg:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=Ma18EeSEGLo:i6II812vFRg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=Ma18EeSEGLo:i6II812vFRg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=Ma18EeSEGLo:i6II812vFRg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=Ma18EeSEGLo:i6II812vFRg:MjquXQBfoPI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=MjquXQBfoPI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=Ma18EeSEGLo:i6II812vFRg:5M_9TJJRyfI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=5M_9TJJRyfI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=Ma18EeSEGLo:i6II812vFRg:YKYwmLGm_co"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=YKYwmLGm_co" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottHanselman/~4/Ma18EeSEGLo" height="1" width="1"/&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=b369ca60-6e05-4d0b-a202-dbcb450ae31d</comments>
      <category>Musings</category>
    <feedburner:origLink>http://www.hanselman.com/blog/TheFloppyDiskMeansSaveAnd14OtherOldPeopleIconsThatDontMakeSenseAnymore.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=be4e458f-29f0-412c-8330-2faa552a77ba</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=be4e458f-29f0-412c-8330-2faa552a77ba</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=be4e458f-29f0-412c-8330-2faa552a77ba</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=be4e458f-29f0-412c-8330-2faa552a77ba</wfw:commentRss>
      <slash:comments>36</slash:comments>
      <title>The Nerd Parent's Guide: When and how to introduce your kids to Star Wars</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=be4e458f-29f0-412c-8330-2faa552a77ba</guid>
      <link>http://feedproxy.google.com/~r/ScottHanselman/~3/zXmQYZGFCN4/TheNerdParentsGuideWhenAndHowToIntroduceYourKidsToStarWars.aspx</link>
      <pubDate>Mon, 07 May 2012 23:19:30 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;&lt;a href="http://fandom.memebase.com/tag/boba-fett/"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 4px 5px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Tiny Baby Boba Fett" border="0" alt="Tiny Baby Boba Fett" align="right" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/d76183e66278_84A2/fanart-cosplay-boba-faww%5B1%5D_bc5d35ee-bbc4-4148-8990-7ee5d6c07539.jpg" width="240" height="337" /&gt;&lt;/a&gt;Let me start by saying I'm not a big Star Wars guy. I enjoyed the films when I was growing up (I think I saw the original&amp;#160; (Ep. 4 ANH) in 1980 along with Empire Strikes Back in 1980) but I haven't thought much about them since. That said, I appreciate the films and I like movies in general. Watching movies with my kids (usually Pixar movies) have brought us a lot of shared joy as a family. However, Star Wars are fun and classics and we wanted to share them with our kids in a way that worked for everyone given their age and our parenting style.&lt;/p&gt;  &lt;h3&gt;TL;DR Version&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;Show Star Wars to your kids when you think they can discuss and analyze the themes appropriate. That might be 5, it might be 10. They're your kids.      &lt;ul&gt;       &lt;li&gt;Don't forget you can skip parts. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Show them the movie in 20 minute segments and make it a serial adventure rather than a movie. &lt;/li&gt;    &lt;li&gt;Show the films in &amp;quot;Machete Order&amp;quot; which is episodes 4,5,2,3,6. This maintains surprises while ending on a high note.      &lt;ul&gt;       &lt;li&gt;Yes, episode 1 is hacked out and not shown. You can show it at the end of it all along with the Clone Wars cartoons and bill them as supplemental material. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Consider Harmy's Despecialized Version fan edit or the Star Wars: Revisited fan edit. &lt;/li&gt;    &lt;li&gt;Make the films an event with crafts and discussion of mythology rather than just dumping in on their little brains. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;You Stayed to Read it All Version&lt;/h3&gt;  &lt;p&gt;We are extremely conscious of our two boys' &amp;quot;screen time.&amp;quot; They don't use the computer or play video games and they can watch TV on &amp;quot;show days.&amp;quot; Show Days for us are Tues, Friday and Saturday when they can watch 20-30 minutes of TV. That adds up to about 90 minutes of screen time a week. We'd rather they dance around, dig in the dirt and play, which they do very well.&lt;/p&gt;  &lt;p&gt;The boys watch Wild Kratts, Super Hero Squad and a few other kids' shows. They are 4 and a half and 6 and a half. Lately the topic - actually more the mythology - of Star Wars has been coming up. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;Daddy, who is &lt;em&gt;Dark &lt;/em&gt;Vader? Is he a bad guy? I heard he has a Light &lt;em&gt;Saver&lt;/em&gt;.&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;As both boys are in school it was inevitable that this topic would come up amongst the other kids. We're not ones to give in to peer pressure but in this case the boys seemed extremely interested in the characters, and as an extension the ideas around space, distance, planets, travel and the meta-topic of good vs. evil.&lt;/p&gt;  &lt;p&gt;The wife and I were aiming to wait until they were 6 and 8 to watch Star Wars but since the interest was so high we decided to give it a try in a very structured way. Everyone's kids are different. One 10 year old might not like the aliens in the cantina while other person's 5 year old would be fascinated by how they constructed the masks and not believe they were real aliens. Our kids tend to be &amp;quot;makers,&amp;quot; and as such are always constructing and deconstructing. They also understand the idea of actors and general movie making having made small films on an iPod touch so here's how we decided as parents to introduce our two boys to Star Wars.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Disclaimer: &lt;/strong&gt;Everyone's kids are different. I'm not advocating, preaching or suggesting that you should do any of this. If some of it works for you, great, if not or if you disagree, also great. This system worked for us.&lt;/p&gt;  &lt;blockquote class="twitter-tweet"&gt;   &lt;p&gt;4 year old on Empire Strikes Back:&amp;quot;Why didn't Luke use The Force to stay warm? This makes NO sense.&amp;quot;&lt;/p&gt; — Scott Hanselman (@shanselman) &lt;a href="https://twitter.com/shanselman/status/198982882692313088" data-datetime="2012-05-06T03:49:50+00:00"&gt;May 6, 2012&lt;/a&gt;&lt;/blockquote&gt; &lt;script src="//platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;  &lt;h3&gt;Structure and Time&lt;/h3&gt;  &lt;p&gt;First, I watched the first 1977 Star Wars to refresh my memory about the themes and general tone. We didn't want to put two hyper little people in front of effectively what is an intense two hour chase scene that they wouldn't understand. We also wanted to see if there were some scenes that we wanted to avoid all together.&lt;/p&gt;  &lt;p&gt;My favorite site for getting into extreme detail on a film's content is &lt;a href="http://www.kids-in-mind.com/s/star_wars_special_edition_1997_.htm"&gt;Kids In Mind&lt;/a&gt;. I use this site before the boys and I watch anything. In this case &lt;a href="http://www.kids-in-mind.com/s/star_wars_special_edition_1997_.htm"&gt;Kids In Mind has this to say about Star Wars&lt;/a&gt;.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Smoking skeletons are seen; many people are threatened with laser guns and sometimes are actually shot (resulting in some deaths but no blood). An arm is cut off and some blood is seen. A few scuffles and attacks, and a couple of explosions. A man is strangled and a man is lifted by his throat and then his limp body is tossed across a room.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This is an excellent and short summary of the three scenes that concerned me. The arm cut off in the cantina, the skeleton at Luke's house and Vader force-choking people, as well as general lasers and chaos. &lt;/p&gt;  &lt;p&gt;We decided that we'd show them the first movie (ep. 4 ANH) &lt;strong&gt;in 20 minute sittings&lt;/strong&gt;. We literally sat down, watched 20 minutes at a time then stopped it. Star Wars IV: A New Hope is 125 minutes long, so about 5 or 6 sittings. It took us two weeks to watch the movie, which was just about right. &lt;/p&gt;  &lt;p&gt;We also skipped over the severed arm in the Cantina as it's the only blood shown in the first movie and kinds of stands out in a gross way. We also implied that Luke's Aunt and Uncle ran away and the smoking husk in front of the house was a droid that was caught in the fire. These two small omissions cut out 90% of the violence that we were uncomfortable with. The rest we deal with by showing the movie in chunks as well as using each segment as an opportunity to talk about interesting topics as a family.&lt;/p&gt;  &lt;h3&gt;Discussion&lt;/h3&gt;  &lt;p&gt;The benefits of splitting the movie up into two weeks of six segments are many. The most significant benefit given that the audience is children was time for discussion and &amp;quot;cool down.&amp;quot; Little boys LOVE action. My boys were concocting crazy scenarios with good guys, bad guys and explosions long before they even knew what a television was. They are hard-wired for action,&amp;#160; but again, two hours of action is too much for our little people. Twenty minute segments gave the boys one effectively interesting action segment and a bunch of expository dialogue.&lt;/p&gt;  &lt;blockquote class="twitter-tweet"&gt;   &lt;p&gt;Watching &amp;quot;Empire Strikes Back&amp;quot; with the 6 year old. Han and Leia are kissing. &amp;quot;Oh, man, AGAIN in this movie?!?&amp;quot;&lt;/p&gt; — Scott Hanselman (@shanselman) &lt;a href="https://twitter.com/shanselman/status/198974496340836352" data-datetime="2012-05-06T03:16:31+00:00"&gt;May 6, 2012&lt;/a&gt;&lt;/blockquote&gt; &lt;script src="//platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;  &lt;p&gt;Each time something interesting happened or something intense happened we would &lt;strong&gt;pause &lt;/strong&gt;the show and say something like &amp;quot;wow, why did Han do that?&amp;quot; This would often turn into a 10 minute discussion between us - and more often between the two boys - debating the merits of one action versus another. It also allowed the kids to connect to the story more than the action. If we got the sense that they weren't understanding the movie we would just stop it and try again in 6-12 months. No joke. There's no point showing a movie to a kid if they aren't going to understand the themes.&lt;/p&gt;  &lt;p&gt;In a fast moving films it can be hard to keep track of what's happening and who is who. Stopping every 10 minutes or so for a discussion or a    &lt;br /&gt;feigned confused parent question like &amp;quot;Wait, why is that guy mad at that guy? Who are they?&amp;quot; gives the kids a chance to absorb the content as well as good practice in explaining complex plots to adults. &lt;/p&gt;  &lt;p&gt;Watching only 20 minutes at a time also took what would have been an intense two hour explosion and turned it into a &lt;strong&gt;fun weekly episodic serial &lt;/strong&gt;with the excitement of &amp;quot;what will happen next?&amp;quot; propelling the boys through the week. More discussions and analysis continued and continues even now. The boys haven talked about good and bad, when to fight and when not to.&lt;/p&gt;  &lt;h3&gt;Version&lt;/h3&gt;  &lt;p&gt;There's lots of versions of Star Wars as George Lucas continues to tinker with it. The Special Editions that came out in 1997 included lots of computer graphics tweaks and changes. He continued to make changes in 2004 when Star Wars was released on DVD and again when it was released on 2011 on Blu-Ray. &lt;/p&gt;  &lt;p&gt;There have been a number of &amp;quot;fan edits&amp;quot; of Star Wars but one of the highest quality and certainly the most popular is &amp;quot;&lt;a href="http://originaltrilogy.com/forum/topic.cfm/Harmys-STAR-WARS-Despecialized-Edition-HD-AVCHD-DVD9-and-NTSC-DVD5-AVAILABLE-see-1st-post/topic/12713/"&gt;Harmy's Despecialized Edition&lt;/a&gt;.&amp;quot; This edition takes nine different sources and merges them together into an excellent fan preservation. The Despecialized HD version is a 720 AVCHD dual-sided DVD9. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Nerd on: &lt;/strong&gt;You likely know that a DVD can hold about 5 gigs and shows films at 480p (480 horizontal lines of resolution) and a Blu-Ray can hold 25 gigs (or 50 gigs when dual later) and show films at 1080p. There was another interstitial format that is used on dual layer DVDs that can hold almost 9 gigs. The AVCHD (Advanced Video Coding High Definition) format is similar to Blu-Rays (it's a derivative, effectively) and you'll find it in many Camcorders. It originally supported 720p.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;You can get the Star Wars Despecialized Edition HD in an AVCHD format for a Dual Layer DVD9. This is a lovely 720p fan edit that is &lt;a href="http://AVCHD (Advanced Video Coding High Definition)"&gt;playable on many Blu-Ray Players&lt;/a&gt;.&amp;#160; I own the original DVD boxed set as well. You are required to own a legitimate copy in order to watch a fan edit and you must never pay for a fan edit. There's &lt;a href="http://originaltrilogy.com/forum/topic.cfm/Harmys-STAR-WARS-Despecialized-Edition-HD-AVCHD-DVD9-and-NTSC-DVD5-AVAILABLE-see-1st-post/topic/12713/"&gt;box art and labels you can download&lt;/a&gt; to put together your own copies for the home. There's a number of nice &lt;a href="http://www.youtube.com/watch?v=VTfKn_PO224&amp;amp;list=UUGRiG79avXVi6a-_xAker3A&amp;amp;index=4&amp;amp;feature=plcp"&gt;YouTube comparison clips showing your choices so you can decide if you care or not about showing a fan-edit&lt;/a&gt;. We watched the Harmy Edit and at least *I* appreciated the effort and attention to details. &lt;/p&gt;  &lt;blockquote class="twitter-tweet"&gt;   &lt;p&gt;Wife watching Star Wars for the first time: &amp;quot;It's that 'Hans' Solo? He was in Sabrina!&amp;quot;&lt;/p&gt; — Scott Hanselman (@shanselman) &lt;a href="https://twitter.com/shanselman/status/196783945822638080" data-datetime="2012-04-30T02:12:03+00:00"&gt;April 30, 2012&lt;/a&gt;&lt;/blockquote&gt; &lt;script src="//platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;  &lt;h3&gt;Movie Ordering&lt;/h3&gt;  &lt;p&gt;We all watched the movies in the order they came out which is 4,5,6 then 1,2,3. When you're showing the Star Wars movies to a new person you have the advantage to show them the movies in whatever order you like. The most popular and well respected alternate order is &lt;a href="http://static.nomachetejuggling.com/machete_order.html"&gt;Machete Order&lt;/a&gt; from &lt;a href="http://static.nomachetejuggling.com/machete_order.html"&gt;Rod Hilton&lt;/a&gt;. He recommends showing the movies in this order:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;4 - Star Wars: A New Hope &lt;/li&gt;    &lt;li&gt;5 - Empire Strikes Back &lt;/li&gt;    &lt;li&gt;2 - Attack of The Clones &lt;/li&gt;    &lt;li&gt;3 - Revenge of the Sith &lt;/li&gt;    &lt;li&gt;6 - Return of the Jedi &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You'll notice there is no film #1. That's for a number of reasons, some passionate but others logical and well-reasoned.&lt;/p&gt;  &lt;p&gt;Passion:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;Episode I is a failure on every possible level. &lt;a href="http://redlettermedia.com/plinkett/star-wars/star-wars-episode-1-the-phantom-menace/"&gt;The acting, writing, directing, and special effects are all atrocious, and the movie is just plain boring.&lt;/a&gt; Luckily, George Lucas has done everyone a favor by making the content of Episode I completely irrelevant to the rest of the series. Seriously, think about it for a minute. Name as many things as you can that happen in Episode I and actually help flesh out the story in any subsequent episode.&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Logic: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Every character established in Episode I is either killed or removed before it ends (Darth Maul, Qui-Gon, Chancellor Valorum), unimportant (Nute Gunray, Watto), or established better in a later episode (Mace Windu, Darth Sidious). Does it ever matter that Palpatine had an apprentice before Count Dooku? Nope, Darth Maul is killed by the end of Episode I and never referenced again. You may as well just start with the assumption that Dooku was the only apprentice. Does it ever matter that Obi-Wan was being trained by Qui-Gon? Nope, Obi-Wan is well into training Anakin at the start of Episode II, Qui-Gon is completely irrelevant.&lt;/p&gt;    &lt;p&gt;Search your feelings, you know it to be true! Episode I doesn’t matter at all.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;He goes on to explain not only that Episode #1 doesn't matter but also that the really exciting surprises like who Luke's father is and others are maintained with this order. &lt;/p&gt;  &lt;p&gt;Given that our kids are younger, we will stop the series for a while after Attack of the Clones. Episode 3, Revenge of the Sith is super dark and the most physically violent of the films. I want to wait until I feel the boys are ready to internalize that much intensity. I suspect that will be around 10 years or, perhaps older. After that we'll pick up where we left off. You should decide on your own but it's useful to be aware or reminded how dark episode 3 really is.&lt;/p&gt;  &lt;blockquote class="twitter-tweet"&gt;   &lt;p&gt;&amp;quot;Why was Obi Wan the only one who clicked his seat belt in the Millennium Falcon?&amp;quot; - my 6 year old&lt;/p&gt; — Scott Hanselman (@shanselman) &lt;a href="https://twitter.com/shanselman/status/196400568028233729" data-datetime="2012-04-29T00:48:39+00:00"&gt;April 29, 2012&lt;/a&gt;&lt;/blockquote&gt;  &lt;h3&gt;&lt;script src="//platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;Conclusion&lt;/h3&gt;  &lt;p&gt;We've introduced our little people to the Star Wars mythology in a slow and structured way. There's been more talking and playing in the backyard so far than actual movie watching. There's been discussions of movie making and how to make an alien mask. There's been cardboard light sabers and grappling hooks made of straws. There's been hours of discussion about character motivations, why good guys do good stuff, why bad guys do bad stuff and why Han Solo likes money and whether or not we should &amp;quot;mess with Yoda.&amp;quot;&lt;/p&gt;  &lt;p&gt;Overall, my wife and I are happy with the results. I hope this post helps you and your kids jump into Star Wars. I'm off now to deal with the burning question in our household this week: &amp;quot;Who took Chewbacca's pants?&amp;quot;&lt;/p&gt;&lt;br/&gt;&lt;hr/&gt;© 2012 Scott Hanselman. All rights reserved. &lt;br/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=zXmQYZGFCN4:zDaxZscJYYg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=zXmQYZGFCN4:zDaxZscJYYg:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=zXmQYZGFCN4:zDaxZscJYYg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=zXmQYZGFCN4:zDaxZscJYYg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=zXmQYZGFCN4:zDaxZscJYYg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=zXmQYZGFCN4:zDaxZscJYYg:MjquXQBfoPI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=MjquXQBfoPI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=zXmQYZGFCN4:zDaxZscJYYg:5M_9TJJRyfI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=5M_9TJJRyfI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=zXmQYZGFCN4:zDaxZscJYYg:YKYwmLGm_co"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=YKYwmLGm_co" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottHanselman/~4/zXmQYZGFCN4" height="1" width="1"/&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=be4e458f-29f0-412c-8330-2faa552a77ba</comments>
      <category>Daddy</category>
    <feedburner:origLink>http://www.hanselman.com/blog/TheNerdParentsGuideWhenAndHowToIntroduceYourKidsToStarWars.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=64082166-e449-4c98-b23b-a7ddefb70800</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=64082166-e449-4c98-b23b-a7ddefb70800</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=64082166-e449-4c98-b23b-a7ddefb70800</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=64082166-e449-4c98-b23b-a7ddefb70800</wfw:commentRss>
      <slash:comments>23</slash:comments>
      <title>Introducing Workspace Reloader - A Visual Studio AddIn to save your open files across project reloads</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=64082166-e449-4c98-b23b-a7ddefb70800</guid>
      <link>http://feedproxy.google.com/~r/ScottHanselman/~3/FbiHiy-EzXg/IntroducingWorkspaceReloaderAVisualStudioAddInToSaveYourOpenFilesAcrossProjectReloads.aspx</link>
      <pubDate>Wed, 02 May 2012 06:39:15 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;&lt;img style="display: inline; float: right" title="Works on my machine" alt="Works on my machine" align="right" src="http://www.hanselman.com/blog/content/binary/WindowsLiveWriter/HowtochangethelocationofyouriPhonebackup_12C83/worksonmymachine_3.png" /&gt;A while back my buddy &lt;a href="http://samsaffron.com/"&gt;Sam Saffron&lt;/a&gt; (from &lt;a href="http://samsaffron.com/archive/2011/05/02/A+day+in+the+life+of+a+slow+page+at+Stack+Overflow"&gt;Stack Overflow&lt;/a&gt; and &lt;a href="http://www.hanselman.com/blog/NuGetPackageOfTheWeek9ASPNETMiniProfilerFromStackExchangeRocksYourWorld.aspx"&gt;Mini Profiler&lt;/a&gt;) complained to me on Skype that he was finding it very irritating that every time he updated his project outside of Visual Studio he would be prompted to &amp;quot;Reload Project&amp;quot; and would lose all his open files because Visual Studio would close them. &lt;/p&gt;  &lt;p&gt;This apparently is becoming kind of an issue at Stack Overflow. Since they use distributed source control and often have a dozen or more folks all coding inside the same project they are integrating all the time. They'll be deep into something, update their project to test it and all their open windows close. &lt;/p&gt;  &lt;p&gt;It's a weird Visual Studio behavior that I've never understood. Visual Studio saves all your open files and window positions when you close the IDE and restores them when you open your solution. But when you open a project then right click and &amp;quot;Unload Project&amp;quot; you'll lose all your windows. I've reported it as a bug and it's &lt;a href="http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2654545-don-t-close-all-files-when-a-project-file-is-edite"&gt;also been voted up at User Voice&lt;/a&gt;, &lt;a href="http://stackoverflow.com/questions/3783648/is-there-a-setting-in-vs-2010-that-will-allow-it-to-recover-open-files-after-a-p/10407884\"&gt;visited as a Question at StackOverflow&lt;/a&gt;, and &lt;a href="https://twitter.com/#!/Nick_Craver/status/196558958599741440"&gt;a few folks have tweeted about it&lt;/a&gt; (The SO guys with their thumbs on the scale, no doubt) and been bugging some folks but then I got the idea to just fix it myself. It'd be a good chance to write my first Visual Studio Add-In, see if this is even possible, and fix an irritant at the same time. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;DOWNLOAD: &lt;/strong&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/6705affd-ca37-4445-9693-f3d680c92f38"&gt;&lt;strong&gt;Workspace Reloader Visual Studio Add-in&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;- &lt;em&gt;&amp;quot;This package will reload the code files you had open when your project file was modified and unloaded then reloaded&amp;quot;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Warranty: &lt;/strong&gt;To be clear this is the smallest of extensions. It only listens to two events and it's only 12k so you have no reason that I know of to be afraid of it. Plus, it &lt;strong&gt;&lt;em&gt;works on my machine &lt;/em&gt;&lt;/strong&gt;so you've got that going for you.&lt;/p&gt;  &lt;h3&gt;Creating a Visual Studio Extension&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd885119.aspx"&gt;Developing Visual Studio Extensions&lt;/a&gt; requires some patience. It's gotten a lot better with Visual Studio 2010 but back in the 2003-2005 days it was really hairy. There's a number of different kinds of things you can extend. You can add menus, add tool bars, commands, new templates, new kinds of designers and visualizers, as well as use just the shell to create your own IDE. &lt;/p&gt;  &lt;p&gt;I wanted to create an add-in with Zero UI. I had no need for buttons or menus, I just wanted to listen to events and act on them. I downloaded the Visual Studio 2010 SDK after reading this blog on &lt;a href="http://blogs.msdn.com/b/visualstudio/archive/2010/04/21/extending-visual-studio-2010.aspx"&gt;extending Visual Studio 2010&lt;/a&gt;. Make sure you get the right version. I have Visual Studio 2010 SP1 so I needed the &lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=21835"&gt;updated Visual Studio 2010 SP1 SDK&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="File | New Project | Visual Studio Package" border="0" alt="File | New Project | Visual Studio Package" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/f10cb2bf9f2a_12D35/New%20Project%20VSIX_4ecc85f7-cde4-40b6-8330-d77316b2dfce.png" width="800" height="450" /&gt;&lt;/p&gt;  &lt;p&gt;I made a new Visual Studio Package. This builds into a VSIX (which is just a ZIP file - isn't everything?). A VSIX has a manifest (which his just XML - isn't everything?) that you can edit in a GUI or as a text file. &lt;/p&gt;  &lt;p&gt;I want my VSIX package to work on Visual Studio 11 Beta as well as Visual Studio 2010&amp;#160; so I added to the SupportedProducts node like this. VSIXs other than templates aren't supported in Express (I keep pushing, though):&lt;/p&gt;  &lt;pre class="brush: csharp; gutter: false; toolbar: false; auto-links: false;"&gt;&amp;lt;SupportedProducts&amp;gt;&lt;br /&gt;    &amp;lt;VisualStudio Version=&amp;quot;10.0&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;Edition&amp;gt;Ultimate&amp;lt;/Edition&amp;gt;&lt;br /&gt;        &amp;lt;Edition&amp;gt;Premium&amp;lt;/Edition&amp;gt;&lt;br /&gt;        &amp;lt;Edition&amp;gt;Pro&amp;lt;/Edition&amp;gt;&lt;br /&gt;    &amp;lt;/VisualStudio&amp;gt;&lt;br /&gt;    &amp;lt;VisualStudio Version=&amp;quot;11.0&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;Edition&amp;gt;Ultimate&amp;lt;/Edition&amp;gt;&lt;br /&gt;        &amp;lt;Edition&amp;gt;Premium&amp;lt;/Edition&amp;gt;&lt;br /&gt;        &amp;lt;Edition&amp;gt;Pro&amp;lt;/Edition&amp;gt;&lt;br /&gt;    &amp;lt;/VisualStudio&amp;gt;&lt;br /&gt;&amp;lt;/SupportedProducts&amp;gt;&lt;/pre&gt;

&lt;p&gt;I also setup the name, version and description in this file.&amp;#160; &lt;/p&gt;

&lt;p&gt;I need to decide when my package is going to get loaded. You can add one or more &lt;a href="http://msdn.microsoft.com/en-us/library/bb166762(v=vs.80).aspx"&gt;ProvideAutoLoad&lt;/a&gt; attributes to a Package class from the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vsconstants_members(v=vs.80).aspx"&gt;VSConstants&lt;/a&gt; class. A number of blogs posts say you need to hard code a GUID like this, but they are mistaken. There are constants available.&lt;/p&gt;

&lt;pre class="brush: csharp; gutter: false; toolbar: false; auto-links: false;"&gt;[ProvideAutoLoad(&amp;quot;{ADFC4E64-0397-11D1-9F4E-00A0C911004F}&amp;quot;)]&lt;/pre&gt;

&lt;p&gt;I can have my &lt;a href="http://msdn.microsoft.com/en-us/library/bb170698.aspx"&gt;package automatically load in situations like these&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;NoSolution&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;

  &lt;li&gt;SolutionExists&lt;/li&gt;

  &lt;li&gt;SolutionHasMultipleProjects&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;

  &lt;li&gt;SolutionHasSingleProject&lt;/li&gt;

  &lt;li&gt;SolutionBuilding&lt;/li&gt;

  &lt;li&gt;SolutionExistsAndNotBuildingAndNotDebugging&lt;/li&gt;

  &lt;li&gt;SolutionOrProjectUpgrading&lt;/li&gt;

  &lt;li&gt;FullScreenMode&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For my package, I need it loaded whenever a &amp;quot;Solution Exists,&amp;quot; so I'll use this Constant (in lieu of a hard coded GUID):&lt;/p&gt;

&lt;pre class="brush: csharp; gutter: false; toolbar: false; auto-links: false;"&gt;[ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string)]&lt;/pre&gt;

&lt;p&gt;Next, I wanted to listen to events from the Solution like the unloading and loading of Projects. I started with the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.ivssolutionevents(v=vs.80).aspx"&gt;IVsSolutionsEvents&lt;/a&gt; interface that &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.ivssolutionevents_members(v=vs.80).aspx"&gt;includes OnBefore, OnAfter and OnQuery for basically everything&lt;/a&gt;. Elisha &lt;a href="http://stackoverflow.com/questions/2525457/automating-visual-studio-with-envdte"&gt;has a simple listener wrapper as an answer on StackOverflow&lt;/a&gt; that I modified.&lt;/p&gt;

&lt;p&gt;The SolutionEventsListener uses the very useful Package.GetGlobalService to get hold of the solution.&lt;/p&gt;

&lt;pre class="brush: csharp; gutter: false; toolbar: false; auto-links: false;"&gt;IVsSolution solution = Package.GetGlobalService(typeof(SVsSolution)) as IVsSolution;&lt;br /&gt;if (solution != null)&lt;br /&gt;{&lt;br /&gt;    solution.AdviseSolutionEvents(this, out solutionEventsCookie);&lt;br /&gt;}&lt;/pre&gt;

&lt;p&gt;We then sign up to hear about things that might happen to the Solution using the IVsSolutionEvents interfaces and making them look like friendly events.&lt;/p&gt;

&lt;pre class="brush: csharp; gutter: false; toolbar: false; auto-links: false;"&gt;public event Action OnAfterOpenProject;&lt;br /&gt;public event Action OnQueryUnloadProject;&lt;br /&gt;&lt;br /&gt;int IVsSolutionEvents.OnAfterOpenProject(IVsHierarchy pHierarchy, int fAdded)&lt;br /&gt;{&lt;br /&gt;     OnAfterOpenProject();&lt;br /&gt;     return VSConstants.S_OK;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int IVsSolutionEvents.OnQueryUnloadProject(IVsHierarchy pRealHierarchy, ref int pfCancel)&lt;br /&gt;{&lt;br /&gt;     OnQueryUnloadProject();&lt;br /&gt;     return VSConstants.S_OK;&lt;br /&gt;}&lt;/pre&gt;

&lt;p&gt;I want to hear about things just before Unload happens and then act on them After projects Open. I'll save the Document Windows. There's an interface that manages Documents and Windows for the Shell called, confusingly enough &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.ivsuishelldocumentwindowmgr(v=vs.80).aspx"&gt;IVsUIShellDocumentWindowMgr&lt;/a&gt;.&amp;#160; &lt;/p&gt;

&lt;p&gt;I save the windows just before the unload and reopen them just after the project opens. Unfortunately these are COM interfaces so I had to pass in not an IStream but an OLE.IStream so while the ReopenDocumentWindows is easy below...&lt;/p&gt;

&lt;pre class="brush: csharp; gutter: false; toolbar: false; auto-links: false;"&gt;listener.OnQueryUnloadProject += () =&amp;gt;&lt;br /&gt;{&lt;br /&gt;    comStream = SaveDocumentWindowPositions(winmgr);&lt;br /&gt;};&lt;br /&gt;listener.OnAfterOpenProject += () =&amp;gt; { &lt;br /&gt;    int hr = winmgr.ReopenDocumentWindows(comStream);&lt;br /&gt;    comStream = null;&lt;br /&gt;};&lt;/pre&gt;

&lt;p&gt;The SaveDocumentWindowPositions is more complex, but basically &amp;quot;make a memory stream, save the documents, and seek back to the beginning of the stream.&amp;quot;&lt;/p&gt;

&lt;pre class="brush: csharp; gutter: false; toolbar: false; auto-links: false;"&gt;private IStream SaveDocumentWindowPositions(IVsUIShellDocumentWindowMgr windowsMgr)&lt;br /&gt;{&lt;br /&gt;    if (windowsMgr == null)&lt;br /&gt;    {&lt;br /&gt;        return null;&lt;br /&gt;    }&lt;br /&gt;    IStream stream;&lt;br /&gt;    NativeMethods.CreateStreamOnHGlobal(IntPtr.Zero, true, out stream);&lt;br /&gt;    if (stream == null)&lt;br /&gt;    {&lt;br /&gt;        return null;&lt;br /&gt;    }&lt;br /&gt;    int hr = windowsMgr.SaveDocumentWindowPositions(0, stream);&lt;br /&gt;    if (hr != VSConstants.S_OK)&lt;br /&gt;    {&lt;br /&gt;        return null;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Move to the beginning of the stream with all this COM fake number crap&lt;br /&gt;    LARGE_INTEGER l = new LARGE_INTEGER();&lt;br /&gt;    ULARGE_INTEGER[] ul = new ULARGE_INTEGER[1];&lt;br /&gt;    ul[0] = new ULARGE_INTEGER();&lt;br /&gt;    l.QuadPart = 0;&lt;br /&gt;    //Seek to the beginning of the stream&lt;br /&gt;    stream.Seek(l, 0, ul);&lt;br /&gt;    return stream;&lt;br /&gt;}&lt;/pre&gt;

&lt;p&gt;If this does it's job you'll never know it's there. You can test it by &lt;a href="http://visualstudiogallery.msdn.microsoft.com/6705affd-ca37-4445-9693-f3d680c92f38"&gt;installing Workspace Reloader&lt;/a&gt;, opening a project and opening a few code files. Now, edit the CSProj as a text file (maybe add a space somewhere) and save it. Visual Studio should prompt you to Reload the Project. Workspace Reloader should keep your files and windows open.&lt;/p&gt;

&lt;p&gt;I hope this helps a few people. The &lt;a href="https://github.com/shanselman/RestoreAfterReloadVSIX"&gt;source is here&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;&lt;hr/&gt;© 2012 Scott Hanselman. All rights reserved. &lt;br/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=FbiHiy-EzXg:4F8TpDMpltM:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=FbiHiy-EzXg:4F8TpDMpltM:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=FbiHiy-EzXg:4F8TpDMpltM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=FbiHiy-EzXg:4F8TpDMpltM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=FbiHiy-EzXg:4F8TpDMpltM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=FbiHiy-EzXg:4F8TpDMpltM:MjquXQBfoPI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=MjquXQBfoPI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=FbiHiy-EzXg:4F8TpDMpltM:5M_9TJJRyfI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=5M_9TJJRyfI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=FbiHiy-EzXg:4F8TpDMpltM:YKYwmLGm_co"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=YKYwmLGm_co" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottHanselman/~4/FbiHiy-EzXg" height="1" width="1"/&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=64082166-e449-4c98-b23b-a7ddefb70800</comments>
      <category>Open Source</category>
      <category>VS2010</category>
    <feedburner:origLink>http://www.hanselman.com/blog/IntroducingWorkspaceReloaderAVisualStudioAddInToSaveYourOpenFilesAcrossProjectReloads.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=bb5669d4-5dbd-4a6b-b84b-2484f288321f</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=bb5669d4-5dbd-4a6b-b84b-2484f288321f</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=bb5669d4-5dbd-4a6b-b84b-2484f288321f</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=bb5669d4-5dbd-4a6b-b84b-2484f288321f</wfw:commentRss>
      <slash:comments>70</slash:comments>
      <title>Back to Basics: Moving beyond for, if and switch</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=bb5669d4-5dbd-4a6b-b84b-2484f288321f</guid>
      <link>http://feedproxy.google.com/~r/ScottHanselman/~3/HJsGqsGsfqk/BackToBasicsMovingBeyondForIfAndSwitch.aspx</link>
      <pubDate>Thu, 26 Apr 2012 19:59:59 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;I visit a lot of customers and look at a lot of code. I also worked with a number of large production code bases in my previous jobs and I see a lot of ifs, fors and switches. I see loops inside of loops with ifs inside them, all doing various transformations of data from one form to another. I see strings getting parsed to pull bits of data out in ways that are easy to say in English but take 100 lines to say in code. &lt;/p&gt;  &lt;p&gt;Should they? When we are just getting started programming we learn about if first, then for, then the much abused switch statement.&lt;/p&gt;  &lt;p&gt;I saw this little snippet on Miguel's blog a few weeks ago:&lt;/p&gt;  &lt;pre class="brush: csharp; toolbar: false; auto-links: false;"&gt;var biggerThan10 = new List;&lt;br /&gt;for (int i = 0; i &amp;lt; array.Length; i++){&lt;br /&gt;    if (array [i] &amp;gt; 10)&lt;br /&gt;       biggerThan10.Add (array[i]);&lt;br /&gt;}    &lt;/pre&gt;

&lt;p&gt;It's straightforward. Take an array of ints and make a new list with those that are larger than 10. We've all see code like this a million times. Here's the same thing in a few other languages.&lt;/p&gt;

&lt;p&gt;C#&lt;/p&gt;

&lt;pre class="brush: csharp; toolbar: false; auto-links: false;"&gt;var a = from x in array where x &amp;gt; 10 select x; &lt;br /&gt;var b = array.Where(x =&amp;gt; x &amp;gt; 10);&lt;/pre&gt;

&lt;p&gt;Ruby&lt;/p&gt;

&lt;pre&gt;a = array.select{|x| x &amp;gt;10}&lt;/pre&gt;

&lt;p&gt;JavaScript&lt;/p&gt;

&lt;pre class="brush: js; toolbar: false; auto-links: false;"&gt;a = array.filter(function(x){return x &amp;gt; 10});&lt;/pre&gt;

&lt;p&gt;I'd much rather write these one line operations than the loop and if above. I still see this out in the world, so perhaps people haven't seen enough examples. I asked &lt;a href="http://www.twitter.com/shanselman"&gt;friends on Twitter to&lt;/a&gt; submit their examples. Thank you Twitter friends!&lt;/p&gt;

&lt;p&gt;Here's a few nice examples. &lt;a href="http://ironshay.com/post/Extreme-C-with-LINQ.aspx"&gt;Iron Shay&lt;/a&gt; has some nice LINQ &lt;a href="http://ironshay.com/post/Extreme-C-with-LINQ.aspx"&gt;examples on his blog&lt;/a&gt;. &lt;strong&gt;Please do share yours in the comments. &lt;/strong&gt;Be sure to use &amp;lt;pre&amp;gt; tags. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; This is NOT about &amp;quot;shoving stuff into one line&amp;quot; but rather looking at solutions that are equally as readable but also simpler, terser, and less error prone than loops of loops. &lt;/p&gt;

&lt;hr /&gt;

&lt;pre&gt;def calculate_primes(n):&lt;br /&gt;    no_primes = []&lt;br /&gt;    primes = []&lt;br /&gt;    &lt;br /&gt;    for i in range(2, 8):&lt;br /&gt;        for j in range(i*2, n, i):&lt;br /&gt;            no_primes.append(j)&lt;br /&gt;    &lt;br /&gt;    for x in range(2, n):&lt;br /&gt;        if x not in no_primes:&lt;br /&gt;            primes.append(x)&lt;br /&gt;    &lt;br /&gt;    return primes&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;calculate_primes(500)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Can be like this instead!&lt;br /&gt;&lt;br /&gt;(lambda n: [x for x in range(2, n) if x not in [j for i in range(2, 8) for j in range(i*2, n, i)]])(500)&lt;/pre&gt;

&lt;p&gt;From &lt;a href="https://twitter.com/#!/aaronbassett/status/195501995434582016"&gt;Aaron Bassett&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;pre class="brush: csharp; toolbar: false; auto-links: false;"&gt;foreach (var i in categories) {&lt;br /&gt;     foreach (var x in GetAllChildCategories(i.Id)) {&lt;br /&gt;           yield return x;&lt;br /&gt;     }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Can be...&lt;br /&gt;&lt;br /&gt;return categories.SelectMany(i =&amp;gt; this.GetAllChildCategoriesIds(i.Id));&lt;/pre&gt;

&lt;p&gt;From &lt;a href="https://twitter.com/#!/bigfellahull/status/195464241036279809"&gt;James Hull&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;pre class="brush: csharp; toolbar: false; auto-links: false;"&gt;var inputNumbersInString = Console.ReadLine();&lt;br /&gt;var inputNumbersStringArray = inputNumbersInString.Split(' ');&lt;br /&gt;var inputNumbers = new List&amp;lt;int&amp;gt;();&lt;br /&gt;&lt;br /&gt;for (int i = 0; i &amp;lt; inputNumbersStringArray.Length; ++i) {&lt;br /&gt;    inputNumbers.Add(int.Parse(inputNumbersStringArray[i]));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int maxNumber = inputNumbers[0];&lt;br /&gt;&lt;br /&gt;for (int i = 1; i &amp;lt; inputNumbers.Count; ++i)&lt;br /&gt;    if (inputNumbers[i] &amp;gt; maxNumber)&lt;br /&gt;        maxNumber = inputNumbers[i];&lt;br /&gt;&lt;br /&gt;Console.WriteLine(maxNumber);&lt;br /&gt;&lt;br /&gt;//Or rather...&lt;br /&gt;&lt;br /&gt;Console.WriteLine(Console.ReadLine().Split(' ').Select(t =&amp;gt; int.Parse(t)).ToList().Max());&lt;/pre&gt;

&lt;p&gt;From &lt;a href="https://twitter.com/#!/amit5148/status/195440416353558528"&gt;Amit Saraswat&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;pre class="brush: csharp; toolbar: false; auto-links: false;"&gt;// create a poker deck as a list of two characters strings: &lt;br /&gt;// rank, suite &lt;br /&gt;&lt;br /&gt;char[] figures = &amp;quot;23456789TJQKA&amp;quot;.ToCharArray();&lt;br /&gt;char[] suites = &amp;quot;SHDC&amp;quot;.ToCharArray();&lt;br /&gt;List&amp;lt;string&amp;gt; deck = new List&amp;lt;string&amp;gt;();&lt;br /&gt;&lt;br /&gt;foreach (var figure in figures) {&lt;br /&gt;    foreach (var suite in suites) {&lt;br /&gt;        deck.Add(string.Format(&amp;quot;{0}{1}&amp;quot;, figure, suite));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Or, neatly&lt;br /&gt;var cards = from r in &amp;quot;23456789TJQKA&amp;quot; from s in &amp;quot;SHDC&amp;quot; select &amp;quot;&amp;quot; + r + s;&lt;/pre&gt;

&lt;p&gt;From &lt;a href="https://twitter.com/#!/JackNova/status/195430288082468865"&gt;Jack Nova&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;pre class="brush: csharp; toolbar: false; auto-links: false;"&gt;bool include = false;&lt;br /&gt;if (op == Operator.And) {&lt;br /&gt;    bool current = true;&lt;br /&gt;    foreach (var item in Items) {&lt;br /&gt;        current = current &amp;amp; item.Process();&lt;br /&gt;    }&lt;br /&gt;    include = current;&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;    bool current = false;&lt;br /&gt;    foreach (var item in Items) {&lt;br /&gt;        current = current | item.Process();&lt;br /&gt;    }&lt;br /&gt;    include = current;&lt;br /&gt;}&lt;br /&gt;return include;&lt;br /&gt;&lt;br /&gt;//Or this lovely Aggregate&lt;br /&gt;&lt;br /&gt;return op == Operator.And ? &lt;br /&gt;Items.Aggregate(true, (current, item) =&amp;gt; current &amp;amp; item.Process()) :     &lt;br /&gt;Items.Aggregate(false, (current, item) =&amp;gt; current | item.Process());&lt;/pre&gt;

&lt;p&gt;From &lt;a href="https://twitter.com/#!/kmeiresonne/status/195424979125411840"&gt;Kevin Meiresonne&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;pre class="brush: csharp; toolbar: false; auto-links: false;"&gt;sbyte[] sByteArray = new sbyte[100];&lt;br /&gt;byte[] uByteArray = new byte[sByteArray.Length];&lt;br /&gt;&lt;br /&gt;for (int i = 0; i &amp;lt; sByteArray.Length; i++) {&lt;br /&gt;    uByteArray[i] = (byte)sByteArray[i];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Or, instead of the loop above&lt;br /&gt;byte[] uByteArray1 = Array.ConvertAll(sByteArray, x =&amp;gt; (byte)x);&lt;/pre&gt;

&lt;p&gt;From &lt;a href="https://twitter.com/#!/FahadMustafa/status/195411665947328513"&gt;Fahad Mustafa&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;Scott&lt;/em&gt;: I have to say here that I prefer the first option. ;)&lt;/p&gt;

&lt;pre class="brush: csharp; toolbar: false; auto-links: false;"&gt;// This is the &amp;quot;classic&amp;quot; solution to the FizzBuzz problem.&lt;br /&gt;for (int i = 1; i &amp;lt;= 100; i++) {&lt;br /&gt;    if (i % 3 == 0 &amp;amp;&amp;amp; i % 5 == 0)     {&lt;br /&gt;        Console.WriteLine(&amp;quot;FizzBuzz&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;    else if (i % 3 == 0)     {&lt;br /&gt;        Console.WriteLine(&amp;quot;Fizz&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;    else if (i % 5 == 0) {&lt;br /&gt;        Console.WriteLine(&amp;quot;Buzz&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;    else {&lt;br /&gt;        Console.WriteLine(i.ToString());&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// One line &lt;br /&gt;Enumerable.Range(1, 100).ToList().ForEach(n =&amp;gt; Console.WriteLine((n % 3 == 0) ? (n % 5 == 0) ? &amp;quot;FizzBuzz&amp;quot; : &amp;quot;Fizz&amp;quot; : (n % 5 == 0) ? &amp;quot;Buzz&amp;quot; : n.ToString()));&lt;/pre&gt;

&lt;p&gt;From &lt;a href="https://twitter.com/#!/craigtptech/status/195404131945553920"&gt;Craig Phillips&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;A good one...I'm surprised more people don't use this.&lt;/p&gt;

&lt;pre class="brush: csharp; toolbar: false; auto-links: false;"&gt;var temp = String.Empty;&lt;br /&gt;foreach (var entry in myStringList) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (String.IsNullOrEmpty(temp)) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; temp = entry;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; entry += &amp;quot;, &amp;quot; + entry;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//becomes&lt;br /&gt;&lt;br /&gt;var temp = String.Join(&amp;quot;, &amp;quot;, myStringList)&lt;/pre&gt;

&lt;p&gt;From &lt;a href="https://twitter.com/#!/holgeradam/status/195403149136248834"&gt;Holger Adam&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;A class with properties in one line of F#. That'd be a dozen or more lines of C#.&lt;/p&gt;

&lt;pre&gt;type Person = { Name:string; Age:int }&lt;/pre&gt;

&lt;p&gt;From &lt;a href="https://twitter.com/#!/ptrelford/status/195398624883122176"&gt;Phillip Trelford&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;pre class="brush: csharp; toolbar: false; auto-links: false;"&gt;/// Input is a string with numbers : 10+20+30+40&lt;br /&gt;/// Output is integer with required sum (100)&lt;br /&gt;string input = &amp;quot;10+20+30+40&amp;quot;;&lt;br /&gt;var result = Regex.Split(input, @&amp;quot;\D+&amp;quot;).Select(t =&amp;gt; int.Parse(t)).Sum();&lt;br /&gt;Console.WriteLine(&amp;quot;Result is {0}&amp;quot; ,result);&lt;/pre&gt;

&lt;p&gt;From &lt;a href="https://twitter.com/#!/srini156/status/195387173086830593"&gt;Srinivas Iyengar&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;There are a million things available to the programmer beyond the first three keywords we learn. What are your favorite patterns (doesn't matter what language) that have helped you break away from the basics and move to the next level?&lt;/p&gt;

&lt;hr /&gt;&lt;strong&gt;Sponsor: &lt;/strong&gt;Big thanks to the folks at DevExpress for sponsoring this week's feed. Check out a free trial of CodeRush, one of my favorite products! &lt;em&gt;Introducing &lt;/em&gt;&lt;a href="http://ad.doubleclick.net/clk;255583966;66891495;k?http://www.devexpress.com/Subscriptions/DXperience/coderush-features.xml"&gt;&lt;em&gt;CodeRush by DevExpress.&lt;/em&gt;&lt;/a&gt;&lt;em&gt; The Visual Studio add-in that helps you create more reliable applications. &lt;a href="http://ad.doubleclick.net/clk;255583966;66891495;k?http://www.devexpress.com/Subscriptions/DXperience/coderush-features.xml"&gt;Tools to build &amp;amp; maintain your code&lt;/a&gt; without getting in the way of your IDE.&lt;/em&gt;&lt;br/&gt;&lt;hr/&gt;© 2012 Scott Hanselman. All rights reserved. &lt;br/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=HJsGqsGsfqk:LrgcZEavKtI:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=HJsGqsGsfqk:LrgcZEavKtI:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=HJsGqsGsfqk:LrgcZEavKtI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=HJsGqsGsfqk:LrgcZEavKtI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=HJsGqsGsfqk:LrgcZEavKtI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=HJsGqsGsfqk:LrgcZEavKtI:MjquXQBfoPI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=MjquXQBfoPI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=HJsGqsGsfqk:LrgcZEavKtI:5M_9TJJRyfI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=5M_9TJJRyfI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=HJsGqsGsfqk:LrgcZEavKtI:YKYwmLGm_co"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=YKYwmLGm_co" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottHanselman/~4/HJsGqsGsfqk" height="1" width="1"/&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=bb5669d4-5dbd-4a6b-b84b-2484f288321f</comments>
      <category>Back to Basics</category>
    <feedburner:origLink>http://www.hanselman.com/blog/BackToBasicsMovingBeyondForIfAndSwitch.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=bdefd903-b866-43ce-9b01-10c8006b7201</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=bdefd903-b866-43ce-9b01-10c8006b7201</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=bdefd903-b866-43ce-9b01-10c8006b7201</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=bdefd903-b866-43ce-9b01-10c8006b7201</wfw:commentRss>
      <slash:comments>15</slash:comments>
      <title>A world of pretty cloud drive icons - SkyDrive, Google Drive, Dropbox, BitBucket and GitHub</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=bdefd903-b866-43ce-9b01-10c8006b7201</guid>
      <link>http://feedproxy.google.com/~r/ScottHanselman/~3/E-oCHCMPQJs/AWorldOfPrettyCloudDriveIconsSkyDriveGoogleDriveDropboxBitBucketAndGitHub.aspx</link>
      <pubDate>Tue, 24 Apr 2012 17:50:16 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Today &lt;a href="https://drive.google.com/start"&gt;Google Drive&lt;/a&gt; and &lt;a href="http://windows.microsoft.com/en-US/skydrive/download-skydrive"&gt;Windows SkyDrive&lt;/a&gt; came out with clients for Windows and Mac. There's also SkyDrive apps for &lt;a href="http://go.microsoft.com/fwlink/p/?LinkId=232803"&gt;Windows Phone&lt;/a&gt;, &lt;a href="http://go.microsoft.com/fwlink/p/?LinkId=232802"&gt;iPhone&lt;/a&gt;, or &lt;a href="http://go.microsoft.com/fwlink/p/?LinkId=232802"&gt;iPad&lt;/a&gt; and OneNote apps that sync to SkyDrive for &lt;a href="http://go.microsoft.com/fwlink/p/?LinkID=248671"&gt;Windows Phone&lt;/a&gt;, &lt;a href="http://go.microsoft.com/fwlink/p/?LinkID=248673"&gt;Android&lt;/a&gt;,&lt;a href="http://go.microsoft.com/fwlink/p/?LinkID=248672"&gt;iPhone, or iPad&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;I'm a paying &lt;a href="http://db.tt/QXfs9WP"&gt;DropBox&lt;/a&gt; customer myself with over 60 gigs in there. I also use &lt;a href="http://www.bitbucket.org/shanselman"&gt;BitBucket&lt;/a&gt; and &lt;a href="http://www.github.com/shanselman"&gt;GitHub&lt;/a&gt; for source code.&lt;/p&gt;  &lt;p&gt;I also like tidy and pretty &lt;a href="http://www.hanselman.com/blog/ThereIsOnlyOneCloudIconInTheEntireUniverse.aspx"&gt;icons&lt;/a&gt;, for folders, programs and &lt;a href="http://www.hanselman.com/blog/SettingACustomIconForYourExternalDrivesInWindowsExplorer.aspx"&gt;external drives&lt;/a&gt;. I made &lt;a href="http://www.hanselman.com/blog/AwesomeVisualStudioCommandPromptAndPowerShellIconsWithOverlays.aspx"&gt;custom icons for the Visual Studio Command prompt as well as Visual Studio in PowerShell&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I put all these new cloud folders as well as my GitHub and BitBucket folders (these aren't custom apps, just folders where I keep my source repositories) in my favorites in Windows Explorer.&lt;/p&gt;  &lt;p&gt;I made custom .ICO icons for GitHub and BitBucket from high-res PNGs. Just right click on a Folder, click Properties, then Shortcut Change Icon to select your custom icon.&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Pretty Icons for all my Cloud Services" border="0" alt="Pretty Icons for all my Cloud Services" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/A-world-of-pretty-cloud-drives-with-pret_9207/Favorites%20(49)_85ee6c42-bdcb-445f-8451-e5456d9f7854.png" width="680" height="422" /&gt;&lt;/p&gt;  &lt;p&gt;Select your icon from your folder properties as shown in this screenshot:&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Checking a folder&amp;#39;s icon" border="0" alt="Checking a folder&amp;#39;s icon" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/A-world-of-pretty-cloud-drives-with-pret_9207/Change%20Icon%20(50)_0663383e-8532-463e-9db2-d9548be2de8f.png" width="377" height="317" /&gt;&lt;/p&gt;  &lt;p&gt;That DropBox icon isn't fitting in with my whole &amp;quot;Cloud Folder&amp;quot; aesthetic. I was going to make a custom DropBox icon by combining their icon along with the standard Windows Explorer folder icon but I double-checked the Dropbox.exe first. You never know if the designer may have left some optional or alternative views of an icon in the EXE. Plus we &lt;em&gt;know &lt;/em&gt;that &lt;a href="http://www.hanselman.com/blog/GoodUXInTheWildDropboxsAttentionToDetailOnTheirDownloadPage.aspx"&gt;the DropBox folks pay attention to details&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;I can see in %APPDATA%\Dropbox\bin\Dropbox.exe that there are other views of the main DropBox icon.&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Ah, there are hidden DropBox icons!" border="0" alt="Ah, there are hidden DropBox icons!" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/A-world-of-pretty-cloud-drives-with-pret_9207/New%20DropBox%20icon_e1002bff-86fa-456a-a5be-429392b55607.png" width="317" height="370" /&gt;&lt;/p&gt;  &lt;p&gt;Ah, that's much nicer!&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Changing the DropBox icon to a folder" border="0" alt="Changing the DropBox icon to a folder" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/A-world-of-pretty-cloud-drives-with-pret_9207/image_012f31a7-ae43-4e2b-a531-bf47ffce2a46.png" width="433" height="232" /&gt;&lt;/p&gt;  &lt;p&gt;I put &lt;a href="https://skydrive.live.com/redir.aspx?cid=cd06a7367371152c&amp;amp;resid=CD06A7367371152C!727&amp;amp;parid=CD06A7367371152C!175"&gt;my custom icons up on SkyDrive&lt;/a&gt;. &lt;/p&gt;&lt;br/&gt;&lt;hr/&gt;© 2012 Scott Hanselman. All rights reserved. &lt;br/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=E-oCHCMPQJs:P88ATHn7bRo:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=E-oCHCMPQJs:P88ATHn7bRo:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=E-oCHCMPQJs:P88ATHn7bRo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=E-oCHCMPQJs:P88ATHn7bRo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=E-oCHCMPQJs:P88ATHn7bRo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=E-oCHCMPQJs:P88ATHn7bRo:MjquXQBfoPI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=MjquXQBfoPI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=E-oCHCMPQJs:P88ATHn7bRo:5M_9TJJRyfI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=5M_9TJJRyfI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=E-oCHCMPQJs:P88ATHn7bRo:YKYwmLGm_co"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=YKYwmLGm_co" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottHanselman/~4/E-oCHCMPQJs" height="1" width="1"/&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=bdefd903-b866-43ce-9b01-10c8006b7201</comments>
      <category>Musings</category>
    <feedburner:origLink>http://www.hanselman.com/blog/AWorldOfPrettyCloudDriveIconsSkyDriveGoogleDriveDropboxBitBucketAndGitHub.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=41406f57-cc65-45a4-bd89-5c0e6ca3b1b7</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=41406f57-cc65-45a4-bd89-5c0e6ca3b1b7</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=41406f57-cc65-45a4-bd89-5c0e6ca3b1b7</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=41406f57-cc65-45a4-bd89-5c0e6ca3b1b7</wfw:commentRss>
      <slash:comments>25</slash:comments>
      <title>Create a great mobile experience for your website today. Please.</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=41406f57-cc65-45a4-bd89-5c0e6ca3b1b7</guid>
      <link>http://feedproxy.google.com/~r/ScottHanselman/~3/egfq5XeFwyE/CreateAGreatMobileExperienceForYourWebsiteTodayPlease.aspx</link>
      <pubDate>Mon, 23 Apr 2012 23:17:33 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;People are fascinating with making mobile web sites. It's amazing that we're not impressed with the fact we carry tiny supercomputers in our pockets but we're amazed when a website looks decent on our phones.&lt;/p&gt;  &lt;p&gt;There's a few directions you can go when going mobile for your site, and the key is finding balance. You can:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Do nothing. &lt;/strong&gt;Your site will probably work on a mobile device but each day it will look worse and worse to a discerning public with increasing expectations. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Use Adaptive/Responsive Design. &lt;/strong&gt;This is my favorite option. If your site is read-mostly (rather than a data-entry application) you can get a great experience on all devices by adaptively rendering your site based on screen-size. If you're focused on performance you can add a server-side component and resize image for mobile as well. Visit &lt;a href="http://mediaqueri.es"&gt;http://mediaqueri.es&lt;/a&gt; for inspiration. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Use a mobile framework. &lt;/strong&gt;There's lots great frameworks like &lt;a href="http://www.sencha.com/products/touch/"&gt;Sencha&lt;/a&gt;, &lt;a href="http://www.kendoui.com/"&gt;Kendo&lt;/a&gt;, &lt;a href="http://jquerymobile.com/"&gt;jQuery Mobile&lt;/a&gt; and others. These frameworks can get you near-native looking applications using HTML5 techniques. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Write a native app. &lt;/strong&gt;For the time-being while it's cool to try to get native experiences using non-native tools, it's hard. The best native experience on a mobile device will remain a native-built application. This requires the most work with arguably the best experience. However, you CAN get 90-95% of the experience with less than 90% of the effort if you use some of these other techniques. Plus, you'll anger fewer users by not forcing them to download a crappy mobile app by just making a lovely mobile website. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/ASP.NET-Creating-a-mobile-website-is-les_C01C/image_860d67b0-2b45-4706-8f92-f53ead32daae.png" width="750" height="562" /&gt;&lt;/p&gt;  &lt;p&gt;If you take a moment and visit my site (this site) on your phone, or just resize the browser to a smaller size, you'll see that this blog is using a &amp;quot;responsive design&amp;quot; by designer &lt;a href="http://www.JeremyKratz.com"&gt;Jeremy Kratz&lt;/a&gt;. The blog will change it's look based on if it's on a large monitor, an iPad or medium tablet, or a narrow phone. Watch the navigation bar turn into a drop down as the browser gets really narrow, for example. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://mediaqueri.es/han"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="My site&amp;#39;s responsive design, as featured on the MediaQueri.es site" border="0" alt="My site&amp;#39;s responsive design, as featured on the MediaQueri.es site" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/ASP.NET-Creating-a-mobile-website-is-les_C01C/responsivehanselman.jpg" width="700" height="211" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This was a relatively small - although thoughtful - change that instantly made my blog more accessible to the 8% of people who visit my site from a mobile device.&lt;/p&gt;  &lt;p&gt;For larger data-focused sites, or sites that are &amp;quot;almost applications&amp;quot; you will want to consider a custom mobile version of your site. This is often done with the help of a mobile framework as mentioned above. I'll use &lt;a href="http://www.jquerymobile.com"&gt;jQuery Mobile&lt;/a&gt; as an example here. Let's say I have a conference browser application that looks like this on the desktop. I can navigate by date, speaker, tag, as well as view session details.&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="My site looks lousy on an iPhone" border="0" alt="My site looks lousy on an iPhone" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/ASP.NET-Creating-a-mobile-website-is-les_C01C/ConferenceBrowser_3.png" width="500" height="353" /&gt;&lt;/p&gt;  &lt;p&gt;If I look at this same page on a mobile browser or something like the &lt;a href="http://www.electricplum.com/dlsim.html"&gt;Electric Plum Mobile Simulator&lt;/a&gt;, it looks like crap.&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Electric Mobile Simulator" border="0" alt="Electric Mobile Simulator" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/ASP.NET-Creating-a-mobile-website-is-les_C01C/Electric%20Mobile%20Simulator_76503552-be37-4941-ac22-aedf82df14b0.png" width="386" height="726" /&gt;&lt;/p&gt;  &lt;p&gt;I could use a mobile custom stylesheet just for phones, or I could use a CSS3 media query to make my existing stylesheet more mobile friendly...for example:&lt;/p&gt;  &lt;pre class="brush: css; gutter: false; toolbar: false; auto-links: false;"&gt;@media only screen and (max-width: 1024px) and (max-height: 768px)&lt;br /&gt;{&lt;br /&gt;    /* do something, hide something, move something */&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;Or I could use a mobile framework along with a display mode in ASP.NET MVC to render a different view while still using the same controller logic. For example, I could have a _Layout.cshtml (that's like a &amp;quot;master page&amp;quot;) and then a _Layout.Mobile.cshtml for mobile devices.&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="A Views folder with optional *.mobile.cshtml files for each mobile view" border="0" alt="A Views folder with optional *.mobile.cshtml files for each mobile view" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/ASP.NET-Creating-a-mobile-website-is-les_C01C/image_d1d93f2b-95b3-45d4-bf8c-919aae101a62.png" width="213" height="289" /&gt;&lt;/p&gt;

&lt;p&gt;Mobile is just a included &amp;quot;display mode.&amp;quot; You can create your own however you like. Here's one for Windows Phone. You could theoretically have ones like &amp;quot;tablet&amp;quot; or &amp;quot;nokia.&amp;quot; I think you should have as few as you can get away with. Try to avoid complexity. This is just an example.&lt;/p&gt;

&lt;pre class="brush: csharp; gutter: false; toolbar: false; auto-links: false;"&gt;DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode(&amp;quot;WP7&amp;quot;) {&lt;br /&gt;    ContextCondition = ctx =&amp;gt; ctx.GetOverriddenUserAgent().Contains(&amp;quot;Windows Phone OS&amp;quot;)&lt;br /&gt;});&lt;/pre&gt;

&lt;p&gt;That &amp;quot;WP7&amp;quot; string is what you put in place of * in filename.*.cshtml. So that's _Layout.WP7.cshtml, or Index.WP7.cshtml, etc. For my example I'll just make a _Layout.Mobile.cshtml that will automatically be used when most mobile browsers like Mobile Safari, Blackberry or Windows Phone hit my new site.&lt;/p&gt;

&lt;p&gt;Here is a new _Layout.Mobile.cshtml as a starting point for my conference browser mobile site. Remember that you can just File | New Project in Visual Studio with ASP.NET MVC 4 and select Mobile Site to get started on your own. &lt;/p&gt;

&lt;pre class="brush: xml; gutter: false; toolbar: false; auto-links: false;"&gt;&amp;lt;!DOCTYPE html&amp;gt; &lt;br /&gt;&amp;lt;html&amp;gt; &lt;br /&gt;    &amp;lt;head&amp;gt; &lt;br /&gt;        &amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;&lt;br /&gt;        &amp;lt;title&amp;gt;@ViewBag.Title&amp;lt;/title&amp;gt; &lt;br /&gt;        &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width&amp;quot; /&amp;gt;&lt;br /&gt;        &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;@Url.Content(&amp;quot;~/Content/jquery.mobile-1.0.min.css&amp;quot;)&amp;quot; /&amp;gt;&lt;br /&gt;        &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;@Url.Content(&amp;quot;~/Content/Site.Mobile.css&amp;quot;)&amp;quot; /&amp;gt;&lt;br /&gt;        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;@Url.Content(&amp;quot;~/Scripts/jquery-1.6.4.min.js&amp;quot;)&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;        &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;            $(document).bind(&amp;quot;mobileinit&amp;quot;, function() {&lt;br /&gt;                // jQuery Mobile's Ajax navigation does not work in all cases (e.g.,&lt;br /&gt;                // when navigating from a mobile to a non-mobile page), especially when going back, hence disabling it.&lt;br /&gt;                $.mobile.ajaxEnabled = false;&lt;br /&gt;            });&lt;br /&gt;        &amp;lt;/script&amp;gt;&lt;br /&gt;        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;@Url.Content(&amp;quot;~/Scripts/jquery.mobile-1.0.min.js&amp;quot;)&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;    &amp;lt;/head&amp;gt; &lt;br /&gt;&amp;lt;body&amp;gt; &lt;br /&gt;&lt;br /&gt;    &amp;lt;div data-role=&amp;quot;page&amp;quot; data-theme=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;        @Html.Partial(&amp;quot;_ViewSwitcher&amp;quot;)&lt;br /&gt;&lt;br /&gt;        &amp;lt;div data-role=&amp;quot;header&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;h1&amp;gt;@ViewBag.Title&amp;lt;/h1&amp;gt;&lt;br /&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;div data-role=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;            @RenderSection(&amp;quot;featured&amp;quot;, false)&lt;br /&gt;            @RenderBody()        &lt;br /&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;

&lt;p&gt;Now that I have a custom _Layout.mobile.cshtml for mobile, THIS file will be used when I hit the site on a mobile device rather than the main _Layout.cshtml. &lt;/p&gt;

&lt;p&gt;OK, here my application is using the mobile layout, but the existing session HTML which looks, again, like crap. I'm using a mobile layout with a desktop view. &lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Electric Mobile Simulator Sessions" border="0" alt="Electric Mobile Simulator Sessions" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/ASP.NET-Creating-a-mobile-website-is-les_C01C/Electric%20Mobile%20Simulator%20Sessions_c5972de4-1628-4c51-8e08-1bcd86edce4c.png" width="319" height="479" /&gt;&lt;/p&gt;

&lt;p&gt;The desktop view for a session uses a table (and that's OK you tableless-CSS people because it's a table of information):&lt;/p&gt;

&lt;pre class="brush: xml; gutter: false; toolbar: false; auto-links: false;"&gt;&amp;lt;table&amp;gt;&lt;br /&gt;    &amp;lt;thead&amp;gt;&lt;br /&gt;        &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Title&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Speaker(s)&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Date&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Room&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Tags&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;/thead&amp;gt;&lt;br /&gt;    &amp;lt;tbody&amp;gt;&lt;br /&gt;        @foreach(var session in Model) {&lt;br /&gt;            &amp;lt;tr&amp;gt;&lt;br /&gt;                &amp;lt;td&amp;gt;@Html.ActionLink(session.Title, &amp;quot;Session&amp;quot;, new { session.Code })&amp;lt;/td&amp;gt;&lt;br /&gt;                &amp;lt;td&amp;gt;@Html.Partial(&amp;quot;_SpeakersLinks&amp;quot;, session)&amp;lt;/td&amp;gt;&lt;br /&gt;                &amp;lt;td&amp;gt;@session.DateText&amp;lt;/td&amp;gt;&lt;br /&gt;                &amp;lt;td&amp;gt;@session.Room&amp;lt;/td&amp;gt;&lt;br /&gt;                &amp;lt;td&amp;gt;@Html.Partial(&amp;quot;_TagsLinks&amp;quot;, session)&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;/tr&amp;gt;                                           &lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/tbody&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/pre&gt;

&lt;p&gt;But I need a cleaner mobile layout that respects a smaller screen size. I'll copy my SessionsTable.cshtml and make a SessionsTable.&lt;strong&gt;Mobile&lt;/strong&gt;.cshtml with contents like this:&lt;/p&gt;

&lt;pre class="brush: xml; gutter: false; toolbar: false; auto-links: false;"&gt;@using ConferenceSessionsBrowserMvc4.Models&lt;br /&gt;@model IEnumerable&amp;lt;Session&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;h2&amp;gt;@ViewBag.Title&amp;lt;/h2&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;ul data-role=&amp;quot;listview&amp;quot;&amp;gt;&lt;br /&gt;    @foreach(var session in Model) {&lt;br /&gt;        &amp;lt;li&amp;gt;&lt;br /&gt;            &amp;lt;a href=&amp;quot;@Url.Action(&amp;quot;Session&amp;quot;, new { session.Code })&amp;quot;&amp;gt;&lt;br /&gt;                &amp;lt;h3&amp;gt;@session.Title&amp;lt;/h3&amp;gt;&lt;br /&gt;                &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;@string.Join(&amp;quot;, &amp;quot;, session.Speakers)&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;                &amp;lt;p&amp;gt;@session.DateText&amp;lt;/p&amp;gt;&lt;br /&gt;            &amp;lt;/a&amp;gt;&lt;br /&gt;        &amp;lt;/li&amp;gt;                                           &lt;br /&gt;    }    &lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;/pre&gt;

&lt;p&gt;There are a few things to note in this HTML. First, I like that it's not littered with CSS that describes the look and feel of the site, but rather it uses the data- attributes from HTML5 to express the &amp;quot;role&amp;quot; of an element. The UL uses data-role=&amp;quot;listview&amp;quot; that tells me it's a listview but doesn't dictate what it looks like. &lt;/p&gt;

&lt;p&gt;Within the UL I've got some LIs that use standard semantic tags like A, H3, and P along with STRONG and along with the default theme it looks nice on mobile.&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="A nice mobile view using jQuery Mobile" border="0" alt="A nice mobile view using jQuery Mobile" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/ASP.NET-Creating-a-mobile-website-is-les_C01C/image_a08c794d-33e6-47b3-b0f1-2d598ad4640e.png" width="319" height="478" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ASIDE: &lt;/strong&gt;See the the &amp;quot;Displaying mobile view&amp;quot; link at the top of the image there? With ASP.NET MVC 4 you can make a View Switcher easily with a partial View like this:&lt;/p&gt;

&lt;pre class="brush: xml; gutter: false; toolbar: false; auto-links: false;"&gt;@if (Request.Browser.IsMobileDevice &amp;amp;&amp;amp; Request.HttpMethod == &amp;quot;GET&amp;quot;)&lt;br /&gt;{&lt;br /&gt;    &amp;lt;div class=&amp;quot;view-switcher ui-bar-a&amp;quot;&amp;gt;&lt;br /&gt;        @if (ViewContext.HttpContext.GetOverriddenBrowser().IsMobileDevice)&lt;br /&gt;        {&lt;br /&gt;            @: Displaying mobile view&lt;br /&gt;            @Html.ActionLink(&amp;quot;Desktop view&amp;quot;, &amp;quot;SwitchView&amp;quot;, &amp;quot;ViewSwitcher&amp;quot;, new { mobile = false, returnUrl = Request.Url.PathAndQuery }, new { rel = &amp;quot;external&amp;quot; })&lt;br /&gt;        } &lt;br /&gt;        else &lt;br /&gt;        {&lt;br /&gt;            @: Displaying desktop view&lt;br /&gt;            @Html.ActionLink(&amp;quot;Mobile view&amp;quot;, &amp;quot;SwitchView&amp;quot;, &amp;quot;ViewSwitcher&amp;quot;, new { mobile = true, returnUrl = Request.Url.PathAndQuery }, new { rel = &amp;quot;external&amp;quot; })&lt;br /&gt;        }&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;}&lt;/pre&gt;

&lt;p&gt;And a ViewSwitcherController to change the &amp;quot;overridden&amp;quot; browser when you click the link. This is all in the &lt;a href="http://nuget.org/packages/jQuery.Mobile.MVC"&gt;jQuery.Mobile.MVC&lt;/a&gt; NuGet package that we will update for the final release.&lt;/p&gt;

&lt;pre class="brush: csharp; gutter: false; toolbar: false; auto-links: false;"&gt;public class ViewSwitcherController : Controller&lt;br /&gt;{&lt;br /&gt;    public RedirectResult SwitchView(bool mobile, string returnUrl) {&lt;br /&gt;        if (Request.Browser.IsMobileDevice == mobile)&lt;br /&gt;            HttpContext.ClearOverriddenBrowser();&lt;br /&gt;        else&lt;br /&gt;            HttpContext.SetOverriddenBrowser(mobile ? BrowserOverride.Mobile : BrowserOverride.Desktop);&lt;br /&gt;&lt;br /&gt;        return Redirect(returnUrl);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
OK, back to the Dates view. I can apply the same data- jQuery Mobile techniques to other screens, like the list of dates. I've got a data-role=&amp;quot;listview&amp;quot; and a data-role=&amp;quot;list-divider&amp;quot; as the dates change. 

&lt;pre class="brush: xml; gutter: false; toolbar: false; auto-links: false;"&gt;@model IEnumerable&amp;lt;DateTime&amp;gt;&lt;br /&gt;&lt;br /&gt;@{&lt;br /&gt;    ViewBag.Title = &amp;quot;All dates&amp;quot;;&lt;br /&gt;    DateTime lastDay = default(DateTime);&lt;br /&gt;}&lt;br /&gt;&amp;lt;ul data-role=&amp;quot;listview&amp;quot;&amp;gt;&lt;br /&gt;    @foreach(var date in Model) {&lt;br /&gt;        if (date.Date != lastDay) {&lt;br /&gt;            lastDay = date.Date;&lt;br /&gt;        &amp;lt;li data-role=&amp;quot;list-divider&amp;quot;&amp;gt;@date.Date.ToString(&amp;quot;ddd, MMM dd&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;        }&lt;br /&gt;        &amp;lt;li&amp;gt;@Html.ActionLink(date.ToString(&amp;quot;h:mm tt&amp;quot;), &amp;quot;SessionsByDate&amp;quot;, new { date })&amp;lt;/li&amp;gt;&lt;br /&gt;    }&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;/pre&gt;

&lt;p&gt;And get a nice result like this:&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="jQuery mobile applied to a ListView of dates" border="0" alt="jQuery mobile applied to a ListView of dates" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/ASP.NET-Creating-a-mobile-website-is-les_C01C/image_1ecf9f5d-6f61-448e-8f23-91000aceea64.png" width="321" height="428" /&gt;&lt;/p&gt;

&lt;p&gt;You can even get cool data filtering &amp;quot;as you type&amp;quot; features for jQuery Mobile list views by using data-filter=&amp;quot;true&amp;quot; on a listview.&lt;/p&gt;

&lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="data-filter=true in jQuery Mobile" border="0" alt="data-filter=true in jQuery Mobile" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/ASP.NET-Creating-a-mobile-website-is-les_C01C/image_09efa777-0fe3-4dff-89dd-3e2dcb1b744d.png" width="299" height="138" /&gt;&lt;/p&gt;

&lt;p&gt;Because these templates are all mobile specific they don't affect the way the site looks on the desktop. Also because these are simply new views for existing URLs and Controllers, I don't need write any new business logic. &lt;/p&gt;

&lt;p&gt;It is worth reminding you that it won't always be the case that an application will have its controllers and URLs map neatly such that one desktop view = one mobile view. Sometimes you may need to split up a complex single page desktop interaction into multiple mobile views. This conference application ended up with six views for desktop and six for mobile (Index, Dates, tags, Session(Detail), SessionsTable, and Speakers.) It's conceivable if the application included data entry that I would need to break up some views as well as create some custom methods just for mobile, although with some planning around User Experience you can usually keep this to a minimum.&lt;/p&gt;

&lt;p&gt;If the default browser sniffing that decides what's mobile and what's not isn't enough for your project, consider using a 3rd party database of mobile devices like the one provided by &lt;a href="http://51degrees.mobi/"&gt;51degrees.mobi&lt;/a&gt;. Their &lt;a href="http://51degrees.mobi/Products/Framework.aspx"&gt;51degrees.mobi mobile framework&lt;/a&gt; will help your site adapt to support all mobile devices as they include a database of devices as well as their capabilities. They can even compress images and improve low-bandwidth performance.&lt;/p&gt;

&lt;p&gt;They have a NuGet package I can install like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://51degrees.mobi/Products/Framework.aspx"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="51degrees.mobile mobile framework for ASP.NET" border="0" alt="51degrees.mobile mobile framework for ASP.NET" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/ASP.NET-Creating-a-mobile-website-is-les_C01C/image_da6382f6-98e3-45f5-bc6e-e8cbb5caf932.png" width="467" height="79" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://51degrees.mobi/"&gt;51Degrees&lt;/a&gt; and libraries like it will add new capabilities to the Request.Browser object. These are just a few examples, there's dozens.&lt;/p&gt;

&lt;pre class="brush: xml; gutter: false; toolbar: false; auto-links: false;"&gt;Screen Width: &amp;lt;% =Request.Browser.ScreenPixelsWidth %&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;Screen Height: &amp;lt;% =Request.Browser.ScreenPixelsHeight %&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;LayoutEngine: &amp;lt;% =Request.Browser[&amp;quot;LayoutEngine&amp;quot;] %&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;AnimationTiming: &amp;lt;% =Request.Browser[&amp;quot;AnimationTiming&amp;quot;] %&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;BlobBuilder: &amp;lt;% =Request.Browser[&amp;quot;BlobBuilder&amp;quot;] %&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;CssBackground: &amp;lt;% =Request.Browser[&amp;quot;CssBackground&amp;quot;] %&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;CssBorderImage: &amp;lt;% =Request.Browser[&amp;quot;CssBorderImage&amp;quot;] %&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;CssCanvas: &amp;lt;% =Request.Browser[&amp;quot;CssCanvas&amp;quot;] %&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;CssColor: &amp;lt;% =Request.Browser[&amp;quot;CssColor&amp;quot;] %&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;CssColumn: &amp;lt;% =Request.Browser[&amp;quot;CssColumn&amp;quot;] %&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;CssFlexbox: &amp;lt;% =Request.Browser[&amp;quot;CssFlexbox&amp;quot;] %&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;CssFont: &amp;lt;% =Request.Browser[&amp;quot;CssFont&amp;quot;] %&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;CssMediaQueries: &amp;lt;% =Request.Browser[&amp;quot;CssMediaQueries&amp;quot;] %&amp;gt;&amp;lt;/li&amp;gt;&lt;/pre&gt;

&lt;p&gt;You can use this information on the server side to augment these other techniques. For example, if the requesting device supports CssMediaQueries, great, you should use them, but it not, perhaps you need to fall back to another technique. If you know the screen-size on the server and it's below a certain size you can resize the image before you send it.&lt;/p&gt;

&lt;p&gt;Thanks to Jon Galloway, Damian Edwards and Erik Porter for their brainstorming and Steve Sanderson for the sample application.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Sponsor: &lt;/strong&gt;I want to thank my friends at DevExpress for sponsoring this week's feed. Do take a moment and check out a free trial of CodeRush, one of my favorite products!&amp;#160; &lt;em&gt;Introducing &lt;/em&gt;&lt;a href="http://ad.doubleclick.net/clk;255583966;66891495;k?http://www.devexpress.com/Subscriptions/DXperience/coderush-features.xml"&gt;&lt;em&gt;CodeRush by DevExpress.&lt;/em&gt;&lt;/a&gt;&lt;em&gt; The Visual Studio add-in that helps you create more reliable applications. &lt;a href="http://ad.doubleclick.net/clk;255583966;66891495;k?http://www.devexpress.com/Subscriptions/DXperience/coderush-features.xml"&gt;Tools to build &amp;amp; maintain your code&lt;/a&gt; without getting in the way of your IDE.&lt;/em&gt;&lt;/p&gt;&lt;br/&gt;&lt;hr/&gt;© 2012 Scott Hanselman. All rights reserved. &lt;br/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=egfq5XeFwyE:0ydxd6IEtRE:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=egfq5XeFwyE:0ydxd6IEtRE:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=egfq5XeFwyE:0ydxd6IEtRE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=egfq5XeFwyE:0ydxd6IEtRE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=egfq5XeFwyE:0ydxd6IEtRE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=egfq5XeFwyE:0ydxd6IEtRE:MjquXQBfoPI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=MjquXQBfoPI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=egfq5XeFwyE:0ydxd6IEtRE:5M_9TJJRyfI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=5M_9TJJRyfI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=egfq5XeFwyE:0ydxd6IEtRE:YKYwmLGm_co"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=YKYwmLGm_co" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottHanselman/~4/egfq5XeFwyE" height="1" width="1"/&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=41406f57-cc65-45a4-bd89-5c0e6ca3b1b7</comments>
      <category>ASP.NET</category>
      <category>HTML5</category>
      <category>Mobile</category>
    <feedburner:origLink>http://www.hanselman.com/blog/CreateAGreatMobileExperienceForYourWebsiteTodayPlease.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=6934c8aa-723f-4f63-b903-9e5f07793bf9</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=6934c8aa-723f-4f63-b903-9e5f07793bf9</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=6934c8aa-723f-4f63-b903-9e5f07793bf9</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=6934c8aa-723f-4f63-b903-9e5f07793bf9</wfw:commentRss>
      <slash:comments>50</slash:comments>
      <title>Root Cause Analysis for Toddlers and Medical Eyeball Tweezers</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=6934c8aa-723f-4f63-b903-9e5f07793bf9</guid>
      <link>http://feedproxy.google.com/~r/ScottHanselman/~3/1UlQN9Xb_dE/RootCauseAnalysisForToddlersAndMedicalEyeballTweezers.aspx</link>
      <pubDate>Thu, 19 Apr 2012 22:09:31 GMT</pubDate>
      <description>&lt;div&gt;&lt;style&gt;
#eyeballpic {
	border: none;
	padding: 3px;

	box-shadow: 0px 0px 20px 10px rgba(255,255,255,1);
	transform: scale(0.9);

	filter:alpha(opacity=15);
	-moz-opacity: 0.15;
	opacity: 0.15;
}

#eyeballpic:hover {
	border: 1px dotted #000;
	filter:alpha(opacity=100);
	-moz-opacity: 1.0;
	opacity: 1.0;
}
&lt;/style&gt;  &lt;p&gt;&lt;a href="http://bjo.bmj.com/content/86/9/1031.full"&gt;&lt;img id="eyeballpic" data-xrate-disgust="90" style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 5px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Eye picture from BMJ" border="0" alt="Eye picture from BMJ" align="right" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/e065fdda4167_C64C/F1.large_3.jpg" width="350" height="251" /&gt;&lt;/a&gt;This has been a very stressful week. Our four year old had a piece of metal in his cornea. &lt;strong&gt;Twice. That's two different pieces over multiple days in the same eye. &lt;/strong&gt;In one week. He's great now, no lasting damage and no vision trouble. That's not his eye pictured at right.&lt;/p&gt;  &lt;p&gt;He was having trouble sleeping and was complaining about his eye hurting. He's had eyelashes in his eye before so we check it out, didn't see much, and flushed with saline eye drops anyway. He wouldn't fall asleep and kept waking in a start. About 1 in the morning it was clear that he was in some considerable pain and wasn't going to sleep. We looked again with a bright flashlight. Turns out that little kids not only don't like standing still but they don't like staying still with a bright light in their eyeball. We did get a hint of something, right on the surface of the eye next to the pupil. I couldn't get it out with the edge of a tissue so we headed to the emergency room. &lt;/p&gt;  &lt;p&gt;The very kind doctor at the ER took a look with a slit lamp and exclaimed: &amp;quot;It's something metal!&amp;quot; She numbed the eye and tried to remove it but quickly decided it was out of her expertise and call the on call ophthalmologist. They woke up the eye surgeon and brought him in to check it out. We found ourselves with a tired toddler and a tired (but kind) eye doctor after 2am trying to get this metal out of his little eye with some kind of special set of medical eyeball tweezers. Again, may I mention that while my son is and was a trooper, no one likes to hear &amp;quot;eyeball&amp;quot; and &amp;quot;tweezers&amp;quot; in the same sentence, especially when combined into one super scary term: &amp;quot;medical eyeball tweezers.&amp;quot; &lt;/p&gt;  &lt;p&gt;His patience exhausted, my baby fell asleep crying. The doctor said I got all the metal and 80% of the rust. &lt;/p&gt;  &lt;p&gt;Rust? Yes, rust. Rust that looks roughly like this.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://appletoneyemart.com/disease_photos/fb.html"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Rust rings in your eyeball" border="0" alt="Rust rings in your eyeball" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/e065fdda4167_C64C/fb2_f7e66a67-e83f-4f15-99b6-168557867166.jpg" width="233" height="221" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Iron rusts in the eye very quickly and creates a rust ring (iron oxide). That ring often needs to be removed as well usually with the equivalent of an &amp;quot;eyeball Dremel tool,&amp;quot; like this one below.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.thecastleproject.net/tilt-up_stone/2010/04/cutting-rebar-the-dumb-way/"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Eye Dremel picture from @mycastleproject" border="0" alt="Eye Dremel picture from @mycastleproject" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/e065fdda4167_C64C/EyeDremel-400x300_690eff3d-b253-4994-8c5c-e9fd52fa303a.jpg" width="240" height="180" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;We were told to return the following day to get the remainder of the rust. We went home, tired but feeling reasonably comfortable that this strange thing was a fluke and that everything would be cool. The following day an attempt was made to get the last bit of rust but bless him, he wouldn't stay still so the we and doctor decided against further trauma. The chances are that the &lt;em&gt;very&lt;/em&gt; small bit of rust will just dissipate. If not, we'd deal with it later when he's older.&lt;/p&gt;  &lt;p&gt;My son went to school and the next day came home complaining about his eye. The doctor had said it would feel like there was something in his eye (even though it had been removed) and that this was common. However, he couldn't sleep and insisted something was wrong. We have learned to listen to little people, even and especially at 2am. &lt;/p&gt;  &lt;p&gt;&lt;em&gt;There was something new in his eye - the same eye.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;I could only assume that the doctor didn't get everything the last time. Off to the ER again (don't mess with eyes) but this time they were not wiling to wake up the eye doctor. We saw him a few hours later first thing in the morning. I asked if it was the same piece and he said, &amp;quot;no, it's the same eye but a different location. You can tell because the original rust ring is a marker.&amp;quot; &lt;/p&gt;  &lt;p&gt;He was shocked to say the least. &amp;quot;In 30 years I've never seen someone get something in their eye twice. &lt;strong&gt;Not even in people who grind metal for a living.&lt;/strong&gt;&amp;quot;&lt;/p&gt;  &lt;p&gt;He tried to get it out but my baby wasn't having it. The decision was made (and not lightly) to use general anesthesia to perform the eye surgery procedure and get it out. This kind of thing requires one stays completely still and you just can't ask a 4 year old to do that.&lt;/p&gt;  &lt;p&gt;I just couldn't get my head around the idea that this was a new piece of metal. What if a third one showed up? What was he doing or what was he around to cause this? Was he banging metal cars together? Was it shavings off his metal bed? Maybe sandbox sand being thrown in the air? Something from our new car? &lt;/p&gt;  &lt;p&gt;My wife and I became obsessed with &amp;quot;root causing.&amp;quot; I spent a day moving through my son's life, touching everything. Toys, beds, toothbrushes, car seats, furniture. No luck.&lt;/p&gt;  &lt;p&gt;We were at the hospital yesterday and he was put under and had the procedure done. The doctor said it was successful and not only did he get th second piece of metal out but also cleaned up the now &lt;strong&gt;two &lt;/strong&gt;rust rings.&lt;/p&gt;  &lt;p&gt;We asked again, &amp;quot;How do we keep this from happening again?&amp;quot; &lt;/p&gt;  &lt;p&gt;The doctor said, &amp;quot;You've got to find the cause or it very well could reoccur. The thing is...&amp;quot; he reiterated, &amp;quot;I've never seen this, even in metal grinders or folks in manufacturing.&amp;quot;&lt;/p&gt;  &lt;p&gt;We took baby home with a healthy dose of paranoia. Should he wear glasses until this is figured out? Then we had an idea. Where does a 4 year old come in contact with grinding metal. Why our son and not the other kids?&lt;/p&gt;  &lt;p&gt;Wait. Metal grinders. Where does my son go where metal grinds together?&lt;/p&gt;  &lt;p&gt;The playground swing. Specifically the tire swing. &lt;strong&gt;I've seen him spin on the swing for hours with his head parallel to the ground, eyes wide open looking at the clouds.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I went to the playground, found the swing and touched the metal ball where the hip joint fits into the bearings. My finger came out covered in what looked like glitter. Metal shavings. The tire swing joint was dry and cold &lt;em&gt;- &lt;u&gt;effectively a metal grinder rotating directly over his eyes&lt;/u&gt;.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;There's nothing more satisfying than The Answer.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.flickr.com/photos/alancraigie/4392012232"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Tire Swing photo by Craigie3000. Used under CC." border="0" alt="Tire Swing photo by Craigie3000. Used under CC." src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/e065fdda4167_C64C/4392012232_b9eb8af2b4_z_ef87c0a6-9628-42d2-a101-c2a4afcea316.jpg" width="400" height="400" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I spoke to the principal of the school and he made some calls and actually spoke to the designer of the playground product who hooked him up with the designer of the swivel. They are swapping the Tire Swing Hanger for a Heavy Duty hanger that includes a rubber boot to cover the joint.&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Tire Swivel" border="0" alt="Tire Swivel" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/e065fdda4167_C64C/tire_swivel_31d3d9a6-2142-45ba-afa6-1e71792f2f9c.jpg" width="240" height="240" /&gt;&lt;a href="http://www.swingsetmall.com/products/Heavy-Duty-Wood-Beam-Tire-Swivel.html"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Heavy Duty Tire Swivel" border="0" alt="Heavy Duty Tire Swivel" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/e065fdda4167_C64C/wood-beam-tire-swivel-sh-29__23375_zoom_fb5002fb-6b8a-427a-bf83-15bcbeae44ee.jpg" width="240" height="263" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This was a clear and satisfying end to a &lt;em&gt;very&lt;/em&gt; painful experience for the little guy. I'm just happy we figured it out but I think we are going to be paranoid about eyeballs for a the foreseeable future.&lt;/p&gt;&lt;br/&gt;&lt;hr/&gt;© 2012 Scott Hanselman. All rights reserved. &lt;br/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=1UlQN9Xb_dE:aNgP8vtmsFQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=1UlQN9Xb_dE:aNgP8vtmsFQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=1UlQN9Xb_dE:aNgP8vtmsFQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=1UlQN9Xb_dE:aNgP8vtmsFQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=1UlQN9Xb_dE:aNgP8vtmsFQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=1UlQN9Xb_dE:aNgP8vtmsFQ:MjquXQBfoPI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=MjquXQBfoPI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=1UlQN9Xb_dE:aNgP8vtmsFQ:5M_9TJJRyfI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=5M_9TJJRyfI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=1UlQN9Xb_dE:aNgP8vtmsFQ:YKYwmLGm_co"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=YKYwmLGm_co" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottHanselman/~4/1UlQN9Xb_dE" height="1" width="1"/&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=6934c8aa-723f-4f63-b903-9e5f07793bf9</comments>
      <category>Musings</category>
    <feedburner:origLink>http://www.hanselman.com/blog/RootCauseAnalysisForToddlersAndMedicalEyeballTweezers.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=72ced19b-5675-42ac-9c44-cdd5d07e1ec6</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=72ced19b-5675-42ac-9c44-cdd5d07e1ec6</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=72ced19b-5675-42ac-9c44-cdd5d07e1ec6</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=72ced19b-5675-42ac-9c44-cdd5d07e1ec6</wfw:commentRss>
      <slash:comments>34</slash:comments>
      <title>Given I like reading Source Code by the fire with my smoking jacket and brandy snifter, a list of books</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=72ced19b-5675-42ac-9c44-cdd5d07e1ec6</guid>
      <link>http://feedproxy.google.com/~r/ScottHanselman/~3/0Cf9lAZAmfc/GivenILikeReadingSourceCodeByTheFireWithMySmokingJacketAndBrandySnifterAListOfBooks.aspx</link>
      <pubDate>Tue, 17 Apr 2012 16:24:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;&lt;a href="http://www.codinghorror.com/blog/2012/04/learn-to-read-the-source-luke.html"&gt;&lt;img title="lilwaynesomecodeandsomebrandy" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: right; padding-top: 0px; padding-left: 0px; margin: 0px 0px 0px 5px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="lilwaynesomecodeandsomebrandy" align="right" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/0a7c28d11d2a_7D8F/lilwaynesomecodeandsomebrandy_thumb.jpg" width="450" height="338" /&gt;Jeff had a blog post yesterday&lt;/a&gt; (seems everything he writes in his retirement gets on Hacker News as well) about reading source code. While Jeff's post is largely a &lt;a href="http://news.ycombinator.com/item?id=3769446"&gt;pull-quote of a post on Hacker News&lt;/a&gt; by &lt;a href="http://news.ycombinator.com/user?id=snprbob86"&gt;Brandon Bloom&lt;/a&gt;, one bit stuck out to me as I'm sure it did to others.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;The idea that you'd settle down in a deep leather chair with your smoking jacket and a snifter of brandy for a fine evening of reading through someone else's code is absurd.&amp;quot; - Jeff Atwood.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Absurd? Hardly. Nearly every programmer I've ever spoken to enjoys reading and discovering new code. I've been &lt;a href="http://www.hanselman.com/blog/ReadingToBeABetterDeveloperTheCoding4FunDevKit.aspx"&gt;advocating&lt;/a&gt; that Developers need to read as much code as they write for at least half the time I've been blogging (10 years now, as of yesterday.) How could you not be excited about reading source with all the wonderful open source that's available in the world today?&lt;/p&gt;  &lt;p&gt;In fact I have an entire category of my blog called the &amp;quot;&lt;a href="http://www.hanselman.com/blog/CategoryView.aspx?category=Source+Code"&gt;Weekly Source Code&lt;/a&gt;&amp;quot; with 58 different specific entries at last code. That's 58 different great opportunities to read and learn from another programmer, some good some bad.&lt;/p&gt;  &lt;p&gt;The idea that reading source code is absurd is really the wrong message to send. Here's a list of interesting books about source and source code that I'd recommend you settle down in your leather chair, stoke the fire and read.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0596510047/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=diabeticbooks&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0596510047"&gt;Beautiful Code: Leading Programmers Explain How They Think (Theory in Practice (O'Reilly))&lt;/a&gt;&lt;img style="border-top-style: none !important; border-bottom-style: none !important; border-right-style: none !important; margin: 0px; border-left-style: none !important" border="0" alt="" src="http://www.assoc-amazon.com/e/ir?t=diabeticbooks&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0596510047" width="1" height="1" /&gt; - The new classic. One chapter, one developer, and one famous program or problem. The chapter on a tiny regular expression parser is worth the price of the book. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0201134373/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=diabeticbooks&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0201134373"&gt;Computers &amp;amp; Typesetting, Volume B: TeX: The Program&lt;/a&gt;&lt;img style="border-top-style: none !important; border-bottom-style: none !important; border-right-style: none !important; margin: 0px; border-left-style: none !important" border="0" alt="" src="http://www.assoc-amazon.com/e/ir?t=diabeticbooks&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0201134373" width="1" height="1" /&gt; - I've only read about 1/3 of this in uni in the library. It's pretty heady stuff but a fascinating look into the algorithms that a practical genius uses to set type. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0201633612/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=diabeticbooks&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0201633612"&gt;Design Patterns: Elements of Reusable Object-Oriented Software&lt;/a&gt;&lt;img style="border-top-style: none !important; border-bottom-style: none !important; border-right-style: none !important; margin: 0px; border-left-style: none !important" border="0" alt="" src="http://www.assoc-amazon.com/e/ir?t=diabeticbooks&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0201633612" width="1" height="1" /&gt; - A classic of the 90's, this book includes stories and examples from four professional programmers presented as a series of 23 patterns for creating Object Oriented software. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0131429388/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=diabeticbooks&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0131429388"&gt;Operating Systems Design and Implementation (3rd Edition)&lt;/a&gt;&lt;img style="border-top-style: none !important; border-bottom-style: none !important; border-right-style: none !important; margin: 0px; border-left-style: none !important" border="0" alt="" src="http://www.assoc-amazon.com/e/ir?t=diabeticbooks&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0131429388" width="1" height="1" /&gt; - The original &amp;quot;Minix&amp;quot; book that taught me all about *nix systems in a tiny way in college. Much easier to jump into than the full Linux source code and even easier today with the advent of Virtual Machines. One of our homework assignments was to write a new file system driver. The version I had even had the complete system source code in the back of the book! &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0201657880/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=diabeticbooks&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0201657880"&gt;Programming Pearls (2nd Edition)&lt;/a&gt;&lt;img style="border-top-style: none !important; border-bottom-style: none !important; border-right-style: none !important; margin: 0px; border-left-style: none !important" border="0" alt="" src="http://www.assoc-amazon.com/e/ir?t=diabeticbooks&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0201657880" width="1" height="1" /&gt; - Love love love this book. Practical low level discrete and brilliant examples of how smart people solve hard programs. This book is actually in my bathroom which is high praise, in fact. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://norvig.com/paip.html"&gt;Case Studies in Common Lisp&lt;/a&gt; - Free and online, this 1992 book includes not only an intro to Common Lisp but also great examples and lots of code. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://aima.cs.berkeley.edu/"&gt;Artificial Intelligence: A Modern Approach&lt;/a&gt; - I try to great this book (lots available online) every two or three years but I'm not smart enough to handle it. But I'm going to keep trying. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Of course, you don't need to buy any of these books or pay for anything. Just read code. Read your coworkers code, your company's code, your favorite open source library's code. Don't stop reading code.&lt;/p&gt;  &lt;p&gt;The Weekly Source Code was weekly but then become &amp;quot;whenever I get the time.&amp;quot; Because of Jeff's article I'm going to get a smoking jacket and brandy snifter and start doing new &lt;a href="http://www.hanselman.com/blog/CategoryView.aspx?category=Source+Code"&gt;Weekly Source Code&lt;/a&gt; posts every week&lt;strong&gt;. &lt;/strong&gt;Ok, it will be a Code Zero snifter but you get the idea. &lt;strong&gt;Because you can't be a good &lt;strike&gt;writer&lt;/strike&gt; coder if you aren't a good reader.&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;&lt;hr/&gt;© 2012 Scott Hanselman. All rights reserved. &lt;br/&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=0Cf9lAZAmfc:9-9KmhRPJi8:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=0Cf9lAZAmfc:9-9KmhRPJi8:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=0Cf9lAZAmfc:9-9KmhRPJi8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=0Cf9lAZAmfc:9-9KmhRPJi8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=0Cf9lAZAmfc:9-9KmhRPJi8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=0Cf9lAZAmfc:9-9KmhRPJi8:MjquXQBfoPI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=MjquXQBfoPI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=0Cf9lAZAmfc:9-9KmhRPJi8:5M_9TJJRyfI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=5M_9TJJRyfI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=0Cf9lAZAmfc:9-9KmhRPJi8:YKYwmLGm_co"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=YKYwmLGm_co" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottHanselman/~4/0Cf9lAZAmfc" height="1" width="1"/&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=72ced19b-5675-42ac-9c44-cdd5d07e1ec6</comments>
      <category>Open Source</category>
      <category>Source Code</category>
    <feedburner:origLink>http://www.hanselman.com/blog/GivenILikeReadingSourceCodeByTheFireWithMySmokingJacketAndBrandySnifterAListOfBooks.aspx</feedburner:origLink></item>
  </channel>
</rss>

