<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="http://feeds.hanselman.com/feedblitz_rss.xslt"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/"  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/" version="2.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
  <channel>
    <title>Scott Hanselman's Blog</title>
    <link>http://www.hanselman.com/blog/</link>
    <description>Scott Hanselman on Programming, User Experience, The Zen of Computers and Life in General</description>
    <image>
	<url>http://www.hanselman.com/blog/images/tinyheadshot2.jpg</url>
	<title>Scott Hanselman's Blog</title>
	<link>http://www.hanselman.com/blog/</link>
</image>
    <copyright>admin</copyright>
    <lastBuildDate>Wed, 19 Jun 2013 05:51:33 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.4.279.6007</generator>
    <managingEditor>scott@hanselman.com</managingEditor>
    <webMaster>scott@hanselman.com</webMaster>
<item>
<feedburner:origLink>http://www.hanselman.com/blog/TheyWILLTakeYourPhotosAndTheyWILLUseThemAndYouWILLLikeIt.aspx</feedburner:origLink>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=e4f1c707-de2e-488a-ac43-7cee407a462f</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=e4f1c707-de2e-488a-ac43-7cee407a462f</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=e4f1c707-de2e-488a-ac43-7cee407a462f</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=e4f1c707-de2e-488a-ac43-7cee407a462f</wfw:commentRss>
      <slash:comments>28</slash:comments>
      <title>They WILL take your photos and they WILL use them and you WILL like it.</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=e4f1c707-de2e-488a-ac43-7cee407a462f</guid>
      <link>http://feeds.hanselman.com/~/42469408/0/scotthanselman~They-WILL-take-your-photos-and-they-WILL-use-them-and-you-WILL-like-it.aspx</link>
      <pubDate>Wed, 19 Jun 2013 05:51:33 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;This is hardly a tragic story and it&apos;s not even a good photo, but it&apos;s interesting because it happens a few times a year. Perhaps it&apos;s happened to you! (Share in the comments)&lt;/p&gt; &lt;p&gt;A buddy noticed a story in &lt;a href=&quot;http://au.businessinsider.com/microsoft-cybercrime-500-million-theft-2013-6&quot;&gt;Business Insider Australia&lt;/a&gt; that was picked up off Reuters called &quot;Microsoft says they&apos;ve disrupted a global cybercrime ring responsible for $500 Million Theft.&quot; It was syndicated to OZ by Business Insider US who pulled it from Reuters, and it seems they each pick their own illustrative picture.&lt;/p&gt; &lt;p&gt;And apparently they did it in &lt;strong&gt;my damn office. &lt;/strong&gt;That&apos;s my big head, my three monitors and I am, in fact, hacking on CoffeeScript in this picture, not fighting cybercrime. How do I know? Because I was there when this photo was taken by Rob Conery. We used it &lt;a href=&quot;http://www.speakinghacks.com&quot;&gt;for my Speaking Hacks educational video&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/They-will-take-your-photos-and-use-them-_13793/image_3.png&quot; width=&quot;500&quot; height=&quot;517&quot;&gt;&lt;/p&gt; &lt;p&gt;Rob Conery and I made a video called Speaking Hacks...here&apos;s a screen capture. &lt;/p&gt; &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/They-will-take-your-photos-and-use-them-_13793/image_9.png&quot; width=&quot;640&quot; height=&quot;283&quot;&gt;&lt;/p&gt; &lt;p&gt;It got used on a post a &lt;a href=&quot;https://coderwall.com/p/fgtlba&quot;&gt;CoderWall.com&lt;/a&gt; where I describe my system setup. I love that they crop the pictures they so carefully Google Image Search for. &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;I try to use &lt;a href=&quot;http://search.creativecommons.org&quot;&gt;search.creativecommons.org&lt;/a&gt; for my image searches on this blog. Raphael Rivera turned me on to this and reminded me of the importance of respecting image copyright. Just googling for a picture and slapping it on your blog isn&apos;t cool.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Usually when this kind of thing happens I&apos;ll just email a kind note to the owner of the site and mention it and it gets handled. (I&apos;ve just emailed Business Insider now) Most people are &lt;em&gt;very &lt;/em&gt;nice. Folks at Gizmodo and LifeHacker almost always have a real human behind their stories with a real Twitter account and they&apos;ve always been accommodating about little things.&lt;/p&gt; &lt;p&gt;Ah, but sometimes it&apos;s not just a nameless-faceless newspaper but it&apos;s a nameless-faceless newspaper article originally published by Reuters on &quot;put on the wire&quot; which means it can spread literally everywhere, and fast.&lt;/p&gt; &lt;p&gt;Do I care? Not really, but it&apos;s the principle of the thing. I mention it because it&apos;s a teachable moment for us all. &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;When you put an image on the Internet, it&apos;s &lt;strong&gt;on the Internet. &lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;It can be used for anything, anytime, by anyone. You can assert copyright, but usually depending on how big the site is (or how obtuse their Contact Us page is) you&apos;ll be lucky to find a human, much less a nice one.&lt;/p&gt; &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/They-will-take-your-photos-and-use-them-_13793/image_6.png&quot; width=&quot;630&quot; height=&quot;163&quot;&gt;&lt;/p&gt; &lt;p&gt;At least I have my hair. So far.&lt;/p&gt; &lt;h3&gt;Think about signing that Photo Release&lt;/h3&gt; &lt;p&gt;I try to use &lt;a href=&quot;http://search.creativecommons.org&quot;&gt;search.creativecommons.org&lt;/a&gt; for my image searches on this blog. Raphael Rivera turned me on to this and reminded me of the importance of respecting image copyright. Just googling for a picture and slapping it on your blog isn&apos;t cool.&lt;/p&gt; &lt;p&gt;It matters to me when it&apos;s big and public and involves my kids. Some friends were driving down the freeway recently and noticed something. They called and said &quot;Is that your son on a billboard off I-5?&quot; &lt;/p&gt; &lt;p&gt;This was my reaction: O_o&lt;/p&gt; &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/They-will-take-your-photos-and-use-them-_13793/image_15.png&quot; width=&quot;500&quot; height=&quot;375&quot;&gt;&lt;/p&gt; &lt;p&gt;Turns out that years ago in our school&apos;s day care we signed a photo release. I assume we thought it was for their blog, or a pamphlet, but in retrospect even that was a bad idea. We never thought my kid would end up on a 30 foot paper billboard advertisement, with little recourse. Fortunately in the billboard case, the head of the school wasn&apos;t aware either! Their marketing folks were just pulling the photos from a shared folder, treating them as stock images. In the end, the school was &lt;em&gt;extremely &lt;/em&gt;accommodating and apologetic and it&apos;s since been handled. Still, a wake up call to us, and I hope, to you, Dear Reader. &lt;/p&gt; &lt;h3&gt;Happy Resolution&lt;/h3&gt; &lt;p&gt;This email showed up &lt;em&gt;literally&lt;/em&gt; as I was/am writing this post.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Hi Scott&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt; &lt;p&gt;&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt; &lt;p&gt;Thanks for getting in touch. I&#x2019;m the editor at Business Insider Australia.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt; &lt;p&gt;&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt; &lt;p&gt;I&#x2019;ve removed that image, which was syndicated from the US edition. I&#x2019;ve also alerted them to your complaint.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt; &lt;p&gt;&lt;a href=&quot;http://au.businessinsider.com/microsoft-cybercrime-500-million-theft-2013-6&quot;&gt;http://au.businessinsider.com/microsoft-cybercrime-500-million-theft-2013-6&lt;/a&gt;&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt; &lt;p&gt;&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt; &lt;p&gt;Hope this addresses the matter for you.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt; &lt;p&gt;Best wishes,&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt; &lt;p&gt;Paul&lt;/p&gt;&lt;/blockquote&gt;   &lt;p&gt;Awesome. And sometimes your kind letter reaches a kind human and gets handled. Thanks Paul, much respect!&lt;/p&gt; &lt;p&gt;Now, about this NEW picture...;)&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://au.businessinsider.com/microsoft-cybercrime-500-million-theft-2013-6&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/They-will-take-your-photos-and-use-them-_13793/image_14.png&quot; width=&quot;475&quot; height=&quot;407&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;em&gt;(Yes, I realize the thick irony of me blogging it, and thereby putting the image &quot;back out there&quot; but it&apos;s for educational purposes.)&lt;/em&gt;&lt;/p&gt;&lt;br/&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. &lt;br/&gt;&lt;/div&gt;
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/42469408/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/42469408/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/42469408/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/42469408/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/42469408/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=e4f1c707-de2e-488a-ac43-7cee407a462f</comments>
      <category>Musings</category><content:encoded>&lt;div&gt;&lt;p&gt;This is hardly a tragic story and it&apos;s not even a good photo, but it&apos;s interesting because it happens a few times a year. Perhaps it&apos;s happened to you! (Share in the comments)&lt;/p&gt; &lt;p&gt;A buddy noticed a story in &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~au.businessinsider.com/microsoft-cybercrime-500-million-theft-2013-6&quot;&gt;Business Insider Australia&lt;/a&gt; that was picked up off Reuters called &quot;Microsoft says they&apos;ve disrupted a global cybercrime ring responsible for $500 Million Theft.&quot; It was syndicated to OZ by Business Insider US who pulled it from Reuters, and it seems they each pick their own illustrative picture.&lt;/p&gt; &lt;p&gt;And apparently they did it in &lt;strong&gt;my damn office. &lt;/strong&gt;That&apos;s my big head, my three monitors and I am, in fact, hacking on CoffeeScript in this picture, not fighting cybercrime. How do I know? Because I was there when this photo was taken by Rob Conery. We used it &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.speakinghacks.com&quot;&gt;for my Speaking Hacks educational video&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/They-will-take-your-photos-and-use-them-_13793/image_3.png&quot; width=&quot;500&quot; height=&quot;517&quot;&gt;&lt;/p&gt; &lt;p&gt;Rob Conery and I made a video called Speaking Hacks...here&apos;s a screen capture. &lt;/p&gt; &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/They-will-take-your-photos-and-use-them-_13793/image_9.png&quot; width=&quot;640&quot; height=&quot;283&quot;&gt;&lt;/p&gt; &lt;p&gt;It got used on a post a &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://coderwall.com/p/fgtlba&quot;&gt;CoderWall.com&lt;/a&gt; where I describe my system setup. I love that they crop the pictures they so carefully Google Image Search for. &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;I try to use &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~search.creativecommons.org&quot;&gt;search.creativecommons.org&lt;/a&gt; for my image searches on this blog. Raphael Rivera turned me on to this and reminded me of the importance of respecting image copyright. Just googling for a picture and slapping it on your blog isn&apos;t cool.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Usually when this kind of thing happens I&apos;ll just email a kind note to the owner of the site and mention it and it gets handled. (I&apos;ve just emailed Business Insider now) Most people are &lt;em&gt;very &lt;/em&gt;nice. Folks at Gizmodo and LifeHacker almost always have a real human behind their stories with a real Twitter account and they&apos;ve always been accommodating about little things.&lt;/p&gt; &lt;p&gt;Ah, but sometimes it&apos;s not just a nameless-faceless newspaper but it&apos;s a nameless-faceless newspaper article originally published by Reuters on &quot;put on the wire&quot; which means it can spread literally everywhere, and fast.&lt;/p&gt; &lt;p&gt;Do I care? Not really, but it&apos;s the principle of the thing. I mention it because it&apos;s a teachable moment for us all. &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;When you put an image on the Internet, it&apos;s &lt;strong&gt;on the Internet. &lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;It can be used for anything, anytime, by anyone. You can assert copyright, but usually depending on how big the site is (or how obtuse their Contact Us page is) you&apos;ll be lucky to find a human, much less a nice one.&lt;/p&gt; &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/They-will-take-your-photos-and-use-them-_13793/image_6.png&quot; width=&quot;630&quot; height=&quot;163&quot;&gt;&lt;/p&gt; &lt;p&gt;At least I have my hair. So far.&lt;/p&gt; &lt;h3&gt;Think about signing that Photo Release&lt;/h3&gt; &lt;p&gt;I try to use &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~search.creativecommons.org&quot;&gt;search.creativecommons.org&lt;/a&gt; for my image searches on this blog. Raphael Rivera turned me on to this and reminded me of the importance of respecting image copyright. Just googling for a picture and slapping it on your blog isn&apos;t cool.&lt;/p&gt; &lt;p&gt;It matters to me when it&apos;s big and public and involves my kids. Some friends were driving down the freeway recently and noticed something. They called and said &quot;Is that your son on a billboard off I-5?&quot; &lt;/p&gt; &lt;p&gt;This was my reaction: O_o&lt;/p&gt; &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/They-will-take-your-photos-and-use-them-_13793/image_15.png&quot; width=&quot;500&quot; height=&quot;375&quot;&gt;&lt;/p&gt; &lt;p&gt;Turns out that years ago in our school&apos;s day care we signed a photo release. I assume we thought it was for their blog, or a pamphlet, but in retrospect even that was a bad idea. We never thought my kid would end up on a 30 foot paper billboard advertisement, with little recourse. Fortunately in the billboard case, the head of the school wasn&apos;t aware either! Their marketing folks were just pulling the photos from a shared folder, treating them as stock images. In the end, the school was &lt;em&gt;extremely &lt;/em&gt;accommodating and apologetic and it&apos;s since been handled. Still, a wake up call to us, and I hope, to you, Dear Reader. &lt;/p&gt; &lt;h3&gt;Happy Resolution&lt;/h3&gt; &lt;p&gt;This email showed up &lt;em&gt;literally&lt;/em&gt; as I was/am writing this post.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Hi Scott&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt; &lt;p&gt;&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt; &lt;p&gt;Thanks for getting in touch. I&#x2019;m the editor at Business Insider Australia.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt; &lt;p&gt;&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt; &lt;p&gt;I&#x2019;ve removed that image, which was syndicated from the US edition. I&#x2019;ve also alerted them to your complaint.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt; &lt;p&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~au.businessinsider.com/microsoft-cybercrime-500-million-theft-2013-6&quot;&gt;http://au.businessinsider.com/microsoft-cybercrime-500-million-theft-2013-6&lt;/a&gt;&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt; &lt;p&gt;&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt; &lt;p&gt;Hope this addresses the matter for you.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt; &lt;p&gt;Best wishes,&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt; &lt;p&gt;Paul&lt;/p&gt;&lt;/blockquote&gt;   &lt;p&gt;Awesome. And sometimes your kind letter reaches a kind human and gets handled. Thanks Paul, much respect!&lt;/p&gt; &lt;p&gt;Now, about this NEW picture...;)&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~au.businessinsider.com/microsoft-cybercrime-500-million-theft-2013-6&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/They-will-take-your-photos-and-use-them-_13793/image_14.png&quot; width=&quot;475&quot; height=&quot;407&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;em&gt;(Yes, I realize the thick irony of me blogging it, and thereby putting the image &quot;back out there&quot; but it&apos;s for educational purposes.)&lt;/em&gt;&lt;/p&gt;
&lt;br/&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. 
&lt;br/&gt;&lt;/div&gt;&lt;Img align=&quot;left&quot; border=&quot;0&quot; height=&quot;1&quot; width=&quot;1&quot; style=&quot;border:0;float:left;margin:0;padding:0&quot; hspace=&quot;0&quot; src=&quot;http://feeds.hanselman.com/~/i/42469408/0/scotthanselman&quot;&gt;

&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/42469408/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/42469408/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/42469408/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/42469408/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/42469408/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded></item>
<item>
<feedburner:origLink>http://www.hanselman.com/blog/ExclusiveSneakPeekTheAGENTSmartWatchEmulatorAndManagedNETCodeOnMyWrist.aspx</feedburner:origLink>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=a7cf3df4-eb32-47d6-a237-6da351693584</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=a7cf3df4-eb32-47d6-a237-6da351693584</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=a7cf3df4-eb32-47d6-a237-6da351693584</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=a7cf3df4-eb32-47d6-a237-6da351693584</wfw:commentRss>
      <slash:comments>25</slash:comments>
      <title>Exclusive Sneak Peek: The AGENT Smart Watch Emulator and managed .NET code on my wrist!</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=a7cf3df4-eb32-47d6-a237-6da351693584</guid>
      <link>http://feeds.hanselman.com/~/42467483/0/scotthanselman~Exclusive-Sneak-Peek-The-AGENT-Smart-Watch-Emulator-and-managed-NET-code-on-my-wrist.aspx</link>
      <pubDate>Tue, 18 Jun 2013 17:40:27 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;&lt;a href=&quot;http://www.kickstarter.com/projects/secretlabs/agent-the-worlds-smartest-watch&quot;&gt;&lt;img title=&quot;The AGENT Smart Watch&quot; style=&quot;display: inline&quot; alt=&quot;The AGENT Smart Watch&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Exclusive-Sneak-Peak-The-Agent-.NET-code_F31F/fdb2fb7679c4e17b878172640d852fa9_large_3.jpg&quot; width=&quot;620&quot; height=&quot;275&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I&apos;m totally geeked out about Smart Watches. I always have been, from the original &lt;a href=&quot;http://www.hanselman.com/blog/REVIEWEDMicrosoftWristNETMSNDirectWatchFromFossil.aspx&quot;&gt;Microsoft SPOT watch&lt;/a&gt; (from 10 years ago!) to the &lt;a href=&quot;http://www.hanselman.com/blog/SmartWatchesAreFinallyGoingToHappenPebbleWatchReviewed.aspx&quot;&gt;Pebble&lt;/a&gt;, and now the AGENT Smart Watch from Secret Labs. Secret Labs are the folks that brought us the &lt;a href=&quot;https://www.google.com/webhp?sourceid=chrome-instant&amp;amp;ion=1&amp;amp;ie=UTF-8#gs_rn=17&amp;amp;gs_ri=psy-ab&amp;amp;tok=aZWoF7UPlLj6_NK-gREr5A&amp;amp;suggest=p&amp;amp;cp=8&amp;amp;gs_id=4x&amp;amp;xhr=t&amp;amp;q=Netduino&amp;amp;es_nrs=true&amp;amp;pf=p&amp;amp;output=search&amp;amp;sclient=psy-ab&amp;amp;oq=Netduino&amp;amp;gs_l=&amp;amp;pbx=1&amp;amp;bav=on.2,or.r_cp.r_qf.&amp;amp;bvm=bv.48137252,d.cGE&amp;amp;fp=c27102543d04f20&amp;amp;biw=0&amp;amp;bih=471&amp;amp;ion=1&amp;amp;bs=1&quot;&gt;Netduino&lt;/a&gt; open source electronics platform that uses the .NET Micro Framework. It&apos;s pretty awesome that you can write C# and run it in 64k or in 64gigs, from the wrist to the cloud.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;Upcoming Conference: &lt;/strong&gt;If you&apos;re in or around Chicago in July 2013, consider joining Chris Walker from SecretLabs and I at the &lt;a href=&quot;http://monkeyspace.org&quot;&gt;MonkeySpace&lt;/a&gt; conference! We&apos;ll be speaking about developing for embedded systems and the AGENT Watch with C#. What are the power considerations? How low-level is this kind of coding? Can one kind of app cause battery drain while another keeps the watch going for a week? What about notifications and bluetooth? We&apos;ll cover all this and lots more, join us.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;img title=&quot;The AGENT Smart Watch will talk to your phone&quot; style=&quot;float: right; display: inline&quot; alt=&quot;The AGENT Smart Watch will talk to your phone&quot; align=&quot;right&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Exclusive-Sneak-Peak-The-Agent-.NET-code_F31F/d077ee7030305ec8e20d8b32fc3d221c_large_3.jpg&quot; width=&quot;320&quot; height=&quot;301&quot;&gt;The AGENT Smart Watch was trying to raise $100k to build a watch and as of the time of this writing they are &lt;a href=&quot;http://www.kickstarter.com/projects/secretlabs/agent-the-worlds-smartest-watch&quot;&gt;within spitting distance of a MILLION dollars&lt;/a&gt;! There&apos;s just hours to go to get in on this cool Kickstarter. (Remember, Kickstarter is an investment, not a store.)&lt;/p&gt; &lt;p&gt;Not only is this a .NET Microframework Device, but we can start writing apps now using the AGENT Watch Emulator. From their Kickstarter site:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Traditional smartwatches run apps in an unrestricted environment.&amp;nbsp; AGENT&apos;s OS includes a managed runtime, optimized for our low-power architecture.&amp;nbsp; It is called the .NET Micro Framework and it makes watch apps trustable.  &lt;p&gt;This feature-rich managed runtime also offers developers modern features they crave: event-based programming; multi-threading; garbage collection; lambda expressions; exception handling; automatic power management; and much more.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;You can install VS2012 and the &lt;a href=&quot;http://netmf.codeplex.com/releases/view/81000&quot;&gt;.NET Micro Framework 4.3&lt;/a&gt; and write an app for your wrist! I alluded to this a little in my Xamarin talk &quot;&lt;a href=&quot;http://www.hanselman.com/blog/XamarinEvolve2013TalkVideoHowCSavedMyMarriage.aspx&quot;&gt;How C# Saved My Marriage&lt;/a&gt;.&quot; You can write .NET apps for embedded systems, a watch, tablets, desktops, web sites, large cloud systems and more.  &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;Full disclosure:&lt;/strong&gt; I have no financial stake or business relationship with SecretLabs, but we are friends and I&apos;m a fan. I helped Chris with some copy writing on the Kickstarter page, it&apos;s text and reviewing the video as a favor. I have received no money from SecretLabs and I backed the Kickstarter with my own money.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;&lt;img title=&quot;image&quot; style=&quot;float: right; display: inline&quot; alt=&quot;image&quot; align=&quot;right&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Exclusive-Sneak-Peak-The-Agent-.NET-code_F31F/image_3.png&quot; width=&quot;251&quot; height=&quot;231&quot;&gt;&lt;/strong&gt;I got a preview of the &lt;strong&gt;AGENT Smart Watch emulator&lt;/strong&gt;, and some code from Kickstarter backer &lt;a href=&quot;http://dk.linkedin.com/in/ebast&quot;&gt;Esben Bast&lt;/a&gt; who created a binary clock face. I loaded up VS2012 and the binary clock emulator. This initial code is just about 100 lines. You can see the references in Solution Explorer here. SPOT means &quot;Smart Personal Object Technlogy.&quot;  &lt;p&gt;The fact that there is an emulator is huge. No worries about breaking a watch or even having a watch! The Agent Watch SDK puts a reference to the AGENT Emulator in my registry, so it shows up directly in Visual Studio:  &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Exclusive-Sneak-Peak-The-Agent-.NET-code_F31F/image_8.png&quot; width=&quot;319&quot; height=&quot;217&quot;&gt;  &lt;p&gt;Then I can debug my watch app without a watch, just as if I were writing a Phone App or Web Site. It&apos;s a first class experience inside of VS. This makes me feel particularly empowered as a .NET developer because it means &lt;em&gt;I already know how to write apps for this watch&lt;/em&gt; and I&apos;ve never even seen it before..  &lt;p&gt;&lt;img src=&quot;http://hanselman.com/blog/content/binary/agentsmartwatchanimation.gif&quot;&gt;  &lt;p&gt;The code is pretty straightforward, if appropriately low-level. This IS a small device we&apos;re talking about!  &lt;p&gt;You&apos;ve got total control over the screen and what can be displayed. You could create any watch face that you could imagine (that would fit on the screen) because you have a Bitmap to draw to.  &lt;p&gt;The .NET Micro Framework has no fonts &lt;em&gt;loaded &lt;/em&gt;by default, but I can include them as resources. There&apos;s some &quot;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/cc533019.aspx&quot;&gt;tinyfnt&lt;/a&gt;&quot; files in C:\Program Files (x86)\Microsoft .NET Micro Framework\v4.3\Fonts or I could download or make some myself. Even better I can &lt;a href=&quot;http://informatix.miloush.net/microframework/Utilities/TinyFontTool.aspx&quot;&gt;use the TinyFontTool from Miloush&lt;/a&gt;.  &lt;p&gt;I can load a font from a resource like this:&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;font = Resources.GetFont(Resources.FontResources.small);
