<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5923247</id><updated>2011-12-22T08:23:47.854+10:00</updated><category term='WPF'/><title type='text'>life in the so called space age</title><subtitle type='html'>a blog by steve j rodgers</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default?start-index=101&amp;max-results=100'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>158</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5923247.post-603194546005832405</id><published>2009-03-22T02:41:00.001+10:00</published><updated>2009-03-22T02:41:50.852+10:00</updated><title type='text'>Currying The ASP.NET Cache</title><content type='html'>&lt;p&gt;I’m reposting this blog entry with code in lieu of images after &lt;a href="http://www.interact-sw.co.uk/iangblog/"&gt;Ian&lt;/a&gt; sent me a rant email quite rightly complaining that he couldn’t read the code in the images (apologies to Ian and anyone else who reads this blog!)&lt;/p&gt;  &lt;p&gt;&amp;lt;snip/&amp;gt;&lt;/p&gt;  &lt;p&gt;The ASP.NET cache is a thing of beauty. But one thing that fills me with dread whenever I see it is an application littered with ASP.NET caching access code.    &lt;br /&gt;One of the other issues that developers have to handle is the possibility that stuff you put in it may not be there next time you ask for it back because the cache is prone to being purged when memory is constrained. This can lead to hideous looking developer code like this:&lt;/p&gt;  &lt;p&gt;public void Page_Load(object sender, EventArgs args)    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Person p = (Person)Cache[&amp;quot;human&amp;quot;]; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (p == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; p = HumanBusinessLogic.GetPerson(Request[&amp;quot;id&amp;quot;]);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Cache[&amp;quot;human&amp;quot;] = p;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // go ahead and use p     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;Yuck!!    &lt;br /&gt;To clean up the mess with a little refactoring, we could at least put the cache code in the business logic:&lt;/p&gt;  &lt;p&gt;public static Person GetPerson(string id)    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Cache cache = HttpContext.Current.Cache; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Person p = (Person)cache[&amp;quot;human&amp;quot;]; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (p == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; p = HumanDataAccess.GetPerson(id);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cache[&amp;quot;human&amp;quot;] = p;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return p;    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;But the problem now comes that for every business method that uses caching, there will be a cut and paste of the exact same code plus marginal refactor. The solution to that issue might lead us to develop a base class that offers up some kind of caching method that all business logic classes can then derive from and gain benefit.    &lt;br /&gt;This base class method would need to solve a couple of scenarios for it to be of any use to a derived class. First, it must look in the cache to see if the item is there and return it if it is. Second, it should have a mechanism of getting the item from the database and repopulating the cache if the item is not in the cache. The first scenario is a breeze, but the second scenario could be problematic. For example, most business logic entities come from a data access method invocation, but how many parameters will the data access method need and what types will they be? &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;A first crack at solving the problem might be to pretend that the data access method takes no parameters. That way, we could pass a delegate as a parameter that is invoked by the cache code when it detects a cache miss. The code would look like this (and notice the delegate takes no parameters)&lt;/p&gt;  &lt;p&gt;public delegate DataTable RetrieveData(); &lt;/p&gt;  &lt;p&gt;public class CurriedCache   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public static DataTable getCachedDataItem(string cacheKey,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RetrieveData retriever)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Cache cache = HttpRuntime.Cache;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DataTable item = (DataTable)cache[cacheKey];    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (item == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lock (typeof(CurriedCache))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = (DataTable)cache[cacheKey];    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (item == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = retriever();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cache.Add(cacheKey,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; null,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Cache.NoAbsoluteExpiration,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Cache.NoSlidingExpiration,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CacheItemPriority.Default,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; null);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return item;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;There are some huge issues with this implementation. First of all, it is assumed that the item being stored is a DataTable. Second, there is still the assumption that the retriever function takes no parameters. &lt;/p&gt;  &lt;p&gt;To solve the first problem, we can use generics:&lt;/p&gt;  &lt;p&gt;public delegate TResult RetrieveData&amp;lt;TResult&amp;gt;(); &lt;/p&gt;  &lt;p&gt;public class CurriedCache   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public static TResult getCachedDataItem&amp;lt;TResult&amp;gt;(    &lt;br /&gt;string cacheKey,    &lt;br /&gt;RetrieveData&amp;lt;TResult&amp;gt; retriever)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where TResult : class    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Cache cache = HttpRuntime.Cache;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TResult item = (TResult)cache[cacheKey];    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (item == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lock (typeof(CurriedCache))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = (TResult)cache[cacheKey];    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (item == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = retriever();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cache.Add(cacheKey,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; null,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Cache.NoAbsoluteExpiration,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Cache.NoSlidingExpiration,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CacheItemPriority.Default,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; null);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return item;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;A useful bit of tidy up would be to replace the RetrieveData delegate with the Func&amp;lt;TResult&amp;gt; delegate that Microsoft already define as part of a family of delegates called Func that take no arguments, one argument, two arguments, etc respectively.&lt;/p&gt;  &lt;p&gt;namespace System   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public delegate TResult Func&amp;lt;TResult&amp;gt;();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public delegate TResult Func&amp;lt;T, TResult&amp;gt;(T arg);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public delegate TResult Func&amp;lt;T, TResult&amp;gt;(T arg);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public delegate TResult Func&amp;lt;T1, T2, TResult&amp;gt;(T1 arg1,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T2 arg2);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public delegate TResult Func&amp;lt;T1, T2, T3, TResult&amp;gt;(T1 arg1,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T2 arg2, T3 arg3);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public delegate TResult Func&amp;lt;T1, T2, T3, T4, TResult&amp;gt;(T1 arg1, T2 arg2, T3 arg3, T4 arg4);    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;It’s almost done, but not quite. There is still the serious limitation of the retriever function taking no parameters. The solution involves a bit of &lt;a href="http://en.wikipedia.org/wiki/Currying"&gt;currying&lt;/a&gt;. We will also define overloaded versions of the getCachedDataItem to cater for retriever functions that expect more than one parameter:&lt;/p&gt;  &lt;p&gt;public class CurriedCache   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public static TResult getCachedDataItem&amp;lt;TResult&amp;gt;(    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string cacheKey,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; object monitor,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DateTime absoluteExpiration,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TimeSpan slidingExpiration,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Func&amp;lt;TResult&amp;gt; retriever)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where TResult : class    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Cache cache = HttpRuntime.Cache;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TResult item = (TResult)cache[cacheKey];    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (item == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lock (monitor)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = (TResult)cache[cacheKey];    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (item == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item = retriever();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cache.Add(cacheKey,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; item,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; null,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; absoluteExpiration,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; slidingExpiration,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CacheItemPriority.Default,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; null);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return item;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public static TResult getCachedDataItem&amp;lt;T1, TResult&amp;gt;(   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string cacheKey,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; object monitor,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DateTime absoluteExpiration,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TimeSpan slidingExpiration,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Func&amp;lt;T1, TResult&amp;gt; retriever,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T1 a)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where TResult : class    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return getCachedDataItem&amp;lt;TResult&amp;gt;(cacheKey,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; monitor,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; absoluteExpiration,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; slidingExpiration,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; () =&amp;gt; { return retriever(a); });    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public static TResult getCachedDataItem&amp;lt;T1, T2, TResult&amp;gt;(   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string cacheKey,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; object monitor,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DateTime absoluteExpiration,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TimeSpan slidingExpiration,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Func&amp;lt;T1, T2, TResult&amp;gt; retriever,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T1 a,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; T2 b)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where TResult : class    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return getCachedDataItem&amp;lt;TResult&amp;gt;(cacheKey,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; monitor,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; absoluteExpiration,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; slidingExpiration,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; () =&amp;gt; { return retriever(a, b); });    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;Notice how the overloaded versions expect the retriever function to be a delegate that takes one or more arguments and notice how this delegate is then invoked in a wrapped delegate of the first type (Func&amp;lt;TResult&amp;gt;)    &lt;br /&gt;Since it’s likely we want to be able to lock cached items independently, it probably makes sense to introduce a lock parameter for finer grained locking. The addition of absolute and sliding expiration parameters also give a degree of finer control over caching behavior. The final tidy up also uses lamda expression syntax to invoke the delegates.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-603194546005832405?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/603194546005832405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=603194546005832405&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/603194546005832405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/603194546005832405'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2009/03/currying-aspnet-cache_22.html' title='Currying The ASP.NET Cache'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-6545767771143285368</id><published>2009-02-19T07:16:00.017+10:00</published><updated>2009-02-19T08:37:10.923+10:00</updated><title type='text'>How to actively highlight a GridView row with JQuery</title><content type='html'>In a project, recently, I wanted to switch over to using the CSS Friendly Control Adapters to get the GridView to render its TR’s and TD’s with a CSS class so that all the styling could be dropped into a style sheet. The reason for doing this was because we wanted to highlight the row underneath the mouse by leveraging JQuery magic, thus improving the end user experience when there are many rows (See image below)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_QWj4aaPgfRI/SZyHk7sITmI/AAAAAAAAAN8/lKuUXf-amNo/s1600-h/JQueryGridViewHighlightRow.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_QWj4aaPgfRI/SZyHk7sITmI/AAAAAAAAAN8/lKuUXf-amNo/s320/JQueryGridViewHighlightRow.jpg" alt="" id="BLOGGER_PHOTO_ID_5304263529703427682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The problem with the CSS Friendly Control Adapters is the all or nothing behaviour. Once you activate them in your project, they have global effect. I went looking for a mechanism that would allow me to turn off the effect on a per GridView basis and was initially excited to see the GridView attribute AdapterEnabled="false"...but after a short test, it became apparent that it doesn’t work!&lt;br /&gt;&lt;br /&gt;So, I decided to dump the CSS Friendly Control Adapters and go for a home grown route instead.&lt;br /&gt;&lt;br /&gt;The first thing to do is to *remove* &amp;lt;RowStyle&amp;gt; and &amp;lt;AlternatingRowStyle&amp;gt; elements in the GridView and add a CssClass=”selectableGridView” (see image below):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_QWj4aaPgfRI/SZyNVkIeuEI/AAAAAAAAAOk/DGPgdnEnzm4/s1600-h/GridCode.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_QWj4aaPgfRI/SZyNVkIeuEI/AAAAAAAAAOk/DGPgdnEnzm4/s320/GridCode.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5304269862751615042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you fail to remove these elements, they produce HTML as seen below (see how the element gets translated into a style='....' in the HTML)&lt;br /&gt;&lt;br /&gt;....and don't forget to add the CssClass=”selectableGridView” to the GridView (as marked in the green square)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_QWj4aaPgfRI/SZyJHYKpqfI/AAAAAAAAAOM/FJjPzFWYIBI/s1600-h/CrapGridViewStyles.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_QWj4aaPgfRI/SZyJHYKpqfI/AAAAAAAAAOM/FJjPzFWYIBI/s320/CrapGridViewStyles.jpg" alt="" id="BLOGGER_PHOTO_ID_5304265220974815730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The reason for removing them is because we’re going to be using JQuery to add a class dynamically to the row when the mouse is over it and this will have no effect whatsoever if the local styling is left in place. By the way, there's another bonus for doing this and that's to reduce the size of the page which will therefore increase page load time.&lt;br /&gt;&lt;br /&gt;So, the JQuery code looks like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_QWj4aaPgfRI/SZyJmwNbdtI/AAAAAAAAAOU/rnN__3ph0Wc/s1600-h/GridViewJQuery.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 172px;" src="http://1.bp.blogspot.com/_QWj4aaPgfRI/SZyJmwNbdtI/AAAAAAAAAOU/rnN__3ph0Wc/s320/GridViewJQuery.jpg" alt="" id="BLOGGER_PHOTO_ID_5304265760004863698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The JQuery code has two jobs it must do. First, it needs to put back the row style and alternating row style. This is done with the following code:&lt;br /&gt;&lt;br /&gt;$('.selectableGridView tr:odd').not(':has(th)').addClass('SelectableGridViewAlternateRow');&lt;br /&gt;&lt;br /&gt;$('.selectableGridView tr:even').not(':has(th)').addClass('SelectableGridViewRow');&lt;br /&gt;&lt;br /&gt;The first line applies the alternating row style via the class .SelectableGridViewAlternateRow and the second line applies the normal non alternating row style via the class .SelectableGridViewRow. We need to be careful not to include the rows that are in the table header, hence the .not(':has(th)') selector to filter those guys out.&lt;br /&gt;&lt;br /&gt;The next piece of JQuery magic is to highlight the row underneath the mouse.&lt;br /&gt;&lt;br /&gt;$('.selectableGridView tr').not(':has(th)').mouseover(function() {&lt;br /&gt;&lt;br /&gt;$(this).addClass('SelectableGridViewHighlightRow');}).mouseout(function()&lt;br /&gt;$(this).removeClass('SelectableGridViewHighlightRow');});&lt;br /&gt;&lt;br /&gt;Again, we simply filter out the rows in the header and then apply the .SelectableGridViewHighlightRow class in mouseover and then remove it in mouseout.&lt;br /&gt;&lt;br /&gt;To finish up, the style sheet sets up the rules needed to bring it all together&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_QWj4aaPgfRI/SZyKA-2BsTI/AAAAAAAAAOc/yK6hT1CSUdo/s1600-h/GridViewStyleSheet.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 151px;" src="http://3.bp.blogspot.com/_QWj4aaPgfRI/SZyKA-2BsTI/AAAAAAAAAOc/yK6hT1CSUdo/s320/GridViewStyleSheet.jpg" alt="" id="BLOGGER_PHOTO_ID_5304266210609836338" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-6545767771143285368?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/6545767771143285368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=6545767771143285368&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/6545767771143285368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/6545767771143285368'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2009/02/how-to-actively-highlight-gridview-row.html' title='How to actively highlight a GridView row with JQuery'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_QWj4aaPgfRI/SZyHk7sITmI/AAAAAAAAAN8/lKuUXf-amNo/s72-c/JQueryGridViewHighlightRow.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-5287851672389969329</id><published>2008-12-28T05:57:00.006+10:00</published><updated>2008-12-29T07:44:55.719+10:00</updated><title type='text'>understanding C#'s yield return statement</title><content type='html'>The C# yield return statement causes the C# compiler to generate a fair amount of additional IL instructions. This generated code can easily be seen with a tool like Reflector. Although, understanding exactly how the generated code works is not especially easy from first glance since it is rather verbose and somewhat lacking in useful variable names.&lt;br /&gt;&lt;br /&gt;A first port of call might be to extract the generated code with Reflector into a Visual Studio .NET C# source file. Sadly, an attempt at compilation will result in errors :( It turns out that the generated IL code does some things that ordinary C# programs are forbidden to do.&lt;br /&gt;&lt;br /&gt;Specifically, the iterator syntax magic creates an implementation of IEnumerator&lt;t&gt;.MoveNext() that can be called multiple times, with each call returning to the same point it was at previously, prior to returning last time round. So how does it do that? How can you call a method multiple times and each time have it resume from the exact same point it left previously?&lt;br /&gt;&lt;br /&gt;To see this programming style in action, one approach might be to write a simple program from scratch that demonstrates how you could mimic the behaviour of calling a method multiple times and returning to the same point you previously left off. C# is not going to be the right language choice since it forbids the very programming style we want to emulate! It turns out that a simple C++ program is a good candidate for demonstrating the concept and has the benefits of being compilable and therefore debuggable and also reasonably easy to understand.&lt;br /&gt;&lt;br /&gt;As an example, consider the following C++ program that displays the first 6 prime numbers with a function GetPrime() that when called each time will return the next prime number in the array.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_QWj4aaPgfRI/SVaJNpCCiSI/AAAAAAAAAL4/yFkKD89-6Gw/s1600-h/iterator_code_a.jpg"&gt;&lt;img style="cursor: pointer; width: 253px; height: 400px;" src="http://1.bp.blogspot.com/_QWj4aaPgfRI/SVaJNpCCiSI/AAAAAAAAAL4/yFkKD89-6Gw/s400/iterator_code_a.jpg" alt="" id="BLOGGER_PHOTO_ID_5284562080211568930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For simplicity, the program uses several global variables but it’s not hard to imagine these being hoisted into a class as member variables with the GetPrime() function elevated to method status.&lt;br /&gt;&lt;br /&gt;The program begins life by calling GetPrime() for the first time. At this time, the global variable called ‘state’ has a value of zero, so the code enters the while loop and extracts the first prime number from the array and sets the global variable ‘state’ to 2 before returning the prime number from the function. The next call into GetPrime(), we note that ‘state’ has a value of 2, so it will trigger the case that causes the code to jump back into the middle of the while loop (effectively jumping back to the exact position where it left last time had it not returned from the function) with goto getAnotherPrime and so the code loops round to extract the next prime number from the array and returns it to the caller. When the global variable ‘count’ is no longer less that the number of primes in the array, the while loop in GetPrime() will drop out and cause the function to return zero, thus causing the while loop in _tmain() to terminate.&lt;br /&gt;&lt;br /&gt;The naughty part of the code from a C# perspective is the goto label (getAnotherPrime) appearing after a return statement, something the C# compiler considers to be unreachable code (which seems quite reasonable).&lt;br /&gt;&lt;br /&gt;So the secret of the technique is to maintain a state machine in memory of where the code is at in the loop. If ‘state’ is 2, then it means the next call to GetPrime() should re-enter the loop at the place it last left off (that place being just after the return statement). If 'state' is 0, then this is the very first call into the function and iteration is commencing. When 'state' has the value 1, it doesn't stay that way for long since the code will loop back round and soon become 2 again. The assignment of value 1 into 'state' doesn't have much effect other than keeping the compiler happy such that the label actually serves a purpose.&lt;br /&gt;&lt;br /&gt;If you understand the above code then it should now be reasonably trivial for the reader to decompile the following C# program with Reflector and see how it uses this exact same state machine technique in IEnumerator&lt;t&gt;.MoveNext():&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_QWj4aaPgfRI/SVaJdr0Lo3I/AAAAAAAAAMA/H4FqawzcLvk/s1600-h/iterator_code_b.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 281px;" src="http://2.bp.blogspot.com/_QWj4aaPgfRI/SVaJdr0Lo3I/AAAAAAAAAMA/H4FqawzcLvk/s400/iterator_code_b.jpg" alt="" id="BLOGGER_PHOTO_ID_5284562355836658546" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-5287851672389969329?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/5287851672389969329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=5287851672389969329&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/5287851672389969329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/5287851672389969329'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2008/12/understanding-cs-yield-return-statement.html' title='understanding C#&apos;s yield return statement'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_QWj4aaPgfRI/SVaJNpCCiSI/AAAAAAAAAL4/yFkKD89-6Gw/s72-c/iterator_code_a.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-5844001778948117899</id><published>2008-11-02T00:23:00.004+10:00</published><updated>2008-11-02T01:13:10.524+10:00</updated><title type='text'>Cloud Computing</title><content type='html'>I did not attend PDC this year so I'm blogging on the back of having streamed the Ray Ozzie keynote.&lt;br /&gt;&lt;br /&gt;I feel sure I won't be the only person to wonder whether Cloud computing is likely to be a huge success for Microsoft. In theory, it makes a lot of sense, but in practice, I can't help wondering whether this is to a large extent another 'Hailstorm'-esque Microsoft dream. Will companies really be queuing up to have Microsoft data centres host their application code and corporate data? However wonderful the platform may turn out to be, what does it mean to pass responsibility for the safe keeping of your data with a third party like Microsoft?&lt;br /&gt;&lt;br /&gt;Why do we need Cloud computing anyway? What does it do such that we cannot live without it? I mean, if we look at .NET and ask the same question, the answer seems obvious - we could not live without it and thank goodness the COM era came to an end. Anyone who uses a computer in the modern world reaps benefit from the technological innovation of .NET - will the same be true of a Microsoft cloud?&lt;br /&gt;&lt;br /&gt;Well, I guess the cloud could provide unlimited scalability with that kind of horsepower packed into the huge data centre. But I wonder how many companies will actually need that kind of scalability? And doesn't scalability really boil down to writing code that can be scaled in the first place as opposed to taking any old bit of code and throwing more cores at it? I'm thinking of plentyoffish.com when I say this - one smart guy (Markus Frind), 2 databases, one web server and thousands of hits per day with a truly scalable piece of software. I'm pretty sure he doesn't need the cloud and I'm pretty sure he gets more hits than most companies who will sign up for the cloud.&lt;br /&gt;&lt;br /&gt;Failover also has to be a consideration in any scalable application, but do we not already have web server farms and SQL Server clusters that keep the ecosphere of Microsoft applications more than available?&lt;br /&gt;&lt;br /&gt;To a large extent, I think it's going to boil down to price. If Microsoft can host your code and data in their cloud at a significantly reduced cost to your business than you hosting it, then perhaps they're onto a winner. But even if they do manage to make the cloud financially competitive, the question still remains as to whether you trust Microsoft to be the caretakers of your company's greatest assets.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-5844001778948117899?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/5844001778948117899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=5844001778948117899&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/5844001778948117899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/5844001778948117899'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2008/11/cloud-computing.html' title='Cloud Computing'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-3959718189654979880</id><published>2008-05-30T18:50:00.009+10:00</published><updated>2008-05-30T19:01:30.701+10:00</updated><title type='text'>JSONized query strings</title><content type='html'>&lt;span style="font-family:verdana;"&gt;I often have to Response.Redirect to an ASP.NET page that takes a lot of parameters. There are a few ways of doing this. One way might be to invoke the page with a query string that contains the parameters: &lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;Foo.aspx?a=66&amp;amp;b=77 &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;If you think of the query string parameters as bunch of properties on a class then you could easily see how one might author that class to also serialize and deserialize the query string by leveraging StringBuilder.Append or String.Format and String.Split etc etc.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:Verdana;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:Verdana;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;/div&gt;&lt;div&gt;&lt;span style="font-family:Verdana;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:Verdana;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;I’ve been working with Microsoft AJAX recently and I'd used the text based JSON serializer a couple of times and it got me thinking about how I might leverage that to serialize my object properties to and from the query string. [The XmlSerializer might seem like another approach, but ASP.NET really doesn’t like angle brackets (even encoded) sent as data in the query string – it barfs in case you were wondering with a ‘that data looks very suspicious’ type message.] &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;So I decided to give the JSON parser a whirl and it works like a charm. Here’s what my JSON encoded query string looks like: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;Foo.aspx?qps={"A":66,"B":77} &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;Here's the class: &lt;/span&gt;&lt;a href="http://1.bp.blogspot.com/_QWj4aaPgfRI/SD--BO2P9fI/AAAAAAAAAHg/m-plt251fds/s1600-h/theclass.JPG"&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/_QWj4aaPgfRI/SD_AVe2P9iI/AAAAAAAAAH4/i4h5bLl-UDw/s1600-h/theclass.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5206091169553970722" style="CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_QWj4aaPgfRI/SD_AVe2P9iI/AAAAAAAAAH4/i4h5bLl-UDw/s400/theclass.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;Here's the caller: &lt;/span&gt;&lt;a href="http://2.bp.blogspot.com/_QWj4aaPgfRI/SD--Re2P9gI/AAAAAAAAAHo/_TLGLOUOGag/s1600-h/caller.JPG"&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/_QWj4aaPgfRI/SD_Ah-2P9jI/AAAAAAAAAIA/dIVpZiTQ4FQ/s1600-h/caller.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5206091384302335538" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_QWj4aaPgfRI/SD_Ah-2P9jI/AAAAAAAAAIA/dIVpZiTQ4FQ/s400/caller.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;Here's the callee: &lt;/span&gt;&lt;a href="http://2.bp.blogspot.com/_QWj4aaPgfRI/SD--ee2P9hI/AAAAAAAAAHw/aVdzkd3VGoY/s1600-h/callee.JPG"&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://1.bp.blogspot.com/_QWj4aaPgfRI/SD_AnO2P9kI/AAAAAAAAAII/QXFArdiOKQI/s1600-h/callee.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5206091474496648770" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_QWj4aaPgfRI/SD_AnO2P9kI/AAAAAAAAAII/QXFArdiOKQI/s400/callee.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;I *always* wrap the FromJSON call in a try / catch block in case someone tries to send a hacked query string that clearly won’t deserialize. &lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-3959718189654979880?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/3959718189654979880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=3959718189654979880&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/3959718189654979880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/3959718189654979880'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2008/05/jsonized-query-strings.html' title='JSONized query strings'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_QWj4aaPgfRI/SD_AVe2P9iI/AAAAAAAAAH4/i4h5bLl-UDw/s72-c/theclass.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-6276415846224646084</id><published>2008-05-05T07:48:00.015+10:00</published><updated>2008-05-05T09:35:16.395+10:00</updated><title type='text'>Creating 'Expression Blend' ScrollBars in WPF</title><content type='html'>&lt;span style="font-family:verdana;"&gt;The scroll bars in Expression Blend are very nice. Nice enough that I thought I’d spend some time this afternoon figuring out how I could modify the WPF scroll bar control template. Fortunately, it turned out that there really wasn’t that much work involved. Here’s the result:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://3.bp.blogspot.com/_QWj4aaPgfRI/SB5Cn7g3rOI/AAAAAAAAAGk/v6zwGyycmcA/s1600-h/BlendScrollBar.jpg"&gt;&lt;span style="font-family:verdana;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5196664273790020834" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_QWj4aaPgfRI/SB5Cn7g3rOI/AAAAAAAAAGk/v6zwGyycmcA/s400/BlendScrollBar.jpg" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;I started off by grabbing the template from &lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms742173.aspx"&gt;&lt;span style="font-family:verdana;"&gt;MSDN&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;. The scroll bar template consists of a style that brings into play either the VerticalScrollBar template or the HorizontalScrollBar template via the Orientation dependency property as seen: &lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_QWj4aaPgfRI/SB5CaLg3rNI/AAAAAAAAAGc/NjHA1D38U7I/s1600-h/rootTemplate.jpg"&gt;&lt;span style="font-family:verdana;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5196664037566819538" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_QWj4aaPgfRI/SB5CaLg3rNI/AAAAAAAAAGc/NjHA1D38U7I/s400/rootTemplate.jpg" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;The remaining discussion will only focus on the VerticalScrollBar, since the solution is almost exactly the same for HorizontalScrollBar. &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;The RepeatButton defined in the VerticalScrollBar template seen at Grid="0" and again at Grid="2" defines the up arrow and down arrow respectively. I made these a little more elongated to mirror the Blend arrows by changing the content properties as follows: &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;Top arrow: Content="M 0 8 L 8 8 L 4 0 Z" &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;Bottom arrow: Content="M 0 0 L 4 8 L 8 0 Z"&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/_QWj4aaPgfRI/SB5DZrg3rPI/AAAAAAAAAGs/aGtQiXrBIqc/s1600-h/VertTemplate.jpg"&gt;&lt;span style="font-family:verdana;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5196665128488512754" style="CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_QWj4aaPgfRI/SB5DZrg3rPI/AAAAAAAAAGs/aGtQiXrBIqc/s400/VertTemplate.jpg" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;The scroll thumb also needed some attention. The shape of the thumb at both ends is more rounded than the default, so I increased the CornerRadius:&lt;br /&gt;CornerRadius="4"&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;Also, the thumb in blend has no border, so I removed the BorderBrush and set the:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;BorderThickness="0"&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Another difference is that the thumb is highlighted when the mouse is over it and changes colour to black while it is being dragged. Both of these are dependency properties that can be modified to the appropriate values with triggers:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;a href="http://1.bp.blogspot.com/_QWj4aaPgfRI/SB5EBbg3rQI/AAAAAAAAAG0/nHS3U5c_FrU/s1600-h/scrollthumb.jpg"&gt;&lt;span style="font-family:verdana;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5196665811388312834" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_QWj4aaPgfRI/SB5EBbg3rQI/AAAAAAAAAG0/nHS3U5c_FrU/s400/scrollthumb.jpg" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;Notice that I had to give the Border a name ‘roundedBorder’ so that the triggers could reference it.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;ScrollBarLineButton defines the style and template for the repeater button that houses the arrows (which will end up being up or down for vertical scroll bar. And left or right for a horizontal scroll bar). The template for ScrollBarLineButton acquires the visual for the arrow by databinding to the Content property of the template parent – a neat trick that means only one ScrollBarLineButton needs to be defined for the whole template to be able to deal with all four arrows.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;To get the ScrollBarLineButton to look like the blend version, I had to make a few more changes. The arrow is highlighted when the mouse is over it – in much the same way as the thumb. To achieve this, I gave the Path a name ‘glyph’ and then changed the trigger ‘IsMouseOver’ to retarget to ‘glyph’ Fill to the colour: GlyphMouseOver. The IsPressed trigger also needs to mirror the thumb and sets the ‘glyph’ Fill to black. &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/_QWj4aaPgfRI/SB5E8Lg3rRI/AAAAAAAAAG8/vBx-i4eIvYY/s1600-h/scrollbarlinebutton.jpg"&gt;&lt;span style="font-family:verdana;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5196666820705627410" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_QWj4aaPgfRI/SB5E8Lg3rRI/AAAAAAAAAG8/vBx-i4eIvYY/s400/scrollbarlinebutton.jpg" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;Finally, I also had to change some of the brushes defined for the scrollbar. Here are the changed versions: &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;&amp;lt;SolidColorBrush x:Key="GlyphBrush"Color="#FF7E7C7C" /&amp;gt;&lt;br /&gt;&amp;lt;SolidColorBrush x:Key="GlyphMouseOver"Color="#FFE8E8E8"/&amp;gt;&lt;br /&gt;&amp;lt;SolidColorBrush x:Key="PressedBrush" Color="Black"/&amp;gt;&lt;br /&gt;&amp;lt;SolidColorBrush x:Key="NormalBrush"Color="#585858"/&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;solidcolorbrush key="GlyphBrush"&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;&lt;solidcolorbrush color="#FFE8E8E8" key="GlyphMouseOver"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;&lt;solidcolorbrush color="Black" key="PressedBrush"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;&lt;solidcolorbrush color="#FF7E7C7C" key="GlyphBrush"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;&lt;solidcolorbrush color="#FFE8E8E8" key="GlyphMouseOver"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;&lt;solidcolorbrush color="Black" key="PressedBrush"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;&lt;solidcolorbrush color="#585858" key="NormalBrush"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-6276415846224646084?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/6276415846224646084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=6276415846224646084&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/6276415846224646084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/6276415846224646084'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2008/05/creating-expression-blend-scrollbars.html' title='Creating &apos;Expression Blend&apos; ScrollBars in WPF'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_QWj4aaPgfRI/SB5Cn7g3rOI/AAAAAAAAAGk/v6zwGyycmcA/s72-c/BlendScrollBar.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-3238156656528093864</id><published>2008-01-31T04:12:00.000+10:00</published><updated>2008-01-31T06:04:21.509+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><title type='text'>WPF CoverFlow Clone</title><content type='html'>&lt;span style="font-family:verdana;"&gt;I recently decided to spend some time hacking up a CoverFlow clone in WPF. Of course, what I managed to achieve in the space of a day is nowhere near as good as the real CoverFlow application that Apple deploys but that's not the point! The point is, it amazes me how quickly and effortlessly I was able to do it with the power of WPF. It also amazes me how long something similar would have taken in any previous technology like Windows Forms or Win32!&lt;br /&gt;&lt;br /&gt;Here's what the 'final' XBAP version looks like: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://4.bp.blogspot.com/_QWj4aaPgfRI/R6C_oIdVluI/AAAAAAAAAEk/OGglNtfJPdg/s1600-h/coverflowclone.jpg"&gt;&lt;span style="font-family:verdana;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5161335869152794338" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_QWj4aaPgfRI/R6C_oIdVluI/AAAAAAAAAEk/OGglNtfJPdg/s400/coverflowclone.jpg" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;My approach was to almost completely restyle a ListBox. The first step was to redefine the ControlTemplate of ListBoxItem to be a Grid of 1 row and 1 column containing a StackPanel which in turn contained both the ContentPresenter and a Rectangle. The rectangle is there to produce the reflected image of the ContentPresenter.&lt;br /&gt;&lt;br /&gt;Here's the XAML for doing that: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_QWj4aaPgfRI/R6DM0odVl1I/AAAAAAAAAFc/uHKdWVhNYOo/s1600-h/Reflection.jpg"&gt;&lt;span style="font-family:verdana;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5161350377552320338" style="CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_QWj4aaPgfRI/R6DM0odVl1I/AAAAAAAAAFc/uHKdWVhNYOo/s400/Reflection.jpg" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;br /&gt;The VisualBrush used to paint the Rectangle has to be flipped in the Y-axis with a ScaleTransform and then put back into the correct position with the TranslateTransform. The TranslateTransform figures out how much to offset in the Y axis via databinding to the ActualHeight of the ContentPresenter. The OpacityMask applied to the Rectangle ensures that the reflection gradually dissolves away.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;The StackPanel that contains the ContentPresenter and Rectangle (reflected image) looks like this:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://3.bp.blogspot.com/_QWj4aaPgfRI/R6DQF4dVl2I/AAAAAAAAAFk/_4YKQ7DbrfQ/s1600-h/stack.jpg"&gt;&lt;span style="font-family:verdana;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5161353972439947106" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_QWj4aaPgfRI/R6DQF4dVl2I/AAAAAAAAAFk/_4YKQ7DbrfQ/s400/stack.jpg" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;This has a couple of transforms that do nothing until they are animated later; a TranslateTransform and a ScaleTransform. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;When the ListBoxItem is selected, several animations run in parallel, effectively moving the StackPanel down in the Y axis by running the TranslateTransform while at the same time running a ScaleTransform which enlarges it in X and Y. The combined effect of these animations running in parallel is the sensation that the selected ListBoxItem springs forward towards the end user. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;The animations are initiated by EventTrigger's; one each for the routed events: ListBoxItem.Selected and ListBoxItem.Unselected. Here's the XAML for the animations in their respective EventTrigger's&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_QWj4aaPgfRI/R6DURIdVl3I/AAAAAAAAAFs/URAhRHSM958/s1600-h/triggers.jpg"&gt;&lt;span style="font-family:verdana;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5161358563759986546" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_QWj4aaPgfRI/R6DURIdVl3I/AAAAAAAAAFs/URAhRHSM958/s400/triggers.jpg" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;br /&gt;When the ListBoxItem becomes Unselected, the Unselected EventTrigger ensures the StackPanel moves back into it's original position and size prior to being selected - effectively reversing the work done of the Selected EventTrigger.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-3238156656528093864?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/3238156656528093864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=3238156656528093864&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/3238156656528093864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/3238156656528093864'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2008/01/wpf-coverflow-clone.html' title='WPF CoverFlow Clone'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_QWj4aaPgfRI/R6C_oIdVluI/AAAAAAAAAEk/OGglNtfJPdg/s72-c/coverflowclone.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-2960621451998258314</id><published>2007-06-21T13:48:00.001+10:00</published><updated>2007-06-21T13:58:45.408+10:00</updated><title type='text'>Avoid CrpytoStream.Flush()</title><content type='html'>I needed to attend to some code that was violating an FxCop rule earlier. The code snippet looks something like this:&lt;br /&gt;&lt;br /&gt;using (CryptoStream cryptoStream = new CryptoStream(outputStream...))&lt;br /&gt;{&lt;br /&gt;cryptoStream.Write(data, 0, data.Length);&lt;br /&gt;cryptoStream.Close();&lt;br /&gt;encrypted = outputStream.ToArray();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;The FxCop rule being violated is that we are calling Close and yet Dispose will automatically be called because we are in the context of a using construct.&lt;br /&gt;&lt;br /&gt;So I figured I'd just call Flush() instead of Close() - so it would look like this:&lt;br /&gt;&lt;br /&gt;using (CryptoStream cryptoStream = new CryptoStream(outputStream...))&lt;br /&gt;{&lt;br /&gt;cryptoStream.Write(data, 0, data.Length);&lt;br /&gt;cryptoStream.Flush();&lt;br /&gt;encrypted = outputStream.ToArray();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;That turned out to be bad karma and barfed during unit testing with:&lt;br /&gt;System.Security.Cryptography.CryptographicException : Padding is invalid and cannot be removed&lt;br /&gt;&lt;br /&gt;I had a look at CrytoStream.Flush() with Reflector and it looks like this:&lt;br /&gt;&lt;br /&gt;public override void Flush()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Hmmmm not much going on there seeing as the documentation says - &lt;br /&gt;"Clears all buffers for this stream and causes any buffered data to be written to the underlying device"&lt;br /&gt;&lt;br /&gt;So I checked out the CryptoStream.Dispose() and that makes a call to CryptoStream.FlushFinalBlock() prior to calling CryptoStream.Close(). So I have replaced our call to Flush() with FlushFinalBlock()...makes me wonder whether Flush() was an intentional override that does absolutely nothing whatsoever other than inhibit base class behavior....?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-2960621451998258314?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/2960621451998258314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=2960621451998258314&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/2960621451998258314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/2960621451998258314'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2007/06/crpytostreamflush.html' title='Avoid CrpytoStream.Flush()'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-7635797981043318662</id><published>2007-06-02T21:15:00.000+10:00</published><updated>2007-06-02T21:37:23.390+10:00</updated><title type='text'>Vista graphics card driver joys...</title><content type='html'>My primary machine is a DELL D820 and I'm running Vista RTM. I was thinking that not only the graphics seemed a bit sluggish but also Vista Performance tool (just go Start-&gt;Performance Information &amp; Tools) reported my Graphics rating as 2.3 out of 5.9 which aint so good. I checked out the installed driver and saw that it was a Microsoft generic driver so I surfed to the DELL website and had a quick look to see if there was a better driver. Sure enough, I found the Nvidia driver and installed it. After rebooting, I asked Performance Information &amp; Tools to update my score and it then came in at 3.6 and the UI is really, really zippy compared to what it was. &lt;br /&gt;&lt;br /&gt;So if you're running Vista and you're using the generic display driver, go find the non generic one and enjoy Vista even more :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-7635797981043318662?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/7635797981043318662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=7635797981043318662&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/7635797981043318662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/7635797981043318662'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2007/06/vista-graphics-card-driver-joys.html' title='Vista graphics card driver joys...'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-4768627268990667070</id><published>2007-05-31T17:25:00.000+10:00</published><updated>2007-06-21T13:24:52.928+10:00</updated><title type='text'>Debugging hints &amp; tips</title><content type='html'>I've been doing a lot of spelunking with WinDBG recently. There's a lot to know and the documentation can fall short sometimes. &lt;a href="http://blogs.msdn.com/tess/"&gt;Tess's blog&lt;/a&gt; usually has enough entries that you can usually figure things out by looking at her examples and scenarios. I always find myself referring back to her blog and a bunch of other blogs which I referred to in a &lt;a hef="http://steverodgers.blogspot.com/2006_06_01_archive.html#115154677920973353"&gt;previous blog entry&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Primarily, I'm posting this entry as a future helper for myself. Invariably, I draw the information I need from more than one source so I am effectively collating as much of that that useful information here in one place. If that helps anyone else out along the way, then more power to the blog!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Need to get yourself set up for a WinDBG debug session? Here's what you need to do:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1) Create a directory C:\MyLocalSymbols&lt;br /&gt;&lt;br /&gt;2) Install symbols for your operating system to C:\MyLocalSymbols - get symbols from: &lt;a href="http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3) Install Windows Debugging Tools - get it from: &lt;a href="http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4) Set up _NT_SYMBOL_PATH (choose properties on My Computer-&gt;Advanced-&gt;Environment Variables-&gt;New) to SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols&lt;br /&gt;This will save you from having to set the path up in WinDBG and will do it globally for the operating system&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How do I load the CLR debug extension SOS.DLL into WinDBG?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1) Type the following command: &lt;br /&gt;.loadby sos mscorwks&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What is the WinDBG command to get a list of CLR instances of a given type, e.g. System.AppDomain?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1) !dumpheap -type System.AppDomain&lt;br /&gt;&lt;br /&gt;e.g. &lt;br /&gt;0:009&gt; !dumpheap -type System.AppDomain&lt;br /&gt; Address       MT     Size&lt;br /&gt;012611b4 790fb998      100     &lt;br /&gt;01261218 790fbdcc       40     &lt;br /&gt;012688c8 790fb998      100     &lt;br /&gt;0126bd28 790fbdcc       40&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What is the WinDBG command to see the fields of an object?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1) Find the object you are interested and use !do addressgoeshere - (use the previous item as a starting point if you don't currently have an object address!)&lt;br /&gt;&lt;br /&gt;In this example we are dumping an AppDomain instance found in the previous example - notice we are using the address column not the MT column!&lt;br /&gt;0:009&gt; !do 012611b4&lt;br /&gt;Name: System.AppDomain&lt;br /&gt;MethodTable: 790fb998&lt;br /&gt;EEClass: 790c3608&lt;br /&gt;Size: 100(0x64) bytes&lt;br /&gt; (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)&lt;br /&gt;Fields:&lt;br /&gt;      MT    Field   Offset                 Type VT     Attr    Value Name&lt;br /&gt;790f9ce8  4000184        4        System.Object  0 instance 01284ed8 __identity&lt;br /&gt;7910f540  4000185        8 ....AppDomainManager  0 instance 00000000 _domainManager&lt;br /&gt;790feb44  4000186        c ...ections.Hashtable  0 instance 00000000 _LocalStore&lt;br /&gt;790fbdcc  4000187       10 ...em.AppDomainSetup  0 instance 01261218 _FusionStore&lt;br /&gt;791094f0  4000188       14 ...y.Policy.Evidence  0 instance 00000000 _SecurityIdentity&lt;br /&gt;79124318  4000189       18      System.Object[]  0 instance 00000000 _Policies&lt;br /&gt;7911d470  400018a       1c ...yLoadEventHandler  0 instance 00000000 AssemblyLoad&lt;br /&gt;79116ffc  400018b       20 ...solveEventHandler  0 instance 00000000 TypeResolve&lt;br /&gt;79116ffc  400018c       24 ...solveEventHandler  0 instance 00000000 ResourceResolve&lt;br /&gt;79116ffc  400018d       28 ...solveEventHandler  0 instance 00000000 AssemblyResolve&lt;br /&gt;79116ffc  400018e       2c ...solveEventHandler  0 instance 00000000 ReflectionOnlyAssemblyResolve&lt;br /&gt;791034f8  400018f       30 ....Contexts.Context  0 instance 012687c4 _DefaultContext&lt;br /&gt;7911db24  4000190       34 ...ActivationContext  0 instance 00000000 _activationContext&lt;br /&gt;7911dc44  4000191       38 ...plicationIdentity  0 instance 00000000 _applicationIdentity&lt;br /&gt;7911dd20  4000192       3c ....ApplicationTrust  0 instance 00000000 _applicationTrust&lt;br /&gt;79118234  4000193       40 ...ncipal.IPrincipal  0 instance 00000000 _DefaultPrincipal&lt;br /&gt;79103b10  4000194       44 ...cificRemotingData  0 instance 01268688 _RemotingData&lt;br /&gt;7910d6f8  4000195       48  System.EventHandler  0 instance 00000000 _processExit&lt;br /&gt;7910d6f8  4000196       4c  System.EventHandler  0 instance 00000000 _domainUnload&lt;br /&gt;7911d508  4000197       50 ...ptionEventHandler  0 instance 0129d118 _unhandledException&lt;br /&gt;790fe234  4000198       54        System.IntPtr  0 instance  1345952 _dummyField&lt;br /&gt;7911d974  4000199       58         System.Int32  0 instance        0 _PrincipalPolicy&lt;br /&gt;79105040  400019a       5c       System.Boolean  0 instance        0 _HasSetPolicy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Need to drill down into a field of an object you just dumped?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1) We want to dump the field called _FusionStore of the AppDomain object we just dumped&lt;br /&gt;&lt;br /&gt;2) Use the 'Value' column from the previous !do command for the field called _FusionStore&lt;br /&gt;e.g.&lt;br /&gt;0:009&gt; !do 01261218&lt;br /&gt;Name: System.AppDomainSetup&lt;br /&gt;MethodTable: 790fbdcc&lt;br /&gt;EEClass: 790fbcfc&lt;br /&gt;Size: 40(0x28) bytes&lt;br /&gt; (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)&lt;br /&gt;Fields:&lt;br /&gt;      MT    Field   Offset                 Type VT     Attr    Value Name&lt;br /&gt;79124318  40001a3        4      System.Object[]  0 instance 01261240 _Entries&lt;br /&gt;79100ed0  40001a4       20         System.Int32  0 instance        0 _LoaderOptimization&lt;br /&gt;790fa4b0  40001a5        8        System.String  0 instance 00000000 _AppBase&lt;br /&gt;7915cb08  40001a6        c ...DomainInitializer  0 instance 00000000 _AppDomainInitializer&lt;br /&gt;79124318  40001a7       10      System.Object[]  0 instance 00000000 _AppDomainInitializerArguments&lt;br /&gt;7915ce5c  40001a8       14 ...tivationArguments  0 instance 00000000 _ActivationArguments&lt;br /&gt;790fa4b0  40001a9       18        System.String  0 instance 00000000 _ApplicationTrust&lt;br /&gt;79124508  40001aa       1c        System.Byte[]  0 instance 00000000 _ConfigurationBytes&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How do I dump an array?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1) Notice the array in the previous item called _Entries? Use !da addressofobject&lt;br /&gt;&lt;br /&gt;In this example we want to dump the field '_Entries':&lt;br /&gt;&lt;br /&gt;e.g.&lt;br /&gt;0:009&gt; !da 01261240&lt;br /&gt;Name: System.String[]&lt;br /&gt;MethodTable: 79124318&lt;br /&gt;EEClass: 7912488c&lt;br /&gt;Size: 80(0x50) bytes&lt;br /&gt;Array: Rank 1, Number of elements 16, Type CLASS&lt;br /&gt;Element Methodtable: 790fa4b0&lt;br /&gt;[0] 01261530&lt;br /&gt;[1] 01261290&lt;br /&gt;[2] null&lt;br /&gt;[3] null&lt;br /&gt;[4] 012612e4&lt;br /&gt;[5] null&lt;br /&gt;[6] null&lt;br /&gt;[7] null&lt;br /&gt;[8] null&lt;br /&gt;[9] null&lt;br /&gt;[10] null&lt;br /&gt;[11] null&lt;br /&gt;[12] null&lt;br /&gt;[13] null&lt;br /&gt;[14] null&lt;br /&gt;[15] null&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What is the WinDBG command to find the current managed exception?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1) !pe&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What is the WinDBG command to find the current unmanaged exception?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1) .exr -1&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Application seems to generate a lot of exceptions but only one is of concern to you?&lt;/b&gt;&lt;br /&gt;You need to product a dump of the program that you can then debug with WinDBG. You'll need to launch the application and then attach the debugger. In a program I was debugging earlier, I was interested in System.NullReferenceException. &lt;br /&gt;&lt;br /&gt;1) Create a directory on your hard disk called C:\Dumps&lt;br /&gt;&lt;br /&gt;2) Create the following file called trackclr.cfg in the same directory as windbg.EXE (on my machine that was "C:\Program Files\Debugging Tools For Windows"):&lt;br /&gt;&amp;lt;ADPlus&amp;gt;&lt;br /&gt;  &amp;lt;Settings&amp;gt;&lt;br /&gt;    &amp;lt;RunMode&amp;gt;CRASH&amp;lt;/RunMode&amp;gt;&lt;br /&gt;    &amp;lt;Option&amp;gt;Quiet&amp;lt;/Option&amp;gt;&lt;br /&gt;  &amp;lt;/Settings&amp;gt;&lt;br /&gt;  &amp;lt;Exceptions&amp;gt;&lt;br /&gt;    &amp;lt;Option&amp;gt;NoDumpOnFirstChance&amp;lt;/Option&amp;gt;&lt;br /&gt;    &amp;lt;Config&amp;gt;&lt;br /&gt;      &amp;lt;Code&amp;gt;clr&amp;lt;/Code&amp;gt;&lt;br /&gt;      &amp;lt;Actions1&gt;Void&amp;lt;/Actions1&amp;gt;&lt;br /&gt;      &amp;lt;CustomActions1&amp;gt;&lt;br /&gt;    .loadby sos mscorwks;    &lt;br /&gt;    !stoponexception System.NullReferenceException 4;&lt;br /&gt;    .if(@$t4==1)&lt;br /&gt;    {&lt;br /&gt;        .dump /ma /u c:\\Dumps\\NullRef.dmp&lt;br /&gt;    }    &lt;br /&gt;    &amp;lt;/CustomActions1&amp;gt;&lt;br /&gt;      &amp;lt;ReturnAction1&amp;gt;gn&amp;lt;/ReturnAction1&amp;gt;&lt;br /&gt;    &amp;lt;/Config&amp;gt;&lt;br /&gt;  &amp;lt;/Exceptions&amp;gt; &lt;br /&gt;&amp;lt;/ADPlus&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3) Run the target program (the one you want to debug)&lt;br /&gt;&lt;br /&gt;4) Attach the debugger via the following command line:&lt;br /&gt;adplus -c trackclr.cfg&lt;br /&gt;&lt;br /&gt;5) Crash dump will appear in C:\Dumps&lt;br /&gt;&lt;br /&gt;6) Get some very useful information from the dump via the following command: !analyze -v&lt;br /&gt;&lt;br /&gt;7) From the previous command (!analyze -v), grab the IP address e.g. FAULTING_IP: +957984d and then do a !U addressgoeshere e.g. !U 957984d&lt;br /&gt;This will show you which method and the JIT'd instructions - keep an eye out for the IP itself which is highlighted by WinDBG with chevrons: &gt;&gt;&gt; e.g.&lt;br /&gt;&gt;&gt;&gt; 0957984d 8b01            mov     eax,dword ptr [ecx]&lt;br /&gt;&lt;br /&gt;If you're getting a NullReferenceException and it's on an assembly instruction as seen in the example, then examine the machine registers with the command: r&lt;br /&gt;e.g.&lt;br /&gt;0:009&gt; r&lt;br /&gt;eax=01e05ac4 ebx=00000000 ecx=00000000 edx=00000096 esi=01e05ad0 edi=01dfd144&lt;br /&gt;eip=0957984d esp=07dbd718 ebp=00000096 iopl=0         nv up ei ng nz ac pe cy&lt;br /&gt;cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010297&lt;br /&gt;0957984d 8b01            mov     eax,dword ptr [ecx]  ds:0023:00000000=????????&lt;br /&gt;&lt;br /&gt;In this example, ecx contains all zeros and yet the machine instruction mov     eax,dword ptr [ecx] is trying to dereference the zeros in ecx and assign that to eax - hence an AccessViolation which the CLR will translate to a NullReferenceException&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;You think there is an object of a certain type that is being accessed by more than one thread but can't be sure?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1) Produce a crash dump or debug live in WinDBG&lt;br /&gt;&lt;br /&gt;2) Get a list of objects of that type [see above on how to do that]&lt;br /&gt;&lt;br /&gt;3) Pick on one of the objects and see which threads have a reference to it with !gcroot&lt;br /&gt;&lt;br /&gt;This example finds all the threads that have a reference to the AppDomain instance whose address we dumped earlier:&lt;br /&gt;&lt;br /&gt;e.g.&lt;br /&gt;0:009&gt; !gcroot 012611b4&lt;br /&gt;Note: Roots found on stacks may be false positives. Run "!help gcroot" for&lt;br /&gt;more info.&lt;br /&gt;Scan Thread 0 OSTHread 10a8&lt;br /&gt;ESP:12f010:Root:012687c4(System.Runtime.Remoting.Contexts.Context)-&gt;&lt;br /&gt;012611b4(System.AppDomain)&lt;br /&gt;ESP:12f318:Root:0129cf3c(NUnit.ConsoleRunner.ConsoleUi+EventCollector)-&gt;&lt;br /&gt;0129d6b0(System.Runtime.Remoting.ServerIdentity)-&gt;&lt;br /&gt;012687c4(System.Runtime.Remoting.Contexts.Context)&lt;br /&gt;ESP:12f328:Root:01267e48(NUnit.Util.TestDomain)-&gt;&lt;br /&gt;0129cf3c(NUnit.ConsoleRunner.ConsoleUi+EventCollector)-&gt;&lt;br /&gt;0129d6b0(System.Runtime.Remoting.ServerIdentity)&lt;br /&gt;ESP:12f32c:Root:0129cf3c(NUnit.ConsoleRunner.ConsoleUi+EventCollector)-&gt;&lt;br /&gt;012611b4(System.AppDomain)&lt;br /&gt;ESP:12f364:Root:0129d138(NUnit.Util.TestExceptionHandler)-&gt;&lt;br /&gt;0129d118(System.UnhandledExceptionEventHandler)-&gt;&lt;br /&gt;01267e48(NUnit.Util.TestDomain)-&gt;&lt;br /&gt;0129cf3c(NUnit.ConsoleRunner.ConsoleUi+EventCollector)&lt;br /&gt;ESP:12f36c:Root:0129cf3c(NUnit.ConsoleRunner.ConsoleUi+EventCollector)-&gt;&lt;br /&gt;012611b4(System.AppDomain)&lt;br /&gt;ESP:12f370:Root:01267e48(NUnit.Util.TestDomain)-&gt;&lt;br /&gt;012611b4(System.AppDomain)&lt;br /&gt;ESP:12f38c:Root:01267e48(NUnit.Util.TestDomain)-&gt;&lt;br /&gt;012611b4(System.AppDomain)&lt;br /&gt;ESP:12f394:Root:0129cf3c(NUnit.ConsoleRunner.ConsoleUi+EventCollector)-&gt;&lt;br /&gt;012611b4(System.AppDomain)&lt;br /&gt;ESP:12f3d8:Root:0129cf3c(NUnit.ConsoleRunner.ConsoleUi+EventCollector)-&gt;&lt;br /&gt;012611b4(System.AppDomain)&lt;br /&gt;ESP:12f3e0:Root:01267e48(NUnit.Util.TestDomain)-&gt;&lt;br /&gt;012611b4(System.AppDomain)&lt;br /&gt;ESP:12f3e4:Root:01267e48(NUnit.Util.TestDomain)-&gt;&lt;br /&gt;012611b4(System.AppDomain)&lt;br /&gt;Scan Thread 2 OSTHread a74&lt;br /&gt;Scan Thread 4 OSTHread 938&lt;br /&gt;Scan Thread 5 OSTHread 10d0&lt;br /&gt;Scan Thread 8 OSTHread 258&lt;br /&gt;Scan Thread 9 OSTHread ca8&lt;br /&gt;Scan Thread 11 OSTHread 7f4&lt;br /&gt;Scan Thread 14 OSTHread 16a8&lt;br /&gt;Scan Thread 18 OSTHread 31c&lt;br /&gt;Scan Thread 19 OSTHread b84&lt;br /&gt;Scan Thread 20 OSTHread a18&lt;br /&gt;Scan Thread 21 OSTHread 86c&lt;br /&gt;Scan Thread 22 OSTHread 10c0&lt;br /&gt;Scan Thread 23 OSTHread 11c4&lt;br /&gt;Scan Thread 24 OSTHread 1348&lt;br /&gt;Scan Thread 25 OSTHread 3e4&lt;br /&gt;Scan Thread 26 OSTHread de8&lt;br /&gt;DOMAIN(001489A0):HANDLE(WeakLn):8e10fc:Root:012687c4(System.Runtime.Remoting.Contexts.Context)-&gt;&lt;br /&gt;012611b4(System.AppDomain)&lt;br /&gt;DOMAIN(001489A0):HANDLE(Strong):8e1140:Root:012f59e8(System.Threading.Thread)-&gt;&lt;br /&gt;012687c4(System.Runtime.Remoting.Contexts.Context)&lt;br /&gt;DOMAIN(001489A0):HANDLE(Strong):8e1150:Root:0129d6b0(System.Runtime.Remoting.ServerIdentity)-&gt;&lt;br /&gt;012687c4(System.Runtime.Remoting.Contexts.Context)&lt;br /&gt;DOMAIN(001489A0):HANDLE(Strong):8e1154:Root:01284ed8(System.Runtime.Remoting.ServerIdentity)-&gt;&lt;br /&gt;012611b4(System.AppDomain)&lt;br /&gt;DOMAIN(001489A0):HANDLE(Strong):8e11fc:Root:012611b4(System.AppDomain)-&gt;&lt;br /&gt;012611b4(System.AppDomain)&lt;br /&gt;DOMAIN(001489A0):HANDLE(WeakSh):8e12d0:Root:012f59e8(System.Threading.Thread)-&gt;&lt;br /&gt;012611b4(System.AppDomain)&lt;br /&gt;DOMAIN(001489A0):HANDLE(Pinned):8e13fc:Root:02261010(System.Object[])-&gt;&lt;br /&gt;012687c4(System.Runtime.Remoting.Contexts.Context)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Want to find out which threads are running in your application?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1) !threads&lt;br /&gt;&lt;br /&gt;e.g.&lt;br /&gt;0:009&gt; !threads&lt;br /&gt;ThreadCount: 17&lt;br /&gt;UnstartedThread: 0&lt;br /&gt;BackgroundThread: 15&lt;br /&gt;PendingThread: 0&lt;br /&gt;DeadThread: 0&lt;br /&gt;Hosted Runtime: no&lt;br /&gt;                                      PreEmptive   GC Alloc           Lock&lt;br /&gt;       ID OSID ThreadOBJ    State     GC       Context       Domain   Count APT Exception&lt;br /&gt;   0    1 10a8 00150b50   2006020 Enabled  00000000:00000000 00198f90     0 STA&lt;br /&gt;   2    2  a74 0015d290      b220 Enabled  00000000:00000000 001489a0     0 MTA (Finalizer)&lt;br /&gt;   4    3  938 0018d488      1220 Enabled  00000000:00000000 001489a0     0 Ukn&lt;br /&gt;   5    4 10d0 001ab710    80a220 Enabled  00000000:00000000 001489a0     0 MTA (Threadpool Completion Port)&lt;br /&gt;   8    5  258 06fa3c90   200b020 Enabled  00000000:00000000 00198f90     0 MTA&lt;br /&gt;   9    6  ca8 06fa48f8      7220 Disabled 00000000:00000000 00198f90     0 STA&lt;br /&gt;  11    7  7f4 06fdce90      b220 Enabled  00000000:00000000 00198f90     0 MTA&lt;br /&gt;  14    8 16a8 001bbcc0   180b220 Enabled  00000000:00000000 001489a0     0 MTA (Threadpool Worker)&lt;br /&gt;  18    9  31c 07029e80   200b220 Enabled  00000000:00000000 00198f90     0 MTA&lt;br /&gt;  19    a  b84 0a885508   200b220 Enabled  00000000:00000000 00198f90     0 MTA&lt;br /&gt;  20    b  a18 0a8b0208   200b220 Enabled  00000000:00000000 00198f90     0 MTA&lt;br /&gt;  21    c  86c 0a8b4160   200b220 Enabled  00000000:00000000 00198f90     0 MTA&lt;br /&gt;  22    d 10c0 0a8b49e8   200b220 Enabled  00000000:00000000 00198f90     0 MTA&lt;br /&gt;  23    e 11c4 0a8b5080   200b220 Enabled  00000000:00000000 00198f90     0 MTA&lt;br /&gt;  24    f 1348 0a8b6b40   200b220 Enabled  00000000:00000000 00198f90     0 MTA&lt;br /&gt;  25   10  3e4 0a8ba158   200b220 Enabled  00000000:00000000 00198f90     0 MTA&lt;br /&gt;  26   11  de8 0a8d0a58   200b220 Enabled  00000000:00000000 00198f90     0 MTA&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Want to see the managed stack of a particular thread?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;First you need to context switch to the thread of interest in WinDBG, then dump its stack&lt;br /&gt;&lt;br /&gt;1) Context switch to a thread with this command: ~threadnumber s&lt;br /&gt;e.g. from previous !threads call, pick a thread ID from the far left column from the !threads command output&lt;br /&gt;~20 s&lt;br /&gt;&lt;br /&gt;2) Dump the managed call stack for the thread currently switched in:&lt;br /&gt;!clrstack&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Want to see parameters and autos as part of the stack dump?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1) Use !clrstack -a&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Application is hung and you want to get a crash dump?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1) adplus -hang -pn foo.exe&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-4768627268990667070?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/4768627268990667070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=4768627268990667070&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/4768627268990667070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/4768627268990667070'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2007/05/debugging-hints-tips.html' title='Debugging hints &amp; tips'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-1497989373919392121</id><published>2007-04-12T00:13:00.000+10:00</published><updated>2007-06-27T09:58:46.627+10:00</updated><title type='text'>Web 2.0 and other musings</title><content type='html'>I can't recall where I was or how I heard of the term Web 2.0 - It wasn't that long ago...within the last 6 months for sure. When I first heard it, I wondered what it could be and headed to the usual &lt;a href="http://en.wikipedia.org/wiki/Web_2"&gt;haunt&lt;/a&gt; for an explanation. It all felt a bit wooley to be honest. I then saw an important reference to the &lt;a href="http://www.oreilly.com/pub/a/oreilly/tim/news/2005/09/30/what-is-web-20.html"&gt;source&lt;/a&gt; of the term....that certainly didn't help...The first port of call in my opinion is much better....&lt;br /&gt;&lt;br /&gt;I was having a chat on Messenger with my good friend (and previous business partner) &lt;a href="http://blogs.advantaje.com/blog/kevin/"&gt;Kevin Jones&lt;/a&gt; this evening about what Web 2.0 actually is. We both agreed immediately that it is a Web App that behaves as if it were a thick client app...an &lt;a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29"&gt;Ajax&lt;/a&gt; app for sure. None of this long page load malarky...highly responsive...just like every google app...just like a thick client app.&lt;br /&gt;&lt;br /&gt;What else? I think that Google dumping web services as the programmable interface to their business is a sign. I'm starting to wonder whether web services are going to be important in the long term with Ajax and JSON lurking in the background. I think web services are a master stroke for linking together systems that otherwise couldn't talk to one another - but supposing everything starts to converge on Web 2.0? The industry will never give up on the web as the most important platform - it will only get better...The web already is the one platform.&lt;br /&gt;&lt;br /&gt;I also started thinking about ASP.NET AJAX. I have not programmed it yet but it's an add on to ASP.NET. In other words, Web 2.0 as a metaphor for Web apps was not in the minds of the ASP.NET architects at Redmond when they set about designing the replacement technology for ASP. This started me thinking about Ruby On Rails...this is more recent than ASP.NET so maybe this has an architecture designed with Web 2.0 as it's central metaphor? I have no idea yet as I haven't had a chance to look at it, but I will be doing so shortly!&lt;br /&gt;&lt;br /&gt;Everything is heading towards being free to the end user on the web. I'm fairly certain I read that in a &lt;a href="http://www.paulgraham.com"&gt;Paul Graham&lt;/a&gt; essay but don't ask me which one!! This feels right to me. I never pay for something on the web if I can find a way to get it for free with a little bit of extra googling. This is important. I think it's a sign and I certainly hadn't been thinking about it until I read that. &lt;br /&gt;&lt;br /&gt;That train of thought started me thinking about open source software - PHP, MySQL, Ruby on Rails, Mono..etc...no matter how hard Redmond tries to run away with technology, these guys follow with free software / software tools...I was reading &lt;a href="http://en.wikipedia.org/wiki/AdWords"&gt;today&lt;/a&gt; that Adsense is built with MySQL as it's backend DB. &lt;br /&gt;&lt;br /&gt;There are so many sites out there on Apache (free), running PHP (free) connecting to MySQL (free) that it's hard to ignore it. The end user's apparent running costs must be lower - I'm assuming that the software dev team are good and know their stuff. Why wouldn't you use it? Clearly, it scales!&lt;br /&gt;&lt;br /&gt;I don't really have any conclusions to draw from these musings but I am getting a very strong sense of which way the wind is blowing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-1497989373919392121?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/1497989373919392121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=1497989373919392121&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/1497989373919392121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/1497989373919392121'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2007/04/web-20-and-other-musings.html' title='Web 2.0 and other musings'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-4746989402019920398</id><published>2007-03-28T16:35:00.000+10:00</published><updated>2007-03-28T16:47:43.983+10:00</updated><title type='text'>Being compared to when you didn't expect it</title><content type='html'>I've been doing a lot of migration work on a .NET v1.1 code base to .NET 2.0 recently. I just ran into a (gnarly) documented change in the implementation of ArrayList.Contains(object item) that was causing a unit test to fail....here's the relevant extract from the remarks section towards the end of the document [1] (http://msdn2.microsoft.com/en-us/library/system.collections.arraylist.contains.aspx)&lt;br /&gt;&lt;br /&gt;In our case we were passing in items that had overidden Object.Equals. Since this method is now invoked by ArrayList.Contains() in .NET v2.0 but was not previously in .NET v1.1, our implementation of Object.Equals was incorrect for this scenario.&lt;br /&gt;&lt;br /&gt;[1] &lt;br /&gt;"Starting with the .NET Framework 2.0, this method uses the collection’s objects’ Equals and CompareTo methods on item to determine whether item exists. In the earlier versions of the .NET Framework, this determination was made by using the Equals and CompareTo methods of the item parameter on the objects in the collection"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-4746989402019920398?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/4746989402019920398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=4746989402019920398&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/4746989402019920398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/4746989402019920398'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2007/03/being-compared-to-when-you-didnt-expect.html' title='Being compared to when you didn&apos;t expect it'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-208479968736779560</id><published>2007-02-20T18:40:00.000+10:00</published><updated>2007-02-20T18:48:46.685+10:00</updated><title type='text'>The Wingsuit</title><content type='html'>The race is on to develop a wingsuit that allows the wearer to do away with a parachute entirely...according to &lt;a href="http://www.saab.com.sg/main/GLOBAL/en/salomon_soul_flyers.php"&gt;this&lt;/a&gt; article, the wingsuit increases the horizontal component from normal freefall rate of 0.5m to wingsuit wearer 3.0m per 1.0m decent&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=tqW6O_dcF2M"&gt;Truly Amazing I&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=xYrId4WlR4Q"&gt;Truly Amazing II&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-208479968736779560?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/208479968736779560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=208479968736779560&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/208479968736779560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/208479968736779560'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2007/02/wingsuit.html' title='The Wingsuit'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-1997280657873355525</id><published>2007-01-04T12:00:00.000+10:00</published><updated>2007-01-04T12:07:20.201+10:00</updated><title type='text'>Debugging Internet Explorer hosted Windows Forms Controls</title><content type='html'>Our product for historical reasons has some .NET v1.1 Windows Forms user controls embedded in ASP.NET pages.&lt;br /&gt;&lt;br /&gt;Running these pages on a machine that has .NET v2.0 installed causes things to not work. Basically the unmanaged host iexplore.exe has to pick a version of the CLR to load when it is about to load the controls and it will pick the latest and greatest v2.0 in our case. This of course, is not what we want. It is possible to constrain the options by having an iexplore.exe.config that specifies the versions it is allowed to choose from. In our case, the config file looks like this:&lt;br /&gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;   &amp;lt;startup&amp;gt;&lt;br /&gt;      &amp;lt;supportedRuntime version="v1.1.4322"/&amp;gt;&lt;br /&gt;   &amp;lt;/startup&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&lt;br /&gt;A useful tip in debugging Windows Forms controls embedded in this way is to activate &lt;a href="http://support.microsoft.com/kb/313892"&gt;IEHost logging&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-1997280657873355525?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/1997280657873355525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=1997280657873355525&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/1997280657873355525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/1997280657873355525'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2007/01/debugging-internet-explorer-hosted.html' title='Debugging Internet Explorer hosted Windows Forms Controls'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-4836021505241455410</id><published>2006-11-22T11:17:00.000+10:00</published><updated>2006-11-22T11:20:14.580+10:00</updated><title type='text'>Compilation Error: ‘The key container name ‘Blah’ does not exist’</title><content type='html'>I just spent a couple of hours solving this one – when your AssemblyInfo.cs file references a key container (e.g. [assembly: AssemblyKeyName("Blah")]) that doesn’t exist or it doesn’t have sufficient access permissions you’ll get this error.&lt;br /&gt;&lt;br /&gt;Fixing this problem used to involve going to the registry entry: HKLM\Software\Microsoft\Cryptography\MachineKeys and setting the permissions to give yourself access to all the keys in the key store – (well you are logged in as Admin after all ;)&lt;br /&gt;&lt;br /&gt;The key store has moved from the registry to the file system with Windows 2000 apparently – It’d been a while since I’d been in there as you can tell. You want to go to:&lt;br /&gt;C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys&lt;br /&gt;&lt;br /&gt;...and change the DACL to give yourself permissions.&lt;br /&gt;&lt;br /&gt;In my case, the key container was effectively an orphan – the account that created it must have been deleted and so I had to take ownership of the orphaned file (as admin) and set the DACL up to give myself permissions&lt;br /&gt;&lt;br /&gt;As a test for the future I decided to try to access that directory from my Vista box. As I surfed to my Vista ‘C:\Documents and Settings’ folder I was prompted for elevation – I accepted the elevation but the DACL killed the elevation according to the UI – So I checked out the security for the folder and I was marked as having ‘Full Control’ – geez – I hope I don’t ever see this compilation error when I move over to Vista&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-4836021505241455410?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/4836021505241455410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=4836021505241455410&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/4836021505241455410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/4836021505241455410'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/11/compilation-error-key-container-name.html' title='Compilation Error: ‘The key container name ‘Blah’ does not exist’'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-2831811947951238847</id><published>2006-11-17T23:14:00.000+10:00</published><updated>2006-11-17T23:17:39.963+10:00</updated><title type='text'>the death of fastfood as we know it</title><content type='html'>I have been thinking for a long while now that fast food will one day become what smoking has now become - a thing that is discouraged and not allowed in public places. When I read &lt;a href="http://news.bbc.co.uk/1/hi/health/6154600.stm"&gt;this&lt;/a&gt; article on the BBC news website, I had to smile.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-2831811947951238847?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/2831811947951238847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=2831811947951238847&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/2831811947951238847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/2831811947951238847'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/11/death-of-fastfood-as-we-know-it.html' title='the death of fastfood as we know it'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-8406579148558654210</id><published>2006-09-25T16:34:00.000+10:00</published><updated>2006-09-25T16:37:52.608+10:00</updated><title type='text'>Chris Brumme blogs again...</title><content type='html'>&lt;a href="http://blogs.msdn.com/cbrumme"&gt;Chris Brumme&lt;/a&gt; has posted to his blog after a 2 year hiatus...I wonder if he'll start blogging on a more frequent basis from now on?...one can only hope so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-8406579148558654210?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/8406579148558654210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=8406579148558654210&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/8406579148558654210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/8406579148558654210'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/09/chris-brumme-blogs-again.html' title='Chris Brumme blogs again...'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-8369278183303015045</id><published>2006-09-19T08:49:00.000+10:00</published><updated>2006-09-19T08:50:52.576+10:00</updated><title type='text'>Sticky silicon</title><content type='html'>From the BBC News website:&lt;a href="http://news.bbc.co.uk/2/hi/technology/5356636.stm"&gt;Sticky silicon&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-8369278183303015045?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/8369278183303015045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=8369278183303015045&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/8369278183303015045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/8369278183303015045'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/09/sticky-silicon.html' title='Sticky silicon'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-115560722851245238</id><published>2006-08-15T11:49:00.000+10:00</published><updated>2007-07-17T23:19:37.356+10:00</updated><title type='text'>SQL Server 2005 PIVOT woes</title><content type='html'>I spent a morning playing with the new SQL Server 2005 PIVOT command in T-SQL.&lt;br /&gt;&lt;br /&gt;I created a new database that has 2 columns: ID(int), Field(nvarchar(50), DataValue(nvarchar(50))&lt;br /&gt;&lt;br /&gt;I put some data in:&lt;br /&gt;insert into SomeData values('Shift', 'Day Shift')&lt;br /&gt;insert into SomeData values('Shift', 'Night Shift')&lt;br /&gt;insert into SomeData values('Shift', 'Day Shift')&lt;br /&gt;insert into SomeData values('Shift', 'Morning Shift')&lt;br /&gt;&lt;br /&gt;and then issued my PIVOT command:&lt;br /&gt;SELECT ID, [Day Shift] AS DayShift, [Morning Shift] AS MorningShift, [Night Shift] AS NightShift FROM SOMEDATA &lt;br /&gt;PIVOT &lt;br /&gt;(&lt;br /&gt;MIN([Field])&lt;br /&gt;FOR DataValue IN ([Day Shift], [Morning Shift], [Night Shift])&lt;br /&gt;) p&lt;br /&gt;&lt;br /&gt;Things to watch out for...you must alias the PIVOT with a variable even if you don't use it anywhere - in my case I chose the letter p&lt;br /&gt;&lt;br /&gt;The items in the FOR list cannot be calculated from a subquery so you must list them :(&lt;br /&gt;&lt;br /&gt;If you import a SQL Server 2000 database that has the same schema as my example and then try to issue the above command, you'll get back a cryptic error like this:&lt;br /&gt;Msg 102, Level 15, State 1, Line 5&lt;br /&gt;Incorrect syntax near '('.&lt;br /&gt;&lt;br /&gt;You need to change the compatibility level of the database to SQL Server 2005 otherwise the functionality is restricted to SQL Server 2000 - PIVOT command is not available for SQL Server 2000. It took me a long time to figure this out because that error message is not much use! You change the compatibility level to SQL Server 2005 with sp_dbcmptlevel e.g.&lt;br /&gt;EXEC sp_dbcmptlevel 'RevesbyProjectData', '90';&lt;br /&gt;&lt;br /&gt;where the first parameter is the name of the database and the second parameter is the version of SQL Server: 80 is 2000 and 90 is 2005&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-115560722851245238?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/115560722851245238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=115560722851245238&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115560722851245238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115560722851245238'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/08/sql-server-2005-pivot-woes.html' title='SQL Server 2005 PIVOT woes'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-115476308556668264</id><published>2006-08-05T17:29:00.000+10:00</published><updated>2007-09-28T00:54:03.842+10:00</updated><title type='text'>Internet memory lane</title><content type='html'>Interesting trip down &lt;a href="http://news.bbc.co.uk/2/hi/technology/5243862.stm"&gt;internet memory lane&lt;/a&gt; - Seems hard to believe in August 1995 there were only 18,957 web sites in the world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-115476308556668264?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/115476308556668264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=115476308556668264&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115476308556668264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115476308556668264'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/08/internet-memory-lane.html' title='Internet memory lane'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-115309707237110759</id><published>2006-07-17T10:41:00.000+10:00</published><updated>2007-09-28T00:54:03.848+10:00</updated><title type='text'>ALT-TAB Vista</title><content type='html'>I just found out that ALT-TAB now includes the mouse in Vista...just do a single ALT-TAB, keep the ALT key pushed down and then move the mouse into the ALT-TAB area and hover over whichever item you're interested in and it automatically selects that item&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-115309707237110759?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/115309707237110759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=115309707237110759&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115309707237110759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115309707237110759'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/07/alt-tab-vista.html' title='ALT-TAB Vista'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-115241682546597248</id><published>2006-07-09T13:47:00.000+10:00</published><updated>2007-09-28T00:54:03.859+10:00</updated><title type='text'>Getting to Low Earth Orbit</title><content type='html'>If you have plans to achieve &lt;a href="http://en.wikipedia.org/wiki/Low_Earth_orbit"&gt;Low Earth Orbit&lt;/a&gt; then &lt;a href="http://www.spacefuture.com/archive/getting_to_low_earth_orbit.shtml"&gt;this&lt;/a&gt; is essential reading!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-115241682546597248?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/115241682546597248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=115241682546597248&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115241682546597248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115241682546597248'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/07/getting-to-low-earth-orbit.html' title='Getting to Low Earth Orbit'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-115154677920973353</id><published>2006-06-29T11:57:00.000+10:00</published><updated>2007-09-28T00:54:03.871+10:00</updated><title type='text'>Debugging release apps</title><content type='html'>Debugging is actually quite hard in a release environment. I have learned a great deal about how to do this by reading the following blogs:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mtaulty.com/blog/(xdsndm554gz05wefg2dwf045)/default.aspx"&gt;Mike Taulty&lt;/a&gt; has three good blogs:&lt;br /&gt;&lt;a href="http://mtaulty.com/blog/(cdnluciha0ucbzjozkrkstjn)/archive/2004/08/03/608.aspx"&gt;Part 1&lt;/a&gt;, &lt;a href="http://mtaulty.com/blog/(u1wmgr55i3eqi045ui4nmf45)/archive/2004/08/03/609.aspx"&gt;Part 2&lt;/a&gt; and &lt;a href="http://mtaulty.com/blog/(otdsbaqprgnbwlaqkgexra2a)/archive/2004/08/06/628.aspx"&gt;Part 3&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/tess/default.aspx"&gt;Tess Ferrandez&lt;/a&gt; has the ultimate blog for debugging managed apps&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;a href="http://www.wintellect.com/Weblogs/CategoryView,category,John%20Robbins.aspx"&gt;John Robbins&lt;/a&gt; rates Tess &lt;a href="http://www.wintellect.com/Weblogs/DoYouReallyWantToLearnAboutSOS.aspx"&gt;above himself&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-115154677920973353?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/115154677920973353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=115154677920973353&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115154677920973353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115154677920973353'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/06/debugging-release-apps.html' title='Debugging release apps'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-115144966895347365</id><published>2006-06-28T09:01:00.000+10:00</published><updated>2007-09-28T00:54:03.878+10:00</updated><title type='text'>TLA decoder</title><content type='html'>Occasionally I come across a TLA and have no idea what it means - by chance I found a web site which has some pretty good suggestions:&lt;br /&gt;&lt;br /&gt;http://www.acronymfinder.com/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-115144966895347365?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/115144966895347365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=115144966895347365&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115144966895347365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115144966895347365'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/06/tla-decoder.html' title='TLA decoder'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-115085153038710390</id><published>2006-06-21T10:56:00.000+10:00</published><updated>2007-09-28T00:54:03.884+10:00</updated><title type='text'>500 GHz anyone??</title><content type='html'>If you have access to some sophisticated cooling equipment (I was tempted to say cool equipment but thought better of it) and some non silicon material then it's possible to &lt;a href="http://news.bbc.co.uk/2/hi/technology/5099584.stm"&gt;increase&lt;/a&gt; the processing speed to 500 GHz&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-115085153038710390?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/115085153038710390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=115085153038710390&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115085153038710390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115085153038710390'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/06/500-ghz-anyone.html' title='500 GHz anyone??'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-115076804188925697</id><published>2006-06-20T11:35:00.000+10:00</published><updated>2007-09-28T00:54:03.891+10:00</updated><title type='text'>Immediate window + System.IO.File.WriteAllText()</title><content type='html'>I'm sure I'm probably the last person to have thought of this....&lt;br /&gt;&lt;br /&gt;With the new System.IO.File.WriteAllText() method in v2.0, it's ultra easy to walk up to an object in the immediate windows of VS 2005 and empty it into a file of your choice...as an example, you can easily type the following into the immediate window:&lt;br /&gt;&lt;br /&gt;//assuming nameofthevariable is in scope of course...&lt;br /&gt;&lt;br /&gt;System.IO.File.WriteAllText("c:\\temp\\somedata.txt", nameofthevariable.ToString())&lt;br /&gt;&lt;br /&gt;BTW, in case you didn't know already, you don't need the semi colon at the end of the statement in the immediate window&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-115076804188925697?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/115076804188925697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=115076804188925697&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115076804188925697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115076804188925697'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/06/immediate-window-systemiofilewriteallte.html' title='Immediate window + System.IO.File.WriteAllText()'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-115041861559414442</id><published>2006-06-16T10:11:00.000+10:00</published><updated>2007-09-28T00:54:03.898+10:00</updated><title type='text'>Change in v2.0 Delegate.GetHashCode()</title><content type='html'>There has been a subtle but interesting change to the implementation of Delegate.GetHashCode() in v2.0&lt;br /&gt;&lt;br /&gt;Previously it was a function of the method pointer value in v1.x:&lt;br /&gt;public override int GetHashCode() {&lt;br /&gt;      if (this.IsStatic()) {&lt;br /&gt;            return this._methodPtrAux.ToInt32();&lt;br /&gt;      }&lt;br /&gt;      return this._methodPtr.ToInt32();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This has totally changed with v2.0 - instead they now (scuse the pun) delegate the call to the System.Type for the delegate type:&lt;br /&gt;&lt;br /&gt;public override int GetHashCode() {&lt;br /&gt;      return base.GetType().GetHashCode();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Of course, it's totally fine that two different objects produce the same hashcode when added into the same hashtable. It just means the lookup algorithm will take a little longer. &lt;br /&gt;&lt;br /&gt;Compiling the code below [1] under v1.x and v2.0 will highlight the change. Under v1.x the code produces this output:&lt;br /&gt;10244731 == 10244747&lt;br /&gt;bob&lt;br /&gt;steve&lt;br /&gt;&lt;br /&gt;under v2.0 it produces this output:&lt;br /&gt;2031146524 == 2031146524&lt;br /&gt;bob&lt;br /&gt;steve&lt;br /&gt;&lt;br /&gt;[1]&lt;br /&gt;using System;&lt;br /&gt;using System.Collections;&lt;br /&gt;&lt;br /&gt;class app {&lt;br /&gt; static void Func1(object sender, EventArgs args) { Console.WriteLine("hi"); }&lt;br /&gt; static void Func2(object sender, EventArgs args) { }&lt;br /&gt;&lt;br /&gt; static void Main() {&lt;br /&gt;  EventHandler eh1 = new EventHandler(Func1);  &lt;br /&gt;  EventHandler eh2 = new EventHandler(Func2);&lt;br /&gt;  &lt;br /&gt;  //output is different on v1.x but same on v2.0&lt;br /&gt;  Console.WriteLine("{0} == {1}", eh1.GetHashCode(), &lt;br /&gt;      eh2.GetHashCode());&lt;br /&gt; &lt;br /&gt;  Hashtable dict = new Hashtable(); &lt;br /&gt;  dict.Add(eh1, "bob");&lt;br /&gt;  dict.Add(eh2, "steve");&lt;br /&gt;  &lt;br /&gt;  Console.WriteLine(dict[eh1]); //output is: bob&lt;br /&gt;  Console.WriteLine(dict[eh2]); //output is: steve&lt;br /&gt; }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-115041861559414442?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/115041861559414442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=115041861559414442&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115041861559414442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115041861559414442'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/06/change-in-v20-delegategethashcode.html' title='Change in v2.0 Delegate.GetHashCode()'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-115033385552801441</id><published>2006-06-15T11:09:00.000+10:00</published><updated>2007-09-28T00:54:03.906+10:00</updated><title type='text'>3D image from 2D image</title><content type='html'>&lt;a href="http://www.cmu.edu/PR/releases06/060613_3d.html"&gt;This&lt;/a&gt; is very, very cool&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-115033385552801441?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/115033385552801441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=115033385552801441&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115033385552801441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/115033385552801441'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/06/3d-image-from-2d-image.html' title='3D image from 2D image'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-114859908728725317</id><published>2006-05-26T09:16:00.000+10:00</published><updated>2007-09-28T00:54:03.921+10:00</updated><title type='text'>Cloaking is on it's way</title><content type='html'>&lt;a href="http://news.bbc.co.uk/2/hi/science/nature/5016068.stm"&gt;Cloaking&lt;/a&gt; device becomes a possible reality&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-114859908728725317?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/114859908728725317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=114859908728725317&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/114859908728725317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/114859908728725317'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/05/cloaking-is-on-its-way.html' title='Cloaking is on it&apos;s way'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-114802129970609475</id><published>2006-05-19T16:31:00.000+10:00</published><updated>2007-09-28T00:54:03.931+10:00</updated><title type='text'>Flo's notepad2.exe rocks!</title><content type='html'>I really like &lt;a href="http://www.flos-freeware.ch/notepad2.html"&gt;notepad2&lt;/a&gt; with its syntax colouring for C# etc. I like it so much (kudos to flo) that I took that additional step and nuked the original notepad.exe so that whenever I run notepad.exe from anywhere (e.g. start-&gt;run-&gt;notepad.exe) it launches flo's notepad2.exe instead.&lt;br /&gt;&lt;br /&gt;There are various blogs that tell you how to do this and I lifted my means collectively from those blogs, but here is my fail safe gathering of those blogs which I have tested under XP and 2003. Before you try these steps, read the rest of this blog entry before you commence the steps - you've been warned!!!&lt;br /&gt;&lt;br /&gt;1) In the folder you unpacked Notepad2.exe, rename Notepad2.exe to notepad.exe&lt;br /&gt;&lt;br /&gt;2) In windows explorer, make sure Tools-&gt;Folder Options-&gt;View:&lt;br /&gt;Show hidden Files radio button is selected&lt;br /&gt;Make sure 'Hide protected operating system files' is unchecked [naughty Windows hiding stuff from us ;]&lt;br /&gt;&lt;br /&gt;3) Crank up 3 separate windows expolorer windows (and that is an important thing to do!)&lt;br /&gt;Get the first one to look at C:\Windows\System32\DllCache [can't see it huh? Go look at step (2) and make sure you comply!]&lt;br /&gt;Get the second one to look at C:\Windows\System32&lt;br /&gt;Get the third one to look at C:\Windows&lt;br /&gt;Get the fourth one to look at the directory where flo's newly named notepad.exe lives&lt;br /&gt;&lt;br /&gt;4) In the fourth window, select the new notepad.exe, right mouse button down and choose the 'Copy' menu item&lt;br /&gt;&lt;br /&gt;5) Now, in this order, right mouse button down in the right hand pane of each of the three explorer windows and choose the menu option 'Paste':&lt;br /&gt;C:\Windows\System32\DllCache&lt;br /&gt;C:\Windows\System32&lt;br /&gt;C:\Windows&lt;br /&gt;&lt;br /&gt;6) Now close all four windows explorer windows [you hadn't closed them after each paste had you!!??] and try Start-&gt;Run-&gt;notepad.exe and see what you get ;)&lt;br /&gt;&lt;br /&gt;By the way, if you get a dialog pop up about windows protection then just push the cancel button as is the norm for any MS dialog with more than 4 words&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-114802129970609475?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/114802129970609475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=114802129970609475&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/114802129970609475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/114802129970609475'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/05/flos-notepad2exe-rocks.html' title='Flo&apos;s notepad2.exe rocks!'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-114644656879232146</id><published>2006-05-01T11:22:00.000+10:00</published><updated>2007-09-28T00:54:03.937+10:00</updated><title type='text'>Scientists make water run uphill</title><content type='html'>&lt;a href="http://news.bbc.co.uk/1/hi/sci/tech/4955398.stm"&gt;Scientists make water run uphill&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-114644656879232146?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/114644656879232146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=114644656879232146&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/114644656879232146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/114644656879232146'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/05/scientists-make-water-run-uphill.html' title='Scientists make water run uphill'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-114605026171699038</id><published>2006-04-26T21:17:00.000+10:00</published><updated>2007-09-28T00:54:03.951+10:00</updated><title type='text'>Something to not do with a nail gun</title><content type='html'>&lt;a href="http://news.bbc.co.uk/nolavconsole/ukfs_news/hi/newsid_4930000/newsid_4939600/nb_wm_4939698.stm"&gt;Fun with a nail gun&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-114605026171699038?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/114605026171699038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=114605026171699038&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/114605026171699038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/114605026171699038'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/04/something-to-not-do-with-nail-gun.html' title='Something to not do with a nail gun'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-114297388925246582</id><published>2006-03-22T06:44:00.000+10:00</published><updated>2007-09-28T00:54:03.963+10:00</updated><title type='text'>Application Threat Modeling</title><content type='html'>I found this link for &lt;a href="http://msdn.microsoft.com/security/securecode/threatmodeling/acetm/"&gt;Application Threat Modeling&lt;/a&gt; via this &lt;a href="http://pluralsight.com/blogs/keith/archive/2006/03/20/20338.aspx"&gt;link&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-114297388925246582?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/114297388925246582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=114297388925246582&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/114297388925246582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/114297388925246582'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2006/03/application-threat-modeling.html' title='Application Threat Modeling'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-113245266445217223</id><published>2005-11-20T12:11:00.000+10:00</published><updated>2007-09-28T00:54:03.971+10:00</updated><title type='text'>Internet Explorer: ALT Right Arrow</title><content type='html'>Every now and then I find out something about windows as a user that I did not know about such as the existence of the the &lt;a href="http://steverodgers.blogspot.com/2005_05_01_steverodgers_archive.html#111642608470324675"&gt;command line defragger&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Well, everyone knows that the backspace key in IE is the same as pressing the "Back" button but my latest killer key combo discovery is ALT+Right arrow key which is the same as pressing the "Forward" button. When I found out about it a few weeks ago, I did not think I would ever use it but it turns out that I use it all the time, hence this blog entry :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-113245266445217223?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/113245266445217223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=113245266445217223&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/113245266445217223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/113245266445217223'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/11/internet-explorer-alt-right-arrow.html' title='Internet Explorer: ALT Right Arrow'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-113244927599741608</id><published>2005-11-20T11:14:00.000+10:00</published><updated>2007-09-28T00:54:03.977+10:00</updated><title type='text'>What the bleep do we know!?</title><content type='html'>At the last minute, I booked myself a seat to see &lt;a href="http://www.fredalanwolf.com/"&gt;Fred Alan Wolf&lt;/a&gt; give a 3 hour talk at the University of Queensland here in Brisbane yesterday. He has a very charismatic, yoda-like appearance and has written a gammut of &lt;a href="http://www.amazon.com/gp/product/0671696017/002-2562140-4210421?v=glance&amp;n=283155&amp;v=glance"&gt;interesting&lt;/a&gt; books. He was also in the movie &lt;a href="http://www.whatthebleep.com/"&gt;What the bleep do we know!?&lt;/a&gt;. That's quite a resume!&lt;br /&gt;&lt;br /&gt;The title of the talk was "The Spiritual Universe - How Quantum Physics Proves the Existence of the Soul". He started out by spending about an hour asking a series of questions like "who am I?", "why am I here?", "what is the soul?" and "what happens after death?". He could easily have condensed this hour into a half hour and entered the nitty gritty of answering the questions much quicker and thus spend more time going into more detailed answers. His lecture style is okay and reminded me of some of my uni lecturers (naturally) but he does have an engaging style none the less. Making friends with the audience by spending time before he commenced e.g. shaking hands randomly with them was great to see.&lt;br /&gt;&lt;br /&gt;What detracted from his presentation was the plethora of badly put together slides in his deck with animations and sound bites. His presentation relies on hundreds of slides which generally lack actual content. In fact, I found the content to be only interesting when he was not reading from the slides and actually addressing the audience with his real persona. The presentation is really a narrated slide deck....it is not a lecture as you might think!&lt;br /&gt;&lt;br /&gt;The fact is, he is smart enough and engaging enough to not need any props whatsoever but he clearly hasn't realised this fact or been told. This fact was made really obvious at the end when we were given the chance of q+a and it was clear to see that he knows a thing or two about some of the most interesting and important subjects one could ever discuss. My advice to him would be to reduce the slide deck to what is actually needed and employ a media company to make the content look slick and professional. &lt;br /&gt;&lt;br /&gt;The other thing is I wish Fred was a good friend of mine so we could hang out and chew the fat over quantum mechanics ;)&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-113244927599741608?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/113244927599741608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=113244927599741608&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/113244927599741608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/113244927599741608'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/11/what-bleep-do-we-know.html' title='What the bleep do we know!?'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-113159153601255023</id><published>2005-11-10T12:58:00.000+10:00</published><updated>2007-09-28T00:54:03.984+10:00</updated><title type='text'>Virtual property market booming</title><content type='html'>Once the machines rise and enslave most of us blue pill, non zion humans, we'll be right into &lt;a href="http://news.bbc.co.uk/2/hi/technology/4421496.stm"&gt;this&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-113159153601255023?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/113159153601255023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=113159153601255023&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/113159153601255023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/113159153601255023'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/11/virtual-property-market-booming.html' title='Virtual property market booming'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-113154540142430481</id><published>2005-11-10T00:10:00.000+10:00</published><updated>2007-09-28T00:54:03.992+10:00</updated><title type='text'>Calculating Load</title><content type='html'>I was just reading Ian's &lt;a href="http://www.interact-sw.co.uk/iangblog/"&gt;latest blog entry&lt;/a&gt; on profiling and noticed that he recommended some whitepapers by &lt;a href="http://www.pluralsight.com/wiki/default.aspx/Craig/ScalabilityConsiderationsIndex.html"&gt;Craig Andera &lt;/a&gt; ...the one on load balancing is very useful, kudos to Craig:&lt;a href="http://www.pluralsight.com/wiki/default.aspx/Craig/CalculatingLoad.html"&gt;"Calculating load"&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-113154540142430481?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/113154540142430481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=113154540142430481&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/113154540142430481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/113154540142430481'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/11/calculating-load.html' title='Calculating Load'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-113124222062596891</id><published>2005-11-06T11:57:00.000+10:00</published><updated>2007-09-28T00:54:04.003+10:00</updated><title type='text'>C# &lt;==&gt; VB.NET converter web tool</title><content type='html'>Reading &lt;a href="http://pluralsight.com/blogs/aaron/"&gt;Aaron Skonnard's blog&lt;/a&gt; connected me with &lt;a href="http://www.carlosag.net/Tools/CodeTranslator/Default.aspx"&gt;this awesome C# &amp;lt;==&amp;gt; VB.NET converter web tool&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-113124222062596891?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/113124222062596891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=113124222062596891&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/113124222062596891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/113124222062596891'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/11/c-vbnet-converter-web-tool.html' title='C# &lt;==&gt; VB.NET converter web tool'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-113088311313461516</id><published>2005-11-02T08:11:00.000+10:00</published><updated>2007-09-28T00:54:04.017+10:00</updated><title type='text'>Skinning XP</title><content type='html'>I was recently watching an ASP.NET 2.0 webcast by the awesome &lt;a href="http://pluralsight.com/blogs/fritz/default.aspx"&gt;Fritz Onion&lt;/a&gt; when I noticed (or thought I noticed) that his desktop looked a little different. After digging round a bit I found I found a tool that allows you to change the look and feel of Windows XP quite radically and it's called &lt;a href="http://www.download.com/3001-2326_4-10426977.html?idl=n"&gt;Windows Blinds&lt;/a&gt;. I've currently got mine set to the longhorn slate (the dark grey). This particular skin is not in the default bits so it came from &lt;a href="http://www.wincustomize.com/IndexSkins.aspx"&gt;here&lt;/a&gt;. The tool is free to a certain extent by the way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-113088311313461516?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/113088311313461516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=113088311313461516&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/113088311313461516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/113088311313461516'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/11/skinning-xp.html' title='Skinning XP'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-113080780708350418</id><published>2005-11-01T11:16:00.000+10:00</published><updated>2007-09-28T00:54:04.039+10:00</updated><title type='text'>a walk down memory lane with Kraig</title><content type='html'>I stumbled across this &lt;a href="http://www.microsoft.com/msj/archive/S2EC.aspx"&gt;article&lt;/a&gt; by Kraig Brockschmidt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-113080780708350418?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/113080780708350418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=113080780708350418&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/113080780708350418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/113080780708350418'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/11/walk-down-memory-lane-with-kraig.html' title='a walk down memory lane with Kraig'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-113013091920432794</id><published>2005-10-24T15:15:00.000+10:00</published><updated>2007-09-28T00:54:04.065+10:00</updated><title type='text'>Great C# 2.0 Iterators article</title><content type='html'>Comprehensive article covering &lt;a href="http://www.theserverside.net/articles/showarticle.tss?id=IteratorsWithC2"&gt;C# 2.0 Iterators&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-113013091920432794?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/113013091920432794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=113013091920432794&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/113013091920432794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/113013091920432794'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/10/great-c-20-iterators-article.html' title='Great C# 2.0 Iterators article'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-112892684023214481</id><published>2005-10-10T16:47:00.000+10:00</published><updated>2007-09-28T00:54:04.085+10:00</updated><title type='text'>Interesting VSTS dogfood document</title><content type='html'>It's always reassuring to know that Microsoft promote &lt;a href="http://en.wikipedia.org/wiki/Eat_one's_own_dog_food"&gt;dogfooding&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;There is an interesting VSTS dogfood &lt;a href="http://www.microsoft.com/downloads/info.aspx?na=90&amp;p=&amp;SrcDisplayLang=en&amp;SrcCategoryId=&amp;SrcFamilyId=43e098e5-9087-44d2-846f-d33ab3dd966a&amp;u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2ff%2f1%2fc%2ff1c297a0-74b8-4f72-ae6a-e035bfea68b5%2fVisualStudio05TeamSystemNote.doc"&gt;document&lt;/a&gt; that gives out some useful nuggets&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-112892684023214481?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/112892684023214481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=112892684023214481&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/112892684023214481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/112892684023214481'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/10/interesting-vsts-dogfood-document.html' title='Interesting VSTS dogfood document'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-112883128542663451</id><published>2005-10-09T14:14:00.000+10:00</published><updated>2007-09-28T00:54:04.135+10:00</updated><title type='text'>Drink the Kool-Aid suckers</title><content type='html'>I feel compelled to share an experience I had yesterday. A friend of mine suggested that I attend a 'free' 2 day "personal development" seminar. Having only a cursory knowledge of the subject, my default reaction was one of pure skepticism. But, I decided that this negative, stick in the mud attitude could do with a shake up. After all, how could I refuse the tempting offer of  &lt;i&gt;"Can You Attend A Legitimate, $1,197 Personal Success Seminar for Free? Yes. It’s absolutely true …"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;The organisation running the event has the exceedingly dodgy company name of &lt;a href="http://www.successandyou.com.au"&gt;Success and You&lt;/a&gt;. A quick scout around their abysmal website reveals that it was built in a hurry on a limited budget – not a very compelling first impression for a company that touts success as it’s unit of currency. That aside, I paid the $69 towards the food that I would eat over the 2 days and was duly enrolled.&lt;br /&gt;&lt;br /&gt;The event format is two 12 hour days of "intensive success" training. Hmmm. Well anyway, I turned up for the event at 8am on Saturday morning to be greeted by a small army of clones wearing black trousers with white t-shirts. These were the volunteer helpers who were attendees at previous seminars. My friend is one of them by the way. They all seemed very excited which was promising. &lt;br /&gt;&lt;br /&gt;The gig got underway as we took our places in the university style auditorium. I was one of about 70 attendees. The opening speech by Craig the Queensland head honcho promised incredible things over the 2 days. He finally built up his boss Peter to be the greatest speaker ever which seemed quite a dangerous thing to be doing. Craig appeared to be nervy and had stacks of closed body language, holding his clutched hands close to his chest all the time in a prayer like manner.&lt;br /&gt;&lt;br /&gt;By contrast, Peter offered a more slick performace. He has a lot more confidence and therefore charisma than Craig, but experience is all when it comes to training. Between them, they give away nuggets of largely content-free information delivered in a deadly combination of lectures, video and games. The lectures are backed with a very badly put together powerpoint slide deck. Diagrams of triangles divided into 5 layers with words stacked on top of one another like "environment", "beliefs", "actions" etc seem to go down quite well with the audience. The fact that the triangles are badly drawn with some lines not quite meeting at the places they should meet does not appear to create a bad impression with the attendees.&lt;br /&gt;&lt;br /&gt;Having subsequently been broken out into various teams of approximately 10 people per group, the team I am assigned are blessed with the decidedly crap name of "the donkeys". We were advised that our team would need a chant of some sort. Before being allowed back into the auditorium each team must give its chant and it was here that for me the downward spiral began. Watching adults make lion / kookaburra / donkey noises when playing with children strikes me as perfectly normal. Watching adults make lion / kookaburra/ donkey noises when there are no children around strikes me as very embarrassing.&lt;br /&gt;&lt;br /&gt;Upon entering the auditorium after each break, for about 10 minutes they play the same loud pop music that everyone must dance to, having previously been been whipped into a collective chanting frenzy by one of the clones: "we love dan-cing". Drink the kool-aid.&lt;br /&gt;&lt;br /&gt;I found myself feeling increasingly isolated as I watched my fellow sheep participate in what was rapidly becoming a sham punctuated by moments of pure, unadulterated embarrassment by their induced childish behavior. The techniques being used by Peter and Craig are not new – apparently they are used by the infamous Tony Robbins.&lt;br /&gt;&lt;br /&gt;The pre-dinner session was a practical game. Two breeze blocks separated by about a foot are setup to support an inch thick piece of pine. The goal of each attendee is to break their pine block on the breeze blocks. After watching a couple of demos from Peter and a clone, each attendee signs the legal document that surrenders any chance of you suing their company for a damaged hand. &lt;br /&gt;&lt;br /&gt;It turns out that breaking the wood in the manner shown is trivial, so long as you use the procedure demonstrated. The trick is to focus on the floor below the wood. This ensures that when you make contact with the wood, you carry on through to the floor, thus breaking the wood in half. The audience is encouraged to yell in support and to hug fellow attendees as they complete the task. Rabble rousing in this manner is incredibly embarrassing to be a part of, especially if you are English like me!&lt;br /&gt;&lt;br /&gt;The idea behind breaking the wood in this way is for one to achieve something that ordinarily one would perceive as being impossible. In doing so, it is demonstrated that we often give up on an idea before we have even given it a go. Once the average person proves to themselves that they can break the wood in half, they have clearly demonstrated to themselves how their negative attitude can often prevent them from getting the success they desire in life. On the whole, I must say, I think this is actually a clever device for the less confident lemmings in the audience. For myself, I knew I could do it because I had watched Peter do it and thus I had confidence. I was not the target audience for the game.&lt;br /&gt;&lt;br /&gt;At the end of day 1, I realized that everyone in the room had taken the blue pill and were sitting happily inside the matrix chanting, yelping and doing whatever Peter, Craig or the clones desired from them. For myself, I felt like I had taken the red pill and I knew I was no longer a part of their world as my fake mobile phone calls and extended coffee breaks made me realize that I would not participate any further in the show. I felt tinged with slight sadness at being abnormal and probably over analytical to be a seminar reject but I cannot help being me. As for the sheep who go on to attend day 2, my heart is with them in a spiritual sense as I hope they won't be lulled into spending upwards of $125 per hour for success coaching after the event. I say this because the website makes the following pitch to wannabe success coaches: "Become a Success Coach...in only 3-4 months time, you could easily be earning $125 an hour". Yikes!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-112883128542663451?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/112883128542663451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=112883128542663451&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/112883128542663451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/112883128542663451'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/10/drink-kool-aid-suckers.html' title='Drink the Kool-Aid suckers'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-112848504000802359</id><published>2005-10-05T14:04:00.000+10:00</published><updated>2007-09-28T00:54:04.147+10:00</updated><title type='text'>LINQ musings</title><content type='html'>Having missed the PDC, I just watched the very compelling demo of LINQ from Anders Hejlsberg on &lt;a href="http://channel9.msdn.com/Showpost.aspx?postid=114680"&gt;Channel 9&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It gets a little interesting right at the end when they bring up the topic of *where* Database LINQ  queries are invoked. His demo of using LINQ over Northwind database is basically middle tier code. He suggests that queries can be written in the middle tier (which is what he demo'd) and updates be implemented as stored procedures called from LINQ in the middle tier. I know some people will be needing some guidance on this as the preferred practice is to always invoke a stored procedure to access the data, if only to introduce a security perimeter.&lt;br /&gt;&lt;br /&gt;There is no doubt that LINQ is a compelling addition to the managed language suite. Being able to issue relational queries over objects/XML and data is both amazing and freaky (in a good way of course). I recall spending my days at Uni avoiding woosey SQL, staying focussed on chest-beating-hair-adding C. MTS lured me out of that hidey hole and LINQ will clearly barracade the entrance to it behind me once and for all....this is most definitely a good thing.&lt;br /&gt;&lt;br /&gt;The single most important thing Anders says in the whole interview in my opinion is that LINQ allows you to focus on *what* you want to achieve *without worrying how* to go about achieving it. His final demo using reflection over System.String class to do ordered filtering would have been many foreach, drill down lines of code in C#. LINQ does to C# what .NET did to COM....it raises the level of abstraction. This is a also a good thing.&lt;br /&gt;&lt;br /&gt;Not having the PDC bits is a little frustrating because I am intrigued to examine the CIL of any of Anders simple programs. He mentions that it's all type safe and not using reflection which is obviously good to hear...it would be interesting to see what the relative performance trade offs are when using LINQ over data as opposed to going the traditional route of cooking up the usual SqlParameter/SqlCommand/SqlConnection. One suspects that over a long enough period of time that the cost of the LINQ abstraction will be paid for in much the same way as GC has (is being)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-112848504000802359?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/112848504000802359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=112848504000802359&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/112848504000802359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/112848504000802359'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/10/linq-musings.html' title='LINQ musings'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-112056561551163705</id><published>2005-07-05T22:13:00.000+10:00</published><updated>2007-09-28T00:54:04.157+10:00</updated><title type='text'>Just Amazing</title><content type='html'>Several months ago, my friend Dan sent me a link to &lt;a href="http://www.big-boys.com"&gt;http://www.big-boys.com&lt;/a&gt;...I assumed from the name that it was some kind of porn site - it's not...it's an amazing website of videos of bizarre things out there in the world&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.big-boys.com/articles/f14model.html"&gt;Here's&lt;/a&gt; an amazing sample of what you get there&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-112056561551163705?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/112056561551163705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=112056561551163705&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/112056561551163705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/112056561551163705'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/07/just-amazing.html' title='Just Amazing'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111892861857069522</id><published>2005-06-16T23:30:00.000+10:00</published><updated>2007-09-28T00:54:04.171+10:00</updated><title type='text'>Can you pass the UK citizenship test?</title><content type='html'>I scored 10 points (out of 15) which means I am eligible to take a seat on the district council - here's the &lt;a href="http://news.bbc.co.uk/1/hi/magazine/4099770.stm"&gt;test&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111892861857069522?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111892861857069522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111892861857069522&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111892861857069522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111892861857069522'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/06/can-you-pass-uk-citizenship-test.html' title='Can you pass the UK citizenship test?'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111803730285571363</id><published>2005-06-06T15:55:00.000+10:00</published><updated>2007-09-28T00:54:04.181+10:00</updated><title type='text'>Apple to use Intel chips</title><content type='html'>&lt;a href="http://news.com.com/Apple+to+ditch+IBM%2C+switch+to+Intel+chips/2100-1006_3-5731398.html?tag=nefd.lede"&gt;Apple to ditch IBM, switch to Intel chips | CNET News.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111803730285571363?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111803730285571363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111803730285571363&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111803730285571363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111803730285571363'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/06/apple-to-use-intel-chips.html' title='Apple to use Intel chips'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111694165738182167</id><published>2005-05-24T23:34:00.000+10:00</published><updated>2007-09-28T00:54:04.199+10:00</updated><title type='text'>BlogShares </title><content type='html'>I accidentally came across &lt;a href="http://www.blogshares.com"&gt;Blogshares&lt;/a&gt; today.&lt;br /&gt;&lt;br /&gt;It seems this site allows one to trade in virtual blog shares..though why anyone would want to do this is completely beyond me! &lt;br /&gt;&lt;br /&gt;Naturally I was curious to see whether this blog had a listing and blow me down, it did! &lt;a href="http://www.blogshares.com/blogs.php?blog=http://steverodgers.blogspot.com%2F"&gt;life on the shop floor&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I guess it's market valuation of $1,100 could be better though...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111694165738182167?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111694165738182167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111694165738182167&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111694165738182167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111694165738182167'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/05/blogshares.html' title='BlogShares '/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111646952273498633</id><published>2005-05-19T12:25:00.000+10:00</published><updated>2007-09-28T00:54:04.212+10:00</updated><title type='text'>Moore's Law</title><content type='html'>In 1978, the new 8086 Intel processor had a staggering 29,000 transistors on it. Today, the Itanium 2 processor has a few more well go see for yourself:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.intel.com/research/silicon/mooreslaw.htm"&gt;How many?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111646952273498633?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111646952273498633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111646952273498633&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111646952273498633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111646952273498633'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/05/moores-law.html' title='Moore&apos;s Law'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111642608470324675</id><published>2005-05-19T00:21:00.000+10:00</published><updated>2007-09-28T00:54:04.221+10:00</updated><title type='text'>Hello tabs, goodbye tabs</title><content type='html'>1) I installed Firefox - hello tabs&lt;br /&gt;&lt;br /&gt;2) I removed all those dumb tabs that appear in MSN Messenger that no one ever uses...how?..well you go into Tools-&gt;Options[Activate Privacy in the left pane]-&gt;Enable checkbox that says 'This is a shared computer so don't display my tabs' - goodbye tabs&lt;br /&gt;&lt;br /&gt;3) Created a daily scheduled task that runs at 4am to defragment my hard disk whilst I asleep - use the following command line when setting up the task [scheduled tasks are created from control panel applet in case you have just switched over from Linux or some other platform]:&lt;br /&gt;&lt;br /&gt;c:\windows\system32\defrag.exe c:\&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111642608470324675?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111642608470324675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111642608470324675&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111642608470324675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111642608470324675'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/05/hello-tabs-goodbye-tabs.html' title='Hello tabs, goodbye tabs'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111633277045301926</id><published>2005-05-17T22:26:00.000+10:00</published><updated>2007-09-28T00:54:04.231+10:00</updated><title type='text'>700MB reclaimed!</title><content type='html'>I have an old PC that is still working fine as a server - it's new life soon will be as a juke box server. Windows XP is installed on the 2Gb C:\ drive and recently I have been getting complaints from the O/S that it's running low on disk space. So I decided to hunt around and see what I could delete. To cut a very long story short, I defragged the hard disk after freeing up some space by removing non essential software (giving me that prized 15% free space need by the defragger to work). The defragger told me it couldn't move a bunch of files hanging off of here:&lt;br /&gt;&lt;br /&gt;C:\WINDOWS\SoftwareDistribution&lt;br /&gt;&lt;br /&gt;I checked out the files, one of which was the Windows XP SP2 image that I never chose to install...hmm a software download directory. This directory contained over 700MB of data. So I deleted it and...Windows XP works fine....so now I have 40% free disk space....go figure&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111633277045301926?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111633277045301926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111633277045301926&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111633277045301926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111633277045301926'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/05/700mb-reclaimed.html' title='700MB reclaimed!'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111580958990727737</id><published>2005-05-11T21:06:00.000+10:00</published><updated>2007-09-28T00:54:04.242+10:00</updated><title type='text'>Troubleshooting Common Problems with the XmlSerializer</title><content type='html'>&lt;a href="http://msdn.microsoft.com/XML/BuildingXML/XMLinNETFramework/default.aspx?pull=/library/en-us/dnxmlnet/html/trblshtxsd.asp"&gt;This&lt;/a&gt; is a very useful resource&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111580958990727737?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111580958990727737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111580958990727737&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111580958990727737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111580958990727737'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/05/troubleshooting-common-problems-with.html' title='Troubleshooting Common Problems with the XmlSerializer'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111578835481669171</id><published>2005-05-11T15:12:00.000+10:00</published><updated>2007-09-28T00:54:04.250+10:00</updated><title type='text'>Using System.Resources.ResourceManager</title><content type='html'>Every time I go to use the System.Resources.ResourceManager class I forget what the parameters are and the documentation is not brilliant either - so this will help me remember:&lt;br /&gt;&lt;br /&gt;If I have an assembly called Foo (builds to Foo.Dll) and it has a resource file called XSLT.resx (as seen in VS.NET), and in that resource is a string with a name of Bar and my project VS.NET default namespace is set to Quux then here is the code that will load it (assuming this code is executing in Foo):&lt;br /&gt;&lt;br /&gt;ResourceManager rm = new ResourceManager("Quux.XSLT", Assembly.GetExecutingAssembly());&lt;br /&gt;&lt;br /&gt;string xslt = rm.GetString("Bar");&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111578835481669171?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111578835481669171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111578835481669171&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111578835481669171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111578835481669171'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/05/using-systemresourcesresourcemanager.html' title='Using System.Resources.ResourceManager'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111562953145967154</id><published>2005-05-09T19:05:00.000+10:00</published><updated>2007-09-28T00:54:04.260+10:00</updated><title type='text'>The assault on software giant Microsoft</title><content type='html'>When my computer illiterate brother threw out the PC I had given him in favour of a Mac notebook this year, I understood his reasons: it's easier to use and it doesn't get attacked by trojans, viruses or spyware as soon as he surfs the internet.&lt;br /&gt;&lt;br /&gt;Who wants to have to configure and keep up to date with a whole boat load of software like firewalls, virus checkers, antispyware and service packs? He voted with his feet away from the now end-user-plagued Microsoft platform and I don't blame him. &lt;a href="http://news.bbc.co.uk/1/hi/business/4508897.stm"&gt;This&lt;/a&gt; article really speaks volumes for the masses out there. Microsoft are most definitely sitting in a precarious place.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111562953145967154?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111562953145967154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111562953145967154&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111562953145967154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111562953145967154'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/05/assault-on-software-giant-microsoft.html' title='The assault on software giant Microsoft'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111553646863575282</id><published>2005-05-08T17:14:00.000+10:00</published><updated>2007-09-28T00:54:04.271+10:00</updated><title type='text'>Space Imaging Gallery</title><content type='html'>Plenty of interesting things to look at &lt;a href="http://www.spaceimaging.com/gallery/default.htm"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111553646863575282?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111553646863575282/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111553646863575282&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111553646863575282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111553646863575282'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/05/space-imaging-gallery.html' title='Space Imaging Gallery'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111551176225303811</id><published>2005-05-08T10:22:00.000+10:00</published><updated>2007-09-28T00:54:04.279+10:00</updated><title type='text'>Prince Harry begins Sandhurst training</title><content type='html'>So Prince Harry has joined the British army today. The BBC news web site covered the story but this sentence made me smile:&lt;br /&gt;&lt;br /&gt;"Cadets are initially only allowed one photograph of their family although there are numerous pictures around the college of his grandmother - the Queen"&lt;br /&gt;&lt;br /&gt;Here's the &lt;a href="http://news.bbc.co.uk/1/hi/uk/4526077.stm"&gt;actual story&lt;/a&gt;: &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111551176225303811?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111551176225303811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111551176225303811&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111551176225303811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111551176225303811'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/05/prince-harry-begins-sandhurst-training.html' title='Prince Harry begins Sandhurst training'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111458982044240702</id><published>2005-04-27T18:17:00.000+10:00</published><updated>2007-09-28T00:54:04.286+10:00</updated><title type='text'>The Aberration of Light</title><content type='html'>I'm doing some serious surfing - google search term of my day:&lt;br /&gt;einstein&lt;br /&gt;&lt;br /&gt;Einstein's 1905 Annus Mirablis (Miracle year...not to be confused with her majesty's &lt;a href="http://news.bbc.co.uk/1/hi/uk/1728438.stm"&gt;Annus Horribilis&lt;/a&gt;) produced the theory of &lt;a href="http://www.fourmilab.ch/etexts/einstein/specrel/www/"&gt;Special Relativity&lt;/a&gt;. I first came across special relativity when I read Stephen Hawking's book &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0553380168/104-8496562-6479128?v=glance"&gt;A Brief History Of Time&lt;/a&gt;. This then spurred me on to read the late Carl Sagan's wonderful book &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0345331354/qid=1114589336/sr=2-1/ref=pd_bbs_b_2_1/104-8496562-6479128"&gt;Cosmos&lt;/a&gt;. One of the books (or both I forget now) suggest how you would see the universe if you were to accelerate to light speed...well, now you can because that's exactly what a trip on board the &lt;br /&gt;&lt;a href="http://www.fourmilab.ch/cship/aberration.html"&gt;C-ship&lt;/a&gt; gives you - well worth a trip!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111458982044240702?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111458982044240702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111458982044240702&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111458982044240702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111458982044240702'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/04/aberration-of-light.html' title='The Aberration of Light'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111457082979660187</id><published>2005-04-27T13:00:00.000+10:00</published><updated>2007-09-28T00:54:04.294+10:00</updated><title type='text'>Famous Quotes</title><content type='html'>&lt;a href="http://www.quotationspage.com/quotes/"&gt;Famous Quotes by Author&lt;/a&gt; is a great visit. I never knew that George Bernard Shaw was responsible for:&lt;br /&gt;"Youth is a wonderful thing. What a crime to waste it on children"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111457082979660187?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111457082979660187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111457082979660187&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111457082979660187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111457082979660187'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/04/famous-quotes.html' title='Famous Quotes'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111434742153816801</id><published>2005-04-24T22:57:00.000+10:00</published><updated>2007-09-28T00:54:04.303+10:00</updated><title type='text'>FAQs about the expansion of the universe </title><content type='html'>I'm currently going through a phase of trawling the net trying to find answers to questions that are more important than "is aspect oriented programming of any practical real world use?" - So I have found an interesting &lt;a href="http://www.astronomycafe.net/qadir/acosmexp.html"&gt;Universe FAQ&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111434742153816801?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111434742153816801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111434742153816801&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111434742153816801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111434742153816801'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/04/faqs-about-expansion-of-universe.html' title='FAQs about the expansion of the universe '/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111405085117456975</id><published>2005-04-21T12:34:00.000+10:00</published><updated>2007-09-28T00:54:04.311+10:00</updated><title type='text'>How Big is the Universe?</title><content type='html'>I'm sure we all ponder the question at some point in our lives: How big is the universe? &lt;a href="http://www.pbs.org/wgbh/nova/universe/howbig.html"&gt;This&lt;/a&gt; is an interesting piece&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111405085117456975?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111405085117456975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111405085117456975&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111405085117456975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111405085117456975'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/04/how-big-is-universe.html' title='How Big is the Universe?'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111378159846881668</id><published>2005-04-18T09:46:00.000+10:00</published><updated>2007-09-28T00:54:04.318+10:00</updated><title type='text'>CSS: unmatched &amp;ltstyle&amp;gt</title><content type='html'>Surfing this morning I found an interesting site devoted to CSS:&lt;a href="http://www.unmatchedstyle.com/"&gt;unmatched &amp;ltstyle&amp;gt | CSS Gallery. Design News. Resources.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111378159846881668?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111378159846881668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111378159846881668&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111378159846881668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111378159846881668'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/04/css-unmatched.html' title='CSS: unmatched &amp;ltstyle&amp;gt'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111352229392133029</id><published>2005-04-15T09:44:00.000+10:00</published><updated>2007-09-28T00:54:04.324+10:00</updated><title type='text'>Whitespace</title><content type='html'>I laughed when a friend pointed me at the following programming language:&lt;a href="http://compsoc.dur.ac.uk/whitespace/index.php"&gt;Whitespace&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111352229392133029?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111352229392133029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111352229392133029&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111352229392133029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111352229392133029'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/04/whitespace.html' title='Whitespace'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111269345653922633</id><published>2005-04-05T19:30:00.000+10:00</published><updated>2007-09-28T00:54:04.331+10:00</updated><title type='text'>Model-Driven Software Development</title><content type='html'>It looks like Microsoft are heading into &lt;a href="http://www.mdsd.info/mdsd_cm/headlines.php"&gt;Model-Driven Software Development&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111269345653922633?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111269345653922633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111269345653922633&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111269345653922633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111269345653922633'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/04/model-driven-software-development.html' title='Model-Driven Software Development'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111096479870119399</id><published>2005-03-16T19:19:00.000+10:00</published><updated>2007-09-28T00:54:04.338+10:00</updated><title type='text'>Dead weird</title><content type='html'>&lt;a href="http://news.bbc.co.uk/2/hi/asia-pacific/4333379.stm"&gt;Man found dead after '10 years'&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111096479870119399?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111096479870119399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111096479870119399&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111096479870119399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111096479870119399'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/03/dead-weird.html' title='Dead weird'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111034043553154638</id><published>2005-03-09T13:53:00.000+10:00</published><updated>2007-09-28T00:54:04.345+10:00</updated><title type='text'>Grimes is leaving .NET</title><content type='html'>The highly respected Richard Grimes is&lt;a href="http://www.ddj.com/documents/s=9211/ddj050201dnn/"&gt;leaving .NET behind&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111034043553154638?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111034043553154638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111034043553154638&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111034043553154638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111034043553154638'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/03/grimes-is-leaving-net.html' title='Grimes is leaving .NET'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-111026520459515374</id><published>2005-03-08T17:00:00.000+10:00</published><updated>2007-09-28T00:54:04.353+10:00</updated><title type='text'>where is webapp.vbproj.user??</title><content type='html'>A client of mine has been looking to find the VS.NET ASP.NET &lt;webappname&gt;.vbproj.user file which is not in the webapp project directory or anywhere else that is obvious. The were wanting to change the ReferencePath setting for automated build purposes (so they didn't want to be using VS.NET by hand to do this). Unlike a WinForms app where the .user file is located in the project directory, for some reason the &lt;webappname&gt;.vbproj.user file is located in the following directory:&lt;br /&gt;&lt;br /&gt;C:\Documents and Settings\[who you are logged in as]\VSWebCache\[your machine name]\[your web app name]\&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-111026520459515374?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/111026520459515374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=111026520459515374&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111026520459515374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/111026520459515374'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/03/where-is-webappvbprojuser.html' title='where is webapp.vbproj.user??'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-110907568307311093</id><published>2005-02-22T22:34:00.000+10:00</published><updated>2007-09-28T00:54:04.360+10:00</updated><title type='text'>T t = new T(); or T t = Activator.CreateInstance();</title><content type='html'>When examining the .ctor CIL in the code below [1], it can be observed that the former field declaration:&lt;br /&gt;&lt;br /&gt;T t = new T(); &lt;br /&gt;&lt;br /&gt;makes a call to Activator.CreateInstance&lt;T&gt;()&lt;br /&gt;&lt;br /&gt;When using parameterized types in this way, it is mandatory in C# to decorate the class declaration with the clause:&lt;br /&gt;where T : new ()&lt;br /&gt;&lt;br /&gt;The where clause it not needed when the latter "equivalent" field declaration is used&lt;br /&gt;&lt;br /&gt;T u = Activator.CreateInstance&amp;lt;T&amp;gt;);&lt;br /&gt;&lt;br /&gt;Just how "equivalent" they are remains to be seen...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[1]&lt;br /&gt;&lt;br /&gt;class Dog&lt;T&gt; &lt;br /&gt; where T : new() {&lt;br /&gt;        T t = new T();&lt;br /&gt; T u = Activator.CreateInstance&amp;lt;T&amp;gt;();&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-110907568307311093?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/110907568307311093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=110907568307311093&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110907568307311093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110907568307311093'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/02/t-t-new-t-or-t-t-activatorcreateinstanc.html' title='T t = new T(); or T t = Activator.CreateInstance&lt;T&gt;();'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-110905939236705427</id><published>2005-02-22T18:03:00.000+10:00</published><updated>2007-09-28T00:54:04.368+10:00</updated><title type='text'>ajax: a new approach to web applications</title><content type='html'>I have been using gmail for sometime and I figured they must be doing some funky async stuff - here's the first piece I have seen written about it (I found the link when reading &lt;a href="http://www.simplegeek.com/categoryview.aspx/Software"&gt;Chris Anderson's blog&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://adaptivepath.com/publications/essays/archives/000385.php"&gt;ajax: Asynchronous JavaScript + XML&lt;/a&gt;: "Defining Ajax"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-110905939236705427?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/110905939236705427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=110905939236705427&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110905939236705427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110905939236705427'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/02/ajax-new-approach-to-web-applications.html' title='ajax: a new approach to web applications'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-110870699444063484</id><published>2005-02-18T16:09:00.000+10:00</published><updated>2007-09-28T00:54:04.376+10:00</updated><title type='text'>Debugging &amp; Tracing</title><content type='html'>Instrumentation and debugging in .NET apps can be easily routed to any target. The following app.exe.config file shows how to perform the routing to the Windows event log using the System.Diagnostics.EventLogTraceListener class.&lt;br /&gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;lt;system.diagnostics&amp;gt;&lt;br /&gt;&amp;lt;trace autoflush="true" indentsize="2"&amp;gt;&lt;br /&gt;&amp;lt;listeners&amp;gt;&lt;br /&gt;&amp;lt;add name="myListener" &lt;br /&gt; type="System.Diagnostics.EventLogTraceListener, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" &lt;br /&gt; initializeData="nameofeventsourcegoeshere"/&amp;gt;&lt;br /&gt;&amp;lt;/listeners&amp;gt;&lt;br /&gt;&amp;lt;/trace&amp;gt;&lt;br /&gt;&amp;lt;/system.diagnostics&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&lt;br /&gt;The event source 'nameofeventsourcegoeshere' needs to be registered and on first use, registration takes place under the hood by the .NET Framework. Unfortunately ASP.NET usually runs in the security context of ASPNET account and this does not have the privileges needed to create the event source (You will get a security exception if you try this). The quick and dirty workaround is to create the event source up front for the ASP.NET application to use. This is done by authoring the following simple program and running it in conjunction with the aforementioned app.exe.config. The program must run in the security context of someone who can create event sources (Admin will do it):&lt;br /&gt;&lt;br /&gt;#define DEBUG&lt;br /&gt;using System;&lt;br /&gt;&lt;br /&gt;class App {&lt;br /&gt; static void Main () {&lt;br /&gt;  System.Diagnostics.Debug.WriteLine ("hello, world");&lt;br /&gt; } &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Once this program is run, ASP.NET code can happily make calls to System.Diagnostics.Debug.WriteLine () and it will be routed through to the event log, with the event source 'nameofeventsourcegoeshere' (assuming it's web.config contains the same &lt;system.diagnostics/&gt; as shown above)&lt;br /&gt;&lt;br /&gt;Calls to System.Diagnostics.Trace.WriteLine () are compiled into the binary depending on whether TRACE is defined (in VS.NET, TRACE is defined automatically for both Debug and Release builds, so it will always be compiled into the binary and generally that's what you want), whereas System.Diagnostics.Debug.WriteLine () calls are only compiled into the binary if DEBUG is defined (in VS.NET DEBUG is **only** defined when a Debug build is chosen).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-110870699444063484?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/110870699444063484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=110870699444063484&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110870699444063484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110870699444063484'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/02/debugging-tracing.html' title='Debugging &amp; Tracing'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-110854638909520459</id><published>2005-02-16T19:33:00.000+10:00</published><updated>2007-09-28T00:54:04.383+10:00</updated><title type='text'>Apollo 11 - 17 Mission First man on the Moon - Fullscreen QTVR photo from panoramas.dk</title><content type='html'>This is awesome: &lt;a href="http://www.panoramas.dk/fullscreen3/f29.html"&gt;Apollo 11 - 17 Mission First man on the Moon - Fullscreen QTVR photo from panoramas.dk&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-110854638909520459?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/110854638909520459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=110854638909520459&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110854638909520459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110854638909520459'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/02/apollo-11-17-mission-first-man-on-moon.html' title='Apollo 11 - 17 Mission First man on the Moon - Fullscreen QTVR photo from panoramas.dk'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-110854331071237256</id><published>2005-02-16T18:41:00.000+10:00</published><updated>2007-09-28T00:54:04.389+10:00</updated><title type='text'>Faceanalyzer</title><content type='html'>I have not got round to doing it yet, but I think I will:&lt;a href="http://www.faceanalyzer.com/"&gt;FACEANALYZER&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-110854331071237256?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/110854331071237256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=110854331071237256&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110854331071237256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110854331071237256'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/02/faceanalyzer.html' title='Faceanalyzer'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-110854262648497656</id><published>2005-02-16T18:30:00.000+10:00</published><updated>2007-09-28T00:54:04.402+10:00</updated><title type='text'>I.E 7.0 - Microsoft to Release New Internet Browser</title><content type='html'>&lt;a href="http://www.pcmag.com/article2/0,1759,1765149,00.asp"&gt;Microsoft to Release New Internet Browser&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-110854262648497656?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/110854262648497656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=110854262648497656&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110854262648497656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110854262648497656'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/02/ie-70-microsoft-to-release-new-internet.html' title='I.E 7.0 - Microsoft to Release New Internet Browser'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-110820996496765187</id><published>2005-02-12T22:06:00.000+10:00</published><updated>2007-09-28T00:54:04.410+10:00</updated><title type='text'>Chris Brumme et al and their virtual method protection patent</title><content type='html'>The amazing CLR architect &lt;a href="http://blogs.msdn.com/cbrumme/archive/2004/02/20/77460.aspx"&gt;Chris Brumme&lt;/a&gt; (who sadly has not blogged in a while) has recently filed a patent (along with Erik Meijer, Craig T. Sinclair, James H. Hogg, Peter H. Golde, Sergey Lidin). The patent is entitled &lt;a href="http://www.freshpatents.com/Virtual-method-protection-dt20050120ptan20050015753.php"&gt;Virtual method protection&lt;/a&gt; and it concerns the following CLR issue:&lt;br /&gt;&lt;br /&gt;In IL it is possible to define a class method as being both private and virtual in an assembly. It is not possible to then prevent a class in another assembly from overriding it, even though it cannot invoke the method itself (you can readily do this in IL). Whilst this is not possible to achieve in C# (if you cannot see it, you cannot override it), other .NET languages may want to allow / disallow it.&lt;br /&gt;&lt;br /&gt;It seems that some languages, namely C++ and Component Pascal use this feature "to implement the semantics of their language"&lt;br /&gt;&lt;br /&gt;The patent is intended to correct this such that availability of overriding virtual methods is conveyed in IL to prevent assembly consumer's from bypassing the assembly producer's intent. The implementation of the patent appears to be a new metadata bit.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-110820996496765187?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/110820996496765187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=110820996496765187&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110820996496765187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110820996496765187'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/02/chris-brumme-et-al-and-their-virtual.html' title='Chris Brumme et al and their virtual method protection patent'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-110731324486430163</id><published>2005-02-02T13:54:00.000+10:00</published><updated>2007-09-28T00:54:04.417+10:00</updated><title type='text'>Avalon CTP available to everyone</title><content type='html'>The Avalon CTP is now available to everyone. It works on Windows XP and Windows Server 2003. Get the 255MB MSI from &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=C8F904E1-B4CA-402B-ACCF-AAA2BD60DA74&amp;displaylang=en"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-110731324486430163?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/110731324486430163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=110731324486430163&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110731324486430163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110731324486430163'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/02/avalon-ctp-available-to-everyone.html' title='Avalon CTP available to everyone'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-110725066776712424</id><published>2005-02-01T19:37:00.000+10:00</published><updated>2007-09-28T00:54:04.423+10:00</updated><title type='text'>My latest favourite VS.NET 2005 feature is...</title><content type='html'>Imagine the following class:&lt;br /&gt;&lt;br /&gt;class Dog {&lt;br /&gt;	private string _name = "yogi";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;..then in VS.NET 2005, right mouse button down on '_name' and choose the context menu item "encapsulate field" and hey presto, you now have this:&lt;br /&gt;&lt;br /&gt;class Dog {&lt;br /&gt;	private string _name = "yogi";&lt;br /&gt;&lt;br /&gt;	public string Name 	{&lt;br /&gt;		get { return _name;}&lt;br /&gt;		set { _name = value; }&lt;br /&gt;	}&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-110725066776712424?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/110725066776712424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=110725066776712424&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110725066776712424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110725066776712424'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/02/my-latest-favourite-vsnet-2005-feature.html' title='My latest favourite VS.NET 2005 feature is...'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-110713137809415274</id><published>2005-01-31T10:29:00.000+10:00</published><updated>2007-09-28T00:54:04.432+10:00</updated><title type='text'>rich but very generous</title><content type='html'>I was very pleased to read &lt;a href="http://news.bbc.co.uk/1/hi/magazine/4215419.stm"&gt;this article&lt;/a&gt; which describes how BillG is planning on giving away most of his money during his lifetime. I have often wondered what the point of having 40 billion dollars sitting in a high interest account could be and it seems that Bill agrees that there is no point and that you may as well share the love - kudos to Bill&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-110713137809415274?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/110713137809415274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=110713137809415274&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110713137809415274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110713137809415274'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/01/rich-but-very-generous.html' title='rich but very generous'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-110689771859396380</id><published>2005-01-28T17:35:00.000+10:00</published><updated>2007-09-28T00:54:04.438+10:00</updated><title type='text'>"when" is VB.NET better than C#?</title><content type='html'>I am surprised to learn that VB.NET has a language keyword not seen in C#. Specifically, exceptions can be conditionally caught using the VB.NET '&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vblr7/html/vastmThrow.asp"&gt;When&lt;/a&gt;' keyword. Here is an example demonstrating it in action&lt;br /&gt;&lt;br /&gt;Imports System&lt;br /&gt;&lt;br /&gt;Public Class App &lt;br /&gt;	Public Shared Sub Main ()&lt;br /&gt;&lt;br /&gt;		Dim a as Integer&lt;br /&gt;		Dim m as Integer&lt;br /&gt;	&lt;br /&gt;		Dim dt as DateTime = DateTime.Now&lt;br /&gt;&lt;br /&gt;		a = dt.Millisecond	&lt;br /&gt;&lt;br /&gt;		m = a Mod 2&lt;br /&gt;			&lt;br /&gt;		Try&lt;br /&gt;			Throw New ApplicationException ("Ooops")&lt;br /&gt;		Catch x as Exception When m = 0&lt;br /&gt;			Console.WriteLine ("m was zero")&lt;br /&gt;		End Try&lt;br /&gt;	End Sub&lt;br /&gt;End Class&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-110689771859396380?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/110689771859396380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=110689771859396380&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110689771859396380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110689771859396380'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/01/when-is-vbnet-better-than-c.html' title='&quot;when&quot; is VB.NET better than C#?'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-110679764658589772</id><published>2005-01-27T13:47:00.000+10:00</published><updated>2007-09-28T00:54:04.445+10:00</updated><title type='text'>BCL team blog</title><content type='html'>I have just discovered that the BCL team at Microsoft have a:  &lt;br /&gt;&lt;a href="http://weblogs.asp.net/bclteam/"&gt;blog&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-110679764658589772?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/110679764658589772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=110679764658589772&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110679764658589772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110679764658589772'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/01/bcl-team-blog.html' title='BCL team blog'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-110550163799000335</id><published>2005-01-12T13:47:00.000+10:00</published><updated>2007-09-28T00:54:04.453+10:00</updated><title type='text'>New year, new platform</title><content type='html'>It's the new year. I just upgraded my laptop to 1Gb RAM (it was 512MB) and purchased a 250Gb external hard disk. I created a Virtual PC Windows Server 2003 image that has .NET v2.0 (Whidbey Beta 1 refresh) installed - This is my first foray into unpicking what will be the first major release of the CLR and tools since v1.0. &lt;br /&gt;&lt;br /&gt;This moment reminds me of a similar moment I had in August 2000 when I received 4 VHS cassette tapes of the first run of the DevelopMentor Essential .NET class given by Don Box and Brent Rector...back then, I spent the next 3 months assimilating the technologies in preparation for delivering that class. &lt;br /&gt;&lt;br /&gt;Assimilating this time round will be much different. For one, I don't have any VHS cassettes of Don and Brent...this time I will be relying far more on my own insights and abilities to internalise what the software architects had in mind for this release of the platform.&lt;br /&gt;&lt;br /&gt;This release will be less of a challenge to grok since generally speaking it only adds new bits on top of the existing implementation, as opposed to last time which introduced a completely new programming platform to the existing COM/Win32 substrate.&lt;br /&gt;&lt;br /&gt;I will document my foray here. My starting point will be to write small programs that use the new features and then decompile them with ILDASM.EXE to see the 'reality' of what the tools are generating for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-110550163799000335?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/110550163799000335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=110550163799000335&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110550163799000335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110550163799000335'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2005/01/new-year-new-platform.html' title='New year, new platform'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-110110542576939704</id><published>2004-11-22T16:37:00.000+10:00</published><updated>2007-09-28T00:54:04.461+10:00</updated><title type='text'>how to add assemblies to references dialog in VS.NET</title><content type='html'>When you add a reference to an assembly in VS.NET, to get your assembly to appear in the list, do this:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"Create a new registry key (for example, one called InnerSystemAssemblies) beneath either of the following registry keys: &lt;br /&gt;HKEY_LOCAL_MACHINE\Software&lt;br /&gt;\Microsoft\.NETFramework\AssemblyFolders&lt;br /&gt;&lt;br /&gt;HKEY_CURRENT_USER\Software&lt;br /&gt;\Microsoft\.NETFramework\AssemblyFolders&lt;br /&gt;  &lt;br /&gt;Set the new key's default value to point to the folder that contains your assemblies. &lt;br /&gt;If you have Visual Studio .NET open, you must close it and then launch it again for the changes to take effect."&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;The above info is extracted directly from &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/tdlg_ch4.asp?frame=true"&gt;this page&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-110110542576939704?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/110110542576939704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=110110542576939704&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110110542576939704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110110542576939704'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/11/how-to-add-assemblies-to-references.html' title='how to add assemblies to references dialog in VS.NET'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-110100565617200189</id><published>2004-11-21T12:54:00.000+10:00</published><updated>2007-09-28T00:54:04.470+10:00</updated><title type='text'>depeche mode dot com</title><content type='html'>&lt;a href="http://www.depechemode.com/news/index.html#111604_newalbum"&gt;Depeche Mode are starting a new album/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-110100565617200189?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/110100565617200189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=110100565617200189&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110100565617200189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/110100565617200189'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/11/depeche-mode-dot-com.html' title='depeche mode dot com'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-109957505171684459</id><published>2004-11-04T23:30:00.000+10:00</published><updated>2007-09-28T00:54:04.478+10:00</updated><title type='text'>COM &amp; DCOM are now dead</title><content type='html'>The COM specification has had the plug pulled on it as the following link is now dead &lt;a href="http://www.microsoft.com/oledev/olecom/title.htm"&gt;http://www.microsoft.com/oledev/olecom/title.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The DCOM specification has also been erased from memory but I did find this last remnant:&lt;br /&gt;&lt;a href="http://www.lisp-p.org/nmcom/draft-brown-dcom-v1-spec-03.html"&gt;http://www.lisp-p.org/nmcom/draft-brown-dcom-v1-spec-03.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-109957505171684459?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/109957505171684459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=109957505171684459&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109957505171684459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109957505171684459'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/11/com-dcom-are-now-dead.html' title='COM &amp; DCOM are now dead'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-109780415401018315</id><published>2004-10-15T11:35:00.000+10:00</published><updated>2007-09-28T00:54:04.486+10:00</updated><title type='text'>Google search your hard disk</title><content type='html'>Looks like Google are in there first:&lt;a href="http://news.bbc.co.uk/2/hi/technology/3744228.stm"&gt;Google search becomes personal&lt;/a&gt; and you can download it from &lt;a href="http://desktop.google.com/"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-109780415401018315?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/109780415401018315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=109780415401018315&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109780415401018315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109780415401018315'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/10/google-search-your-hard-disk.html' title='Google search your hard disk'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-109774076477928404</id><published>2004-10-14T17:59:00.000+10:00</published><updated>2007-09-28T00:54:04.493+10:00</updated><title type='text'>Christopher Brumme - What is the future of the CLR?</title><content type='html'>Christopher Brumme gives some hints about the CLR post Longhorn in this video: &lt;a href="http://channel9.msdn.com/ShowPost.aspx?PostID=11150"&gt;What is the future of the CLR?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In summary, his main observations are about the Whidbey and Longhorn CLR's being one of maturing it from the initial concepts that became v1.0. Post Longhorn timeframe he cites "going nuts" with the CLR by taking advantage of the virtualised execution environment that CLR apps run in to change the way in which programs are executed. One can only imagine what kind of nutty features they might come up with&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-109774076477928404?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/109774076477928404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=109774076477928404&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109774076477928404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109774076477928404'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/10/christopher-brumme-what-is-future-of.html' title='Christopher Brumme - What is the future of the CLR?'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-109754762191618974</id><published>2004-10-12T12:20:00.000+10:00</published><updated>2007-09-28T00:54:04.501+10:00</updated><title type='text'>an improved object-&gt;xml rep</title><content type='html'>public void ToXmlWriter (System.IO.TextWriter wr) &lt;br /&gt;{&lt;br /&gt;    XmlSerializer ser = new XmlSerializer(this.GetType());&lt;br /&gt;&lt;br /&gt;    ser.Serialize (wr, this);&lt;br /&gt;}&lt;br /&gt;	&lt;br /&gt;public override string ToString()&lt;br /&gt;{&lt;br /&gt;   StringBuilder sb = new StringBuilder ();&lt;br /&gt;   StringWriter sw = new StringWriter (sb);&lt;br /&gt;&lt;br /&gt;   this.ToXmlWriter (sw);&lt;br /&gt;   return sb.ToString ();&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-109754762191618974?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/109754762191618974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=109754762191618974&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109754762191618974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109754762191618974'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/10/improved-object-xml-rep.html' title='an improved object-&gt;xml rep'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-109749173905894635</id><published>2004-10-11T20:48:00.000+10:00</published><updated>2007-09-28T00:54:04.508+10:00</updated><title type='text'>Zen of assembly binding policy</title><content type='html'>The assembly binding policy is complex but Alan describes&lt;a href="http://blogs.gotdotnet.com/alanshi/commentview.aspx/d4edb084-c625-4b6e-8e5c-7c2580cfcee9"&gt; the zen &lt;/a&gt;nicely&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-109749173905894635?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/109749173905894635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=109749173905894635&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109749173905894635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109749173905894635'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/10/zen-of-assembly-binding-policy.html' title='Zen of assembly binding policy'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-109693335543791226</id><published>2004-10-05T09:42:00.000+10:00</published><updated>2007-09-28T00:54:04.515+10:00</updated><title type='text'>.NET defined</title><content type='html'>In a recent &lt;a href="http://pluralsight.com/blogs/dbox/archive/2004/09/30/2493.aspx"&gt;blog entry&lt;/a&gt;, Don defines .NET as:&lt;br /&gt;"NET is a technology from Microsoft that combines XML Web Services (for remote integration) and the CLR (for local integration and execution). The CLR is an implementation of the ECMA CLI spec that is tightly integrated with Windows."&lt;br /&gt;&lt;br /&gt;I guess that's one way of looking at it - another way of looking at it is to draw on the Matrix and whether Agent Smith's words can assist us further (hint, replace the word "planet" with "Windows", replace the word "mammal" with "program" and replace the word "human" with "CLR"):&lt;br /&gt;&lt;br /&gt;"I'd like to share a revelation during my time here. It came to me when I tried to classify your species. I realized that you're not actually mammals. Every mammal on this planet instinctively develops a natural equilibrium with the surrounding environment but you humans do not. You move to an area and you multiply and multiply until every natural resource is consumed. The only way you can survive is to spread to another area. There is another organism on this planet that follows the same pattern. Do you know what it is? A virus. Human beings are a disease, a cancer of this planet. You are a plague, and we are the cure."&lt;br /&gt;&lt;br /&gt;;)&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-109693335543791226?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/109693335543791226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=109693335543791226&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109693335543791226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109693335543791226'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/10/net-defined.html' title='.NET defined'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-109635124254291662</id><published>2004-09-28T16:00:00.000+10:00</published><updated>2007-09-28T00:54:04.522+10:00</updated><title type='text'>Browsing namespaces in the MSDN just got a lot easier</title><content type='html'>Microsoft have made navigating the MSDN library class library namespaces simpler&lt;br /&gt;&lt;br /&gt;If you are wanting help on System.Threading classes then surf to&lt;br /&gt;http://msdn2.microsoft.com/library/System.Threading.aspx&lt;br /&gt;&lt;br /&gt;If you are wanting help on System.IO classes then surf to&lt;br /&gt;http://msdn2.microsoft.com/library/System.IO.aspx&lt;br /&gt;&lt;br /&gt;If you are wanting help on System.MarriageProblems&lt;br /&gt;http://msdn2.microsoft.com/library/System.MarriageProblems.aspx&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-109635124254291662?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/109635124254291662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=109635124254291662&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109635124254291662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109635124254291662'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/09/browsing-namespaces-in-msdn-just-got.html' title='Browsing namespaces in the MSDN just got a lot easier'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-109633018387182486</id><published>2004-09-28T10:09:00.000+10:00</published><updated>2007-09-28T00:54:04.528+10:00</updated><title type='text'>IIS6 Mapping .* to C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll</title><content type='html'>In previous versions of IIS you mapped .* to C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll when you wanted to pump everything through to the ASP.NET runtime. This is found by selecting the virtual directory-&gt;properties-&gt;configuration-&gt;Add and then typing in the executable as C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll and choosing an extension of .* and turning off the check box that verifies the file exists&lt;br /&gt;&lt;br /&gt;This has changed in IIS 6.0 - you go to the exact same place but now the dialog box is a little bigger and has an insert button that allows you to enter wildcard mapping directly and choose the order in which they are evaluated. It is here that you enter C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll and turn of the file existance check&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-109633018387182486?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/109633018387182486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=109633018387182486&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109633018387182486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109633018387182486'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/09/iis6-mapping-to-cwindowsmicrosoftnetfra.html' title='IIS6 Mapping .* to C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-109585421293082804</id><published>2004-09-22T21:56:00.000+10:00</published><updated>2007-09-28T00:54:04.534+10:00</updated><title type='text'>Microsoft Download Center Search Results</title><content type='html'>Well worth checking out: &lt;a href="http://www.microsoft.com/downloads/results.aspx?NextOrPrevClause=1%7c-4556&amp;amp;OSID=&amp;amp;productID=&amp;amp;CategoryID=&amp;amp;freetext=Channel+9&amp;amp;DisplayLang=en&amp;amp;DisplayEnglishAlso=&amp;amp;sortCriteria=popularity"&gt;Channel 9 videos&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-109585421293082804?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/109585421293082804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=109585421293082804&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109585421293082804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109585421293082804'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/09/microsoft-download-center-search.html' title='Microsoft Download Center Search Results'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-109582893807568839</id><published>2004-09-22T14:54:00.000+10:00</published><updated>2007-09-28T00:54:04.541+10:00</updated><title type='text'>shaji's blog</title><content type='html'>&lt;a href="http://shajisethu.blogspot.com/"&gt;shaji's blog&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-109582893807568839?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/109582893807568839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=109582893807568839&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109582893807568839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109582893807568839'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/09/shajis-blog.html' title='shaji&apos;s blog'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-109523147411356100</id><published>2004-09-15T16:57:00.000+10:00</published><updated>2007-09-28T00:54:04.551+10:00</updated><title type='text'>ToXmlMemoryStream() &amp; ToXml() &amp; ToXmlString()</title><content type='html'>public virtual System.Xml.XmlNode ToXml ()&lt;br /&gt;{&lt;br /&gt;MemoryStream ms = this.ToXmlMemoryStream ();&lt;br /&gt;&lt;br /&gt;XmlReader rdr = new XmlTextReader (ms); &lt;br /&gt;&lt;br /&gt;System.Xml.XmlDocument doc = new XmlDocument ();&lt;br /&gt;doc.Load (rdr);&lt;br /&gt;return doc.DocumentElement; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public MemoryStream ToXmlMemoryStream () {&lt;br /&gt;MemoryStream ms = new MemoryStream ();&lt;br /&gt;&lt;br /&gt;XmlSerializer ser;&lt;br /&gt;ser = new XmlSerializer(this.GetType());&lt;br /&gt;&lt;br /&gt;ser.Serialize(ms, this); &lt;br /&gt;ms.Seek (0, SeekOrigin.Begin);&lt;br /&gt;&lt;br /&gt;return ms;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public string ToXmlString()&lt;br /&gt;{&lt;br /&gt;MemoryStream ms = this.ToXmlMemoryStream ();&lt;br /&gt;&lt;br /&gt;StreamReader sr = new StreamReader (ms);&lt;br /&gt;return sr.ReadToEnd ();&lt;br /&gt;}&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-109523147411356100?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/109523147411356100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=109523147411356100&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109523147411356100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109523147411356100'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/09/toxmlmemorystream-toxml-toxmlstring.html' title='ToXmlMemoryStream() &amp; ToXml() &amp; ToXmlString()'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-109521337915702703</id><published>2004-09-15T11:56:00.000+10:00</published><updated>2007-09-28T00:54:04.559+10:00</updated><title type='text'>Two types of software developer</title><content type='html'>In 1993, I graduated from Wolverhampton University (it was Wolverhampton Polytechnic when I started in 1989 but John Major decided to level that playing field in 1992) in &lt;a href="http://asp.wlv.ac.uk/CourseFinder.asp?id=10835&amp;type=1"&gt;computer science&lt;/a&gt;. I was taught reasonably gnarly stuff like assembly language programming, Nand gates, the C programming language, how a linker works and most importantly what the 7 layers are there for - They didn't teach us about the physics we were sitting on top of but we were educated about everything from the bit level upwards. When I finished my last exam on June 15th 1993 I emerged into a sunny summers day feeling ready to take on anything software related - I felt bullet proof. I considered myself an artist because I truly believed that software development was just another form of art and I had graduated with honours. I also felt part of an elite group of professionals who were qualified to build the computer applications of tomorrow. As is sometimes the case, the vision and the reality are not always the same. &lt;br /&gt;&lt;br /&gt;If I was working in the field of medicine as a general practitioner, I think I would be surprised to learn that some guy who in their last job was a plumber had just opened up shop as a general medical practioner down the road from me. If this analogy is transferred to software development then it is not at all surprising to hear that someone last week who was working in sales is today a "software developer". Software development today is truly in the hands of the masses. The platforms, tools and languages that Microsoft and other vendors produce certainly make it feasible for someone with little or no knowledge of software development to build an application. Software has made software construction much easier. In most cases though, without guidance or experience the end result will be suboptimal. The reason I believe this to be true is because I still maintain the belief that software creation is an art that is learned and even the advanced tools we now have won't save you - that coupled with the worn out expression "garbage in, garbage out" is still as true today as it ever was. If you give a paintbrush to 6 month old baby, it is highly unlikely that it will paint a masterpiece that people other than the parents will revere.&lt;br /&gt;&lt;br /&gt;Google has contributed an interesting twist to the story because we have Google inheritance in software development (which is really just a fancy extension of clipboard inheritance - and of course, clipboard inheritance was the primary means of sharing code before the internet was invented in 1994....). The problem with Google inheritance is that many "software developers" use this as their primary means of building an application and assume that whatever has been published on the internet as a code sample must be bug free and perform exactly as intended. Don't get me wrong, I have used Google inheritance before and will do it again in the future I dare say, but I continually witness whole code samples being used as solutions without any analysis of whether the code should be changed or even reduced to remove extraneous functionality. I care about performance and contrary to popular belief, size is important and so minimizing the process working set is always as good a place to start as any. Microsoft are very conscious of Google inheritance and work hard internally to make sure that any code samples they publish are as high quality as is humanly possible - they know that any source code they put out is likely to be pasted into some app somewhere, sometime.&lt;br /&gt;&lt;br /&gt;I must say, software development did not turn out quite how I envisaged it would back in summer 1993.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-109521337915702703?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/109521337915702703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=109521337915702703&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109521337915702703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109521337915702703'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/09/two-types-of-software-developer.html' title='Two types of software developer'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-109508826900063986</id><published>2004-09-14T01:11:00.000+10:00</published><updated>2007-09-28T00:54:04.565+10:00</updated><title type='text'>The Third Reich Day by Day</title><content type='html'>I have been reading &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0760311676/qid=1095087760/sr=1-3/ref=sr_1_3/002-5791645-7817658?v=glance&amp;amp;s=books"&gt;The Third Reich Day by Day&lt;/a&gt; and I am quite horrified by what I am reading. I think everyone has some idea of what went on but closer inspection really defies belief of what that regime actually went and did to fellow human beings. I am a huge fan of &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0451524934/qid=1095087866/sr=ka-1/ref=pd_ka_1/002-5791645-7817658"&gt;1984&lt;/a&gt; and am amazed at just how much I implicitly knew about the third reich from reading George Owell's masterpiece all those years ago.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-109508826900063986?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/109508826900063986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=109508826900063986&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109508826900063986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109508826900063986'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/09/third-reich-day-by-day.html' title='The Third Reich Day by Day'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-109479946793092383</id><published>2004-09-10T16:57:00.000+10:00</published><updated>2007-09-28T00:54:04.571+10:00</updated><title type='text'>Ivan fighting</title><content type='html'>I have been following &lt;a href="http://news.bbc.co.uk/1/hi/health/3600716.stm"&gt;Ivan Noble's tumour diary &lt;/a&gt;since it first appeared on the &lt;a href="http://news.bbc.co.uk"&gt;BBC News website&lt;/a&gt;. I'm roughly the same age as Ivan and feel enormous sorrow for him and his family. He's had a brain tumour for 2 years now and he is fighting one day at a time. I wish him all the best.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-109479946793092383?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/109479946793092383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=109479946793092383&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109479946793092383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109479946793092383'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/09/ivan-fighting.html' title='Ivan fighting'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-109109519183186500</id><published>2004-07-29T19:59:00.000+10:00</published><updated>2004-07-29T19:59:51.830+10:00</updated><title type='text'>Bank error in your favour, collect 243 dollars....</title><content type='html'>I just received a letter from my bank (Commonwealth Bank) which I am going to frame and mount on a wall in my study. The letter advised me of a credit alteration made to my deposit account of $243.85&lt;br /&gt;&lt;br /&gt;Here is a direct quote from the letter:&lt;br /&gt;&lt;br /&gt;"The error occurred due to:&lt;br /&gt;Error in addition"&lt;br /&gt;&lt;br /&gt;:-|&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-109109519183186500?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/109109519183186500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=109109519183186500&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109109519183186500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109109519183186500'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/07/bank-error-in-your-favour-collect-243.html' title='Bank error in your favour, collect 243 dollars....'/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-109022429665880125</id><published>2004-07-19T18:04:00.000+10:00</published><updated>2004-07-19T18:04:56.656+10:00</updated><title type='text'></title><content type='html'>I signed up for gmail and it rocks - really fast response time but that could be a function of the number of people using it at the moment - but conforms to the google UI's which are always clean and simple, just how I like them!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-109022429665880125?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/109022429665880125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=109022429665880125&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109022429665880125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/109022429665880125'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/07/i-signed-up-for-gmail-and-it-rocks.html' title=''/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-108969831257737088</id><published>2004-07-13T15:58:00.000+10:00</published><updated>2004-07-13T15:58:32.576+10:00</updated><title type='text'></title><content type='html'>I'm in a situation where I may need to make webservice invocations over SSL (as opposed to using WS-Security). This is actually quite an easy thing to do. &lt;br /&gt;&lt;br /&gt;Here are the steps to getting this to happen on the Microsoft platform:&lt;br /&gt;&lt;br /&gt;1) Install a certificate into IIS (&lt;a href="http://steverodgers.blogspot.com/2004_07_01_steverodgers_archive.html#108969450861073755"&gt;See last blog entry on how to do that&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;2) Write yourself a ASMX and drop it into a virtual directory that is secured (in IIS snap-in go properties on the virtual directory-&gt;Directory Security-&gt;Secure Communications-&gt;Edit-&gt;Require Secure Channel (SSL)&lt;br /&gt;&lt;br /&gt;3) Generate the client proxy: I'd normally go straight to wsdl.exe and do something like this: e.g. wsdl.exe https://foo/app/a.asmx?wsdl&lt;br /&gt;&lt;br /&gt;But in my case it barfed with a "Could not establish trust relationship with Remote Server" because of the https - maybe there's a command line switch I could have used to get around this but I was in a bit of a hurry, so....&lt;br /&gt;&lt;br /&gt;...I cranked up IE and surfed to the secure website with the same address, did a view source, saved the WSDL document into a directory and then ran wsdl.exe over it: e.g. wsdl.exe appwsdl.wsdl&lt;br /&gt;&lt;br /&gt;4) Author a client program that uses the wsdl.exe generated class&lt;br /&gt;&lt;br /&gt;This bit should be straight forward but the "Could not establish trust relationship with Remote Server" exception will pop up in your face, so I followed &lt;a href="http://weblogs.asp.net/jan/archive/2003/12/04/41154.aspx"&gt;Jan TieLen's advice&lt;/a&gt; and added a class and a line of code to my client.&lt;br /&gt;&lt;br /&gt;Here are my programs:&lt;br /&gt;&lt;br /&gt;//////Server (a.asmx)&lt;br /&gt;&amp;gt%@ webservice language="c#" class="adder" %&amp;lt&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Web.Services;&lt;br /&gt;&lt;br /&gt;public class adder : WebService {&lt;br /&gt;	[WebMethod] &lt;br /&gt;	public int Add (int a, int b) { return a + b; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//////Client (client.cs)&lt;br /&gt;using System;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Net;&lt;br /&gt;using System.Web.Services;&lt;br /&gt;using System.Security.Cryptography.X509Certificates;&lt;br /&gt;&lt;br /&gt;public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy&lt;br /&gt;{&lt;br /&gt; public TrustAllCertificatePolicy() &lt;br /&gt; {}&lt;br /&gt;&lt;br /&gt; public bool CheckValidationResult(ServicePoint sp,  X509Certificate cert,WebRequest req, int problem)&lt;br /&gt; {&lt;br /&gt;  return true;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class App {&lt;br /&gt;	static void Main () {&lt;br /&gt;		System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();&lt;br /&gt;		&lt;br /&gt;&lt;br /&gt;		adder a = new adder ();&lt;br /&gt;&lt;br /&gt;		Console.WriteLine ("2+3={0}", a.Add (2, 3));&lt;br /&gt;	}&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-108969831257737088?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/108969831257737088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=108969831257737088&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/108969831257737088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/108969831257737088'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/07/im-in-situation-where-i-may-need-to.html' title=''/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-108969450861073755</id><published>2004-07-13T14:55:00.000+10:00</published><updated>2004-07-19T17:19:15.923+10:00</updated><title type='text'></title><content type='html'>I don't setup SSL into IIS very often so it's always a painful process trying to remember how to do it each time. But I just found and tried out&amp;nbsp; &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/SecNetHT16.asp"&gt;this very useful document&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-108969450861073755?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/108969450861073755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=108969450861073755&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/108969450861073755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/108969450861073755'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/07/i-dont-setup-ssl-into-iis-very-often.html' title=''/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5923247.post-108964167332644131</id><published>2004-07-13T00:14:00.000+10:00</published><updated>2004-07-13T00:14:33.326+10:00</updated><title type='text'></title><content type='html'>I think I have found the best &lt;a href="http://www.bbc.co.uk/totp2/videoclips/date/1987/"&gt;link&lt;/a&gt; of all time&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5923247-108964167332644131?l=steverodgers.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://steverodgers.blogspot.com/feeds/108964167332644131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5923247&amp;postID=108964167332644131&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/108964167332644131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5923247/posts/default/108964167332644131'/><link rel='alternate' type='text/html' href='http://steverodgers.blogspot.com/2004/07/i-think-i-have-found-best-link-of-all.html' title=''/><author><name>Steve J Rodgers</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='25' src='http://photos1.blogger.com/img/212/1723/320/2.jpg'/></author><thr:total>0</thr:total></entry></feed>
