<?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>Tue, 22 May 2012 10:43:00 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=0c4be0de-db70-4e49-9c2c-c3d5237298b7</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=0c4be0de-db70-4e49-9c2c-c3d5237298b7</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=0c4be0de-db70-4e49-9c2c-c3d5237298b7</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=0c4be0de-db70-4e49-9c2c-c3d5237298b7</wfw:commentRss>
      <slash:comments>11</slash:comments>
      <title>ASP.NET MVC Beta and RC Upgrades - Confirm your Expectations and Version Numbers in Production Environments</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=0c4be0de-db70-4e49-9c2c-c3d5237298b7</guid>
      <link>http://feedproxy.google.com/~r/ScottHanselman/~3/zRxwspPBvxQ/ASPNETMVCBetaAndRCUpgradesConfirmYourExpectationsAndVersionNumbersInProductionEnvironments.aspx</link>
      <pubDate>Tue, 22 May 2012 10:43:00 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;I was working on an app locally using a daily build (newer than the currently released one) of ASP.NET MVC and deployed it to a host. I noticed this weird CSS issue. See how the text box on the left running on localhost is small and not styled while the one on the right running on the host is the correct width? You can click on the screenshot if you need to see more.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/18505d5c25cc_15132/nerddinner_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="The Local website&amp;#39;s textbox is poorly styled while the same app running the host has a correctly-styled textbox" border="0" alt="The Local website&amp;#39;s textbox is poorly styled while the same app running the host has a correctly-styled textbox" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/18505d5c25cc_15132/nerddinner_thumb.png" width="735" height="389" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I dug around a little and using the F12 browser developer tools (as well as good old View Source) I noticed the HTML being created was different! My local app was producing one bit of markup, then when I deployed &lt;strong&gt;the same app to my host &lt;/strong&gt;I would get different markup!&lt;/p&gt;  &lt;p&gt;Here's the app's markup running locally:&lt;/p&gt;  &lt;pre class="brush: xml; toolbar: false; auto-links: false;"&gt;&amp;lt;input class=&amp;quot;text-box single-line&amp;quot; data-val=&amp;quot;true&amp;quot; &lt;br /&gt;data-val-date=&amp;quot;The field EventDate must be a date.&amp;quot; &lt;br /&gt;data-val-required=&amp;quot;The EventDate field is required.&amp;quot; &lt;br /&gt;id=&amp;quot;EventDate&amp;quot; name=&amp;quot;EventDate&amp;quot; type=&amp;quot;datetime&amp;quot; value=&amp;quot;5/29/2012 1:48:23 AM&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;p&gt;Here's while running on the host:&lt;/p&gt;

&lt;pre class="brush: xml; toolbar: false; auto-links: false;"&gt;&amp;lt;input class=&amp;quot;text-box single-line&amp;quot; data-val=&amp;quot;true&amp;quot; &lt;br /&gt;data-val-date=&amp;quot;The field EventDate must be a date.&amp;quot; &lt;br /&gt;data-val-required=&amp;quot;The EventDate field is required.&amp;quot; &lt;br /&gt;id=&amp;quot;EventDate&amp;quot; name=&amp;quot;EventDate&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;5/29/2012 1:48:23 AM&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;p&gt;I realize I could have made it more obvious for this but I wanted to make the point that it took a second to notice that my standard ASP.NET MVC Helper call...&lt;/p&gt;

&lt;pre class="brush: xml; toolbar: false; auto-links: false;"&gt;&amp;lt;div class=&amp;quot;editor-field&amp;quot;&amp;gt;&lt;br /&gt;    @Html.EditorFor(model =&amp;gt; model.EventDate)&lt;br /&gt;    @Html.ValidationMessageFor(model =&amp;gt; model.EventDate)&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;

&lt;p&gt;...was returning type=&amp;quot;text&amp;quot; on the host but type=&amp;quot;datetime&amp;quot; on my local machine and that difference was picked up CSS that targeted specific input tags. Weird. Now, EditorFor() can have its behavior overridden with custom files in ~\Shared\EditorTemplates so if there was a DateTime.cshtml in there that would make sense. There wasn't. I wasn't using the very lovely &lt;a href="https://nuget.org/packages/MvcHtml5Templates"&gt;MvcHtml5Templates&lt;/a&gt; NuGet package by Scott Kirkland, so that wasn't it.&lt;/p&gt;

&lt;p&gt;My spider-sense was telling me this must be a versioning issue but everything looked right. My only explanation was that somehow what was running on the host was different from what was running on my local machine. &lt;/p&gt;

