<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>WiredPrairie</title>
	
	<link>http://www.wiredprairie.us/blog</link>
	<description>A little bit of everything: software, apps, usability, programming, design and whatever else</description>
	<lastBuildDate>Thu, 09 Feb 2012 02:47:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/wiredprairie" /><feedburner:info uri="wiredprairie" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fwiredprairie" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fwiredprairie" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fwiredprairie" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/wiredprairie" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fwiredprairie" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fwiredprairie" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fwiredprairie" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fwiredprairie" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><item>
		<title>Adobe Lightroom and exporting to subfolders</title>
		<link>http://feedproxy.google.com/~r/wiredprairie/~3/kV54lj6kMq0/1541</link>
		<comments>http://www.wiredprairie.us/blog/index.php/archives/1541#comments</comments>
		<pubDate>Thu, 09 Feb 2012 02:33:58 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Photography]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[directories]]></category>
		<category><![CDATA[export]]></category>
		<category><![CDATA[Lightroom]]></category>
		<category><![CDATA[subfolders]]></category>

		<guid isPermaLink="false">http://www.wiredprairie.us/blog/?p=1541</guid>
		<description><![CDATA[For some reason, versions 1 – 3 of Adobe Lightroom cannot export images in a way that mirrors the original structure of your photo library. I can’t offer a reason why other than it was missed by the development and design teams. There’s been enough interest in it apparently that there are more than a [...]]]></description>
			<content:encoded><![CDATA[<p>For some reason, versions 1 – 3 of Adobe Lightroom cannot export images in a way that mirrors the original structure of your photo library. I can’t offer a reason why other than it was missed by the development and design teams. There’s been enough interest in it apparently that there are more than a few free and pay solutions to the problem. </p>
<p>I looked at a few of the options and for one reason or another, I decided that I didn’t want to use the plug-ins/extensions and came up with a simple solution using a bit of naming trickery. I use this technique for <a href="http://www.wiredprairie.us/SnugUp/">SnugUp</a>.</p>
<p>Here’s what I did in Lightroom version 3.</p>
<ol>
<li>I selected the photos I wanted to export.&#160; (I generally use the <strong>Quick Collection Feature</strong>) </li>
<li><strong>File</strong> &gt; <strong>Export </strong>(CTRL + SHIFT + E) </li>
<li>Adjust the <strong>Export To</strong> option to point to a specific folder of your choosing (in the example below, I set the folder as E:\PhotosBackupJPG       <br /><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/02/image1.png" width="502" height="146" /> </li>
<li>You may optionally put them in a subfolder of your choice (I did not) </li>
<li>Next click the <strong>Rename To</strong> option and select &quot;<strong>Edit…</strong>”       <br /><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/02/image2.png" width="502" height="245" /> </li>
<li>Clear any value that may already be in the text box below the <strong>Example</strong> (just highlight the text and press delete).       <br /><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/02/image3.png" width="483" height="119" /> </li>
<li>Then, edit the template to be <strong>Folder Name </strong>and then <strong>Original filename</strong>. Select those by using the Image Name grouping. Click the <strong>Insert </strong>button after each.       <br /><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML5521140b" border="0" alt="SNAGHTML5521140b" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/02/SNAGHTML5521140b.png" width="424" height="482" /> </li>
<li>Then, I added some text that I knew would be unique to be used as a separator (<strong>=-= </strong>equals minus equals). To add the text, just click with your mouse&#160; between the two values you just inserted. I know that none of the file names in my library have this exact combination of characters in them. It’s important later. You can confirm this by using the search feature in Lightroom if you’re not sure.       <br /><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML5522af12" border="0" alt="SNAGHTML5522af12" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/02/SNAGHTML5522af12.png" width="509" height="197" /> </li>
<li>Click on the <strong>Preset</strong> (yours may say something else) and then click “<strong>Save Current Settings as New Preset</strong>”       <br /><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/02/image4.png" width="415" height="367" /> </li>
<li>Give it a name that you’ll remember (I called mine Folder-Filename) and hit <strong>Create</strong>.       <br /><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML5524784a" border="0" alt="SNAGHTML5524784a" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/02/SNAGHTML5524784a.png" width="395" height="137" /> </li>
<li>Adjust the remaining settings per your export needs and begin the process by clicking the <strong>Export</strong> button. </li>
<li>Wait patiently. Then go do something else as you realize it’s going to take a <strong>lot </strong>longer than you had expected/wanted. </li>
<li>Now, the next step is the simple trickery. What we’ve done is named all of the files so that they include the folder name as well. So, using a Powershell 2.0 script (Powershell is available for all modern versions of Windows as part of a package download <a href="http://support.microsoft.com/kb/968929">here</a>). So, download it now if you don’t already have it. (You can check for it by looking for Powershell ISE as described in the next step if you’re not sure. You probably have it if you’re using Windows 7). </li>
<li>Start <strong>Windows Powershell ISE</strong> (in Vista and Windows 7, just type “power” into the Start menu search):       <br /><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/02/image5.png" width="383" height="71" />The reason I suggest the ISE (integrated scripting environment) is that it’s easy to just get stuff running without a lot of hassle. </li>
<li>The ISE will start:      <br /><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML552c2cf8" border="0" alt="SNAGHTML552c2cf8" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/02/SNAGHTML552c2cf8.png" width="502" height="456" /> </li>
<li>I performed the move/rename in two steps so I could verify things between each step. If you’re familiar with Powershell, feel free to combine them into one step. It’s simple enough. First grab the entire script below and paste it into the top pane (under the tab labeled <strong>Untitled1.ps1</strong>):       <br /> 
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:5a85fa65-074e-4c61-8b04-2f7cdb8d2b3d" class="wlWriterEditableSmartContent">
<pre style=" width: 540px; height: 268px;background-color:White;overflow: auto;;font-family:Courier New;font-size:8.25">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #800080;">$root</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #008000;">#</span><span style="color: #008000;">&quot;E:\PhotosBackupJPG&quot;</span><span style="color: #008000;">
</span><span style="color: #800080;">$items</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> Get</span><span style="color: #000000;">-</span><span style="color: #000000;">ChildItem </span><span style="color: #800080;">$root</span><span style="color: #000000;">
</span><span style="color: #0000FF;">foreach</span><span style="color: #000000;">(</span><span style="color: #800080;">$item</span><span style="color: #000000;"> </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> </span><span style="color: #800080;">$items</span><span style="color: #000000;">) {
    </span><span style="color: #800080;">$path</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> [regex]</span><span style="color: #000000;">::</span><span style="color: #000000;">split(</span><span style="color: #800080;">$item</span><span style="color: #000000;">.Name, </span><span style="color: #800000;">&quot;</span><span style="color: #800000;">(=-=)</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">)
    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$path</span><span style="color: #000000;">.length </span><span style="color: #008080;">-eq</span><span style="color: #000000;"> </span><span style="color: #000000;">3</span><span style="color: #000000;">) {
        </span><span style="color: #800080;">$destPath</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">$root</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800000;">&quot;</span><span style="color: #800000;">\</span><span style="color: #800000;">&quot;</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">$path</span><span style="color: #000000;">[</span><span style="color: #000000;">0</span><span style="color: #000000;">]
        </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #000000;">(Test</span><span style="color: #000000;">-</span><span style="color: #000000;">Path </span><span style="color: #000000;">-</span><span style="color: #000000;">path </span><span style="color: #800080;">$destPath</span><span style="color: #000000;">))
        {
            New</span><span style="color: #000000;">-</span><span style="color: #000000;">Item </span><span style="color: #800080;">$destPath</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">type directory
            </span><span style="color: #800000;">&quot;</span><span style="color: #800000;">New folder: </span><span style="color: #800000;">&quot;</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #800080;">$destPath</span><span style="color: #000000;">
        }
        Move</span><span style="color: #000000;">-</span><span style="color: #000000;">Item </span><span style="color: #800080;">$item</span><span style="color: #000000;">.FullName </span><span style="color: #800080;">$destPath</span><span style="color: #000000;">
    }
}</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p>I’ve intentionally left an error in the file so that you’re forced to make the change. Unless you have an “E” drive and the path, “PhotosBackupJPG”, the script needs a tiny modification to make it work. </li>
<li>The first line of the script, $root = #”E:\PhotosBackupJPG” needs to be changed to match with the export location you selected earlier AND also the “#” needs to be removed (it’s a comment character in Powershell script). So, if you exported your photos to C:\Users\Steve\ExportedPhotos, remove the “#” and remove the text inside of the quotes on the first line and replace it with your photo location. </li>
<li>After confirming the location points to where you exported your photos (and videos), hit the <strong>Run </strong>button (the green arrow in the screen shot below). Or hit the F5 key on your keyboard.
<p><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/02/image6.png" width="341" height="128" /> </li>
<li>The output (or any errors if you made a typo) appears in the light blue box in the center and when it’s complete, the word “Completed” appears in the status bar at the bottom of the application. It may take a few minutes to complete. I’d suggest looking at your export directory using Windows explorer to confirm everything looks fine before continuing. At this point, you should have some subfolders and all of the files should have been moved into the proper subfolder. Next, renaming. </li>
<li>Click the “New” icon (first icon on left shown above) to create a new Powershell script file (or just replace the existing one, you won’t need it again for this process). In the new file, copy this Powershell script and paste it:<br />
    </p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:c4e3b1bf-1197-4bdd-a09b-3f4388016aeb" class="wlWriterEditableSmartContent">
<pre style=" width: 540px; height: 183px;background-color:White;overflow: auto;;font-family:Courier New;font-size:8.25">
<div><!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--><span style="color: #800080;">$root</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #008000;">#</span><span style="color: #008000;">&quot;E:\PhotosBackupJPG&quot;</span><span style="color: #008000;">
</span><span style="color: #800080;">$items</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> Get</span><span style="color: #000000;">-</span><span style="color: #000000;">ChildItem </span><span style="color: #800080;">$root</span><span style="color: #000000;"> </span><span style="color: #000000;">-</span><span style="color: #000000;">recurse
</span><span style="color: #0000FF;">foreach</span><span style="color: #000000;">(</span><span style="color: #800080;">$item</span><span style="color: #000000;"> </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> </span><span style="color: #800080;">$items</span><span style="color: #000000;">) {
    </span><span style="color: #800080;">$path</span><span style="color: #000000;"> </span><span style="color: #000000;">=</span><span style="color: #000000;"> [regex]</span><span style="color: #000000;">::</span><span style="color: #000000;">split(</span><span style="color: #800080;">$item</span><span style="color: #000000;">.Name, </span><span style="color: #800000;">&quot;</span><span style="color: #800000;">(=-=)</span><span style="color: #800000;">&quot;</span><span style="color: #000000;">)
    </span><span style="color: #0000FF;">if</span><span style="color: #000000;"> (</span><span style="color: #800080;">$path</span><span style="color: #000000;">.length </span><span style="color: #008080;">-eq</span><span style="color: #000000;"> </span><span style="color: #000000;">3</span><span style="color: #000000;">) {
        </span><span style="color: #008000;">#</span><span style="color: #008000;"> $destPath = $root + &quot;\&quot; + $path[0]</span><span style="color: #008000;">
</span><span style="color: #000000;">        Rename</span><span style="color: #000000;">-</span><span style="color: #000000;">Item </span><span style="color: #800080;">$item</span><span style="color: #000000;">.FullName </span><span style="color: #800080;">$path</span><span style="color: #000000;">[</span><span style="color: #000000;">2</span><span style="color: #000000;">]
    }
}</span></div>
</pre>
<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --></div>
<p></li>
<li>Again, fix the $root to match with the export folder you created. </li>
<li>Confirm it, and hit the <strong>Run</strong> button. </li>
<li>All of your photos (and videos) will be renamed to only the original file name. The extra folder name and =-= are removed. </li>
<li>Bask in the glory of Powershell and your file wizardy. No plug-ins necessary. </li>
</ol>
<p>If you’d like to use something other than =-= as the delimiter between the folder and file names, you’ll need to fix the Powershell scripts. The delimiter is on the line: </p>
<p>$path = [regex]::split($item.Name, <span style="color: #006080">&quot;(=-=)&quot;</span>) </p>
<p></p>
<p>But, unless you understand how Regular Expressions in Powershell work, you may want to avoid this change … it’s not necessarily as simple as just replacing the text.</p>
<p>The scripts above do these things with each file:</p>
<ol>
<li>Check to see if it has the right pattern </li>
<li>If so, grab the folder name and check to see if the folder exists. </li>
<li>If it does not, create it. </li>
<li>Move the file to the new folder. </li>
<li>Rename the file name, removing the folder and delimiter </li>
</ol>
<p>If you have questions, please leave a comment.</p>
<p>While this shouldn’t cause any harm, (especially if you just point it at a folder of exported photos and videos, which worse case you just re-export), <strong>you use technique and code this at your own risk</strong>. I can say I successfully used the script on over 30,000 exported photos without a single problem. <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/02/wlEmoticon-smile1.png" /></p>

<p><a href="http://feedads.g.doubleclick.net/~a/l1l57WC_u3cAk39IG2sdi3TINig/0/da"><img src="http://feedads.g.doubleclick.net/~a/l1l57WC_u3cAk39IG2sdi3TINig/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/l1l57WC_u3cAk39IG2sdi3TINig/1/da"><img src="http://feedads.g.doubleclick.net/~a/l1l57WC_u3cAk39IG2sdi3TINig/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wiredprairie?a=kV54lj6kMq0:UorwXiP-T0c:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=kV54lj6kMq0:UorwXiP-T0c:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=kV54lj6kMq0:UorwXiP-T0c:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=kV54lj6kMq0:UorwXiP-T0c:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=kV54lj6kMq0:UorwXiP-T0c:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=kV54lj6kMq0:UorwXiP-T0c:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=kV54lj6kMq0:UorwXiP-T0c:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=kV54lj6kMq0:UorwXiP-T0c:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=kV54lj6kMq0:UorwXiP-T0c:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=kV54lj6kMq0:UorwXiP-T0c:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wiredprairie/~4/kV54lj6kMq0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.wiredprairie.us/blog/index.php/archives/1541/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.wiredprairie.us/blog/index.php/archives/1541</feedburner:origLink></item>
		<item>
		<title>WPF &amp;  System.Windows.Baml2006.TypeConverterMarkupExtension "The image format is unrecognized"</title>
		<link>http://feedproxy.google.com/~r/wiredprairie/~3/gN11cZA3uK8/1528</link>
		<comments>http://www.wiredprairie.us/blog/index.php/archives/1528#comments</comments>
		<pubDate>Sun, 05 Feb 2012 23:36:56 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.wiredprairie.us/blog/?p=1528</guid>
		<description><![CDATA[If you recently added an icon to your WPF project (any .NET version, including .NET 3.5, and .NET 4.0) and it has support for an alpha channel (often referred to as the Vista icon format), stop. Why? Your WPF application won’t run on the latest service pack of XP as it’s not capable of decoding [...]]]></description>
			<content:encoded><![CDATA[<p><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTML4534e6a2" border="0" alt="SNAGHTML4534e6a2" align="right" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/02/SNAGHTML4534e6a2.png" width="242" height="216" />If you recently added an icon to your WPF project (any .NET version, including .NET 3.5, and .NET 4.0) and it has support for an alpha channel (often referred to as the Vista icon format), <strong>stop</strong>. Why? Your WPF application won’t run on the latest service pack of XP as it’s not capable of decoding the format unfortunately. It’s a very frustrating error and a stupid &quot;feature that Microsoft overlooked. I’ve hit this a few times unfortunately. </p>
<p>To fix, remove all of the alpha channel images from the ICO file and recompile.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/QRqYJy2I_53XSFiFhol26XVD3sw/0/da"><img src="http://feedads.g.doubleclick.net/~a/QRqYJy2I_53XSFiFhol26XVD3sw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/QRqYJy2I_53XSFiFhol26XVD3sw/1/da"><img src="http://feedads.g.doubleclick.net/~a/QRqYJy2I_53XSFiFhol26XVD3sw/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wiredprairie?a=gN11cZA3uK8:zO39vVcAtGs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=gN11cZA3uK8:zO39vVcAtGs:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=gN11cZA3uK8:zO39vVcAtGs:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=gN11cZA3uK8:zO39vVcAtGs:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=gN11cZA3uK8:zO39vVcAtGs:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=gN11cZA3uK8:zO39vVcAtGs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=gN11cZA3uK8:zO39vVcAtGs:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=gN11cZA3uK8:zO39vVcAtGs:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=gN11cZA3uK8:zO39vVcAtGs:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=gN11cZA3uK8:zO39vVcAtGs:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wiredprairie/~4/gN11cZA3uK8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.wiredprairie.us/blog/index.php/archives/1528/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.wiredprairie.us/blog/index.php/archives/1528</feedburner:origLink></item>
		<item>
		<title>Alternative to ApplicationSettings in .NET</title>
		<link>http://feedproxy.google.com/~r/wiredprairie/~3/98LfpPPSQZM/1524</link>
		<comments>http://www.wiredprairie.us/blog/index.php/archives/1524#comments</comments>
		<pubDate>Wed, 01 Feb 2012 13:52:31 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Settings]]></category>
		<category><![CDATA[WinForms]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.wiredprairie.us/blog/?p=1524</guid>
		<description><![CDATA[After dealing with lost settings, an unclear upgrade path, and my own confusion surrounding the magic of Settings in a .NET client application, I decided to build my own. You’re probably familiar with this UI in Visual Studio. It hasn’t changed much since it was first created: A list of properties, data type, scope and [...]]]></description>
			<content:encoded><![CDATA[<p>After dealing with lost settings, an unclear upgrade path, and my own confusion surrounding the magic of <a href="http://msdn.microsoft.com/en-us/library/system.configuration.applicationsettingsbase.aspx">Settings</a> in a .NET client application, I decided to build my own. </p>
<p>You’re probably familiar with this UI in Visual Studio. It hasn’t changed much since it was first created:</p>
<p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/02/image.png" width="420" height="322" /></p>
<p>A list of properties, data type, scope and a default value. Admittedly, it makes things simple. However, with my WPF .NET application that I created a few years ago (<a href="http://www.wiredprairie.us/SnugUp/">SnugUp</a>), I’ve always been troubled by the magic of the settings. It was too easy to get in a situation where a user would loose their settings doing uninstalls, reinstalls, upgrades. </p>
<p>While I’m sure it’s possible to make the built in settings classes to work, it wasn’t worth the effort for me to understand them and learn what the nuances of where they’re placed, how to do a decent upgrade, how not to loose them, etc. </p>
<p>In the SnugUp WPF UI, the code uses a two-way bindings to directly edit the settings of the application (like: &quot;{Binding AppSettings.DebugMode}&quot;). It was simple, and all I needed. It’s handy that ApplicationSettingsBase implements the INotifyPropertyChanged interface which WPF needs for simple two-way data bindings.</p>
<p>My solution, which I admit is heavier than the original as it requires a large additional assembly is to use <a href="http://james.newtonking.com/pages/json-net.aspx">JSON.NET</a> as the serializer/deserializer for a new settings class I created.</p>
<p>So, the basic pattern:</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> ApplicationSettings : INotifyPropertyChanged</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span> {</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3">   3:</span>     <span style="color: #0000ff">public</span> <span style="color: #0000ff">event</span> PropertyChangedEventHandler PropertyChanged;</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4">   4:</span>&#160; </pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5">   5:</span>     <span style="color: #0000ff">private</span> <span style="color: #0000ff">bool</span> _debugMode;</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum6">   6:</span>     <span style="color: #0000ff">private</span> <span style="color: #0000ff">string</span> _albumNameFormat;</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum7">   7:</span>     <span style="color: #0000ff">private</span> <span style="color: #0000ff">string</span> _extraFileExtensions;</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum8">   8:</span>     <span style="color: #0000ff">private</span> <span style="color: #0000ff">bool</span> _automaticRun;</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum9">   9:</span>     <span style="color: #0000ff">private</span> <span style="color: #0000ff">string</span> _galleryCreationSubCategory;</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum10">  10:</span>     <span style="color: #0000ff">private</span> <span style="color: #0000ff">bool</span> _filenameOnlyCheck;</pre>
<p><!--CRLF--></div>
</div>
<p>Properties created the standard way for INotifyPropertyChaged:</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> <span style="color: #0000ff">private</span> DateTime _nextUpdateCheck;</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span> <span style="color: #0000ff">public</span> DateTime NextUpdateCheck</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3">   3:</span> {</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4">   4:</span>     get { <span style="color: #0000ff">return</span> _nextUpdateCheck; }</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5">   5:</span>     set</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum6">   6:</span>     {</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum7">   7:</span>         <span style="color: #0000ff">if</span> (_nextUpdateCheck != <span style="color: #0000ff">value</span>)</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum8">   8:</span>         {</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum9">   9:</span>             _nextUpdateCheck = <span style="color: #0000ff">value</span>;</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum10">  10:</span>             RaisePropertyChanged(<span style="color: #006080">&quot;NextUpdateCheck&quot;</span>);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum11">  11:</span>         }</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum12">  12:</span>     }</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum13">  13:</span> }</pre>
<p><!--CRLF--></div>
</div>
<p>I wanted a predictable path for storing settings (so it would be easy to document and backup for users). I used the AssemblyCompany attribute and the AssemblyProduct attribute as the folder names:</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> <span style="color: #0000ff">internal</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">string</span> GetSettingsDirectory()</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span> {</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3">   3:</span>     <span style="color: #0000ff">string</span> path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4">   4:</span>     var attrs = Assembly.GetEntryAssembly().GetCustomAttributes(<span style="color: #0000ff">typeof</span>(AssemblyCompanyAttribute), <span style="color: #0000ff">false</span>);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5">   5:</span>     <span style="color: #0000ff">if</span> (attrs.Length == 1)</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum6">   6:</span>     {</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum7">   7:</span>         path = Path.Combine(path, ((AssemblyCompanyAttribute)attrs[0]).Company);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum8">   8:</span>&#160; </pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum9">   9:</span>     }</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum10">  10:</span>     attrs = Assembly.GetEntryAssembly().GetCustomAttributes(<span style="color: #0000ff">typeof</span>(AssemblyProductAttribute), <span style="color: #0000ff">false</span>);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum11">  11:</span>     <span style="color: #0000ff">if</span> (attrs.Length == 1)</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum12">  12:</span>     {</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum13">  13:</span>         path = Path.Combine(path, ((AssemblyProductAttribute)attrs[0]).Product);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum14">  14:</span>     }</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum15">  15:</span>     <span style="color: #0000ff">return</span> path;              </pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum16">  16:</span> }</pre>
<p><!--CRLF--></div>
</div>
<p>In this WPF application, in the AssemblyInfo.cs file, the attributes are set as follows:</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> [assembly: AssemblyCompany(<span style="color: #006080">&quot;WiredPrairie.us&quot;</span>)]</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span> [assembly: AssemblyProduct(<span style="color: #006080">&quot;SnugUp&quot;</span>)]</pre>
<p><!--CRLF--></div>
</div>
<p>On my machine, that maps to this path:</p>
<p><strong>d:\Users\Aaron\AppData\Roaming\WiredPrairie.us\SnugUp\</strong></p>
<p>Loading settings then is straightforward using JSON.NET:</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> ApplicationSettings Load(<span style="color: #0000ff">string</span> filename)</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span> {</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3">   3:</span>     ApplicationSettings settings = <span style="color: #0000ff">null</span>;</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4">   4:</span>     var directory = GetSettingsDirectory();</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5">   5:</span>     var path = Path.Combine(directory, filename);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum6">   6:</span>&#160; </pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum7">   7:</span>     <span style="color: #0000ff">if</span> (File.Exists(path))</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum8">   8:</span>     {</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum9">   9:</span>         <span style="color: #0000ff">string</span> fileData = File.ReadAllText(path);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum10">  10:</span>         <span style="color: #0000ff">try</span></pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum11">  11:</span>         {</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum12">  12:</span>             settings = JsonConvert.DeserializeObject&lt;ApplicationSettings&gt;(fileData, <span style="color: #0000ff">new</span> JsonSerializerSettings { });</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum13">  13:</span>         }</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum14">  14:</span>         <span style="color: #0000ff">catch</span> { }</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum15">  15:</span>     }</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum16">  16:</span>     <span style="color: #0000ff">if</span> (settings == <span style="color: #0000ff">null</span>)</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum17">  17:</span>     {</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum18">  18:</span>         settings = <span style="color: #0000ff">new</span> ApplicationSettings();</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum19">  19:</span>         SetDefaults(settings);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum20">  20:</span>         <span style="color: #008000">// initialize settings once</span></pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum21">  21:</span>         Save(settings, filename);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum22">  22:</span>     }</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum23">  23:</span>     <span style="color: #0000ff">return</span> settings;</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum24">  24:</span> }</pre>
<p><!--CRLF--></div>
</div>
<p>In my code, if the settings file didn’t exist or fails to serialize into something meaningful, a new settings file is created with a few defaults. (I haven’t decided what to do when there’s an exception when reading the file, hence the empty catch).</p>
<p>Saving the settings is just as easy:</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> Save(ApplicationSettings settings, <span style="color: #0000ff">string</span> filename)</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span> {</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3">   3:</span>     Debug.Assert(settings != <span style="color: #0000ff">null</span>);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4">   4:</span>     var directory = GetSettingsDirectory();</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5">   5:</span>     var path = Path.Combine(directory, filename);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum6">   6:</span>&#160; </pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum7">   7:</span>     JsonConvert.SerializeObject(settings);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum8">   8:</span>&#160; </pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum9">   9:</span>     <span style="color: #0000ff">if</span> (!Directory.Exists(directory))</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum10">  10:</span>     {</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum11">  11:</span>         Directory.CreateDirectory(directory);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum12">  12:</span>     }</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum13">  13:</span>&#160; </pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum14">  14:</span>     var fileData = JsonConvert.SerializeObject(settings, Formatting.Indented, <span style="color: #0000ff">new</span> JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate });</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum15">  15:</span>     <span style="color: #0000ff">try</span></pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum16">  16:</span>     {</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum17">  17:</span>         <span style="color: #0000ff">using</span> (StreamWriter writer = File.CreateText(path))</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum18">  18:</span>         {</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum19">  19:</span>             writer.Write(fileData);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum20">  20:</span>             writer.Close();</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum21">  21:</span>         }</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum22">  22:</span>     }</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum23">  23:</span>     <span style="color: #0000ff">catch</span> { }</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum24">  24:</span> }</pre>
<p><!--CRLF--></div>
</div>
<p>The SerializeObject method returns a string which is then written to a file using a StreamWriter. </p>
<p>I added a Save method to the instance of the ApplicationSettings:</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Save()</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span> {</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3">   3:</span>     ApplicationSettings.Save(<span style="color: #0000ff">this</span>);</pre>
<p><!--CRLF--></p>
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4">   4:</span> }</pre>
<p><!--CRLF--></div>
</div>
<p>This preserved the functionality that exists in the built in Settings support in .NET (which was being used in my application). </p>
<p>By keeping all of the property names the same and making a few tweaks to the types of some fields in my application, I had swapped out the entire “settings” infrastructure in about 45 minutes. </p>
<p>I’m planning some other JSON activities within my application, so the overhead of using JSON.NET is acceptable. </p>
<p>The best part of this alternative is that there isn’t any magic. It’s all easy to manage. Further, I can easily modify my installer to properly handle/update, etc., the settings file with just a few clicks. </p>
<p>I’m not going back to the built-in .NET settings support again. I’ve learned my lesson.&#160; <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/02/wlEmoticon-smile.png" /></p>
<p>What have you done for “user” settings?</p>

<p><a href="http://feedads.g.doubleclick.net/~a/z72FZsqS23lGjHZuHJz5Wk0Va8E/0/da"><img src="http://feedads.g.doubleclick.net/~a/z72FZsqS23lGjHZuHJz5Wk0Va8E/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/z72FZsqS23lGjHZuHJz5Wk0Va8E/1/da"><img src="http://feedads.g.doubleclick.net/~a/z72FZsqS23lGjHZuHJz5Wk0Va8E/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wiredprairie?a=98LfpPPSQZM:28WPpO48Vsc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=98LfpPPSQZM:28WPpO48Vsc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=98LfpPPSQZM:28WPpO48Vsc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=98LfpPPSQZM:28WPpO48Vsc:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=98LfpPPSQZM:28WPpO48Vsc:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=98LfpPPSQZM:28WPpO48Vsc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=98LfpPPSQZM:28WPpO48Vsc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=98LfpPPSQZM:28WPpO48Vsc:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=98LfpPPSQZM:28WPpO48Vsc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=98LfpPPSQZM:28WPpO48Vsc:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wiredprairie/~4/98LfpPPSQZM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.wiredprairie.us/blog/index.php/archives/1524/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.wiredprairie.us/blog/index.php/archives/1524</feedburner:origLink></item>
		<item>
		<title>Announcing SnugUp version 2</title>
		<link>http://feedproxy.google.com/~r/wiredprairie/~3/8xmk9KXFvwM/1520</link>
		<comments>http://www.wiredprairie.us/blog/index.php/archives/1520#comments</comments>
		<pubDate>Sun, 29 Jan 2012 18:12:55 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Photography]]></category>
		<category><![CDATA[SmugMug]]></category>
		<category><![CDATA[SnugUp]]></category>

		<guid isPermaLink="false">http://www.wiredprairie.us/blog/?p=1520</guid>
		<description><![CDATA[More than a few years ago, I created SnugUp version 1, which is a handy way of synchronizing folders of images with SmugMug for Windows users. I’ve made a number of changes in the last month based on some requests and the result is a significant update (yet the core features are all there – [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.wiredprairie.us/SnugUp/"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 20px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image29.png" width="143" height="520" /></a>More than a few years ago, I created <a href="http://www.wiredprairie.us/SnugUp/">SnugUp</a> version 1, which is a handy way of synchronizing folders of images with <a href="http://www.smugmug.com/?referrer=75Bqi7vCzrwPY">SmugMug</a> for Windows users. I’ve made a number of changes in the last month based on some requests and the result is a significant update (yet the core features are all there – just improved!).</p>
<p>New features:</p>
<ul>
<li>(Changed to version 2)</li>
<li>Completely revamped look and feel (which did remove a few &#8216;flashy&#8217; features) </li>
<li>Uses Click once for application updating (which should make it easier to push updates and bug fixes out to users)</li>
<li>Added settings for <strong>automatic upload </strong>(when application starts) </li>
<li>Added setting for Subcategory selection (only selection, no creation of subcategories through SnugUp) </li>
<li>Added setting for <strong>custom gallery naming </strong></li>
<li>Completely changed settings user interface to more logically group and explain settings </li>
<li>Fixed a number of bugs (that shouldn&#8217;t have appeared to user anyway!) </li>
<li>Added support for new file extensions (to <strong>upload videos </strong>in particular)</li>
</ul>
<p>It does require .NET 4.0 Framework Client profile (which likely you’ve already got on your machine, but if you don’t the installer SHOULD make it easy to download).</p>
<p>Go <a href="http://www.wiredprairie.us/SnugUp">here</a> (<a href="http://www.wiredprairie.us/SnugUp">http://www.wiredprairie.us/SnugUp</a>) for more information and to download. I’d recommend uninstalling the old version first.</p>
<p><a href="http://www.wiredprairie.us/SnugUp"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="SNAGHTML1ffa6494" border="0" alt="SNAGHTML1ffa6494" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/SNAGHTML1ffa6494.png" width="500" height="375" /></a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/pGA5Roz0Ieksv5LCBmr_ISaWg7s/0/da"><img src="http://feedads.g.doubleclick.net/~a/pGA5Roz0Ieksv5LCBmr_ISaWg7s/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/pGA5Roz0Ieksv5LCBmr_ISaWg7s/1/da"><img src="http://feedads.g.doubleclick.net/~a/pGA5Roz0Ieksv5LCBmr_ISaWg7s/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wiredprairie?a=8xmk9KXFvwM:PzeHHTXZF4o:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=8xmk9KXFvwM:PzeHHTXZF4o:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=8xmk9KXFvwM:PzeHHTXZF4o:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=8xmk9KXFvwM:PzeHHTXZF4o:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=8xmk9KXFvwM:PzeHHTXZF4o:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=8xmk9KXFvwM:PzeHHTXZF4o:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=8xmk9KXFvwM:PzeHHTXZF4o:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=8xmk9KXFvwM:PzeHHTXZF4o:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=8xmk9KXFvwM:PzeHHTXZF4o:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=8xmk9KXFvwM:PzeHHTXZF4o:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wiredprairie/~4/8xmk9KXFvwM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.wiredprairie.us/blog/index.php/archives/1520/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.wiredprairie.us/blog/index.php/archives/1520</feedburner:origLink></item>
		<item>
		<title>Nest Thermostat Review, Update #9</title>
		<link>http://feedproxy.google.com/~r/wiredprairie/~3/UJ-cQqD7KC0/1508</link>
		<comments>http://www.wiredprairie.us/blog/index.php/archives/1508#comments</comments>
		<pubDate>Sun, 22 Jan 2012 15:57:37 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Recommendations]]></category>
		<category><![CDATA[Experience]]></category>
		<category><![CDATA[Issue]]></category>
		<category><![CDATA[Nest]]></category>
		<category><![CDATA[Problem]]></category>
		<category><![CDATA[Review]]></category>

		<guid isPermaLink="false">http://www.wiredprairie.us/blog/?p=1508</guid>
		<description><![CDATA[Summary/Index When I woke up this morning, I decided that I’d use the remote features of my Nest Thermostat to increase the temperature of the first floor as the normal schedule hadn’t started yet. Here’s what I saw on my iPad: Basement: ? First Floor: ? When I tapped the Basement image, this alert was [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.wiredprairie.us/blog/index.php/nest-thermostat-reviews">Summary/Index</a></p>
<p>When I woke up this morning, I decided that I’d use the remote features of my Nest Thermostat to increase the temperature of the first floor as the normal schedule hadn’t started yet.</p>
<p>Here’s what I saw on my iPad:</p>
<p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image22.png" width="500" height="194" /></p>
<p>Basement: ?</p>
<p>First Floor: ?</p>
<p>When I tapped the Basement image, this alert was displayed:</p>
<p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image23.png" width="500" height="338" /></p>
<p>“Thermostat Disconnected: The thermostat Basement last connected to nest.com more than 7 hours ago.”</p>
<p><strong><font style="background-color: #ffff00">What? </font></strong></p>
<p>I next checked the First Floor. Thankfully, it said that it had only been 17 minutes since it last connected. I’ve seen that issue before and it usually resolves. But, I’ve never seen one go more than about <strike>50</strike> 53 minutes without reporting in.</p>
<p>The fact that I was using the iPad and the Nest application meant that WiFi Internet was available in our house. </p>
<p>I went to the Basement thermostat and noticed this glaring issue after clicking through to settings:</p>
<p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image24.png" width="240" height="226" /></p>
<p><strong><font style="background-color: #ffff00">What?</font>&#160; </strong>Seriously? </p>
<p>As I wasn’t sure what the best option was at 6:45AM for support, I decided to re-add the thermostat to our account. The thermostat had no trouble accessing the Nest cloud and obtaining one of the one time connection keys. (So, I maintain, it’s not general Internet connectivity issues).</p>
<p>After deleting and adding it back, the web site still reported it as MIA. So, I tried a reset:</p>
<p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image25.png" width="240" height="228" /></p>
<p>After resetting, and waiting several minutes after it had completely restarted, it appeared again on the Nest web site.</p>
<p>However, 3 hours later:</p>
<p><a href="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image26.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="image" border="0" alt="image" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image_thumb16.png" width="318" height="480" /></a></p>
<p>It&#8217;s again, gone missing. </p>
<p>So, I called support this fine Sunday morning and talked to one of the same support engineers I’ve spoken with in the past (“DK”). I explained the general problem (and emphasized that my biggest concern was that it had lost my account information), my “solution”, and said that it was again not reporting in. In a typical (somewhat ironic) support fashion, as I was explaining the issue and walking to the basement, the thermostat reported in successfully to the Nest cloud. </p>
<p>He had me drop the account, add it to my account, and restart it again. He said that resolves the problem in about 70% of the cases. In the other 30%, he mentioned that they often manually update the firmware and that will help. [ugh]</p>
<p>I’m going to keep an eye on it and will add more details as needed/available.</p>
<p>&#160;</p>
<p>If you want to talk and discuss more about digital thermostats with others, I’d suggest here: <a href="http://digtstat.com/">digtstat.com</a> (it’s a web site I created to help provide a better place to have discussions about the Nest thermostat). </p>

<p><a href="http://feedads.g.doubleclick.net/~a/d07aK9BA66Lu8v-efHh3nEjaWOE/0/da"><img src="http://feedads.g.doubleclick.net/~a/d07aK9BA66Lu8v-efHh3nEjaWOE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/d07aK9BA66Lu8v-efHh3nEjaWOE/1/da"><img src="http://feedads.g.doubleclick.net/~a/d07aK9BA66Lu8v-efHh3nEjaWOE/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wiredprairie?a=UJ-cQqD7KC0:CttJu4-pxpI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=UJ-cQqD7KC0:CttJu4-pxpI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=UJ-cQqD7KC0:CttJu4-pxpI:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=UJ-cQqD7KC0:CttJu4-pxpI:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=UJ-cQqD7KC0:CttJu4-pxpI:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=UJ-cQqD7KC0:CttJu4-pxpI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=UJ-cQqD7KC0:CttJu4-pxpI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=UJ-cQqD7KC0:CttJu4-pxpI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=UJ-cQqD7KC0:CttJu4-pxpI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=UJ-cQqD7KC0:CttJu4-pxpI:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wiredprairie/~4/UJ-cQqD7KC0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.wiredprairie.us/blog/index.php/archives/1508/feed</wfw:commentRss>
		<slash:comments>27</slash:comments>
		<feedburner:origLink>http://www.wiredprairie.us/blog/index.php/archives/1508</feedburner:origLink></item>
		<item>
		<title>Macbook Pro battery fails to charge</title>
		<link>http://feedproxy.google.com/~r/wiredprairie/~3/CHx2hGbmTTA/1499</link>
		<comments>http://www.wiredprairie.us/blog/index.php/archives/1499#comments</comments>
		<pubDate>Sat, 21 Jan 2012 19:27:13 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[MacBook Pro]]></category>

		<guid isPermaLink="false">http://www.wiredprairie.us/blog/?p=1499</guid>
		<description><![CDATA[The non replaceable battery on my Macbook Pro (2010) had discharged recently completely as I’d left the laptop unplugged for more than a month without turning it on. When I went to use it this morning, I plugged it in, and then turned it on. After a few minutes of use, the battery status still [...]]]></description>
			<content:encoded><![CDATA[<p>The non replaceable battery on my Macbook Pro (2010) had discharged recently completely as I’d left the laptop unplugged for more than a month without turning it on. </p>
<p>When I went to use it this morning, I plugged it in, and then turned it on. After a few minutes of use, the battery status still showed as “not charging.” </p>
<p><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image21.png" width="122" height="22" /></p>
<p>The light on the mag-safe connection was green, as if the battery was completely charged. </p>
<p>When I depressed the battery indicator button on the side of the MacBook Pro, the response was 5 quick green flashes on the first LED. <a href="http://support.apple.com/kb/HT3205">According</a> to Apple support, that indicates the battery hasn’t been charged to what’s required for a single indicator light yet. However, while my MacBook Pro had discharged like this before, it would normally start charging right away.</p>
<p>So, apparently, before taking it in for a repair (which is what a lot of people in forums were recommending), you might try resetting the <a href="http://support.apple.com/kb/HT3964?viewlocale=en_US">System Management Controller</a>. One of the issues that a reset could fix is that the battery does not appear to be charging properly. </p>
<p>To reset the controller, perform these steps (as documented on the Apple Support web site):</p>
<ol>
<li>Shut down your laptop completely. </li>
<li>Plug in the MagSafe power adapter to a power source, connecting it to the MacBook if its not already connected. </li>
<li>On the built-in keyboard, press the (left side) Shift-Control-Option keys and the power button at the same time.&#160; [Wow, it’s awkward to do that! I pressed the S-C-O keys first and then the power button and it worked]</li>
<li>Release all the keys and the power button at the same time. </li>
<li>Press the power button to turn on the computer.&#160; <strong>       <br />Note</strong>: The LED on the MagSafe power adapter may change states or temporarily turn off when you reset the SMC.</li>
</ol>
<p>A few moments after I performed the steps above, the mag safe LED light switched to an orange color (charging) and the battery indicator no longer blinked 5 times quickly.</p>
<p>Problem resolved, and much simpler than taking it to a local Apple “Genius” bar.</p>
<p><em>As this wasn’t an obvious fix, I’ve decided to put this on my blog in the hope that someone else might find it useful, and so when I have this happen again, I don’t need to go hunting for the solution! <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/wlEmoticon-smile6.png" /></em></p>

<p><a href="http://feedads.g.doubleclick.net/~a/SjZj1bO2W3QYHv7fVCuURtNEils/0/da"><img src="http://feedads.g.doubleclick.net/~a/SjZj1bO2W3QYHv7fVCuURtNEils/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/SjZj1bO2W3QYHv7fVCuURtNEils/1/da"><img src="http://feedads.g.doubleclick.net/~a/SjZj1bO2W3QYHv7fVCuURtNEils/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wiredprairie?a=CHx2hGbmTTA:iGrnbGY_F1s:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=CHx2hGbmTTA:iGrnbGY_F1s:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=CHx2hGbmTTA:iGrnbGY_F1s:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=CHx2hGbmTTA:iGrnbGY_F1s:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=CHx2hGbmTTA:iGrnbGY_F1s:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=CHx2hGbmTTA:iGrnbGY_F1s:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=CHx2hGbmTTA:iGrnbGY_F1s:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=CHx2hGbmTTA:iGrnbGY_F1s:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=CHx2hGbmTTA:iGrnbGY_F1s:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=CHx2hGbmTTA:iGrnbGY_F1s:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wiredprairie/~4/CHx2hGbmTTA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.wiredprairie.us/blog/index.php/archives/1499/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.wiredprairie.us/blog/index.php/archives/1499</feedburner:origLink></item>
		<item>
		<title>Announcing digtstat.com</title>
		<link>http://feedproxy.google.com/~r/wiredprairie/~3/u08EHs5AKk0/1488</link>
		<comments>http://www.wiredprairie.us/blog/index.php/archives/1488#comments</comments>
		<pubDate>Sat, 14 Jan 2012 23:20:47 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.wiredprairie.us/blog/?p=1488</guid>
		<description><![CDATA[Last week Johnk suggested in a comment that someone in the user community should set up a forum for discussion of the Nest thermostat. I have done just that this afternoon. It’s brand new, and hasn’t had the tires kicked much yet (just the absolute basics), but I thought I’d put something out there as [...]]]></description>
			<content:encoded><![CDATA[<p>Last week Johnk suggested in a comment that someone in the user community should set up a forum for discussion of the Nest thermostat.</p>
<p>I have done just that this afternoon. <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/wlEmoticon-smile5.png" /></p>
<p>It’s brand new, and hasn’t had the tires kicked much yet (just the absolute basics), but I thought I’d put something out there as the comments and discussion have outgrown my installation of WordPress (and it’s ability to nicely manage a discussion effectively about multiple topics). I really enjoy the conversation and thought it might be best provided in a different forum (pun intended). </p>
<p>It’s here: <a href="http://digtstat.com">digtstat.com</a>. (It’s short for <strong>Dig</strong>ital <strong>T</strong>hermo<strong>stat</strong>)</p>
<p>If there’s enough traffic to warrant it, I’ll definitely promote some others as moderators, as it <strong>will</strong> be kept a civil location for discussions about digital thermostats.</p>
<p>Enjoy.</p>
<p><a href="http://digtstat.com"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image20.png" width="500" height="415" /></a></p>

<p><a href="http://feedads.g.doubleclick.net/~a/sWVvaTTc62XNE8pD7OQ8xlWCmfo/0/da"><img src="http://feedads.g.doubleclick.net/~a/sWVvaTTc62XNE8pD7OQ8xlWCmfo/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/sWVvaTTc62XNE8pD7OQ8xlWCmfo/1/da"><img src="http://feedads.g.doubleclick.net/~a/sWVvaTTc62XNE8pD7OQ8xlWCmfo/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wiredprairie?a=u08EHs5AKk0:Pq6KEm3KW9o:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=u08EHs5AKk0:Pq6KEm3KW9o:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=u08EHs5AKk0:Pq6KEm3KW9o:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=u08EHs5AKk0:Pq6KEm3KW9o:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=u08EHs5AKk0:Pq6KEm3KW9o:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=u08EHs5AKk0:Pq6KEm3KW9o:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=u08EHs5AKk0:Pq6KEm3KW9o:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=u08EHs5AKk0:Pq6KEm3KW9o:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=u08EHs5AKk0:Pq6KEm3KW9o:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=u08EHs5AKk0:Pq6KEm3KW9o:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wiredprairie/~4/u08EHs5AKk0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.wiredprairie.us/blog/index.php/archives/1488/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.wiredprairie.us/blog/index.php/archives/1488</feedburner:origLink></item>
		<item>
		<title>Nest Thermostat Review, Update #8</title>
		<link>http://feedproxy.google.com/~r/wiredprairie/~3/ssLoAFqadkY/1482</link>
		<comments>http://www.wiredprairie.us/blog/index.php/archives/1482#comments</comments>
		<pubDate>Sat, 14 Jan 2012 16:35:17 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Recommendations]]></category>
		<category><![CDATA[Experience]]></category>
		<category><![CDATA[Issue]]></category>
		<category><![CDATA[Nest]]></category>
		<category><![CDATA[Problem]]></category>
		<category><![CDATA[Review]]></category>

		<guid isPermaLink="false">http://www.wiredprairie.us/blog/?p=1482</guid>
		<description><![CDATA[Summary/Index A few new things have occurred since I last posted. January 11, 2012: Nest Labs updated the firmware of the thermostat to version 1.0.6. There isn’t any publically available information about what was updated however other than “bug fixes.” Thanks to GregN for pointing it out. Here’s a link to their current software releases [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.wiredprairie.us/blog/index.php/nest-thermostat-reviews">Summary/Index</a></p>
<p>A few new things have occurred since I last posted.</p>
<p><a href="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image19.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image_thumb15.png" width="240" height="74" /></a>January 11, 2012: Nest Labs updated the firmware of the thermostat to version 1.0.6. There isn’t any publically available information about what was updated however other than “bug fixes.” Thanks to <strong>GregN</strong> for pointing it out. Here’s a link to their current software releases and updates for anyone interested:</p>
<p><a href="http://support.nest.com/customer/portal/articles/246009-nest-learning-thermostat-nest-mobile-software-updates">http://support.nest.com/customer/portal/articles/246009-nest-learning-thermostat-nest-mobile-software-updates</a></p>
<p>This week, one of my thermostats in “learning” mode wiped out some of the set points I had specifically added for the weekend (this has happened before). I have no rational explanation for why it would do this as our weekend schedule on the floor where it happened is routine enough that it shouldn’t have made that choice. Nest Labs support suggests turning off “learning” mode when this has occurred to see if it’s related to learning mode. They apparently don’t have a way to track the causes or triggers unfortunately (a debug log would come in very handy now). I turned it off for the time being and have added the deleted set points to see if the problem occurs again.</p>
<p><font style="background-color: #ffff00">UPDATE: 1/25/2012:</font>&#160; One of our thermostats that still has “learning” turned off decided that our morning set points for our first floor weren’t important and deleted them. Apparently, we didn’t want the house to start warming before we got out of bed. </p>
<p>I found an interesting issue with the Away Temperature settings that you’ll want to watch out for until they fix it (as it could affect triggers for “auto away”).</p>
<p>Essentially, there are values that when you put them into the away temperature field, they won’t “stick.” You won’t necessarily notice this right away unless you click around:</p>
<p><a href="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/nestrounding.gif"><img style="display: inline" title="nestrounding" alt="nestrounding" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/nestrounding_thumb.gif" width="508" height="348" /></a></p>
<p>In the video (GIF) above, you’ll see how the “58” won’t stay 58F. It switches to 57 (it happens with 60F as well). I’ve sent a support request to Nest about the issue (they responded the following day and said they’d look into it). Since their web API deals with Celsius, I speculate it could be a rounding issue in their JavaScript code.</p>
<p><font style="background-color: #ffff00">Update: 1/24/2012</font> The bug appears appears to have been corrected in the few places I happened to check earlier today (as I’m not their QA team, I didn’t check around much <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/wlEmoticon-smile7.png" />).</p>
<p><strong>Randal</strong> pointed out that there was someone who’d done some <a href="http://davidwallen.net/2012/01/nest-learning-thermostat-initial-data/">analysis</a> of the temperature readings of a working Nest thermostat (compared to another thermostat). I’d concur that the readings do seem to be far more consistently accurate on the Nest thermostat on average and that our house is more comfortable. However, I’m certainly aware that this comfort will come at a cost. The house is more consistently warmer (now in the heating season). So, depending on your old thermostats and how you handled the temperature in the house, you may find your heating costs rise a bit. Simple way to compensate: you may be able to turn down the thermostat a few degrees! <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/wlEmoticon-smile4.png" /> The temperature may read lower, but the actual temperature may be closer to what you had grown accustomed to. We may do that.</p>
<p>I’m still trying to understand why “Auto Away” is sometimes triggered when I wouldn’t expect it. I believe that once it was because the “away” temperatures were one degree LESS than the typical set point. So, the house would not “see us” around, and compared the day time (at work for example) set point (60F) to the “away” temperature (59F) and activate the “away” mode. I found the issue with the away temperature above when I was trying to make everything match one evening this week.&#160; The problem with Auto-away activating is that your scheduled set points won’t be used until it is overridden via the remote interface or locally.</p>
<p><font style="background-color: #ffff00">Update: 1/25/2012</font>: Apparently, auto-away unfortunately can trigger even when the temperature settings match exactly. (Even when there’s nothing to do). I don’t understand what it’s “auto-awaying” from. </p>
<p>Here’s a few relevant tweets from <a href="https://twitter.com/#!/nest">@Nest</a>:</p>
<p><a href="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image27.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image_thumb17.png" width="515" height="366" /></a></p>
<p>Although I admit to not understanding the topmost tweet. My tweet had been:</p>
<p><a href="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image28.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image_thumb18.png" width="524" height="221" /></a></p>
<p>I honestly didn’t feel like trying to clarify again in 140 characters.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/9s5PkoJxz_pI4rS-wwqCKZUdAWI/0/da"><img src="http://feedads.g.doubleclick.net/~a/9s5PkoJxz_pI4rS-wwqCKZUdAWI/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/9s5PkoJxz_pI4rS-wwqCKZUdAWI/1/da"><img src="http://feedads.g.doubleclick.net/~a/9s5PkoJxz_pI4rS-wwqCKZUdAWI/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wiredprairie?a=ssLoAFqadkY:rHQFo4KtJ_E:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=ssLoAFqadkY:rHQFo4KtJ_E:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=ssLoAFqadkY:rHQFo4KtJ_E:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=ssLoAFqadkY:rHQFo4KtJ_E:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=ssLoAFqadkY:rHQFo4KtJ_E:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=ssLoAFqadkY:rHQFo4KtJ_E:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=ssLoAFqadkY:rHQFo4KtJ_E:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=ssLoAFqadkY:rHQFo4KtJ_E:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=ssLoAFqadkY:rHQFo4KtJ_E:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=ssLoAFqadkY:rHQFo4KtJ_E:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wiredprairie/~4/ssLoAFqadkY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.wiredprairie.us/blog/index.php/archives/1482/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://www.wiredprairie.us/blog/index.php/archives/1482</feedburner:origLink></item>
		<item>
		<title>.NET API for Nest Thermostat</title>
		<link>http://feedproxy.google.com/~r/wiredprairie/~3/5b_jp3JPd8I/1449</link>
		<comments>http://www.wiredprairie.us/blog/index.php/archives/1449#comments</comments>
		<pubDate>Tue, 10 Jan 2012 02:50:22 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Nest]]></category>
		<category><![CDATA[Thermostat]]></category>

		<guid isPermaLink="false">http://www.wiredprairie.us/blog/?p=1449</guid>
		<description><![CDATA[I just finished a preliminary read-only (think version 0.1) wrapper around the Nest Thermostat API that is used by their mobile phone and web applications. As Nest doesn’t have a formal API yet, the code could break at any time and may not be suitable for any use. However, it is working today. The project [...]]]></description>
			<content:encoded><![CDATA[<p>I just finished a preliminary <strong>read-only</strong> (think version 0.1) wrapper around the Nest Thermostat API that is used by their mobile phone and web applications. As Nest doesn’t have a formal API yet, the code could break at any time and may not be suitable for any use. However, it is working today. <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/wlEmoticon-smile3.png" /></p>
<p>The project is hosted on <a href="https://github.com/wiredprairie/Nest-Thermostat-DotNET-API">GitHub</a>. It uses <a href="http://james.newtonking.com/pages/json-net.aspx">JSON.NET</a> for parsing the return values from the Nest servers.</p>
<p>There are three projects, with the lib containing the assembly that is used by the two test applications. One is a console app and the other a simple WPF application:</p>
<p><a href="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/SNAGHTML88bff0b3.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="SNAGHTML88bff0b3" border="0" alt="SNAGHTML88bff0b3" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/SNAGHTML88bff0b3_thumb.png" width="424" height="332" /></a></p>
<p>(My thermostats are named Zero, One, and Two).</p>
<p>If there’s interest, I plan on adding some methods to the library which allow modification of data (such as the current temperature), and ideally, support for live updates from the devices if I can make sense of the data that is <a href="http://www.wiredprairie.us/blog/index.php/archives/1442">returned</a>.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/rC0ovukgbxljqStzErzmE_7gmNk/0/da"><img src="http://feedads.g.doubleclick.net/~a/rC0ovukgbxljqStzErzmE_7gmNk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/rC0ovukgbxljqStzErzmE_7gmNk/1/da"><img src="http://feedads.g.doubleclick.net/~a/rC0ovukgbxljqStzErzmE_7gmNk/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wiredprairie?a=5b_jp3JPd8I:Y2J4pouvqBM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=5b_jp3JPd8I:Y2J4pouvqBM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=5b_jp3JPd8I:Y2J4pouvqBM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=5b_jp3JPd8I:Y2J4pouvqBM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=5b_jp3JPd8I:Y2J4pouvqBM:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=5b_jp3JPd8I:Y2J4pouvqBM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=5b_jp3JPd8I:Y2J4pouvqBM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=5b_jp3JPd8I:Y2J4pouvqBM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=5b_jp3JPd8I:Y2J4pouvqBM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=5b_jp3JPd8I:Y2J4pouvqBM:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wiredprairie/~4/5b_jp3JPd8I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.wiredprairie.us/blog/index.php/archives/1449/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.wiredprairie.us/blog/index.php/archives/1449</feedburner:origLink></item>
		<item>
		<title>Nest Thermostat API/Protocol</title>
		<link>http://feedproxy.google.com/~r/wiredprairie/~3/oxsiqiYxDy4/1442</link>
		<comments>http://www.wiredprairie.us/blog/index.php/archives/1442#comments</comments>
		<pubDate>Sun, 08 Jan 2012 17:21:05 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Nest]]></category>
		<category><![CDATA[Protocol]]></category>
		<category><![CDATA[Thermostat]]></category>

		<guid isPermaLink="false">http://www.wiredprairie.us/blog/?p=1442</guid>
		<description><![CDATA[While Nest Labs hasn’t released a formal (documented &#38; supported) API, I thought I’d do a bit of digging to see how they’re using the network and what might be achievable. A few things are going on, the majority as you’d probably expect. The web interface is using a long polling technique apparently to watch [...]]]></description>
			<content:encoded><![CDATA[<p>While Nest Labs hasn’t released a formal (documented &amp; supported) API, I thought I’d do a bit of digging to see how they’re using the network and what might be achievable.</p>
<p>A few things are going on, the majority as you’d probably expect.</p>
<p>The web interface is using a long polling technique apparently to watch for updates to the schedule, temperature, etc. </p>
<p><a href="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image7.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image_thumb7.png" width="381" height="225" /></a></p>
<p>I haven’t determined what the frequency is though, or the wait time. It’s very inconsistent, even when I wouldn’t expect much new “live” data to be available on the network, it frequently updates and polls again.</p>
<p>There are a few constants set in the HOME page script:</p>
<pre class="csharpcode">C.ABSENT_USER_THRESHOLD     = +(<span class="str">'300'</span>) || 0;  <span class="rem">// seconds</span>
C.DEAD_DEVICE_THRESHOLD     = +(<span class="str">'300'</span>) || 0;  <span class="rem">// seconds</span>
C.pollingInterval           = +(<span class="str">'2500'</span>) || 0;       <span class="rem">// ms</span>
C.WEATHER_POLLING_INTERVAL  = +(<span class="str">'120000'</span>) || 0; <span class="rem">// ms</span></pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>If the C.pollingInterval value were for the subscribe endpoint mentioned above, I’d see a LOT more calls than I do – so I’m still not clear how the polling interval is decided.</p>
<p>The API calls, for the most part are using JSONP syntax over an HTTPS connection.</p>
<p>The most frequent request is to “subscribe.” It sends as part of the GET request a large block of encoded JSON (using encodeURIComponent and then JSON.stringify). </p>
<p>I&#8217;m not familiar with the key/value system that they’re using (it may just be something they’ve constructed in-house – although given the number of <a href="http://www.wiredprairie.us/blog/index.php/archives/1397">open source JavaScript</a> libraries they’re using, I thought someone might recognize it):</p>
<p>“<strong>key</strong>”, “{<strong>actualkey</strong>}.{<strong>value</strong>}”</p>
<p>I don’t understand why they’ve redundantly specified “key” in a list of keys when it’s evident that the <em>actual key<strong> </strong></em>is contained within the value as a delimited string. It’s more data to send and more data to parse this way. So, again, maybe it’s based on some DB or model system I’m not familiar with. (Anyone recognize it?)</p>
<p>I’ve substituted the actual values (as they are serial numbers of my devices) with text representations of what the value represented below:</p>
<pre class="csharpcode">{<span class="str">&quot;keys&quot;</span>:
    [{<span class="str">&quot;key&quot;</span>:<span class="str">&quot;user.#USERID#&quot;</span>,
        <span class="str">&quot;version&quot;</span>:209478897,<span class="str">&quot;timestamp&quot;</span>:1324159145000},
    {<span class="str">&quot;key&quot;</span>:<span class="str">&quot;user_alert_dialog.#USERID#&quot;</span>,
        <span class="str">&quot;version&quot;</span>:-1320296685,<span class="str">&quot;timestamp&quot;</span>:1325967612000},
    {<span class="str">&quot;key&quot;</span>:<span class="str">&quot;structure.#STRUCTURE-GUID#&quot;</span>,
        <span class="str">&quot;version&quot;</span>:656192675,<span class="str">&quot;timestamp&quot;</span>:1325967612000},
    {<span class="str">&quot;key&quot;</span>:<span class="str">&quot;device.#DEVICE 1 SERIAL NUMBER#&quot;</span>,
        <span class="str">&quot;version&quot;</span>:1485027516,<span class="str">&quot;timestamp&quot;</span>:1326034984000},
    {<span class="str">&quot;key&quot;</span>:<span class="str">&quot;shared.#DEVICE 1 SERIAL NUMBER#&quot;</span>,
        <span class="str">&quot;version&quot;</span>:588844038,<span class="str">&quot;timestamp&quot;</span>:1326034818000},
    {<span class="str">&quot;key&quot;</span>:<span class="str">&quot;schedule.#DEVICE 1 SERIAL NUMBER#&quot;</span>,
        <span class="str">&quot;version&quot;</span>:1187107985,<span class="str">&quot;timestamp&quot;</span>:1326005677000},
    {<span class="str">&quot;key&quot;</span>:<span class="str">&quot;track.#DEVICE 1 SERIAL NUMBER#&quot;</span>,
        <span class="str">&quot;timestamp&quot;</span>:1326035650601,<span class="str">&quot;version&quot;</span>:1041047847},
    {<span class="str">&quot;key&quot;</span>:<span class="str">&quot;device.#DEVICE 2 SERIAL NUMBER#&quot;</span>,
        <span class="str">&quot;version&quot;</span>:149169270,<span class="str">&quot;timestamp&quot;</span>:1326034820000},
    {<span class="str">&quot;key&quot;</span>:<span class="str">&quot;shared.#DEVICE 2 SERIAL NUMBER#&quot;</span>,
        <span class="str">&quot;version&quot;</span>:659841570,<span class="str">&quot;timestamp&quot;</span>:1326034820000},
    {<span class="str">&quot;key&quot;</span>:<span class="str">&quot;schedule.#DEVICE 2 SERIAL NUMBER#&quot;</span>,
        <span class="str">&quot;version&quot;</span>:-2016290692,<span class="str">&quot;timestamp&quot;</span>:1326005625000},
    {<span class="str">&quot;key&quot;</span>:<span class="str">&quot;track.#DEVICE 2 SERIAL NUMBER#&quot;</span>,
        <span class="str">&quot;timestamp&quot;</span>:1326035650862,<span class="str">&quot;version&quot;</span>:528978433},
    {<span class="str">&quot;key&quot;</span>:<span class="str">&quot;device.#DEVICE 3 SERIAL NUMBER#&quot;</span>,
        <span class="str">&quot;version&quot;</span>:1637112547,<span class="str">&quot;timestamp&quot;</span>:1326035399000},
    {<span class="str">&quot;key&quot;</span>:<span class="str">&quot;shared.#DEVICE 3 SERIAL NUMBER#&quot;</span>,
        <span class="str">&quot;version&quot;</span>:760504326,<span class="str">&quot;timestamp&quot;</span>:1326035397000},
    {<span class="str">&quot;key&quot;</span>:<span class="str">&quot;schedule.#DEVICE 3 SERIAL NUMBER#&quot;</span>,
        <span class="str">&quot;version&quot;</span>:-314552357,<span class="str">&quot;timestamp&quot;</span>:1326003402000},
    {<span class="str">&quot;key&quot;</span>:<span class="str">&quot;track.#DEVICE 3 SERIAL NUMBER#&quot;</span>,
        <span class="str">&quot;version&quot;</span>:-645931164,<span class="str">&quot;timestamp&quot;</span>:1326035531802}]}&quot;</pre>
<p>We’ve got three thermostats, so there are always three sets of subscription requests for each call to <strong>subscribe.</strong> </p>
<p>Using my iPad, I adjusted the set point for our second story (#DEVICE 2#) down one degree Fahrenheit (to 67°).</p>
<p>Within approximately a second, the most recent pending <strong>subscribe</strong> request returned with a far more interesting payload:</p>
<pre class="csharpcode">
jQuery17108417355176061392_1326035646750(
    { <span class="str">&quot;status&quot;</span>: 200,
        <span class="str">&quot;headers&quot;</span>: {
            <span class="str">&quot;X-nl-skv-key&quot;</span>: <span class="str">&quot;shared.#DEVICE 2 SERIAL NUMBER#&quot;</span>,
            <span class="str">&quot;X-nl-skv-version&quot;</span>: 869022424,
            <span class="str">&quot;X-nl-skv-timestamp&quot;</span>: 1326038279000,
            <span class="str">&quot;X-nl-service-timestamp&quot;</span>: 1326038279825
        },
        <span class="str">&quot;payload&quot;</span>: {
            <span class="str">&quot;current_temperature&quot;</span>: 19.98,
            <span class="str">&quot;hvac_fan_state&quot;</span>: <span class="kwrd">false</span>,
            <span class="str">&quot;name&quot;</span>: <span class="str">&quot;TWO&quot;</span>, <span class="str">&quot;hvac_heat_x2_state&quot;</span>: <span class="kwrd">false</span>,
            <span class="str">&quot;hvac_ac_state&quot;</span>: <span class="kwrd">false</span>,
            <span class="str">&quot;can_cool&quot;</span>: <span class="kwrd">true</span>,
            <span class="str">&quot;auto_away&quot;</span>: 0,
            <span class="str">&quot;compressor_lockout_enabled&quot;</span>: <span class="kwrd">false</span>,
            <span class="str">&quot;target_temperature_low&quot;</span>: 16.66667,
            <span class="str">&quot;target_temperature_high&quot;</span>: 26.66667,
            <span class="str">&quot;compressor_lockout_timeout&quot;</span>: 0,
            <span class="str">&quot;hvac_heater_state&quot;</span>: <span class="kwrd">false</span>,
            <span class="str">&quot;hvac_aux_heater_state&quot;</span>: <span class="kwrd">false</span>,
            <span class="str">&quot;target_temperature&quot;</span>: 19.44444,
            <span class="str">&quot;can_heat&quot;</span>: <span class="kwrd">true</span>,
            <span class="str">&quot;target_temperature_type&quot;</span>: <span class="str">&quot;heat&quot;</span>,
            <span class="str">&quot;target_change_pending&quot;</span>: <span class="kwrd">true</span>
        }
    });</pre>
<p>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>Everything above is needed to update the current state of the UI. As you can see, the current temperature (returned as Celsius apparently) is 19.98 (67.964°F). The current temperature as displayed on the thermostat and the web UI was 68.</p>
<p><em>Seeing these return values makes me think that they may be using Ruby and Rails (as the naming convention tends to follow Rails naming using underscores between words). I know for example, I wouldn’t name variables/columns that way when building a C#/JavaScript MVC project.</em></p>
<p><font color="#333333">Rather than just a delta payload of what’s changed, they’ve currently opted for a full update of all information related to the thermostat state. </font></p>
<p><font color="#333333">Several seconds later, a much larger payload was returned to a <strong>subscribe </strong>request:</font></p>
<pre class="csharpcode"><span class="str">&quot;status&quot;</span>: 200,
<span class="str">&quot;headers&quot;</span>: {
    <span class="str">&quot;X-nl-skv-key&quot;</span>: <span class="str">&quot;device.#DEVICE 2 SERIAL NUMBER#&quot;</span>,
    <span class="str">&quot;X-nl-skv-version&quot;</span>: -2086438581,
    <span class="str">&quot;X-nl-skv-timestamp&quot;</span>: 1326038378000,
    <span class="str">&quot;X-nl-service-timestamp&quot;</span>: 1326038379023
},
<span class="str">&quot;payload&quot;</span>: {
    <span class="str">&quot;ob_orientation&quot;</span>: <span class="str">&quot;O&quot;</span>,
    <span class="str">&quot;upper_safety_temp&quot;</span>: 1000.0,
    <span class="str">&quot;forced_air&quot;</span>: <span class="kwrd">true</span>,
    <span class="str">&quot;creation_time&quot;</span>: 1324142042019,
    <span class="str">&quot;switch_preconditioning_control&quot;</span>: <span class="kwrd">false</span>,
    <span class="str">&quot;click_sound&quot;</span>: <span class="str">&quot;on&quot;</span>,
    <span class="str">&quot;leaf&quot;</span>: <span class="kwrd">false</span>, <span class="str">&quot;user_brightness&quot;</span>: <span class="str">&quot;auto&quot;</span>,
    <span class="str">&quot;learning_state&quot;</span>: <span class="str">&quot;steady&quot;</span>,
    <span class="str">&quot;heat_pump_comp_threshold&quot;</span>: -1000.0,
    <span class="str">&quot;local_ip&quot;</span>: <span class="str">&quot;10.0.0.205&quot;</span>,
    <span class="str">&quot;backplate_serial_number&quot;</span>: <span class="str">&quot;#SHOULD BE DEVICE 2 SERIAL NUMBER, BUT ISN'T?#&quot;</span>,
    <span class="str">&quot;capability_level&quot;</span>: 1.03,
    <span class="str">&quot;postal_code&quot;</span>: <span class="str">&quot;#POSTALCODE#&quot;</span>,
    <span class="str">&quot;upper_safety_temp_enabled&quot;</span>: <span class="kwrd">false</span>,
    <span class="str">&quot;heat_pump_aux_threshold&quot;</span>: 10.0,
    <span class="str">&quot;lower_safety_temp_enabled&quot;</span>: <span class="kwrd">true</span>,
    <span class="str">&quot;serial_number&quot;</span>: <span class="str">&quot;#DEVICE 2 SERIAL NUMBER#&quot;</span>,
    <span class="str">&quot;temperature_lock&quot;</span>: <span class="kwrd">false</span>,
    <span class="str">&quot;learning_time&quot;</span>: 1002,
    <span class="str">&quot;current_version&quot;</span>: <span class="str">&quot;1.0.4&quot;</span>,
    <span class="str">&quot;model_version&quot;</span>: <span class="str">&quot;Diamond-1.10&quot;</span>,
    <span class="str">&quot;backplate_bsl_info&quot;</span>: <span class="str">&quot;BSL&quot;</span>,
    <span class="str">&quot;auto_away_enable&quot;</span>: <span class="kwrd">true</span>,
    <span class="str">&quot;heat_pump_comp_threshold_enabled&quot;</span>: <span class="kwrd">false</span>,
    <span class="str">&quot;fan_mode&quot;</span>: <span class="str">&quot;auto&quot;</span>,
    <span class="str">&quot;range_enable&quot;</span>: <span class="kwrd">false</span>,
    <span class="str">&quot;temperature_scale&quot;</span>: <span class="str">&quot;F&quot;</span>,
    <span class="str">&quot;backplate_mono_info&quot;</span>: <span class="str">&quot;TFE (BP_DVT) 3.5.2 (ehs@ubuntu) 2011-11-05 12:00:00&quot;</span>,
    <span class="str">&quot;backplate_bsl_version&quot;</span>: <span class="str">&quot;1.1&quot;</span>,
    <span class="str">&quot;equipment_type&quot;</span>: <span class="str">&quot;gas&quot;</span>,
    <span class="str">&quot;range_mode&quot;</span>: <span class="kwrd">false</span>,
    <span class="str">&quot;lower_safety_temp&quot;</span>: 7.0,
    <span class="str">&quot;has_fan&quot;</span>: <span class="kwrd">true</span>,
    <span class="str">&quot;hvac_wires&quot;</span>: <span class="str">&quot;Heat,Cool,Fan,Common Wire,Rc&quot;</span>,
    <span class="str">&quot;learning_mode&quot;</span>: <span class="kwrd">true</span>,
    <span class="str">&quot;away_temperature_high&quot;</span>: 32.0,
    <span class="str">&quot;switch_system_off&quot;</span>: <span class="kwrd">false</span>,
    <span class="str">&quot;time_to_target&quot;</span>: 1326039444,
    <span class="str">&quot;away_temperature_low&quot;</span>: 14.444444444444445,
    <span class="str">&quot;current_humidity&quot;</span>: 45,
    <span class="str">&quot;mac_address&quot;</span>: <span class="str">&quot;#MACADDR#&quot;</span>,
    <span class="str">&quot;backplate_mono_version&quot;</span>: <span class="str">&quot;3.5.2&quot;</span>,
    <span class="str">&quot;has_aux_heat&quot;</span>: <span class="kwrd">false</span>,
    <span class="str">&quot;type&quot;</span>: <span class="str">&quot;TBD&quot;</span>,
    <span class="str">&quot;hvac_pins&quot;</span>: <span class="str">&quot;W1,Y1,C,Rc,G&quot;</span>,
    <span class="str">&quot;has_heat_pump&quot;</span>: <span class="kwrd">false</span>,
    <span class="str">&quot;heat_pump_aux_threshold_enabled&quot;</span>: <span class="kwrd">true</span>,
    <span class="str">&quot;battery_level&quot;</span>: 3.945,
    <span class="str">&quot;target_time_confidence&quot;</span>: 1.0
}</pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>A few things to note:</p>
<li><strong>Upper_safety_temperature </strong>is just a bit beyond my comfort zone at 1832°F. I don’t know why it’s sending a value like that to the client, and why it’s stupidly high.</li>
<li>The backplate serial number doesn’t match with the thermostat according to the payload response. I don’t know why this might be as I confirmed that the numbers matched through visual inspection of the device just now.</li>
<li>The majority of these details are exposed in one way or another in the details area of the web UI.</li>
<li>Time to target (payload.time_to_target) is unusual in that it’s a JavaScript Date value, divided by 1000. So, in the example above, the time to target is: <strong>new Date(1326039444 * 1000).toString() = &gt;&quot;Sun Jan 08 2012 10:17:24 GMT-0600 (Central Standard Time)&quot;</strong></li>
<p>Next, a payload is returned with the new status:</p>
<pre class="csharpcode"><span class="str">&quot;status&quot;</span>: 200,
<span class="str">&quot;headers&quot;</span>: {
    <span class="str">&quot;X-nl-skv-key&quot;</span>: <span class="str">&quot;shared.#DEVICE 2 SERIAL NUMBER#&quot;</span>,
    <span class="str">&quot;X-nl-skv-version&quot;</span>: 1689916148,
    <span class="str">&quot;X-nl-skv-timestamp&quot;</span>: 1326038378000,
    <span class="str">&quot;X-nl-service-timestamp&quot;</span>: 1326038379151
},
<span class="str">&quot;payload&quot;</span>: {
    <span class="str">&quot;hvac_fan_state&quot;</span>: <span class="kwrd">false</span>,
    <span class="str">&quot;name&quot;</span>: <span class="str">&quot;TWO&quot;</span>,
    <span class="str">&quot;hvac_heat_x2_state&quot;</span>: <span class="kwrd">false</span>,
    <span class="str">&quot;hvac_ac_state&quot;</span>: <span class="kwrd">false</span>,
    <span class="str">&quot;can_cool&quot;</span>: <span class="kwrd">true</span>,
    <span class="str">&quot;auto_away&quot;</span>: 0,
    <span class="str">&quot;compressor_lockout_enabled&quot;</span>: <span class="kwrd">false</span>,
    <span class="str">&quot;target_temperature_low&quot;</span>: 16.66667,
    <span class="str">&quot;current_temperature&quot;</span>: 19.53,
    <span class="str">&quot;target_temperature_high&quot;</span>: 26.66667,
    <span class="str">&quot;compressor_lockout_timeout&quot;</span>: 0,
    <span class="str">&quot;target_change_pending&quot;</span>: <span class="kwrd">false</span>,
    <span class="str">&quot;hvac_aux_heater_state&quot;</span>: <span class="kwrd">false</span>,
    <span class="str">&quot;target_temperature&quot;</span>: 20.55556,
    <span class="str">&quot;can_heat&quot;</span>: <span class="kwrd">true</span>,
    <span class="str">&quot;target_temperature_type&quot;</span>: <span class="str">&quot;heat&quot;</span>,
    <span class="str">&quot;hvac_heater_state&quot;</span>: <span class="kwrd">true</span>
}</pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>Here, the <strong>hvac_heater_state</strong> is set to <strong>true</strong>. The furnace is on.</p>
<p>A little while later, that value is set to <strong>false.</strong></p>
<p>Occasionally, the payload includes the complete schedule for the thermostat. I’m not going to reproduce the entire payload here as it’s too large, and quite boring. Here’s a snippet of what it returns:</p>
<pre class="csharpcode"><span class="str">&quot;schedule&quot;</span>: {
    <span class="str">&quot;#DEVICE 2 SERIAL NUMBER#&quot;</span>: {
        <span class="str">&quot;$version&quot;</span>: 1187107985,
        <span class="str">&quot;$timestamp&quot;</span>: 1326005677000,
        <span class="str">&quot;name&quot;</span>: <span class="str">&quot;One Current Schedule&quot;</span>,
        <span class="str">&quot;days&quot;</span>: {
            <span class="str">&quot;0&quot;</span>: {
                <span class="str">&quot;0&quot;</span>: {
                    <span class="str">&quot;type&quot;</span>: <span class="str">&quot;HEAT&quot;</span>,
                    <span class="str">&quot;temp&quot;</span>: 14.445,
                    <span class="str">&quot;time&quot;</span>: 0,
                    <span class="str">&quot;entry_type&quot;</span>: <span class="str">&quot;continuation&quot;</span>
                },
                <span class="str">&quot;1&quot;</span>: {
                    <span class="str">&quot;type&quot;</span>: <span class="str">&quot;HEAT&quot;</span>,
                    <span class="str">&quot;temp&quot;</span>: 14.445,
                    <span class="str">&quot;time&quot;</span>: 27900,
                    <span class="str">&quot;entry_type&quot;</span>: <span class="str">&quot;setpoint&quot;</span>
                },
                <span class="str">&quot;2&quot;</span>: {
                    <span class="str">&quot;type&quot;</span>: <span class="str">&quot;HEAT&quot;</span>,
                    <span class="str">&quot;temp&quot;</span>: 20.556,
                    <span class="str">&quot;time&quot;</span>: 63000,
                    <span class="str">&quot;entry_type&quot;</span>: <span class="str">&quot;setpoint&quot;</span>
                },
                <span class="str">&quot;3&quot;</span>: {
                    <span class="str">&quot;type&quot;</span>: <span class="str">&quot;HEAT&quot;</span>,
                    <span class="str">&quot;temp&quot;</span>: 14.445,
                    <span class="str">&quot;time&quot;</span>: 70200,
                    <span class="str">&quot;entry_type&quot;</span>: <span class="str">&quot;setpoint&quot;</span>
                }
            },
            <span class="str">&quot;1&quot;</span>: {
                <span class="str">&quot;0&quot;</span>: {
                    <span class="str">&quot;type&quot;</span>: <span class="str">&quot;HEAT&quot;</span>,
                    <span class="str">&quot;temp&quot;</span>: 14.445,
                    <span class="str">&quot;time&quot;</span>: 0,
                    <span class="str">&quot;entry_type&quot;</span>: <span class="str">&quot;continuation&quot;</span>
                },
                <span class="str">&quot;1&quot;</span>: {
                    <span class="str">&quot;type&quot;</span>: <span class="str">&quot;HEAT&quot;</span>,
                    <span class="str">&quot;temp&quot;</span>: 18.889,
                    <span class="str">&quot;time&quot;</span>: 20700,
                    <span class="str">&quot;entry_type&quot;</span>: <span class="str">&quot;setpoint&quot;</span>
                },</pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
</p>
<p>It’s a basic table structure. The first set point of the day is at 0, and is a “continuation.” These don’t show up in the UI. </p>
<p>Here’s what the day 1 looks like on the Nest thermostat UI:</p>
<p><a href="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image8.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.wiredprairie.us/blog/wp-content/uploads/2012/01/image_thumb8.png" width="500" height="37" /></a></p>
<p>When changing a temperature setpoint, I’m a bit disappointed to see that the entire schedule is sent with every request apparently. I just wouldn’t have expected that given that the more setpoints that there are, the bigger the payload must be. The UI is often sluggish when rapidly making adjustments in the schedule, and this could be one of the factors.</p>
<p>In the example below (which I’ve snipped most of the payload sent again as a JSONP request), I’ve set the first set point to 57F. </p>
<pre class="csharpcode">    <span class="str">&quot;payload&quot;</span>: {
        <span class="str">&quot;days&quot;</span>: {
            <span class="str">&quot;0&quot;</span>: {
                <span class="str">&quot;0&quot;</span>: {
                    <span class="str">&quot;type&quot;</span>: <span class="str">&quot;HEAT&quot;</span>,
                    <span class="str">&quot;temp&quot;</span>: 14.685,
                    <span class="str">&quot;time&quot;</span>: 0,
                    <span class="str">&quot;entry_type&quot;</span>: <span class="str">&quot;continuation&quot;</span>
                },
                <span class="str">&quot;1&quot;</span>: {
                    <span class="str">&quot;type&quot;</span>: <span class="str">&quot;HEAT&quot;</span>,
                    <span class="str">&quot;temp&quot;</span>: 15.000444444444444,
                    <span class="str">&quot;time&quot;</span>: 24300,
                    <span class="str">&quot;entry_type&quot;</span>: <span class="str">&quot;setpoint&quot;</span>
                },</pre>
<p>For the JSONP requests sent as “MAKE CHANGE” (easily could have been PUT), they each contained the following attributes as shown below. All JSONP requests are apparently routed on the web server using “headers” rather than a RESTful URL based system:</p>
<pre class="csharpcode">    },
    <span class="str">&quot;headers&quot;</span>: {
        <span class="str">&quot;X-nl-client-timestamp&quot;</span>: 1326041210566,
        <span class="str">&quot;X-nl-session-id&quot;</span>: <span class="str">&quot;#SESSION ID#&quot;</span>,
        <span class="str">&quot;X-nl-protocol-version&quot;</span>: 1,
        <span class="str">&quot;Authorization&quot;</span>: <span class="str">&quot;Basic #BASIC AUTH#&quot;</span>
    },
    <span class="str">&quot;path&quot;</span>: <span class="str">&quot;/v1/put/schedule.#DEVICE 2 SERIAL NUMBER#&quot;</span>,
    <span class="str">&quot;redir&quot;</span>: <span class="str">&quot;https://home.nest.com/post_jsonp&quot;</span>,
    <span class="str">&quot;jsonp&quot;</span>: <span class="str">&quot;4_&quot;</span>
}</pre>
<p>It’s RESTful in spirit as there is a route (“path”), but it’s managed by some internal routing engine. (Now, I think that they’re not using Ruby and Rails). </p>
<p>For something simple, like changing the current temperature of a thermostat, the request is thankfully simple:</p>
<pre class="csharpcode">{
    <span class="str">&quot;payload&quot;</span>: {
        <span class="str">&quot;shared&quot;</span>: {
            <span class="str">&quot;#DEVICE 2 SERIAL NUMBER#&quot;</span>: {
                <span class="str">&quot;target_temperature&quot;</span>: 18.333333333333336
            }
        }
    },
    <span class="str">&quot;headers&quot;</span>: {
        <span class="str">&quot;X-nl-client-timestamp&quot;</span>: 1326041744556,
        <span class="str">&quot;X-nl-session-id&quot;</span>: <span class="str">&quot;#SESSION ID#&quot;</span>,
        <span class="str">&quot;X-nl-protocol-version&quot;</span>: 1,
        <span class="str">&quot;Authorization&quot;</span>: <span class="str">&quot;Basic #BASIC AUTH#&quot;</span>
    },
    <span class="str">&quot;path&quot;</span>: <span class="str">&quot;/v1/put&quot;</span>,
    <span class="str">&quot;redir&quot;</span>: <span class="str">&quot;https://home.nest.com/post_jsonp&quot;</span>,
    <span class="str">&quot;jsonp&quot;</span>: <span class="str">&quot;14_&quot;</span>
}</pre>
<p>While, I haven’t taken the time to try to write a custom UI for this undocumented API yet, it looks like it should be relatively easy to do, especially as it relates to the schedule and current temperature settings. I know there’s been some Siri proxy stuff that’s been written – but I don’t have any interest in trying to get that to work.</p>
<p>As with most APIs like this, the trick is often getting authorization correct. For Nest, it appears that making a POST request to <strong>https://home.nest.com/accounts/login/</strong> with <strong>username</strong> and <strong>password</strong> as form data, that the server responds with 2 cookies:</p>
<ol>
<li>sessionid == used in X-nl-session-id in headers</li>
<li>cztoken == used as the Authorization in headers (prepended with the text “Basic “</li>
</ol>

<p><a href="http://feedads.g.doubleclick.net/~a/YYJqmeUBDoYn7nIJT2NH6mOdqcI/0/da"><img src="http://feedads.g.doubleclick.net/~a/YYJqmeUBDoYn7nIJT2NH6mOdqcI/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/YYJqmeUBDoYn7nIJT2NH6mOdqcI/1/da"><img src="http://feedads.g.doubleclick.net/~a/YYJqmeUBDoYn7nIJT2NH6mOdqcI/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/wiredprairie?a=oxsiqiYxDy4:pb-EZcyI_uc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=oxsiqiYxDy4:pb-EZcyI_uc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=oxsiqiYxDy4:pb-EZcyI_uc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=oxsiqiYxDy4:pb-EZcyI_uc:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=oxsiqiYxDy4:pb-EZcyI_uc:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=oxsiqiYxDy4:pb-EZcyI_uc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=oxsiqiYxDy4:pb-EZcyI_uc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=oxsiqiYxDy4:pb-EZcyI_uc:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/wiredprairie?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/wiredprairie?a=oxsiqiYxDy4:pb-EZcyI_uc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/wiredprairie?i=oxsiqiYxDy4:pb-EZcyI_uc:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/wiredprairie/~4/oxsiqiYxDy4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.wiredprairie.us/blog/index.php/archives/1442/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.wiredprairie.us/blog/index.php/archives/1442</feedburner:origLink></item>
	</channel>
</rss>

