<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Dan Crevier's Blog</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/dancre/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/dancre/feed.xml</link>
    <description>In search of a better name...</description>
    <lastBuildDate>Wed, 24 Feb 2016 12:46:12 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Using the yield pattern with HealthVault on Windows Phone 7 (part 2)</title>
      <link>https://docs.microsoft.com/archive/blogs/dancre/using-the-yield-pattern-with-healthvault-on-windows-phone-7-part-2</link>
      <pubDate>Wed, 28 Dec 2011 22:21:55 GMT</pubDate>
      <dc:creator><![CDATA[Dan Crevier]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/dancre/2011/12/28/using-the-yield-pattern-with-healthvault-on-windows-phone-7-part-2/</guid>
      <description><![CDATA[In part 1, I described the overall design of the HealthVaultTask class. Now, I’ll go through the...]]></description>
      <content:encoded><![CDATA[<p>In <a href="https://blogs.msdn.com/b/dancre/archive/2011/12/29/using-the-yield-pattern-with-healthvault-on-windows-phone-7-part-1.aspx">part 1</a>, I described the overall design of the HealthVaultTask class. Now, I’ll go through the implementation. First, I’ll get some of the helper classes. Out of the way. The first is the exception type for errors from HealthVault that captures the error code and error text. Note: this implementation doesn’t make the exception serializable, but that would be straightforward to do if needed.</p>  <pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> HealthVaultException : Exception
{
    <span class="kwrd">public</span> HealthVaultException(<span class="kwrd">int</span> errorCode, <span class="kwrd">string</span> errorText)
    : <span class="kwrd">base</span>(errorText)
    {
        <span class="kwrd">this</span>.ErrorCode = errorCode;
    }

    <span class="kwrd">public</span> <span class="kwrd">int</span> ErrorCode { get; set; }
}</pre>


<p>Next, is the HealthVaultOperation class. The pattern with this class is that DoOperations yields one of these with the information about the HealthVaultRequest, and when control returns after the yield, the response data will be filled out. It also has a helper function to throw a HealthVaultException in the case of an error. But, it’s up to the DoOperations implementation to call ThrowOnError.</p>

<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> HealthVaultOperation
{
    <span class="kwrd">public</span> HealthVaultOperation(<span class="kwrd">string</span> methodName, <span class="kwrd">string</span> methodVersion, XElement info)
    {
        <span class="kwrd">this</span>.MethodName = methodName;
        <span class="kwrd">this</span>.MethodVersion = methodVersion;
        <span class="kwrd">this</span>.Info = info;
    }

    <span class="kwrd">public</span> <span class="kwrd">string</span> MethodName { get; <span class="kwrd">private</span> set; }
    <span class="kwrd">public</span> <span class="kwrd">string</span> MethodVersion { get; <span class="kwrd">private</span> set; }
    <span class="kwrd">public</span> XElement Info { get; <span class="kwrd">private</span> set; }

    <span class="kwrd">public</span> HealthVaultResponseEventArgs Response { get; set; }

    <span class="kwrd">public</span> <span class="kwrd">void</span> ThrowOnError()
    {
        <span class="kwrd">if</span> (<span class="kwrd">this</span>.Response.HasError)
        {
            <span class="kwrd">throw</span> <span class="kwrd">new</span> HealthVaultException(<span class="kwrd">this</span>.Response.ErrorCode, <span class="kwrd">this</span>.Response.ErrorText);
        }
    }
}</pre>

<p>Finally, here is the HealthVaultTask class. The only really interesting code is in RunEnumerator, which enumerates through the HealthVaultOperations returned by DoOperation, creating a HealthVaultRequest for it and executing it. At first glance, this function may look recursive, but the other RunEnumerator call is actually in a lamda function that will be called from the request callback. It also has the code to marshal the result (in case of success or failure) to the right callback function on the UI thread.</p>

<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">abstract</span> <span class="kwrd">class</span> HealthVaultTask
{
    <span class="kwrd">public</span> HealthVaultTask(HealthVaultService service)
    {
        <span class="kwrd">this</span>.Service = service;
    }

    <span class="kwrd">public</span> <span class="kwrd">void</span> Run(Dispatcher dispatcher, Action successCallback, Action&lt;Exception&gt; errorCallback)
    {
        RunEnumerator(dispatcher, successCallback, errorCallback, DoOperations().GetEnumerator());
    }

    <span class="kwrd">private</span> <span class="kwrd">void</span> RunEnumerator(Dispatcher dispatcher, Action successCallback, Action&lt;Exception&gt; errorCallback,<br />                               IEnumerator&lt;HealthVaultOperation&gt; operations)
    {
        <span class="kwrd">try</span>
        {
            <span class="kwrd">if</span> (operations.MoveNext())
            {
                HealthVaultOperation operation = operations.Current;
                HealthVaultRequest request = <span class="kwrd">new</span> HealthVaultRequest(operation.MethodName, operation.MethodVersion,<br />                                                     operation.Info, (o, e) =&gt;
                    {
                        operation.Response = e;
                        RunEnumerator(dispatcher, successCallback, errorCallback, operations);
                    });
                <span class="kwrd">this</span>.Service.BeginSendRequest(request);
            }
            <span class="kwrd">else</span>
            {
                dispatcher.BeginInvoke(() =&gt; successCallback());
            }
        }
        <span class="kwrd">catch</span> (Exception e)
        {
            dispatcher.BeginInvoke(() =&gt; errorCallback(e));
        }
    }

    <span class="kwrd">protected</span> <span class="kwrd">abstract</span> IEnumerable&lt;HealthVaultOperation&gt; DoOperations();

    <span class="kwrd">protected</span> HealthVaultService Service { get; <span class="kwrd">private</span> set; }
}</pre>

<p>If this doesn’t make sense, please let me know and I’ll explain further.</p>

<p>There’s one design consideration I didn’t think about until after I’d implemented it. One problem with this implementation is that you can’t compose HealthVaultTasks with other HealthVaultTasks. It would be nice if you could build up layers of reusable service code. This could be accomplished by having a common base class between HealthVaultTask and HealthVaultOperation where HealthVaultTask.DoOperation would be an IEnumerable of the base class. That would let you yield either operations or tasks. This addition is left as an exercise to the reader <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="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/34/01/metablogapi/7103.wlEmoticon-smile_6E04E05E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-34-01-metablogapi/7103.wlEmoticon_2D00_smile_5F00_6E04E05E.png" /></p>

<p>Finally, a note on unit testing. This framework actually makes the HealthVaultTasks you write very easily unit tested. All you have to do is call GetEnumerator on your task, then call MoveNext/Current to simulate running the task. After you call MoveNext, you can make sure you get the expected operation in Current and you can push whatever results you want into the HealthVaultOperation. What’s great is that the HealthVaultService is completely out of the picture.</p>

<p>I hope this is useful!</p>]]></content:encoded>
    </item>
    <item>
      <title>Using the yield pattern with HealthVault on Windows Phone 7 (part 1)</title>
      <link>https://docs.microsoft.com/archive/blogs/dancre/using-the-yield-pattern-with-healthvault-on-windows-phone-7-part-1</link>
      <pubDate>Wed, 28 Dec 2011 22:00:22 GMT</pubDate>
      <dc:creator><![CDATA[Dan Crevier]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/dancre/2011/12/28/using-the-yield-pattern-with-healthvault-on-windows-phone-7-part-1/</guid>
      <description><![CDATA[I’ve written a Windows Phone 7 application called Weight4Me that lets you track your weight,...]]></description>
      <content:encoded><![CDATA[  <p>I’ve written a Windows Phone 7 application called <a href="https://weight4.me">Weight4Me</a> that lets you track your weight, syncing the data to HealthVault. The first version just fetched all of the weight data from HealthVault on each launch. I’m one of the developers Eric Gunnerson is referring to in <a href="https://blogs.msdn.com/b/ericgu/archive/2011/10/14/mobile-healthvault-apps-and-sync.aspx">this post</a>. I’ve just posted an updated release that does a sync with HealthVault (not following exactly what Eric suggests, maybe I’ll post more details about that next). Doing sync, required doing more complex series of operations with HealthVault.</p>  <p>The <a href="https://healthvaultwp7.codeplex.com/">HealthVault SDK for Windows Phone 7</a> provides a HealthVaultRequest class for making calls to HealthVault, calling into a callback when done. Using lambda expressions, you can make fairly readable code for simple calls as follows:</p>  <pre class="csharpcode">service.BeginSendRequest(new HealthVaultRequest(methodName, methodVersion, xml,<br />                         (<span class="kwrd">object</span> sender, HealthVaultResponseEventArgs e) =&gt;
{
    dispatcher.BeginInvoke(() =&gt;
    {
        <span class="kwrd">if</span> (e.HasError)
        {
            <span class="rem">// Handle error.</span>
        }

        <span class="rem">// Parse results.</span>
    });
}));</pre>

<p>But, I needed to do some more complex things like do multiple requests in a loop, have branching based on sync state, and so on. This turns into incredibly messy and hard to follow code with callback functions and/or lambdas. A common trick for making asynchronous code read more like synchronous code is to use the yield keyword in C# so that the compiler will build the state machine for you. Jeffrey Richter has a series of articles about using it with the standard async pattern which you can read <a href="https://msdn.microsoft.com/en-us/magazine/cc163323.aspx">here</a>. I decided to apply this technique to the HealthVaultService and HealthVaultRequests, which I present here. I hope people will find it useful with HealthVault on Windows Phone 7, or will see how to apply it to similar problems.</p>

<p>My basic approach is to create a HealthVaultTask class, which runs a series of HealthVaultRequests. This is done by implementing an IEnumerable function that returns a series of HealthVaultOperations. HealthVaultOperation is a new class I am using to encapsulate a HealthVaultRequest and response. So, the way you implement a task looks something like:</p>

<pre class="csharpcode"><span class="kwrd">protected</span> <span class="kwrd">override</span> IEnumerable&lt;HealthVaultOperation&gt; DoOperations()
{
    HealthVaultOperation myOperation = <span class="kwrd">new</span> HealthVaultOperation(methodName, methodVersion, xml);
    <span class="kwrd">yield</span> <span class="kwrd">return</span> myOperation;<br />    myOperation.ThrowOnError(); <span class="rem">// See discussion below.</span>
    <span class="rem">// Parse response from myOperation.Response</span>
}</pre>

<p>The magic of this pattern is that you can have loops, if branches, etc in DoOperations so that the code in DoOperations looks like serial code. But, under the covers it will all be asynchronous.</p>

<p>There are a couple of design decisions I had to make up front. The first was about how to handle errors. There can be errors returned from the operations, and exceptions could be thrown from DoOperations itself. One approach would be to put an error code in HealthVaultOperationTask and have the caller check for the error. However, I prefer having all errors just be thrown from DoOperations method and wrapped up by the code that runs the task. To make it simple, HealthVaultOperation has a helper function called ThrowOnError() that throws an exception if there is an error returned from the HealthVault service (wrapped in a new HealthVaultException class).</p>

<p>The other design decision was around the threading model and how the results are communicated to the caller. I considered two basic approaches:</p>

<ol>
  <li>DoOperations is always called on the UI thread and can update models/UI as necessary. </li>

  <li>DoOperations is not called on the UI thread, bundles up its results into properties on the task class, and is marshaled to the UI thread when complete. </li>
</ol>

<p>I opted for #2. It eliminates potentially unnecessary thread context switching and keeps the code that does the network operation separated from any model/UI code. As a result, the signature of the method to run the task is as follows:</p>

<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">void</span> Run(Dispatcher dispatcher, Action successCallback, Action&lt;Exception&gt; errorCallback)</pre>

<p>When the task is run, either the successCallback will be called or the errorCallback will be called. The call will be dispatched to the UI thread. Here’s an example:</p>

<pre class="csharpcode">MyHealthVaultTaskTask task = <span class="kwrd">new</span> MyHealthVaultTaskTask (service, ...);
task(dispatcher,
() =&gt; {
    <span class="rem">// pull results off task and update model/UI.</span>
},
(e) =&gt; {
    <span class="rem">// Handle updating model/UI with exception e.</span>
});</pre>

<p>In part 2, I’ll share the code that implements HealthVaultTask.</p>]]></content:encoded>
    </item>
    <item>
      <title>Resetting the Live Tile in Windows Phone 7</title>
      <link>https://docs.microsoft.com/archive/blogs/dancre/resetting-the-live-tile-in-windows-phone-7</link>
      <pubDate>Wed, 19 Oct 2011 09:15:34 GMT</pubDate>
      <dc:creator><![CDATA[Dan Crevier]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/dancre/2011/10/19/resetting-the-live-tile-in-windows-phone-7/</guid>
      <description><![CDATA[The ability to update the Live Tile in Mango is a really great feature. I have an application where...]]></description>
      <content:encoded><![CDATA[<p>The ability to update the Live Tile in Mango is a really great feature. I have an application where I’m generating dynamic images and setting the live tile to an isostore:/Shared/ShellContent url. But, I have a setting that the user can use to turn on/off live tile updates. When turning it off, I initially couldn’t figure out how to reset the tile.</p>  <p>The trick is to use an appdata: url to refer to your original image. For example, if your standard tile image is called “background.png”, then you can use the following to reset it:</p>  <pre class="csharpcode">        <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> ResetTile()
        {
            StandardTileData newTileData = <span class="kwrd">new</span> StandardTileData();
            newTileData.BackgroundImage = <span class="kwrd">new</span> Uri(<span class="str">&quot;appdata:background.png&quot;</span>);

            ShellTile appTile = ShellTile.ActiveTiles.First();
            appTile.Update(newTileData);

        }</pre>

<p>Note: If you have changed any other properties like the BackContent, you will want to reset them by setting them to “”. Passing in null will leave the values unchanged.</p>


]]></content:encoded>
    </item>
    <item>
      <title>Windows Phone 7 WebBrowser control and target=”_blank”</title>
      <link>https://docs.microsoft.com/archive/blogs/dancre/windows-phone-7-webbrowser-control-and-target_blank</link>
      <pubDate>Mon, 12 Sep 2011 18:54:26 GMT</pubDate>
      <dc:creator><![CDATA[Dan Crevier]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/dancre/2011/09/12/windows-phone-7-webbrowser-control-and-target_blank/</guid>
      <description><![CDATA[I recently ran into a problem where I was hosting some content in a WebBrowser in a Windows Phone 7...]]></description>
      <content:encoded><![CDATA[<p>I recently ran into a problem where I was hosting some content in a WebBrowser in a Windows Phone 7 app and found that some of the links on the page didn’t work. After a bit of debugging and binging, I found that it was because the links had target=”_blank”. In a regular web browser, this opens up the page in a new tab/window. In the WebBrowser control, it silently does nothing – there are no events you can hook into or anything.</p>  <p>I wanted to share the workaround I used. It’s pretty ugly, but the basic idea is that after the page loads, it injects some JavaScript to go remove the target on any links with target=”_blank”. For this to work, you need to have IsScriptEnabled=true on the control. And, it’s possible that some pages might block eval or otherwise block this from working. But, it worked in my case.</p>  <p>First, you need to hook up the LoadCompleted event on the web browser control. This fires after a page loads:</p>  <pre class="csharpcode">        <span class="kwrd">public</span> MyPagel()
        {
            InitializeComponent();

            _webBrowser.LoadCompleted += OnWebBrowserLoadCompleted;
        }</pre>

<p>Then, OnWebBrowserLoadCompleted injects JavaScript to fix up the links:</p>

<pre class="csharpcode">        <span class="kwrd">private</span> <span class="kwrd">void</span> OnWebBrowserLoadCompleted(<span class="kwrd">object</span> sender, NavigationEventArgs e)
        {
            <span class="kwrd">try</span>
            {
                _webBrowser.InvokeScript(<span class="str">&quot;eval&quot;</span>,
<span class="str">@&quot;
window.FixupAnchors=function()
{
    var elems=document.getElementsByTagName('a');
    for (var i=0;i&lt;elems.length;i++)
    {
        if (elems[i].getAttribute('target')!=null &amp;&amp; elems[i].getAttribute('target').indexOf('_blank')==0)
        {
            elems[i].removeAttribute('target');
        }
    }
}&quot;</span>);
                _webBrowser.InvokeScript(<span class="str">&quot;FixupAnchors&quot;</span>);
            }
            <span class="kwrd">catch</span>
            {
                <span class="rem">// ignore exceptions.</span>
            }
        }</pre>

<p>It’s a bit ugly, and some of my coworkers will give me a hard time for swallowing all exceptions here. But, it is working for me and hopefully someone will find it useful.</p>]]></content:encoded>
    </item>
    <item>
      <title>Hello World</title>
      <link>https://docs.microsoft.com/archive/blogs/dancre/hello-world-2</link>
      <pubDate>Mon, 12 Sep 2011 18:35:04 GMT</pubDate>
      <dc:creator><![CDATA[Dan Crevier]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/dancre/2011/09/12/hello-world-2/</guid>
      <description><![CDATA[Is this thing on?   I am going to pick up blogging again. It’s been a while! First off, I want to...]]></description>
      <content:encoded><![CDATA[<p>Is this thing on? <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="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/34/01/metablogapi/8030.wlEmoticon-smile_6EFF2BC8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-34-01-metablogapi/8030.wlEmoticon_2D00_smile_5F00_6EFF2BC8.png" /></p>  <p>I am going to pick up blogging again. It’s been a while! First off, I want to give an update on what I’ve been up to for the last few years since my last post. I was the development lead on SkyDrive from its initial release up through our Wave 4 release about 4 years ago. It was a lot of fun helping SkyDrive grow from a small beta (Windows Live Folders) up to a major service that tightly integrates with several other properties in Microsoft including Office and Windows Phone 7.</p>  <p>As of a year ago, I’ve moved over to be the development manager in the Engineering Platform team in Windows Live. My team is in charge of the infrastructure that runs Windows Live. This includes:</p>  <ul>   <li>Our build system including our automated test and builds to keep the team running efficiently.</li>    <li>Our system for packaging and deploying client builds, including Windows Live Essentials and the new Windows 8 applications.</li>    <li>The system we use to manage our services (Hotmail, Messenger, SkyDrive, etc) including deployment, monitoring and repair.</li>    <li>Our analytics system that is used to monitor service health and understand how users are using our clients and services.</li> </ul>  <p>There are lots of hard problems in these areas and I’ve been learning a lot over the last year.</p>  <p>I’ve also been doing some Windows Phone development in my free time and recently published my first application (<a href="https://bit.ly/wifiscaletracker">WiFi Scale Tracker</a>). I’m planning to do some blog posts both about Windows Phone development and what we are doing in Windows Live.</p>]]></content:encoded>
    </item>
    <item>
      <title>News on the upcoming SkyDrive release</title>
      <link>https://docs.microsoft.com/archive/blogs/dancre/news-on-the-upcoming-skydrive-release</link>
      <pubDate>Thu, 13 Nov 2008 00:12:41 GMT</pubDate>
      <dc:creator><![CDATA[Dan Crevier]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/dancre/2008/11/13/news-on-the-upcoming-skydrive-release/</guid>
      <description><![CDATA[We’ve posted some details of our upcoming SkyDrive release here. I’m really excited about what’s...]]></description>
      <content:encoded><![CDATA[<p>We’ve posted some details of our upcoming SkyDrive release <a href="https://skydriveteam.spaces.live.com/blog/cns!977F793E846B3C96!11672.entry">here</a>. I’m really excited about what’s coming all across Windows Live with our wave 3 release and how well everything works together.</p> <p>I’m sorry I haven’t been posting much lately There are a bunch of topics I want to write about, like ASP.NET MVC, PowerShell and Silverlight!</p>]]></content:encoded>
    </item>
    <item>
      <title>Font Smoothing with Remote Desktop and Windows Server 2003</title>
      <link>https://docs.microsoft.com/archive/blogs/dancre/font-smoothing-with-remote-desktop-and-windows-server-2003</link>
      <pubDate>Fri, 11 Jul 2008 23:42:51 GMT</pubDate>
      <dc:creator><![CDATA[Dan Crevier]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/dancre/2008/07/11/font-smoothing-with-remote-desktop-and-windows-server-2003/</guid>
      <description><![CDATA[I spend a lot of time time connected to Windows 2003 Server. I was really happy to come across this...]]></description>
      <content:encoded><![CDATA[<p>I spend a lot of time time connected to Windows 2003 Server. I was really happy to come across this post which describes a KB article to turn on font smoothing to Windows 2003 Server. This makes a huge difference with Consolas</p> <p><a href="https://blogs.sepago.de/helge/2008/07/08/finally-font-smoothing-over-rdpica-on-server-2003/">Helge Klein » Blog Archive » Finally! Font Smoothing Over RDP/ICA on Server 2003</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Disappearing disk space on Vista</title>
      <link>https://docs.microsoft.com/archive/blogs/dancre/disappearing-disk-space-on-vista</link>
      <pubDate>Mon, 09 Jun 2008 00:01:45 GMT</pubDate>
      <dc:creator><![CDATA[Dan Crevier]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/dancre/2008/06/09/disappearing-disk-space-on-vista/</guid>
      <description><![CDATA[The hard drive space on my Vista machine recently dropped to almost nothing, and I was really...]]></description>
      <content:encoded><![CDATA[<p>The hard drive space on my Vista machine recently dropped to almost nothing, and I was really confused what was going on. I used my favorite disk space visualizer (<a href="https://windirstat.info/">WinDirStat</a>). However, I couldn’t figure it out. Finally, I found that the following steps cleared it up:</p> <p>1. Run Disk Cleanup (search from Start menu) <p>2. Choose “Files from all users on this computer” <p>3. When it’s done scanning (which can take forever), select the More Options tab <p>4. Select Cleanup under System Restore and Shadow Copies <p></p> <p></p> <p></p> <p>This freed over 40 GB for me! I think that what happened is that the Zune software touched all of my media, which created shadow copies of each file, using a bunch of space. Shadow copy space must not show up for utilities like WinDirStat.</p> <p>There’s a useful article on <a href="https://www.mydigitallife.info/2007/06/26/how-to-change-and-limit-system-restore-storage-space-usage-size-in-vista-with-vssadmin/">My Digital Life</a> on how to limit how much space will be used. My was set to unbounded space.</p>]]></content:encoded>
    </item>
    <item>
      <title>New updates to SkyDrive!</title>
      <link>https://docs.microsoft.com/archive/blogs/dancre/new-updates-to-skydrive</link>
      <pubDate>Thu, 22 May 2008 13:19:12 GMT</pubDate>
      <dc:creator><![CDATA[Dan Crevier]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/dancre/2008/05/22/new-updates-to-skydrive/</guid>
      <description><![CDATA[We’ve made some more updates to SkyDrive including some features like comments, captions and better...]]></description>
      <content:encoded><![CDATA[<p>We’ve made some more updates to SkyDrive including some features like comments, captions and better iteration through items in a folder. For details, check out our team blog post: </p> <p><a href="https://skydriveteam.spaces.live.com/blog/cns!977F793E846B3C96!3837.entry">Windows Live SkyDrive Team Blog: Hot new updates to SkyDrive!</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Bootcamp 2.1 update available</title>
      <link>https://docs.microsoft.com/archive/blogs/dancre/bootcamp-2-1-update-available</link>
      <pubDate>Fri, 16 May 2008 21:51:13 GMT</pubDate>
      <dc:creator><![CDATA[Dan Crevier]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/dancre/2008/05/16/bootcamp-2-1-update-available/</guid>
      <description><![CDATA[Apple has an update of Bootcamp available, fixing some stability issues. I’ve had more than my fair...]]></description>
      <content:encoded><![CDATA[<p>Apple has an update of Bootcamp available, fixing some stability issues. I’ve had more than my fair share of crashes on my MacBook Pro, so I’m hoping it will help out. It was offered to me via Apple Software Update, but you can also grab it here: </p> <p><a href="https://www.apple.com/support/bootcamp/">Apple - Support - Bootcamp</a></p>]]></content:encoded>
    </item>
  </channel>
</rss>