&lt;/pre&gt;
&lt;p&gt;and then later in my UpdateTime() method, Draw the time on my binary clock screen.&lt;/p&gt;&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;_bitmap.DrawText(DateTime.Now.ToString(&quot;HH:mm:ss&quot;), font, Color.White, 45, 15);
&lt;/pre&gt;
&lt;p&gt;Run my emulator again and I have the time printed as well!&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Now my AGENT Smart Watch has the time printed above the Binary Clock&quot; style=&quot;display: inline&quot; alt=&quot;Now my AGENT Smart Watch has the time printed above the Binary Clock&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Exclusive-Sneak-Peak-The-Agent-.NET-code_F31F/image_11.png&quot; width=&quot;315&quot; height=&quot;438&quot;&gt;&lt;/p&gt;
&lt;p&gt;The only real &quot;microframework-ism&quot; in the code is that the watch face doesn&apos;t want to use a lot of power, so you should &quot;go to sleep.&quot; It&apos;s the same as if you were writing a console app. If your main() function ends, then your app will end! But, since this is a watch face, we want it to run all the time, so, we start a 1 second timer, then sleep the main() forever. Everything interesting happens as an event on a background thread. (The watch can control the lifetime and tombstone or kill the watch face if you&apos;re doing other things.)&lt;/p&gt;&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;public static void Main()&lt;br&gt;{&lt;br&gt;    _bitmap = new Bitmap(Bitmap.MaxWidth, Bitmap.MaxHeight);&lt;br&gt;    _font = Resources.GetFont(Resources.FontResources.small);&lt;br&gt;&lt;br&gt;    // display the time immediately&lt;br&gt;    UpdateTime(null);&lt;br&gt;&lt;br&gt;    // set up timer to refresh time every minute&lt;br&gt;    DateTime currentTime = DateTime.Now;&lt;br&gt;    TimeSpan dueTime = new TimeSpan(0); // beginning of next minute&lt;br&gt;    TimeSpan period = new TimeSpan(0, 0, 0, 1, 0); // update time every minute&lt;br&gt;    _updateClockTimer = new Timer(UpdateTime, null, dueTime, period); // start our minute timer&lt;br&gt;&lt;br&gt;    _button = new InterruptPort(HardwareProvider.HwProvider.GetButtonPins(Button.VK_SELECT), &lt;br&gt;        false, &lt;br&gt;        Port.ResistorMode.PullDown, &lt;br&gt;        Port.InterruptMode.InterruptEdgeBoth);&lt;br&gt;    _button.OnInterrupt += _button_OnInterrupt;&lt;br&gt;    // go to sleep; time updates will happen automatically every minute    &lt;br&gt;    Thread.Sleep(Timeout.Infinite);&lt;br&gt;}
&lt;/pre&gt;
&lt;p&gt;That last part is interesting. You&apos;ve got two event handlers here, the one to UpdateTime every second and then one to watch for the Button getting pressed. You want the watch app to be event-driven...it needs to do as &lt;strike&gt;little as possible&lt;/strike&gt; NOTHING until it&apos;s time to do something. This InterruptPort is watching for the the middle button (the VK_SELECT button). ResisterMode.PullDown means the button will show &quot;1&quot; or &lt;em&gt;true &lt;/em&gt;when it&apos;s pressed. InterruptEdgeBoth means I get events when the button is pressed AND when it goes up.&lt;/p&gt;
&lt;h3&gt;Go make Watch Apps!&lt;/h3&gt;
&lt;p&gt;Here&apos;s another cool watch face from &lt;a href=&quot;https://www.facebook.com/media/set/?set=vb.239788096166290&amp;amp;type=2&quot;&gt;Dylan Mazurek&lt;/a&gt; next to the Big Digits example:&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;PixelFace example Watch for AGENT Smart Watch&quot; style=&quot;display: inline&quot; alt=&quot;PixelFace example Watch for AGENT Smart Watch&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Exclusive-Sneak-Peak-The-Agent-.NET-code_F31F/image_14.png&quot; width=&quot;315&quot; height=&quot;438&quot;&gt;&amp;nbsp;&lt;img title=&quot;BigDigits example Watch for AGENT Smart Watch&quot; style=&quot;display: inline&quot; alt=&quot;BigDigits example Watch for AGENT Smart Watch&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Exclusive-Sneak-Peak-The-Agent-.NET-code_F31F/image_17.png&quot; width=&quot;315&quot; height=&quot;438&quot;&gt;&lt;/p&gt;
&lt;p&gt;And finally, here&apos;s an animated concept for a World Time face that &lt;a href=&quot;https://twitter.com/Gutworks&quot;&gt;Steve Bulgin&lt;/a&gt; made for Pete Brown as well as another &lt;a href=&quot;https://twitter.com/Gutworks&quot;&gt;Steve&lt;/a&gt; concept below:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/Gutworks&quot;&gt;&lt;img src=&quot;http://hanselman.com/blog/content/binary/agentsmartwatchworldwatchface.gif&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The next step will be more than watch faces, it will be watch utilities and apps. Maybe an app for my FitBit, or an app to manage Blood Sugar? Perhaps a &lt;a href=&quot;http://www.hanselman.com/blog/NestThermostatReview2ndGenerationEveryConsumerElectronicDeviceShouldBeThisPolished.aspx&quot;&gt;Nest&lt;/a&gt; app to &lt;a href=&quot;http://www.hanselman.com/blog/NestThermostatReview2ndGenerationEveryConsumerElectronicDeviceShouldBeThisPolished.aspx&quot;&gt;control my thermostat&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;The AGENT Watch Emulator emulator will be available to download &lt;strong&gt;this Thursday &lt;/strong&gt;at &lt;a href=&quot;http://www.agentwatches.com&quot;&gt;www.agentwatches.com&lt;/a&gt;. You can get ready by installing the &lt;a href=&quot;http://www.netmf.com/&quot;&gt;.NET Micro Framework&lt;/a&gt; today.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/Gutworks&quot;&gt;&lt;img title=&quot;Steve Bulgin watch face for the AGENT smart watch&quot; style=&quot;float: right; display: inline&quot; alt=&quot;Steve Bulgin watch face for the AGENT smart watch&quot; align=&quot;right&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Exclusive-Sneak-Peak-The-Agent-.NET-code_F31F/HoH_Watch_Face_3.png&quot; width=&quot;128&quot; height=&quot;128&quot;&gt;&lt;/a&gt;Watch apps can be written in C# using Microsoft Visual Studio 2012 (including the free Express edition). Deploy your apps over Bluetooth and debug them interactively.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.microsoft.com/visualstudio/eng/downloads#d-express-windows-desktop&quot;&gt;Download Visual Studio Express 2012&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;http://www.agentwatches.com/downloads/MicroFrameworkSDK_NETMF43.msi&quot;&gt;Download .NET Micro Framework SDK v4.3&lt;/a&gt; 
&lt;p&gt;Developers can also use AGENT as a secondary display, interacting with it remotely via Bluetooth from their Objective-C, C#, or Java smartphone app.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Even though the watch ships in December, I&apos;m going to start writing apps now so I&apos;m ready for the Watch App Store (coming soon)!&lt;/p&gt;&lt;br/&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. &lt;br/&gt;&lt;/div&gt;
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/42467483/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/42467483/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/42467483/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/42467483/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/42467483/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=a7cf3df4-eb32-47d6-a237-6da351693584</comments>
      <category>Micro Framework</category>
      <category>Tools</category><content:encoded>&lt;div&gt;&lt;p&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.kickstarter.com/projects/secretlabs/agent-the-worlds-smartest-watch&quot;&gt;&lt;img title=&quot;The AGENT Smart Watch&quot; style=&quot;display: inline&quot; alt=&quot;The AGENT Smart Watch&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Exclusive-Sneak-Peak-The-Agent-.NET-code_F31F/fdb2fb7679c4e17b878172640d852fa9_large_3.jpg&quot; width=&quot;620&quot; height=&quot;275&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I&apos;m totally geeked out about Smart Watches. I always have been, from the original &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.hanselman.com/blog/REVIEWEDMicrosoftWristNETMSNDirectWatchFromFossil.aspx&quot;&gt;Microsoft SPOT watch&lt;/a&gt; (from 10 years ago!) to the &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.hanselman.com/blog/SmartWatchesAreFinallyGoingToHappenPebbleWatchReviewed.aspx&quot;&gt;Pebble&lt;/a&gt;, and now the AGENT Smart Watch from Secret Labs. Secret Labs are the folks that brought us the &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://www.google.com/webhp?sourceid=chrome-instant&amp;amp;ion=1&amp;amp;ie=UTF-8#gs_rn=17&amp;amp;gs_ri=psy-ab&amp;amp;tok=aZWoF7UPlLj6_NK-gREr5A&amp;amp;suggest=p&amp;amp;cp=8&amp;amp;gs_id=4x&amp;amp;xhr=t&amp;amp;q=Netduino&amp;amp;es_nrs=true&amp;amp;pf=p&amp;amp;output=search&amp;amp;sclient=psy-ab&amp;amp;oq=Netduino&amp;amp;gs_l=&amp;amp;pbx=1&amp;amp;bav=on.2,or.r_cp.r_qf.&amp;amp;bvm=bv.48137252,d.cGE&amp;amp;fp=c27102543d04f20&amp;amp;biw=0&amp;amp;bih=471&amp;amp;ion=1&amp;amp;bs=1&quot;&gt;Netduino&lt;/a&gt; open source electronics platform that uses the .NET Micro Framework. It&apos;s pretty awesome that you can write C# and run it in 64k or in 64gigs, from the wrist to the cloud.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;Upcoming Conference: &lt;/strong&gt;If you&apos;re in or around Chicago in July 2013, consider joining Chris Walker from SecretLabs and I at the &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~monkeyspace.org&quot;&gt;MonkeySpace&lt;/a&gt; conference! We&apos;ll be speaking about developing for embedded systems and the AGENT Watch with C#. What are the power considerations? How low-level is this kind of coding? Can one kind of app cause battery drain while another keeps the watch going for a week? What about notifications and bluetooth? We&apos;ll cover all this and lots more, join us.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;img title=&quot;The AGENT Smart Watch will talk to your phone&quot; style=&quot;float: right; display: inline&quot; alt=&quot;The AGENT Smart Watch will talk to your phone&quot; align=&quot;right&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Exclusive-Sneak-Peak-The-Agent-.NET-code_F31F/d077ee7030305ec8e20d8b32fc3d221c_large_3.jpg&quot; width=&quot;320&quot; height=&quot;301&quot;&gt;The AGENT Smart Watch was trying to raise $100k to build a watch and as of the time of this writing they are &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.kickstarter.com/projects/secretlabs/agent-the-worlds-smartest-watch&quot;&gt;within spitting distance of a MILLION dollars&lt;/a&gt;! There&apos;s just hours to go to get in on this cool Kickstarter. (Remember, Kickstarter is an investment, not a store.)&lt;/p&gt; &lt;p&gt;Not only is this a .NET Microframework Device, but we can start writing apps now using the AGENT Watch Emulator. From their Kickstarter site:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Traditional smartwatches run apps in an unrestricted environment.&amp;nbsp; AGENT&apos;s OS includes a managed runtime, optimized for our low-power architecture.&amp;nbsp; It is called the .NET Micro Framework and it makes watch apps trustable.  &lt;p&gt;This feature-rich managed runtime also offers developers modern features they crave: event-based programming; multi-threading; garbage collection; lambda expressions; exception handling; automatic power management; and much more.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;You can install VS2012 and the &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~netmf.codeplex.com/releases/view/81000&quot;&gt;.NET Micro Framework 4.3&lt;/a&gt; and write an app for your wrist! I alluded to this a little in my Xamarin talk &quot;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.hanselman.com/blog/XamarinEvolve2013TalkVideoHowCSavedMyMarriage.aspx&quot;&gt;How C# Saved My Marriage&lt;/a&gt;.&quot; You can write .NET apps for embedded systems, a watch, tablets, desktops, web sites, large cloud systems and more.  &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;Full disclosure:&lt;/strong&gt; I have no financial stake or business relationship with SecretLabs, but we are friends and I&apos;m a fan. I helped Chris with some copy writing on the Kickstarter page, it&apos;s text and reviewing the video as a favor. I have received no money from SecretLabs and I backed the Kickstarter with my own money.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;&lt;img title=&quot;image&quot; style=&quot;float: right; display: inline&quot; alt=&quot;image&quot; align=&quot;right&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Exclusive-Sneak-Peak-The-Agent-.NET-code_F31F/image_3.png&quot; width=&quot;251&quot; height=&quot;231&quot;&gt;&lt;/strong&gt;I got a preview of the &lt;strong&gt;AGENT Smart Watch emulator&lt;/strong&gt;, and some code from Kickstarter backer &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~dk.linkedin.com/in/ebast&quot;&gt;Esben Bast&lt;/a&gt; who created a binary clock face. I loaded up VS2012 and the binary clock emulator. This initial code is just about 100 lines. You can see the references in Solution Explorer here. SPOT means &quot;Smart Personal Object Technlogy.&quot;  &lt;p&gt;The fact that there is an emulator is huge. No worries about breaking a watch or even having a watch! The Agent Watch SDK puts a reference to the AGENT Emulator in my registry, so it shows up directly in Visual Studio:  &lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Exclusive-Sneak-Peak-The-Agent-.NET-code_F31F/image_8.png&quot; width=&quot;319&quot; height=&quot;217&quot;&gt;  &lt;p&gt;Then I can debug my watch app without a watch, just as if I were writing a Phone App or Web Site. It&apos;s a first class experience inside of VS. This makes me feel particularly empowered as a .NET developer because it means &lt;em&gt;I already know how to write apps for this watch&lt;/em&gt; and I&apos;ve never even seen it before..  &lt;p&gt;&lt;img src=&quot;http://hanselman.com/blog/content/binary/agentsmartwatchanimation.gif&quot;&gt;  &lt;p&gt;The code is pretty straightforward, if appropriately low-level. This IS a small device we&apos;re talking about!  &lt;p&gt;You&apos;ve got total control over the screen and what can be displayed. You could create any watch face that you could imagine (that would fit on the screen) because you have a Bitmap to draw to.  &lt;p&gt;The .NET Micro Framework has no fonts &lt;em&gt;loaded &lt;/em&gt;by default, but I can include them as resources. There&apos;s some &quot;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~msdn.microsoft.com/en-us/library/cc533019.aspx&quot;&gt;tinyfnt&lt;/a&gt;&quot; files in C:\Program Files (x86)\Microsoft .NET Micro Framework\v4.3\Fonts or I could download or make some myself. Even better I can &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~informatix.miloush.net/microframework/Utilities/TinyFontTool.aspx&quot;&gt;use the TinyFontTool from Miloush&lt;/a&gt;.  &lt;p&gt;I can load a font from a resource like this:&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;font = Resources.GetFont(Resources.FontResources.small);
&lt;/pre&gt;
&lt;p&gt;and then later in my UpdateTime() method, Draw the time on my binary clock screen.&lt;/p&gt;&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;_bitmap.DrawText(DateTime.Now.ToString(&quot;HH:mm:ss&quot;), font, Color.White, 45, 15);
&lt;/pre&gt;
&lt;p&gt;Run my emulator again and I have the time printed as well!&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Now my AGENT Smart Watch has the time printed above the Binary Clock&quot; style=&quot;display: inline&quot; alt=&quot;Now my AGENT Smart Watch has the time printed above the Binary Clock&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Exclusive-Sneak-Peak-The-Agent-.NET-code_F31F/image_11.png&quot; width=&quot;315&quot; height=&quot;438&quot;&gt;&lt;/p&gt;
&lt;p&gt;The only real &quot;microframework-ism&quot; in the code is that the watch face doesn&apos;t want to use a lot of power, so you should &quot;go to sleep.&quot; It&apos;s the same as if you were writing a console app. If your main() function ends, then your app will end! But, since this is a watch face, we want it to run all the time, so, we start a 1 second timer, then sleep the main() forever. Everything interesting happens as an event on a background thread. (The watch can control the lifetime and tombstone or kill the watch face if you&apos;re doing other things.)&lt;/p&gt;&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;public static void Main()
&lt;br&gt;{
&lt;br&gt;    _bitmap = new Bitmap(Bitmap.MaxWidth, Bitmap.MaxHeight);
&lt;br&gt;    _font = Resources.GetFont(Resources.FontResources.small);
&lt;br&gt;
&lt;br&gt;    // display the time immediately
&lt;br&gt;    UpdateTime(null);
&lt;br&gt;
&lt;br&gt;    // set up timer to refresh time every minute
&lt;br&gt;    DateTime currentTime = DateTime.Now;
&lt;br&gt;    TimeSpan dueTime = new TimeSpan(0); // beginning of next minute
&lt;br&gt;    TimeSpan period = new TimeSpan(0, 0, 0, 1, 0); // update time every minute
&lt;br&gt;    _updateClockTimer = new Timer(UpdateTime, null, dueTime, period); // start our minute timer
&lt;br&gt;
&lt;br&gt;    _button = new InterruptPort(HardwareProvider.HwProvider.GetButtonPins(Button.VK_SELECT), 
&lt;br&gt;        false, 
&lt;br&gt;        Port.ResistorMode.PullDown, 
&lt;br&gt;        Port.InterruptMode.InterruptEdgeBoth);
&lt;br&gt;    _button.OnInterrupt += _button_OnInterrupt;
&lt;br&gt;    // go to sleep; time updates will happen automatically every minute    
&lt;br&gt;    Thread.Sleep(Timeout.Infinite);
&lt;br&gt;}
&lt;/pre&gt;
&lt;p&gt;That last part is interesting. You&apos;ve got two event handlers here, the one to UpdateTime every second and then one to watch for the Button getting pressed. You want the watch app to be event-driven...it needs to do as &lt;strike&gt;little as possible&lt;/strike&gt; NOTHING until it&apos;s time to do something. This InterruptPort is watching for the the middle button (the VK_SELECT button). ResisterMode.PullDown means the button will show &quot;1&quot; or &lt;em&gt;true &lt;/em&gt;when it&apos;s pressed. InterruptEdgeBoth means I get events when the button is pressed AND when it goes up.&lt;/p&gt;
&lt;h3&gt;Go make Watch Apps!&lt;/h3&gt;
&lt;p&gt;Here&apos;s another cool watch face from &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://www.facebook.com/media/set/?set=vb.239788096166290&amp;amp;type=2&quot;&gt;Dylan Mazurek&lt;/a&gt; next to the Big Digits example:&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;PixelFace example Watch for AGENT Smart Watch&quot; style=&quot;display: inline&quot; alt=&quot;PixelFace example Watch for AGENT Smart Watch&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Exclusive-Sneak-Peak-The-Agent-.NET-code_F31F/image_14.png&quot; width=&quot;315&quot; height=&quot;438&quot;&gt;&amp;nbsp;&lt;img title=&quot;BigDigits example Watch for AGENT Smart Watch&quot; style=&quot;display: inline&quot; alt=&quot;BigDigits example Watch for AGENT Smart Watch&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Exclusive-Sneak-Peak-The-Agent-.NET-code_F31F/image_17.png&quot; width=&quot;315&quot; height=&quot;438&quot;&gt;&lt;/p&gt;
&lt;p&gt;And finally, here&apos;s an animated concept for a World Time face that &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://twitter.com/Gutworks&quot;&gt;Steve Bulgin&lt;/a&gt; made for Pete Brown as well as another &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://twitter.com/Gutworks&quot;&gt;Steve&lt;/a&gt; concept below:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://twitter.com/Gutworks&quot;&gt;&lt;img src=&quot;http://hanselman.com/blog/content/binary/agentsmartwatchworldwatchface.gif&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The next step will be more than watch faces, it will be watch utilities and apps. Maybe an app for my FitBit, or an app to manage Blood Sugar? Perhaps a &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.hanselman.com/blog/NestThermostatReview2ndGenerationEveryConsumerElectronicDeviceShouldBeThisPolished.aspx&quot;&gt;Nest&lt;/a&gt; app to &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.hanselman.com/blog/NestThermostatReview2ndGenerationEveryConsumerElectronicDeviceShouldBeThisPolished.aspx&quot;&gt;control my thermostat&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;The AGENT Watch Emulator emulator will be available to download &lt;strong&gt;this Thursday &lt;/strong&gt;at &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.agentwatches.com&quot;&gt;www.agentwatches.com&lt;/a&gt;. You can get ready by installing the &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.netmf.com/&quot;&gt;.NET Micro Framework&lt;/a&gt; today.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://twitter.com/Gutworks&quot;&gt;&lt;img title=&quot;Steve Bulgin watch face for the AGENT smart watch&quot; style=&quot;float: right; display: inline&quot; alt=&quot;Steve Bulgin watch face for the AGENT smart watch&quot; align=&quot;right&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Exclusive-Sneak-Peak-The-Agent-.NET-code_F31F/HoH_Watch_Face_3.png&quot; width=&quot;128&quot; height=&quot;128&quot;&gt;&lt;/a&gt;Watch apps can be written in C# using Microsoft Visual Studio 2012 (including the free Express edition). Deploy your apps over Bluetooth and debug them interactively.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.microsoft.com/visualstudio/eng/downloads#d-express-windows-desktop&quot;&gt;Download Visual Studio Express 2012&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.agentwatches.com/downloads/MicroFrameworkSDK_NETMF43.msi&quot;&gt;Download .NET Micro Framework SDK v4.3&lt;/a&gt; 
&lt;p&gt;Developers can also use AGENT as a secondary display, interacting with it remotely via Bluetooth from their Objective-C, C#, or Java smartphone app.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Even though the watch ships in December, I&apos;m going to start writing apps now so I&apos;m ready for the Watch App Store (coming soon)!&lt;/p&gt;
&lt;br/&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. 
&lt;br/&gt;&lt;/div&gt;&lt;Img align=&quot;left&quot; border=&quot;0&quot; height=&quot;1&quot; width=&quot;1&quot; style=&quot;border:0;float:left;margin:0;padding:0&quot; hspace=&quot;0&quot; src=&quot;http://feeds.hanselman.com/~/i/42467483/0/scotthanselman&quot;&gt;

&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/42467483/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/42467483/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/42467483/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/42467483/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/42467483/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded></item>
<item>
<feedburner:origLink>http://www.hanselman.com/blog/StopDoingInternetWrong.aspx</feedburner:origLink>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=7f3e361f-39d4-497c-af8b-e02691a4cf1b</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=7f3e361f-39d4-497c-af8b-e02691a4cf1b</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=7f3e361f-39d4-497c-af8b-e02691a4cf1b</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=7f3e361f-39d4-497c-af8b-e02691a4cf1b</wfw:commentRss>
      <slash:comments>138</slash:comments>
      <title>Stop Doing Internet Wrong.</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=7f3e361f-39d4-497c-af8b-e02691a4cf1b</guid>
      <link>http://feeds.hanselman.com/~/42301519/0/scotthanselman~Stop-Doing-Internet-Wrong.aspx</link>
      <pubDate>Fri, 14 Jun 2013 00:14:19 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;Some days...some days it&apos;s frustrating to be on the web. We&apos;re &lt;a href=&quot;http://www.hanselman.com/blog/JavaScriptIsWebAssemblyLanguageAndThatsOK.aspx&quot;&gt;compiling C++ into JavaScript and running Unreal in the browser&lt;/a&gt; but at the same time, here in 2013, we&apos;re still making the same mistakes. And by we, I mean, the set of web developers who aren&apos;t &lt;strong&gt;us&lt;/strong&gt;, right Dear Reader? Because surely you&apos;re not doing any of these things. ;)&lt;/p&gt; &lt;p&gt;All of these are solvable problems. They aren&apos;t technically hard, or even technically interesting. I consider these &quot;will-required&quot; problems. You need the knowledge that it&apos;s wrong and the will to fix it. As users - and web developers - we need to complain to the right people and help fix it.&lt;/p&gt; &lt;h3&gt;Redirecting a deep desktop link to a mobile home page&lt;/h3&gt; &lt;p&gt;Google has decided that the practice of taking perfectly good deep links like foo.com/something/deep, detecting a mobile device, then redirecting to m.foo.com is user-hostile. In fact, the GoogleBot is going to declare these &quot;&lt;a href=&quot;http://googlewebmastercentral.blogspot.com/2013/06/changes-in-rankings-of-smartphone_11.html&quot;&gt;faulty redirects&lt;/a&gt;&quot; and ding sites in the search result ranking. &lt;a href=&quot;http://googlewebmastercentral.blogspot.com/2013/06/changes-in-rankings-of-smartphone_11.html&quot;&gt;Stated simply&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Avoiding irrelevant redirects is very easy: Simply redirect smartphone users from a desktop page to its equivalent smartphone-optimized page. If the content doesn&apos;t exist in a smartphone-friendly format, showing the desktop content is better than redirecting to an irrelevant page.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;For example, if I want to go to the &lt;a href=&quot;http://www.mcmenamins.com/Pubs&quot;&gt;http://www.mcmenamins.com/Pubs&lt;/a&gt; page, but I do it on mobile, they ALWAYS redirect me to /mobile. Always. Even though I have a quad-processor pocket supercomputer with gigs of space I&apos;ve still surfing a second-class internet.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://www.mcmenamins.com/Pubs&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Youre-Doing-Internet-Wrong_C04B/image_5.png&quot; width=&quot;505&quot; height=&quot;350&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://www.mcmenamins.com/mobile&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Youre-Doing-Internet-Wrong_C04B/image_9.png&quot; width=&quot;178&quot; height=&quot;350&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;I don&apos;t want your crappy app&lt;/h3&gt; &lt;p&gt;That means you Quora. I am in my browser, unless I&apos;m going to the App Store, let&apos;s assume if I&apos;m in the browser, I want to be on the web.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://www.hanselman.com/blog/IdLikeToUseTheWebMyWayThankYouVeryMuchQuora.aspx&quot;&gt;&lt;img title=&quot;You suck Quora&quot; alt=&quot;You suck Quora&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/76ed84d64329_EFFF/image_3.png&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Giant Interstitial Ads&lt;/h3&gt; &lt;p&gt;I&apos;m looking at you, Forbes.com. I GET IT. YOU HAVE ADS.&lt;/p&gt; &lt;p&gt;&lt;img title=&quot;Interstitial Ads are Evil&quot; style=&quot;display: inline&quot; alt=&quot;Interstitial Ads are Evil&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Youre-Doing-Internet-Wrong_C04B/image_18.png&quot; width=&quot;502&quot; height=&quot;405&quot;&gt;&lt;/p&gt; &lt;p&gt;Stay classy.&lt;/p&gt; &lt;h3&gt;Labels for Input Forms&lt;/h3&gt; &lt;p&gt;I hate seeing a checkbox and only being able to click on that exact checkbox.&lt;/p&gt;&lt;pre class=&quot;brush: xml; toolbar: false; auto-links: false;&quot;&gt;&amp;lt;p&amp;gt;Which fruit would you like for lunch?&amp;lt;/p&amp;gt;&lt;br&gt;&amp;lt;form&amp;gt;&lt;br&gt;  &amp;lt;input type=&quot;radio&quot; name=&quot;fruit&quot; id=&quot;banana&quot; /&amp;gt;&lt;br&gt;  &amp;lt;label for=&quot;banana&quot;&amp;gt;Banana&amp;lt;/label&amp;gt;&lt;br&gt;  &amp;lt;input type=&quot;radio&quot; name=&quot;fruit&quot; id=&quot;None&quot; /&amp;gt;&lt;br&gt;  &amp;lt;label for=&quot;none&quot;&amp;gt;None&amp;lt;/label&amp;gt;&lt;br&gt;&amp;lt;/form&amp;gt;&lt;/pre&gt;
&lt;p&gt;It&apos;s so easy to just associate a label with an input. Please do&amp;nbsp; it, then we can all have something larger to click on.&lt;/p&gt;
&lt;h3&gt;Breaking Hyperlinks&lt;/h3&gt;
&lt;p&gt;We&apos;re still doing this. Haven&apos;t we learned that &lt;a href=&quot;http://www.w3.org/Provider/Style/URI.html&quot;&gt;Cool URIs Don&apos;t Change&lt;/a&gt;? It was true in 1998 when that was written and it&apos;s true now. The web as we know it was created in 1990 and made truly open in 1993 and the link to the First Web Page (yes, Capital Letters) is still &lt;a href=&quot;http://info.cern.ch/hypertext/WWW/TheProject.html&quot;&gt;http://info.cern.ch/hypertext/WWW/TheProject.html&lt;/a&gt;. I love that they&apos;ve done the work to keep that link alive.&lt;/p&gt;
&lt;p&gt;There&apos;s just no excuse for this. With .htaccess files and web.config files, maintain a list of redirects and do your best to test them. Maintaining deep and complex links can be complex, but if you&apos;re companyname.com/about link dies because you switch from PHP to Rails, there&apos;s just no excuse for that. I&apos;m your User and I have always typed /about. Don&apos;t&apos; give me a To Do like &quot;Update your bookmarks!&quot; I didn&apos;t come here for a To-Do, I came her for your damn about page. &lt;strong&gt;YOU figure it out.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/okfinethisisnotagoodexamplebutitcouldhavebeenabadpage&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Youre-Doing-Internet-Wrong_C04B/image_15.png&quot; width=&quot;720&quot; height=&quot;255&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Click the Flag that represents your Language&lt;/h3&gt;
&lt;p&gt;I&apos;ve often been asked to &quot;select my language&quot; from a list of country flags, and ended up clicking on the Union Jack to represent &quot;English.&quot; I&apos;m sure the actual English don&apos;t appreciate an American declaring they speak English. ;) &lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Nothing says pick a language like all the United Nations Flags&quot; style=&quot;display: inline&quot; alt=&quot;Nothing says pick a language like all the United Nations Flags&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Youre-Doing-Internet-Wrong_C04B/flag-translate_2.png&quot; width=&quot;298&quot; height=&quot;294&quot;&gt;&lt;/p&gt;
&lt;p&gt;but I know I&apos;m not the only one who realizes that a Flag is a lousy representation of a language, especially since your browser &lt;strong&gt;is announcing what languages you speak with every web request&lt;/strong&gt;.&lt;/p&gt;&lt;pre&gt;Accept:text/html&lt;br&gt;Accept-Encoding:gzip,deflate,sdch&lt;br&gt;Accept-Language:en-US,en;q=0.8&lt;/pre&gt;
&lt;p&gt;There can be a whole list of languages in the Accept-Language header, &lt;strong&gt;in the order the user prefers them!&amp;nbsp; &lt;/strong&gt;Use that data, it&apos;s there for you to use.&lt;/p&gt;
&lt;h3&gt;You know my Zip Code, why am I entering my State?&lt;/h3&gt;
&lt;p&gt;For folks living in the states, we&apos;re always asked to enter our postal code (ZIP code) &lt;strong&gt;and &lt;/strong&gt;our city and state, even &lt;a href=&quot;http://stackoverflow.com/questions/492951/how-can-i-get-state-and-city-information-from-a-us-zip-code-through-an-online-we&quot;&gt;though there are dozens of great APIs and Databases that can give you that information&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Don&apos;t make me enter my state&quot; style=&quot;display: inline&quot; alt=&quot;Don&apos;t make me enter my state&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Youre-Doing-Internet-Wrong_C04B/crappyaddress_3.png&quot; width=&quot;407&quot; height=&quot;256&quot;&gt;&lt;/p&gt;
&lt;p&gt;The meta-point is this: If you can reliably determine something from the user (language, location, country, preference) without invading their privacy, do it! Save them a little time!&lt;/p&gt;
&lt;h3&gt;Resizing Giant Images with width and height attributes&lt;/h3&gt;
&lt;p&gt;Perhaps take a moment and remind your boss that the 6 megapixel photo that he or she took with their new Canon EOS is &lt;strong&gt;not &lt;/strong&gt;a good background image for your corporate site...especially if it&apos;s a 4 megabyte JPGs.&lt;/p&gt;
&lt;p&gt;Oh, that&apos;s OK, we can just &amp;lt;img src=&quot;bigassfile.jpg&quot; width=&quot;100&quot; height=&quot;100&quot;&amp;gt; and that will make it smaller. No, that just downloads the giant file and then makes your browser to the work to resize it on the client.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Youre-Doing-Internet-Wrong_C04B/bigasswallpaper_2.jpg&quot;&gt;&lt;img title=&quot;Big ass picture&quot; style=&quot;display: inline&quot; alt=&quot;Big ass picture&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Youre-Doing-Internet-Wrong_C04B/bigasswallpaper_thumb.jpg&quot; width=&quot;100&quot; height=&quot;62&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Resize first, and squish often. Also run all your PNGs through &lt;a href=&quot;http://pnggauntlet.com/&quot;&gt;PNGGauntlet&lt;/a&gt; or &lt;a href=&quot;http://advsys.net/ken/utils.htm&quot;&gt;PNGOut&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Serving pages from both www. and naked domains&lt;/h3&gt;
&lt;p align=&quot;left&quot;&gt;If you&apos;ve got example.com/something AND www.example.com/something both serving up the same content, consider &quot;&lt;a href=&quot;http://www.hanselman.com/blog/UsingISAPIRewriteToCanonicalizeASPNETURLsAndRemoveDefaultaspx.aspx&quot;&gt;canonicalizing&lt;/a&gt;&quot; your URLs. You can do this with rel=&quot;canonical&quot; in your META tags, but that only hides the problems and makes the Googlebot happy. Instead, why not PICK ONE and serve a 301 redirect to the other? Did you know that there are rules built into IIS7 that will set this up for you? You can even &lt;a href=&quot;http://www.hanselman.com/blog/RedirectingASPNETLegacyURLsToExtensionlessWithTheIISRewriteModule.aspx&quot;&gt;remove your .aspx extension if that makes you happy&lt;/a&gt;. You can do it!&lt;/p&gt;
&lt;p align=&quot;left&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Youre-Doing-Internet-Wrong_C04B/image_12.png&quot; width=&quot;690&quot; height=&quot;460&quot;&gt;&lt;/p&gt;
&lt;p align=&quot;left&quot;&gt;The same is true if you do the same thing for / and /default.html. Pick one if you can, and redirect the other.&lt;/p&gt;&lt;pre class=&quot;brush: xml; toolbar: false; auto-links: false;&quot;&gt;&amp;lt;system.webServer&amp;gt;&lt;br&gt;    &amp;lt;rewrite&amp;gt;&lt;br&gt;      &amp;lt;rules&amp;gt;&lt;br&gt;        &amp;lt;rule name=&quot;CanonicalHostNameRule1&quot; stopProcessing=&quot;true&quot;&amp;gt;&lt;br&gt;          &amp;lt;match url=&quot;(.*)&quot; /&amp;gt;&lt;br&gt;          &amp;lt;conditions&amp;gt;&lt;br&gt;            &amp;lt;add input=&quot;{HTTP_HOST}&quot; matchType=&quot;Pattern&quot; pattern=&quot;^hanselman\.com$&quot; ignoreCase=&quot;true&quot; negate=&quot;false&quot; /&amp;gt;&lt;br&gt;          &amp;lt;/conditions&amp;gt;&lt;br&gt;          &amp;lt;action type=&quot;Redirect&quot; url=&quot;http://www.hanselman.com/{R:1}&quot; redirectType=&quot;Found&quot; /&amp;gt;&lt;br&gt;        &amp;lt;/rule&amp;gt;&lt;br&gt;          &amp;lt;match url=&quot;blog/default.aspx&quot; /&amp;gt;&lt;br&gt;          &amp;lt;action type=&quot;Redirect&quot; url=&quot;blog/&quot; redirectType=&quot;Found&quot; /&amp;gt;&lt;br&gt;        &amp;lt;/rule&amp;gt;&lt;br&gt;      &amp;lt;rules&amp;gt;&lt;br&gt;   &amp;lt;rewrite&amp;gt;&lt;br&gt;&amp;lt;system.webServer&amp;gt;    &lt;/pre&gt;
&lt;h3 align=&quot;left&quot;&gt;Others?&lt;/h3&gt;
&lt;p align=&quot;left&quot;&gt;What are some great examples that you think Break The Internet...but that are easily fixed if we have the will?&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Sponsor: &lt;/strong&gt;Big thanks to RedGate for sponsoring the feed this week! Check out &lt;a href=&quot;http://bit.ly/11pRJTa&quot;&gt;&lt;strong&gt;Deployment Manager&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;&#x2013; app deployment without the stress. &lt;a href=&quot;http://bit.ly/11pRJTa&quot;&gt;Deploy .NET code &amp;amp; SQL Server databases in one simple process&lt;/a&gt;from a web-based UI. Works with local, remote and cloud servers. &lt;a href=&quot;http://bit.ly/11pRJTa&quot;&gt;Try it &lt;strong&gt;free&lt;/strong&gt;&lt;/a&gt;.
&lt;br/&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. &lt;br/&gt;&lt;/div&gt;
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/42301519/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/42301519/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/42301519/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/42301519/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/42301519/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=7f3e361f-39d4-497c-af8b-e02691a4cf1b</comments>
      <category>Mobile</category>
      <category>Musings</category><content:encoded>&lt;div&gt;&lt;p&gt;Some days...some days it&apos;s frustrating to be on the web. We&apos;re &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.hanselman.com/blog/JavaScriptIsWebAssemblyLanguageAndThatsOK.aspx&quot;&gt;compiling C++ into JavaScript and running Unreal in the browser&lt;/a&gt; but at the same time, here in 2013, we&apos;re still making the same mistakes. And by we, I mean, the set of web developers who aren&apos;t &lt;strong&gt;us&lt;/strong&gt;, right Dear Reader? Because surely you&apos;re not doing any of these things. ;)&lt;/p&gt; &lt;p&gt;All of these are solvable problems. They aren&apos;t technically hard, or even technically interesting. I consider these &quot;will-required&quot; problems. You need the knowledge that it&apos;s wrong and the will to fix it. As users - and web developers - we need to complain to the right people and help fix it.&lt;/p&gt; &lt;h3&gt;Redirecting a deep desktop link to a mobile home page&lt;/h3&gt; &lt;p&gt;Google has decided that the practice of taking perfectly good deep links like foo.com/something/deep, detecting a mobile device, then redirecting to m.foo.com is user-hostile. In fact, the GoogleBot is going to declare these &quot;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~googlewebmastercentral.blogspot.com/2013/06/changes-in-rankings-of-smartphone_11.html&quot;&gt;faulty redirects&lt;/a&gt;&quot; and ding sites in the search result ranking. &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~googlewebmastercentral.blogspot.com/2013/06/changes-in-rankings-of-smartphone_11.html&quot;&gt;Stated simply&lt;/a&gt;:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Avoiding irrelevant redirects is very easy: Simply redirect smartphone users from a desktop page to its equivalent smartphone-optimized page. If the content doesn&apos;t exist in a smartphone-friendly format, showing the desktop content is better than redirecting to an irrelevant page.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;For example, if I want to go to the &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.mcmenamins.com/Pubs&quot;&gt;http://www.mcmenamins.com/Pubs&lt;/a&gt; page, but I do it on mobile, they ALWAYS redirect me to /mobile. Always. Even though I have a quad-processor pocket supercomputer with gigs of space I&apos;ve still surfing a second-class internet.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.mcmenamins.com/Pubs&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Youre-Doing-Internet-Wrong_C04B/image_5.png&quot; width=&quot;505&quot; height=&quot;350&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.mcmenamins.com/mobile&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Youre-Doing-Internet-Wrong_C04B/image_9.png&quot; width=&quot;178&quot; height=&quot;350&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;I don&apos;t want your crappy app&lt;/h3&gt; &lt;p&gt;That means you Quora. I am in my browser, unless I&apos;m going to the App Store, let&apos;s assume if I&apos;m in the browser, I want to be on the web.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.hanselman.com/blog/IdLikeToUseTheWebMyWayThankYouVeryMuchQuora.aspx&quot;&gt;&lt;img title=&quot;You suck Quora&quot; alt=&quot;You suck Quora&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/76ed84d64329_EFFF/image_3.png&quot;&gt;&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;Giant Interstitial Ads&lt;/h3&gt; &lt;p&gt;I&apos;m looking at you, Forbes.com. I GET IT. YOU HAVE ADS.&lt;/p&gt; &lt;p&gt;&lt;img title=&quot;Interstitial Ads are Evil&quot; style=&quot;display: inline&quot; alt=&quot;Interstitial Ads are Evil&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Youre-Doing-Internet-Wrong_C04B/image_18.png&quot; width=&quot;502&quot; height=&quot;405&quot;&gt;&lt;/p&gt; &lt;p&gt;Stay classy.&lt;/p&gt; &lt;h3&gt;Labels for Input Forms&lt;/h3&gt; &lt;p&gt;I hate seeing a checkbox and only being able to click on that exact checkbox.&lt;/p&gt;&lt;pre class=&quot;brush: xml; toolbar: false; auto-links: false;&quot;&gt;&amp;lt;p&amp;gt;Which fruit would you like for lunch?&amp;lt;/p&amp;gt;