&lt;p&gt;I asked around work and &lt;a href="http://weblogs.asp.net/leftslipper/"&gt;Eilon Lipton&lt;/a&gt; suggested I run this snippet to check the version of ASP.NET MVC. He's basically saying &amp;quot;Hey, where did this well known type &lt;strong&gt;come from?&lt;/strong&gt;&amp;quot;&lt;/p&gt;

&lt;pre class="brush: csharp; toolbar: false; auto-links: false;"&gt;public ActionResult ShowVersion()&lt;br /&gt;{&lt;br /&gt;    Type t = null;&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;        t = Type.GetType(&amp;quot;System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;    catch (Exception e)&lt;br /&gt;    {&lt;br /&gt;        Response.Write(&amp;quot;Error finding MVC: &amp;quot; + e.ToString());&lt;br /&gt; &lt;br /&gt;    }&lt;br /&gt;    if (t == null)&lt;br /&gt;    {&lt;br /&gt;        Response.Write(&amp;quot;Can't find MVC&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;        Response.Write(&amp;quot;Found MVC at &amp;quot; + t.Assembly.CodeBase + &amp;quot;, IsInGac = &amp;quot; + t.Assembly.GlobalAssemblyCache + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;);&lt;br /&gt;        var verAttr = t.Assembly.GetCustomAttributes(typeof(System.Reflection.AssemblyFileVersionAttribute), true)[0] as System.Reflection.AssemblyFileVersionAttribute;&lt;br /&gt;        Response.Write(&amp;quot;Version = &amp;quot; + verAttr.Version + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;);&lt;br /&gt; &lt;br /&gt;    }&lt;br /&gt;    return null;&lt;br /&gt;}&lt;/pre&gt;

&lt;p&gt;Even better, rather than using this code, I can use the MvcDiagnostics NuGet Package and get THIS useful data from &lt;a href="http://bradwilson.typepad.com/blog/2010/03/diagnosing-aspnet-mvc-problems.html"&gt;Brad Wilson&lt;/a&gt;. Hopefully he will update it for ASP.NET MVC 4 although it worked well.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://nuget.org/packages/MvcDiagnostics"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="MvcDiagnostics NuGet Package" border="0" alt="MvcDiagnostics NuGet Package" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/18505d5c25cc_15132/image_11d2cecc-1f4a-4ef8-ac74-d5d3275c016f.png" width="474" height="91" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This package gives you lots of useful information for debugging weird situations.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/18505d5c25cc_15132/ASP.NET%20MVC%20Diagnostics%20Utility%20-%20Windows%20Internet%20Explorer%20(71)_2.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="ASP.NET MVC Diagnostics Utility gives lots of useful data" border="0" alt="ASP.NET MVC Diagnostics Utility gives lots of useful data" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/18505d5c25cc_15132/ASP.NET%20MVC%20Diagnostics%20Utility%20-%20Windows%20Internet%20Explorer%20(71)_thumb.png" width="600" height="472" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anyway, I put the diagnostic code in a controller and ran it and got this (this version is faked):&lt;/p&gt;

&lt;pre&gt;Found MVC at file:///C:/mysite/bin/System.Web.Mvc.DLL, IsInGac = False&lt;br /&gt;Version = 4.0.77777.0&lt;/pre&gt;

&lt;p&gt;Hang on, but my local result was this:&lt;/p&gt;

&lt;pre&gt;Found MVC at file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Web.Mvc/v4.0_4.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll, IsInGac = True&lt;br /&gt;Version = 4.0.99999.0&lt;/pre&gt;

&lt;p&gt;My local version was &lt;em&gt;newer &lt;/em&gt;and was running from the GAC (Global Assembly Cache) but the hosted version was &lt;em&gt;older &lt;/em&gt;and running locally. That means I had older ASP.NET MVC files floating around that my project referenced and deployed to the host. &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Aside:&lt;/strong&gt; The specific change that &amp;quot;got&amp;quot; me here was &lt;a href="http://aspnetwebstack.codeplex.com/SourceControl/changeset/changes/68a34436db0c"&gt;actually the first external contribution accepted to ASP.NET MVC&lt;/a&gt;. It's the one that Miguel de Icaza sent a pull request for while I was on stage at DevConnections. The change is to output HTML5 input types for common default data types, like &amp;lt;input type=&amp;quot;datetime&amp;quot;&amp;gt; for System.DateTime when using EditorFor().&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It took me a moment to remember that I hadn't added the reference to ASP.NET MVC manually but rather via the NuGet Package Manager. This became crystal clear when I used the built-in NuGet Package Visualizer (from Tools | Library Package Manager) to see the package dependency chain:&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 ASP.NET NuGet Packages as viewed in a directed graph in the NuGet Package Visualizer" border="0" alt="The ASP.NET NuGet Packages as viewed in a directed graph in the NuGet Package Visualizer" src="http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/18505d5c25cc_15132/image_3.png" width="620" height="236" /&gt;&lt;/p&gt;

&lt;p&gt;Basically I needed to either update my out of date NuGet packages or add the assembly references manually without NuGet. &lt;/p&gt;

&lt;p&gt;Since I was working on a daily build I did it manually. When &lt;strong&gt;you &lt;/strong&gt;update your ASP.NET MVC 4 Beta applications to a newer build (like ASP.NET MVC 4 Release Candidate (&lt;em&gt;whenever that comes out&lt;/em&gt;) or the final Release) &lt;strong&gt;you'll want to do update all your packages via NuGet&lt;/strong&gt; and confirm you're getting the versions and behavior you expect. The NuGet Package Visualizer is a hidden gem indeed.&lt;/p&gt;

&lt;p&gt;So, a general reminder to folks (and a specific lesson when upgrading between ASP.NET MVC builds):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;know your version numbers, what you want, what you're referencing. &lt;/li&gt;

  &lt;li&gt;confirm your version numbers in your debug and production environment. 
    &lt;ul&gt;
      &lt;li&gt;Perhaps a health-check page or a runnable Integration Test to &lt;strong&gt;assert your assumptions&lt;/strong&gt; &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;

  &lt;li&gt;update your NuGet packages keep your references, and thus your ~\bin up to date &lt;/li&gt;

  &lt;li&gt;know where your assemblies are being loaded from (the GAC or locally) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hope this helps!&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. Take a moment and check out their stuff! &lt;em&gt;&lt;a href="http://ad.doubleclick.net/clk;255587526;66891495;g?http://www.devexpress.com/Home/Try.xml"&gt;Touch-enabled apps&lt;/a&gt; require developers to re-think design &amp;amp; user experiences. &lt;a href="http://ad.doubleclick.net/clk;255587526;66891495;g?http://www.devexpress.com/Home/Try.xml"&gt;DevExpress tools help you take on these new challenges&lt;/a&gt; using your existing skills &amp;amp; today’s technologies.&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=zRxwspPBvxQ:YTkc5RWM6kw:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=zRxwspPBvxQ:YTkc5RWM6kw:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=zRxwspPBvxQ:YTkc5RWM6kw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=zRxwspPBvxQ:YTkc5RWM6kw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=zRxwspPBvxQ:YTkc5RWM6kw: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=zRxwspPBvxQ:YTkc5RWM6kw: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=zRxwspPBvxQ:YTkc5RWM6kw: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=zRxwspPBvxQ:YTkc5RWM6kw: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/zRxwspPBvxQ" height="1" width="1"/&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=0c4be0de-db70-4e49-9c2c-c3d5237298b7</comments>
      <category>ASP.NET</category>
      <category>ASP.NET MVC</category>
    <feedburner:origLink>http://www.hanselman.com/blog/ASPNETMVCBetaAndRCUpgradesConfirmYourExpectationsAndVersionNumbersInProductionEnvironments.aspx</feedburner:origLink></item>
    <item>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=91a8abe8-6c5c-47e8-8d2b-4510409a0b09</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=91a8abe8-6c5c-47e8-8d2b-4510409a0b09</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=91a8abe8-6c5c-47e8-8d2b-4510409a0b09</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=91a8abe8-6c5c-47e8-8d2b-4510409a0b09</wfw:commentRss>
      <slash:comments>68</slash:comments>
      <title>Please Learn to Think about Abstractions</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=91a8abe8-6c5c-47e8-8d2b-4510409a0b09</guid>
      <link>http://feedproxy.google.com/~r/ScottHanselman/~3/nX2j1EGgKb4/PleaseLearnToThinkAboutAbstractions.aspx</link>
      <pubDate>Thu, 17 May 2012 00:05:18 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Jeff Atwood wrote a post called &lt;a href="http://www.codinghorror.com/blog/2012/05/please-dont-learn-to-code.html"&gt;Please Don't Learn to Code&lt;/a&gt; and Zed Shaw wrote a post called &lt;a href="http://learncodethehardway.org/blog/MAY_15_2012.html"&gt;Please Don't Become Anything, Especially Not A Programmer&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;My wife lost her wedding ring down the drain. She freaked out and came running declaring that it was lost. Should we call a plumber?&lt;/p&gt;  &lt;p&gt;I am not a plumber and I have no interest in being a plumber. While I advocate &lt;a href="http://www.hanselman.com/blog/PaintFenceCutWoodPullWeedPlantTreeFindingGeekBalanceOutsideMyComfortZone.aspx"&gt;that folks try to be handy around the house&lt;/a&gt;, I choose to put a limit on how much I know about plumbing.&lt;/p&gt;  &lt;p&gt;While my wife has an advanced degree in something I don't understand, she also, is not a plumber. As a user of plumbing she has an understandably narrow view of how it works. She turns on the water, a miracle happens, and water comes out of the tap. That water travels about 8 inches and then disappears into the drain never to be seen again. It's the mystery of plumbing as far as she is concerned.&lt;/p&gt;  &lt;p&gt;I, on the other hand, have nearly double the understanding of plumbing, as my advanced knowledge extends to the curvey pipey thing under the sink. I think that's the technical term for it. After the curvey pipey thing the series of tubes goes into the wall, and that's where my knowledge ends. &lt;/p&gt;  &lt;p&gt;Everything is a layer of abstraction over something else. I push a button on my Prius and the car starts. No need even for a key in the ignition. A hundred plus years of internal combustion abstracted away to a simple push button.&lt;/p&gt;  &lt;p&gt;Jeff said:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Please don't advocate learning to code just for the sake of learning how to code.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Zed says:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Never listen to people who try to make beginners feel like losers.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I think everyone should learn how to think and when to dig deeper and should be able to do it in a welcoming and friendly environment. &lt;/p&gt;  &lt;p&gt;Learn how to question how things work. Learn that everything new and simple hides something large and complex. We are all standing on the shoulders of giants like Newton, Tesla, Kettering, Berners-Lee, and on and on. &lt;/p&gt;  &lt;p&gt;You can choose to live in a world where things just work, or you can choose to dig a little. You don't need to learn to code, you don't need to be an expert in everything but &lt;strong&gt;know that you can learn&lt;/strong&gt;. You can learn a little or a lot. I don't think the Mayor of New York&amp;#160; needs to know how to code, but it'd be nice if he knew a little about DNS and a little about HTTP. &lt;/p&gt;  &lt;p&gt;Judge Alsup in the Oracle v. Google case has been learning Java on the side during the case. Recently when a lawyer tried to imply something was a days work and patentable the Judge, armed with his new understanding that ends an a lower level of abstraction declared (&lt;a href="http://www.groklaw.net/article.php?story=20120515120106322"&gt;via Groklaw&lt;/a&gt;):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Judge: &lt;/strong&gt;We heard the testimony of Mr. Bloch. I couldn't have told you the first thing about Java before this problem. I have done, and still do, a significant amount of programming in other languages. I've written blocks of code like RangeCheck a hundred times before. I could do it, you could do it. The idea that someone would copy that when they could do it themselves just as fast, it was an accident. There's no way you could say that was speeding them along to the marketplace. You're one of the best lawyers in America, how could you even make that kind of argument?&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Oracle:&lt;/strong&gt; I want to come back to RangeCheck.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Judge: &lt;/strong&gt;RangeCheck! All it does is make sure the numbers you're inputting are within a range, and gives them some sort of exceptional treatment.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The Judge could have remained in the dark, or relied on an expert to interpret for him, but he dug a step deeper and learned some Java. He knows how to think and he applied to remove a layer of abstraction away from the problem facing his court.&lt;/p&gt;  &lt;p&gt;I opened the trap under the sink and retrieved the ring. She was thrilled. &amp;quot;I never knew that was under there.&amp;quot; Now she does and now we both know a little about plumbing and abstractions. And that's a good thing.&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=nX2j1EGgKb4:PNtpGxFc50Q:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=nX2j1EGgKb4:PNtpGxFc50Q:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=nX2j1EGgKb4:PNtpGxFc50Q:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=nX2j1EGgKb4:PNtpGxFc50Q:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=nX2j1EGgKb4:PNtpGxFc50Q: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=nX2j1EGgKb4:PNtpGxFc50Q: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=nX2j1EGgKb4:PNtpGxFc50Q: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=nX2j1EGgKb4:PNtpGxFc50Q: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/nX2j1EGgKb4" height="1" width="1"/&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=91a8abe8-6c5c-47e8-8d2b-4510409a0b09</comments>
      <category>Musings</category>
    <feedburner:origLink>http://www.hanselman.com/blog/PleaseLearnToThinkAboutAbstractions.aspx</feedburner:origLink></item>
    <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>40</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>
  </channel>
</rss>

