<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>ADO dot what?</title>
	<atom:link href="http://dpaoliello.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://dpaoliello.wordpress.com</link>
	<description>Rants of an ADO.NET Dev</description>
	<lastBuildDate>Sun, 22 Jan 2012 20:21:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='dpaoliello.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>ADO dot what?</title>
		<link>http://dpaoliello.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://dpaoliello.wordpress.com/osd.xml" title="ADO dot what?" />
	<atom:link rel='hub' href='http://dpaoliello.wordpress.com/?pushpress=hub'/>
		<item>
		<title>SpotTheDefect[0]</title>
		<link>http://dpaoliello.wordpress.com/2012/01/22/spotthedefect0/</link>
		<comments>http://dpaoliello.wordpress.com/2012/01/22/spotthedefect0/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 20:20:56 +0000</pubDate>
		<dc:creator>tehpenguin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Spot the Defect]]></category>
		<category><![CDATA[Concurrency]]></category>
		<category><![CDATA[spot the defect]]></category>
		<category><![CDATA[threading]]></category>

		<guid isPermaLink="false">https://dpaoliello.wordpress.com/?p=35</guid>
		<description><![CDATA[Let’s play a little game of “Spot the Defect”. For the following code, see if you can: Figure out what it would output Find the bug(s) Correct the bugs (And I’ll do a post next week with the answer) using System; using System.Threading; namespace SpotTheDefect1 { class Program { private static int _x = 0; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=35&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Let’s play a little game of “Spot the Defect”. For the following code, see if you can:</p>
<ul>
<li>Figure out what it would output</li>
<li>Find the bug(s)</li>
<li>Correct the bugs</li>
</ul>
<p>(And I’ll do a post next week with the answer)</p>
<pre class="code"><span style="color:blue;">using </span>System;
<span style="color:blue;">using </span>System.Threading;

<span style="color:blue;">namespace </span>SpotTheDefect1
{
    <span style="color:blue;">class </span><span style="color:#2b91af;">Program
    </span>{
        <span style="color:blue;">private static int </span>_x = 0;
        <span style="color:blue;">private static </span><span style="color:#2b91af;">Foo </span>_foo = <span style="color:blue;">new </span><span style="color:#2b91af;">Foo</span>();
        <span style="color:blue;">private static bool </span>_disposed = <span style="color:blue;">false</span>;

        <span style="color:blue;">static void </span>Main(<span style="color:blue;">string</span>[] args)
        {
            <span style="color:#2b91af;">Thread </span>thread1 = <span style="color:blue;">new </span><span style="color:#2b91af;">Thread</span>(Thread1);
            <span style="color:#2b91af;">Thread </span>thread2 = <span style="color:blue;">new </span><span style="color:#2b91af;">Thread</span>(Thread2);

            thread1.Start();
            thread2.Start();

            thread1.Join();
            thread2.Join();
        }

        <span style="color:blue;">private static void </span>Thread1()
        {
            <span style="color:blue;">if </span>(!_disposed)
            {
                _foo.Bar();
            }
        }

        <span style="color:blue;">private static void </span>Thread2()
        {
            <span style="color:#2b91af;">Console</span>.WriteLine(<span style="color:#a31515;">"Disposing"</span>);
            _disposed = <span style="color:blue;">true</span>;
            _foo = <span style="color:blue;">null</span>;
        }

        <span style="color:blue;">private class </span><span style="color:#2b91af;">Foo
        </span>{
            <span style="color:blue;">public void </span>Bar()
            {
                <span style="color:#2b91af;">Console</span>.WriteLine(<span style="color:#a31515;">"Hello, World!"</span>);
            }
        }
    }
}
</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dpaoliello.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dpaoliello.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dpaoliello.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dpaoliello.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dpaoliello.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dpaoliello.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dpaoliello.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dpaoliello.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dpaoliello.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dpaoliello.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dpaoliello.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dpaoliello.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dpaoliello.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dpaoliello.wordpress.com/35/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=35&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dpaoliello.wordpress.com/2012/01/22/spotthedefect0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ea62032d05137fac973ca478f44461c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tehpenguin</media:title>
		</media:content>
	</item>
		<item>
		<title>Collectively Concurrent</title>
		<link>http://dpaoliello.wordpress.com/2011/12/04/collectively-concurrent/</link>
		<comments>http://dpaoliello.wordpress.com/2011/12/04/collectively-concurrent/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 00:04:43 +0000</pubDate>
		<dc:creator>tehpenguin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Collections]]></category>
		<category><![CDATA[Concurrency]]></category>
		<category><![CDATA[ConcurrentBag]]></category>
		<category><![CDATA[ConcurrentQueue]]></category>
		<category><![CDATA[ConcurrentStack]]></category>
		<category><![CDATA[multithreaded]]></category>

		<guid isPermaLink="false">https://dpaoliello.wordpress.com/?p=31</guid>
		<description><![CDATA[“The concept of a stack in programming is very similar to a stack of plates in real life, except that you can cheat a little &#8211; for instance, if you&#8217;re willing to accept that plates can float, then you can ignore gravity.” One of the fantastic things about using a rich framework like .Net is [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=31&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>“The concept of a stack in programming is very similar to a stack of plates in real life, except that you can cheat a little &#8211; for instance, if you&#8217;re willing to accept that plates can float, then you can ignore gravity.”</p>
<p>One of the fantastic things about using a rich framework like .Net is that many of the basic data structures that programmers require already exists in a efficient and easy to use form. We also make sure to update these pre-built data structures with the new features that we introduce in the language, for instance in .Net 2.0 we introduced generics, and so the <a href="http://msdn.microsoft.com/en-us/library/system.collections.generic.aspx" target="_blank">System.Collections.Generic</a> namespace was created. With.Net 4.5 we are introducing new async APIs and the async\await keyword pair, meaning that programmers will now need to deal with concurrency and multithreading more often especially if their application has any shared data structures. Luckily enough, we already have the appropriate APIs that were introduced in 4.0: the <a href="http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx" target="_blank">System.Collections.Concurrent</a> namespace.</p>
<h1>Stack it. Queue it. Bag it.</h1>
<p>The first couple of APIs I’d like to introduce you to is the <a href="http://msdn.microsoft.com/en-us/library/dd267331.aspx" target="_blank">ConcurrentStack</a> and <a href="http://msdn.microsoft.com/en-us/library/dd267265.aspx" target="_blank">ConcurrentQueue</a>. These are exactly as they sound: A stack and a queue that permit concurrent operations. One common trap when writing a multithreaded application is the pattern of checking the Count of the collection to see if an item is available, before attempting to take an item – which is fine with single threading, but in a multithreaded environment it is possible to have another thread jump in between your check and getting the item which then takes the last item before you can. Instead, the concurrent collections have the the <a href="http://msdn.microsoft.com/en-us/library/dd287260.aspx" target="_blank">TryPop</a> and <a href="http://msdn.microsoft.com/en-us/library/dd287208.aspx" target="_blank">TryDequeue</a> methods, which will atomically check the size of the structure and return an item to you if there is one available.</p>
<p>The other data structure I hinted at is the <a href="http://msdn.microsoft.com/en-us/library/dd381779.aspx" target="_blank">ConcurrentBag</a>. Unlike the Stack or Queue, the <a href="http://msdn.microsoft.com/en-us/library/dd381779.aspx" target="_blank">ConcurrentBag</a> has no guarantees about the order of output versus input – it’s an “Any In, Any Out” collection. This allows <a href="http://msdn.microsoft.com/en-us/library/dd381779.aspx" target="_blank">ConcurrentBag</a> can have a much more efficient implementation when there is contention, since the collection can return any object that it currently holds, rather than having to coordinate with any of the threads accessing it in order to return objects in the correct order. One of the best uses of a <a href="http://msdn.microsoft.com/en-us/library/dd381779.aspx" target="_blank">ConcurrentBag</a> is for a non-time sensitive resource cache, like a buffer pool – where you want to have the best performance even with contention, but it is ok to not return the most recently used object (as you would want to do with a connection pool).</p>
<h1>Performance</h1>
<p>One of the issues with writing multithreaded applications is attempting to measure performance, especially when you have a shared resource. If you are running a single threaded test with the above data structures, then you may notice that simply putting a standard Stack or Queue inside of a lock gives better performance than the Concurrent equivalent. However, introduce some contention (i.e. have multiple threads attempting to access the same object), and the Concurrent structures begin to shine. Additionally, you need to be careful when doing multithreaded micro-benchmarks as you may introduce too much contention (since a “real” application is likely to do some work with the object is just obtained, rather than handing it back to the collection).that would then skew your results.</p>
<p>However, unless you have a high-performance single threaded application or a multithreaded application with no shared resources, then a concurrent collection will be your best bet. It may be slower in an application with little load, but it will be much easier to scale it to a larger application if needed.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dpaoliello.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dpaoliello.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dpaoliello.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dpaoliello.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dpaoliello.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dpaoliello.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dpaoliello.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dpaoliello.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dpaoliello.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dpaoliello.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dpaoliello.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dpaoliello.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dpaoliello.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dpaoliello.wordpress.com/31/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=31&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dpaoliello.wordpress.com/2011/12/04/collectively-concurrent/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ea62032d05137fac973ca478f44461c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tehpenguin</media:title>
		</media:content>
	</item>
		<item>
		<title>Thread safety</title>
		<link>http://dpaoliello.wordpress.com/2011/09/25/thread-safety/</link>
		<comments>http://dpaoliello.wordpress.com/2011/09/25/thread-safety/#comments</comments>
		<pubDate>Sun, 25 Sep 2011 22:38:19 +0000</pubDate>
		<dc:creator>tehpenguin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ADO.NET]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[async]]></category>
		<category><![CDATA[best practice]]></category>
		<category><![CDATA[cancellation]]></category>
		<category><![CDATA[mars]]></category>
		<category><![CDATA[multithreaded]]></category>

		<guid isPermaLink="false">https://dpaoliello.wordpress.com/2011/09/25/thread-safety/</guid>
		<description><![CDATA[One of our focuses for .Net 4.5 was on async and improving support for doing ADO.NET asynchronously. A side effect of this is that we did a lot of work improving our thread-safety story. With .Net 4.0 and prior, we simply had a blanket statement that multithreaded access to any ADO.NET object was not supported, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=30&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>One of our focuses for .Net 4.5 was on async and improving support for doing ADO.NET asynchronously. A side effect of this is that we did a lot of work improving our thread-safety story. With .Net 4.0 and prior, we simply had a blanket statement that multithreaded access to any ADO.NET object was not supported, except for cancellation (i.e. <a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx" target="_blank">SqlCommand</a>.Cancel). Even then, there were some unusual corner cases with cancellation that resulted in unexpected circumstances. With 4.5 we could have maintained this stance, but we realized that the use of async makes mistakes with accessing objects on multiple threads much more likely (e.g. when manually calling <a href="http://msdn.microsoft.com/en-us/library/dd235663.aspx" target="_blank">ContinueWith</a> or if you forget the &#8216;await&#8217; keyword).</p>
<h1>Pending Operations</h1>
<p>With the <a href="http://msdn.microsoft.com/en-us/library/ms171868%28v=VS.110%29.aspx" target="_blank">.Net 4.5 Developer Preview</a>, if you try to call any operation on an ADO.NET object while it has an asynchronous operation pending (including the old Begin\End methods), then we throw an <a href="http://msdn.microsoft.com/en-us/library/system.invalidoperationexception.aspx" target="_blank">InvalidOperationException</a>. While this isn&#8217;t the nicest of behaviors, it is much better than the 4.0 and below behavior (which was undefined, although typically resulted in <a href="http://msdn.microsoft.com/en-us/library/system.nullreferenceexception.aspx" target="_blank">NullReferenceExceptions</a> and data corruption). The reason that we opted for an exception instead of doing something &#8216;smarter&#8217; (like waiting for the operation to complete), is that a secondary call to an object is typically a coding mistake (e.g. forgetting the &#8216;await&#8217; keyword) and that anyone who needs to do multiple operations should schedule the second operation via await or <a href="http://msdn.microsoft.com/en-us/library/dd235663.aspx" target="_blank">ContinueWith</a>.</p>
<p>However, if there is a synchronous operation in progress, we still do not support starting another operation on that object. And, by &#8216;not supported&#8217;, I mean that we have no checks in place and no guarantees on the behavior. Unfortunately, there is no easy way to detect multi-threaded access to an object (even from within a debugger), so you need to make sure that your code is correct. The simplest way to do this is by never sharing an ADO,NET object between multiple threads. This means that if you have a shared &#8216;Data Access Layer&#8217; in your application, you should be opening a new connection per call (and closing it afterwards) or, if you have something like a singleton logger, you may want to consider a Consumer\Producer pattern such that there is only one thread performing the logging.</p>
<h1>Cancellation</h1>
<p>As I mentioned previously, cancellation is the only operation that we have always supported from another thread. In .Net 4.5 we have done a lot of work to ensure that cancellation is still supported, and we have also dealt with quite a few of the corner cases. For instance, any time there is a fatal error on a connection (e.g. the network has gone down) then we close the current connection. While this may seem reasonable, it means that cancelling an operation could result in the connection being closed while another operation (i.e. the one being cancelled) was running. While we haven&#8217;t changed this behavior in .Net 4.5, we have made sure that any other operation can handle the connection be closed due to an error, even if it means throwing an <a href="http://msdn.microsoft.com/en-us/library/system.invalidoperationexception.aspx" target="_blank">InvalidOperationException</a>.</p>
<h1>Multi-threaded MARS</h1>
<p>In SQL Server 2005, we introduced a feature called &quot;<a href="http://msdn.microsoft.com/en-us/library/cfa084cz.aspx" target="_blank">Multiple Active Result Sets</a>&quot;, or MARS, which allowed multiple commands to be executed on a single connection. In .Net 4.0 and prior this had the caveat that you could not execute multiple commands or use multiple readers simultaneously, which greatly limits the usefulness of MARS. In .Net 4.5 we have done a lot of work to try to enable this scenario for <a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.aspx" target="_blank">SqlClient</a> and, although we are not yet officially supporting it, it is something that we would like for people to try out as a part of their testing of the Developer Preview and async. As a side note, there is a performance overhead for enabling MARS, so it may be worth also investigating if you can disable the feature instead.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dpaoliello.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dpaoliello.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dpaoliello.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dpaoliello.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dpaoliello.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dpaoliello.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dpaoliello.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dpaoliello.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dpaoliello.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dpaoliello.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dpaoliello.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dpaoliello.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dpaoliello.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dpaoliello.wordpress.com/30/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=30&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dpaoliello.wordpress.com/2011/09/25/thread-safety/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ea62032d05137fac973ca478f44461c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tehpenguin</media:title>
		</media:content>
	</item>
		<item>
		<title>Issue 14</title>
		<link>http://dpaoliello.wordpress.com/2011/09/18/issue-14/</link>
		<comments>http://dpaoliello.wordpress.com/2011/09/18/issue-14/#comments</comments>
		<pubDate>Sun, 18 Sep 2011 20:25:22 +0000</pubDate>
		<dc:creator>tehpenguin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ADO.NET]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[4.0]]></category>
		<category><![CDATA[4.5]]></category>
		<category><![CDATA[ado.net]]></category>
		<category><![CDATA[best practice]]></category>
		<category><![CDATA[connection pool]]></category>

		<guid isPermaLink="false">https://dpaoliello.wordpress.com/2011/09/18/issue-14/</guid>
		<description><![CDATA[(Rather than just reiterating the new features in ADO.NET that we announced for //Build/, I figured that I&#8217;d do a series of posts covering various features in depth – although this first &#34;feature&#34; shipped a bit earlier than the 4.5 Developer Preview) What&#8217;s in a fix If you remember last month&#8217;s Patch Tuesday, the first [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=25&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>(Rather than just reiterating <a href="http://msdn.microsoft.com/en-us/library/ex6y04yf(V=VS.110).aspx" target="_blank">the new features in ADO.NET that we announced for //Build/</a>, I figured that I&#8217;d do a series of posts covering various features in depth – although this first &quot;feature&quot; shipped a bit earlier than the 4.5 Developer Preview)</p>
<h1></h1>
<h1></h1>
<h1>What&#8217;s in a fix</h1>
<p>If you remember last month&#8217;s Patch Tuesday, the first Reliability Update for .Net 4.0 was release, including a bug fix for System.Data.dll. However, those of you who read the <a href="http://support.microsoft.com/kb/2533523" target="_blank">support article</a> would have been greeted by this cryptic message:</p>
<hr />
<p><strong>Issue 14</strong>     <br />Consider the following scenario</p>
<ul>
<li>You use the .NET Framework Data Provider for SQL Server (<a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.aspx" target="_blank">SqlClient</a>) to connect to an instance of Microsoft SQL Azure or of Microsoft SQL Server. </li>
<li>An established connection is removed from the connection pool. </li>
<li>The first request is sent to the server. </li>
</ul>
<p>In this scenario, an instance of <strong><a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlexception.aspx" target="_blank">SqlException</a></strong> is encountered, and you receive the following error message:     <br />A transport-level error has occurred when sending the request to the server.</p>
<hr />
<p>So given that description, can you tell what the original bug was, or what we fixed?   <br />No? Neither can I – and I wrote the fix…</p>
<h1>Historical Perspective</h1>
<p>To explain &quot;Issue 14&quot;, we&#8217;ve first got to look back at the history of ADO.NET, back to the 2.0 (or, possibly, 1.0) days. In the original design of the Connection Pool it was decided that, if there was a catastrophic failure of a connection, then the entire pool should be cleared. This was a reasonable assumption, since being unable to communicate with the server typically means that either the server is down (or restarted), the client network connection has died or failover has occurred – in any of these circumstances, it is unlikely that any other connection in the pool had survived.</p>
<p>Fast forward to today, and some of the original assumptions of the connection pool are no longer valid. Due to the increased popularity of cloud computing and connected devices, connections to SQL Servers are might not be going over ultra-fast and ultra-reliable links inside a data center. Instead, they may be going over the internet, which means that they are unreliable and could drop at any time. This, combined with SQL <a href="http://blogs.msdn.com/b/sqlazure/archive/2010/02/17/9965464.aspx" target="_blank">Azure&#8217;s policy of dropping connections that have been idle for over 30 minutes</a>, meant that we could have one dead connection in the pool, but the rest would be ok.</p>
<h1>Check Connections</h1>
<p>So now we&#8217;re connecting over unreliable connections and still clearing the pool when it&#8217;s possible that only one of the connection had died. On top of that, we don&#8217;t know the connection is dead until someone tries to execute a command on the connection (and then gets an error, despite the fact that they had just opened the connection). So what to do?</p>
<p>Firstly, we are now checking the state of the connection when we remove it from the connection pool and, if its dead, giving you a new connection. This greatly decreases the likelihood that you will be trying to execute on a bad connection (although its still possible, as we are relying on Windows to know about the state of the underlying TCP connection, and since there is a race condition between us checking and you executing on the connection).</p>
<p>Secondly, we no longer clear the pool when there is a fatal error on a connection – so we&#8217;re no longer dropping (hopefully) good connections just because one connection is bad. Conversely, since we are checking connections before using them, we are still responsive to events like failover or network disconnects.</p>
<h1>Best Practices</h1>
<p>If you read the last section carefully, you would have noticed one of the caveats of this feature: &quot;there is a race condition between us checking and you executing on the connection&quot;, which leads to my first recommendation:</p>
<p><strong>Follow the Open-Execute-Close pattern</strong></p>
<p>Every time you need to interact with SQL Server, you should open a fresh connection, execute your command (and deal with the data reader if you open one) and then close the connection (since <a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx" target="_blank">SqlConnection</a>, <a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx" target="_blank">SqlCommand</a> and <a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx" target="_blank">SqlDataReader</a> are all implement <a href="http://msdn.microsoft.com/en-us/library/system.idisposable.aspx" target="_blank">IDisposable</a>, the best way to do this is with a &#8216;using&#8217; statement). If you need to expose the data reader to a higher level API, and don&#8217;t want to cache the data in the data reader, then you should wrap the connection, command and reader inside a new class that implements <a href="http://msdn.microsoft.com/en-us/library/system.idisposable.aspx" target="_blank">IDisposable</a> and return that instead.</p>
<p>My second recommendation relates back to <a href="http://dpaoliello.wordpress.com/2011/09/10/connection-strings-the-smaller-the-better/" target="_blank">my previous post on connection strings</a>:</p>
<p><strong>Use our connection pool</strong></p>
<p>Despite the connection pooling code being rather old, it is extremely fast, reliable and it works. Opening connections from the pool and returning them afterwards is incredibly quick, especially when compared to opening a fresh connection or executing a command on a connection. Additionally we have the ability to introduce features like this which custom pooling code can&#8217;t.</p>
<p>Finally, this improvement is no replacement for <a href="http://blogs.msdn.com/b/sqlazure/archive/2010/05/11/10011247.aspx" target="_blank">proper retry code</a>.</p>
<h1>Improvements in 4.5</h1>
<p>In the .Net 4.5 Developer Preview, we&#8217;ve made this feature more scalable, especially for high-throughput application servers where connections do not sit idle in the pool for very long.</p>
<p>As a final note, if you haven&#8217;t already upgraded to .Net 4.5, then you should make sure that you&#8217;ve installed the <a href="http://go.microsoft.com/fwlink/?LinkID=219467" target="_blank">4.0 Reliability Update</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dpaoliello.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dpaoliello.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dpaoliello.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dpaoliello.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dpaoliello.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dpaoliello.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dpaoliello.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dpaoliello.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dpaoliello.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dpaoliello.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dpaoliello.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dpaoliello.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dpaoliello.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dpaoliello.wordpress.com/25/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=25&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dpaoliello.wordpress.com/2011/09/18/issue-14/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ea62032d05137fac973ca478f44461c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tehpenguin</media:title>
		</media:content>
	</item>
		<item>
		<title>Connection Strings: The smaller, the better</title>
		<link>http://dpaoliello.wordpress.com/2011/09/10/connection-strings-the-smaller-the-better/</link>
		<comments>http://dpaoliello.wordpress.com/2011/09/10/connection-strings-the-smaller-the-better/#comments</comments>
		<pubDate>Sat, 10 Sep 2011 15:40:43 +0000</pubDate>
		<dc:creator>tehpenguin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ADO.NET]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[ado.net]]></category>
		<category><![CDATA[best practice]]></category>
		<category><![CDATA[connection string]]></category>

		<guid isPermaLink="false">https://dpaoliello.wordpress.com/2011/09/10/connection-strings-the-smaller-the-better/</guid>
		<description><![CDATA[Today I&#8217;d like to talk about the wonderful and magic things that are Connection Strings. If you&#8217;re not familiar with connection strings, they are the way that a developer informs ADO.NET which server to connect to and connection options to use. A Simple Rule The problem with connection strings (actually, there are quite a few [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=24&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Today I&#8217;d like to talk about the wonderful and magic things that are <a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx" target="_blank">Connection Strings</a>. If you&#8217;re not familiar with connection strings, they are the way that a developer informs ADO.NET which server to connect to and connection options to use.</p>
<h1></h1>
<h1>A Simple Rule</h1>
<p>The problem with connection strings (actually, there are quite a few problems, but I&#8217;ll stick to the point of this post) is that there are far too many options to choose from, but let me simplify everything for you:</p>
<p><strong>If you don&#8217;t need to change an option, or don&#8217;t know what it does, then don&#8217;t specify it.</strong></p>
<h2></h2>
<h2>Default Values</h2>
<p>The default values for connection string options are there for a reason, so unless your application has some unusual requirements, you should stick to the default values. However, you shouldn&#8217;t re-specify the default values in your connection string either, unless you heavily rely on the behavior provided by that default value. The reason for this is that we may change the default at a later date if we make code changes (which make a different value more optimal), or we introduce a new value that is better for most developers. The most common case I see here is setting <a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnectionstringbuilder.maxpoolsize.aspx" target="_blank">the &quot;Max Pool Size&quot; value</a> – for the vast majority of applications the default size of 100 is reasonable, however you shouldn&#8217;t specify 100 in case we (or SQL Server) make modifications to our network code and so are able to increase the maximum, or perhaps we&#8217;d have different values for client and server applications*. Either way, you&#8217;d want to be able to get this benefit for &#8216;free&#8217; by not specifying a value, rather than having to modify all of your deployed config files with the new values (because, of course, you are using config files, and don&#8217;t have the connection string hard-coded in your application).</p>
<h2>Optional Extras</h2>
<p>Alternatively. the thought &quot;I don&#8217;t know what it does, but I might use it later&quot; may also lead to included unneeded connection string options. If there was some beneficial feature that didn&#8217;t have any negative side effects, then we would enabled that option be default. The fact that a connection string options is disabled by default should indicate that there is some other side effect of turning it on (typically a performance hit, but possibly other things). If you don&#8217;t know what an option does, then you probably aren&#8217;t taking advantage of it, and if you aren&#8217;t taking advantage of it, then you don&#8217;t need it. A good example of this is <a href="http://msdn.microsoft.com/en-us/library/cfa084cz.aspx" target="_blank">&quot;Multiple Active Result Sets&quot; (aka MARS)</a>. This is a feature introduced in SQL Server 2005 that permits multiple commands to be executed on a single connection simultaneously**. This may sound great, but most applications don&#8217;t really have a need for it, they can simply open another connection. However, if you turn it on because you &quot;may need it&quot;, then you will be taking a performance hit and possibly hiding errors in your code (since having MARS off ensures that you dispose a <a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx" target="_blank">SqlDataReader</a> before trying to open a new one on the same connection).</p>
<h1>Final Caveat</h1>
<p>Before you go ahead and start removing options from your connection strings, there is one thing you should be aware of: since you had these options specified, there may be parts of your code that rely on the non-standard behavior. For instance, if you turn off MARS, any part of your code that created multiple readers on the same connection will start throwing exceptions, or reducing the Max Pool Size may reveal a connection leak that was previously hidden (resulting in more exceptions in your code). So be very careful when changing connection string options and ensure that you run all of your tests (which, of course, you have) and have a rollback strategy to deploy the old connection string if something goes wrong.</p>
<hr />
<p>*These are just examples and are not necessarily in our current plans. But if you like these ideas, or have some of your own, feel free to post the on <a href="https://connect.microsoft.com/VisualStudio" target="_blank">Connect</a>     <br />**Technically speaking, we don&#8217;t support multithreaded access to the same connection, even with MARS turned on (unless you are cancelling a Command). So, you would still need to synchronize each of the Command\Reader executions\reads on the same connection.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dpaoliello.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dpaoliello.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dpaoliello.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dpaoliello.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dpaoliello.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dpaoliello.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dpaoliello.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dpaoliello.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dpaoliello.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dpaoliello.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dpaoliello.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dpaoliello.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dpaoliello.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dpaoliello.wordpress.com/24/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=24&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dpaoliello.wordpress.com/2011/09/10/connection-strings-the-smaller-the-better/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ea62032d05137fac973ca478f44461c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tehpenguin</media:title>
		</media:content>
	</item>
		<item>
		<title>Size of MAX != Max of Size</title>
		<link>http://dpaoliello.wordpress.com/2011/09/05/size-of-max-max-of-size/</link>
		<comments>http://dpaoliello.wordpress.com/2011/09/05/size-of-max-max-of-size/#comments</comments>
		<pubDate>Mon, 05 Sep 2011 22:54:21 +0000</pubDate>
		<dc:creator>tehpenguin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ADO.NET]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[ado.net]]></category>
		<category><![CDATA[data types]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">https://dpaoliello.wordpress.com/2011/09/05/size-of-max-max-of-size/</guid>
		<description><![CDATA[How&#8217;s that for a title? What I’m actually referring to here is the VAR* data types in SQL Server (i.e. VARBINARY, VARCHAR and NVARCHAR). For these data types you need to specify a maximum size for that column, such as VARBINARY(20) (which would be a binary array that is, at most, 20 bytes long). The [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=20&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h1>How&#8217;s that for a title?</h1>
<p>What I’m actually referring to here is the VAR* data types in SQL Server (i.e. <a href="http://msdn.microsoft.com/en-us/library/ms188362.aspx" target="_blank">VARBINARY</a>, <a href="http://msdn.microsoft.com/en-us/library/ms176089.aspx" target="_blank">VARCHAR</a> and <a href="http://msdn.microsoft.com/en-us/library/ms186939.aspx" target="_blank">NVARCHAR</a>). For these data types you need to specify a maximum size for that column, such as VARBINARY(20) (which would be a binary array that is, at most, 20 bytes long). The largest maximum size permitted is 8000 for VARCHAR and VARBINARY and 4000 for NVARCHAR. You can also specify a size of ‘MAX’ (e.g. VARCHAR(MAX)), however this does not set the maximum size to 8000 or 4000, rather it sets the maximum for the column to 2^31-1 bytes.</p>
<p>Hence, the Size of MAX (2^31-1) != Max of Size (4000 or 8000)</p>
<h1>Pick a size, any size</h1>
<p>So, the question then becomes “Why not just use MAX for everything?” A few reasons: Firstly is performance, from a connectivity point of view (since that’s where I work), MAX data types need to be sent in chunks, meaning that we need to read additional metadata concerning the size of each chunk (although this is likely to be quite small compared to the total amount of data being sent). From an storage point of view, if the data is larger than 8000 bytes then it is stored “<a href="http://msdn.microsoft.com/en-us/library/ms189087.aspx" target="_blank">out of row</a>”, meaning that a pointer to the data is stored in the row storage and must be dereferenced in order to read the data. This also means that the query engine* can not simply assume that all of the data it requires is in row storage, nor can it assume that it can load the all of the data from the column into memory (since they may be up to 2Gb of data per MAX column per row).</p>
<p>In terms of maintenance, <a href="http://msdn.microsoft.com/en-us/library/ms190981.aspx" target="_blank">you can not do online index operations on MAX columns</a>. Additionally, if you have a lot of data that increases over time to be above the 8000 byte limit and is taken &#8220;out of row&#8221; or shrinks to below 8000 bytes and is taken into the row, then this will greatly increase the amount of fragmentation your database has.</p>
<p>However, the most important reason to limit the size of VAR* columns is for security. For instance, imagine that you are running a website and permit users to create accounts, but you also allow them to change their username once they are registered. You also decide that you will have the &#8216;username&#8217; column in your database to be NVARCHAR(MAX), and that you will limit the size of the username in your business logic. All of this would be fine, so long as your code is bug free. If, however, you have a bug that allows a user to bypass your business logic and set a username of any size, then it becomes quite easy for a malicious user to stage a denial of service attack on your website – they can simply create a few users with very long usernames and fill up your database (remember that SQL Azure only allows 50Gb database size, which is 25 completely filled MAX columns). If you also have a page that displays usernames (e.g. for high scores, list of users online, searches) then your other users won&#8217;t be able to use those pages as they will be attempting to download the attacker&#8217;s massive username (and the bandwidth that is used in the process may be costly as well). So, while the correct response to this scenario is to fix the bugs in your website, you should also be following <a href="http://en.wikipedia.org/wiki/Defense_in_Depth_%28computing%29" target="_blank">the &#8220;Defense in Depth&#8221; principle</a> and have protections all the way from client-side scripting through to the business logic and underlying database schema.</p>
<p>There are, however, some places where limiting to 4000 bytes may be unreasonable, for instance blog posts, forums or content stored in a CMS. But, where possible, try to choose an actual size for your VAR* columns.</p>
<h1>Note on legacy types</h1>
<p>You may also notice that there are the <a href="http://msdn.microsoft.com/en-us/library/ms187993.aspx" target="_blank">IMAGE, TEXT and NTEXT types</a> in SQL Server, these are legacy types and you should be using VARBINARY, VARCHAR and NVARCHAR types instead.</p>
<p>* I have not seen the engine&#8217;s code so I can&#8217;t confirm that it does make these assumptions, although there is some <a href="http://rusanu.com/2010/03/22/performance-comparison-of-varcharmax-vs-varcharn/" target="_blank">evidence to suggest that specifying a size does help performance</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dpaoliello.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dpaoliello.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dpaoliello.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dpaoliello.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dpaoliello.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dpaoliello.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dpaoliello.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dpaoliello.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dpaoliello.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dpaoliello.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dpaoliello.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dpaoliello.wordpress.com/20/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dpaoliello.wordpress.com/20/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dpaoliello.wordpress.com/20/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=20&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dpaoliello.wordpress.com/2011/09/05/size-of-max-max-of-size/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ea62032d05137fac973ca478f44461c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tehpenguin</media:title>
		</media:content>
	</item>
		<item>
		<title>P3SS: POP3 Test Server</title>
		<link>http://dpaoliello.wordpress.com/2010/12/19/p3ss-pop3-test-server/</link>
		<comments>http://dpaoliello.wordpress.com/2010/12/19/p3ss-pop3-test-server/#comments</comments>
		<pubDate>Sun, 19 Dec 2010 22:51:44 +0000</pubDate>
		<dc:creator>tehpenguin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://dpaoliello.wordpress.com/2010/12/19/p3ss-pop3-test-server/</guid>
		<description><![CDATA[As a part of my work to automate testing for P3SS (POP3 to SMTP Server) I have been building a POP3 server that P3SS can run against and I can easily set and inspect the state of as well as introduce errors and ‘bugs’. I am happy to announce that the source code for the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=19&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>As a part of my work to automate testing for <a href="http://p3ss.codeplex.com/" target="_blank">P3SS</a> (POP3 to SMTP Server) I have been building a POP3 server that P3SS can run against and I can easily set and inspect the state of as well as introduce errors and ‘bugs’.</p>
<p>I am happy to announce that the <a href="http://p3ss.codeplex.com/SourceControl/changeset/changes/60064" target="_blank">source code for the first version of this POP3 test server is available on Codeplex</a>!</p>
<p>This is a basic, but fully <a href="http://www.faqs.org/rfcs/rfc1939.html" target="_blank">RFC 1939</a> compliant POP3 server that is designed to make unit and functional testing of POP3 clients much easier. At present it supports:</p>
<ul>
<li>Proper TCP support, including custom ports (110 is default) </li>
<li>Multiple clients (through multi-threading), with per client:</li>
<ul>
<li>Usernames and passwords</li>
<li>Adding mail items and checking if they have been deleted and collected</li>
</ul>
<li>Most POP3 Commands:</li>
<ul>
<li>USER, PASS</li>
<li>APOP</li>
<li>DELE</li>
<li>LIST, STAT</li>
<li>NOOP (Note: NOOP is implemented such that it will respond even if the client is not logged in – which is against RFC specs)</li>
<li>RETR</li>
<li>RSET</li>
<li>QUIT</li>
<li>UIDL</li>
</ul>
<li>Unit tests for all functionality</li>
<li>A simple base on which to build your own test servers (an echo server is also provided)</li>
</ul>
<p>I am now working to add CAPA and encryption (both implicit and STLS). The addition of encryption may mean that I will have to rebuild part of the networking code, so you may see that the next version uses the <a href="http://msdn.microsoft.com/en-us/vstudio/async.aspx" target="_blank">Async CTP</a> and (hopefully) does less low-level networking\stream\byte array code. Once the POP3 test server is complete and stabilized, I will move onto a test SMTP server, then add abilities to introduce errors and non-compliance into both (while also adding some tests for P3SS in between).</p>
<p>In the mean time, the code is available for one and all to use! And let me know (either on Codeplex or via email) if you have any feedback or suggestions.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dpaoliello.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dpaoliello.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dpaoliello.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dpaoliello.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dpaoliello.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dpaoliello.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dpaoliello.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dpaoliello.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dpaoliello.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dpaoliello.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dpaoliello.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dpaoliello.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dpaoliello.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dpaoliello.wordpress.com/19/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=19&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dpaoliello.wordpress.com/2010/12/19/p3ss-pop3-test-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ea62032d05137fac973ca478f44461c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tehpenguin</media:title>
		</media:content>
	</item>
		<item>
		<title>When in doubt, try the other port</title>
		<link>http://dpaoliello.wordpress.com/2010/12/18/when-in-doubt-try-the-other-port/</link>
		<comments>http://dpaoliello.wordpress.com/2010/12/18/when-in-doubt-try-the-other-port/#comments</comments>
		<pubDate>Sat, 18 Dec 2010 08:47:33 +0000</pubDate>
		<dc:creator>tehpenguin</dc:creator>
				<category><![CDATA[Case of the]]></category>
		<category><![CDATA[esoteric solution]]></category>
		<category><![CDATA[exchange]]></category>
		<category><![CDATA[fail]]></category>

		<guid isPermaLink="false">https://dpaoliello.wordpress.com/2010/12/18/when-in-doubt-try-the-other-port/</guid>
		<description><![CDATA[First off – sorry for not posting in 6 months… I was somewhat preoccupied with finishing up my honors and starting my new job at Microsoft. As you may have noticed by my spelling, I’m now in the US and have settled in quite well. But enough about me, on to the blog post! So, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=17&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>First off – sorry for not posting in 6 months… I was somewhat preoccupied with finishing up my honors and starting my new job at Microsoft. As you may have noticed by my spelling, I’m now in the US and have settled in quite well. But enough about me, on to the blog post!</p>
<p>So, last Tuesday was Patch Tuesday and, lo and behold, my laptop couldn’t connect to Exchange, and my phone hadn’t synced since 3am that morning. Since I was foolish enough to have my server set to automatically install updates (which, by default, happens at 3am) I immediately knew what was wrong. Logging into the server confirmed my suspicions – the server had installed updates and now the Exchange Information Store service was stuck in the ‘starting’ state. I hit reset on the server, blocked my ears as the fans revved to maximum speed while the machine booted and waited. And waited. And waited. Something had gone horribly wrong – the hard drive light had stopped, but I couldn’t remote in; I tried plugging in my monitor – but it simply said “Mode not compatible: 74.9Hz”, most likely because the server hadn’t booted with the monitor connected. I hit the reset button and waited again, this time watching the boot sequence. Two things caused alarm bells to ring in my head – firstly the RAID status was “Verify” not “Optimal” and, secondly, Windows start up never got past “Applying computer settings” (with the “Donut of Doom” spinning ominously to the left of it).</p>
<p>My first reaction was to restore from the last backup – I had nightly backups going and Server 2K8 R2 makes restoring from backups (even onto ‘bare metal’) extremely easy. I rolled back to the last backup but, to my horror, Windows was still stuck at “Applying computer settings”. I tried backups that were even older, but to no avail – the server wouldn’t boot. By this time the fact that the RAID status was still “Verify” had gone from a curiosity in my mind to a possible cause – so I broke the array and attempted to restore onto a single disc, with that failing I recreated the array and tried again. Still nothing. At this point I was pretty desperate, I couldn’t remote in or physically log in, so I pulled out the debugging tools.</p>
<p>First up was the old faithful, the most useful tool that ships with Windows and is severely underrated and probably under used – Event Viewer. Even though the server hadn’t booted properly, and my laptop wasn’t on the same domain as the server, Event Viewer still managed to connect to the server. What I saw in the logs (past all of the spam that P3SS generates – I really need to fix that…) is that the MSExchange ADAccess was having 2102 and 2114 events, indicating that it couldn’t find the AD server – which was especially weird since the AD server WAS the Exchange server… But things began to make more sense now.</p>
<p>The “Applying computer settings” part of Windows start up is when a large majority of services running in Windows start. If these services hang then the machine gets ‘stuck’ in this screen. Except that these services should never hang because the Service Monitor is supposed to kill them after 30 seconds. But how do you kill a service that is in the process of “stopping” and refuses to respond? Exchange not finding the AD service meant that either AD or DNS was not running properly. Since I had to provide domain credentials to Event Viewer in order to log into to the server, AD must have been ok – therefore the DNS server had borked. And the easiest way to unbork a DNS server? Yank the network cable.</p>
<p>I pulled out the network cable from the server, and nothing happened. Damn. Perhaps the DNS services was still trying to bind to the static IP of the disconnected network card? So I plugged the cable into the secondary network card (which had a dynamic IP) and… the server finally booted! Logging in I found my theory confirmed again – the DNS service and a number of&#160; Exchange services that were set to “Automatic” had not started. I started the services, and everything was running as smooth as butter – so I reset the server. And it got stuck again. A quick switch of network ports and kicking off some services, and we were back in business.</p>
<p>So there you have it – when in doubt, try the other network port!</p>
<p><strong>Addendum:</strong> <a href="http://www.bing.com/search?q=DSC_E_NO_SUITABLE_CDC" target="_blank">Binging “DSC_E_NO_SUITABLE_CDC”</a> has resulted in a few things to try, including enabling IPv6 (which I don’t really want to do, as it tends to break Outlook Anywhere) and adding the Exchange Server to the “Domain Admins” group… I’ll try some of these over the weekend and let you all know how it goes!</p>
<p><strong>Update: </strong>It looks like <a href="http://social.technet.microsoft.com/forums/en-US/exchangesvrdeploy/thread/f0c26bef-a587-4d95-a9f1-5c79549197c8/" target="_blank">Travis Wright on the TechNet forums</a> had the correct answer – if you had IPv6 enabled when you installed Exchange 2010, it needs to remain enabled. (In hindsight, this makes sense, as it may have been possible that the DNS service was trying to bind to a non-existent IPv6 address and that the Exchange AD Topology service may have been looking for AD on the IPv6 loopback address, and connecting the cable to the secondary card worked because that secondary card still had IPv6 enabled)</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dpaoliello.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dpaoliello.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dpaoliello.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dpaoliello.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dpaoliello.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dpaoliello.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dpaoliello.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dpaoliello.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dpaoliello.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dpaoliello.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dpaoliello.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dpaoliello.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dpaoliello.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dpaoliello.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=17&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dpaoliello.wordpress.com/2010/12/18/when-in-doubt-try-the-other-port/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ea62032d05137fac973ca478f44461c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tehpenguin</media:title>
		</media:content>
	</item>
		<item>
		<title>Life Update (Aka Why I haven&#8217;t posted recently)</title>
		<link>http://dpaoliello.wordpress.com/2010/06/18/life-update-aka-why-i-havent-posted-recently/</link>
		<comments>http://dpaoliello.wordpress.com/2010/06/18/life-update-aka-why-i-havent-posted-recently/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 08:33:27 +0000</pubDate>
		<dc:creator>tehpenguin</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Rant]]></category>
		<category><![CDATA[Uni]]></category>
		<category><![CDATA[dipose]]></category>
		<category><![CDATA[honours]]></category>
		<category><![CDATA[job]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[msdn]]></category>

		<guid isPermaLink="false">https://dpaoliello.wordpress.com/2010/06/18/life-update-aka-why-i-havent-posted-recently/</guid>
		<description><![CDATA[Honours As some of you are aware, I am completing my Honours this Semester (yay!). As such I have spent most of the past couple of months scrambling to get data together and actually write the Thesis. I draft is available on my Live SkyDrive (this is the submitted draft. It&#8217;s 76 pages long, so [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=15&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2>Honours</h2>
<p>As some of you are aware, I am completing my Honours this Semester (yay!). As such I have spent most of the past couple of months scrambling to get data together and actually write the Thesis. I draft is available on my <a href="http://cid-74f91ef0b8d71613.skydrive.live.com/self.aspx/Honours/Thesis.pdf" target="_blank">Live SkyDrive</a> (this is the submitted draft. It&#8217;s 76 pages long, so you may want to wait for the final edition).</p>
<p>Through doing my honours I have had a few thoughts that I had wanted to share, but couldn&#8217;t find the time to put together those posts into a cohesive blog post, so over the next month or two, I&#8217;ll see how many of them I can remember\be bothered to write. They&#8217;re going to include some rants on Java, Matlab, Curtin and coding in general.</p>
<h2>Microsoft</h2>
<p>Leading on from Honours, I have managed to get myself a job over at Microsoft in Seattle. It is a graduate position with the SQL Team, working on Managed Providers (namely the <a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.aspx" target="_blank">System.Data.SqlClient</a> namespace). At present, the job is pending on my getting a Visa (which is pending on my graduation from honours).</p>
<p>More info as it comes&#8230;</p>
<h2>.NET</h2>
<p>Given that I now have (in effect) a week break before my only exam, I have spent a little time working on both the <a href="http://jetlogintool.codeplex.com/" target="_blank">JetLoginTool</a> and <a href="http://p3ss.codeplex.com/" target="_blank">P3SS</a>. I&#8217;ve been reading a few of the <a href="http://msdn.microsoft.com/en-au/magazine/ee532402.aspx?sdmr=clrinsideout&amp;sdmi=columns" target="_blank">CLR Inside Out articles</a> from the <a href="http://msdn.microsoft.com/en-au/magazine/default.aspx" target="_blank">MSDN Magazine</a>, and have been attempting to utilise them in order to reduce the memory footprint of the JetLoginTool and harden P3SS. One of the more interesting things that I found was the <a href="http://msdn.microsoft.com/en-au/magazine/cc163392.aspx" target="_blank">Dispose pattern</a>, which I have now been adhering to tightly (and have seen the JetLoginTool drop about half of its memory usage).</p>
<p>Which leads me to my first real rant of this post:   <br /><strong>Dear BCL team: Please ensure that everything that implements IDisposable does so implicitly.     <br /></strong>There is nothing more annoying than attempting to be a responsible developer by calling Dispose() (<a href="http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=88e62cdf-5919-4ac7-bc33-20c06ae539ae" target="_blank">when necessary</a>), only to have to delve through the MSDN to double check that the classes you just used that look like they should have unmanaged resource (or a managed-wrapped unmanaged resource) do actually have a Dispose() method (e.g. the <a href="http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.aspx" target="_blank">TcpClient</a> class). Then, once you have found out that it does implement IDisposable, you have to typecast first so foo.Dispose() becomes ((IDisposable)foo).Dispose().</p>
<p>Right, that enough for today &#8211; hopefully I&#8217;ll have time to do the Java rant next&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dpaoliello.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dpaoliello.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dpaoliello.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dpaoliello.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dpaoliello.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dpaoliello.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dpaoliello.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dpaoliello.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dpaoliello.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dpaoliello.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dpaoliello.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dpaoliello.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dpaoliello.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dpaoliello.wordpress.com/15/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=15&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dpaoliello.wordpress.com/2010/06/18/life-update-aka-why-i-havent-posted-recently/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ea62032d05137fac973ca478f44461c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tehpenguin</media:title>
		</media:content>
	</item>
		<item>
		<title>The Life and Times of IE6</title>
		<link>http://dpaoliello.wordpress.com/2010/02/12/the-life-and-times-of-ie6/</link>
		<comments>http://dpaoliello.wordpress.com/2010/02/12/the-life-and-times-of-ie6/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 11:00:21 +0000</pubDate>
		<dc:creator>tehpenguin</dc:creator>
				<category><![CDATA[Repost]]></category>
		<category><![CDATA[comic]]></category>
		<category><![CDATA[ie6]]></category>

		<guid isPermaLink="false">http://dpaoliello.wordpress.com/2010/02/12/the-life-and-times-of-ie6/</guid>
		<description><![CDATA[I came across an awesome comic strip describing how IE6 came into being, why it wasn&#8217;t upgraded and, most importantly, can we now get rid of it? http://www.smashingmagazine.com/2010/02/11/the-life-times-and-death-of-internet-explorer-6-comic-strip/<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=14&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I came across an awesome comic strip describing how IE6 came into being, why it wasn&#8217;t upgraded and, most importantly, can we now get rid of it?</p>
<p><a title="http://www.smashingmagazine.com/2010/02/11/the-life-times-and-death-of-internet-explorer-6-comic-strip/" href="http://www.smashingmagazine.com/2010/02/11/the-life-times-and-death-of-internet-explorer-6-comic-strip/">http://www.smashingmagazine.com/2010/02/11/the-life-times-and-death-of-internet-explorer-6-comic-strip/</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dpaoliello.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dpaoliello.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dpaoliello.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dpaoliello.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/dpaoliello.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/dpaoliello.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/dpaoliello.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/dpaoliello.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dpaoliello.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dpaoliello.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dpaoliello.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dpaoliello.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dpaoliello.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dpaoliello.wordpress.com/14/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dpaoliello.wordpress.com&amp;blog=10905274&amp;post=14&amp;subd=dpaoliello&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dpaoliello.wordpress.com/2010/02/12/the-life-and-times-of-ie6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ea62032d05137fac973ca478f44461c3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">tehpenguin</media:title>
		</media:content>
	</item>
	</channel>
</rss>