&lt;br&gt;&amp;lt;form&amp;gt;
&lt;br&gt;  &amp;lt;input type=&quot;radio&quot; name=&quot;fruit&quot; id=&quot;banana&quot; /&amp;gt;
&lt;br&gt;  &amp;lt;label for=&quot;banana&quot;&amp;gt;Banana&amp;lt;/label&amp;gt;
&lt;br&gt;  &amp;lt;input type=&quot;radio&quot; name=&quot;fruit&quot; id=&quot;None&quot; /&amp;gt;
&lt;br&gt;  &amp;lt;label for=&quot;none&quot;&amp;gt;None&amp;lt;/label&amp;gt;
&lt;br&gt;&amp;lt;/form&amp;gt;&lt;/pre&gt;
&lt;p&gt;It&apos;s so easy to just associate a label with an input. Please do&amp;nbsp; it, then we can all have something larger to click on.&lt;/p&gt;
&lt;h3&gt;Breaking Hyperlinks&lt;/h3&gt;
&lt;p&gt;We&apos;re still doing this. Haven&apos;t we learned that &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.w3.org/Provider/Style/URI.html&quot;&gt;Cool URIs Don&apos;t Change&lt;/a&gt;? It was true in 1998 when that was written and it&apos;s true now. The web as we know it was created in 1990 and made truly open in 1993 and the link to the First Web Page (yes, Capital Letters) is still &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~info.cern.ch/hypertext/WWW/TheProject.html&quot;&gt;http://info.cern.ch/hypertext/WWW/TheProject.html&lt;/a&gt;. I love that they&apos;ve done the work to keep that link alive.&lt;/p&gt;
&lt;p&gt;There&apos;s just no excuse for this. With .htaccess files and web.config files, maintain a list of redirects and do your best to test them. Maintaining deep and complex links can be complex, but if you&apos;re companyname.com/about link dies because you switch from PHP to Rails, there&apos;s just no excuse for that. I&apos;m your User and I have always typed /about. Don&apos;t&apos; give me a To Do like &quot;Update your bookmarks!&quot; I didn&apos;t come here for a To-Do, I came her for your damn about page. &lt;strong&gt;YOU figure it out.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://github.com/okfinethisisnotagoodexamplebutitcouldhavebeenabadpage&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Youre-Doing-Internet-Wrong_C04B/image_15.png&quot; width=&quot;720&quot; height=&quot;255&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Click the Flag that represents your Language&lt;/h3&gt;
&lt;p&gt;I&apos;ve often been asked to &quot;select my language&quot; from a list of country flags, and ended up clicking on the Union Jack to represent &quot;English.&quot; I&apos;m sure the actual English don&apos;t appreciate an American declaring they speak English. ;) &lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Nothing says pick a language like all the United Nations Flags&quot; style=&quot;display: inline&quot; alt=&quot;Nothing says pick a language like all the United Nations Flags&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Youre-Doing-Internet-Wrong_C04B/flag-translate_2.png&quot; width=&quot;298&quot; height=&quot;294&quot;&gt;&lt;/p&gt;
&lt;p&gt;but I know I&apos;m not the only one who realizes that a Flag is a lousy representation of a language, especially since your browser &lt;strong&gt;is announcing what languages you speak with every web request&lt;/strong&gt;.&lt;/p&gt;&lt;pre&gt;Accept:text/html
&lt;br&gt;Accept-Encoding:gzip,deflate,sdch
&lt;br&gt;Accept-Language:en-US,en;q=0.8&lt;/pre&gt;
&lt;p&gt;There can be a whole list of languages in the Accept-Language header, &lt;strong&gt;in the order the user prefers them!&amp;nbsp; &lt;/strong&gt;Use that data, it&apos;s there for you to use.&lt;/p&gt;
&lt;h3&gt;You know my Zip Code, why am I entering my State?&lt;/h3&gt;
&lt;p&gt;For folks living in the states, we&apos;re always asked to enter our postal code (ZIP code) &lt;strong&gt;and &lt;/strong&gt;our city and state, even &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~stackoverflow.com/questions/492951/how-can-i-get-state-and-city-information-from-a-us-zip-code-through-an-online-we&quot;&gt;though there are dozens of great APIs and Databases that can give you that information&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Don&apos;t make me enter my state&quot; style=&quot;display: inline&quot; alt=&quot;Don&apos;t make me enter my state&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Youre-Doing-Internet-Wrong_C04B/crappyaddress_3.png&quot; width=&quot;407&quot; height=&quot;256&quot;&gt;&lt;/p&gt;
&lt;p&gt;The meta-point is this: If you can reliably determine something from the user (language, location, country, preference) without invading their privacy, do it! Save them a little time!&lt;/p&gt;
&lt;h3&gt;Resizing Giant Images with width and height attributes&lt;/h3&gt;
&lt;p&gt;Perhaps take a moment and remind your boss that the 6 megapixel photo that he or she took with their new Canon EOS is &lt;strong&gt;not &lt;/strong&gt;a good background image for your corporate site...especially if it&apos;s a 4 megabyte JPGs.&lt;/p&gt;
&lt;p&gt;Oh, that&apos;s OK, we can just &amp;lt;img src=&quot;bigassfile.jpg&quot; width=&quot;100&quot; height=&quot;100&quot;&amp;gt; and that will make it smaller. No, that just downloads the giant file and then makes your browser to the work to resize it on the client.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.hanselman.com/blog/content/binary/Windows-Live-Writer/Youre-Doing-Internet-Wrong_C04B/bigasswallpaper_2.jpg&quot;&gt;&lt;img title=&quot;Big ass picture&quot; style=&quot;display: inline&quot; alt=&quot;Big ass picture&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Youre-Doing-Internet-Wrong_C04B/bigasswallpaper_thumb.jpg&quot; width=&quot;100&quot; height=&quot;62&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Resize first, and squish often. Also run all your PNGs through &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~pnggauntlet.com/&quot;&gt;PNGGauntlet&lt;/a&gt; or &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~advsys.net/ken/utils.htm&quot;&gt;PNGOut&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Serving pages from both www. and naked domains&lt;/h3&gt;
&lt;p align=&quot;left&quot;&gt;If you&apos;ve got example.com/something AND www.example.com/something both serving up the same content, consider &quot;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.hanselman.com/blog/UsingISAPIRewriteToCanonicalizeASPNETURLsAndRemoveDefaultaspx.aspx&quot;&gt;canonicalizing&lt;/a&gt;&quot; your URLs. You can do this with rel=&quot;canonical&quot; in your META tags, but that only hides the problems and makes the Googlebot happy. Instead, why not PICK ONE and serve a 301 redirect to the other? Did you know that there are rules built into IIS7 that will set this up for you? You can even &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.hanselman.com/blog/RedirectingASPNETLegacyURLsToExtensionlessWithTheIISRewriteModule.aspx&quot;&gt;remove your .aspx extension if that makes you happy&lt;/a&gt;. You can do it!&lt;/p&gt;
&lt;p align=&quot;left&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline&quot; alt=&quot;image&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Youre-Doing-Internet-Wrong_C04B/image_12.png&quot; width=&quot;690&quot; height=&quot;460&quot;&gt;&lt;/p&gt;
&lt;p align=&quot;left&quot;&gt;The same is true if you do the same thing for / and /default.html. Pick one if you can, and redirect the other.&lt;/p&gt;&lt;pre class=&quot;brush: xml; toolbar: false; auto-links: false;&quot;&gt;&amp;lt;system.webServer&amp;gt;
&lt;br&gt;    &amp;lt;rewrite&amp;gt;
&lt;br&gt;      &amp;lt;rules&amp;gt;
&lt;br&gt;        &amp;lt;rule name=&quot;CanonicalHostNameRule1&quot; stopProcessing=&quot;true&quot;&amp;gt;
&lt;br&gt;          &amp;lt;match url=&quot;(.*)&quot; /&amp;gt;
&lt;br&gt;          &amp;lt;conditions&amp;gt;
&lt;br&gt;            &amp;lt;add input=&quot;{HTTP_HOST}&quot; matchType=&quot;Pattern&quot; pattern=&quot;^hanselman\.com$&quot; ignoreCase=&quot;true&quot; negate=&quot;false&quot; /&amp;gt;
&lt;br&gt;          &amp;lt;/conditions&amp;gt;
&lt;br&gt;          &amp;lt;action type=&quot;Redirect&quot; url=&quot;http://www.hanselman.com/{R:1}&quot; redirectType=&quot;Found&quot; /&amp;gt;
&lt;br&gt;        &amp;lt;/rule&amp;gt;
&lt;br&gt;          &amp;lt;match url=&quot;blog/default.aspx&quot; /&amp;gt;
&lt;br&gt;          &amp;lt;action type=&quot;Redirect&quot; url=&quot;blog/&quot; redirectType=&quot;Found&quot; /&amp;gt;
&lt;br&gt;        &amp;lt;/rule&amp;gt;
&lt;br&gt;      &amp;lt;rules&amp;gt;
&lt;br&gt;   &amp;lt;rewrite&amp;gt;
&lt;br&gt;&amp;lt;system.webServer&amp;gt;    &lt;/pre&gt;
&lt;h3 align=&quot;left&quot;&gt;Others?&lt;/h3&gt;
&lt;p align=&quot;left&quot;&gt;What are some great examples that you think Break The Internet...but that are easily fixed if we have the will?&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Sponsor: &lt;/strong&gt;Big thanks to RedGate for sponsoring the feed this week! Check out &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~bit.ly/11pRJTa&quot;&gt;&lt;strong&gt;Deployment Manager&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;&#x2013; app deployment without the stress. &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~bit.ly/11pRJTa&quot;&gt;Deploy .NET code &amp;amp; SQL Server databases in one simple process&lt;/a&gt;from a web-based UI. Works with local, remote and cloud servers. &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~bit.ly/11pRJTa&quot;&gt;Try it &lt;strong&gt;free&lt;/strong&gt;&lt;/a&gt;.

&lt;br/&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. 
&lt;br/&gt;&lt;/div&gt;&lt;Img align=&quot;left&quot; border=&quot;0&quot; height=&quot;1&quot; width=&quot;1&quot; style=&quot;border:0;float:left;margin:0;padding:0&quot; hspace=&quot;0&quot; src=&quot;http://feeds.hanselman.com/~/i/42301519/0/scotthanselman&quot;&gt;

&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/42301519/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/42301519/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/42301519/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/42301519/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/42301519/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded></item>
<item>
<feedburner:origLink>http://www.hanselman.com/blog/TheImportanceOfClosedCaptioningHowToAndWhySubtitle.aspx</feedburner:origLink>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=febbb404-a249-41d6-9c89-8a501b948ba0</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=febbb404-a249-41d6-9c89-8a501b948ba0</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=febbb404-a249-41d6-9c89-8a501b948ba0</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=febbb404-a249-41d6-9c89-8a501b948ba0</wfw:commentRss>
      <slash:comments>15</slash:comments>
      <title>The Importance of Closed Captioning - How To and Why Subtitle</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=febbb404-a249-41d6-9c89-8a501b948ba0</guid>
      <link>http://feeds.hanselman.com/~/42223713/0/scotthanselman~The-Importance-of-Closed-Captioning-How-To-and-Why-Subtitle.aspx</link>
      <pubDate>Wed, 12 Jun 2013 01:11:54 GMT</pubDate>
      <description>&lt;div&gt;&lt;figure&gt;&lt;img title=&quot;Photo used by Creative Commons from http://www.flickr.com/photos/34547181@N00/6023268510/&quot; style=&quot;display: inline&quot; alt=&quot;Photo used by Creative Commons from http://www.flickr.com/photos/34547181@N00/6023268510/&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/The-Importance-of-Closed-Captioning---Ho_ECB5/6023268510_df0042f314_b_3.jpg&quot; width=&quot;900&quot; height=&quot;318&quot;&gt;&lt;/figure&gt;  &lt;p&gt;If you can hear well, you may have never thought about Closed Captioning or Subtitles. Perhaps you&apos;ve used it once or twice to catch a missed word in a movie, or perhaps you&apos;ve only read subtitles in foreign movies. But if you&apos;re one of the nearly 10M hard of hearing folks in the US or one of as many (estimates vary widely) 70M profoundly deaf people in the world, it&apos;s not the subtitles you&apos;re concerned with...it&apos;s the lack of subtitles. &lt;/p&gt; &lt;p&gt;Automatic transcriptions are a start, but they are about as useful as automatic translation services. If you speak more than one language you&apos;ll agree that computer translation just isn&apos;t quite here yet. It&apos;s awesome that YouTube can attempt to auto-transcript English and it&apos;s an amazing piece of tech, but the results are sometimes ridiculous for any video content that isn&apos;t a news reader. &lt;strong&gt;Ultimately, today, automatic transcriptions are NOT a good answer.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;img title=&quot;animus fountains undertaking for a minute to first applebee&apos;s month second - These are BAD captions.&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: right; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;animus fountains undertaking for a minute to first applebee&apos;s month second - These are BAD captions.&quot; align=&quot;right&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/The-Importance-of-Closed-Captioning---Ho_ECB5/image_3.png&quot; width=&quot;389&quot; height=&quot;314&quot;&gt;Here&apos;s an example of some automatic captions from my 3 minute Windows 8 video:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://www.hanselminutes.com/archives&quot;&gt;Hanselminutes&lt;/a&gt;, my &quot;fresh air for developers&quot; podcast has long had transcripts available. Our transcription has been championed by Carl Franklin, my producer, and it IS appreciated. When a show is missed or we lag behind, people notice. You can head to our archives page, and the search supports a live-filter with an * as I&apos;ve marked all transcript shows with an asterisk.&lt;/p&gt; &lt;p&gt;Transcripts aren&apos;t just for the hard of hearing, they are also great for folks who are learning English or people who would rather learn by reading than by listening. Not everyone has an hour to listen to a show, but they can check out the transcripts and decide if they want to bother. It also helps for SEO by allowing keywords in your podcast or video to be picked up by Google, Bing and other search engines. Often people at work want to watch a YouTube video without the volume on.&lt;/p&gt; &lt;h3&gt;Hiring a Transcription Service&lt;/h3&gt; &lt;p&gt;Transcribing isn&apos;t as easy as you&apos;d think. People talk WAY faster than the average typist. Feel feel to try transcribing the news or a podcast yourself. You&apos;ll quickly find that it&apos;s hard damn work. The service that I use the most,with success, has been &lt;a href=&quot;http://www.rev.com/&quot;&gt;Rev.com&lt;/a&gt;. They used to be called FoxTranscribe and changed their name.&lt;/p&gt; &lt;p&gt;Ordering is easy, you can upload files or just paste in URLs. I recently had them transcribe my Productivity Talk by just giving them the Vimeo link.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Recently &lt;/strong&gt;&lt;a href=&quot;http://www.rev.com&quot;&gt;&lt;strong&gt;Rev&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; transcribed both of my &lt;/strong&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=5BSmmSU-UZU&quot;&gt;&lt;strong&gt;Windows 8 videos&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;!&lt;/strong&gt; Having good closed captioning is super important with YouTube videos, and people who are looking for subtitles are REALLY happy when they find good ones.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;You can turn on Closed Captioning for YouTube videos as a permanent setting as well.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Go to your &lt;a href=&quot;http://www.youtube.com/account&quot;&gt;Account Settings&lt;/a&gt; page  &lt;li&gt;Select &lt;strong&gt;Playback&lt;/strong&gt; from the left-hand menu  &lt;li&gt;Check or uncheck&lt;strong&gt; Always show captions&lt;/strong&gt;&lt;br&gt;(Check &lt;strong&gt;Show automatic captions by speech recognition (when available)&lt;/strong&gt; to enable automatic captions for videos that don&apos;t already have captions provided) &lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt; &lt;p&gt;YouTube lets you add captions in a few ways. &lt;/p&gt; &lt;h4&gt;Upload a Caption File and Auto-Sync &lt;/h4&gt; &lt;p&gt;This is the easiest thing to do because it doesn&apos;t include time stamps. YouTube knows what video you&apos;re trying to caption so it can make educated guesses as to what words line up where. Time moves forward, so the guesses are usually VERY good if your transcript is a good one. That&apos;s what &lt;a href=&quot;http://www.rev.com&quot;&gt;Rev.com&lt;/a&gt; provided me.&lt;/p&gt; &lt;p&gt;Here&apos;s the first section of what Rev.com gave me for the 25 minute Windows 8 Video:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Scott&amp;gt;&amp;gt; Hi. I&apos;m Scott Hanselman. This is the Missing Windows 8 Instructional Video. I&apos;ve got another video where I show you basically everything I&apos;m going to show you in this video, except I do it in only four minutes. That might be great for techies or people who are kind of advanced. But for the rest of us, it&apos;s pretty intense and it looks a little frantic. I thought it would take some time to go through a number of things within Windows 8, like &#8220;What changed?&#8221;, &#8220;Who moved my cheese?&#8221;&lt;br&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;See the double &amp;gt;&amp;gt; mark? That&apos;s where you indicate who is talking. And that&apos;s it! It&apos;s worked great and I&apos;m thrilled with the result.&lt;/p&gt; &lt;div class=&quot;embed-container&quot;&gt;&lt;iframe height=&quot;480&quot; src=&quot;http://www.youtube.com/embed/5BSmmSU-UZU&quot; frameborder=&quot;0&quot; width=&quot;853&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt; &lt;h4&gt;Upload a Caption File with Timestamps&lt;/h4&gt; &lt;p&gt;If your video has fast cuts, lots of speakers or needs more precision, you&apos;ll want to make a a formal caption file in &lt;a href=&quot;http://support.google.com/youtube/bin/answer.py?hl=en&amp;amp;answer=2734698&amp;amp;rd=1&quot;&gt;one of a variety of formats&lt;/a&gt;. A .srt file is what I see the most, but there&apos;s a number of options.&lt;/p&gt; &lt;p&gt;Here&apos;s a .srt example from Google:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;1&lt;br&gt;00:00:00,599 --&amp;gt; 00:00:04,160&lt;br&gt;&amp;gt;&amp;gt; ALICE: Hi, my name is Alice Miller and this is John Brown&lt;br&gt;2&lt;br&gt;00:00:04,160 --&amp;gt; 00:00:06,770&lt;br&gt;&amp;gt;&amp;gt; JOHN: and we&apos;re the owners of Miller Bakery.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;These files should be &lt;a href=&quot;http://support.google.com/youtube/bin/answer.py?hl=en&amp;amp;answer=2734698&amp;amp;rd=1&quot;&gt;created by a captioning software package&lt;/a&gt;, in my opinion.&lt;/p&gt; &lt;p&gt;Regardless of how you create it, once the file is uploaded to YouTube, it works just as it should and can be turned on and off by the user.&lt;/p&gt; &lt;h3&gt;Crowd Sourcing Transcripts&lt;/h3&gt; &lt;p&gt;You may also be able to Crowd Source your transcripts. That&apos;s what I&apos;m trying with &lt;a href=&quot;http://www.thisdeveloperslife.com&quot;&gt;This Developer&apos;s Life&lt;/a&gt;, the other podcast that I do with Rob Conery. &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Yes, we are working on the next episode. I promise. The theme is &quot;Space&quot; by the way. Coming soon. &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Since we have a primarily technical developer audience, &lt;a href=&quot;https://github.com/shanselman/ThisDevelopersLife-Transcripts&quot;&gt;I chose to use GitHub to manage things&lt;/a&gt;. It&apos;s very open, collaborative and clean...for a programmer. We&apos;re using Mark Down files and I hope to generate HTML and link to them directly from the &lt;a href=&quot;http://www.thisdeveloperslife.com&quot;&gt;This Developer&apos;s Life&lt;/a&gt; site. You&apos;re more than welcome to get involved and help out. There are still transcripts that need help! Check out &lt;a href=&quot;https://github.com/shanselman/ThisDevelopersLife-Transcripts&quot;&gt;https://github.com/shanselman/ThisDevelopersLife-Transcripts&lt;/a&gt;&lt;/p&gt; &lt;p&gt;We&apos;ve just received the complete transcript from the TDL episode where &lt;a href=&quot;http://thisdeveloperslife.com/post/3-0-1-cancer&quot;&gt;my wife and I talk about our Cancer Year&lt;/a&gt;. That &lt;a href=&quot;https://github.com/shanselman/ThisDevelopersLife-Transcripts/blob/master/TDL3.0.1-Cancer.md&quot;&gt;one is currently here&lt;/a&gt; and the actual episode is still on the TDL site.&lt;/p&gt; &lt;p&gt;We used a more casual layout, but I think the result will be easy to read. &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Scott: What happened yesterday, dear?  &lt;p&gt;Mo: Yesterday, I was told that I have cervical cancer.  &lt;p&gt;S: That sucks.  &lt;p&gt;M: Yeah. That REALLY sucks. [Silence] Yeah. It does. It does. Yeah.  &lt;p&gt;S: We spent most of yesterday surprisingly not crying and wailing or gnashing our teeth... but rather with quite a bit of black humor. Wouldn&apos;t you say?  &lt;p&gt;M: [Laughing] Yeah, I would. I would say that. But I think what is still true is that it&#x2019;s a pretty heavy thing to hear. What was particularly frustrating in our case was how we found out about it. It was just not the way that one should ever find out that you have cancer. I don&#x2019;t care what kind that it is.  &lt;p&gt;S: It was definitely, as I like to say, sub-optimal.  &lt;p&gt;M: Sub-optimal is a very delicate way of putting it. Yes, it was sub-optimal.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;I REALLY appreciate all the love that the community has given Rob and I on This Developer&apos;s Life. It&apos;s a labor of love, it takes hours and hours to make an episode and I hope you know that we are still having fun making it. We thank YOU for helping with the captions! As they get closer to being done, I&apos;ll update the site and make them easier to find.&lt;/p&gt; &lt;h4&gt;Collaborative Subtitling Systems &lt;/h4&gt; &lt;p&gt;There is a great online community and series of tools called &lt;a href=&quot;http://www.amara.org&quot;&gt;Amara&lt;/a&gt; that is explicitly for enabling captions for media. You can order transcription services outright, but you can also crowdsource your captions directly from the tool. If you&apos;re using YouTube you can give them access to your account via OAuth and they&apos;ll update your video&apos;s captions automatically. You can &lt;a href=&quot;http://about.amara.org/volunteer/&quot;&gt;volunteer and transcript videos yourself&lt;/a&gt; and be a part of the crowd and make someone&apos;s video more accessible!&lt;/p&gt; &lt;p&gt;There are also some startups in the space like &lt;a href=&quot;http://www.enhancecast.com/&quot;&gt;EnhanceCast&lt;/a&gt; and &lt;a href=&quot;http://www.3playmedia.com/&quot;&gt;3PlayMedia&lt;/a&gt; that you should also take a look at. &lt;/p&gt; &lt;p&gt;Regardless of what you choose, I really encourage you to consider captioning your content. We&apos;re working on doing this for ASP.NET videos now as well. &lt;/p&gt; &lt;p&gt;If you appreciate closed captioning and subtitles, please sound off in the comments!&lt;/p&gt; &lt;hr&gt;  &lt;p&gt;&lt;strong&gt;Sponsor: &lt;/strong&gt;Big thanks to RedGate for sponsoring the feed this week! Check out &lt;a href=&quot;http://bit.ly/11pRJTa&quot;&gt;&lt;strong&gt;Deployment Manager&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;&#x2013; app deployment without the stress. &lt;a href=&quot;http://bit.ly/11pRJTa&quot;&gt;Deploy .NET code &amp;amp; SQL Server databases in one simple process&lt;/a&gt;from a web-based UI. Works with local, remote and cloud servers. &lt;a href=&quot;http://bit.ly/11pRJTa&quot;&gt;Try it &lt;strong&gt;free&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. &lt;br/&gt;&lt;/div&gt;
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/42223713/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/42223713/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/42223713/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/42223713/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/42223713/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=febbb404-a249-41d6-9c89-8a501b948ba0</comments>
      <category>Musings</category>
      <category>Tools</category><content:encoded>&lt;div&gt;&lt;figure&gt;&lt;img title=&quot;Photo used by Creative Commons from http://www.flickr.com/photos/34547181@N00/6023268510/&quot; style=&quot;display: inline&quot; alt=&quot;Photo used by Creative Commons from http://www.flickr.com/photos/34547181@N00/6023268510/&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/The-Importance-of-Closed-Captioning---Ho_ECB5/6023268510_df0042f314_b_3.jpg&quot; width=&quot;900&quot; height=&quot;318&quot;&gt;&lt;/figure&gt;  &lt;p&gt;If you can hear well, you may have never thought about Closed Captioning or Subtitles. Perhaps you&apos;ve used it once or twice to catch a missed word in a movie, or perhaps you&apos;ve only read subtitles in foreign movies. But if you&apos;re one of the nearly 10M hard of hearing folks in the US or one of as many (estimates vary widely) 70M profoundly deaf people in the world, it&apos;s not the subtitles you&apos;re concerned with...it&apos;s the lack of subtitles. &lt;/p&gt; &lt;p&gt;Automatic transcriptions are a start, but they are about as useful as automatic translation services. If you speak more than one language you&apos;ll agree that computer translation just isn&apos;t quite here yet. It&apos;s awesome that YouTube can attempt to auto-transcript English and it&apos;s an amazing piece of tech, but the results are sometimes ridiculous for any video content that isn&apos;t a news reader. &lt;strong&gt;Ultimately, today, automatic transcriptions are NOT a good answer.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;img title=&quot;animus fountains undertaking for a minute to first applebee&apos;s month second - These are BAD captions.&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: right; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;animus fountains undertaking for a minute to first applebee&apos;s month second - These are BAD captions.&quot; align=&quot;right&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/The-Importance-of-Closed-Captioning---Ho_ECB5/image_3.png&quot; width=&quot;389&quot; height=&quot;314&quot;&gt;Here&apos;s an example of some automatic captions from my 3 minute Windows 8 video:&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.hanselminutes.com/archives&quot;&gt;Hanselminutes&lt;/a&gt;, my &quot;fresh air for developers&quot; podcast has long had transcripts available. Our transcription has been championed by Carl Franklin, my producer, and it IS appreciated. When a show is missed or we lag behind, people notice. You can head to our archives page, and the search supports a live-filter with an * as I&apos;ve marked all transcript shows with an asterisk.&lt;/p&gt; &lt;p&gt;Transcripts aren&apos;t just for the hard of hearing, they are also great for folks who are learning English or people who would rather learn by reading than by listening. Not everyone has an hour to listen to a show, but they can check out the transcripts and decide if they want to bother. It also helps for SEO by allowing keywords in your podcast or video to be picked up by Google, Bing and other search engines. Often people at work want to watch a YouTube video without the volume on.&lt;/p&gt; &lt;h3&gt;Hiring a Transcription Service&lt;/h3&gt; &lt;p&gt;Transcribing isn&apos;t as easy as you&apos;d think. People talk WAY faster than the average typist. Feel feel to try transcribing the news or a podcast yourself. You&apos;ll quickly find that it&apos;s hard damn work. The service that I use the most,with success, has been &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.rev.com/&quot;&gt;Rev.com&lt;/a&gt;. They used to be called FoxTranscribe and changed their name.&lt;/p&gt; &lt;p&gt;Ordering is easy, you can upload files or just paste in URLs. I recently had them transcribe my Productivity Talk by just giving them the Vimeo link.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Recently &lt;/strong&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.rev.com&quot;&gt;&lt;strong&gt;Rev&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; transcribed both of my &lt;/strong&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.youtube.com/watch?v=5BSmmSU-UZU&quot;&gt;&lt;strong&gt;Windows 8 videos&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;!&lt;/strong&gt; Having good closed captioning is super important with YouTube videos, and people who are looking for subtitles are REALLY happy when they find good ones.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;You can turn on Closed Captioning for YouTube videos as a permanent setting as well.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Go to your &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.youtube.com/account&quot;&gt;Account Settings&lt;/a&gt; page  &lt;li&gt;Select &lt;strong&gt;Playback&lt;/strong&gt; from the left-hand menu  &lt;li&gt;Check or uncheck&lt;strong&gt; Always show captions&lt;/strong&gt;
&lt;br&gt;(Check &lt;strong&gt;Show automatic captions by speech recognition (when available)&lt;/strong&gt; to enable automatic captions for videos that don&apos;t already have captions provided) &lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt; &lt;p&gt;YouTube lets you add captions in a few ways. &lt;/p&gt; &lt;h4&gt;Upload a Caption File and Auto-Sync &lt;/h4&gt; &lt;p&gt;This is the easiest thing to do because it doesn&apos;t include time stamps. YouTube knows what video you&apos;re trying to caption so it can make educated guesses as to what words line up where. Time moves forward, so the guesses are usually VERY good if your transcript is a good one. That&apos;s what &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.rev.com&quot;&gt;Rev.com&lt;/a&gt; provided me.&lt;/p&gt; &lt;p&gt;Here&apos;s the first section of what Rev.com gave me for the 25 minute Windows 8 Video:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Scott&amp;gt;&amp;gt; Hi. I&apos;m Scott Hanselman. This is the Missing Windows 8 Instructional Video. I&apos;ve got another video where I show you basically everything I&apos;m going to show you in this video, except I do it in only four minutes. That might be great for techies or people who are kind of advanced. But for the rest of us, it&apos;s pretty intense and it looks a little frantic. I thought it would take some time to go through a number of things within Windows 8, like &#8220;What changed?&#8221;, &#8220;Who moved my cheese?&#8221;
&lt;br&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;See the double &amp;gt;&amp;gt; mark? That&apos;s where you indicate who is talking. And that&apos;s it! It&apos;s worked great and I&apos;m thrilled with the result.&lt;/p&gt; &lt;div class=&quot;embed-container&quot;&gt;&lt;iframe height=&quot;480&quot; src=&quot;http://www.youtube.com/embed/5BSmmSU-UZU&quot; frameborder=&quot;0&quot; width=&quot;853&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt; &lt;h4&gt;Upload a Caption File with Timestamps&lt;/h4&gt; &lt;p&gt;If your video has fast cuts, lots of speakers or needs more precision, you&apos;ll want to make a a formal caption file in &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~support.google.com/youtube/bin/answer.py?hl=en&amp;amp;answer=2734698&amp;amp;rd=1&quot;&gt;one of a variety of formats&lt;/a&gt;. A .srt file is what I see the most, but there&apos;s a number of options.&lt;/p&gt; &lt;p&gt;Here&apos;s a .srt example from Google:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;1
&lt;br&gt;00:00:00,599 --&amp;gt; 00:00:04,160
&lt;br&gt;&amp;gt;&amp;gt; ALICE: Hi, my name is Alice Miller and this is John Brown
&lt;br&gt;2
&lt;br&gt;00:00:04,160 --&amp;gt; 00:00:06,770
&lt;br&gt;&amp;gt;&amp;gt; JOHN: and we&apos;re the owners of Miller Bakery.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;These files should be &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~support.google.com/youtube/bin/answer.py?hl=en&amp;amp;answer=2734698&amp;amp;rd=1&quot;&gt;created by a captioning software package&lt;/a&gt;, in my opinion.&lt;/p&gt; &lt;p&gt;Regardless of how you create it, once the file is uploaded to YouTube, it works just as it should and can be turned on and off by the user.&lt;/p&gt; &lt;h3&gt;Crowd Sourcing Transcripts&lt;/h3&gt; &lt;p&gt;You may also be able to Crowd Source your transcripts. That&apos;s what I&apos;m trying with &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.thisdeveloperslife.com&quot;&gt;This Developer&apos;s Life&lt;/a&gt;, the other podcast that I do with Rob Conery. &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Yes, we are working on the next episode. I promise. The theme is &quot;Space&quot; by the way. Coming soon. &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Since we have a primarily technical developer audience, &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://github.com/shanselman/ThisDevelopersLife-Transcripts&quot;&gt;I chose to use GitHub to manage things&lt;/a&gt;. It&apos;s very open, collaborative and clean...for a programmer. We&apos;re using Mark Down files and I hope to generate HTML and link to them directly from the &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.thisdeveloperslife.com&quot;&gt;This Developer&apos;s Life&lt;/a&gt; site. You&apos;re more than welcome to get involved and help out. There are still transcripts that need help! Check out &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://github.com/shanselman/ThisDevelopersLife-Transcripts&quot;&gt;https://github.com/shanselman/ThisDevelopersLife-Transcripts&lt;/a&gt;&lt;/p&gt; &lt;p&gt;We&apos;ve just received the complete transcript from the TDL episode where &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~thisdeveloperslife.com/post/3-0-1-cancer&quot;&gt;my wife and I talk about our Cancer Year&lt;/a&gt;. That &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://github.com/shanselman/ThisDevelopersLife-Transcripts/blob/master/TDL3.0.1-Cancer.md&quot;&gt;one is currently here&lt;/a&gt; and the actual episode is still on the TDL site.&lt;/p&gt; &lt;p&gt;We used a more casual layout, but I think the result will be easy to read. &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Scott: What happened yesterday, dear?  &lt;p&gt;Mo: Yesterday, I was told that I have cervical cancer.  &lt;p&gt;S: That sucks.  &lt;p&gt;M: Yeah. That REALLY sucks. [Silence] Yeah. It does. It does. Yeah.  &lt;p&gt;S: We spent most of yesterday surprisingly not crying and wailing or gnashing our teeth... but rather with quite a bit of black humor. Wouldn&apos;t you say?  &lt;p&gt;M: [Laughing] Yeah, I would. I would say that. But I think what is still true is that it&#x2019;s a pretty heavy thing to hear. What was particularly frustrating in our case was how we found out about it. It was just not the way that one should ever find out that you have cancer. I don&#x2019;t care what kind that it is.  &lt;p&gt;S: It was definitely, as I like to say, sub-optimal.  &lt;p&gt;M: Sub-optimal is a very delicate way of putting it. Yes, it was sub-optimal.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;I REALLY appreciate all the love that the community has given Rob and I on This Developer&apos;s Life. It&apos;s a labor of love, it takes hours and hours to make an episode and I hope you know that we are still having fun making it. We thank YOU for helping with the captions! As they get closer to being done, I&apos;ll update the site and make them easier to find.&lt;/p&gt; &lt;h4&gt;Collaborative Subtitling Systems &lt;/h4&gt; &lt;p&gt;There is a great online community and series of tools called &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.amara.org&quot;&gt;Amara&lt;/a&gt; that is explicitly for enabling captions for media. You can order transcription services outright, but you can also crowdsource your captions directly from the tool. If you&apos;re using YouTube you can give them access to your account via OAuth and they&apos;ll update your video&apos;s captions automatically. You can &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~about.amara.org/volunteer/&quot;&gt;volunteer and transcript videos yourself&lt;/a&gt; and be a part of the crowd and make someone&apos;s video more accessible!&lt;/p&gt; &lt;p&gt;There are also some startups in the space like &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.enhancecast.com/&quot;&gt;EnhanceCast&lt;/a&gt; and &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.3playmedia.com/&quot;&gt;3PlayMedia&lt;/a&gt; that you should also take a look at. &lt;/p&gt; &lt;p&gt;Regardless of what you choose, I really encourage you to consider captioning your content. We&apos;re working on doing this for ASP.NET videos now as well. &lt;/p&gt; &lt;p&gt;If you appreciate closed captioning and subtitles, please sound off in the comments!&lt;/p&gt; &lt;hr&gt;  &lt;p&gt;&lt;strong&gt;Sponsor: &lt;/strong&gt;Big thanks to RedGate for sponsoring the feed this week! Check out &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~bit.ly/11pRJTa&quot;&gt;&lt;strong&gt;Deployment Manager&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;&#x2013; app deployment without the stress. &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~bit.ly/11pRJTa&quot;&gt;Deploy .NET code &amp;amp; SQL Server databases in one simple process&lt;/a&gt;from a web-based UI. Works with local, remote and cloud servers. &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~bit.ly/11pRJTa&quot;&gt;Try it &lt;strong&gt;free&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;br/&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. 
&lt;br/&gt;&lt;/div&gt;&lt;Img align=&quot;left&quot; border=&quot;0&quot; height=&quot;1&quot; width=&quot;1&quot; style=&quot;border:0;float:left;margin:0;padding:0&quot; hspace=&quot;0&quot; src=&quot;http://feeds.hanselman.com/~/i/42223713/0/scotthanselman&quot;&gt;

&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/42223713/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/42223713/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/42223713/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/42223713/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/42223713/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded></item>
<item>
<feedburner:origLink>http://www.hanselman.com/blog/CSIVisualStudioUnableToTranslateUnicodeCharacterAtIndexXToSpecifiedCodePage.aspx</feedburner:origLink>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=8f551574-6374-40dd-bda7-7a32117e20d8</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=8f551574-6374-40dd-bda7-7a32117e20d8</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=8f551574-6374-40dd-bda7-7a32117e20d8</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=8f551574-6374-40dd-bda7-7a32117e20d8</wfw:commentRss>
      <slash:comments>17</slash:comments>
      <title>CSI: Visual Studio - Unable to translate Unicode character at index X to specified code page</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=8f551574-6374-40dd-bda7-7a32117e20d8</guid>
      <link>http://feeds.hanselman.com/~/42076896/0/scotthanselman~CSI-Visual-Studio-Unable-to-translate-Unicode-character-at-index-X-to-specified-code-page.aspx</link>
      <pubDate>Sat, 08 Jun 2013 00:30:07 GMT</pubDate>
      <description>&lt;div&gt;&lt;figure&gt;&lt;img title=&quot;A crazy internal error from Visual Studio&quot; style=&quot;display: inline&quot; alt=&quot;A crazy internal error from Visual Studio&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/CSI-Visual-Studio---Unable-to-translate-_EEDC/chaos_3.jpg&quot; width=&quot;996&quot; height=&quot;642&quot; /&gt;&lt;/figure&gt;   &lt;p&gt;A customer emailed me a weird one. I tend to have a sense for when something is up and when an obscure thing will turn into something interesting. &lt;/p&gt;  &lt;p&gt;The person says:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;...mysteriously most of my projects refuse to build.&amp;#160; &amp;quot;The build stopped unexpectedly because of an internal failure... something about unicode... blah blah&amp;quot;&lt;/em&gt; &lt;/p&gt;    &lt;p&gt;&lt;em&gt;There are a few messages out there on the web about it -- even a really old hot fix.&amp;#160; What&apos;s the best way to proceed with the VS team / MS?&amp;#160; Is there anyone actively interested in glitches like this?&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;My spidey-sense is tingling. First, when something says &amp;quot;internal failure&amp;quot; it means some fundamental expectation wasn&apos;t met. Garbage in perhaps? He says &amp;quot;most of my projects&amp;quot; which implies it&apos;s not a specific project. There&apos;s also the sense that this is a &amp;quot;suddenly things stopped working&amp;quot; type thing. Presumably it worked before.&lt;/p&gt;  &lt;p&gt;I say:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;Have you checked all the source files to make sure one isn&apos;t filled with Unicode nulls or something?&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;And says no, but sends a call-stack (which is always nice when it&apos;s sent FIRST, but still):&lt;/p&gt;  &lt;pre&gt;Error    1    The build stopped unexpectedly because of an internal failure.&lt;br /&gt;System.Text.EncoderFallbackException: Unable to translate Unicode character \uD97C at index 1321 to specified code page.&lt;br /&gt;   at System.Text.EncoderExceptionFallbackBuffer.Fallback(Char charUnknown, Int32 index)&lt;br /&gt;   at System.Text.EncoderFallbackBuffer.InternalFallback(Char ch, Char*&amp;amp; chars)&lt;br /&gt;   at System.Text.UTF8Encoding.GetByteCount(Char* chars, Int32 count, EncoderNLS baseEncoder)&lt;br /&gt;   at System.Text.UTF8Encoding.GetByteCount(String chars)&lt;br /&gt;   at System.IO.BinaryWriter.Write(String value)&lt;br /&gt;   at Microsoft.Build.BackEnd.NodePacketTranslator.NodePacketWriteTranslator.TranslateDictionary(Dictionary`2&amp;amp; dictionary, IEqualityComparer`1 comparer)&lt;br /&gt;   at Microsoft.Build.Execution.BuildParameters.Microsoft.Build.BackEnd.INodePacketTranslatable.Translate(INodePacketTranslator translator)&lt;br /&gt;   at Microsoft.Build.BackEnd.NodePacketTranslator.NodePacketWriteTranslator.Translate[T](T&amp;amp; value, NodePacketValueFactory`1 factory)&lt;br /&gt;   at Microsoft.Build.BackEnd.NodeConfiguration.Translate(INodePacketTranslator translator)&lt;br /&gt;   at Microsoft.Build.BackEnd.NodeProviderOutOfProcBase.NodeContext.SendData(INodePacket packet)&lt;br /&gt;   ...&lt;/pre&gt;
&lt;p&gt;OK, so it doesn&apos;t like a character. But a character in WHAT? Well, we&apos;d assume a source file, but it&apos;s important to remember that there&apos;s other pieces of input to a compiler like path names, environment variables, commands passed to the compiler as switches, etc. &lt;/p&gt;
&lt;p&gt;It says Index 1321 which seems pretty far into a string before it gets mad. I asked a few people inside and Sara Joiner says:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;It looks like the only place in BuildParameters that we call TranslateDictionary is when transferring the state of the environment [variables] across the wire.&amp;#160; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ah, so this is splitting up name-value pairs that are the environment variables! David Kean says &amp;quot;ask him what his PATH looks like.&amp;quot; I ask and I get almost 2000 bytes of PATH! It&apos;s a HUGE path, it looks like it may even have been duplicated and appended to itself a few times.&lt;/p&gt;
&lt;p&gt;Here&apos;s just a bit of the PATH in question. See anything?&lt;/p&gt;
&lt;pre&gt;\;C:\PROGRA~1\DISKEE~1\DISKEE~1\;C:\Program Files (x86)\Windows Kits\8.0\Windows&lt;br /&gt;Performance Toolkit\;C:\Program Files\Microsoft SQL&lt;br /&gt;Server\110\Tools\Binn\;C:\Program Files\Microsoft\Web Platform&lt;br /&gt;Installer\;C:\Program Files\TortoiseSVN\binVN\???p??;C:\Program&lt;br /&gt;Files\TortoiseSVN\bin;C:\PHP\;C:\progra~1\NVIDIA&lt;br /&gt;Corporation\PhysX\Common;C:\progra~2\Common Files\Microsoft Shared\Windows&lt;br /&gt;Live;C:\progra~1\Common Files\Microsoft Shared\Windows&lt;br /&gt;Live;C:\q\w32;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;&lt;br /&gt;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\progra~2\WIDCOMM\Bluetooth&lt;br /&gt;Software\;C:\progra~2\WIDCOMM\Bluetooth &lt;/pre&gt;
&lt;p&gt;See those ??? marks? That doesn&apos;t feel like question marks to me. I open the result of &amp;quot;SET &amp;gt; env.txt&amp;quot; as a binary file in Visual Studio and it looks like it&apos;s 3Fs, which are ? marks.&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;I think the text file was converted to ANSI&quot; style=&quot;display: inline&quot; alt=&quot;I think the text file was converted to ANSI&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/CSI-Visual-Studio---Unable-to-translate-_EEDC/image_3.png&quot; width=&quot;655&quot; height=&quot;245&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This makes me think that there&apos;s unicode goo in the PATH that was converted to ANSI with it was piped. Phrased differently, this text file isn&apos;t reality.&lt;/p&gt;
&lt;p&gt;However, elsewhere in the Windows UI his PATH variable looks like different. &lt;/p&gt;
&lt;p&gt;C:\Program Files\TortoiseSVN\binVN\&#xFFFD;&#x4FB1;&#x1923;p&#x4960;&#x609;;&lt;/p&gt;
&lt;p&gt;Sometimes that corruption in the path looks like this and you might assume it&apos;s Chinese. No, it&apos;s corruption that&apos;s getting interpreted as Unicode. Interestingly the error said the naughty character was 0xD97C which is &amp;amp;#0xD97C; &#xFFFD; which implies to me that something got stripped out at some point in processing and turned into the Unicode equivalent of &apos;uh...&apos; Regardless, it&apos;s wrong and it needs to be removed. &lt;/p&gt;
&lt;p&gt;I ask him if cleaning his PATH worked and the customer just send me a one line response via email...the best kind of response:&lt;/p&gt;
&lt;pre&gt;========== Build: 12 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========&lt;/pre&gt;
&lt;p&gt;Yay! I hope this helps the next person who goes aGoogling for the answer and thought they were alone. Thanks to David Kean, Sara Joiner and Srinivas Nadimpalli for looking at the call stack and guessing at solutions with me!&lt;/p&gt;
&lt;p&gt;Any insights, Dear Reader?&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Sponsor: &lt;/strong&gt;Big thanks to RedGate for sponsoring the feed this week! Check out &lt;a href=&quot;http://bit.ly/11pRJTa&quot;&gt;&lt;strong&gt;Deployment Manager&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;&#x2013; app deployment without the stress. &lt;a href=&quot;http://bit.ly/11pRJTa&quot;&gt;Deploy .NET code &amp;amp; SQL Server databases in one simple process&lt;/a&gt; from a web-based UI. Works with local, remote and cloud servers. &lt;a href=&quot;http://bit.ly/11pRJTa&quot;&gt;Try it &lt;strong&gt;free&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. &lt;br/&gt;&lt;/div&gt;
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/42076896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/42076896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/42076896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/42076896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/42076896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=8f551574-6374-40dd-bda7-7a32117e20d8</comments>
      <category>Bugs</category><content:encoded>&lt;div&gt;&lt;figure&gt;&lt;img title=&quot;A crazy internal error from Visual Studio&quot; style=&quot;display: inline&quot; alt=&quot;A crazy internal error from Visual Studio&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/CSI-Visual-Studio---Unable-to-translate-_EEDC/chaos_3.jpg&quot; width=&quot;996&quot; height=&quot;642&quot; /&gt;&lt;/figure&gt;   &lt;p&gt;A customer emailed me a weird one. I tend to have a sense for when something is up and when an obscure thing will turn into something interesting. &lt;/p&gt;  &lt;p&gt;The person says:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;...mysteriously most of my projects refuse to build.&amp;#160; &amp;quot;The build stopped unexpectedly because of an internal failure... something about unicode... blah blah&amp;quot;&lt;/em&gt; &lt;/p&gt;    &lt;p&gt;&lt;em&gt;There are a few messages out there on the web about it -- even a really old hot fix.&amp;#160; What&apos;s the best way to proceed with the VS team / MS?&amp;#160; Is there anyone actively interested in glitches like this?&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;My spidey-sense is tingling. First, when something says &amp;quot;internal failure&amp;quot; it means some fundamental expectation wasn&apos;t met. Garbage in perhaps? He says &amp;quot;most of my projects&amp;quot; which implies it&apos;s not a specific project. There&apos;s also the sense that this is a &amp;quot;suddenly things stopped working&amp;quot; type thing. Presumably it worked before.&lt;/p&gt;  &lt;p&gt;I say:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;Have you checked all the source files to make sure one isn&apos;t filled with Unicode nulls or something?&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;And says no, but sends a call-stack (which is always nice when it&apos;s sent FIRST, but still):&lt;/p&gt;  &lt;pre&gt;Error    1    The build stopped unexpectedly because of an internal failure.
&lt;br&gt;System.Text.EncoderFallbackException: Unable to translate Unicode character \uD97C at index 1321 to specified code page.
&lt;br&gt;   at System.Text.EncoderExceptionFallbackBuffer.Fallback(Char charUnknown, Int32 index)
&lt;br&gt;   at System.Text.EncoderFallbackBuffer.InternalFallback(Char ch, Char*&amp;amp; chars)
&lt;br&gt;   at System.Text.UTF8Encoding.GetByteCount(Char* chars, Int32 count, EncoderNLS baseEncoder)
&lt;br&gt;   at System.Text.UTF8Encoding.GetByteCount(String chars)
&lt;br&gt;   at System.IO.BinaryWriter.Write(String value)
&lt;br&gt;   at Microsoft.Build.BackEnd.NodePacketTranslator.NodePacketWriteTranslator.TranslateDictionary(Dictionary`2&amp;amp; dictionary, IEqualityComparer`1 comparer)
&lt;br&gt;   at Microsoft.Build.Execution.BuildParameters.Microsoft.Build.BackEnd.INodePacketTranslatable.Translate(INodePacketTranslator translator)
&lt;br&gt;   at Microsoft.Build.BackEnd.NodePacketTranslator.NodePacketWriteTranslator.Translate[T](T&amp;amp; value, NodePacketValueFactory`1 factory)
&lt;br&gt;   at Microsoft.Build.BackEnd.NodeConfiguration.Translate(INodePacketTranslator translator)
&lt;br&gt;   at Microsoft.Build.BackEnd.NodeProviderOutOfProcBase.NodeContext.SendData(INodePacket packet)
&lt;br&gt;   ...&lt;/pre&gt;
&lt;p&gt;OK, so it doesn&apos;t like a character. But a character in WHAT? Well, we&apos;d assume a source file, but it&apos;s important to remember that there&apos;s other pieces of input to a compiler like path names, environment variables, commands passed to the compiler as switches, etc. &lt;/p&gt;
&lt;p&gt;It says Index 1321 which seems pretty far into a string before it gets mad. I asked a few people inside and Sara Joiner says:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;It looks like the only place in BuildParameters that we call TranslateDictionary is when transferring the state of the environment [variables] across the wire.&amp;#160; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ah, so this is splitting up name-value pairs that are the environment variables! David Kean says &amp;quot;ask him what his PATH looks like.&amp;quot; I ask and I get almost 2000 bytes of PATH! It&apos;s a HUGE path, it looks like it may even have been duplicated and appended to itself a few times.&lt;/p&gt;
&lt;p&gt;Here&apos;s just a bit of the PATH in question. See anything?&lt;/p&gt;
&lt;pre&gt;\;C:\PROGRA~1\DISKEE~1\DISKEE~1\;C:\Program Files (x86)\Windows Kits\8.0\Windows
&lt;br&gt;Performance Toolkit\;C:\Program Files\Microsoft SQL
&lt;br&gt;Server\110\Tools\Binn\;C:\Program Files\Microsoft\Web Platform
&lt;br&gt;Installer\;C:\Program Files\TortoiseSVN\binVN\???p??;C:\Program
&lt;br&gt;Files\TortoiseSVN\bin;C:\PHP\;C:\progra~1\NVIDIA
&lt;br&gt;Corporation\PhysX\Common;C:\progra~2\Common Files\Microsoft Shared\Windows
&lt;br&gt;Live;C:\progra~1\Common Files\Microsoft Shared\Windows
&lt;br&gt;Live;C:\q\w32;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;
&lt;br&gt;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\progra~2\WIDCOMM\Bluetooth
&lt;br&gt;Software\;C:\progra~2\WIDCOMM\Bluetooth &lt;/pre&gt;
&lt;p&gt;See those ??? marks? That doesn&apos;t feel like question marks to me. I open the result of &amp;quot;SET &amp;gt; env.txt&amp;quot; as a binary file in Visual Studio and it looks like it&apos;s 3Fs, which are ? marks.&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;I think the text file was converted to ANSI&quot; style=&quot;display: inline&quot; alt=&quot;I think the text file was converted to ANSI&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/CSI-Visual-Studio---Unable-to-translate-_EEDC/image_3.png&quot; width=&quot;655&quot; height=&quot;245&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This makes me think that there&apos;s unicode goo in the PATH that was converted to ANSI with it was piped. Phrased differently, this text file isn&apos;t reality.&lt;/p&gt;
&lt;p&gt;However, elsewhere in the Windows UI his PATH variable looks like different. &lt;/p&gt;
&lt;p&gt;C:\Program Files\TortoiseSVN\binVN\&#xFFFD;&#x4FB1;&#x1923;p&#x4960;&#x609;;&lt;/p&gt;
&lt;p&gt;Sometimes that corruption in the path looks like this and you might assume it&apos;s Chinese. No, it&apos;s corruption that&apos;s getting interpreted as Unicode. Interestingly the error said the naughty character was 0xD97C which is &amp;amp;#0xD97C; &#xFFFD; which implies to me that something got stripped out at some point in processing and turned into the Unicode equivalent of &apos;uh...&apos; Regardless, it&apos;s wrong and it needs to be removed. &lt;/p&gt;
&lt;p&gt;I ask him if cleaning his PATH worked and the customer just send me a one line response via email...the best kind of response:&lt;/p&gt;
&lt;pre&gt;========== Build: 12 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========&lt;/pre&gt;
&lt;p&gt;Yay! I hope this helps the next person who goes aGoogling for the answer and thought they were alone. Thanks to David Kean, Sara Joiner and Srinivas Nadimpalli for looking at the call stack and guessing at solutions with me!&lt;/p&gt;
&lt;p&gt;Any insights, Dear Reader?&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Sponsor: &lt;/strong&gt;Big thanks to RedGate for sponsoring the feed this week! Check out &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~bit.ly/11pRJTa&quot;&gt;&lt;strong&gt;Deployment Manager&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;&#x2013; app deployment without the stress. &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~bit.ly/11pRJTa&quot;&gt;Deploy .NET code &amp;amp; SQL Server databases in one simple process&lt;/a&gt; from a web-based UI. Works with local, remote and cloud servers. &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~bit.ly/11pRJTa&quot;&gt;Try it &lt;strong&gt;free&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. 
&lt;br&gt;&lt;/div&gt;&lt;Img align=&quot;left&quot; border=&quot;0&quot; height=&quot;1&quot; width=&quot;1&quot; style=&quot;border:0;float:left;margin:0;padding:0&quot; hspace=&quot;0&quot; src=&quot;http://feeds.hanselman.com/~/i/42076896/0/scotthanselman&quot;&gt;

&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/42076896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/42076896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/42076896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/42076896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/42076896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded></item>
<item>
<feedburner:origLink>http://www.hanselman.com/blog/HowToDeleteOpenOrInsecureWiFiHotSpotsFromWindows8WifiexeCommandLineUtilityWithSource.aspx</feedburner:origLink>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=fbbe7f8e-39c9-453a-9fe7-97218e992705</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=fbbe7f8e-39c9-453a-9fe7-97218e992705</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=fbbe7f8e-39c9-453a-9fe7-97218e992705</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=fbbe7f8e-39c9-453a-9fe7-97218e992705</wfw:commentRss>
      <slash:comments>17</slash:comments>
      <title>How to delete Open or Insecure Wi-Fi HotSpots from Windows 8: Wifi.exe Command Line Utility with Source</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=fbbe7f8e-39c9-453a-9fe7-97218e992705</guid>
      <link>http://feeds.hanselman.com/~/42032712/0/scotthanselman~How-to-delete-Open-or-Insecure-WiFi-HotSpots-from-Windows-Wifiexe-Command-Line-Utility-with-Source.aspx</link>
      <pubDate>Thu, 06 Jun 2013 23:28:52 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;float: right; margin: 0px 0px 0px 5px; display: inline&quot; alt=&quot;image&quot; align=&quot;right&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8c9f1195e244_497/image_3.png&quot; width=&quot;400&quot; height=&quot;405&quot;&gt;&lt;/p&gt; &lt;p&gt;For the most part I&apos;m happy with Windows 8 but one feature was removed that makes no sense to me - the wireless networks dialog.&lt;/p&gt; &lt;p&gt;Sure, you can &quot;Forget this network&quot; by right clicking on a Wi-Fi Connection, &lt;strong&gt;but only when that network is in range. &lt;/strong&gt;The old Wireless Networks dialog where you could add and remove networks is gone. Who knows how many saved Wi-Fi hotspot profile I have littering my system? &lt;/p&gt; &lt;p&gt;So, The Problem: I want to remove saved Wi-Fi Profiles whenever I feel like it. I wrote a command line util that will work in Windows 7 and Windows 8.&lt;/p&gt; &lt;h3&gt;TL;DR Version&lt;/h3&gt; &lt;p&gt;&lt;strong&gt;There&apos;s a build &lt;/strong&gt;&lt;a href=&quot;https://dl.dropboxusercontent.com/u/3380502/WiFi.zip&quot;&gt;&lt;strong&gt;zipped up of Wifi.exe available here&lt;/strong&gt;&lt;/a&gt; and the &lt;a href=&quot;https://github.com/shanselman/Windows-Wifi-Manager&quot;&gt;source is on GitHub&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;UPDATE: &lt;/strong&gt;I&apos;ve put Wifi-Manager up on &lt;a href=&quot;https://chocolatey.org/packages/wifi-manager&quot;&gt;Chocolately&lt;/a&gt; so you can now &quot;&lt;strong&gt;cinst wifi-manager.&lt;/strong&gt;&quot; Thanks to &lt;a href=&quot;https://github.com/shanselman/Windows-Wifi-Manager/pull/8&quot;&gt;Brendan Forster&lt;/a&gt; for the heavy lifting! Learn &lt;a href=&quot;http://www.hanselman.com/blog/IsTheWindowsUserReadyForAptget.aspx&quot;&gt;more about the Chocolatey package manager here&lt;/a&gt;!&lt;/p&gt; &lt;h3&gt;Caveats and &quot;Ya I know.&quot;&lt;/h3&gt; &lt;p&gt;First, let me be clear that I have written a command line utility to replace another command line utility. I get it. I knew it when I did it. Others &lt;a href=&quot;https://github.com/harthur/replace&quot;&gt;smarter than I have done similar things&lt;/a&gt; and written utilities that match their way of thinking rather than learning an unintuitive syntax. Don&apos;t hate the playa, hate the Regular Expression.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;Aside: &lt;/strong&gt;This is also a problem with my iPhone. I likely have 50+ saved Wi-Fi spots on my phone and no way to delete them without jail-breaking.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;You can access Wi-Fi profiles with the netsh.exe that comes with Windows, so you &lt;strong&gt;could &lt;/strong&gt;list out profiles like this:&lt;/p&gt;&lt;pre&gt;c:\&amp;gt;netsh wlan show profiles&lt;br&gt;&lt;br&gt;Profiles on interface Wi-Fi:&lt;br&gt;&lt;br&gt;User profiles&lt;br&gt;-------------&lt;br&gt;    All User Profile     : Wayport_Access&lt;br&gt;    All User Profile     : HANSELMAN&lt;br&gt;    All User Profile     : HANSELMAN-N&lt;br&gt;    All User Profile     : HanselSpot&lt;br&gt;    All User Profile     : EliteWifi&lt;br&gt;    All User Profile     : Qdoba Free Wifi&lt;/pre&gt;
&lt;p&gt;Then, for each one, call &lt;/p&gt;&lt;pre&gt;c:\&amp;gt;netsh wlan show profile &quot;Qdoba Free Wifi&quot;&lt;br&gt;&lt;br&gt;Profile Qdoba Free Wifi on interface Wi-Fi:&lt;br&gt;=======================================================================&lt;br&gt;&lt;br&gt;Profile information&lt;br&gt;-------------------&lt;br&gt;    Version                : 1&lt;br&gt;    Type                   : Wireless LAN&lt;br&gt;    Name                   : Qdoba Free Wifi&lt;br&gt;    Control options        :&lt;br&gt;        Connection mode    : Connect manually&lt;br&gt;&lt;br&gt;Connectivity settings&lt;br&gt;---------------------&lt;br&gt;    Number of SSIDs        : 1&lt;br&gt;    SSID name              : &quot;Qdoba Free Wifi&quot;&lt;br&gt;    Network type           : Infrastructure&lt;/pre&gt;
&lt;p&gt;For each of these profiles, check if they are secure or open, and if you are connecting manually or automatically. Then, if you wanted, you could netsh wlan delete profile name=&quot;Qdoba Free Wifi&quot; and remove a profile, even when it&apos;s not near you.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;http://www.hanselminutes.com/372/are-you-secure-wifi-honeypots-pineapples-and-ssl-with-troy-hunt&quot;&gt;my recent podcast with security expert Troy Hunt&lt;/a&gt;, he pointed out that it&apos;s easy to create a fake honeypot Wi-Fi spot that has the same name as a common open network, like Starbucks, for example. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Given: &lt;/strong&gt;If my PC or phone is set up to automatically connect to any open hotspot named &quot;Starbucks&quot; then it will just connect to one...even an evil hotspot. 
&lt;li&gt;&lt;strong&gt;Therefore: &lt;/strong&gt;it would be nice to automatically delete profiles for Wi-Fi spots that are both open (no security) and set to automatically connect.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;I was tired, so I thought I&apos;d bang out a little utility to do this. I could have used PowerShell or something but I felt like using C#. It&apos;s exercise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; &lt;a href=&quot;http://www.leeholmes.com/blog/2013/06/06/removing-insecure-wireless-connections-with-powershell/&quot;&gt;Lee Holmes went and wrote it in PowerShell&lt;/a&gt;! Amazing.&lt;/p&gt;
&lt;h3&gt;Wifi.exe and it&apos;s Usage&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;img style=&quot;float: right; display: inline&quot; align=&quot;right&quot; src=&quot;http://www.hanselman.com/blog/content/binary/WindowsLiveWriter/IntroducingRockScroll_C29C/works-on-my-machine-starburst_3.png&quot;&gt;Tired of reading? There&apos;s a build &lt;/strong&gt;&lt;a href=&quot;https://dl.dropboxusercontent.com/u/3380502/WiFi.zip&quot;&gt;&lt;strong&gt;zipped up of Wifi.exe available here&lt;/strong&gt;&lt;/a&gt; and the &lt;a href=&quot;https://github.com/shanselman/Windows-Wifi-Manager&quot;&gt;source is on GitHub&lt;/a&gt;. You may need to Right Click | Properties | Unblock the zip. &lt;/p&gt;
&lt;p&gt;There&apos;s no warranty. The code sucks and I&apos;m a horrible person and you&apos;re running a util you found on my blog. However, it works awesome on my machine. &lt;a href=&quot;https://github.com/shanselman/Windows-Wifi-Manager/issues&quot;&gt;Issues&lt;/a&gt; appreciated, &lt;a href=&quot;https://github.com/shanselman/Windows-Wifi-Manager/pulls&quot;&gt;tidy PRs&lt;/a&gt; appreciated more, running Resharper and doing a PR, less so. I&apos;ll update the build if good bugs require it.&lt;/p&gt;
&lt;p&gt;If you run Wifi.exe (I put it in my path) you&apos;ll see something like this:&lt;/p&gt;&lt;pre&gt;c:\&amp;gt;wifi&lt;br&gt;AP-guest                 manual    WPA2PSK&lt;br&gt;HANSELMAN-N                auto    WPA2PSK&lt;br&gt;HANSELMAN                  auto    WPA2PSK&lt;br&gt;HanselSpot                 auto    WPA2PSK&lt;br&gt;Qdoba Free Wifi          manual       open&lt;br&gt;Wayport_Access             auto       open Warning: AUTO connect to OPEN WiFi&lt;br&gt;&lt;br&gt;Delete WiFi profiles that are OPEN *and* AUTO connect? [y/n]&lt;br&gt;n&lt;/pre&gt;
&lt;p&gt;Notice the columns, and the prompt. There&apos;s a warning when a hotspot is both open and set to auto-connect. If you answer Y to the prompt, the utility will delete that profile. You can also type &apos;wifi /deleteautoopen&apos; to bypass the prompt and auto-delete &lt;strong&gt;just profiles that are auto and open. &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A pull request a few minutes after I pushed this code also added the ability to &lt;/p&gt;&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;wifi delete &quot;HOTSPOTNAME&quot;&lt;/pre&gt;
&lt;p&gt;which is nice also. Thanks!&lt;/p&gt;
&lt;h3&gt;The Code&lt;/h3&gt;
&lt;p&gt;One of the great things about writing command line apps like this is that there&apos;s literally a dozen ways to do everything. They are trivial and silly but also useful and used daily. In this case I&apos;ve got command line argument processing to think about, parsing output from a spawned process, doing the parsing in a clean way, making sure it works on a non-English machine (which I thought about but didn&apos;t test), as well as cleaning up of generated temp files.&lt;/p&gt;
&lt;p&gt;It&apos;s hardly impressive code, but some of it was fun or interesting. Here&apos;s a few bits I liked.&lt;/p&gt;
&lt;h4&gt;Making Columns with Console.WriteLine and String.Format&lt;/h4&gt;
&lt;p&gt;Did you know that you can right- and left-align columns within a fixed with using String.Format? Few people know about this and I&apos;ve seen whole libraries written custom to do the work that&apos;s built right in.&lt;/p&gt;&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;Console.WriteLine(String.Format(&quot;{0,-20} {1,10} {2,10} {3,30} &quot;, a.Name, a.ConnectionMode, a.Authentication, warning));&lt;/pre&gt;
&lt;p&gt;Note the {0,-20} (left aligned) and the {1,10} (right aligned). Those are just like {0} and {1} in a String.Format but they include alignment and width.&lt;/p&gt;
&lt;h4&gt;Gratuitous use of Linq&lt;/h4&gt;
&lt;p&gt;It wouldn&apos;t be a silly utility without in crazy LINQ, eh? Who needs Regular Expressions when you can when you can do a SQL query over your string? ;) Actually, I don&apos;t know if this is a good thing or not. It was fun, though, and it works. &lt;strong&gt;Your thoughts? &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This takes the output from wlan show profiles (seen above) and parses it into a list of just the AP Names. I think it should work in any language, assuming the : colons are there.&lt;/p&gt;&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;string result = ExecuteNetSh(&quot;wlan show profiles&quot;);&lt;br&gt;var listOfProfiles = from line in result.Split(new string[] { &quot;\r\n&quot; }, StringSplitOptions.RemoveEmptyEntries)&lt;br&gt;                     where line.Contains(&quot;:&quot;)&lt;br&gt;                     let l = line&lt;br&gt;                     where l.Last() != &apos;:&apos;&lt;br&gt;                     select l.Split(&apos;:&apos;)[1].Trim();&lt;br&gt;&lt;br&gt;foreach (string profile in listOfProfiles)&lt;br&gt;    ExecuteNetSh(String.Format(&quot;wlan export profile \&quot;{0}\&quot; folder=\&quot;{1}\&quot;&quot;, profile, Environment.CurrentDirectory));&lt;/pre&gt;
&lt;h4&gt;Cleaning up the temp XML files&lt;/h4&gt;
&lt;p&gt;I export a bunch of very specific XML files with a VERY non-specific extension. I can&apos;t control their file name and I don&apos;t want guess what their name is because I would need to recreate their AP Name encoding scheme. Instead, I look for any XML files in the current folder (given the rare chance that YOU, the utility runner, have XML files in the same folder already) and only delete the ones with the namespace that I know to be present in Wi-Fi profiles. I patted myself on the back for this one, but just lightly.&lt;/p&gt;&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;static XNamespace ns = &quot;http://www.microsoft.com/networking/WLAN/profile/v1&quot;;&lt;br&gt;    &lt;br&gt;//Delete the exported profiles we made, making sure they are what we think they are! &lt;br&gt;foreach (string file in Directory.EnumerateFiles(Environment.CurrentDirectory, &quot;*.xml&quot;))&lt;br&gt;    if (XElement.Load(file).Name.Namespace == ns)&lt;br&gt;        File.Delete(file);
&lt;/pre&gt;
&lt;h4&gt;Capturing Command Line Output&lt;/h4&gt;
&lt;p&gt;Finally, here&apos;s how you get the output of a command line process you started:&lt;/p&gt;&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;Process p = new Process();&lt;br&gt;p.StartInfo.FileName = &quot;netsh.exe&quot;;&lt;br&gt;p.StartInfo.Arguments = arguments ?? String.Empty;&lt;br&gt;p.StartInfo.UseShellExecute = false;&lt;br&gt;p.StartInfo.RedirectStandardOutput = true;&lt;br&gt;p.Start();&lt;br&gt;&lt;br&gt;string output = p.StandardOutput.ReadToEnd();&lt;br&gt;return output;&lt;/pre&gt;
&lt;p&gt;Pretty basic, but useful to bookmark.&lt;/p&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;After I wrote this I noticed there are some WinForms utilities to do this. That&apos;s great. I wouldn&apos;t mind making may own, except I&apos;d want it to look exactly like the Windows 7 dialog. It&apos;d be fun just to see if I could get it pixel perfect.&lt;/p&gt;
&lt;p&gt;Feel free to go check out the code, play with it and make fun of me. &lt;a title=&quot;https://github.com/shanselman/Windows-Wifi-Manager&quot; href=&quot;https://github.com/shanselman/Windows-Wifi-Manager&quot;&gt;https://github.com/shanselman/Windows-Wifi-Manager&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href=&quot;http://www.hanselman.com/blog/AnnouncingGetInvolvedFromTekpubEnhanceYourCareerByEngagingWithYourPeers.aspx&quot;&gt;&lt;strong&gt;&lt;em&gt;Get Involved!&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt; Check out my latest production with TekPub. A meticulously edited TWO HOURS of video content where we cover everything we think a developer should know to &quot;&lt;/em&gt;&lt;a href=&quot;http://tekpub.com/products/get-involved&quot;&gt;&lt;em&gt;Get Involved&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&quot; in the developer community.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. &lt;br/&gt;&lt;/div&gt;
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/42032712/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/42032712/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/42032712/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/42032712/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/42032712/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=fbbe7f8e-39c9-453a-9fe7-97218e992705</comments>
      <category>Open Source</category>
      <category>Tools</category>
      <category>Win7</category>
      <category>Win8</category><content:encoded>&lt;div&gt;&lt;p&gt;&lt;img title=&quot;image&quot; style=&quot;float: right; margin: 0px 0px 0px 5px; display: inline&quot; alt=&quot;image&quot; align=&quot;right&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/8c9f1195e244_497/image_3.png&quot; width=&quot;400&quot; height=&quot;405&quot;&gt;&lt;/p&gt; &lt;p&gt;For the most part I&apos;m happy with Windows 8 but one feature was removed that makes no sense to me - the wireless networks dialog.&lt;/p&gt; &lt;p&gt;Sure, you can &quot;Forget this network&quot; by right clicking on a Wi-Fi Connection, &lt;strong&gt;but only when that network is in range. &lt;/strong&gt;The old Wireless Networks dialog where you could add and remove networks is gone. Who knows how many saved Wi-Fi hotspot profile I have littering my system? &lt;/p&gt; &lt;p&gt;So, The Problem: I want to remove saved Wi-Fi Profiles whenever I feel like it. I wrote a command line util that will work in Windows 7 and Windows 8.&lt;/p&gt; &lt;h3&gt;TL;DR Version&lt;/h3&gt; &lt;p&gt;&lt;strong&gt;There&apos;s a build &lt;/strong&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://dl.dropboxusercontent.com/u/3380502/WiFi.zip&quot;&gt;&lt;strong&gt;zipped up of Wifi.exe available here&lt;/strong&gt;&lt;/a&gt; and the &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://github.com/shanselman/Windows-Wifi-Manager&quot;&gt;source is on GitHub&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;UPDATE: &lt;/strong&gt;I&apos;ve put Wifi-Manager up on &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://chocolatey.org/packages/wifi-manager&quot;&gt;Chocolately&lt;/a&gt; so you can now &quot;&lt;strong&gt;cinst wifi-manager.&lt;/strong&gt;&quot; Thanks to &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://github.com/shanselman/Windows-Wifi-Manager/pull/8&quot;&gt;Brendan Forster&lt;/a&gt; for the heavy lifting! Learn &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.hanselman.com/blog/IsTheWindowsUserReadyForAptget.aspx&quot;&gt;more about the Chocolatey package manager here&lt;/a&gt;!&lt;/p&gt; &lt;h3&gt;Caveats and &quot;Ya I know.&quot;&lt;/h3&gt; &lt;p&gt;First, let me be clear that I have written a command line utility to replace another command line utility. I get it. I knew it when I did it. Others &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://github.com/harthur/replace&quot;&gt;smarter than I have done similar things&lt;/a&gt; and written utilities that match their way of thinking rather than learning an unintuitive syntax. Don&apos;t hate the playa, hate the Regular Expression.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;Aside: &lt;/strong&gt;This is also a problem with my iPhone. I likely have 50+ saved Wi-Fi spots on my phone and no way to delete them without jail-breaking.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;You can access Wi-Fi profiles with the netsh.exe that comes with Windows, so you &lt;strong&gt;could &lt;/strong&gt;list out profiles like this:&lt;/p&gt;&lt;pre&gt;c:\&amp;gt;netsh wlan show profiles
&lt;br&gt;
&lt;br&gt;Profiles on interface Wi-Fi:
&lt;br&gt;
&lt;br&gt;User profiles
&lt;br&gt;-------------
&lt;br&gt;    All User Profile     : Wayport_Access
&lt;br&gt;    All User Profile     : HANSELMAN
&lt;br&gt;    All User Profile     : HANSELMAN-N
&lt;br&gt;    All User Profile     : HanselSpot
&lt;br&gt;    All User Profile     : EliteWifi
&lt;br&gt;    All User Profile     : Qdoba Free Wifi&lt;/pre&gt;
&lt;p&gt;Then, for each one, call &lt;/p&gt;&lt;pre&gt;c:\&amp;gt;netsh wlan show profile &quot;Qdoba Free Wifi&quot;
&lt;br&gt;
&lt;br&gt;Profile Qdoba Free Wifi on interface Wi-Fi:
&lt;br&gt;=======================================================================
&lt;br&gt;
&lt;br&gt;Profile information
&lt;br&gt;-------------------
&lt;br&gt;    Version                : 1
&lt;br&gt;    Type                   : Wireless LAN
&lt;br&gt;    Name                   : Qdoba Free Wifi
&lt;br&gt;    Control options        :
&lt;br&gt;        Connection mode    : Connect manually
&lt;br&gt;
&lt;br&gt;Connectivity settings
&lt;br&gt;---------------------
&lt;br&gt;    Number of SSIDs        : 1
&lt;br&gt;    SSID name              : &quot;Qdoba Free Wifi&quot;
&lt;br&gt;    Network type           : Infrastructure&lt;/pre&gt;
&lt;p&gt;For each of these profiles, check if they are secure or open, and if you are connecting manually or automatically. Then, if you wanted, you could netsh wlan delete profile name=&quot;Qdoba Free Wifi&quot; and remove a profile, even when it&apos;s not near you.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.hanselminutes.com/372/are-you-secure-wifi-honeypots-pineapples-and-ssl-with-troy-hunt&quot;&gt;my recent podcast with security expert Troy Hunt&lt;/a&gt;, he pointed out that it&apos;s easy to create a fake honeypot Wi-Fi spot that has the same name as a common open network, like Starbucks, for example. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Given: &lt;/strong&gt;If my PC or phone is set up to automatically connect to any open hotspot named &quot;Starbucks&quot; then it will just connect to one...even an evil hotspot. 
&lt;li&gt;&lt;strong&gt;Therefore: &lt;/strong&gt;it would be nice to automatically delete profiles for Wi-Fi spots that are both open (no security) and set to automatically connect.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;I was tired, so I thought I&apos;d bang out a little utility to do this. I could have used PowerShell or something but I felt like using C#. It&apos;s exercise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.leeholmes.com/blog/2013/06/06/removing-insecure-wireless-connections-with-powershell/&quot;&gt;Lee Holmes went and wrote it in PowerShell&lt;/a&gt;! Amazing.&lt;/p&gt;
&lt;h3&gt;Wifi.exe and it&apos;s Usage&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;img style=&quot;float: right; display: inline&quot; align=&quot;right&quot; src=&quot;http://www.hanselman.com/blog/content/binary/WindowsLiveWriter/IntroducingRockScroll_C29C/works-on-my-machine-starburst_3.png&quot;&gt;Tired of reading? There&apos;s a build &lt;/strong&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://dl.dropboxusercontent.com/u/3380502/WiFi.zip&quot;&gt;&lt;strong&gt;zipped up of Wifi.exe available here&lt;/strong&gt;&lt;/a&gt; and the &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://github.com/shanselman/Windows-Wifi-Manager&quot;&gt;source is on GitHub&lt;/a&gt;. You may need to Right Click | Properties | Unblock the zip. &lt;/p&gt;
&lt;p&gt;There&apos;s no warranty. The code sucks and I&apos;m a horrible person and you&apos;re running a util you found on my blog. However, it works awesome on my machine. &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://github.com/shanselman/Windows-Wifi-Manager/issues&quot;&gt;Issues&lt;/a&gt; appreciated, &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://github.com/shanselman/Windows-Wifi-Manager/pulls&quot;&gt;tidy PRs&lt;/a&gt; appreciated more, running Resharper and doing a PR, less so. I&apos;ll update the build if good bugs require it.&lt;/p&gt;
&lt;p&gt;If you run Wifi.exe (I put it in my path) you&apos;ll see something like this:&lt;/p&gt;&lt;pre&gt;c:\&amp;gt;wifi
&lt;br&gt;AP-guest                 manual    WPA2PSK
&lt;br&gt;HANSELMAN-N                auto    WPA2PSK
&lt;br&gt;HANSELMAN                  auto    WPA2PSK
&lt;br&gt;HanselSpot                 auto    WPA2PSK
&lt;br&gt;Qdoba Free Wifi          manual       open
&lt;br&gt;Wayport_Access             auto       open Warning: AUTO connect to OPEN WiFi
&lt;br&gt;
&lt;br&gt;Delete WiFi profiles that are OPEN *and* AUTO connect? [y/n]
&lt;br&gt;n&lt;/pre&gt;
&lt;p&gt;Notice the columns, and the prompt. There&apos;s a warning when a hotspot is both open and set to auto-connect. If you answer Y to the prompt, the utility will delete that profile. You can also type &apos;wifi /deleteautoopen&apos; to bypass the prompt and auto-delete &lt;strong&gt;just profiles that are auto and open. &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A pull request a few minutes after I pushed this code also added the ability to &lt;/p&gt;&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;wifi delete &quot;HOTSPOTNAME&quot;&lt;/pre&gt;
&lt;p&gt;which is nice also. Thanks!&lt;/p&gt;
&lt;h3&gt;The Code&lt;/h3&gt;
&lt;p&gt;One of the great things about writing command line apps like this is that there&apos;s literally a dozen ways to do everything. They are trivial and silly but also useful and used daily. In this case I&apos;ve got command line argument processing to think about, parsing output from a spawned process, doing the parsing in a clean way, making sure it works on a non-English machine (which I thought about but didn&apos;t test), as well as cleaning up of generated temp files.&lt;/p&gt;
&lt;p&gt;It&apos;s hardly impressive code, but some of it was fun or interesting. Here&apos;s a few bits I liked.&lt;/p&gt;
&lt;h4&gt;Making Columns with Console.WriteLine and String.Format&lt;/h4&gt;
&lt;p&gt;Did you know that you can right- and left-align columns within a fixed with using String.Format? Few people know about this and I&apos;ve seen whole libraries written custom to do the work that&apos;s built right in.&lt;/p&gt;&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;Console.WriteLine(String.Format(&quot;{0,-20} {1,10} {2,10} {3,30} &quot;, a.Name, a.ConnectionMode, a.Authentication, warning));&lt;/pre&gt;
&lt;p&gt;Note the {0,-20} (left aligned) and the {1,10} (right aligned). Those are just like {0} and {1} in a String.Format but they include alignment and width.&lt;/p&gt;
&lt;h4&gt;Gratuitous use of Linq&lt;/h4&gt;
&lt;p&gt;It wouldn&apos;t be a silly utility without in crazy LINQ, eh? Who needs Regular Expressions when you can when you can do a SQL query over your string? ;) Actually, I don&apos;t know if this is a good thing or not. It was fun, though, and it works. &lt;strong&gt;Your thoughts? &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This takes the output from wlan show profiles (seen above) and parses it into a list of just the AP Names. I think it should work in any language, assuming the : colons are there.&lt;/p&gt;&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;string result = ExecuteNetSh(&quot;wlan show profiles&quot;);
&lt;br&gt;var listOfProfiles = from line in result.Split(new string[] { &quot;\r\n&quot; }, StringSplitOptions.RemoveEmptyEntries)
&lt;br&gt;                     where line.Contains(&quot;:&quot;)
&lt;br&gt;                     let l = line
&lt;br&gt;                     where l.Last() != &apos;:&apos;
&lt;br&gt;                     select l.Split(&apos;:&apos;)[1].Trim();
&lt;br&gt;
&lt;br&gt;foreach (string profile in listOfProfiles)
&lt;br&gt;    ExecuteNetSh(String.Format(&quot;wlan export profile \&quot;{0}\&quot; folder=\&quot;{1}\&quot;&quot;, profile, Environment.CurrentDirectory));&lt;/pre&gt;
&lt;h4&gt;Cleaning up the temp XML files&lt;/h4&gt;
&lt;p&gt;I export a bunch of very specific XML files with a VERY non-specific extension. I can&apos;t control their file name and I don&apos;t want guess what their name is because I would need to recreate their AP Name encoding scheme. Instead, I look for any XML files in the current folder (given the rare chance that YOU, the utility runner, have XML files in the same folder already) and only delete the ones with the namespace that I know to be present in Wi-Fi profiles. I patted myself on the back for this one, but just lightly.&lt;/p&gt;&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;static XNamespace ns = &quot;http://www.microsoft.com/networking/WLAN/profile/v1&quot;;
&lt;br&gt;    
&lt;br&gt;//Delete the exported profiles we made, making sure they are what we think they are! 
&lt;br&gt;foreach (string file in Directory.EnumerateFiles(Environment.CurrentDirectory, &quot;*.xml&quot;))
&lt;br&gt;    if (XElement.Load(file).Name.Namespace == ns)
&lt;br&gt;        File.Delete(file);
&lt;/pre&gt;
&lt;h4&gt;Capturing Command Line Output&lt;/h4&gt;
&lt;p&gt;Finally, here&apos;s how you get the output of a command line process you started:&lt;/p&gt;&lt;pre class=&quot;brush: csharp; toolbar: false; auto-links: false;&quot;&gt;Process p = new Process();
&lt;br&gt;p.StartInfo.FileName = &quot;netsh.exe&quot;;
&lt;br&gt;p.StartInfo.Arguments = arguments ?? String.Empty;
&lt;br&gt;p.StartInfo.UseShellExecute = false;
&lt;br&gt;p.StartInfo.RedirectStandardOutput = true;
&lt;br&gt;p.Start();
&lt;br&gt;
&lt;br&gt;string output = p.StandardOutput.ReadToEnd();
&lt;br&gt;return output;&lt;/pre&gt;
&lt;p&gt;Pretty basic, but useful to bookmark.&lt;/p&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;After I wrote this I noticed there are some WinForms utilities to do this. That&apos;s great. I wouldn&apos;t mind making may own, except I&apos;d want it to look exactly like the Windows 7 dialog. It&apos;d be fun just to see if I could get it pixel perfect.&lt;/p&gt;
&lt;p&gt;Feel free to go check out the code, play with it and make fun of me. &lt;a title=&quot;https://github.com/shanselman/Windows-Wifi-Manager&quot; href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://github.com/shanselman/Windows-Wifi-Manager&quot;&gt;https://github.com/shanselman/Windows-Wifi-Manager&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.hanselman.com/blog/AnnouncingGetInvolvedFromTekpubEnhanceYourCareerByEngagingWithYourPeers.aspx&quot;&gt;&lt;strong&gt;&lt;em&gt;Get Involved!&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt; Check out my latest production with TekPub. A meticulously edited TWO HOURS of video content where we cover everything we think a developer should know to &quot;&lt;/em&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~tekpub.com/products/get-involved&quot;&gt;&lt;em&gt;Get Involved&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&quot; in the developer community.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;br/&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. 
&lt;br/&gt;&lt;/div&gt;&lt;Img align=&quot;left&quot; border=&quot;0&quot; height=&quot;1&quot; width=&quot;1&quot; style=&quot;border:0;float:left;margin:0;padding:0&quot; hspace=&quot;0&quot; src=&quot;http://feeds.hanselman.com/~/i/42032712/0/scotthanselman&quot;&gt;

&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/42032712/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/42032712/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/42032712/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/42032712/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/42032712/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded></item>
<item>
<feedburner:origLink>http://www.hanselman.com/blog/AnnouncingGetInvolvedFromTekpubEnhanceYourCareerByEngagingWithYourPeers.aspx</feedburner:origLink>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=11f7b6c0-a600-404a-8cc1-ec6475e815ca</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=11f7b6c0-a600-404a-8cc1-ec6475e815ca</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=11f7b6c0-a600-404a-8cc1-ec6475e815ca</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=11f7b6c0-a600-404a-8cc1-ec6475e815ca</wfw:commentRss>
      <slash:comments>15</slash:comments>
      <title>Announcing "Get Involved" from Tekpub - Enhance your career by engaging with your peers</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=11f7b6c0-a600-404a-8cc1-ec6475e815ca</guid>
      <link>http://feeds.hanselman.com/~/42029265/0/scotthanselman~Announcing-Get-Involved-from-Tekpub-Enhance-your-career-by-engaging-with-your-peers.aspx</link>
      <pubDate>Thu, 06 Jun 2013 21:33:12 GMT</pubDate>
      <description>&lt;div&gt;&lt;figure&gt;  &lt;div class=&quot;embed-container&quot;&gt;&lt;iframe height=&quot;531&quot; src=&quot;http://player.vimeo.com/video/67703273&quot; frameborder=&quot;0&quot; width=&quot;950&quot; mozallowfullscreen=&quot;mozallowfullscreen&quot; webkitallowfullscreen=&quot;webkitallowfullscreen&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;&lt;/div&gt; &lt;/figure&gt;  &lt;h3&gt;&lt;a href=&quot;http://tekpub.com/products/get-involved&quot;&gt;Get Involved - The Video&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;My friend Rob Conery and I work on the &lt;a href=&quot;http://www.thisdeveloperslife.com&quot;&gt;This Developer&apos;s Life&lt;/a&gt; podcast together. You should check it out, we work well together. Last year we created a &lt;a href=&quot;http://speakinghacks.com&quot;&gt;Technical Speaking Tips Video&lt;/a&gt; and launched &lt;a href=&quot;http://speakinghacks.com&quot;&gt;http://speakinghacks.com&lt;/a&gt; on Rob&apos;s TekPub site.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://tekpub.com/products/get-involved&quot;&gt;&lt;img title=&quot;Get Involved!&quot; style=&quot;float: right; margin: 0px 0px 0px 4px; display: inline&quot; alt=&quot;Get Involved!&quot; align=&quot;right&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/46820673daa7_C66E/image_6.png&quot; width=&quot;500&quot; height=&quot;280&quot; /&gt;&lt;/a&gt;Since then I&apos;ve done a little more moonlighting on the side with Rob and release not just &lt;a href=&quot;http://tekpub.com/collections/microsoft-and-net/products/ft_speaker&quot;&gt;The Art of Speaking&lt;/a&gt; but also &lt;a href=&quot;http://tekpub.com/collections/microsoft-and-net/products/the-hansel-bundle&quot;&gt;done other episodes with Rob&lt;/a&gt; including a regular show called &amp;quot;&lt;a href=&quot;http://tekpub.com/blogs/video-releases/tagged/the-source-with-scott-hanselman&quot;&gt;The Source&lt;/a&gt;&amp;quot; where we explore the source of popular open source frameworks. Again, &lt;a href=&quot;http://tekpub.com/collections/subscriptions&quot;&gt;you get &lt;strong&gt;all&lt;/strong&gt; of this with a yearly or monthly subscription&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Today we&apos;re launched our most ambitious project yet. A meticulously edited episode that&apos;s almost TWO HOURS of video content where we cover everything we think a developer should know to &amp;quot;&lt;a href=&quot;http://tekpub.com/products/get-involved&quot;&gt;Get Involved&lt;/a&gt;&amp;quot; in the developer community.&lt;/p&gt;  &lt;h3&gt;&lt;a href=&quot;http://tekpub.com/products/get-involved&quot;&gt;Announcing &amp;quot;Get Involved&amp;quot;&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;If you&apos;re a fan of &lt;a href=&quot;http://www.thisdeveloperslife.com&quot;&gt;This Developer&apos;s Life&lt;/a&gt; you know how tightly we like to produce things - this video is no exception. Filmed on the streets of Portland and at a Portland user group, we talk about Blogging, Twitter, Github, StackOverflow, Open Source, Speaking, User Groups and Conferences - all of this hoping to make you a happier, more productive, more connected developer. We want to inspire you and perhaps to take your career to the next level.&lt;/p&gt;  &lt;p&gt;Additionally, we stretched far beyond Portland to seek out the other people who are very active and well known in the social arena like &lt;strong&gt;Jon Skeet &lt;/strong&gt;and &lt;strong&gt;Jeff Atwood&lt;/strong&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Jeff Atwood &lt;/strong&gt;and I talk about blogging, writing, and &amp;quot;working your voice free&amp;quot; so people who read your posts hear you loud and clear. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Jon Skeet &lt;/strong&gt;joins us to talk about what a Good Question is on StackOverflow - and also how you can gain reputation by providing Good Answers - and edits to Good Questions! &lt;/li&gt;    &lt;li&gt;We venture out to the Portland Area DotNet Users Group (PADNUG) and meet a few developers who have just started going - as well as people who have been there for years. &lt;/li&gt;    &lt;li&gt;While we were there, I gave a 10-minute lightning talk on Azure - a great way to get started speaking if you&apos;re not a fan of public speaking. Rob filmed the whole thing. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;We put an immense amount of work &lt;a href=&quot;http://tekpub.com/products/get-involved&quot;&gt;into this production&lt;/a&gt; and I really think you&apos;ll enjoy it. You can buy it &amp;quot;&lt;a href=&quot;http://tekpub.com/products/get-involved&quot;&gt;ala carte&lt;/a&gt;&amp;quot; or as with all Tekpub productions you can &lt;a href=&quot;http://tekpub.com/collections/subscriptions&quot;&gt;get a one year subscription&lt;/a&gt; and &lt;a href=&quot;http://tekpub.com/collections&quot;&gt;get access to &lt;strong&gt;everything &lt;/strong&gt;on Tekpub&lt;/a&gt; including this video, my speaking video, my show The Source as well as my episodes of Full Throttle with Rob PLUS &lt;a href=&quot;http://tekpub.com/collections/everything&quot;&gt;dozens of other videos on new tech like Backbone, Async C# 5.0 with Jon Skeet, ASP.NET MVC with Sam Saffron, RavenDB with Ayende Rahien, Mastering jQuery, and on and on&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I hope you enjoy this show. We poured our hearts into it.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;P.S. Here&apos;s a 10% discount coupon if you only want the video alone: KQWFCJUE0SPO&lt;/em&gt;&lt;/p&gt;&lt;br/&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. &lt;br/&gt;&lt;/div&gt;
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/42029265/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/42029265/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/42029265/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/42029265/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/42029265/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=11f7b6c0-a600-404a-8cc1-ec6475e815ca</comments>
      <category>Musings</category>
      <category>Open Source</category><content:encoded>&lt;div&gt;&lt;figure&gt;  &lt;div class=&quot;embed-container&quot;&gt;&lt;iframe height=&quot;531&quot; src=&quot;http://player.vimeo.com/video/67703273&quot; frameborder=&quot;0&quot; width=&quot;950&quot; mozallowfullscreen=&quot;mozallowfullscreen&quot; webkitallowfullscreen=&quot;webkitallowfullscreen&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;&lt;/div&gt; &lt;/figure&gt;  &lt;h3&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~tekpub.com/products/get-involved&quot;&gt;Get Involved - The Video&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;My friend Rob Conery and I work on the &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.thisdeveloperslife.com&quot;&gt;This Developer&apos;s Life&lt;/a&gt; podcast together. You should check it out, we work well together. Last year we created a &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~speakinghacks.com&quot;&gt;Technical Speaking Tips Video&lt;/a&gt; and launched &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~speakinghacks.com&quot;&gt;http://speakinghacks.com&lt;/a&gt; on Rob&apos;s TekPub site.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~tekpub.com/products/get-involved&quot;&gt;&lt;img title=&quot;Get Involved!&quot; style=&quot;float: right; margin: 0px 0px 0px 4px; display: inline&quot; alt=&quot;Get Involved!&quot; align=&quot;right&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/46820673daa7_C66E/image_6.png&quot; width=&quot;500&quot; height=&quot;280&quot; /&gt;&lt;/a&gt;Since then I&apos;ve done a little more moonlighting on the side with Rob and release not just &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~tekpub.com/collections/microsoft-and-net/products/ft_speaker&quot;&gt;The Art of Speaking&lt;/a&gt; but also &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~tekpub.com/collections/microsoft-and-net/products/the-hansel-bundle&quot;&gt;done other episodes with Rob&lt;/a&gt; including a regular show called &amp;quot;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~tekpub.com/blogs/video-releases/tagged/the-source-with-scott-hanselman&quot;&gt;The Source&lt;/a&gt;&amp;quot; where we explore the source of popular open source frameworks. Again, &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~tekpub.com/collections/subscriptions&quot;&gt;you get &lt;strong&gt;all&lt;/strong&gt; of this with a yearly or monthly subscription&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Today we&apos;re launched our most ambitious project yet. A meticulously edited episode that&apos;s almost TWO HOURS of video content where we cover everything we think a developer should know to &amp;quot;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~tekpub.com/products/get-involved&quot;&gt;Get Involved&lt;/a&gt;&amp;quot; in the developer community.&lt;/p&gt;  &lt;h3&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~tekpub.com/products/get-involved&quot;&gt;Announcing &amp;quot;Get Involved&amp;quot;&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;If you&apos;re a fan of &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.thisdeveloperslife.com&quot;&gt;This Developer&apos;s Life&lt;/a&gt; you know how tightly we like to produce things - this video is no exception. Filmed on the streets of Portland and at a Portland user group, we talk about Blogging, Twitter, Github, StackOverflow, Open Source, Speaking, User Groups and Conferences - all of this hoping to make you a happier, more productive, more connected developer. We want to inspire you and perhaps to take your career to the next level.&lt;/p&gt;  &lt;p&gt;Additionally, we stretched far beyond Portland to seek out the other people who are very active and well known in the social arena like &lt;strong&gt;Jon Skeet &lt;/strong&gt;and &lt;strong&gt;Jeff Atwood&lt;/strong&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Jeff Atwood &lt;/strong&gt;and I talk about blogging, writing, and &amp;quot;working your voice free&amp;quot; so people who read your posts hear you loud and clear. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Jon Skeet &lt;/strong&gt;joins us to talk about what a Good Question is on StackOverflow - and also how you can gain reputation by providing Good Answers - and edits to Good Questions! &lt;/li&gt;    &lt;li&gt;We venture out to the Portland Area DotNet Users Group (PADNUG) and meet a few developers who have just started going - as well as people who have been there for years. &lt;/li&gt;    &lt;li&gt;While we were there, I gave a 10-minute lightning talk on Azure - a great way to get started speaking if you&apos;re not a fan of public speaking. Rob filmed the whole thing. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;We put an immense amount of work &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~tekpub.com/products/get-involved&quot;&gt;into this production&lt;/a&gt; and I really think you&apos;ll enjoy it. You can buy it &amp;quot;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~tekpub.com/products/get-involved&quot;&gt;ala carte&lt;/a&gt;&amp;quot; or as with all Tekpub productions you can &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~tekpub.com/collections/subscriptions&quot;&gt;get a one year subscription&lt;/a&gt; and &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~tekpub.com/collections&quot;&gt;get access to &lt;strong&gt;everything &lt;/strong&gt;on Tekpub&lt;/a&gt; including this video, my speaking video, my show The Source as well as my episodes of Full Throttle with Rob PLUS &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~tekpub.com/collections/everything&quot;&gt;dozens of other videos on new tech like Backbone, Async C# 5.0 with Jon Skeet, ASP.NET MVC with Sam Saffron, RavenDB with Ayende Rahien, Mastering jQuery, and on and on&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I hope you enjoy this show. We poured our hearts into it.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;P.S. Here&apos;s a 10% discount coupon if you only want the video alone: KQWFCJUE0SPO&lt;/em&gt;&lt;/p&gt;
&lt;br&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. 
&lt;br&gt;&lt;/div&gt;&lt;Img align=&quot;left&quot; border=&quot;0&quot; height=&quot;1&quot; width=&quot;1&quot; style=&quot;border:0;float:left;margin:0;padding:0&quot; hspace=&quot;0&quot; src=&quot;http://feeds.hanselman.com/~/i/42029265/0/scotthanselman&quot;&gt;

&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/42029265/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/42029265/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/42029265/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/42029265/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/42029265/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded></item>
<item>
<feedburner:origLink>http://www.hanselman.com/blog/BlockingImageHotlinkingLeechingAndEvilSploggersWithIISUrlRewrite.aspx</feedburner:origLink>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=cd345b14-02d2-4302-8187-c1fe3f5d94e7</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=cd345b14-02d2-4302-8187-c1fe3f5d94e7</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=cd345b14-02d2-4302-8187-c1fe3f5d94e7</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=cd345b14-02d2-4302-8187-c1fe3f5d94e7</wfw:commentRss>
      <slash:comments>58</slash:comments>
      <title>Blocking Image Hotlinking, Leeching and Evil Sploggers with IIS Url Rewrite</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=cd345b14-02d2-4302-8187-c1fe3f5d94e7</guid>
      <link>http://feeds.hanselman.com/~/41895192/0/scotthanselman~Blocking-Image-Hotlinking-Leeching-and-Evil-Sploggers-with-IIS-Url-Rewrite.aspx</link>
      <pubDate>Mon, 03 Jun 2013 19:25:14 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;I recently discovered that a blog called (seriously) &amp;quot;Google Chrome Browser&amp;quot; was &lt;strong&gt;reblogging &lt;/strong&gt;my site. (It of course has NO relationship to Google or the lovely folks on the Chrome team.) &lt;/p&gt;  &lt;p&gt;This is a splog or &amp;quot;spam blog.&amp;quot; It&apos;s less of a blog and more of a &apos;suck your feed in and reblog it.&apos; Basically every post is duplicated or sucked in via RSS from somewhere else.&amp;#160; I get this many times a week and have for years.&lt;/p&gt;  &lt;p&gt;However, this particular site started showing up ahead of mine in searches and that&apos;s not cool.&lt;/p&gt;  &lt;p&gt;&lt;img title=&quot;You evil bastards.&quot; style=&quot;display: inline&quot; alt=&quot;You evil bastards.&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Blogging-Image-Leeching-and-Evil-Splogge_93A2/image_6.png&quot; width=&quot;483&quot; height=&quot;243&quot; /&gt;&lt;/p&gt;  &lt;p&gt;Worse yet, they have almost 25k followers on Twitter. I&apos;ve asked them a few times to stop doing this, but this time I got tired of it.&lt;/p&gt;  &lt;p&gt;They&apos;re even &apos;hotlinking&apos; my images, which means that all my PNGs are still hosted on my site. When you visit their site, the text is from my RSS but I pay for the images bandwidth. The irony of this is thick. Not to mention my copyright notice is intact on their site. ;)&lt;/p&gt;  &lt;p&gt;When an image is linked to from another domain the HTTP_REFERER header is populated with the location that the image is linked from. That means when my web server gets a request for &apos;foo.png&apos; from the Google Chrome Browser blog I can see the page that asked for that image. &lt;/p&gt;  &lt;p&gt;For example:&lt;/p&gt;  &lt;pre&gt;Request URL:http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/How-to-run-a-Virtual-Conference-for-10_E53C/image_5.png&lt;br /&gt;Request Method:GET&lt;br /&gt;Referer:http://google-chrome-browser.com/penny-pinching-cloud-how-run-two-day-virtual-conference-10&lt;/pre&gt;
&lt;p&gt;Because this differentiates the GET request that means I can do something about it. This brings up a few important things to remember in general about the web that I feel a lot of programmers forget about:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.hanselman.com/blog/TheInternetIsNotABlackBoxLookInside.aspx&quot;&gt;The Internet is not a black box&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;You can do something about it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That said, I want to detect these requests and serve a different image. &lt;/p&gt;
&lt;p&gt;If I was using Apache and had an .htaccess file, I might do this:&lt;/p&gt;
&lt;pre&gt;RewriteCond %{HTTP:Referer} ^.*http://(?:www\.)?computersblogsexample.info.*$&lt;br /&gt;RewriteHeader Referer: .* damn\.spammers&lt;br /&gt;&lt;br /&gt;RewriteCond %{HTTP:Referer} ^.*http://(?:www\.)?google-chrome-browser.*$&lt;br /&gt;RewriteHeader Referer: .* damn\.spammers&lt;br /&gt;&lt;br /&gt;#make more of these for each evil spammer&lt;br /&gt;&lt;br /&gt;RewriteCond %{HTTP:Referer} ^.*damn\.spammers.*$&lt;br /&gt;RewriteRule ^.*\.(?:gif|jpg|png)$ /images/splog.png [NC,L]&lt;/pre&gt;
&lt;p&gt;Since I&apos;m using IIS, I&apos;ll do similar rewrites in my web.config. I could do a whitelist where I only allow hotlinking from a few places, or a blacklist where I only block a few folks. Here&apos;s a blacklist.&lt;/p&gt;
&lt;pre class=&quot;brush: xml; gutter: false; toolbar: false; auto-links: false;&quot;&gt;&amp;lt;system.webServer&amp;gt;&lt;br /&gt;  &amp;lt;rewrite&amp;gt;&lt;br /&gt;    &amp;lt;rules&amp;gt;&lt;br /&gt;      &amp;lt;rule name=&amp;quot;Blacklist block&amp;quot; stopProcessing=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;          &amp;lt;match url=&amp;quot;(?:jpg|jpeg|png|gif|bmp)$&amp;quot; /&amp;gt;&lt;br /&gt;          &amp;lt;conditions&amp;gt;&lt;br /&gt;              &amp;lt;add input=&amp;quot;{HTTP_REFERER}&amp;quot; pattern=&amp;quot;^https?://(.+?)/.*$&amp;quot; /&amp;gt;&lt;br /&gt;              &amp;lt;add input=&amp;quot;{DomainsBlackList:{C:1}}&amp;quot; pattern=&amp;quot;^block$&amp;quot; /&amp;gt;&lt;br /&gt;              &amp;lt;add input=&amp;quot;{REQUEST_FILENAME}&amp;quot; pattern=&amp;quot;splog.png&amp;quot; negate=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;          &amp;lt;/conditions&amp;gt;&lt;br /&gt;          &amp;lt;action type=&amp;quot;Redirect&amp;quot; url=&amp;quot;http://www.hanselman.com/images/splog.png&amp;quot; appendQueryString=&amp;quot;false&amp;quot; redirectType=&amp;quot;Temporary&amp;quot;/&amp;gt;&lt;br /&gt;      &amp;lt;/rule&amp;gt;&lt;br /&gt;    &amp;lt;/rules&amp;gt;&lt;br /&gt;    &amp;lt;rewriteMaps&amp;gt;&lt;br /&gt;              &amp;lt;rewriteMap name=&amp;quot;DomainsBlackList&amp;quot; defaultValue=&amp;quot;allow&amp;quot;&amp;gt;&lt;br /&gt;                  &amp;lt;add key=&amp;quot;google-chrome-browser.com&amp;quot; value=&amp;quot;block&amp;quot; /&amp;gt;&lt;br /&gt;                  &amp;lt;add key=&amp;quot;www.verybadguy.com&amp;quot; value=&amp;quot;block&amp;quot; /&amp;gt;&lt;br /&gt;                  &amp;lt;add key=&amp;quot;www.superbadguy.com&amp;quot; value=&amp;quot;block&amp;quot; /&amp;gt;&lt;br /&gt;              &amp;lt;/rewriteMap&amp;gt;&lt;br /&gt;    &amp;lt;/rewriteMaps&amp;gt;&lt;br /&gt;  &amp;lt;/rewrite&amp;gt;&lt;br /&gt;&amp;lt;/system.webServer&amp;gt;&lt;/pre&gt;
&lt;p&gt;I could have just made a single rule and put this bad domain in it but it would have only worked for one domain, so instead my buddy Ruslan suggested that I make a rewritemap and refer to it from the rule. This way I can add more domains to block as the evil spreads.&lt;/p&gt;
&lt;p&gt;It was important to exclude the splog.png file that I am going to redirect the bad guy to, otherwise I&apos;ll get into a redirect loop where I redirect requests for the splog.png back to itself!&lt;/p&gt;
&lt;p&gt;The result is effective. If you visit their site, I&apos;ll issue an HTTP 307 (Moved Temporarily) and then you&apos;ll see my splog.png image everywhere that they&apos;ve hotlinked my image.&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Not cool, splogger, not cool.&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;Not cool, splogger, not cool.&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Blogging-Image-Leeching-and-Evil-Splogge_93A2/image_5.png&quot; width=&quot;780&quot; height=&quot;631&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If you wanted to change the blacklist to a white list, you&apos;d reverse the values of allow and block in the rewrite map:&lt;/p&gt;
&lt;pre class=&quot;brush: xml; gutter: false; toolbar: false; auto-links: false;&quot;&gt;&amp;lt;rewriteMaps&amp;gt;&lt;br /&gt;    &amp;lt;rewriteMap name=&amp;quot;DomainsBlackList&amp;quot; defaultValue=&amp;quot;block&amp;quot;&amp;gt; &lt;br /&gt;        &amp;lt;add key=&amp;quot;google-chrome-browser.com&amp;quot; value=&amp;quot;allow&amp;quot; /&amp;gt;&lt;br /&gt;        &amp;lt;add key=&amp;quot;www.verybadguy.com&amp;quot; value=&amp;quot;allow&amp;quot; /&amp;gt; &lt;br /&gt;        &amp;lt;add key=&amp;quot;www.superbadguy.com&amp;quot; value=&amp;quot;allow&amp;quot; /&amp;gt;&lt;br /&gt;    &amp;lt;/rewriteMap&amp;gt;  &lt;br /&gt;&amp;lt;/rewriteMaps&amp;gt;&lt;/pre&gt;
&lt;p&gt;Nice, simple and clean. I don&apos;t plan on playing &amp;quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Whac-A-Mole&quot;&gt;whac a mole&lt;/a&gt;&amp;quot; with sploggers as it&apos;s a losing game, but I will bring down the ban-hammer on particularly obnoxious examples of content theft, especially when they mess with my Google Juice.&lt;/p&gt;&lt;br/&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. &lt;br/&gt;&lt;/div&gt;
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/41895192/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/41895192/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/41895192/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/41895192/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/41895192/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=cd345b14-02d2-4302-8187-c1fe3f5d94e7</comments>
      <category>IIS</category><content:encoded>&lt;div&gt;&lt;p&gt;I recently discovered that a blog called (seriously) &amp;quot;Google Chrome Browser&amp;quot; was &lt;strong&gt;reblogging &lt;/strong&gt;my site. (It of course has NO relationship to Google or the lovely folks on the Chrome team.) &lt;/p&gt;  &lt;p&gt;This is a splog or &amp;quot;spam blog.&amp;quot; It&apos;s less of a blog and more of a &apos;suck your feed in and reblog it.&apos; Basically every post is duplicated or sucked in via RSS from somewhere else.&amp;#160; I get this many times a week and have for years.&lt;/p&gt;  &lt;p&gt;However, this particular site started showing up ahead of mine in searches and that&apos;s not cool.&lt;/p&gt;  &lt;p&gt;&lt;img title=&quot;You evil bastards.&quot; style=&quot;display: inline&quot; alt=&quot;You evil bastards.&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Blogging-Image-Leeching-and-Evil-Splogge_93A2/image_6.png&quot; width=&quot;483&quot; height=&quot;243&quot; /&gt;&lt;/p&gt;  &lt;p&gt;Worse yet, they have almost 25k followers on Twitter. I&apos;ve asked them a few times to stop doing this, but this time I got tired of it.&lt;/p&gt;  &lt;p&gt;They&apos;re even &apos;hotlinking&apos; my images, which means that all my PNGs are still hosted on my site. When you visit their site, the text is from my RSS but I pay for the images bandwidth. The irony of this is thick. Not to mention my copyright notice is intact on their site. ;)&lt;/p&gt;  &lt;p&gt;When an image is linked to from another domain the HTTP_REFERER header is populated with the location that the image is linked from. That means when my web server gets a request for &apos;foo.png&apos; from the Google Chrome Browser blog I can see the page that asked for that image. &lt;/p&gt;  &lt;p&gt;For example:&lt;/p&gt;  &lt;pre&gt;Request URL:http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/How-to-run-a-Virtual-Conference-for-10_E53C/image_5.png
&lt;br&gt;Request Method:GET
&lt;br&gt;Referer:http://google-chrome-browser.com/penny-pinching-cloud-how-run-two-day-virtual-conference-10&lt;/pre&gt;
&lt;p&gt;Because this differentiates the GET request that means I can do something about it. This brings up a few important things to remember in general about the web that I feel a lot of programmers forget about:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.hanselman.com/blog/TheInternetIsNotABlackBoxLookInside.aspx&quot;&gt;The Internet is not a black box&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;You can do something about it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That said, I want to detect these requests and serve a different image. &lt;/p&gt;
&lt;p&gt;If I was using Apache and had an .htaccess file, I might do this:&lt;/p&gt;
&lt;pre&gt;RewriteCond %{HTTP:Referer} ^.*http://(?:www\.)?computersblogsexample.info.*$
&lt;br&gt;RewriteHeader Referer: .* damn\.spammers
&lt;br&gt;
&lt;br&gt;RewriteCond %{HTTP:Referer} ^.*http://(?:www\.)?google-chrome-browser.*$
&lt;br&gt;RewriteHeader Referer: .* damn\.spammers
&lt;br&gt;
&lt;br&gt;#make more of these for each evil spammer
&lt;br&gt;
&lt;br&gt;RewriteCond %{HTTP:Referer} ^.*damn\.spammers.*$
&lt;br&gt;RewriteRule ^.*\.(?:gif|jpg|png)$ /images/splog.png [NC,L]&lt;/pre&gt;
&lt;p&gt;Since I&apos;m using IIS, I&apos;ll do similar rewrites in my web.config. I could do a whitelist where I only allow hotlinking from a few places, or a blacklist where I only block a few folks. Here&apos;s a blacklist.&lt;/p&gt;
&lt;pre class=&quot;brush: xml; gutter: false; toolbar: false; auto-links: false;&quot;&gt;&amp;lt;system.webServer&amp;gt;
&lt;br&gt;  &amp;lt;rewrite&amp;gt;
&lt;br&gt;    &amp;lt;rules&amp;gt;
&lt;br&gt;      &amp;lt;rule name=&amp;quot;Blacklist block&amp;quot; stopProcessing=&amp;quot;true&amp;quot;&amp;gt;
&lt;br&gt;          &amp;lt;match url=&amp;quot;(?:jpg|jpeg|png|gif|bmp)$&amp;quot; /&amp;gt;
&lt;br&gt;          &amp;lt;conditions&amp;gt;
&lt;br&gt;              &amp;lt;add input=&amp;quot;{HTTP_REFERER}&amp;quot; pattern=&amp;quot;^https?://(.+?)/.*$&amp;quot; /&amp;gt;
&lt;br&gt;              &amp;lt;add input=&amp;quot;{DomainsBlackList:{C:1}}&amp;quot; pattern=&amp;quot;^block$&amp;quot; /&amp;gt;
&lt;br&gt;              &amp;lt;add input=&amp;quot;{REQUEST_FILENAME}&amp;quot; pattern=&amp;quot;splog.png&amp;quot; negate=&amp;quot;true&amp;quot; /&amp;gt;
&lt;br&gt;          &amp;lt;/conditions&amp;gt;
&lt;br&gt;          &amp;lt;action type=&amp;quot;Redirect&amp;quot; url=&amp;quot;http://www.hanselman.com/images/splog.png&amp;quot; appendQueryString=&amp;quot;false&amp;quot; redirectType=&amp;quot;Temporary&amp;quot;/&amp;gt;
&lt;br&gt;      &amp;lt;/rule&amp;gt;
&lt;br&gt;    &amp;lt;/rules&amp;gt;
&lt;br&gt;    &amp;lt;rewriteMaps&amp;gt;
&lt;br&gt;              &amp;lt;rewriteMap name=&amp;quot;DomainsBlackList&amp;quot; defaultValue=&amp;quot;allow&amp;quot;&amp;gt;
&lt;br&gt;                  &amp;lt;add key=&amp;quot;google-chrome-browser.com&amp;quot; value=&amp;quot;block&amp;quot; /&amp;gt;
&lt;br&gt;                  &amp;lt;add key=&amp;quot;www.verybadguy.com&amp;quot; value=&amp;quot;block&amp;quot; /&amp;gt;
&lt;br&gt;                  &amp;lt;add key=&amp;quot;www.superbadguy.com&amp;quot; value=&amp;quot;block&amp;quot; /&amp;gt;
&lt;br&gt;              &amp;lt;/rewriteMap&amp;gt;
&lt;br&gt;    &amp;lt;/rewriteMaps&amp;gt;
&lt;br&gt;  &amp;lt;/rewrite&amp;gt;
&lt;br&gt;&amp;lt;/system.webServer&amp;gt;&lt;/pre&gt;
&lt;p&gt;I could have just made a single rule and put this bad domain in it but it would have only worked for one domain, so instead my buddy Ruslan suggested that I make a rewritemap and refer to it from the rule. This way I can add more domains to block as the evil spreads.&lt;/p&gt;
&lt;p&gt;It was important to exclude the splog.png file that I am going to redirect the bad guy to, otherwise I&apos;ll get into a redirect loop where I redirect requests for the splog.png back to itself!&lt;/p&gt;
&lt;p&gt;The result is effective. If you visit their site, I&apos;ll issue an HTTP 307 (Moved Temporarily) and then you&apos;ll see my splog.png image everywhere that they&apos;ve hotlinked my image.&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Not cool, splogger, not cool.&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;Not cool, splogger, not cool.&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/Blogging-Image-Leeching-and-Evil-Splogge_93A2/image_5.png&quot; width=&quot;780&quot; height=&quot;631&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If you wanted to change the blacklist to a white list, you&apos;d reverse the values of allow and block in the rewrite map:&lt;/p&gt;
&lt;pre class=&quot;brush: xml; gutter: false; toolbar: false; auto-links: false;&quot;&gt;&amp;lt;rewriteMaps&amp;gt;
&lt;br&gt;    &amp;lt;rewriteMap name=&amp;quot;DomainsBlackList&amp;quot; defaultValue=&amp;quot;block&amp;quot;&amp;gt; 
&lt;br&gt;        &amp;lt;add key=&amp;quot;google-chrome-browser.com&amp;quot; value=&amp;quot;allow&amp;quot; /&amp;gt;
&lt;br&gt;        &amp;lt;add key=&amp;quot;www.verybadguy.com&amp;quot; value=&amp;quot;allow&amp;quot; /&amp;gt; 
&lt;br&gt;        &amp;lt;add key=&amp;quot;www.superbadguy.com&amp;quot; value=&amp;quot;allow&amp;quot; /&amp;gt;
&lt;br&gt;    &amp;lt;/rewriteMap&amp;gt;  
&lt;br&gt;&amp;lt;/rewriteMaps&amp;gt;&lt;/pre&gt;
&lt;p&gt;Nice, simple and clean. I don&apos;t plan on playing &amp;quot;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~en.wikipedia.org/wiki/Whac-A-Mole&quot;&gt;whac a mole&lt;/a&gt;&amp;quot; with sploggers as it&apos;s a losing game, but I will bring down the ban-hammer on particularly obnoxious examples of content theft, especially when they mess with my Google Juice.&lt;/p&gt;
&lt;br&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. 
&lt;br&gt;&lt;/div&gt;&lt;Img align=&quot;left&quot; border=&quot;0&quot; height=&quot;1&quot; width=&quot;1&quot; style=&quot;border:0;float:left;margin:0;padding:0&quot; hspace=&quot;0&quot; src=&quot;http://feeds.hanselman.com/~/i/41895192/0/scotthanselman&quot;&gt;

&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/41895192/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/41895192/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/41895192/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/41895192/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/41895192/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded></item>
<item>
<feedburner:origLink>http://www.hanselman.com/blog/HanselmansNewsletterOfWonderfulThingsMay13th2013.aspx</feedburner:origLink>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=e1c8456f-f301-469b-9120-25cbc5bde862</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=e1c8456f-f301-469b-9120-25cbc5bde862</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=e1c8456f-f301-469b-9120-25cbc5bde862</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=e1c8456f-f301-469b-9120-25cbc5bde862</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <title>Hanselman's Newsletter of Wonderful Things: May 13th, 2013</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=e1c8456f-f301-469b-9120-25cbc5bde862</guid>
      <link>http://feeds.hanselman.com/~/41891041/0/scotthanselman~Hanselmans-Newsletter-of-Wonderful-Things-May-th.aspx</link>
      <pubDate>Mon, 03 Jun 2013 17:04:25 GMT</pubDate>
      <description>&lt;div&gt;&lt;p&gt;I have a &amp;quot;whenever I get around to doing it&amp;quot; &lt;a href=&quot;http://hanselman.com/newsletter&quot;&gt;Newsletter of Wonderful Things&lt;/a&gt;. Why a newsletter? I dunno. It seems more personal somehow. Fight me.&lt;/p&gt;  &lt;p&gt;You can &lt;a href=&quot;http://www.hanselman.com/blog/CategoryView.aspx?category=Newsletter&quot;&gt;view all the previous newsletters here&lt;/a&gt;. You can sign up here &lt;a href=&quot;http://hanselman.com/newsletter&quot;&gt;Newsletter of Wonderful Things&lt;/a&gt; or just wait and get them later on the blog, which &lt;a href=&quot;http://feeds.hanselman.com/ScottHanselman&quot;&gt;hopefully you have subscribed to&lt;/a&gt;. Email folks get it first!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Here&apos;s the newsletter that I sent out May 13th. &lt;/strong&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;Hi Interfriends,&lt;/p&gt;  &lt;p&gt;Thanks again for signing up for this experiment. Here&apos;s some interesting things I&apos;ve come upon this week. If you forwarded this (or if it was forwarded to you) a reminder: You can sign up at &lt;a href=&quot;http://hanselman.com/newsletter&quot;&gt;http://hanselman.com/newsletter&lt;/a&gt; and the &lt;a href=&quot;http://www.hanselman.com/blog/CategoryView.aspx?category=Newsletter&quot;&gt;archive of all previous Newsletters is here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Remember, you get the newsletter here first. This one will be posted to the blog as an archive in a few weeks. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Tony Stark is the &lt;a href=&quot;http://www.npr.org/blogs/monkeysee/2013/05/06/181560276/armor-and-angst-tony-stark-is-the-new-captain-america&quot;&gt;new Captain America&lt;/a&gt;, they say. &lt;/li&gt;    &lt;li&gt;I bought a Pebble Watch. I &lt;a href=&quot;http://www.hanselman.com/blog/SmartWatchesAreFinallyGoingToHappenPebbleWatchReviewed.aspx&quot;&gt;think smartwatches are finally going to happen&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;Fascinating writup by John Carmack of Doom fame &lt;a href=&quot;http://www.idsoftware.com/iphone-games/wolfenstein-3d-classic-platinum/wolfdevelopment.htm&quot;&gt;about porting Wolfenstein 3D to the iPhone&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://stereopsis.com/flux/&quot;&gt;f.lux free software&lt;/a&gt; will change the color temperature of your monitor to match the ambiant light and time of day based on your location and the season. What is this sorcery? &lt;/li&gt;    &lt;li&gt;This guy is &lt;a href=&quot;http://www.huffingtonpost.com/2013/05/07/guy-dancing-on-a-treadmil_n_3228585.html&quot;&gt;dancing on a treadmill&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;Should you feel guilty when you over-sleep? Here&apos;s one person who says no, and &lt;a href=&quot;http://42floors.com/blog/you-dont-have-to-feel-guilty-for-over-sleeping/&quot;&gt;explains why&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;What does &lt;a href=&quot;http://dangrover.github.io/sf-transit-inequality/#&quot;&gt;economic inequality look like&lt;/a&gt; when charted against transit lines in the Bay Area? &lt;/li&gt;    &lt;li&gt;Potentially &lt;a href=&quot;http://jonobr1.github.io/two.js/&quot;&gt;amazing 2D drawing API for JavaScript&lt;/a&gt; called two.js. &lt;/li&gt;    &lt;li&gt;It&apos;s all &lt;a href=&quot;http://turnstylenews.com/2013/04/16/lighting-is-an-underestimated-art/&quot;&gt;about the lighting&lt;/a&gt;, not your camera. &lt;/li&gt;    &lt;li&gt;This video of a &lt;a href=&quot;http://www.youtube.com/watch?v=pAC5SeNH8jw&amp;amp;feature=youtu.be&quot;&gt;dude&apos;s 90 year old grandma trying a VR helmet&lt;/a&gt; has sold me on it. TAKE MY MONEY. &lt;/li&gt;    &lt;li&gt;Here&apos;s a lovely &lt;a href=&quot;http://robey.lag.net/2010/06/21/mensch-font.html&quot;&gt;monospaced font called Mensch&lt;/a&gt; that looks good for coding. &lt;/li&gt;    &lt;li&gt;Are you watching Scandal? It&apos;s &lt;a href=&quot;http://touch.latimes.com/#section/-1/article/p2p-75866005/&quot;&gt;must-Tweet TV&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;Why do &lt;a href=&quot;http://smerity.com/articles/2013/animated_gif.html&quot;&gt;Animated Gifs work like they do&lt;/a&gt;?&amp;#160; &lt;/li&gt;    &lt;li&gt;Speaking of Gifs, did you know you can make a gif with more than 256 colors? Each &lt;a href=&quot;http://phil.ipal.org/tc.html&quot;&gt;frame of an animation can be a different 256&lt;/a&gt;! &lt;/li&gt;    &lt;li&gt;It&apos;s been 10 years since &amp;quot;Star Wars Kid&amp;quot; went viral. &lt;a href=&quot;http://www2.macleans.ca/2013/05/09/10-years-later-the-star-wars-kid-speaks-out/&quot;&gt;Is he OK&lt;/a&gt;? &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Scott Hanselman &lt;/p&gt;  &lt;p&gt;(BTW, since you *love* email you can subscribe to my blog via email here: &lt;a href=&quot;http://feeds.hanselman.com/ScottHanselman&quot;&gt;http://feeds.hanselman.com/ScottHanselman&lt;/a&gt; DO IT!)&lt;/p&gt;  &lt;p&gt;P.P.S. You know you can forward this to your friends, right? &lt;/p&gt;&lt;br/&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. &lt;br/&gt;&lt;/div&gt;
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/41891041/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/41891041/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/41891041/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/41891041/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/41891041/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=e1c8456f-f301-469b-9120-25cbc5bde862</comments>
      <category>Newsletter</category><content:encoded>&lt;div&gt;&lt;p&gt;I have a &amp;quot;whenever I get around to doing it&amp;quot; &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~hanselman.com/newsletter&quot;&gt;Newsletter of Wonderful Things&lt;/a&gt;. Why a newsletter? I dunno. It seems more personal somehow. Fight me.&lt;/p&gt;  &lt;p&gt;You can &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.hanselman.com/blog/CategoryView.aspx?category=Newsletter&quot;&gt;view all the previous newsletters here&lt;/a&gt;. You can sign up here &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~hanselman.com/newsletter&quot;&gt;Newsletter of Wonderful Things&lt;/a&gt; or just wait and get them later on the blog, which &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~feeds.hanselman.com/ScottHanselman&quot;&gt;hopefully you have subscribed to&lt;/a&gt;. Email folks get it first!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Here&apos;s the newsletter that I sent out May 13th. &lt;/strong&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;Hi Interfriends,&lt;/p&gt;  &lt;p&gt;Thanks again for signing up for this experiment. Here&apos;s some interesting things I&apos;ve come upon this week. If you forwarded this (or if it was forwarded to you) a reminder: You can sign up at &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~hanselman.com/newsletter&quot;&gt;http://hanselman.com/newsletter&lt;/a&gt; and the &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.hanselman.com/blog/CategoryView.aspx?category=Newsletter&quot;&gt;archive of all previous Newsletters is here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Remember, you get the newsletter here first. This one will be posted to the blog as an archive in a few weeks. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Tony Stark is the &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.npr.org/blogs/monkeysee/2013/05/06/181560276/armor-and-angst-tony-stark-is-the-new-captain-america&quot;&gt;new Captain America&lt;/a&gt;, they say. &lt;/li&gt;    &lt;li&gt;I bought a Pebble Watch. I &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.hanselman.com/blog/SmartWatchesAreFinallyGoingToHappenPebbleWatchReviewed.aspx&quot;&gt;think smartwatches are finally going to happen&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;Fascinating writup by John Carmack of Doom fame &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.idsoftware.com/iphone-games/wolfenstein-3d-classic-platinum/wolfdevelopment.htm&quot;&gt;about porting Wolfenstein 3D to the iPhone&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~stereopsis.com/flux/&quot;&gt;f.lux free software&lt;/a&gt; will change the color temperature of your monitor to match the ambiant light and time of day based on your location and the season. What is this sorcery? &lt;/li&gt;    &lt;li&gt;This guy is &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.huffingtonpost.com/2013/05/07/guy-dancing-on-a-treadmil_n_3228585.html&quot;&gt;dancing on a treadmill&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;Should you feel guilty when you over-sleep? Here&apos;s one person who says no, and &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~42floors.com/blog/you-dont-have-to-feel-guilty-for-over-sleeping/&quot;&gt;explains why&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;What does &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~dangrover.github.io/sf-transit-inequality/#&quot;&gt;economic inequality look like&lt;/a&gt; when charted against transit lines in the Bay Area? &lt;/li&gt;    &lt;li&gt;Potentially &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~jonobr1.github.io/two.js/&quot;&gt;amazing 2D drawing API for JavaScript&lt;/a&gt; called two.js. &lt;/li&gt;    &lt;li&gt;It&apos;s all &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~turnstylenews.com/2013/04/16/lighting-is-an-underestimated-art/&quot;&gt;about the lighting&lt;/a&gt;, not your camera. &lt;/li&gt;    &lt;li&gt;This video of a &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.youtube.com/watch?v=pAC5SeNH8jw&amp;amp;feature=youtu.be&quot;&gt;dude&apos;s 90 year old grandma trying a VR helmet&lt;/a&gt; has sold me on it. TAKE MY MONEY. &lt;/li&gt;    &lt;li&gt;Here&apos;s a lovely &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~robey.lag.net/2010/06/21/mensch-font.html&quot;&gt;monospaced font called Mensch&lt;/a&gt; that looks good for coding. &lt;/li&gt;    &lt;li&gt;Are you watching Scandal? It&apos;s &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~touch.latimes.com/#section/-1/article/p2p-75866005/&quot;&gt;must-Tweet TV&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;Why do &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~smerity.com/articles/2013/animated_gif.html&quot;&gt;Animated Gifs work like they do&lt;/a&gt;?&amp;#160; &lt;/li&gt;    &lt;li&gt;Speaking of Gifs, did you know you can make a gif with more than 256 colors? Each &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~phil.ipal.org/tc.html&quot;&gt;frame of an animation can be a different 256&lt;/a&gt;! &lt;/li&gt;    &lt;li&gt;It&apos;s been 10 years since &amp;quot;Star Wars Kid&amp;quot; went viral. &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www2.macleans.ca/2013/05/09/10-years-later-the-star-wars-kid-speaks-out/&quot;&gt;Is he OK&lt;/a&gt;? &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Scott Hanselman &lt;/p&gt;  &lt;p&gt;(BTW, since you *love* email you can subscribe to my blog via email here: &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~feeds.hanselman.com/ScottHanselman&quot;&gt;http://feeds.hanselman.com/ScottHanselman&lt;/a&gt; DO IT!)&lt;/p&gt;  &lt;p&gt;P.P.S. You know you can forward this to your friends, right? &lt;/p&gt;
&lt;br&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. 
&lt;br&gt;&lt;/div&gt;&lt;Img align=&quot;left&quot; border=&quot;0&quot; height=&quot;1&quot; width=&quot;1&quot; style=&quot;border:0;float:left;margin:0;padding:0&quot; hspace=&quot;0&quot; src=&quot;http://feeds.hanselman.com/~/i/41891041/0/scotthanselman&quot;&gt;

&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/41891041/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/41891041/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/41891041/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/41891041/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/41891041/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded></item>
<item>
<feedburner:origLink>http://www.hanselman.com/blog/IsTheWindowsUserReadyForAptget.aspx</feedburner:origLink>
      <trackback:ping>http://www.hanselman.com/blog/Trackback.aspx?guid=9a5d6df6-816a-4674-a919-696c75f1dfb4</trackback:ping>
      <pingback:server>http://www.hanselman.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.hanselman.com/blog/PermaLink.aspx?guid=9a5d6df6-816a-4674-a919-696c75f1dfb4</pingback:target>
      <dc:creator>Scott Hanselman</dc:creator>
      <wfw:comment>http://www.hanselman.com/blog/CommentView.aspx?guid=9a5d6df6-816a-4674-a919-696c75f1dfb4</wfw:comment>
      <wfw:commentRss>http://www.hanselman.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=9a5d6df6-816a-4674-a919-696c75f1dfb4</wfw:commentRss>
      <slash:comments>87</slash:comments>
      <title>Is the Windows user ready for apt-get?</title>
      <guid isPermaLink="false">http://www.hanselman.com/blog/PermaLink.aspx?guid=9a5d6df6-816a-4674-a919-696c75f1dfb4</guid>
      <link>http://feeds.hanselman.com/~/41661896/0/scotthanselman~Is-the-Windows-user-ready-for-aptget.aspx</link>
      <pubDate>Tue, 28 May 2013 08:16:12 GMT</pubDate>
      <description>&lt;div&gt;&lt;figure&gt;&lt;a href=&quot;http://www.chocolatey.org&quot;&gt;&lt;img title=&quot;Chocolatey installs Git&quot; style=&quot;display: inline&quot; alt=&quot;Chocolatey installs Git&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/b28963c18c60_14FBE/image_6.png&quot; width=&quot;999&quot; height=&quot;308&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;   &lt;h3&gt;What it does&lt;/h3&gt;  &lt;p&gt;Chocolatey lets you install Windows applications quickly from the command line via a central catalog of installation scripts. You could install Git, 7Zip or even Microsoft Office (given a key.) The idea is seamless and quiet installations using a well-known key. &lt;/p&gt;  &lt;p&gt;For example, once installed you can do this from and command line:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;cinst git &lt;/li&gt;    &lt;li&gt;cinst 7zip &lt;/li&gt;    &lt;li&gt;cinst ruby &lt;/li&gt;    &lt;li&gt;cinst vlc&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;That&apos;s basically it.&lt;/p&gt;  &lt;p&gt;The catalog has grown so complete, in fact, that I recently wanted to install DosBox so I could play Zork. I took and chance and just &amp;quot;cinst dosbox&amp;quot; and it worked. THAT is a the promise that Chocolatey makes.&lt;/p&gt;  &lt;h3&gt;Getting Started with Chocolatey&lt;/h3&gt;  &lt;p&gt;You can get started by first installing the Chocolatey package manager. Copy paste this line to your command line and run it. (More on the fearfulness of this first step in a moment).&lt;/p&gt;  &lt;pre&gt;@powershell -NoProfile -ExecutionPolicy unrestricted -Command &amp;quot;iex ((new-object net.webclient).DownloadString(&apos;https://chocolatey.org/install.ps1&apos;))&amp;quot; &amp;amp;&amp;amp; SET PATH=%PATH%;%systemdrive%\chocolatey\bin&lt;/pre&gt;
&lt;p&gt;Presumably you like to know what command line stuff is going to do to your computer before you do it, so parse this line out. It&apos;s going to launch PowerShell to do the hard work. Nearly every Windows machine has PowerShell these days, and it&apos;s PowerShell that makes Chocolatey work.&lt;/p&gt;
&lt;p&gt;Some folks have custom profiles so the -NoProfile switch suppresses custom profiles to prevent conflicts during installation. It launches a chunk of PowerShell script that it downloads from https://chocolatey.org/install.ps1/ then executes. Note that it&apos;s setting execution policy to unrestricted to do this. To be clear, it&apos;s executing code downloaded over the web, so there is a non-zero risk there. It then adds Chocolatey to your path (for this one prompt) so you can use it immediately. It&apos;ll be added to future instances of prompts automatically.&lt;/p&gt;
&lt;p&gt;Look at &lt;a href=&quot;https://chocolatey.org/install.ps1&quot;&gt;https://chocolatey.org/install.ps1&lt;/a&gt; now. It&apos;s a very clean and easy to read script. It downloads the Chocolatey installation zip file (which is actually a NuGet package), unzips it and continues the installation by running a scripts in the tools section of the package. &lt;/p&gt;
&lt;h3&gt;How it works &lt;/h3&gt;
&lt;p&gt;Chocolatey is a bootstrapper that uses PowerShell scripts and the &lt;a href=&quot;http://www.nuget.org&quot;&gt;NuGet&lt;/a&gt; packaging format to install apps for you. NuGet is the package management system that Windows Developers use to bring libraries down at the &lt;em&gt;project level&lt;/em&gt;. Chocolatey (get it? Chocolatey Nu-Get?) extends that concept to bring applications down at the &lt;em&gt;system level. &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Today if you want to get 7Zip, you usually google for it, find the site, figure out the latest version or right version for your system, download it, run it, next next next finish and maybe add it to your path. Chocolatey does that for you.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Again, NuGet is libraries installed locally for projects, Chocolatey is applications installed globally for your whole system.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Chocolatey uses PowerShell scripts (that you never have to think about) that package developers use to chain installations and build dependency trees. Take the internals of a Git installation script for example:&lt;/p&gt;
&lt;pre class=&quot;brush: ps; toolbar: false; auto-links: false;&quot;&gt;try {&lt;br /&gt;  Install-ChocolateyPackage &apos;git.install&apos; &apos;exe&apos; &apos;/VERYSILENT&apos; &apos;http://msysgit.googlecode.com/files/Git-1.8.1.2-preview20130201.exe&apos;&lt;br /&gt;&lt;br /&gt;  #------- ADDITIONAL SETUP -------#&lt;br /&gt;  $is64bit = (Get-WmiObject Win32_Processor).AddressWidth -eq 64&lt;br /&gt;  $programFiles = $env:programfiles&lt;br /&gt;  if ($is64bit) {$programFiles = ${env:ProgramFiles(x86)}}&lt;br /&gt;  $gitPath = Join-Path $programFiles &apos;Git\cmd&apos;&lt;br /&gt;&lt;br /&gt;  Install-ChocolateyPath $gitPath &apos;user&apos;&lt;br /&gt;&lt;br /&gt;@&amp;quot;&lt;br /&gt;&lt;br /&gt;Making GIT core.autocrlf false&lt;br /&gt;&amp;quot;@ | Write-Host&lt;br /&gt;&lt;br /&gt;  #make GIT core.autocrlf false&lt;br /&gt;  &amp;amp; &amp;quot;$env:comspec&amp;quot; &apos;/c git config --global core.autocrlf false&apos;&lt;br /&gt;&lt;br /&gt;  Write-ChocolateySuccess &apos;git.install&apos;&lt;br /&gt;} catch {&lt;br /&gt;  Write-ChocolateyFailure &apos;git.install&apos; $($_.Exception.Message)&lt;br /&gt;  throw&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;The most important part for you to take away here is the first line. Note that this Chocolatey script is downloading Git &lt;strong&gt;from the mSysGit Site. &lt;/strong&gt;Chocolatey is not changing installers, making installers or hosting installers. It&apos;s automating the boring parts of getting software, but it&apos;s still getting that software from the same location as always.&lt;/p&gt;
&lt;h3&gt;Advanced Stuff&lt;/h3&gt;
&lt;p&gt;Once you learn the basics - and they&apos;re pretty basic - there&apos;s more depth to Chocolatey to explore. Beyond the cinst and cuninst there&apos;s other commands to make installing stuff on Windows easier. Remember, they&apos;re all in your PATH so you can call these commands anytime.&lt;/p&gt;
&lt;p&gt;Each of these major sources can be called with cinst using the -source parameter like &amp;quot;cinst IISExpress - source WebPI&amp;quot; or using their own aliases for simplicity as shown below.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;cwindowsfeatures&lt;/strong&gt; - If you&apos;ve ever opened Add/Remove programs then click Install Windows Features in order to setup IIS or Hyper-V then this command is for you. Some examples: 
    &lt;ul&gt;
      &lt;li&gt;cwindowsfeatures&amp;#160; IIS-WebServerRole &lt;/li&gt;
      &lt;li&gt;cwindowsfeatures Microsoft-Hyper-V-All &lt;/li&gt;
      &lt;li&gt;cwindowsfeatures TelnetClient 
        &lt;ul&gt;
          &lt;li&gt;Plus, you can always clist -source windowsfeatures for the complete list.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;cwebpi - &lt;/strong&gt;The Web Platform Installer is a great GUI for downloading any development tools you might need for Web Development on Windows. It&apos;s a catalog, an installer, and a chainer. There&apos;s also a command-line version of WebPI that Chocolatey integrates with so you can: 
    &lt;ul&gt;
      &lt;li&gt;cwebpi IISExpress &lt;/li&gt;
      &lt;li&gt;cwebpi VWDOrVs11AzurePack_2_0 
        &lt;ul&gt;
          &lt;li&gt;And again, clist -source webpi gets you a list of what you can do. &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&apos;s a more complete list at the &lt;a href=&quot;https://github.com/chocolatey/chocolatey/wiki/CommandsReference&quot;&gt;Chocolatey Commands Reference&lt;/a&gt; including how it integrates with Cygwin, Gems and Python.&lt;/p&gt;
&lt;h3&gt;Security Issues&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.chocolatey.org&quot;&gt;&lt;img title=&quot;nugetlogo&quot; style=&quot;float: right; display: inline&quot; alt=&quot;nugetlogo&quot; align=&quot;right&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/b28963c18c60_14FBE/nugetlogo_3.png&quot; width=&quot;345&quot; height=&quot;75&quot; /&gt;&lt;/a&gt;This is a prickly one. How do you make a system that lets you install anything directly from the Internet quickly, cleanly, and easily without, well, installing something evil directly from the Internet? You&apos;ll want the communication with the server to be secure and the packages trusted, but you&apos;ll also want to make sure the packages haven&apos;t been tampered with since they were uploaded. There&apos;s the inevitable threat of a man-in-the-middle attack. You&apos;ll want to watch for malicious packages and enable quick takedowns if one sneaks by. &lt;/p&gt;
&lt;p&gt;Security concerns aren&apos;t unique to Chocolatey, of course. They are a part of package repositories since their inception. The node npm repository had a security breach in March of 2012, and &lt;a href=&quot;http://blog.andyet.com/2012/mar/8/compromising-the-integrity-of-the-npm-registry/&quot;&gt;the folks at andyet explored the issues surrounding it&lt;/a&gt;, but also pointed out that personal responsibility has to have a role as well.&lt;/p&gt;
&lt;p&gt;Linux&apos;s apt-get solves much of this with appropriate uses of cryptography and best practices that can (and should) be emulated. Packages in apt repos are signed with SecureApp, there are warnings if you&apos;re using a 3rd party repo or installing an unsigned package.&lt;/p&gt;
&lt;p&gt;The Chocolatey team has been very quick to jump on security issues and they are very approachable. They&apos;ve added SSL where appropriate and are aware of the work to come. If Chocolatey gets big (bandwidth and costs is a question in my mind) perhaps a non-profit organization would step in to help with not only costs, but also security audits and best practices.&lt;/p&gt;
&lt;p&gt;Here&apos;s some &lt;a href=&quot;https://groups.google.com/forum/?fromgroups#!topic/chocolatey/5p8l7WRsh9c&quot;&gt;points (edited for length by me) from a post from Chocolatey&apos;s lead, Rob in a post on their mailing list, also in march of 2012&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Security has a big future aspect of chocolatey. At the present I am the curator and I every day I get an email showing me all of the new packages that went in the day before. I look at all packages from new authors and I typically look at the first version of most new packages from authors I have good contacts with. &lt;/p&gt;
  &lt;p&gt;I&apos;ve talked at length with others about having a moderated feed in the aspect of every package, every new version would be approved prior to showing up on the main feed. I am paying attention to how debian does things with multiple feeds and there are thoughts to move in that direction as well. &lt;/p&gt;
  &lt;p&gt;Security? In the future we are looking at a small group of folks be an approving body for nupkgs. We also talked about showing the hash for the nupkg, and possibly letting folks specify a hash for the installers so chocolatey can verify the things it downloads prior to execution.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img title=&quot;Chocolatey&amp;#39;s LIB folder&quot; style=&quot;float: right; display: inline&quot; alt=&quot;Chocolatey&amp;#39;s LIB folder&quot; align=&quot;right&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/b28963c18c60_14FBE/image_5.png&quot; width=&quot;298&quot; height=&quot;456&quot; /&gt;Could I make a Chocolatey package called &amp;quot;FormatMyHardDrive?&amp;quot; Sure I could, just like I could ask you to open an admin prompt and format c: /q, but you won&apos;t, right? ;)&lt;/p&gt;
&lt;h3&gt;What&apos;s next?&lt;/h3&gt;
&lt;p&gt;Chocolatey is clearly not meant to be used by your &amp;quot;Gender Non-Specific Non-Technical Parent&amp;quot; and it does have some &amp;quot;competition&amp;quot; in the form of the &lt;a href=&quot;http://www.ninite.com/&quot;&gt;Ninite GUI installation utility&lt;/a&gt;. While still not for the average Joe/Jane and having only a limited catalog, Ninite does fill a gap for the super-user to quickly get the common apps and utilities they want. &lt;/p&gt;
&lt;p&gt;Additionally, is Chocolatey really apt-get? It&apos;s not installing libraries system-wide, although there&apos;s no reason it couldn&apos;t. Other open source projects like &lt;a href=&quot;http://coapp.org&quot;&gt;CoApp&lt;/a&gt; would like to be the Windows app-get although CoApp is more of a &amp;quot;system-wide libraries, C++ support, and Unix-like utilities&amp;quot; and Chocolatey is more of a &amp;quot;developer and poweruser utilities and their dependencies.&amp;quot;&lt;/p&gt;
&lt;p&gt;Chocolatey does install dependencies and you can see that happen yourself by trying out &amp;quot;cinst gitextensions&amp;quot; which itself has a dependency on git. Chocolatey will walk the graph and install what it needs before finally installing gitextensions.&lt;/p&gt;
&lt;p&gt;Where Chocolatey, and ultimately Windows itself, falls down is with odd PATHing and install locations. Because Windows doesn&apos;t have formal install locations for things and because Chocolatey puts itself first in the PATH, it&apos;s possible to get one&apos;s self into odd situations where apps that were installed outside of Chocolatey don&apos;t line up with apps installed inside. For example, I installed Git with Chocolatey some months ago, then forgot about that version and installed a newer version of Git on my own. However, I kept hitting an old git bug because the Chocolatey version of Git was &amp;quot;first.&amp;quot; I believe issues like this have changed with recent builds of Chocolatey, but the point remains: it&apos;s hard on Windows today to who installed what low-level utility, when, and where it ended up. &lt;/p&gt;
&lt;h3&gt;Branding&lt;/h3&gt;
&lt;p&gt;Now, by no means to I want to take away from the hard work done by Rob and the team, but (and I&apos;ve said this to Rob before) I really have trouble getting past the name Chocolatey. Sure, there are two ways to spell &amp;quot;&lt;a href=&quot;http://www.merriam-webster.com/dictionary/chocolaty&quot;&gt;Chocolaty&lt;/a&gt;,&amp;quot; which make it hard at least for me to type &amp;quot;Chocolatey&amp;quot; reliably. The -ey is a theoretically a valid variant spelling, but you can tell that that to the red squiggled underline in Word. But it&apos;s less the spelling and more the name itself. It lacks the nerdiness of an &amp;quot;npm,&amp;quot; the gravitas of an &amp;quot;apt-get,&amp;quot; or the poetic terseness of a &amp;quot;gem.&amp;quot;&amp;#160; I realize that we are living in a world with companies called Hulu, Yahoo, Microsoft (seriously, MICRO SOFT, what is that?) and Google, but it&apos;s worth pointing out that a good name can really take a project to the next level. I&apos;m not sure Chocolatey is the right name for this project, but that&apos;s 100% my opinion.&lt;/p&gt;
&lt;p&gt;I encourage you, technical reader, to &lt;a href=&quot;http://www.chocolatey.org&quot;&gt;check out Chocolatey for yourself&lt;/a&gt;! It&apos;s a powerful tool, an engaged and growing community and an interesting piece of tech in its own right. &lt;/p&gt;
&lt;p&gt;Is Chocolatey the apt-get Windows users have been waiting for? Sound off in the comments.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Sponsor: &lt;/strong&gt;Big thanks to &lt;a href=&quot;http://hnsl.mn/11tE2s3&quot;&gt;SoftFluent&lt;/a&gt; for sponsoring the feed this week! Check out their slick code generation tools: &lt;strong&gt;Less Plumbing, More Productivity! &lt;/strong&gt;&lt;a href=&quot;http://hnsl.mn/11tE2s3&quot;&gt;&lt;strong&gt;Generate rock-solid foundations for your .NET applications from Visual Studio&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; and focus on what matters!&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. &lt;br/&gt;&lt;/div&gt;
&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/41661896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/41661896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/41661896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/41661896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/41661896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</description>
      <comments>http://www.hanselman.com/blog/CommentView.aspx?guid=9a5d6df6-816a-4674-a919-696c75f1dfb4</comments>
      <category>NuGet</category>
      <category>Open Source</category>
      <category>Tools</category><content:encoded>&lt;div&gt;&lt;figure&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.chocolatey.org&quot;&gt;&lt;img title=&quot;Chocolatey installs Git&quot; style=&quot;display: inline&quot; alt=&quot;Chocolatey installs Git&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/b28963c18c60_14FBE/image_6.png&quot; width=&quot;999&quot; height=&quot;308&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;   &lt;h3&gt;What it does&lt;/h3&gt;  &lt;p&gt;Chocolatey lets you install Windows applications quickly from the command line via a central catalog of installation scripts. You could install Git, 7Zip or even Microsoft Office (given a key.) The idea is seamless and quiet installations using a well-known key. &lt;/p&gt;  &lt;p&gt;For example, once installed you can do this from and command line:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;cinst git &lt;/li&gt;    &lt;li&gt;cinst 7zip &lt;/li&gt;    &lt;li&gt;cinst ruby &lt;/li&gt;    &lt;li&gt;cinst vlc&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;That&apos;s basically it.&lt;/p&gt;  &lt;p&gt;The catalog has grown so complete, in fact, that I recently wanted to install DosBox so I could play Zork. I took and chance and just &amp;quot;cinst dosbox&amp;quot; and it worked. THAT is a the promise that Chocolatey makes.&lt;/p&gt;  &lt;h3&gt;Getting Started with Chocolatey&lt;/h3&gt;  &lt;p&gt;You can get started by first installing the Chocolatey package manager. Copy paste this line to your command line and run it. (More on the fearfulness of this first step in a moment).&lt;/p&gt;  &lt;pre&gt;@powershell -NoProfile -ExecutionPolicy unrestricted -Command &amp;quot;iex ((new-object net.webclient).DownloadString(&apos;https://chocolatey.org/install.ps1&apos;))&amp;quot; &amp;amp;&amp;amp; SET PATH=%PATH%;%systemdrive%\chocolatey\bin&lt;/pre&gt;
&lt;p&gt;Presumably you like to know what command line stuff is going to do to your computer before you do it, so parse this line out. It&apos;s going to launch PowerShell to do the hard work. Nearly every Windows machine has PowerShell these days, and it&apos;s PowerShell that makes Chocolatey work.&lt;/p&gt;
&lt;p&gt;Some folks have custom profiles so the -NoProfile switch suppresses custom profiles to prevent conflicts during installation. It launches a chunk of PowerShell script that it downloads from https://chocolatey.org/install.ps1/ then executes. Note that it&apos;s setting execution policy to unrestricted to do this. To be clear, it&apos;s executing code downloaded over the web, so there is a non-zero risk there. It then adds Chocolatey to your path (for this one prompt) so you can use it immediately. It&apos;ll be added to future instances of prompts automatically.&lt;/p&gt;
&lt;p&gt;Look at &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://chocolatey.org/install.ps1&quot;&gt;https://chocolatey.org/install.ps1&lt;/a&gt; now. It&apos;s a very clean and easy to read script. It downloads the Chocolatey installation zip file (which is actually a NuGet package), unzips it and continues the installation by running a scripts in the tools section of the package. &lt;/p&gt;
&lt;h3&gt;How it works &lt;/h3&gt;
&lt;p&gt;Chocolatey is a bootstrapper that uses PowerShell scripts and the &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.nuget.org&quot;&gt;NuGet&lt;/a&gt; packaging format to install apps for you. NuGet is the package management system that Windows Developers use to bring libraries down at the &lt;em&gt;project level&lt;/em&gt;. Chocolatey (get it? Chocolatey Nu-Get?) extends that concept to bring applications down at the &lt;em&gt;system level. &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Today if you want to get 7Zip, you usually google for it, find the site, figure out the latest version or right version for your system, download it, run it, next next next finish and maybe add it to your path. Chocolatey does that for you.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Again, NuGet is libraries installed locally for projects, Chocolatey is applications installed globally for your whole system.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Chocolatey uses PowerShell scripts (that you never have to think about) that package developers use to chain installations and build dependency trees. Take the internals of a Git installation script for example:&lt;/p&gt;
&lt;pre class=&quot;brush: ps; toolbar: false; auto-links: false;&quot;&gt;try {
&lt;br&gt;  Install-ChocolateyPackage &apos;git.install&apos; &apos;exe&apos; &apos;/VERYSILENT&apos; &apos;http://msysgit.googlecode.com/files/Git-1.8.1.2-preview20130201.exe&apos;
&lt;br&gt;
&lt;br&gt;  #------- ADDITIONAL SETUP -------#
&lt;br&gt;  $is64bit = (Get-WmiObject Win32_Processor).AddressWidth -eq 64
&lt;br&gt;  $programFiles = $env:programfiles
&lt;br&gt;  if ($is64bit) {$programFiles = ${env:ProgramFiles(x86)}}
&lt;br&gt;  $gitPath = Join-Path $programFiles &apos;Git\cmd&apos;
&lt;br&gt;
&lt;br&gt;  Install-ChocolateyPath $gitPath &apos;user&apos;
&lt;br&gt;
&lt;br&gt;@&amp;quot;
&lt;br&gt;
&lt;br&gt;Making GIT core.autocrlf false
&lt;br&gt;&amp;quot;@ | Write-Host
&lt;br&gt;
&lt;br&gt;  #make GIT core.autocrlf false
&lt;br&gt;  &amp;amp; &amp;quot;$env:comspec&amp;quot; &apos;/c git config --global core.autocrlf false&apos;
&lt;br&gt;
&lt;br&gt;  Write-ChocolateySuccess &apos;git.install&apos;
&lt;br&gt;} catch {
&lt;br&gt;  Write-ChocolateyFailure &apos;git.install&apos; $($_.Exception.Message)
&lt;br&gt;  throw
&lt;br&gt;}&lt;/pre&gt;
&lt;p&gt;The most important part for you to take away here is the first line. Note that this Chocolatey script is downloading Git &lt;strong&gt;from the mSysGit Site. &lt;/strong&gt;Chocolatey is not changing installers, making installers or hosting installers. It&apos;s automating the boring parts of getting software, but it&apos;s still getting that software from the same location as always.&lt;/p&gt;
&lt;h3&gt;Advanced Stuff&lt;/h3&gt;
&lt;p&gt;Once you learn the basics - and they&apos;re pretty basic - there&apos;s more depth to Chocolatey to explore. Beyond the cinst and cuninst there&apos;s other commands to make installing stuff on Windows easier. Remember, they&apos;re all in your PATH so you can call these commands anytime.&lt;/p&gt;
&lt;p&gt;Each of these major sources can be called with cinst using the -source parameter like &amp;quot;cinst IISExpress - source WebPI&amp;quot; or using their own aliases for simplicity as shown below.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;cwindowsfeatures&lt;/strong&gt; - If you&apos;ve ever opened Add/Remove programs then click Install Windows Features in order to setup IIS or Hyper-V then this command is for you. Some examples: 
    &lt;ul&gt;
      &lt;li&gt;cwindowsfeatures&amp;#160; IIS-WebServerRole &lt;/li&gt;
      &lt;li&gt;cwindowsfeatures Microsoft-Hyper-V-All &lt;/li&gt;
      &lt;li&gt;cwindowsfeatures TelnetClient 
        &lt;ul&gt;
          &lt;li&gt;Plus, you can always clist -source windowsfeatures for the complete list.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;cwebpi - &lt;/strong&gt;The Web Platform Installer is a great GUI for downloading any development tools you might need for Web Development on Windows. It&apos;s a catalog, an installer, and a chainer. There&apos;s also a command-line version of WebPI that Chocolatey integrates with so you can: 
    &lt;ul&gt;
      &lt;li&gt;cwebpi IISExpress &lt;/li&gt;
      &lt;li&gt;cwebpi VWDOrVs11AzurePack_2_0 
        &lt;ul&gt;
          &lt;li&gt;And again, clist -source webpi gets you a list of what you can do. &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&apos;s a more complete list at the &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://github.com/chocolatey/chocolatey/wiki/CommandsReference&quot;&gt;Chocolatey Commands Reference&lt;/a&gt; including how it integrates with Cygwin, Gems and Python.&lt;/p&gt;
&lt;h3&gt;Security Issues&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.chocolatey.org&quot;&gt;&lt;img title=&quot;nugetlogo&quot; style=&quot;float: right; display: inline&quot; alt=&quot;nugetlogo&quot; align=&quot;right&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/b28963c18c60_14FBE/nugetlogo_3.png&quot; width=&quot;345&quot; height=&quot;75&quot; /&gt;&lt;/a&gt;This is a prickly one. How do you make a system that lets you install anything directly from the Internet quickly, cleanly, and easily without, well, installing something evil directly from the Internet? You&apos;ll want the communication with the server to be secure and the packages trusted, but you&apos;ll also want to make sure the packages haven&apos;t been tampered with since they were uploaded. There&apos;s the inevitable threat of a man-in-the-middle attack. You&apos;ll want to watch for malicious packages and enable quick takedowns if one sneaks by. &lt;/p&gt;
&lt;p&gt;Security concerns aren&apos;t unique to Chocolatey, of course. They are a part of package repositories since their inception. The node npm repository had a security breach in March of 2012, and &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~blog.andyet.com/2012/mar/8/compromising-the-integrity-of-the-npm-registry/&quot;&gt;the folks at andyet explored the issues surrounding it&lt;/a&gt;, but also pointed out that personal responsibility has to have a role as well.&lt;/p&gt;
&lt;p&gt;Linux&apos;s apt-get solves much of this with appropriate uses of cryptography and best practices that can (and should) be emulated. Packages in apt repos are signed with SecureApp, there are warnings if you&apos;re using a 3rd party repo or installing an unsigned package.&lt;/p&gt;
&lt;p&gt;The Chocolatey team has been very quick to jump on security issues and they are very approachable. They&apos;ve added SSL where appropriate and are aware of the work to come. If Chocolatey gets big (bandwidth and costs is a question in my mind) perhaps a non-profit organization would step in to help with not only costs, but also security audits and best practices.&lt;/p&gt;
&lt;p&gt;Here&apos;s some &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~https://groups.google.com/forum/?fromgroups#!topic/chocolatey/5p8l7WRsh9c&quot;&gt;points (edited for length by me) from a post from Chocolatey&apos;s lead, Rob in a post on their mailing list, also in march of 2012&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Security has a big future aspect of chocolatey. At the present I am the curator and I every day I get an email showing me all of the new packages that went in the day before. I look at all packages from new authors and I typically look at the first version of most new packages from authors I have good contacts with. &lt;/p&gt;
  &lt;p&gt;I&apos;ve talked at length with others about having a moderated feed in the aspect of every package, every new version would be approved prior to showing up on the main feed. I am paying attention to how debian does things with multiple feeds and there are thoughts to move in that direction as well. &lt;/p&gt;
  &lt;p&gt;Security? In the future we are looking at a small group of folks be an approving body for nupkgs. We also talked about showing the hash for the nupkg, and possibly letting folks specify a hash for the installers so chocolatey can verify the things it downloads prior to execution.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img title=&quot;Chocolatey&amp;#39;s LIB folder&quot; style=&quot;float: right; display: inline&quot; alt=&quot;Chocolatey&amp;#39;s LIB folder&quot; align=&quot;right&quot; src=&quot;http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/b28963c18c60_14FBE/image_5.png&quot; width=&quot;298&quot; height=&quot;456&quot; /&gt;Could I make a Chocolatey package called &amp;quot;FormatMyHardDrive?&amp;quot; Sure I could, just like I could ask you to open an admin prompt and format c: /q, but you won&apos;t, right? ;)&lt;/p&gt;
&lt;h3&gt;What&apos;s next?&lt;/h3&gt;
&lt;p&gt;Chocolatey is clearly not meant to be used by your &amp;quot;Gender Non-Specific Non-Technical Parent&amp;quot; and it does have some &amp;quot;competition&amp;quot; in the form of the &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.ninite.com/&quot;&gt;Ninite GUI installation utility&lt;/a&gt;. While still not for the average Joe/Jane and having only a limited catalog, Ninite does fill a gap for the super-user to quickly get the common apps and utilities they want. &lt;/p&gt;
&lt;p&gt;Additionally, is Chocolatey really apt-get? It&apos;s not installing libraries system-wide, although there&apos;s no reason it couldn&apos;t. Other open source projects like &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~coapp.org&quot;&gt;CoApp&lt;/a&gt; would like to be the Windows app-get although CoApp is more of a &amp;quot;system-wide libraries, C++ support, and Unix-like utilities&amp;quot; and Chocolatey is more of a &amp;quot;developer and poweruser utilities and their dependencies.&amp;quot;&lt;/p&gt;
&lt;p&gt;Chocolatey does install dependencies and you can see that happen yourself by trying out &amp;quot;cinst gitextensions&amp;quot; which itself has a dependency on git. Chocolatey will walk the graph and install what it needs before finally installing gitextensions.&lt;/p&gt;
&lt;p&gt;Where Chocolatey, and ultimately Windows itself, falls down is with odd PATHing and install locations. Because Windows doesn&apos;t have formal install locations for things and because Chocolatey puts itself first in the PATH, it&apos;s possible to get one&apos;s self into odd situations where apps that were installed outside of Chocolatey don&apos;t line up with apps installed inside. For example, I installed Git with Chocolatey some months ago, then forgot about that version and installed a newer version of Git on my own. However, I kept hitting an old git bug because the Chocolatey version of Git was &amp;quot;first.&amp;quot; I believe issues like this have changed with recent builds of Chocolatey, but the point remains: it&apos;s hard on Windows today to who installed what low-level utility, when, and where it ended up. &lt;/p&gt;
&lt;h3&gt;Branding&lt;/h3&gt;
&lt;p&gt;Now, by no means to I want to take away from the hard work done by Rob and the team, but (and I&apos;ve said this to Rob before) I really have trouble getting past the name Chocolatey. Sure, there are two ways to spell &amp;quot;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.merriam-webster.com/dictionary/chocolaty&quot;&gt;Chocolaty&lt;/a&gt;,&amp;quot; which make it hard at least for me to type &amp;quot;Chocolatey&amp;quot; reliably. The -ey is a theoretically a valid variant spelling, but you can tell that that to the red squiggled underline in Word. But it&apos;s less the spelling and more the name itself. It lacks the nerdiness of an &amp;quot;npm,&amp;quot; the gravitas of an &amp;quot;apt-get,&amp;quot; or the poetic terseness of a &amp;quot;gem.&amp;quot;&amp;#160; I realize that we are living in a world with companies called Hulu, Yahoo, Microsoft (seriously, MICRO SOFT, what is that?) and Google, but it&apos;s worth pointing out that a good name can really take a project to the next level. I&apos;m not sure Chocolatey is the right name for this project, but that&apos;s 100% my opinion.&lt;/p&gt;
&lt;p&gt;I encourage you, technical reader, to &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~www.chocolatey.org&quot;&gt;check out Chocolatey for yourself&lt;/a&gt;! It&apos;s a powerful tool, an engaged and growing community and an interesting piece of tech in its own right. &lt;/p&gt;
&lt;p&gt;Is Chocolatey the apt-get Windows users have been waiting for? Sound off in the comments.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Sponsor: &lt;/strong&gt;Big thanks to &lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~hnsl.mn/11tE2s3&quot;&gt;SoftFluent&lt;/a&gt; for sponsoring the feed this week! Check out their slick code generation tools: &lt;strong&gt;Less Plumbing, More Productivity! &lt;/strong&gt;&lt;a href=&quot;http://feeds.hanselman.com/~/t/0/0/scotthanselman/~hnsl.mn/11tE2s3&quot;&gt;&lt;strong&gt;Generate rock-solid foundations for your .NET applications from Visual Studio&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; and focus on what matters!&lt;/strong&gt;&lt;/p&gt;
&lt;br&gt;&lt;hr/&gt;&#xA9; 2013 Scott Hanselman. All rights reserved. 
&lt;br&gt;&lt;/div&gt;&lt;Img align=&quot;left&quot; border=&quot;0&quot; height=&quot;1&quot; width=&quot;1&quot; style=&quot;border:0;float:left;margin:0;padding:0&quot; hspace=&quot;0&quot; src=&quot;http://feeds.hanselman.com/~/i/41661896/0/scotthanselman&quot;&gt;

&lt;div style=&quot;clear:both;padding-top:0.2em;&quot;&gt;&lt;a title=&quot;Like on Facebook&quot; href=&quot;http://feeds.hanselman.com/_/28/41661896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/fblike20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Share on Google+&quot; href=&quot;http://feeds.hanselman.com/_/30/41661896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/googleplus20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Tweet This&quot; href=&quot;http://feeds.hanselman.com/_/24/41661896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/twitter20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by email&quot; href=&quot;http://feeds.hanselman.com/_/19/41661896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/email20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;a title=&quot;Subscribe by RSS&quot; href=&quot;http://feeds.hanselman.com/_/20/41661896/scotthanselman&quot;&gt;&lt;img height=&quot;20&quot; src=&quot;http://assets.feedblitz.com/i/rss20.png&quot; style=&quot;border:0;margin:0;padding:0;&quot;&gt;&lt;/a&gt;&amp;#160;&lt;/div&gt;</content:encoded></item>
</channel></rss>

