<?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-50290113271213162</id><updated>2012-01-02T00:02:24.755-05:00</updated><category term='ruby'/><category term='wcf'/><category term='animals'/><category term='pc'/><category term='linq'/><category term='continuous integration'/><category term='workflow'/><category term='books'/><category term='ajax'/><category term='security'/><category term='weird stuff'/><category term='BizTalk'/><category term='red gate'/><category term='games'/><category term='music'/><category term='privacy'/><category term=':)'/><category term='mvc'/><category term='c#'/><category term='regex'/><category term='xfn'/><category term='buzz'/><category term='win 7'/><category term='people'/><category term='job search'/><category term='agile'/><category term='sql'/><category term='cms'/><category term='code quality'/><category term='tools and gadgets'/><category term='mac'/><category term='unit testing'/><category term='asp.net'/><category term='design'/><category term='performance'/><category term='fsdl'/><category term='architecture'/><category term='cruise control'/><category term='blogging'/><category term='learning'/><category term='introverted programming'/><category term='vista'/><title type='text'>Lazy Loading</title><subtitle type='html'>In a restless search of ways to defer everything to the point at which it is absolutely needed</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default?start-index=101&amp;max-results=100'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>148</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-626321302538011624</id><published>2012-01-02T00:00:00.000-05:00</published><updated>2012-01-02T00:02:24.764-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Worktime music: as IT as it gets</title><content type='html'>&lt;div style="text-align: center; clear: both" class="separator"&gt;&amp;#160;&lt;/div&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:8fa2f9f5-7e65-4cc2-a9cf-2baa17dfec21" class="wlWriterEditableSmartContent"&gt;&lt;div id="cff8ca50-8b25-4819-b859-0ec88bb3ec10" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=w68qZ8JvBds&amp;amp;feature=player_embedded" target="_new"&gt;&lt;img src="http://lh3.ggpht.com/-mtOkXIheOGY/TwE6YLHBgZI/AAAAAAAAA-8/PiG4bCwKVks/videoc5990d041c46%25255B3%25255D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('cff8ca50-8b25-4819-b859-0ec88bb3ec10'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/w68qZ8JvBds?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/w68qZ8JvBds?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;448\&amp;quot; height=\&amp;quot;252\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-626321302538011624?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/626321302538011624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=626321302538011624' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/626321302538011624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/626321302538011624'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2012/01/worktime-music-as-it-as-it-gets.html' title='Worktime music: as IT as it gets'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-mtOkXIheOGY/TwE6YLHBgZI/AAAAAAAAA-8/PiG4bCwKVks/s72-c/videoc5990d041c46%25255B3%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-4777479690448693242</id><published>2011-10-05T22:13:00.002-05:00</published><updated>2011-10-05T22:14:50.463-05:00</updated><title type='text'>The fighter</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/-jBPj9olyi7Q/To0X14wt40I/AAAAAAAAA-Q/sXRZWDUhl2g/s1600/Jobs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="269" src="http://3.bp.blogspot.com/-jBPj9olyi7Q/To0X14wt40I/AAAAAAAAA-Q/sXRZWDUhl2g/s320/Jobs.png" width="320" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;I've never been a fun of "Apple" as a company but I feel very sad. For the man, for the epoch, for something what is gone forever.&lt;br /&gt;The introduction of the iPhone 4S which stirred so much controversy yesterday, looks almost like a spiritual act now.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-4777479690448693242?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/4777479690448693242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=4777479690448693242' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4777479690448693242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4777479690448693242'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2011/10/fighter.html' title='The fighter'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-jBPj9olyi7Q/To0X14wt40I/AAAAAAAAA-Q/sXRZWDUhl2g/s72-c/Jobs.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-8463202324303064101</id><published>2011-09-07T18:34:00.001-05:00</published><updated>2011-10-01T10:38:46.167-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='weird stuff'/><category scheme='http://www.blogger.com/atom/ns#' term=':)'/><title type='text'>What to do with too much time on hands</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.instructables.com/static/img/header/robot.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" src="http://www.instructables.com/static/img/header/robot.png" /&gt;&lt;/a&gt;&lt;/div&gt;Just found an awesome site which explains how to make everything from something else - &lt;a href="http://www.instructables.com/"&gt;Instructables.&lt;/a&gt;&lt;br /&gt;If you ever had a desire to heat your house with DIY solar batteries, become a proud owner of a magnet-swallowing pulp or wondered, what old Altoids box is good for - and you have some spare time and persistent curiosity - that's your place.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-8463202324303064101?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/8463202324303064101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=8463202324303064101' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/8463202324303064101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/8463202324303064101'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2011/09/what-to-do-with-too-much-time-on-hands.html' title='What to do with too much time on hands'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-6817724430428391531</id><published>2011-05-12T19:25:00.000-05:00</published><updated>2011-05-16T07:26:57.753-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools and gadgets'/><title type='text'>Long live .NET Reflector. Part II “The New Hope”</title><content type='html'>Great news! &lt;a href="http://www.jetbrains.com/index.html" target="_blank"&gt;Jet Brains&lt;/a&gt;, the magicians behind &lt;a href="http://www.jetbrains.com/resharper/" target="_blank"&gt;Resharper&lt;/a&gt; and &lt;a href="http://www.jetbrains.com/teamcity/" target="_blank"&gt;Team City&lt;/a&gt;, are out on a quest to &lt;strike&gt;save us from misery&lt;/strike&gt; show us the light. &lt;a href="http://www.jetbrains.com/decompiler/" target="_blank"&gt;dotPeek&lt;/a&gt; is their brand new .NET decompiler, still in early build, but live and kicking. &lt;br /&gt;&lt;a href="http://lazyloading.blogspot.com/2011/05/long-live-net-reflector.html" target="_blank"&gt;I sincerely mourned&lt;/a&gt; the Reflector’s untimely “departure” and the timing couldn’t be better! The new tool is free-of-charge, which is against any commercial sense, according to the Red Gate. And I am pretty sure that Jet Brains will figure out some smart licensing, as they did with the awesome Team City (even if it won’t be free in the future, I’d rather pay for dotPeek, than Reflector).&lt;br /&gt;&lt;img src="http://farm4.static.flickr.com/3335/5713688051_de0a75926a_z.jpg" /&gt;&lt;br /&gt;The interface is pretty slick and should look familiar to Resharper users – it even has the same Usage windows! Tabs in the code window is definitely a welcomed addition. There are tons of other features which I didn’t have time to explore yet.&lt;br /&gt;The only thing I am missing so far is the Reflector-style navigation using type names as links. There are few bugs, but remembering Resharper early days I am perfectly OK with it – Jet Brains proved that they can quickly react on user’s feedback. Application size is noticeably bigger, than Reflector but it will be probably &lt;strike&gt;eventually&lt;/strike&gt; optimized down.&lt;br /&gt;Undeniably the best part in this news – we have a choice again.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-6817724430428391531?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/6817724430428391531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=6817724430428391531' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6817724430428391531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6817724430428391531'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2011/05/long-live-net-reflector-part-ii-new.html' title='Long live .NET Reflector. Part II “The New Hope”'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3335/5713688051_de0a75926a_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-165178276818972258</id><published>2011-05-08T12:58:00.001-05:00</published><updated>2011-05-08T12:58:24.277-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term=':)'/><title type='text'>Why I enjoy software development</title><content type='html'>&lt;p&gt;Because I have one of these moments weekly&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.damnlol.com/pics/301/6f8fd39c3ee06fec2ca2e49ebda6c737.jpg" /&gt;&lt;/p&gt;  &lt;p align="left"&gt;&lt;sup&gt;seen on &lt;a href="http://www.damnlol.com/funniest-thing-ive-seen-all-week-1351.html" target="_blank"&gt;Damn LOL&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-165178276818972258?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/165178276818972258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=165178276818972258' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/165178276818972258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/165178276818972258'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2011/05/why-i-enjoy-software-development.html' title='Why I enjoy software development'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-2974116346106670022</id><published>2011-05-07T07:50:00.000-05:00</published><updated>2011-05-08T12:59:21.277-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><category scheme='http://www.blogger.com/atom/ns#' term='workflow'/><title type='text'>Managing workflows with WorkflowControlClient</title><content type='html'>How the heck does it work?! MSDN is surprisingly unhelpful on this matter (list of class members with couple of very obvious one-line snippets is a mockery of documentation).&lt;br /&gt;Unfortunately, when configuring the IWorkflowInstanceManagement interface you have to be very precise. Let’s do it step by step, and while we are at that, let’s make the service implementation more WCF-compliant.&lt;br /&gt;&lt;b&gt;1. Make your workflow service &lt;/b&gt;&lt;a href="http://blogs.msdn.com/b/rjacobs/archive/2010/07/30/making-a-workflowservice-work-like-a-wcf-service.aspx" target="_blank"&gt;&lt;b&gt;implement a contract&lt;/b&gt;&lt;/a&gt;&lt;b&gt;.&lt;/b&gt; There won’t be a magic but rather a trick – the workflow service will think that it exposes an interface, name of which you typed in the ServiceContractName of your Receive shapes after &lt;i&gt;{http://tempuri.org}&lt;/i&gt; (if you didn’t – do it) and it accidentally matches the interface with the same name in your code (or something similar to that).    &lt;br /&gt;In our case let’s name the XAML interface &lt;i&gt;{http://TeddyBearStore.com/Contracts/}ITeddyBearService&lt;/i&gt; and our “artificial interface” -&lt;i&gt; TeddyBearStore.Contracts.ITeddyBearService&lt;/i&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;2. Make WF service look like good old WCF.&lt;/b&gt; By default WF service, hosted in IIS is exposed as a magic no-name service: &lt;i&gt;service&lt;/i&gt; tag is completely missing and only nameless &lt;i&gt;ServiceBehavior&lt;/i&gt; allows some primitive configuration.&lt;/p&gt;&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.serviceModel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;behaviors&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;serviceBehaviors&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;behavior&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;serviceMetadata&lt;/span&gt; &lt;span class="attr"&gt;httpGetEnabled&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&amp;lt;!--&amp;lt;sqlWorkflowInstanceStore connectionStringName="WF4Persistence" /&amp;gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;serviceDebug&lt;/span&gt; &lt;span class="attr"&gt;includeExceptionDetailInFaults&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;behavior&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;serviceBehaviors&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;behaviors&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;system.serviceModel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;You can make it more WCF-like by adding a real service in the configuration file and naming the behavior:&lt;/p&gt;&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;services&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;service&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="TeddyBearService"&lt;/span&gt; &lt;span class="attr"&gt;behaviorConfiguration&lt;/span&gt;&lt;span class="kwrd"&gt;="workflowServiceBehavior"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;endpoint&lt;/span&gt; &lt;span class="attr"&gt;address&lt;/span&gt;&lt;span class="kwrd"&gt;=""&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;binding&lt;/span&gt;&lt;span class="kwrd"&gt;="basicHttpBinding"&lt;/span&gt; &lt;span class="attr"&gt;bindingConfiguration&lt;/span&gt;&lt;span class="kwrd"&gt;="myBasicHttpBinding"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;contract&lt;/span&gt;&lt;span class="kwrd"&gt;="ITeddyBearService"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;service&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;services&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Very, very important for the Workflow Control Client – &lt;u&gt;the service name must match exactly&lt;/u&gt; the ConfigurationName property (can be found at the top of the XAML file or in the Properties window in the workflow designer window).&lt;/p&gt;&lt;p&gt;&lt;b&gt;3. Add the Workflow Control Endpoint:&lt;/b&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;services&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;service&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="TeddyBearService"&lt;/span&gt; &lt;span class="attr"&gt;behaviorConfiguration&lt;/span&gt;&lt;span class="kwrd"&gt;="workflowServiceBehavior"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;endpoint&lt;/span&gt; &lt;span class="attr"&gt;address&lt;/span&gt;&lt;span class="kwrd"&gt;=""&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;binding&lt;/span&gt;&lt;span class="kwrd"&gt;="basicHttpBinding"&lt;/span&gt; &lt;span class="attr"&gt;bindingConfiguration&lt;/span&gt;&lt;span class="kwrd"&gt;="myBasicHttpBinding"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;contract&lt;/span&gt;&lt;span class="kwrd"&gt;="ITeddyBearService"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;endpoint&lt;/span&gt; &lt;span class="attr"&gt;address&lt;/span&gt;&lt;span class="kwrd"&gt;="wce"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;binding&lt;/span&gt;&lt;span class="kwrd"&gt;="basicHttpBinding"&lt;/span&gt;  &lt;span class="attr"&gt;bindingConfiguration&lt;/span&gt;&lt;span class="kwrd"&gt;="myBasicHttpBinding"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;kind&lt;/span&gt;&lt;span class="kwrd"&gt;="workflowControlEndpoint"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;service&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;services&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;b&gt;4. Add &lt;/b&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee358762.aspx" target="_blank"&gt;&lt;b&gt;standard endpoint&lt;/b&gt;&lt;/a&gt;&lt;b&gt; description.&lt;/b&gt; They might be accessible by default but I did not bother to test this assumption, so add them in the web.config anyway. This is your last step for the service side.&lt;/p&gt;&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;services&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;service&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="TeddyBearService"&lt;/span&gt; &lt;span class="attr"&gt;behaviorConfiguration&lt;/span&gt;&lt;span class="kwrd"&gt;="workflowServiceBehavior"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;endpoint&lt;/span&gt; &lt;span class="attr"&gt;address&lt;/span&gt;&lt;span class="kwrd"&gt;=""&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;binding&lt;/span&gt;&lt;span class="kwrd"&gt;="basicHttpBinding"&lt;/span&gt; &lt;span class="attr"&gt;bindingConfiguration&lt;/span&gt;&lt;span class="kwrd"&gt;="myBasicHttpBinding"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;contract&lt;/span&gt;&lt;span class="kwrd"&gt;="ITeddyBearService"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;endpoint&lt;/span&gt; &lt;span class="attr"&gt;address&lt;/span&gt;&lt;span class="kwrd"&gt;="wce"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;binding&lt;/span&gt;&lt;span class="kwrd"&gt;="basicHttpBinding"&lt;/span&gt;  &lt;span class="attr"&gt;bindingConfiguration&lt;/span&gt;&lt;span class="kwrd"&gt;="myBasicHttpBinding"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;kind&lt;/span&gt;&lt;span class="kwrd"&gt;="workflowControlEndpoint"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;service&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;services&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;standardEndpoints&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;workflowControlEndpoint&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;standardEndpoint&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;workflowControlEndpoint&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;standardEndpoints&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;b&gt;5. Add client endpoints&lt;/b&gt;, one for your service (remember the “artificial” &lt;i&gt;TeddyBearStore.Contracts.ITeddyBearService&lt;/i&gt; contract?) and another - for the &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.activities.workflowcontrolclient.aspx" target="_blank"&gt;Workflow Control Client&lt;/a&gt; functionality, which is essentially gives you an access to the AppFabricesque goodness. Note that the latter has &lt;i&gt;/wce&lt;/i&gt; added to the address because the XAML service will refuse to expose both contracts from the same address.&lt;/p&gt;&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;client&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;endpoint&lt;/span&gt;  &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="TeddyBearEndpoint"&lt;/span&gt; &lt;span class="attr"&gt;address&lt;/span&gt;&lt;span class="kwrd"&gt;="http://localhost/TeddyBearStore/Services/TeddyBear.xamlx"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;binding&lt;/span&gt;&lt;span class="kwrd"&gt;="basicHttpBinding"&lt;/span&gt; &lt;span class="attr"&gt;bindingConfiguration&lt;/span&gt;&lt;span class="kwrd"&gt;="myBasicHttpBinding"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;contract&lt;/span&gt;&lt;span class="kwrd"&gt;="TeddyBearStore.Contracts.ITeddyBearService"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;endpoint&lt;/span&gt;  &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="TeddyBearControlEndpoint" &lt;/span&gt;&lt;span class="attr"&gt;address&lt;/span&gt;&lt;span class="kwrd"&gt;="http://localhost/TeddyBearStore/Services/TeddyBear.xamlx/wce"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;binding&lt;/span&gt;&lt;span class="kwrd"&gt;="basicHttpBinding"&lt;/span&gt; &lt;span class="attr"&gt;bindingConfiguration&lt;/span&gt;&lt;span class="kwrd"&gt;="myBasicHttpBinding"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;contract&lt;/span&gt;&lt;span class="kwrd"&gt;="System.ServiceModel.Activities.IWorkflowInstanceManagement"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;client&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;b&gt;6. Embrace the power.&lt;/b&gt; Now finally you have a fine-tuned control over you workflow services:&lt;/p&gt;&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;WorkflowControlClient client = &lt;span class="kwrd"&gt;new&lt;/span&gt; WorkflowControlClient(&lt;span class="str"&gt;"TeddyBearControlEndpoint"&lt;/span&gt;);&lt;br /&gt;client.Terminate(id);&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Enjoy.&lt;/p&gt;&lt;p&gt;Special thanks to: &lt;a href="http://leonwoo-tech.blogspot.com/2011_05_01_archive.html" target="_blank"&gt;Leon Woo&lt;/a&gt;, &lt;a href="http://www.funkymule.com/post/2010/04/28/how-to-resume-suspended-workflows-in-net-40.aspx" target="_blank"&gt;Funky Mule&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/b/rjacobs/" target="_blank"&gt;Ron Jacobs&lt;/a&gt;&lt;br /&gt;Thanks to: &lt;a href="http://stackoverflow.com/questions/3281891/windows-workflow-4-difference-between-workflowapplication-cancel-terminate-and" target="_blank"&gt;StackOverflow&lt;/a&gt;&lt;br /&gt;No thanks to: MSDN&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-2974116346106670022?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/2974116346106670022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=2974116346106670022' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/2974116346106670022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/2974116346106670022'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2011/05/controlling-workflows-with.html' title='Managing workflows with WorkflowControlClient'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-1676596606759375356</id><published>2011-05-05T09:05:00.001-05:00</published><updated>2011-05-05T09:17:05.590-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='buzz'/><category scheme='http://www.blogger.com/atom/ns#' term='red gate'/><title type='text'>Long live .NET Reflector</title><content type='html'>&lt;p&gt;Of course it has happened.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://reflector.red-gate.com/download.aspx?TreatAsUpdate=1" target="_blank"&gt;&lt;img style="display: inline" src="http://farm6.static.flickr.com/5021/5690445296_c70e68ef66_z.jpg" width="464" height="592" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lazyloading.blogspot.com/2008/08/red-gate-again-gruesome-news.html" target="_blank"&gt;I’ve blogged about .NET Reflector acquisition two years ago&lt;/a&gt;. I called news “gruesome” and reflected (sic!) on my (recent then) &lt;a href="http://lazyloading.blogspot.com/2008/08/managing-continuous-database.html" target="_blank"&gt;experience with the Red Gate&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I’ve got called out on &lt;a href="http://lazyloading.blogspot.com/2008/08/managing-continuous-database.html?showComment=1219363140000#c7657345024747882507" target="_blank"&gt;both&lt;/a&gt; &lt;a href="http://lazyloading.blogspot.com/2008/08/red-gate-again-gruesome-news.html?showComment=1219363860000#c8017358061299921648" target="_blank"&gt;cases&lt;/a&gt; by Joint CEO &lt;a href="http://www.red-gate.com/our-company/careers/people-profiles/co-founder-and-joint-ceo2" target="_blank"&gt;Simon Galbraith&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;font color="#666666"&gt;[&amp;quot;free community 30-day trial&amp;quot;] – … isn't our plan.          &lt;br /&gt;We bought the website sqlserversentral.com a couple of years ago and there was similar concern from the sql professional community then. Since then we've kept the site free, removed most of the ads, upped the quality and multiplied traffic by 3 - there are now more than 850,000 members up from ~200,000 at the time of purchase.           &lt;br /&gt;We've not ironed out exactly what we'll do with Reflector (because we've not had a chance to interact with the Reflector user community) but we bought it because it is popular and has a passionate user base - we'd be fools to damage either of those things.           &lt;br /&gt;Simon Galbraith           &lt;br /&gt;Joint CEO           &lt;br /&gt;Red Gate Software&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;As it turned out he spoke the truth: there is no plans for the “&lt;em&gt;Free Community 30-days trial”&lt;/em&gt; there is a &lt;em&gt;“14-day Trial”&lt;/em&gt; version, it is a big difference, folks. Neither I can deny that &lt;u&gt;sqlserversentral.com&lt;/u&gt; is still around – as a marketing tool, collecting emails from subscribers (oh, wait! I remember the site now – it is in my &lt;a href="http://www.greghughes.net/rant/HowToExcludeADomainFromYourGoogleSearchResults.aspx" target="_blank"&gt;Google excluded searches list&lt;/a&gt;, because when you are in a hurry to find an answer, it offers you to register). &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:3780a43e-144f-4bc4-bba4-baf11907d58b" class="wlWriterEditableSmartContent"&gt;&lt;div id="77dfecf4-a0ed-482c-88e4-576e5b16b308" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=TKnEjiSGZLA" target="_new"&gt;&lt;img src="http://lh6.ggpht.com/_9VEJgnb1eR0/TcKxYAdbp2I/AAAAAAAAA8o/b7qwJX7IQ2U/video795d4f8d635f%5B10%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('77dfecf4-a0ed-482c-88e4-576e5b16b308'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;508\&amp;quot; height=\&amp;quot;285\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/TKnEjiSGZLA?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/TKnEjiSGZLA?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;508\&amp;quot; height=\&amp;quot;285\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="width:508px;clear:both;font-size:.8em"&gt;.&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&lt;comments&gt;&lt;a href="http://www.youtube.com/watch?v=TKnEjiSGZLA&amp;amp;feature=player_embedded" target="_blank"&gt;&lt;sub&gt;Comments sum it up nicely. I can’t agree with some emotions, but I share the feelings.&lt;/sub&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I sincerely hope that commercially senseless &lt;a href="http://www.joelonsoftware.com/" target="_blank"&gt;Spolsky&lt;/a&gt; and &lt;a href="http://www.codinghorror.com/blog/" target="_blank"&gt;Atwood&lt;/a&gt; both are or will be millionaires – god speed! &lt;a href="http://stackoverflow.com/" target="_blank"&gt;Stack Overflow&lt;/a&gt; is an example of how you can turn a respect of the community to a profit. &lt;/p&gt;  &lt;p&gt;Sad but true – trust is unprofitable. As developers in hearts, the decision makers are probably sympathetic but &lt;a href="http://www.imdb.com/title/tt0068646/quotes" target="_blank"&gt;there is nothing personal – it’s strictly business&lt;/a&gt;. There is still a hope though, and example being the &lt;a href="http://weblogs.asp.net/scottgu/default.aspx" target="_blank"&gt;Scott Gu’s&lt;/a&gt; &lt;a href="http://haacked.com/" target="_blank"&gt;team&lt;/a&gt;, which most likely has &lt;a href="http://www.asp.net/mvc/mvc3" target="_blank"&gt;no commercial sense&lt;/a&gt; either, although it probably costs the Microsoft more, than Reflector to the Red Gate. &lt;/p&gt;  &lt;p&gt;P.S. Oh, by the way, we’ve eventually given up on our &lt;a href="http://lazyloading.blogspot.com/2008/08/managing-continuous-database_21.html" target="_blank"&gt;SQL Toolbelt Continuous Integration project&lt;/a&gt;. We got stuck in those &lt;a href="http://lazyloading.blogspot.com/2008/08/managing-continuous-database_22.html" target="_blank"&gt;licensing cobwebs&lt;/a&gt;, our management lost patience and I haven’t considered Red Gate for my automaiton projects ever since.&lt;/p&gt;  &lt;p&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-1676596606759375356?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/1676596606759375356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=1676596606759375356' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1676596606759375356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1676596606759375356'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2011/05/long-live-net-reflector.html' title='Long live .NET Reflector'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5021/5690445296_c70e68ef66_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-3386403283618985533</id><published>2011-05-04T19:49:00.001-05:00</published><updated>2011-05-04T22:27:43.645-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools and gadgets'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><title type='text'>MVC Scaffolding exception</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;img style="margin: 0px 5px 0px 10px; display: inline; float: right" align="right" src="http://farm6.static.flickr.com/5025/5688909292_07e646ca36_z.jpg" width="460" height="236" /&gt;Don’t optimize your NuGet package libraries until you know exactly what are you doing. I screwed something up eventually, so when I tried to use the awesome “Add Controller”&amp;#160; wizard, I’ve got &lt;em&gt;“The term ‘Get-Scaffolder’ is not recognized as the name of a cmdlet…” &lt;/em&gt;error.&lt;/p&gt;  &lt;p&gt;Solution is pretty simple: uninstall MVC Scaffolding and install from the Package Manager Console :&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt;PM&amp;gt; Uninstall-Package MvcScaffolding -RemoveDependencies&lt;br /&gt;...&lt;br /&gt;PM&amp;gt; Install-Package MvcScaffolding&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-3386403283618985533?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/3386403283618985533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=3386403283618985533' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3386403283618985533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3386403283618985533'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2011/05/mvc-scaffolding-exception.html' title='MVC Scaffolding exception'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5025/5688909292_07e646ca36_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-701140452185397485</id><published>2011-05-03T08:42:00.006-05:00</published><updated>2011-05-03T13:11:50.168-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><title type='text'>Crazy Project: Two steps forward, one step sideways</title><content type='html'>&lt;p&gt;I would be definitely long done should I use my &lt;strike&gt;hammer&lt;/strike&gt; familiar tools for the work, but I would miss all the fun. I am positively in love with MVC3 – the Microsoft team is doing an amazing job! Elegance with which they embrace the &lt;a href="http://msdn.microsoft.com/en-us/library/dd264736.aspx" target="_blank"&gt;latest&lt;/a&gt; C# &lt;a href="http://msdn.microsoft.com/en-us/library/bb397696.aspx" target="_blank"&gt;additions&lt;/a&gt; makes my cry &lt;a href="http://www.youtube.com/watch?v=ZqKQYXe90Ds&amp;amp;feature=related" target="_blank"&gt;Bazinga&lt;/a&gt;! Let me list some lessons I’ve learned so far on &lt;a href="http://lazyloading.blogspot.com/2011/04/crazy-project.html" target="_blank"&gt;Crazy Project&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;MVC3 Scaffolding – not just for Entity Framework&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I almost got ready to bitch about MVC team again but discovered a neat expansion (it is fully expandable!) for the &lt;a href="http://blog.stevensanderson.com/2011/01/13/scaffold-your-aspnet-mvc-3-project-with-the-mvcscaffolding-package/" target="_blank"&gt;MVC 3 Scaffolding&lt;/a&gt; – in addition to default EF-centric and empty view templates it can use repositories. All you need to do is navigate to &lt;em&gt;View&lt;/em&gt;-&amp;gt;&lt;em&gt;Other Windows&lt;/em&gt;-&amp;gt;&lt;em&gt;Package Manager Console&lt;/em&gt; in Visual Studio and type Install-Package MvcScaffolding. It would be nice to have them installed by default - all it does is generate CRUD-compatible Views and Controller and it really needs to know only the underlying entity type. It could cover 99% scenarios out there, including EF one.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;MVC validation and Java Script manipulations&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Building an interactive (Java Script-backed) form I hit a problem with the built-in validation (generated from Model validation attributes) – I was hiding some fields with Java Script but the validation was still firing for them. Quick search provided a &lt;a href="http://stackoverflow.com/questions/2853416/jquery-disable-rule-validation-on-a-single-field" target="_blank"&gt;solution&lt;/a&gt;: the Form element can be told to exclude fields decorated with certain class from the validation:&lt;/p&gt;&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;$(&lt;span class="str"&gt;&amp;quot;#myform&amp;quot;&lt;/span&gt;).validate({&lt;br /&gt;ignore: &lt;span class="str"&gt;&amp;quot;.ignore&amp;quot;&lt;/span&gt;&lt;br /&gt;})&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Which means that no validation should be performed for a field decorated with the &lt;em&gt;class=”ignore”&lt;/em&gt; attribute. &lt;br /&gt;&lt;br /&gt;Unfortunately this didn’t work for me after I added the code snippet to my &lt;em&gt;document.ready&lt;/em&gt; event (I guess, that I just misused the functionality but I don’t know better yet and hope for my audience help). As an immediate measure I had to change a bit the &lt;em&gt;&lt;font color="#ffff00"&gt;&lt;/font&gt;&lt;/em&gt;&lt;em&gt;&lt;font color="#4bacc6"&gt;jquery.validate.unobtrusive.min.js&lt;/font&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt; file which is included with MVC3 template: right after success: &lt;em&gt;a.proxy(j, d)&lt;/em&gt; text I added ,&lt;em&gt;ignore: “.ignore”&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Similarly it should work in a wider scale: when &lt;em&gt;ignore: “:hidden”&lt;/em&gt; rule is used instead, all hidden fields will be excluded from validation – the jQuery is smart enough to consider field hidden if it is inside a hidden container, like div tag. Search the &lt;em&gt;&lt;font color="#4bacc6"&gt;jquery.validate.unobtrusive.js&lt;/font&gt;&lt;/em&gt; file for an unscrambled version of the code to understand better what it does – the resulting function should look like this:&lt;/p&gt;&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;function validationInfo(form) {&lt;br /&gt;    var $form = $(form),&lt;br /&gt;        result = $form.data(data_validation);&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (!result) {&lt;br /&gt;        result = {&lt;br /&gt;            options: {  &lt;span class="rem"&gt;// options structure passed to jQuery Validate's validate() method&lt;/span&gt;&lt;br /&gt;                errorClass: &lt;span class="str"&gt;&amp;quot;input-validation-error&amp;quot;&lt;/span&gt;,&lt;br /&gt;                errorElement: &lt;span class="str"&gt;&amp;quot;span&amp;quot;&lt;/span&gt;,&lt;br /&gt;                errorPlacement: $.proxy(onError, form),&lt;br /&gt;                invalidHandler: $.proxy(onErrors, form),&lt;br /&gt;                messages: {},&lt;br /&gt;                rules: {},&lt;br /&gt;                success: $.proxy(onSuccess, form),&lt;br /&gt;                ignore: &lt;span class="str"&gt;&amp;quot;:hidden&amp;quot;&lt;/span&gt;&lt;br /&gt;            },&lt;br /&gt;            attachValidation: function () {&lt;br /&gt;                $form.validate(&lt;span class="kwrd"&gt;this&lt;/span&gt;.options);&lt;br /&gt;            },&lt;br /&gt;            validate: function () {  &lt;span class="rem"&gt;// a validation function that is called by unobtrusive Ajax&lt;/span&gt;&lt;br /&gt;                $form.validate();&lt;br /&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; $form.valid();&lt;br /&gt;            }&lt;br /&gt;        };&lt;br /&gt;        $form.data(data_validation, result);&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; result;&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;I can’t say enough about awesomeness of MVC3’s adherence to the web standards. No more weirdo ASPX tricks – just pure old DOM, CSS and HTML! &lt;/p&gt;&lt;p&gt;Update: Aforementioned is still not enough - ModelState server-side validation will fail, because it is still going through all fields. Undesired properties should be removed from the ModelState:&lt;/p&gt;&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (payeeViewModel.Currency==US)&lt;br /&gt;{&lt;br /&gt;ModelState.Remove(&lt;span class="str"&gt;&amp;quot;InstitutionNumber&amp;quot;&lt;/span&gt;);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Get Postal&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;I am new to MVC and jQuery, so I am stepping on the same mines, which my more experienced colleagues know by heart. I had this as my first jQuery exercise, which was returning a JSON list using AJAX get:&lt;/p&gt;&lt;blockquote&gt;  &lt;pre class="csharpcode"&gt;$.getJSON(&lt;span class="str"&gt;'@Url.Action(&amp;quot;GetItems&amp;quot;)'&lt;/span&gt;, { id: selectedCategory }, function (response)&lt;br /&gt;{&lt;br /&gt;    each(response.items, function (index, iteml)&lt;br /&gt;    {&lt;br /&gt;       ...&lt;br /&gt;    });&lt;br /&gt;});&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;I was really proud of it until realized that simply by navigating to &lt;em&gt;http://www.microsoft.com/items/333&lt;/em&gt; u &lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:8f9ec66d-cad6-4b41-9fb9-a5190790e1e2" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/MVC" rel="tag"&gt;MVC&lt;/a&gt;,&lt;a href="http://technorati.com/tags/validation" rel="tag"&gt;validation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/jquery" rel="tag"&gt;jquery&lt;/a&gt;,&lt;a href="http://technorati.com/tags/wcf" rel="tag"&gt;wcf&lt;/a&gt;,&lt;a href="http://technorati.com/tags/workflow" rel="tag"&gt;workflow&lt;/a&gt;,&lt;a href="http://technorati.com/tags/wf4" rel="tag"&gt;wf4&lt;/a&gt;&lt;/div&gt;ser will get a nice (or weird, depending on a purpose) JSON array with my items back. Not good. So I changed it a bit:&lt;br /&gt;&lt;blockquote&gt;  &lt;pre class="csharpcode"&gt;$.post(&lt;span class="str"&gt;'@Url.Action(&amp;quot;GetItems&amp;quot;)'&lt;/span&gt;, { id: selectedCategory }, &lt;span class="kwrd"&gt;function&lt;/span&gt; (response)&lt;br /&gt;{&lt;br /&gt;    each(response.items, &lt;span class="kwrd"&gt;function&lt;/span&gt; (index, iteml)&lt;br /&gt;    {&lt;br /&gt;       ...&lt;br /&gt;    });&lt;br /&gt;},&lt;span class="str"&gt;'json'&lt;/span&gt;);&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;And GetItems action, which does the job, accepts only HttpPost verb, while another one by the same name throws back a &lt;a href="http://weblogs.asp.net/gunnarpeipman/archive/2010/07/27/asp-net-mvc-3-using-httpnotfoundresult-action-result.aspx" target="_blank"&gt;HttpNotFound&lt;/a&gt; result (back to the nature!). The solution is not perfect, as POST is not that difficult to hack (of course I have a security on top of it) but at least it won’t be stumbled upon accidentally.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Shaping workflow service to WCF&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The default implementation of the WF4 service, which can be seen in 90% of presentations, uses Service Reference. If you ask me it is a part of Poor Man’s SOA Toolset - an ugly and inflexible technique. Here is an excellent post about how to avoid it – &lt;a href="http://blogs.msdn.com/b/rjacobs/archive/2010/07/30/making-a-workflowservice-work-like-a-wcf-service.aspx" target="_blank"&gt;“How to make a WorkflowService implement a contract&lt;/a&gt;”. A couple tricks with ChannelFactory and you have a Service Reference-less project!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Workflow correlation&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The sad discovery of the day – workflow can not use the same operation twice. Which kind of makes sense and doesn’t at the same time. It is all about correlation – the area where WF4 shares voodoo magic with BizTalk. &lt;br /&gt;&lt;a href="http://offroadcoder.com/2011/03/02/InstanceCorrelationInWF4.aspx" target="_blank"&gt;This particular post&lt;/a&gt; helped me to get better understanding the WF4 correlation. At least the sample is not using string-based correlation handler, unlike many others.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-701140452185397485?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/701140452185397485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=701140452185397485' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/701140452185397485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/701140452185397485'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2011/05/crazy-project-two-steps-forward-one.html' title='Crazy Project: Two steps forward, one step sideways'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-7244288890860681248</id><published>2011-04-28T08:02:00.004-05:00</published><updated>2011-05-08T13:03:25.416-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='win 7'/><title type='text'>Scan and fix = Krush, Kill n Destroy</title><content type='html'>&lt;img height="258" src="http://farm6.static.flickr.com/5305/5664064263_6925d240e1_z.jpg" width="437" /&gt;&lt;br /&gt;The &lt;strike&gt;kind of idiot&lt;/strike&gt; short-sighted developer in Microsoft, who came up with the idea of smart USB/SD cards reading has probably never owned a digital camera. Or never thought of getting one. &lt;strike&gt;Or never thought period.&lt;/strike&gt;&lt;br /&gt;Nothing ever has come out good after using this functionality – I have already had to reformat two SD cards (including one right in the middle of Florence which spoiled otherwise jolly supper) and just screwed up third one. Thank god, the Microsoft oversmarts haven’t decided to “help” me with auto-reformatting – &lt;a href="http://www.eetimes.com/discussion/programmer-s-toolbox/4024875/It-s-only-logical" target="_blank"&gt;it’s only logical&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-7244288890860681248?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/7244288890860681248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=7244288890860681248' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7244288890860681248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7244288890860681248'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2011/04/scan-and-fix-krush-kill-n-destroy.html' title='Scan and fix = Krush, Kill n Destroy'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5305/5664064263_6925d240e1_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-625205656053673453</id><published>2011-04-24T18:07:00.004-05:00</published><updated>2011-05-08T13:00:52.968-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><category scheme='http://www.blogger.com/atom/ns#' term='workflow'/><title type='text'>Raven DB and WCF Workflow service contracts</title><content type='html'>&lt;div align="left"&gt;&lt;a href="http://geekandpoke.typepad.com/" target="_blank"&gt;&lt;img align="right" height="481" src="http://farm6.static.flickr.com/5102/5644228918_44ddaea81b_z.jpg" style="display: inline; float: right;" width="305" /&gt;&lt;/a&gt;&lt;a href="http://ravendb.net/" target="_blank"&gt;RavenDb&lt;/a&gt; is a relatively new (maybe subjective - I’ve heard of it just few month ago) document database built on .NET and for .NET. &lt;/div&gt;It is an extraordinary little (course from user’s point of view) thing which allows to start writing application without extensive database preparation and schema manipulations. It &lt;a href="http://weblogs.asp.net/shijuvarghese/archive/2010/05/26/nosql-with-ravendb-and-asp-net-mvc-part-1.aspx" target="_blank"&gt;clicks perfectly&lt;/a&gt; with MVC, although I am still to discover a similarly elegant technique for Workflow Foundation. Raven Db recognizes property named “Id” (exactly capital “i” and lowercase “d”) as an entity identifier and has some optimization around it, so it is wise to make this field the entity’s identity field. It is even more wise to make it string and assign the value manually while inserting, e.g. using Guid, otherwise you will end up with engine-generated keys like “movies/323” which are deadly for MVC or REST services.&lt;br /&gt;The only problem I’ve noticed so far (and the documentation is scarce on this) – decorating Raven-served documents as a WCF service contracts. I found that some of my workflow variables, which I store in DB, often require to be service contracts.&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;[DataContract(Namespace = &lt;span class="str"&gt;"http://contracts"&lt;/span&gt;)]&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Movie : IDocument&lt;br /&gt;{&lt;br /&gt; [DataMember(IsRequired = &lt;span class="kwrd"&gt;true&lt;/span&gt;)]&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Id { get; set; }&lt;br /&gt; [DataMember(IsRequired = &lt;span class="kwrd"&gt;true&lt;/span&gt;)]&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Title { get; set; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;It worked perfectly fine in the code until all the sudden I’ve started receiving errors when trying to retrieve the entity from the DB: &lt;i&gt;Newtonsoft.Json.JsonSerializationException: Newtonsoft.Json.JsonSerializationException: Required property 'Id' not found in JSON&lt;/i&gt;. With decoration removed, the entity retrieval worked perfectly well. What was strange is that in both cases the document stored looked exactly the same (Raven Db installation includes very helpful Management Studio executed in Silverlight):&lt;br /&gt;&lt;img src="http://farm6.static.flickr.com/5103/5651611486_43279ffa0f_z.jpg" /&gt;&lt;br /&gt;The error seemed to only affect “Id” property, which is “invisible”. Obviously something was interfering with JSON deserialization of the object. The Raven API provides great deal of serialization customization but I decided to find &lt;strike&gt;laziest&lt;/strike&gt; easier way to fix the problem.&lt;br /&gt;As it turned out the &lt;i&gt;DataMember&lt;/i&gt; attribute was the one to blame. I believe that it is more likely to do with Microsoft’s oversight in DataMember implementation (despite being a member of Serialization namespace it is not being recognized as Serializable) while RavenDb proved to have a perfect reason behind &lt;a href="http://ravendb.net/faq/working-with-dtc" target="_blank"&gt;most peculiar decisions&lt;/a&gt;. The solution is to add an additional &lt;i&gt;JsonProperty &lt;/i&gt;attribute to the troubled field:&lt;br /&gt;&lt;pre class="csharpcode"&gt;[DataContract(Namespace = &lt;span class="str"&gt;"http://contracts"&lt;/span&gt;)]&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Movie : IDocument&lt;br /&gt;{&lt;br /&gt;[DataMember(IsRequired = &lt;span class="kwrd"&gt;true&lt;/span&gt;)]&lt;br /&gt;[JsonProperty]&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Id { get; set; }&lt;br /&gt;&lt;br /&gt;[DataMember(IsRequired = &lt;span class="kwrd"&gt;true&lt;/span&gt;)]&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Title { get; set; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;The attribute class can be found in &lt;i&gt;Newtonsoft.Json&lt;/i&gt; namespace. This small addition has fixed the problem (although&amp;nbsp; entity was shown in the Management Studio entity exactly the same way as before).&lt;br /&gt;&lt;div&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-625205656053673453?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/625205656053673453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=625205656053673453' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/625205656053673453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/625205656053673453'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2011/04/raven-db-and-wcf-contracts.html' title='Raven DB and WCF Workflow service contracts'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5102/5644228918_44ddaea81b_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-6607399103327203910</id><published>2011-04-18T11:21:00.000-05:00</published><updated>2011-04-22T11:48:37.239-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='learning'/><title type='text'>The Crazy Project</title><content type='html'>&lt;p&gt;I believe that learning is only effective when it is forced on you by a real need. So far the most efficient learning experience I remember was stimulated by a lunch-and-learn session, where I was supposed to deliver a topic I had no knowledge. The session was scheduled to happen a week after I was notified about it, so since then I am &lt;strike&gt;expert in&lt;/strike&gt; aware of existence of Design Patterns.&lt;/p&gt;  &lt;p&gt;Armed with that experience I decided to use technologies, new to me, in my next project (thankfully, relatively small). I am Web Form/SQL Server/Subversion junky so the following was brought in to widen my horizons: &lt;a href="http://msdn.microsoft.com/en-us/library/ee342461.aspx" target="_blank"&gt;Workflow Foundation 4.0&lt;/a&gt; as a back-end engine, &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx" target="_blank"&gt;MVC 3 Razor&lt;/a&gt; as a front-end and &lt;a href="http://ravendb.net/documentation" target="_blank"&gt;Raven DB&lt;/a&gt; as a database storage. To cap it up the project will be stored in &lt;a href="http://mercurial.selenic.com/" target="_blank"&gt;Mercurial SCR&lt;/a&gt;. The only treat I’ve allowed myself is the usage of the excellent (as usual) Windows shell extension – &lt;a href="http://tortoisehg.bitbucket.org/" target="_blank"&gt;TortoiseHg&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;A couple of days into the project it works as expected – deadline is approaching, I am panicking. Hopefully, the sweet fruits of knowledge will follow… &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-6607399103327203910?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/6607399103327203910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=6607399103327203910' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6607399103327203910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6607399103327203910'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2011/04/crazy-project.html' title='The Crazy Project'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-8330325539050032577</id><published>2011-04-02T12:52:00.001-05:00</published><updated>2011-04-02T12:58:52.644-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>The Good, The Bad, The Toothless by LXD</title><content type='html'>&lt;iframe title="YouTube video player" height="390" src="http://www.youtube.com/embed/RGAmw9rxDK8" frameborder="0" width="640" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-8330325539050032577?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/8330325539050032577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=8330325539050032577' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/8330325539050032577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/8330325539050032577'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2011/04/good-bad-toothless-by-lxd.html' title='The Good, The Bad, The Toothless by LXD'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/RGAmw9rxDK8/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-6270318800492839753</id><published>2010-04-19T22:03:00.001-05:00</published><updated>2010-05-22T15:02:50.740-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='win 7'/><title type='text'>Canon vs. MSN</title><content type='html'>&lt;p&gt;I have a pretty neat little USB-powered scanner CanoScan LiDE 200. Worked like a charm - assembled PDFs, did it's OCR things. Until recently. All the sudden it started throwing &amp;quot;Application stopped working&amp;quot; popup with the following trace:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;i&gt;Faulting application name: mpnex20.exe, version: 2.0.3.0, time stamp: 0x488d25b8       &lt;br /&gt;Faulting module name: MSONSEXT.DLL_unloaded, version: 0.0.0.0, time stamp: 0x43306199        &lt;br /&gt;Exception code: 0xc0000005        &lt;br /&gt;Fault offset: 0x49143a3b        &lt;br /&gt;Faulting process id: 0x1b6c        &lt;br /&gt;Faulting application start time: 0x01ca6fa1279f1150        &lt;br /&gt;Faulting application path: C:\Program Files (x86)\Canon\MP Navigator EX 2.0\mpnex20.exe        &lt;br /&gt;Faulting module path: MSONSEXT.DLL        &lt;br /&gt;Report Id: 66e6c43e-db94-11de-944e-00248c08c4d9&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Reinstall didn't help. All kind of forums advised to fix a corrupted profile - which in my case would open giant can of poisonous worms, so it wasn't acceptable. Eventually I've dug up an obscure recipe. When I first laid my eye on it I didn't believe it, but three hours of head banging improves ones faith in miracles. I tried it and it worked. Like a charm. The guy is a Voodoo Jedi - there is no way mere human can get to that without using a Force. Here is the solution:   &lt;br /&gt;- Go to the folder C:\Users\[user name]\App Data\Roaming\Microsoft\Windows\Network Shortcuts\    &lt;br /&gt;- There will be shortcut &amp;quot;My Web Sites on MSN&amp;quot; - kill it    &lt;br /&gt;- Burn Microsoft sticker under a bridge at a full moon.    &lt;br /&gt;&lt;br /&gt;Go figure...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-6270318800492839753?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/6270318800492839753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=6270318800492839753' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6270318800492839753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6270318800492839753'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2010/04/canon-vs-msn.html' title='Canon vs. MSN'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-4332756486951472604</id><published>2010-02-16T08:41:00.001-05:00</published><updated>2010-02-16T08:41:30.912-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Interface + extension methods &gt; abstract class</title><content type='html'>&lt;p&gt;This is a very interesting approach to combine the flexibility and clarity of interface with convenience of laziness when inheriting from half-pre-build abstract class:   &lt;br /&gt;&lt;a href="http://www.bluebytesoftware.com/blog/2010/02/10/ExtensionMethodsAsDefaultInterfaceMethodImplementations.aspx" target="_blank"&gt;Extension methods as default interface method implementations&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I usually in doubts every time and now I have more reasons to do the right thing and choose the interface. Very neat trick – some inheritance and some composition.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-4332756486951472604?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/4332756486951472604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=4332756486951472604' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4332756486951472604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4332756486951472604'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2010/02/interface-extension-methods-abstract.html' title='Interface + extension methods &amp;gt; abstract class'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-5222464977073354507</id><published>2010-01-20T18:51:00.003-05:00</published><updated>2010-01-21T08:41:50.860-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Delete SVN subdirectories (and some others)</title><content type='html'>&lt;p&gt;Every now and then one would need to add files to &lt;a href="http://subversion.tigris.org/" target="_blank"&gt;Subversion&lt;/a&gt; “en mass”. Obviously there are a lot of file types you wouldn't want in your repository. Usual undesirables are BIN and OBJ folders - the are inconvenient to have, and quite often – orphan .SVN remnants which will effectively screw up your new subscription. I struggled with these task long enough and today smart person who reads something besides Science Fiction prepared a script for me:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="1"&gt;for /f “tokens=* delims=” %%i in (’dir /s /b /a:d *svn’) do (       &lt;br /&gt;rd /s /q “%%i”)&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This is to be packed as a KillSVN.cmd file and executed from the root of the folder which contains your solution (not C:\ root, unless you plan to get rid of all your Suvbersion subscriptions!)&lt;/p&gt;  &lt;p&gt;it is pretty easy to conclude that deleting BIN and OBJ folders will follow the same patter (this script I wrote myself!):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="1"&gt;for /f “tokens=* delims=” %%i in (’dir /s /b /a:d bin’) do (       &lt;br /&gt;rd /s /q “%%i”)        &lt;br /&gt;&lt;font size="1"&gt;for /f “tokens=* delims=” %%i in (’dir /s /b /a:d obj’) do (         &lt;br /&gt;rd /s /q “%%i”)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-5222464977073354507?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/5222464977073354507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=5222464977073354507' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/5222464977073354507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/5222464977073354507'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2010/01/delete-svn-subdirectories-and-some.html' title='Delete SVN subdirectories (and some others)'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-1092174213961758662</id><published>2009-12-10T11:21:00.001-05:00</published><updated>2009-12-26T09:51:46.656-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Unexpected?</title><content type='html'>&lt;p&gt;Big IT projects fail worldwide:&lt;/p&gt;  &lt;p&gt;Are big IT projects doomed to failure? Software systems expert Robert Charette looks at some big failures in the news. Within the last week the UK has thrown up its hands and scaled back the National Health Service's National Program for IT after acknowledging that £12 billion has been spent with little to show for it. That story comes on the heels of a California newspaper investigation that looked at three big state government projects that are are $2 billion over budget, late, and performing poorly.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://spectrum.ieee.org/podcast/computing/software/big-it-projects-fail-worldwide" href="http://spectrum.ieee.org/podcast/computing/software/big-it-projects-fail-worldwide"&gt;http://spectrum.ieee.org/podcast/computing/software/big-it-projects-fail-worldwide&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-1092174213961758662?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/1092174213961758662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=1092174213961758662' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1092174213961758662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1092174213961758662'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2009/12/unexpected.html' title='Unexpected?'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-2715347853308052500</id><published>2009-12-09T09:44:00.004-05:00</published><updated>2011-04-22T11:55:37.869-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='buzz'/><category scheme='http://www.blogger.com/atom/ns#' term='weird stuff'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Ballet 2.0</title><content type='html'>Tell me that it is not going to be a future classics… &lt;a href="http://news.tubefilter.tv/2009/04/06/legion-of-extraordinary-dancers-steps-up-with-puma-as-agilitys-first-series/" target="_blank"&gt;LXD&lt;/a&gt;   &lt;br /&gt;&lt;iframe title="YouTube video player" height="390" src="http://www.youtube.com/embed/KDmjLeqQwsM" frameborder="0" width="480" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;  &lt;br /&gt;  &lt;div class="blogger-post-footer"&gt;   &lt;br /&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-2715347853308052500?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/2715347853308052500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=2715347853308052500' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/2715347853308052500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/2715347853308052500'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2009/12/ballet-20.html' title='Ballet 2.0'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/KDmjLeqQwsM/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-5062804649615498826</id><published>2009-11-24T10:28:00.001-05:00</published><updated>2009-11-24T10:28:43.906-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools and gadgets'/><category scheme='http://www.blogger.com/atom/ns#' term='weird stuff'/><title type='text'>The future is here</title><content type='html'>&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:b7f32d85-eb70-4ebc-bc31-80e86ef4d3fe" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;!--copy and paste--&gt;&lt;object width="446" height="326"&gt;&lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;param name="bgColor" value="#ffffff"&gt;&lt;/param&gt; &lt;param name="flashvars" value="vu=http://video.ted.com/talks/dynamic/PranavMistry_2009I-medium.flv&amp;amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/PranavMistry-2009I.embed_thumbnail.jpg&amp;amp;vw=432&amp;amp;vh=240&amp;amp;ap=0&amp;amp;ti=685&amp;amp;introDuration=16500&amp;amp;adDuration=4000&amp;amp;postAdDuration=2000&amp;amp;adKeys=talk=pranav_mistry_the_thrilling_potential_of_sixthsense_tec;year=2009;theme=a_taste_of_tedindia;theme=design_like_you_give_a_damn;theme=the_creative_spark;theme=ted_under_30;theme=new_on_ted_com;theme=tales_of_invention;theme=what_s_next_in_tech;event=TEDIndia+2009;&amp;amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /&gt;&lt;embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" flashvars="vu=http://video.ted.com/talks/dynamic/PranavMistry_2009I-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/PranavMistry-2009I.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=685&amp;introDuration=16500&amp;adDuration=4000&amp;postAdDuration=2000&amp;adKeys=talk=pranav_mistry_the_thrilling_potential_of_sixthsense_tec;year=2009;theme=a_taste_of_tedindia;theme=design_like_you_give_a_damn;theme=the_creative_spark;theme=ted_under_30;theme=new_on_ted_com;theme=tales_of_invention;theme=what_s_next_in_tech;event=TEDIndia+2009;"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-5062804649615498826?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/5062804649615498826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=5062804649615498826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/5062804649615498826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/5062804649615498826'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2009/11/future-is-here.html' title='The future is here'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-6126312265070175009</id><published>2009-10-08T07:44:00.000-05:00</published><updated>2009-10-08T08:03:10.284-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='buzz'/><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><title type='text'>Google Reader anniversary cleaning</title><content type='html'>&lt;p&gt;No, they not turning 18 this month… It is mine two years of aggregating blogs with Google Reader and I must do the cleaning. &lt;/p&gt;  &lt;p&gt;I’ve noticed that with time my list accumulates subscriptions which I rarely, if ever, read. Just one nice post or more often somebody’s recommendation makes me add the blog and nothing else. And it has obvious negative implications: my almost inexistent will-power gives up immediately as I see 200 unread messages waiting. I postpone it and next day additional 200 make it even less encouraging.    &lt;br /&gt;Then eventually I come to my senses and invent some kind of system to put away at least. First go those which don’t have new posts within last month (mine would fall in this category more often than not), then those which not interesting anymore (like I’ve lost interest in Joel Spolsky’s internal company news some time ago) and then those which topic lays away from my professional are of interests (that excludes travel and photography blogs, although I neither).&lt;/p&gt;  &lt;p&gt;This time I will be doing something radically new – my goal is to eliminate 25% of subscriptions and keep it that way. If new blog comes along – one of the old ones should give it’s way. Unless I soften up and just add it again. Till the next anniversary.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-6126312265070175009?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/6126312265070175009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=6126312265070175009' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6126312265070175009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6126312265070175009'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2009/10/google-reader-anniversary-cleaning.html' title='Google Reader anniversary cleaning'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-5626804588132517318</id><published>2009-10-07T08:13:00.001-05:00</published><updated>2009-10-07T08:21:20.006-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='win 7'/><category scheme='http://www.blogger.com/atom/ns#' term='pc'/><title type='text'>Windows 7 Virtual PC</title><content type='html'>&lt;p&gt;This is a &lt;a href="http://www.microsoft.com/windows/virtual-pc/support/default.aspx" target="_blank"&gt;new edition&lt;/a&gt; of the developer’s must-have software. Although it is not the only option yet, especially if your Windows 7 machine does not support the &lt;a href="http://www.microsoft.com/windows/virtual-pc/support/requirements.aspx" target="_blank"&gt;requirements&lt;/a&gt; for Windows Virtual PC, namely the hardware virtualization. It is good to know that &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=28C97D22-6EB8-4A09-A7F7-F6C7A1F000B5&amp;amp;displaylang=en" target="_blank"&gt;Virtual PC 2007&lt;/a&gt; (with SP1) is still an option, just add a latest &lt;a href="http://support.microsoft.com/kb/958162" target="_blank"&gt;hotfix&lt;/a&gt; and you should be good to go (note that Windows 7 is still not in a list of supported operations systems).&lt;/p&gt;  &lt;p&gt;Surprisingly, the trick with speeding up Virtual PC by running Media Player on the host machine still works, though not to extend of Virtual PC 2007 case.&lt;/p&gt;  &lt;p&gt;For those really adventurous, &lt;a href="http://www.virtualbox.org/" target="_blank"&gt;Sun Virtual Box&lt;/a&gt; is yet another virtualization alternative.&lt;/p&gt;  &lt;p&gt;P.S. Two annoyances I’ve noticed with Windows Virtual PC so far, aside of noticeable slower performance of external (to the VPC) drives: no OS startup screen on VPC restarts and re-login prompt on VPC window resize.&amp;#160; &lt;br /&gt;It is boring to watch a pointless progress bar, while VPC OS is starting behind the screen. My only explanation why they thought it would be a bright idea, is that they all are server folks and see system restart scares a bejesus out of them.     &lt;br /&gt;The second one is cured by allowing VPC remember login information during the first start. The screen looks like normal login request and account name is pre-populated with your login name, which makes it slightly misleading. Just enter “different account” info, which would be the VPC OS account. The stored credentials can be cleared through the virtual machine settings and you will be prompted to re-enter them next start. I don’t see much security problem in allowing to store a credentials, unless your VPC is on the external drive (&lt;a href="http://blogs.msdn.com/midatlanticcrm/archive/2006/03/23/Tips_to_Speed_Up_Virtual_PC_for_Microsoft_CRM.aspx" target="_blank"&gt;as it better be&lt;/a&gt;) – in this case &lt;a href="http://www.truecrypt.org/" target="_blank"&gt;True Crypt&lt;/a&gt; is your humble saviour.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:258e4f8b-08d7-4077-b082-99b636984fab" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/virtual+pc" rel="tag"&gt;virtual pc&lt;/a&gt;,&lt;a href="http://technorati.com/tags/win+7" rel="tag"&gt;win 7&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-5626804588132517318?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/5626804588132517318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=5626804588132517318' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/5626804588132517318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/5626804588132517318'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2009/10/windows-7-virtual-pc.html' title='Windows 7 Virtual PC'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-646184614513678216</id><published>2009-07-09T10:17:00.001-05:00</published><updated>2009-07-09T10:17:37.158-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>BizTalk architecture whitepaper</title><content type='html'>&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms935116.aspx" target="_blank"&gt;BizTalk Server 2004: A Messaging Engine Overview&lt;/a&gt; is by far the best document in helping to understand the BizTalk. &lt;/p&gt;  &lt;p&gt;Despite being written for BizTalk 2004 it is still valid for 2006, 2006R2 and 2009 and makes an especially good reading between taking a &lt;a href="https://www.microsoftelearning.com/eLearning/courseDetail.aspx?courseId=51883&amp;amp;tab=overview" target="_blank"&gt;First Look at BizTalk 2006&lt;/a&gt; and digging deeper into the details.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-646184614513678216?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/646184614513678216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=646184614513678216' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/646184614513678216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/646184614513678216'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2009/07/biztalk-architecture-whitepaper.html' title='BizTalk architecture whitepaper'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-1338169669945798980</id><published>2009-07-03T08:41:00.002-05:00</published><updated>2009-07-03T08:46:42.640-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Architectural, technical and spiritual videos</title><content type='html'>&lt;p&gt;From &lt;a href="http://www.ndc2009.no/en/agenda.aspx?cat=1071&amp;amp;id=1813&amp;amp;day=3726" target="_blank"&gt;Norwegian Developers Conference&lt;/a&gt; June 2009 (Scott Hanselman, Phil Haack, Michael Feathers, Juval L&amp;#246;wy, Rocky Lhotka and many more)&lt;/p&gt;  &lt;p&gt;From &lt;a href="http://archive.oredev.org/topmenu/video.4.45b270a411a9ed8e1278000948.html" target="_blank"&gt;&amp;#216;redev conference&lt;/a&gt; Nov 2008 (Jimmy Nilsson, Eric Evans and many more)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-1338169669945798980?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/1338169669945798980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=1338169669945798980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1338169669945798980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1338169669945798980'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2009/07/session-videos.html' title='Architectural, technical and spiritual videos'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-4211565418532019970</id><published>2009-07-02T12:04:00.002-05:00</published><updated>2009-08-13T08:20:02.552-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><title type='text'>WCF thread safety in 25 lines of code</title><content type='html'>&lt;pre class="csharpcode"&gt;[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)]&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ThreadSafeService : IServiceContract&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; counter;&lt;br /&gt;&lt;br /&gt;    [MethodImpl(MethodImplOptions.Synchronized)]&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; IncrementCounter(&lt;span class="kwrd"&gt;int&lt;/span&gt; amount)&lt;br /&gt;    {&lt;br /&gt;        Mutex m = &lt;span class="kwrd"&gt;new&lt;/span&gt; Mutex(&lt;span class="kwrd"&gt;false&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            Monitor.Enter(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;br /&gt;            m.WaitOne();&lt;br /&gt;            &lt;span class="kwrd"&gt;lock&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                Interlocked.Add(&lt;span class="kwrd"&gt;ref&lt;/span&gt; counter, amount);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span class="kwrd"&gt;finally&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            m.ReleaseMutex();&lt;br /&gt;            Monitor.Exit(&lt;span class="kwrd"&gt;this&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;I dare to say that familiarity with every technique used in this sample would make you comfortable in dealing with WCF multithreading and throughput issues.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-4211565418532019970?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/4211565418532019970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=4211565418532019970' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4211565418532019970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4211565418532019970'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2009/07/wcf-thread-safety-in-25-lines-of-code.html' title='WCF thread safety in 25 lines of code'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-3101145891116727962</id><published>2009-06-26T22:36:00.003-05:00</published><updated>2009-07-01T07:35:47.584-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Agile family values</title><content type='html'>&lt;p&gt;The best thoughts taken from the last meeting of &lt;a href="http://www.torontoagile.org/" target="_blank"&gt;Toronto Agile User Group&lt;/a&gt; (heard or taken from the air):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;In reality client doesn’t need to spend less money – he needs to spend it wisely.&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;In reality managers don’t need to ship software faster – they need to ship it predictably.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;It is all about honesty and trust. Honesty to others and to yourselves: to be ready to admit that everything else is just smoke and mirrors. And to trust others that you can say it out loud without igniting political wars.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-3101145891116727962?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/3101145891116727962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=3101145891116727962' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3101145891116727962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3101145891116727962'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2009/06/agile-family-values.html' title='Agile family values'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-7718626760774743023</id><published>2009-06-01T21:38:00.000-05:00</published><updated>2009-06-26T22:54:27.802-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Applying Fluent Interface. Part II – fluent validation.</title><content type='html'>&lt;p&gt;In of the podcasts on &lt;a href="http://www.dimecasts.net/Content/WatchFeedEpisode/95" target="_blank"&gt;Dimecast.Net&lt;/a&gt; Derik Whittaker has shown very smart way to address object validation with Fluent interface.&lt;/p&gt;  &lt;p&gt;First I couldn’t help myself but notice that “Painfulway Validation” could be replaced with a &lt;em&gt;yield&lt;/em&gt; constructs (picked up from &lt;a href="http://aspnetmvcbook.s3.amazonaws.com/aspnetmvc-nerdinner_v1.pdf" target="_blank"&gt;ScottGu’s tutorial&lt;/a&gt;):&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; IEnumerable&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; Validate (HostEntry hostEntry)&lt;br /&gt;{&lt;br /&gt;   &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt;.isNullOrEmpty(hostEntry.FirstName))&lt;br /&gt;        &lt;span class="kwrd"&gt;yield&lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;First Name is null&amp;quot;&lt;/span&gt;;&lt;br /&gt;   &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt;.isNullOrEmpty(hostEntry.LastName))&lt;br /&gt;        &lt;span class="kwrd"&gt;yield&lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Last Name is null&amp;quot;&lt;/span&gt;;&lt;br /&gt;etc...&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;Maybe it is still painful to read but obviously less verbose. But anyway that construct is still to be replaced by &lt;a href="http://www.dimecasts.net/Content/WatchFeedEpisode/95" target="_blank"&gt;Derek’s smart implementation&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-7718626760774743023?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/7718626760774743023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=7718626760774743023' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7718626760774743023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7718626760774743023'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2009/06/applying-fluent-interface-part-ii.html' title='Applying Fluent Interface. Part II – fluent validation.'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-1090262454997275931</id><published>2009-05-28T21:37:00.001-05:00</published><updated>2009-07-01T07:34:20.985-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='buzz'/><title type='text'>Awesome video</title><content type='html'>&lt;p&gt;Technology is great – this video was shot at speed of 1000 and 2500 frames per second. Some moments look unreal. This small thing is just a taste – go and download the file from &lt;a href="http://www.vimeo.com/4167288" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;object width="400" height="225"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=4167288&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=4167288&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://vimeo.com/4167288"&gt;SprintCam v3 NAB 2009 showreel&lt;/a&gt; from &lt;a href="http://vimeo.com/ridindave"&gt;David Coiffier&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-1090262454997275931?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/1090262454997275931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=1090262454997275931' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1090262454997275931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1090262454997275931'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2009/06/awesome-video.html' title='Awesome video'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-5958817507025332490</id><published>2009-05-10T08:32:00.004-05:00</published><updated>2009-07-03T08:45:49.387-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><title type='text'>MS SQL Server: Default database for Windows user</title><content type='html'>Never ever set custom database as a default for your Windows account. If you drop the DB (quite legitimate operation when updating or scripting it), you will be kicked out of your Server Management Studio session to never come back (not quite true - you still can sneak in but why would you loose few precious nerve cells?)&lt;br /&gt;&lt;br /&gt;If you are the same unfortunate idiot as I am - there is a way to fix this. You can do all kind of voodoo stuff from the command line and shell but if you prefer UI, then the first challenge will be to log in to the SQL Management Studio, unless you have a spare admin account at your disposal.&lt;br /&gt;&lt;br /&gt;1. Click "Options" button and change database to connect to (because you just deleted your default one).&lt;br /&gt;2. Run the following statement: ALTER LOGIN [server\account] WITH DEFAULT_DATABASE = master&lt;br /&gt;Now your account has a mastr DB as your default (how it was supposed to be from the very beginning).&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-5958817507025332490?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/5958817507025332490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=5958817507025332490' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/5958817507025332490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/5958817507025332490'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2009/06/ms-sql-server-default-database-for.html' title='MS SQL Server: Default database for Windows user'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-6417274010330010740</id><published>2009-04-06T10:14:00.004-05:00</published><updated>2009-06-26T22:10:34.925-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vista'/><category scheme='http://www.blogger.com/atom/ns#' term='pc'/><title type='text'>Disk defragmentation</title><content type='html'>For me, who have left a part of his heart with XP, Vista defragmentation tool is a sore disappointment. There are may be some clever algorithms behind the scene, but I feel insecure, staring at incomprehensible message &lt;span style="font-style:italic;"&gt;"Defragmentation is running. It may take minutes or hours..."&lt;/span&gt;. Bill's balls! Why these guys slumming me with so much of unwanted graphics, would cut off the actually useful one?!&lt;br /&gt;&lt;br /&gt;These are third-party alternatives I found:&lt;br /&gt;&lt;br /&gt;1. &lt;a href="http://www.sysinternals.com/Utilities/PageDefrag.html"&gt;PageDefrag&lt;/a&gt; from Sysinternals. The name is the best recommendation.&lt;br /&gt;&lt;br /&gt;2. &lt;a href="http://www.auslogics.com/disk-defrag/index.php"&gt;Auslogic Disk Defrag&lt;/a&gt; seems to have &lt;a href="http://download.cnet.com/Auslogics-Disk-Defrag/3000-2094_4-10567503.html?tag=mncol"&gt;good reviews&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-6417274010330010740?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/6417274010330010740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=6417274010330010740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6417274010330010740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6417274010330010740'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2009/04/disk-defragmentation.html' title='Disk defragmentation'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-3287705629701935745</id><published>2009-04-04T07:25:00.005-05:00</published><updated>2009-04-06T19:46:26.823-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Applying Fluent Interface. Part I - Test Data Builders.</title><content type='html'>&lt;p&gt;Fluent interface is not as famous of a pattern as the Strategy Pattern but average developer encounters it far more often, sometimes not even realising it. Take C# String object for example: MyString.ToUpper().Trim().Replace("a", "A") – that’s a pretty much daily code.&lt;/p&gt;  &lt;p&gt;In a sense Fluent Interface has an application to the state of the object similar to one which &lt;a href="http://www.dofactory.com/Patterns/PatternDecorator.aspx" target="_blank"&gt;Decorator Pattern&lt;/a&gt; has to the structure of the class. Some kind of State Decorator Pattern – although the idea of the Fluent Interface is to produce deterministic results, while Decorator potentially could be designed in opposite way (though I can’t think of the reason as yet).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.xptoronto.com/" target="_blank"&gt;XP Toronto&lt;/a&gt; user group hosted &lt;a href="http://www.slideshare.net/amckinnell/xptorontofinalslidehsare" target="_blank"&gt;“Maintainable Unit Tests” presentation&lt;/a&gt; where fluent interfaces were helping to create expandable test data builders (it is a little bit more organized in the &lt;a href="http://colinjack.blogspot.com/2008/08/test-data-builder-and-object-mother.html" target="_blank"&gt;Colin Jack’s post&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Imagine, you have Student object&lt;/p&gt;  &lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Student&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name { get; set; }&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; DateTime DateOfBirth { get; set; }&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; Average { get; set; }&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Discipline Major { get; set; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;and you’re about to build unit tests which will evaluate business rules around any single property and even different combinations of them. Generating test objects may be tedious job which is often assigned to Test Set Up methods. As you progress, you may notice that some of the helper methods are useful between test modules and then you decide to extract this functionality to helper classes, which &lt;a href="http://blogs.msdn.com/nickmalik/archive/2005/09/06/461404.aspx" target="_blank"&gt;are&lt;/a&gt; &lt;a href="http://blog.guru-php.com/2008/08/helpers-are-unhelpful/" target="_blank"&gt;evil&lt;/a&gt;. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Instead it is better to go the right OOP way and create classes which expose generic functionality and provide us with concrete instances of out domain entities to test.&lt;/p&gt;&lt;p&gt;Essentially it is an implementation of &lt;a href="http://en.wikipedia.org/wiki/Builder_pattern" target="_blank"&gt;Builder&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Factory_Pattern" target="_blank"&gt;Factory&lt;/a&gt; (or &lt;a href="http://martinfowler.com/bliki/ObjectMother.html" target="_blank"&gt;Object Mother&lt;/a&gt;) patterns. Every domain entity’s property has a corresponding method in the relevant Data Builder class. Some of the properties, which we are not too much concerned about (like Name in the example) can be simply set to some default values.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;div style="border: 1px solid rgb(0, 0, 0); overflow: auto; width: 640px; height: 300px;"&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IDataBuilder&amp;lt;T&amp;gt;&lt;br /&gt;{&lt;br /&gt;    T Build();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; StudentDataBuilder : IDataBuilder&amp;lt;Student&amp;gt;&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; DateTime dateOfBirth { get; set; }&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt; average { get; set; }&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; major { get; set; }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Student Build()&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Student&lt;br /&gt;                   {&lt;br /&gt;                       Name = &lt;span class="str"&gt;"John Smith"&lt;/span&gt;,&lt;br /&gt;                       DateOfBirth = dateOfBirth,&lt;br /&gt;                       Average = average,&lt;br /&gt;                       Major = major&lt;br /&gt;                   };&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; StudentDataBuilder New()&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; StudentDataBuilder();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; StudentDataBuilder WithAverage(&lt;span class="kwrd"&gt;double&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; StudentDataBuilder&lt;br /&gt;        {&lt;br /&gt;            dateOfBirth = dateOfBirth,&lt;br /&gt;            average = &lt;span class="kwrd"&gt;value&lt;/span&gt;,&lt;br /&gt;            major = major&lt;br /&gt;        };&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; StudentDataBuilder Taking(&lt;span class="kwrd"&gt;string&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; StudentDataBuilder&lt;br /&gt;        {&lt;br /&gt;            dateOfBirth = dateOfBirth,&lt;br /&gt;            average = average,&lt;br /&gt;            major = &lt;span class="kwrd"&gt;value&lt;/span&gt;&lt;br /&gt;        };&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; StudentDataBuilder Age(&lt;span class="kwrd"&gt;int&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; StudentDataBuilder&lt;br /&gt;        {&lt;br /&gt;            dateOfBirth = DateTime.Now.AddYears(-&lt;span class="kwrd"&gt;value&lt;/span&gt;).AddSeconds(1),&lt;br /&gt;            average = average,&lt;br /&gt;            major = major&lt;br /&gt;        };&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;Age&lt;/em&gt; method deserves a little bit of explanation. Of course, keeping DateTime Date Of Birth is the right thing to do. But from our testing prospective (at the very least) we will be interested in a Student’s current age. If we wouldn’t use the Age method in its current form, we would be forced to mock the Current Date-Time for our test harness, otherwise some of our tests would become invalid with time.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Notice, that in this Fluent Interface implementation the StudentDataBuilder object is immutable. &lt;a href="http://nat.truemesh.com/archives/000714.html" target="_blank"&gt;Some other versions&lt;/a&gt; pass the same instance throughout all the methods. It may happen, that some testing scenarios can yield weird results in this case so it is better to keep them guaranteed unrelated. In this case we can safely “branch” objects for a different tests:&lt;/p&gt;&lt;pre class="csharpcode"&gt;         StudentDataBuilder sdb = StudentDataBuilder.New().Age(20).WithAverage(95);&lt;br /&gt;        Student mathStudent = sdb.Taking(&lt;span class="str"&gt;Discipline.Math&lt;/span&gt;).Build();&lt;br /&gt;        Student bilogyStudent = sdb.Taking(&lt;span class="str"&gt;DIscipline.Biology&lt;/span&gt;).Build();&lt;/pre&gt;&lt;br /&gt;Thus with just three lines of code we have two completely independent instances which have some fields identical and some different. Test away!&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-3287705629701935745?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/3287705629701935745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=3287705629701935745' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3287705629701935745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3287705629701935745'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2009/04/applying-fluent-interface-part-i-test.html' title='Applying Fluent Interface. Part I - Test Data Builders.'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-3069414835059449370</id><published>2009-03-31T12:27:00.000-05:00</published><updated>2009-04-05T15:46:08.971-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><title type='text'>Ajax Controls Toolkit: ModalPopup extender with UpdatePanel</title><content type='html'>&lt;p&gt;Scenario: show popup (preferably modal) with editable fields in a Master-Detail mode and provide ability to accept or reject update.&lt;/p&gt;  &lt;p&gt;Straightforward combination of ModalPopup extender with UpdatedPanel, containing data-bound controls will work pretty much out of the box with few caveats to consider, mainly with OK/Cancel buttons:&lt;/p&gt;  &lt;p&gt;1. Place both OK and Cancel buttons outside the Update panel, otherwise when leaving the page you may get a JScript error &lt;em&gt;"Microsoft JScript runtime error: Sys.InvalidOperationException: Handler was not added through the Sys.UI.DomEvent.addHandler method."&lt;/em&gt;.  &lt;br /&gt;When client-side objects of the Update Panel are being disposed, the cleanup script tries to remove all registered handlers. If buttons are inside of the UpdatePanel, their handlers are still registered as for all child controls by default, but weren’t re-attached during the callback. Obviously, you can spend time and do it properly, but simply re-placing the buttons will do the job while keeping layout appearance unaltered.&lt;/p&gt;  &lt;p&gt;2. Now our buttons are outside of the UpdatePanel and we need to make it aware of relevant Click events. So we will have to add trigger to serve the OK operation:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:AsyncPostBackTrigger&lt;/span&gt; &lt;span class="attr"&gt;ControlID&lt;/span&gt;&lt;span class="kwrd"&gt;="btnOK"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Same will do for a Cancel operation but it will work just fine (and with less code) by setting ModalPopup.CancelControlID property. &lt;/p&gt;3. In the case of the Cancel button a ModalPopup “window” will be closed automatically but if you want it to be closed after the OK click, you should do it manually by calling the mpMyPopup.Hide() method.&lt;br /&gt;&lt;p&gt;4. If databound controls were changed on a callback then don't forget to call the UpdatePanel.Update() method to refresh the data.&lt;/p&gt;The resulting code is not the most efficient AJAX solution but it provides quite sophisticated business functionality at a reasonable price. Less additional code means less development time and less QA efforts as, if applied right, standard AJAX libraries are pretty robust.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-3069414835059449370?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/3069414835059449370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=3069414835059449370' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3069414835059449370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3069414835059449370'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2009/03/ajax-controls-toolkit-modalpopup.html' title='Ajax Controls Toolkit: ModalPopup extender with UpdatePanel'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-7380371740444148376</id><published>2009-01-25T09:12:00.001-05:00</published><updated>2009-01-25T09:35:41.504-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='code quality'/><title type='text'>Quality and seniority</title><content type='html'>&lt;p&gt;Another good article from &lt;a href="http://www.jbrains.ca/blog" target="_blank"&gt;J. B.&lt;/a&gt; – on a software quality. Similar to the Marxist &lt;a href="http://en.wikipedia.org/wiki/Dialectical_materialism#Law_of_Transformation" target="_blank"&gt;Law of Transformation&lt;/a&gt; the development culture can reach a point at which driving forces behind quality/speed relation switch places: at first, rushing can hurt quality, but as soon as you’ve taken the barrier – increasing quality is able to speed up the development.&lt;/p&gt;  &lt;p&gt;&lt;img height="381" src="http://images.jbrains.ca/QualitySpeedBarrier.jpg" width="473" /&gt;&lt;/p&gt;  &lt;p&gt;And how can we get super-sonic? By nurturing &lt;a href="http://blog.objectmentor.com/articles/2009/01/20/multi-dimensional-seniority" target="_blank"&gt;real seniority:&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.objectmentor.com/articles/2009/01/20/multi-dimensional-seniority" target="_blank"&gt;&lt;img src="http://farm4.static.flickr.com/3482/3213134571_2df4411867.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I wouldn’t agree though with necessity of changing employers in order to grow – you can find a place for yourself to be &lt;a href="http://lazyloading.blogspot.com/2008/04/bad-and-ugly-developer.html" target="_blank"&gt;the worst&lt;/a&gt; from time to time within same company.&lt;/p&gt;  &lt;p&gt;P.S. I like looking at the pictures better than reading and I happy to see that bloggers trying to keep up to par with R.I.P. &lt;a href="http://headrush.typepad.com/" target="_blank"&gt;Kathy Sierra’s blog&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-7380371740444148376?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/7380371740444148376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=7380371740444148376' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7380371740444148376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7380371740444148376'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2009/01/quality-and-seniority.html' title='Quality and seniority'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3482/3213134571_2df4411867_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-5873367608576771518</id><published>2009-01-25T06:51:00.001-05:00</published><updated>2009-01-25T09:53:37.518-05:00</updated><title type='text'>Neglecting blog for a good reason</title><content type='html'>&lt;p&gt;Non-writing can be very easily excused: it may be because you stuck with a give-me-a-mercy-killing company which dries your will out and you sunk in dull routines where imagination is simply not welcomed. It may be a they-are-so-awesome company, which keeps you freaking busy and you just hooked up with all learning they inspire you to engage in.&lt;/p&gt;  &lt;p&gt;And you can just be one lazy hog.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-5873367608576771518?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/5873367608576771518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=5873367608576771518' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/5873367608576771518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/5873367608576771518'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2009/01/neglecting-blog-for-good-reason.html' title='Neglecting blog for a good reason'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-6631535914281971672</id><published>2008-11-03T22:20:00.000-05:00</published><updated>2009-06-26T22:22:45.596-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='job search'/><title type='text'>Job requirements</title><content type='html'>&lt;p&gt;Maybe it is an upcoming fashion in a current economy situation but recently I've seen following skills required for a position of Senior Technical Lead:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&amp;quot;Concentration required daily using sight, hearing and touch to operate a computer, respond to problems ….”&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So I better should start training hearing, I thought, update my glasses prescription and practice touching (hopefully just for a coding purposes). At first it seemed a disappointing omission that they didn’t mention anything about requirements for a incumbent's butt, but I misunderestimated them:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;“Sits at a desk for long period of time to perform the duties of the job.&amp;quot;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Brilliant! The only question is what category those skills belong to? They not quite technical and not exactly soft…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-6631535914281971672?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/6631535914281971672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=6631535914281971672' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6631535914281971672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6631535914281971672'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/10/job-requirements.html' title='Job requirements'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-235629584227688646</id><published>2008-10-30T08:17:00.001-05:00</published><updated>2008-10-30T08:17:27.254-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Password text boxes and lean custom controls</title><content type='html'>&lt;p&gt;Great article from &lt;a href="http://www.pluralsight.com/community/blogs/keith/archive/2008/10/29/passwordtextbox.aspx" target="_blank"&gt;Keith Brown&lt;/a&gt; about improving original ASP.NET password field behaviour. &lt;/p&gt;  &lt;p&gt;It is also a good hands-on example of building elegant custom controls and using control state. At least my attempts in this area were much messier.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-235629584227688646?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/235629584227688646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=235629584227688646' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/235629584227688646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/235629584227688646'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/10/password-text-boxes-and-lean-custom.html' title='Password text boxes and lean custom controls'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-4557799486854257675</id><published>2008-10-29T22:35:00.001-05:00</published><updated>2008-10-30T10:25:31.449-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Bridging the gap</title><content type='html'>&lt;p&gt;&lt;img style="margin: 0px 15px 0px 0px" height="262" src="http://www.humberbridge.co.uk/resources/humber_bridge_shot1.jpg" width="260" align="left" /&gt; Agile interaction between client and development team is always about a trust. It is easier to achieve with internal clients - they may have already established relationship with the team, or at least they can be influenced. Bringing aboard external client usually means that at some point Agile process should be transitioned to whatever client is used to. Some unlucky Product/Project manager has to act as a filter to accept Agile feed from the team and produce some kind of acceptable output for a client and vise versa. When looking for vendors, companies rarely have in mind something different from &amp;quot;fixed price for fixed features in fixed time&amp;quot;. Software industry doesn't really have well established mechanisms for gathering and sharing success and failure statistics, so it is widely believed that such contracts minimize risks and uncertainty. It seems to provide common ground for bidding contest but in reality vendors are forced to compete in wishful thinking with their fingers crossed.&lt;/p&gt;  &lt;p&gt;But it looks like something is happening in the twilight zone. &lt;a href="http://www.openplans.org/projects/agile-contracts/summary" target="_blank"&gt;Agile Contracts&lt;/a&gt; initiative aims to continue &lt;a href="http://alistair.cockburn.us/Agile+contracts" target="_blank"&gt;Alistair Cockburn&lt;/a&gt;'s investigation of agile-tolerant vendor agreements. This hard-to-get experience is going to be summarized and hopefully community will get a solution, acceptable both to Agile teams and clients, who, for some weird but understandable reasons, want work done for their money.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-4557799486854257675?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/4557799486854257675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=4557799486854257675' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4557799486854257675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4557799486854257675'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/10/bridging-gap.html' title='Bridging the gap'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-375881587286704700</id><published>2008-10-23T12:48:00.007-05:00</published><updated>2009-07-07T19:38:07.906-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term=':)'/><title type='text'>Worktime music</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Just imagine that pushy project manager or that ignorant colleague of yours performing the song or do the dance and you will be smiling instead of cursing.&lt;/p&gt;  &lt;p&gt;   &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:f789251d-5fac-4036-a2e2-53e91f81737d" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/GCu2XMTU76s"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/GCu2XMTU76s" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;The bearded guy probably served as an inspiration for &lt;a href="http://lazyloading.blogspot.com/2008/06/wish-you-were-here.html" target="_blank"&gt;Matt The Dancer&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;   &lt;br /&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-375881587286704700?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/375881587286704700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=375881587286704700' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/375881587286704700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/375881587286704700'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/10/worktime-music.html' title='Worktime music'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-495980830429841566</id><published>2008-09-11T06:43:00.007-05:00</published><updated>2008-09-11T06:47:57.627-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='introverted programming'/><category scheme='http://www.blogger.com/atom/ns#' term=':)'/><title type='text'>CU L8R</title><content type='html'>&lt;p&gt;Apparently SOA goes WOA in JEE/.NET through JSR311 &amp;amp; WCF with REST TBA while SOAP MIA.&lt;/p&gt;  &lt;p&gt;Good news, IMHO. Oh, BTW &lt;a href="http://www.infoq.com/news/2008/09/soa-woa" target="_blank"&gt;FYI&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lazyloading.blogspot.com/2008/08/introverted-programming-buzz-oriented.html" target="_blank"&gt;LOL&lt;/a&gt;, MG&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-495980830429841566?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/495980830429841566/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=495980830429841566' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/495980830429841566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/495980830429841566'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/09/cu-l8r.html' title='CU L8R'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-6050395709741069455</id><published>2008-09-02T07:36:00.002-05:00</published><updated>2008-09-02T11:59:21.907-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cruise control'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Configurable deployment of deployable configuration. Part II</title><content type='html'>&lt;p&gt;Mark Needham (of ThoughtWorks) had a &lt;a href="http://www.markhneedham.com/blog/2008/09/02/configurable-builds-one-configuration-file-per-environment/" target="_blank"&gt;nice post&lt;/a&gt; about configuring builds for different environments. Very clean and elegant approach and a great addition to &lt;a href="http://lazyloading.blogspot.com/2007/08/configurable-deployment-of-deployable.html" target="_blank"&gt;my collection&lt;/a&gt;!&lt;/p&gt;&lt;p&gt;Update: and another two about&lt;a href="http://www.markhneedham.com/blog/2008/09/02/configurable-builds-one-configuration-file-per-user/" target="_blank"&gt; per-user configuration&lt;/a&gt; and &lt;a href="http://www.markhneedham.com/blog/2008/09/02/configurable-builds-overriding-properties/" target="_blank"&gt;overriding properties&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-6050395709741069455?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/6050395709741069455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=6050395709741069455' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6050395709741069455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6050395709741069455'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/09/configurable-deployment-of-deployable.html' title='Configurable deployment of deployable configuration. Part II'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-3237269730477577500</id><published>2008-09-01T13:00:00.000-05:00</published><updated>2008-08-31T17:55:56.690-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='buzz'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>The Agile Overdose</title><content type='html'>&lt;p&gt;Do you follow the Agile Movement? Do you like some of the recent trends?&lt;/p&gt;  &lt;p&gt;The problem, I sense, arises from the obvious fact, that more and more dedicated Agilists have moved from an actual development trenches to a coaching and high-level consulting. The agile coach is getting perceived as a spiritual leader, much like a &lt;a href="http://en.wikipedia.org/wiki/Political_commissar" target="_blank"&gt;Commissar&lt;/a&gt; in the Soviet Army. As such he does not have an assigned delivery, does not code or design architecture, so he uses his idle time to take agile theories off the ground and "develop" them out of the proportions. Inevitably they progress from the more or less fair "Design Up Front is Harmful" to derailed "Requirements are Harmful" and "Don't Let Clients Influence the Project" hallucinations. Pass me that butt, dude! I saw that "Estimations are Harmful" and going to the trip to "Code is Harmful" country!&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;[Note] If you think, that I am exaggerating then search Google yourself. I had all "practices" linked, but decided to be polite and not to point a finger.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Maybe I am mistaken and those guys are sober. Then, I guess, it's all about money. The community has said whatever it could, news are not so new anymore and a lot of companies, which wanted Agile process implemented, already did so. Now the army of &lt;strike&gt;coaches&lt;/strike&gt; agielistas has to compete for the clients by inventing one buzzy theory after another. Personally, I would like to keep my faith in humanity and believe in the mushroom version.&lt;/p&gt;  &lt;p&gt;P.S. BTW, same thing is happening within a blogging community. Quite a few reputed IT bloggers have recently "outgrown" simple development. Didn't you notice that too?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-3237269730477577500?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/3237269730477577500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=3237269730477577500' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3237269730477577500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3237269730477577500'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/08/agile-overdose.html' title='The Agile Overdose'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-7030096414436193827</id><published>2008-08-31T17:19:00.000-05:00</published><updated>2008-08-31T17:19:42.653-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='introverted programming'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Introverted Programming: The Buzz-Oriented Architecture</title><content type='html'>&lt;p&gt;It has been a while since the &lt;a href="http://lazyloading.blogspot.com/2008/06/introverted-programming-office-kung-fu.html" target="_blank"&gt;last article&lt;/a&gt; of my beloved &lt;a href="http://lazyloading.blogspot.com/search/label/introverted%20programming" target="_blank"&gt;Introverted Programming&lt;/a&gt; series. I consider it inappropriate, so here we go.&lt;/p&gt;  &lt;p&gt;What is with all these new and newer approaches, the Service Oriented Architecture, Resource Oriented Architecture, Web Oriented Architecture, File Oriented Architecture, Thick Clients and Thin Clients, RESTful, SOAPless and Quo-Vadis Services? XP, CI, TDD, WPF, WCF, WTF and OMG technologies? Their successes and their failures? &lt;/p&gt;  &lt;p&gt;What about a Get-Job-Done Oriented Architecture? I mean - when project was actually delivered, developers got paid and client has managed to not loose his business as a result?&lt;/p&gt;  &lt;p&gt;I bet that will make a good line in resume...&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-7030096414436193827?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/7030096414436193827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=7030096414436193827' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7030096414436193827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7030096414436193827'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/08/introverted-programming-buzz-oriented.html' title='Introverted Programming: The Buzz-Oriented Architecture'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-1610780607521062900</id><published>2008-08-31T11:07:00.001-05:00</published><updated>2008-08-31T11:07:03.079-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term=':)'/><title type='text'>Awesome video</title><content type='html'>&lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:52a7b737-da91-47c6-9dbe-daa35a5ea403" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ESkrwM64ejY&amp;amp;feature=related"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ESkrwM64ejY&amp;amp;feature=related" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-1610780607521062900?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/1610780607521062900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=1610780607521062900' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1610780607521062900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1610780607521062900'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/08/awesome-video.html' title='Awesome video'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-6049048792949232910</id><published>2008-08-31T07:26:00.000-05:00</published><updated>2008-08-31T17:35:25.172-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code quality'/><title type='text'>No common sense allowed</title><content type='html'>&lt;p&gt;The summer is over but not quite! You can pick a sense of that, if Agielistas' blogs are getting filled with fundamental ideas and not yet diluted by details, which is inevitable when you get back down the Earth.&lt;/p&gt;  &lt;p&gt;It is amazing how resistant software industry is to the common sense. Project after project fail and still people start from the same wrong foot in the same wrong direction, hoping that this time luck will finally turn. &lt;a href="http://www.infoq.com/news/2008/08/tech-debt-wkshp" target="_blank"&gt;Technical debt&lt;/a&gt; and understanding software investment as an &lt;a href="http://michaelfeathers.typepad.com/michael_feathers_blog/2008/08/beyond-technica.html" target="_blank"&gt;asset&lt;/a&gt; are the best concepts to highlight this misconception. &lt;/p&gt;  &lt;p&gt;Would you consider a time, but not lasting quality, as the primary factor for house repairs? Unlikely, especially if it is your primary residence. But "just get things done" is not exception for a software.&lt;/p&gt;  &lt;p&gt;Would you borrow without knowing what the conditions are? And find out that interest is 100% payable hourly? But it is OK to take design and coding shortcuts, thus increasing technical debt. &lt;/p&gt;  &lt;p&gt;Would you advice surgeon to save time by not washing hands before the operation? As a good professional, he most likely will refuse, even given an order. But developer is expected to cut off "luxurious" practices, such as unit testing and refactoring, when times are tight.&lt;/p&gt;  &lt;p&gt;Construction industry has eventually learnt, at a great cost, that there are some practices, which better obeyed, than skipped. Software industry is still young to come to similar realization. Collapsed building makes the news, while collapsed software project is easier to swipe under the carpet. Of course, the culprits will be found and fired. And will lead another project somewhere else.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-6049048792949232910?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/6049048792949232910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=6049048792949232910' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6049048792949232910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6049048792949232910'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/08/no-common-sense-allowed.html' title='No common sense allowed'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-7554082867695657387</id><published>2008-08-29T15:55:00.003-05:00</published><updated>2008-08-31T17:57:09.124-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Encrypting sections of the Web.config file - the Continuous Integration way</title><content type='html'>&lt;p&gt;The following algorithm is not the easiest way to protect your web.config (unlike &lt;a href="http://odetocode.com/Blogs/scott/archive/2006/01/08/2707.aspx" target="_blank"&gt;this solution&lt;/a&gt;). There are few advantages, though. First, we can replicate an RSA key container between multiple servers in a Web farm, thus providing a scalable solution. Second - we can automate encryption and container distribution with Continuous Integration. Developers can enjoy a readable web.config file while CI script will take care of encrypted production version.&lt;/p&gt;  &lt;p&gt;1. Add the following section to the root of the &amp;lt;configuration&amp;gt; node:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;configProtectedData&lt;/span&gt; &lt;span class="attr"&gt;defaultProvider&lt;/span&gt;&lt;span class="kwrd"&gt;="MyRsaProvider"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;providers&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;clear&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="MyRsaProvider"&lt;/span&gt;&lt;br /&gt;        &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"&lt;/span&gt;&lt;br /&gt;         &lt;span class="attr"&gt;keyContainerName&lt;/span&gt;&lt;span class="kwrd"&gt;="MySiteKeys"&lt;/span&gt; &lt;span class="attr"&gt;useMachineContainer&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;providers&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;configProtectedData&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;Intellisense or &lt;a href="http://www.jetbrains.com/resharper/" target="_blank"&gt;Resharper&lt;/a&gt; may complain about keyContainerName and &lt;span class="attr"&gt;useMachineContainer&lt;/span&gt;&lt;span class="attr"&gt; attributes - don't believe it, they just comfused.&lt;/span&gt;&lt;br /&gt;&lt;p&gt;2. Now we can create the RSA container and make it exportable:&lt;/p&gt;&lt;pre class="csharpcode"&gt;aspnet_regiis -pc &lt;span class="str"&gt;"MySiteKeys"&lt;/span&gt;-exp&lt;/pre&gt;3. Next step is to encrypt a selected web.config sections:&lt;br /&gt;&lt;pre class="csharpcode"&gt;aspnet_regiis -pef &lt;span class="str"&gt;"connectionStrings"&lt;/span&gt; &lt;span class="str"&gt;"c:\MySite\WebUI"&lt;/span&gt; -prov &lt;span class="str"&gt;"MyRsaProvider"&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;The same way you can encrypt connectionString, system.web/membership, AppSettings and any custom configuration section.&lt;/p&gt;&lt;p&gt;&lt;span class="attr"&gt;&lt;/span&gt;Make sure that string attribute values in the encrypted sections (including the &lt;span class="html"&gt;configProtectedData&lt;/span&gt;) are not split on several lines. The  aspnet_regiis tool will try to reproduce the carriage return symbols and encode them: &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/goldobine/SLhiOfbZy_I/AAAAAAAAAI8/90dv8XduJmY/s1600-h/image%5B11%5D.png"&gt;&lt;img style="border-width: 0px;" alt="image" src="http://lh5.ggpht.com/goldobine/SLhiOpx-EkI/AAAAAAAAAJA/_EwFolEURH8/image_thumb%5B7%5D.png?imgmax=800" border="0" width="615" height="76" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;It is not affecting the application execution in any way, but looks weird and confusing.&lt;/p&gt;4. Save the above key to xml file in order to export it from your local PC to the WebServer (UAT or Production)&lt;br /&gt;&lt;pre class="csharpcode"&gt;aspnet_regiis -px &lt;span class="str"&gt;"MySiteKeys"&lt;/span&gt; "c:\mykeyfile.xml" -pri&lt;/pre&gt;&lt;p&gt;-pri option enforces both private and public keys to be exported thus enabling encryption and decryption.&lt;/p&gt;5. Now you have encrypted web.config file and key xml files. The first part - the deployable package creation, is done and your application is ready to be deployed to the web servers.&lt;br /&gt;&lt;p&gt;  For the next two steps - deployment and permissions settings, the Continuous Integration script should be executed under account with admin privileges.&lt;/p&gt;&lt;p&gt;Import the key container on WebServer servers:&lt;/p&gt;&lt;pre class="csharpcode"&gt;aspnet_regiis -pi &lt;span class="str"&gt;"MySiteKeys"&lt;/span&gt; &lt;span class="str"&gt;"c:\mykeyfile.xml"&lt;/span&gt;&lt;/pre&gt;To make Continuous Integration script more defensive, you can clean the container first. The task will attempt to remove key container, failing if container wasn't found, so it should be made fail-tolerant (&lt;em&gt;failonerror="false"&lt;/em&gt; for NAnt script).&lt;br /&gt;&lt;pre class="csharpcode"&gt;aspnet_regiis -pz &lt;span class="str"&gt;"MySiteKeys"&lt;/span&gt;&lt;/pre&gt;Be careful to not run this task locally on the container source machine :).&lt;br /&gt;&lt;p&gt;6. Grant an access to the key container to the ASP.NET account&lt;/p&gt;&lt;pre class="csharpcode"&gt;aspnet_regiis -pa &lt;span class="str"&gt;"MySiteKeys"&lt;/span&gt; &lt;span class="str"&gt;"DOMAIN\USER"&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;If, like me, you are never sure, what identity the ASPNET process runs under - test it by adding this code to any of your ASP.NET pages:&lt;/p&gt;&lt;pre class="csharpcode"&gt;Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-7554082867695657387?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/7554082867695657387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=7554082867695657387' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7554082867695657387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7554082867695657387'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/08/encrypting-sections-of-webconfig-file.html' title='Encrypting sections of the Web.config file - the Continuous Integration way'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/goldobine/SLhiOpx-EkI/AAAAAAAAAJA/_EwFolEURH8/s72-c/image_thumb%5B7%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-7299490377108454451</id><published>2008-08-24T16:08:00.001-05:00</published><updated>2008-08-24T16:08:11.589-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Building a Web 2.0 Portal with ASP.Net 3.5</title><content type='html'>&lt;p&gt;&lt;a href="http://www.amazon.ca/Building-Web-2-0-Portal-ASP-Net/dp/0596510500/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1219604511&amp;amp;sr=8-1" target="_blank"&gt;&lt;img height="175" src="http://ecx.images-amazon.com/images/I/51ZdlS4Tc3L._SL500_AA240_.jpg" width="175" align="left" /&gt;&lt;/a&gt; That's a lot of numbers so it can give you an impression that this is another very specific story about the hottest technologies of today. Well, it is. You can pick up most modern buzz words, put them in the resume and sound profound and sophisticated on job interviews.&lt;/p&gt;  &lt;p&gt;There is more, though. Clever code shows up depths of a traditional ASP.NET, which you supposed to know at least for a last couple years to consider yourself a good ASP.NET developer. So, naturally, I found some stuff new for me.&lt;/p&gt;  &lt;p&gt;And what is even better - the book guides you through framework building step by step, explaining every decision, tradeoff and implications of each choice made or rejected. It is rare and thorough overview of evolving architecture in a progress. Invaluable if you ask me, especially if you deprived a privilege to observe truly good architects in their natural habitat - a live project.&lt;/p&gt;  &lt;p&gt;For a first glance check the &lt;a href="http://www.dropthings.com/" target="_blank"&gt;live example&lt;/a&gt;, it is awesome.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-7299490377108454451?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/7299490377108454451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=7299490377108454451' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7299490377108454451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7299490377108454451'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/08/building-web-20-portal-with-aspnet-35.html' title='Building a Web 2.0 Portal with ASP.Net 3.5'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-996564268151765976</id><published>2008-08-24T13:57:00.004-05:00</published><updated>2008-08-24T16:11:18.846-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code quality'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>A perceived complexity</title><content type='html'>&lt;p&gt;This question I've heard during one of my interviews quite a while ago: &amp;quot;How you handle high-demand database requests when you need to perform five or six joins with &lt;em&gt;data&lt;/em&gt; tables?&amp;quot; (&amp;quot;&lt;em&gt;data&amp;quot;&lt;/em&gt; is emphasized because user data tables and not lookup tables were in scope - I clarified this specifically). The question is not important (I guess &amp;quot;that's stupid&amp;quot; was good enough answer). The join details are not important either. What was important - the question assumed a necessity of an unneeded complexity. &lt;/p&gt;  &lt;p&gt;Honestly, it was the first time I gave it a thought. Look at formalization of your applications - how many relations require more sophisticated approach, than &amp;quot;one-to-one&amp;quot; or &amp;quot;one-to-many&amp;quot;? To your surprise you can find that it happens rarely, if ever. In most of the cases, when I though that complexity existed, I was proven wrong. And you know why? Because the object model of any intricacy comes down to the user-facing interface and humans are notoriously unable to tackle the overcomplications you think to unleash on them. That particular interview question was about building a robust forum portal, and functionality looked overwhelming - all those sub-portals and forums with discussions, posts, comments, cross-links and other stuff. But any meaningful user function drilled down to the same parent-children routine: forum with discussions, discussion with posts, post with comments and so on. User doesn't care about surrounding complexity while dealing with convenient and comprehensive &amp;quot;one-to-many&amp;quot; entity.&lt;/p&gt;  &lt;p&gt;Higher level of complexity can even serve as an alarm bell - an indication, that business rules are handled in the database. In this case big joins is not your biggest problem.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-996564268151765976?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/996564268151765976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=996564268151765976' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/996564268151765976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/996564268151765976'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/08/perceived-complexity.html' title='A perceived complexity'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-4899018790758594195</id><published>2008-08-22T08:40:00.007-05:00</published><updated>2011-05-05T07:30:04.722-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='buzz'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><category scheme='http://www.blogger.com/atom/ns#' term='red gate'/><title type='text'>Managing Continuous Database Integration with Red Gate tools. Part III. "A New Hope"</title><content type='html'>&lt;p&gt;Yesterday I've spilled some &lt;a href="http://lazyloading.blogspot.com/2008/08/managing-continuous-database.html" target="_blank"&gt;frustration&lt;/a&gt; (legitimate or not) over Red Gate licensing policies. It appeared that any flaws in this area company compensates with customer-oriented approach which, unspoiled by Microsoft &amp;amp; Co, I find unprecedented. &lt;/p&gt;&lt;p&gt;Despite me calling them names, they took an effort to patiently explain their &lt;a href="https://www.blogger.com/comment.g?blogID=50290113271213162&amp;amp;postID=3639224038875552109" target="_blank"&gt;position&lt;/a&gt; &lt;a href="https://www.blogger.com/comment.g?blogID=50290113271213162&amp;amp;postID=8900026683961559356" target="_blank"&gt;and&lt;/a&gt; &lt;a href="https://www.blogger.com/comment.g?blogID=50290113271213162&amp;amp;postID=2390144611614491600" target="_blank"&gt;ways&lt;/a&gt;. Faced with such a gallantry I have no other choice but to apologize for my emotional thrusts and to admit that Red Gate is not "another greedy ignorant &lt;strike&gt;Apple Corporation&lt;/strike&gt; software company". That's a big relief.&lt;/p&gt;&lt;p&gt;Similarly, the .NET Reflector future looks brighter now. The question, though, still remains - will it become "Red Gate Lutz Roeder's .NET Reflector" or stay "Lutz Roeder's Red Gate .NET Reflector"?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-4899018790758594195?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/4899018790758594195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=4899018790758594195' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4899018790758594195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4899018790758594195'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/08/managing-continuous-database_22.html' title='Managing Continuous Database Integration with Red Gate tools. Part III. &amp;quot;A New Hope&amp;quot;'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-2390144611614491600</id><published>2008-08-21T13:40:00.004-05:00</published><updated>2011-05-05T07:28:00.128-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='buzz'/><category scheme='http://www.blogger.com/atom/ns#' term='code quality'/><category scheme='http://www.blogger.com/atom/ns#' term='red gate'/><title type='text'>Red Gate bought .NET Reflector</title><content type='html'>&lt;p&gt;When I've read the &lt;a href="http://www.infoq.com/news/2008/08/reflector-redgate" target="_blank"&gt;InfoQ article&lt;/a&gt; my first reaction was panic. I &lt;a href="http://lazyloading.blogspot.com/2008/08/managing-continuous-database.html" target="_blank"&gt;had experience with Red Gate&lt;/a&gt; which can not be considered utterly positive. The parties comments are &lt;a href="http://blog.lutzroeder.com/2008/08/future-of-net-reflector.html" target="_blank"&gt;mutually&lt;/a&gt; &lt;a href="http://www.red-gate.com/products/reflector/" target="_blank"&gt;optimistic&lt;/a&gt; but I still have a sinking feeling in my stomach.&lt;/p&gt;&lt;p&gt;I wouldn't be surprised at all, if &amp;quot;free community edition&amp;quot; will evolve to the &amp;quot;free community 30-day trial&amp;quot;. You will have to buy Pro version, which will allow you to add new libraries for inspection, .NET Reflector Toolbelt license for Disassembly functionality and Ultimate edition license if you actually want to translate disassembled code from German to C#.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-2390144611614491600?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/2390144611614491600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=2390144611614491600' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/2390144611614491600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/2390144611614491600'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/08/red-gate-again-gruesome-news.html' title='Red Gate bought .NET Reflector'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-8900026683961559356</id><published>2008-08-21T13:22:00.005-05:00</published><updated>2011-05-05T07:29:16.299-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cruise control'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><category scheme='http://www.blogger.com/atom/ns#' term='red gate'/><title type='text'>Managing Continuous Database Integration with Red Gate. Part II. "The Achievement"</title><content type='html'>&lt;p&gt;When you done with &lt;a href="http://lazyloading.blogspot.com/2008/08/managing-continuous-database.html" target="_blank"&gt;bitching&lt;/a&gt; the rest is easy. It is confirmed that you need nothing but &lt;a href="http://www.red-gate.com/products/SQL_Comparison_SDK/index.htm" target="_blank"&gt;SQL Comparison SDK&lt;/a&gt; (currently in version 7). &lt;a href="http://www.red-gate.com/supportcenter/Content.aspx?p=SQL%20Comparison%20SDK&amp;amp;c=SQL_Comparison_SDK%5chelp%5c7.0%5cSDK_landing_page.htm" target="_blank"&gt;Help projects&lt;/a&gt; are pretty good and offer valuable help. You will be using SQL Compare API to generate the structure update script and SQL Data Compare - for data upgrade script (i.e. for a lookup tables).&lt;/p&gt;&lt;p&gt;Another option is to purchase the whole &lt;a href="http://www.red-gate.com/products/SQL_Professional_Toolbelt/index.htm" target="_blank"&gt;SQL Toolbelt&lt;/a&gt;. Version 7.0 includes SQL Compare and SQL Data Compare Professional, which is necessary to run these tools from a command line. This approach will cost you dare $1600 and your options are pretty much limited to a batch scripting so I decided to stick with the API.&lt;/p&gt;&lt;p&gt;You have to download &lt;a href="http://www.red-gate.com/products/SQL_Professional_Toolbelt/index.htm" target="_blank"&gt;SQL Toolbelt&lt;/a&gt; and install SQL Compare, SQL Data Compare and SQL Comparison SDK. You have to pay for the SDK license only (I guess this means that you won't be able to use Toolbelt UI).&lt;/p&gt;&lt;p&gt;The project has to refer the RedGate.Shared.SQL, RedGate.Shared.Utils and RedGate.SQLCompare.Engine libraries, while RedGate.Licensing.Client, RedGate.SQLCompare.ASTParser and RedGate.SQLCompare.Rewriter DLLs should reside side-by-side with listed above in order the project to compile. My test solution uses only SQL Compare so I guess there will be couple more required for the SQL Data Compare.&lt;/p&gt;&lt;p&gt;At some point I've created a license.licx filie, which contains one line&lt;/p&gt;&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;RedGate.SQLCompare.Engine.Database, RedGate.SQLCompare.Engine&lt;/pre&gt;&lt;/blockquote&gt;but I migrated solution from version 6.0 to 7.0 since then an I am not sure if it still required.&lt;br /&gt;&lt;br /&gt;This is the core code:&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; folder; &lt;span class="rem"&gt;//folder&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; server1; &lt;span class="rem"&gt;//DEV Server &lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; server2; &lt;span class="rem"&gt;//BAT server&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; db1; &lt;span class="rem"&gt;//DEV database&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; db2; &lt;span class="rem"&gt;//BAT database&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; file; &lt;span class="rem"&gt;//script file name&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; waitForInput=&lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; verbose=&lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!ResolveParameters(args)) &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;br /&gt;EvaluateVariables();&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; (Database widgetDEV = &lt;span class="kwrd"&gt;new&lt;/span&gt; Database(), widgetBAT = &lt;span class="kwrd"&gt;new&lt;/span&gt; Database())&lt;br /&gt;{&lt;br /&gt;var options = Options.Default;&lt;br /&gt;widgetDEV.Register(&lt;span class="kwrd"&gt;new&lt;/span&gt; ConnectionProperties(server1, db1), options);&lt;br /&gt;widgetBAT.Register(&lt;span class="kwrd"&gt;new&lt;/span&gt; ConnectionProperties(server2, db2), options);&lt;br /&gt;&lt;br /&gt;var dev_bat = GetDifferences(widgetDEV, widgetBAT);&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (verbose)&lt;br /&gt;Write(&lt;span class="kwrd"&gt;null&lt;/span&gt;, dev_bat,&lt;br /&gt;item =&amp;gt;&lt;br /&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0} {1} {2}"&lt;/span&gt;, ((Difference) item).Type,&lt;br /&gt;((Difference) item).DatabaseObjectType, ((Difference) item).Name));&lt;br /&gt;&lt;br /&gt;var script = GenerateScript(dev_bat);&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (verbose) Write(&lt;span class="str"&gt;"Script length:"&lt;/span&gt;, script);&lt;br /&gt;WriteScriptToFile(script);&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (waitForInput)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine(&lt;span class="str"&gt;"Press [Enter]"&lt;/span&gt;);&lt;br /&gt;Console.ReadLine();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;catch&lt;/span&gt; (ApplicationException ex)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine(&lt;span class="str"&gt;"ERROR OCCURED: "&lt;/span&gt; + ex.Message);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GenerateScript(Differences dev_bat)&lt;br /&gt;{&lt;br /&gt;&lt;span class="rem"&gt;// Calculate the work to do using sensible default options&lt;/span&gt;&lt;br /&gt;var work = &lt;span class="kwrd"&gt;new&lt;/span&gt; Work();&lt;br /&gt;work.BuildFromDifferences(dev_bat, Options.Default, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (verbose) Write(&lt;span class="str"&gt;"Messages:"&lt;/span&gt;, work.Messages, item =&amp;gt; ((Message) item).Text);&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (work.Warnings.Count&amp;gt;0 &amp;amp;&amp;amp; verbose)&lt;br /&gt;Write(&lt;span class="str"&gt;"Warnings:"&lt;/span&gt;, work.Warnings, item =&amp;gt; ((Message) item).Text);&lt;br /&gt;var script = (work.ExecutionBlock!=&lt;span class="kwrd"&gt;null&lt;/span&gt;)?work.ExecutionBlock.GetString():&lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; script;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Differences GetDifferences(Database widgetDEV, Database widgetBAT)&lt;br /&gt;{&lt;br /&gt;var dev_bat = widgetDEV.CompareWith(widgetBAT, Options.Default);&lt;br /&gt;&lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Difference difference &lt;span class="kwrd"&gt;in&lt;/span&gt; dev_bat) difference.Selected = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span class="kwrd"&gt;return&lt;/span&gt; dev_bat;&lt;br /&gt;}&lt;/pre&gt;The omitted methods are simple but tedious argument extractors, file writers and loggers.The application compares a development database DEV (which had some changes) with testing/production database BAT and generates one-way upgrade script for the latter. At this point I didn't find out yet how to include objects, which were removed from the DEV database, and if this feature even required. This kind of functionality can present some potential danger.&lt;br /&gt;&lt;p&gt;The NAnt script calls the provided EXE with the following task:&lt;br /&gt;&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;exec&lt;/span&gt; &lt;span class="attr"&gt;basedir&lt;/span&gt;&lt;span class="kwrd"&gt;="${CCNetWorkingDirectory}/Binaries/UpgradeGenerator"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;program&lt;/span&gt;&lt;span class="kwrd"&gt;="UpgradeGenerator.exe"&lt;/span&gt; &lt;span class="attr"&gt;timeout&lt;/span&gt;&lt;span class="kwrd"&gt;="10000"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;arg&lt;/span&gt; &lt;span class="attr"&gt;line&lt;/span&gt;&lt;span class="kwrd"&gt;="s1=dbserverDEV s2=dvserverBAT&lt;br /&gt;db1=testdb_dev db2=testdb_bat f=update-${CCNetLabel}.sql"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;exec&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;The rest is obvious. Once again - the sample projects provide great insight for the functionality.&lt;br /&gt;&lt;p&gt;There are few things to consider, though.&lt;/p&gt;&lt;p&gt;My original intent was to keep the solution as a source code and check it out and compile during the build. This would require you to install the SQL Comparison SDL license on the server, otherwise it will be trying to fire popup and effectively kill the build. So I ended up placing a compiled executable in the Subversion, in Binaries folder, which effectively &lt;a href="http://lazyloading.blogspot.com/2008/07/little-subversion-trick-to-improve.html" target="_blank"&gt;made it a part&lt;/a&gt; of any tracked project.&lt;/p&gt;&lt;p&gt;Another mystery, which still remains unresolved, is an unexpected behavior of the application which remains in the memory after execution. As a result the CC.NET worker thread hangs indefinitely and your build will be showing "Building" until you manually kill the generator process. As a workaround I limited a timeout for the &amp;lt;exec&amp;gt; task (refer the code above) and call this task with &lt;em&gt;failonerror="false"&lt;/em&gt; attribute. This is a dirty trick, but it does its job on this stage.&lt;/p&gt;&lt;p&gt;As a conclusion I note that while more sophisticated approaches available, including your own NAnt task, even this simple approach works just fine.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-8900026683961559356?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/8900026683961559356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=8900026683961559356' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/8900026683961559356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/8900026683961559356'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/08/managing-continuous-database_21.html' title='Managing Continuous Database Integration with Red Gate. Part II. &amp;quot;The Achievement&amp;quot;'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-3639224038875552109</id><published>2008-08-21T12:08:00.003-05:00</published><updated>2011-05-05T07:27:11.760-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><category scheme='http://www.blogger.com/atom/ns#' term='red gate'/><title type='text'>Managing Continuous Database Integration with Red Gate. Part I. "The Bitching"</title><content type='html'>&lt;p&gt;Red Gate tools will do whatever you can imagine you would need while developing, deploying and maintaining a database-backed software. The products are great but unfortunately &lt;a href="http://www.apocalypse.org/pub/u/kjc/cool/Card.on.Software.html" target="_blank"&gt;marketing types clearly took over&lt;/a&gt; the company. &lt;/p&gt;&lt;p&gt;I have never seen so ridiculously confusing pricing and licensing policies - we've spend few weeks in negotiations and still it is unclear how what they sell is mapped to what we actually need. And why we have to pay additional $2500 to use a command-line of the package for which we've already paid $1000? The "Red Gate market segmentation" translates from Redgate Marketuanian as "marketing department job security".&lt;/p&gt;&lt;p&gt;Even if you went through &lt;strike&gt;an extortion&lt;/strike&gt; a purchasing transaction the frustration is far from over. The installation application is a wreck of the functionality. Site would tell you that for our task we need the SQL Comparison SDK, which is priced and marketed as a stand-alone application. But it is not available as a separate download - it is part of a SQL Toolbelt which is priced much higher. If you downloaded Toolbelt and installed &lt;u&gt;only&lt;/u&gt; SDK you will end up with a single "Getting started" HTML page, no DLLs. Duh!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-3639224038875552109?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/3639224038875552109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=3639224038875552109' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3639224038875552109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3639224038875552109'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/08/managing-continuous-database.html' title='Managing Continuous Database Integration with Red Gate. Part I. &amp;quot;The Bitching&amp;quot;'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-781484858691044977</id><published>2008-08-21T07:35:00.001-05:00</published><updated>2008-08-21T07:35:51.952-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Things that Every Software Architect Should Know</title><content type='html'>&lt;p&gt;There is always something around that you must know to become (or to stay) a good professional. How can you find it out? Follow a trusted advice. I just love the &lt;a href="http://www.hanselman.com/blog/TheWeeklySourceCode32AtomAtomPubAndBlogSvcAnAtomPubServerInWCF.aspx" target="_blank"&gt;Scott Hanselman's &amp;quot;Weekly Source Code&amp;quot;&lt;/a&gt; crusade, though rarely able to follow the 100% of the implied beauty, but that's the whole reason why I like it.&lt;/p&gt;  &lt;p&gt;Imagine my anxiety when RSS reader brought the &amp;quot;&lt;a href="http://memeagora.blogspot.com/2008/08/97-things-every-software-architect.html" target="_blank"&gt;97 Things Every Software Architect Should Know&lt;/a&gt;&amp;quot; article. Holy @$%#, 97! What a fount of wisdom must it be! Surprisingly, the article didn't contain 97 Things. Not even the original 10 Things. It was merely the announcement of the upcoming &amp;quot;Beautiful Code Or Whatever&amp;quot; book from O'Reilly. I assume that the book will be a product of collective email list wisdom, much like the Spolsky's &lt;a href="http://www.amazon.com/Best-Software-Writing-Selected-Introduced/dp/1590595009/ref=pd_bbs_sr_4?ie=UTF8&amp;amp;s=books&amp;amp;qid=1219320616&amp;amp;sr=8-4" target="_blank"&gt;&amp;quot;Best Software Writing&amp;quot;&lt;/a&gt;. It seems to be an accepted practice so I have nothing against that. But if you weren't the original email list subscriber, it's too bad. You can't just get those 97 Things - it's proprietary now. Buy the book.&lt;/p&gt;  &lt;p&gt;P.S. All right, all right, it's exaggeration. &lt;a href="http://97-things.near-time.net/wiki" target="_blank"&gt;Some of the Axioms&lt;/a&gt; are available, though quite a bit of them are questionable and I wouldn't buy a book which they make into.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-781484858691044977?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/781484858691044977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=781484858691044977' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/781484858691044977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/781484858691044977'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/08/things-that-every-software-architect.html' title='Things that Every Software Architect Should Know'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-7105463223806094264</id><published>2008-08-12T20:03:00.001-05:00</published><updated>2008-08-13T08:40:17.841-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='code quality'/><title type='text'>Beware the automated unit testing</title><content type='html'>&lt;p&gt;As one of the core agile practices, unit testing single-handedly can become a deal breaker, while selling Agile to the company. Test harness is a visible investment while Testing as a ubiquitous process is intangible and connection between the price and benefit is not obvious.&lt;/p&gt;  &lt;p&gt;If you apply notions of &lt;a href="http://www.ctg.albany.edu/publications/guides/roi" target="_blank"&gt;Return on Investment&lt;/a&gt; and &lt;a href="http://www.techsoup.org/learningcenter/techplan/archives/page9828.cfm" target="_blank"&gt;Total Cost&lt;/a&gt; of &lt;a href="http://en.wikipedia.org/wiki/Total_cost_of_ownership" target="_blank"&gt;Ownership&lt;/a&gt; to the realties of the software development, the emphasis will be on maintenance, quality and other "ephemeral" concepts. Organizations often pay attention to Software &lt;em&gt;Development&lt;/em&gt; Lifecycle, which doesn't take in account a long-term maintenance, while latest amounts to up to 90% of the total project costs. This and frequent misinterpretation of the &lt;a href="http://blogs.rev-net.com/ddewinter/2007/01/05/%C2%BB-pass-made-part-2-of-2/" target="_blank"&gt;PASS MADE&lt;/a&gt; principles lure dilettantes to perceive maintainability as a second-rate goal. "Saving" on testing and quality assurance in pursuit of short-term goals, organizations actually undermine quality but do not understand it or see it as a canning scheme to keep shaking customer for more money. &lt;/p&gt;  &lt;p&gt;The unit test harness (left alone TDD) plays a crucial role in keeping application afloat during development and a long way after it done. &lt;/p&gt;  &lt;p&gt;Said that, I still think that management should be very careful, giving a green light to TDD and unit testing. The "light weight" of Agile process does not mean "light control" but rather assumes that rigid discipline and self-control would become self-replicating daily practices. If you made a commitment to the practice you'd better stick to it. Nothing is worse, than investing the time and effort in the test coverage and &lt;a href="http://martinfowler.com/bliki/TestCancer.html" target="_blank"&gt;abandoning it after project is done&lt;/a&gt;. No doubt, the tests have already helped along the way - minimizing integration and regression testing time and indirectly promoting the better design. But by letting harness rot in oblivion, the organization will deprive itself from ripping a long-lasting benefits, and also will give itself a false sense of &lt;strike&gt;security&lt;/strike&gt; actually implementing some of the practices (and blame them for the failure afterwards).&lt;/p&gt;  &lt;p&gt;So don't get into that relationship if you not sure that you will stay committed.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-7105463223806094264?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/7105463223806094264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=7105463223806094264' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7105463223806094264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7105463223806094264'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/08/beware-automated-unit-testing.html' title='Beware the automated unit testing'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-2460781524818889062</id><published>2008-08-12T19:47:00.001-05:00</published><updated>2008-08-13T06:46:14.222-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='buzz'/><title type='text'>Dos Tequilas por favor!</title><content type='html'>&lt;img style="margin: 0px 10px 0px 0px;" src="http://pro.corbis.com/images/CB005726.jpg?size=572&amp;amp;uid=%7BF6E2C860-9F16-4FD3-BD06-C629DA2AEB57%7D" align="left" height="148" width="124" /&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;That's all I can say after the pretty wearisome flight... &lt;/p&gt;  &lt;p&gt;Disappointments:&lt;/p&gt;  &lt;p&gt;- They not going to host "Agile Varadero" any time soon.&lt;/p&gt;  &lt;p&gt;- "Che" T-shirts are sold to the filthy reach imperialists only - I find the price of $19 quite excessive.&lt;/p&gt;  &lt;p&gt;Pluses:&lt;/p&gt;  &lt;p&gt;- Everything else, which has an "ocean" or "sun" in it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-2460781524818889062?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/2460781524818889062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=2460781524818889062' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/2460781524818889062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/2460781524818889062'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/08/dos-tequilas-por-favor.html' title='Dos Tequilas por favor!'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-2360052089948615223</id><published>2008-07-31T12:33:00.000-05:00</published><updated>2008-08-02T12:33:18.571-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='buzz'/><title type='text'>Don't you hate DEMOs?</title><content type='html'>&lt;p&gt;You've heard about jolly good presentation, which you missed, to your deepest regret. But luckily a downloadable version is available, so you go there, get it, run and... Cripes! The page, promising the &amp;quot;self-explanatory code which will make it all clear for you&amp;quot; is followed by an empty one with a big fat &amp;quot;DEMO&amp;quot; and nothing else. &lt;/p&gt;  &lt;p&gt;90% of Microsoft presentation seems to be like that - it is like there is a corporate standard enforced. Presenter could spend two/thirds of the the time, presenting the code, but still do not include code snippets in the presentation itself or at least accompany online version with the source code. &lt;/p&gt;  &lt;p&gt;Please, don't do that.&lt;/p&gt;  &lt;p&gt;P.S. Newly adopted screencasts suffer from the same problem, but there is joint fault of both presenter and operator. It is even more annoying to stare at the presenter while he is pointing out how &amp;quot;this class is neatly mapped with this tricky instance&amp;quot;. Please, don't do that too.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-2360052089948615223?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/2360052089948615223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=2360052089948615223' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/2360052089948615223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/2360052089948615223'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/07/don-you-hate-demos.html' title='Don&amp;#39;t you hate DEMOs?'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-3790923808036449085</id><published>2008-07-30T07:45:00.003-05:00</published><updated>2008-07-30T10:45:15.040-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>One more time about a "Triumph of the (group) will"</title><content type='html'>&lt;p&gt;What is undoubtedly good about &lt;a href="http://blogs.thoughtworks.com/" target="_blank"&gt;ThoughtWorks&lt;/a&gt; - is that thoughts are definitely at work there. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.thekua.com/atwork/2008/07/29/what-do-you-have-more-of/" target="_blank"&gt;Patrick Kua&lt;/a&gt; just had a post about a group thinking vs. thinking of groups. He has a lovely picture:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.thekua.com/atwork/2008/07/29/what-do-you-have-more-of/" target="_blank"&gt;&lt;img src="http://www.thekua.com/atwork/wp-content/uploads/2008/07/teamsvsgroups.jpg" height="262" width="459" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;That was an easy one - &lt;a href="http://headrush.typepad.com/creating_passionate_users/" target="_blank"&gt;Cathy Sierra&lt;/a&gt; had a great post back in 2007 about &lt;a href="http://headrush.typepad.com/creating_passionate_users/2007/01/the_dumbness_of.html" target="_blank"&gt;"Dumbness of crowds"&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://headrush.typepad.com/creating_passionate_users/2007/01/the_dumbness_of.html" target="_blank"&gt;&lt;img src="http://headrush.typepad.com/photos/uncategorized/wisdomofcrowdsradar.png" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;So superiority of the collective thinking is not the law of nature. The dullness of averaging is just one side of the problem, though. It is not just a committee is incapable of producing the next Google - the unified thinking can make a team miss the point. &lt;/p&gt;  &lt;p&gt;I would argue for the "Collective Intelligence" vs. "Wisdom of Crowds" - the way of harvesting individual contributions in order to produce something what customer actually wanted:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/goldobine/SJBicOaoHXI/AAAAAAAAAI0/wssZXeRPdOI/s1600-h/CollectiveThinking%5B12%5D.jpg"&gt;&lt;img style="border: 0px none ;" alt="CollectiveThinking" src="http://lh6.ggpht.com/goldobine/SJBicUrEdYI/AAAAAAAAAI4/LBEcj_Elnj0/CollectiveThinking_thumb%5B8%5D.jpg?imgmax=800" border="0" height="292" width="179" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;P.S. And I just couldn't help it: In a team you reach the goal. In Soviet Russia goal reaches you :)&lt;/p&gt;&lt;p&gt;P.P.S. And of course Patrick's intention wasn't to advocate the clone thinking and he points this out in the &lt;a href="http://www.thekua.com/atwork/2008/07/29/what-do-you-have-more-of/#comment-22041"&gt;comment&lt;/a&gt;. It's just the original post was allowing too much room for misinterpretation. You can have an opinion, but in Soviet Russia opinion has you!&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-3790923808036449085?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/3790923808036449085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=3790923808036449085' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3790923808036449085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3790923808036449085'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/07/one-more-time-about-of-group-will.html' title='One more time about a &amp;quot;Triumph of the (group) will&amp;quot;'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/goldobine/SJBicUrEdYI/AAAAAAAAAI4/LBEcj_Elnj0/s72-c/CollectiveThinking_thumb%5B8%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-1763302477870993431</id><published>2008-07-29T21:10:00.001-05:00</published><updated>2008-07-29T21:10:52.734-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term=':)'/><title type='text'>In Soviet Russia...</title><content type='html'>&lt;p&gt;In Extreme Programming, you continually test your code. In Waterfall, your code continually tests you.&lt;/p&gt; &amp;#169; &lt;a href="http://c2.com/cgi/wiki?TimLesher" target="_blank"&gt;Tim Lesher&lt;/a&gt; &amp;amp; &lt;a href="http://en.wikipedia.org/wiki/Yakov_Smirnoff" target="_blank"&gt;Yakov Smirnoff&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-1763302477870993431?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/1763302477870993431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=1763302477870993431' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1763302477870993431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1763302477870993431'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/07/in-soviet-russia.html' title='In Soviet Russia...'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-4596642353919642673</id><published>2008-07-25T10:00:00.003-05:00</published><updated>2008-07-25T10:15:40.530-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Lazy TryParse</title><content type='html'>&lt;p&gt;This is my &lt;a href="http://lazyloading.blogspot.com/2008/04/enumtryparse-with-net-35-extension.html" target="_blank"&gt;second attempt on the TryParse with the C# 3.0 Extension Methods&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;I just noticed that I am copy-pasting a lot of the Integer and Boolean parsing in my current project. Maybe I just don't know any better but I ended up using TryParse this way:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;int&lt;/span&gt; intParsed;&lt;br /&gt;&lt;span class="kwrd"&gt;value&lt;/span&gt;= &lt;span class="kwrd"&gt;int&lt;/span&gt;.TryParse(reader[&lt;span class="str"&gt;"Value"&lt;/span&gt;].ToString(), &lt;span class="kwrd"&gt;out&lt;/span&gt; intParsed) ? intParsed : 0;&lt;/pre&gt;&lt;p&gt;or a little bit simpler:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;int&lt;/span&gt; intParsed= &lt;span class="kwrd"&gt;int&lt;/span&gt;.TryParse(reader[&lt;span class="str"&gt;"Value"&lt;/span&gt;].ToString(), &lt;span class="kwrd"&gt;out&lt;/span&gt; intParsed) ? intParsed : 0;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;I will appreciate if somebody would show me simpler solution but so far it is as it is. I am stuck with .NET 2.0 for now, but would it be 3.5, I'd put together an extension method. It started as a pretty simple extension of a Int32 type, but quickly evolved to the more generic solution, which uses some kind of &lt;a href="http://en.wikipedia.org/wiki/Duck_typing" target="_blank"&gt;Duck Typing&lt;/a&gt; guessing:&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TryParseExtender&lt;br /&gt;{&lt;br /&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; T LazyTryParse&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; T instance, &lt;span class="kwrd"&gt;object&lt;/span&gt; input)&lt;br /&gt; {&lt;br /&gt;     Type type = &lt;span class="kwrd"&gt;typeof&lt;/span&gt; (T);&lt;br /&gt;     MemberInfo[] members = type.FindMembers(&lt;br /&gt;         MemberTypes.Method,&lt;br /&gt;         BindingFlags.Public | BindingFlags.Static,&lt;br /&gt;         (objMemberInfo, objSearch) =&amp;gt; objMemberInfo.Name.Equals(objSearch.ToString()),&lt;br /&gt;         &lt;span class="str"&gt;"TryParse"&lt;/span&gt;&lt;br /&gt;         );&lt;br /&gt;     &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (MemberInfo info &lt;span class="kwrd"&gt;in&lt;/span&gt; members)&lt;br /&gt;     {&lt;br /&gt;         &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;br /&gt;         {&lt;br /&gt;             &lt;span class="kwrd"&gt;bool&lt;/span&gt; boolResult;&lt;br /&gt;             &lt;span class="kwrd"&gt;object&lt;/span&gt;[] paramArray=&lt;span class="kwrd"&gt;new&lt;/span&gt;[]{input, instance};&lt;br /&gt;             &lt;span class="kwrd"&gt;object&lt;/span&gt; objResult = ((MethodInfo) info).Invoke(instance, paramArray);&lt;br /&gt;             &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;bool&lt;/span&gt;.TryParse(objResult.ToString(), &lt;span class="kwrd"&gt;out&lt;/span&gt; boolResult)) &lt;span class="kwrd"&gt;return&lt;/span&gt; (T)paramArray[1];&lt;br /&gt;             &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;         }&lt;br /&gt;         &lt;span class="kwrd"&gt;catch&lt;/span&gt; {}&lt;br /&gt;     }&lt;br /&gt;     &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(type+ &lt;span class="str"&gt;" doesn't support TryParse"&lt;/span&gt;);&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;It is not the prettiest code but does the job. Return statement assumes that types which expose TryParse are able to cast the Object type to themselves. Unfortunately the C# Extension Methods are not that powerful as the Ruby's &lt;a href="http://en.wikipedia.org/wiki/Monkey_patch" target="_blank"&gt;Monkey Patching&lt;/a&gt; and I am already far enough &lt;a href="http://lazyloading.blogspot.com/2008/07/should-you-fear-or-embrace-dynamic.html" target="_blank"&gt;into the Ruby&lt;/a&gt; to recognize what power (and elegance) I am missing.&lt;br /&gt;&lt;p&gt;Here is the test harness for the extension, which also shows the usage patterns (generic inference makes code look simpler):&lt;/p&gt;[TestFixture]&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TryParseExtenderTest&lt;br /&gt;{&lt;br /&gt; [Test]&lt;br /&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; TestIntParsing()&lt;br /&gt; {&lt;br /&gt;     &lt;span class="kwrd"&gt;string&lt;/span&gt; input = &lt;span class="str"&gt;"230"&lt;/span&gt;;&lt;br /&gt;     &lt;span class="kwrd"&gt;int&lt;/span&gt; result = 0;&lt;br /&gt;     result = result.LazyTryParse(input);&lt;br /&gt;     Assert.AreEqual(230, result);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; [Test, ExpectedException(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(ApplicationException),&lt;br /&gt;  ExpectedMessage = &lt;span class="str"&gt;"System.String doesn't support TryParse"&lt;/span&gt;)]&lt;br /&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; TestStringParsing()&lt;br /&gt; {&lt;br /&gt;     &lt;span class="kwrd"&gt;int&lt;/span&gt; input = 230;&lt;br /&gt;     &lt;span class="kwrd"&gt;string&lt;/span&gt; result = &lt;span class="str"&gt;""&lt;/span&gt;;&lt;br /&gt;     result = result.LazyTryParse(input);&lt;br /&gt;&lt;br /&gt;     Assert.AreEqual(&lt;span class="str"&gt;"230"&lt;/span&gt;, result);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; [Test]&lt;br /&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; TestBooleanParsing()&lt;br /&gt; {&lt;br /&gt;     &lt;span class="kwrd"&gt;string&lt;/span&gt; input = &lt;span class="str"&gt;"true"&lt;/span&gt;;&lt;br /&gt;     &lt;span class="kwrd"&gt;bool&lt;/span&gt; result = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;     result = result.LazyTryParse(input);&lt;br /&gt;     Assert.AreEqual(&lt;span class="kwrd"&gt;true&lt;/span&gt;, result);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; [Test]&lt;br /&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; TestDateTimeParsing()&lt;br /&gt; {&lt;br /&gt;     &lt;span class="kwrd"&gt;string&lt;/span&gt; input = &lt;span class="kwrd"&gt;new&lt;/span&gt; DateTime(2008, 12, 1).ToString();&lt;br /&gt;     DateTime result = DateTime.Now;&lt;br /&gt;     result = result.LazyTryParse(input);&lt;br /&gt;     Assert.AreEqual(&lt;span class="kwrd"&gt;new&lt;/span&gt; DateTime(2008, 12, 1), result);&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-4596642353919642673?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/4596642353919642673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=4596642353919642673' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4596642353919642673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4596642353919642673'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/07/lazy-tryparse.html' title='Lazy TryParse'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-7134248351438015176</id><published>2008-07-21T19:39:00.003-05:00</published><updated>2008-07-21T19:44:20.986-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='weird stuff'/><title type='text'>Prepare for the future</title><content type='html'>&lt;p&gt;   &lt;/p&gt;&lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:7a828865-54dd-40f9-8c6e-bbbd1c0b9980" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;object height="355" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/rg9t7uXkLyA&amp;amp;fmt=18"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/rg9t7uXkLyA&amp;amp;fmt=18" type="application/x-shockwave-flash" wmode="transparent" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;&lt;/p&gt;  &lt;p&gt;It's coming.&lt;/p&gt;&lt;p&gt;Warning: graphic images, weird sense of humor. Not suitable for all audiences. Actually - for anybody.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-7134248351438015176?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/7134248351438015176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=7134248351438015176' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7134248351438015176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7134248351438015176'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/07/prepare-for-future.html' title='Prepare for the future'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-4060967121111287134</id><published>2008-07-21T06:51:00.003-05:00</published><updated>2008-07-21T08:48:27.491-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools and gadgets'/><category scheme='http://www.blogger.com/atom/ns#' term='privacy'/><title type='text'>Clean, Lola, clean!</title><content type='html'>&lt;p&gt;The &lt;a href="http://www.ccleaner.com/" target="_blank"&gt;CCleaner&lt;/a&gt; tool is the &lt;a href="http://lazyloading.blogspot.com/2008/05/pimp-my-ride.html" target="_blank"&gt;best friend of a contractor&lt;/a&gt; when it is time to leave.    &lt;br /&gt;Also it is useful on a daily basis. I just figured out (after a year of procrastinating) what needs to be tweaked in the settings in order to avoid the annoying disappearance of the Window Explorer settings.  You know, when the sorting, appearance, etc. used to be set as you like - and suddenly it's all gone?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/goldobine/SIR4Isff-dI/AAAAAAAAAIU/dmybY0_rLC0/s1600-h/image%5B6%5D.png"&gt;&lt;img style="border-width: 0px;" alt="image" src="http://lh4.ggpht.com/goldobine/SIR4Jc9eWlI/AAAAAAAAAIY/USgAR3Nvh-I/image_thumb%5B2%5D.png?imgmax=800" border="0" height="484" width="557" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If you like it squeaky clean - go ahead, check all boxes, but leave the Window Size/Location Cache out. &lt;/p&gt;  &lt;p&gt;Awesome, awesome tool (a rightful nominee of the &lt;a href="http://www.hanselman.com/blog/ScottHanselmans2007UltimateDeveloperAndPowerUsersToolListForWindows.aspx" target="_blank"&gt;SH2007UDPUTL for Windows&lt;/a&gt; list). I've just run it after a three day break and it has found a 68 Mb of trash.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;  &lt;br /&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-4060967121111287134?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/4060967121111287134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=4060967121111287134' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4060967121111287134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4060967121111287134'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/07/clean-lola-clean.html' title='Clean, Lola, clean!'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/goldobine/SIR4Jc9eWlI/AAAAAAAAAIY/USgAR3Nvh-I/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-580128354976260334</id><published>2008-07-20T21:01:00.001-05:00</published><updated>2008-07-20T21:01:49.842-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Worktime music: Florent Pagny</title><content type='html'>&lt;p&gt;   &lt;br /&gt;Ma libert&amp;#233; de penser&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:7afa3d8a-974b-42c6-bb51-cd1399205e20" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/lJY8fhGTMU0&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/lJY8fhGTMU0&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Caruso&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:2c1032d9-23c8-4f53-b3c2-bd6083d86502" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/rQjE-Dr1JJw&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/rQjE-Dr1JJw&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-580128354976260334?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/580128354976260334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=580128354976260334' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/580128354976260334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/580128354976260334'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/07/worktime-music-florent-pagny.html' title='Worktime music: Florent Pagny'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-1351343729591867117</id><published>2008-07-19T20:52:00.001-05:00</published><updated>2008-07-21T07:22:57.766-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='animals'/><title type='text'>Shark!</title><content type='html'>&lt;p&gt;The advocacy group &lt;a href="http://www.sharkproject.org/engl/index.html" target="_blank"&gt;The Shark Project&lt;/a&gt; holds a &lt;a href="http://sharkproject.esalesfolder.com/index.php?id=288&amp;amp;L=3" target="_blank"&gt;Photo Award&lt;/a&gt;. Here is the teaser:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3253/2687727070_31920439c1.jpg?v=0" /&gt; &lt;/p&gt;  &lt;p&gt;I noticed that the workflow is missing some important steps (especially considering the subject) and I couldn't resist to fill in the gap:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3211/2687736534_29ea017846.jpg?v=0" /&gt; &lt;/p&gt;  &lt;p&gt;But reality is not that funny. Those fierce insatiable predators are unstoppable and claim increasingly more lives every year. I am talking about humans. The shark elimination rate is astonishing. It is hard to believe the statistics but apparently from &lt;a href="http://news.nationalgeographic.com/news/2006/10/061012-shark-fin.html" target="_blank"&gt;38&lt;/a&gt; &lt;a href="http://news.mongabay.com/2006/1003-sharks.html" target="_blank"&gt;to&lt;/a&gt; &lt;a href="http://www.sharkfriends.com/sharks/sharkfinning.html" target="_blank"&gt;200 million&lt;/a&gt;(!) sharks are being killed &lt;strong&gt;annually&lt;/strong&gt;. These numbers are beyond any comprehension: it is like losing the entire US population in a single year, Canada - in two months or having World War II occur every quarter.&lt;/p&gt;  &lt;p&gt;The fear and loathing are understandable - we are challenged outside of our natural habitat. Unless you are a Navy Seal, it is not really fair game. A bear is much more dangerous but we more or less understand our own land creatures, so we can put up with the necessity to stay away from their ground. If we ended up in the Amazonian jungle or in the Kenyan savannah in their better days, our chances of survival would be slimmer than us going into shark infested waters, but who wants to eliminate &lt;a href="http://www.savetherainforest.org/" target="_blank"&gt;rainforest&lt;/a&gt;? We are so easily influenced by the &lt;a href="http://www.imdb.com/title/tt0073195/" target="_blank"&gt;media&lt;/a&gt;, that despite the fact that sharks are an &lt;a href="http://www.nwf.org/nationalwildlife/article.cfm?issueID=120&amp;amp;articleId=1556" target="_blank"&gt;important part of the ecosystem&lt;/a&gt;, the though of protecting them is somehow unsettling. Saving bears is OK, but not sharks? What do we think of the guy who got injured after approaching a lion pride or she-bear with a cub? A dumb schmuck! But we would call that a scuba diver attacked by a shark, he is always a victim, because most of the time sharks dare to interrupt our holiest activity - the entertainment. If sharks are a part of the thrill, one should be ready for what comes of it. &lt;/p&gt;  &lt;p&gt;According to the &lt;a href="http://www.austmus.gov.au/" target="_blank"&gt;Australian Museum&lt;/a&gt; (Australia could win a "shark country" contest with her eyes closed) the human death toll from 1980-1990 was based on the following reasons:&lt;/p&gt;  &lt;table border="0" cellpadding="5" cellspacing="0" width="437"&gt;&lt;tbody&gt;     &lt;tr valign="middle"&gt;       &lt;td width="192"&gt;&lt;span style="font-size:78%;"&gt;&lt;strong&gt;Activity&lt;/strong&gt; &lt;/span&gt;&lt;/td&gt;        &lt;td width="116"&gt;&lt;strong&gt;&lt;span style="font-size:78%;"&gt;Total Deaths &lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td width="127"&gt;&lt;strong&gt;&lt;span style="font-size:78%;"&gt;Average/Year &lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr valign="middle"&gt;       &lt;td width="193"&gt;&lt;span style="font-size:78%;"&gt;Crocodile Attacks &lt;/span&gt;&lt;/td&gt;        &lt;td width="116"&gt;&lt;span style="font-size:78%;"&gt;8 *** &lt;/span&gt;&lt;/td&gt;        &lt;td width="127"&gt;&lt;span style="font-size:78%;"&gt;0.7 &lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr valign="middle"&gt;       &lt;td width="193"&gt;&lt;span style="font-size:78%;"&gt;Shark Attacks &lt;/span&gt;&lt;/td&gt;        &lt;td width="116"&gt;&lt;span style="font-size:78%;"&gt;11 ** &lt;/span&gt;&lt;/td&gt;        &lt;td width="127"&gt;&lt;span style="font-size:78%;"&gt;1 &lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr valign="middle"&gt;       &lt;td width="193"&gt;&lt;span style="font-size:78%;"&gt;Lightning Strikes &lt;/span&gt;&lt;/td&gt;        &lt;td width="116"&gt;&lt;span style="font-size:78%;"&gt;19 * &lt;/span&gt;&lt;/td&gt;        &lt;td width="127"&gt;&lt;span style="font-size:78%;"&gt;1.7 &lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr valign="middle"&gt;       &lt;td width="193"&gt;&lt;span style="font-size:78%;"&gt;Bee Stings &lt;/span&gt;&lt;/td&gt;        &lt;td width="116"&gt;&lt;span style="font-size:78%;"&gt;20 * &lt;/span&gt;&lt;/td&gt;        &lt;td width="127"&gt;&lt;span style="font-size:78%;"&gt;1.8 &lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr valign="middle"&gt;       &lt;td width="193"&gt;&lt;span style="font-size:78%;"&gt;Scuba Diving Accidents &lt;/span&gt;&lt;/td&gt;        &lt;td width="116"&gt;&lt;span style="font-size:78%;"&gt;88 **** &lt;/span&gt;&lt;/td&gt;        &lt;td width="127"&gt;&lt;span style="font-size:78%;"&gt;8 &lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr valign="middle"&gt;       &lt;td width="193"&gt;&lt;span style="font-size:78%;"&gt;Drowning/Submersions &lt;/span&gt;&lt;/td&gt;        &lt;td width="116"&gt;&lt;span style="font-size:78%;"&gt;3367 * &lt;/span&gt;&lt;/td&gt;        &lt;td width="127"&gt;&lt;span style="font-size:78%;"&gt;306 &lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr valign="middle"&gt;       &lt;td width="193"&gt;&lt;span style="font-size:78%;"&gt;Motor Vehicle Accidents &lt;/span&gt;&lt;/td&gt;        &lt;td width="116"&gt;&lt;span style="font-size:78%;"&gt;32772 * &lt;/span&gt;&lt;/td&gt;        &lt;td width="127"&gt;&lt;span style="font-size:78%;"&gt;2979 &lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt; &lt;span style="font-size:78%;"&gt;   &lt;p&gt;    &lt;br /&gt;* from the Australian Bureau of Statistics, Canberra      &lt;br /&gt;** from John West, Shark Attack File, Taronga Zoo, Sydney      &lt;br /&gt;*** from Dr Graham Webb, Darwin      &lt;br /&gt;****from Dr Doug Walker, Operation Sticky Beak, Sydney&lt;/p&gt; &lt;/span&gt;  &lt;p&gt;Following this logic, we had hunt down Ford executives! Compared to the 60 attacks per year (with less than 10 fatal), sharks are taking casualties of 3 500 000 to 1. &lt;/p&gt;  &lt;p&gt;Nature is a smart beast - this improbable survival despite the fierce genocide shows that &lt;a href="http://www.imdb.com/title/tt0107290/quotes" target="_blank"&gt;life, uh... finds a way&lt;/a&gt;. We may be surprised one day, and not pleasantly.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-1351343729591867117?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/1351343729591867117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=1351343729591867117' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1351343729591867117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1351343729591867117'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/07/shark.html' title='Shark!'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-1808308078142429695</id><published>2008-07-18T06:48:00.000-05:00</published><updated>2008-07-18T08:36:35.722-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='weird stuff'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Class Field Inheritance Pattern</title><content type='html'>&lt;p&gt;&lt;a href="http://www.amazon.ca/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1216173473&amp;amp;sr=8-1" target="_blank"&gt;&lt;img height="155" src="http://ecx.images-amazon.com/images/I/51X1K7R6FGL._SL500_AA240_.jpg" width="155" align="left" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Off topic: this is one &lt;a href="http://www.amazon.ca/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1216173473&amp;amp;sr=8-1" target="_blank"&gt;difficult book&lt;/a&gt; to read. Not that it's written in a tangled language (try reading &lt;a href="http://martinfowler.com/bliki/" target="_blank"&gt;this&lt;/a&gt;). It is just that the understanding of content will come with the practice, otherwise the knowledge will evaporate momentarily. But how often does one make architectural decision on the enterprise level? And how often does one decide to use a new set of patterns? So the actual &amp;quot;reading&amp;quot; will take quite some time and I have been reading it on and off for four years already. Yes, I am slow reader.&lt;/p&gt;  &lt;p&gt;The only downside is examples. As a sport ignoramus, I have no idea why a Footballer would inherit from a Player but a Bowler should inherit from a Cricketer. So examples are not from &lt;em&gt;my&lt;/em&gt; real life and confuse me more than actually explain anything. Instead of understanding relations from entities I have to go in the opposite direction. Bugger.     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Now back to the title: &amp;quot;what object-relational pattern would be more lightweight than the &lt;a href="http://martinfowler.com/eaaCatalog/classTableInheritance.html" target="_blank"&gt;Class Table Inheritance&lt;/a&gt; and less normalization-refuting than the &lt;a href="http://martinfowler.com/eaaCatalog/singleTableInheritance.html" target="_blank"&gt;Single Table Inheritance&lt;/a&gt;?&amp;quot;&lt;/p&gt;  &lt;p&gt;Meet the Class Field Inheritance pattern. &lt;/p&gt;  &lt;p&gt;The idea is that the base class shares a single table with children and the child-specific fields are serialized into a single field. You would use it if:&lt;/p&gt;  &lt;p&gt;1. Base class is equal in rights with children classes and has to be instantiated.    &lt;br /&gt;2. Child classes have very few extra properties.     &lt;br /&gt;3. There is no requirement for an extensive analysis of the child-specific fields.     &lt;br /&gt;4. There is no requirement for a raw child-specific data to be available for a database objects (e.g. reporting tools, functions or procedures).&lt;/p&gt;  &lt;p&gt;All these requirements are not 100% solid. If the performance is negotiable, concrete child properties can be lazily deserialized, thus enabling a business layer analysis. The raw data from the filed can be &amp;quot;unfolded&amp;quot; using user functions, providing concrete tables to join on them if required.&lt;/p&gt;  &lt;p&gt;Pattern is fast in the implementation - one stored procedure will serve it all, and the logical flow is very clear. One can go nuts with Strategies, Abstract Factories and Dependency Injections. Now tell me that it is not a beauty!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-1808308078142429695?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/1808308078142429695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=1808308078142429695' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1808308078142429695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1808308078142429695'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/07/class-field-inheritance-pattern.html' title='Class Field Inheritance Pattern'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-4509021522068025511</id><published>2008-07-17T11:58:00.001-05:00</published><updated>2008-07-17T12:01:45.066-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Attempting on Domain Driven Design. Again.</title><content type='html'>&lt;a href="http://www.infoq.com/minibooks/domain-driven-design-quickly" target="_blank"&gt;&lt;img style="margin: 0px 10px 0px 0px" height="328" src="http://farm4.static.flickr.com/3266/2677452338_883cfb33ca.jpg?v=0" width="218" align="left" /&gt;&lt;/a&gt;   &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I think I keep making the same mistake when I try to read the &lt;a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1216305538&amp;amp;sr=8-1" target="_blank"&gt;fundamental Eric Evans work&lt;/a&gt;. This time I was advised to skip the first four chapters and hopefully, this will prevent me from dozing off again.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Also, I plan to sneak on DDD with this &lt;a href="http://deepfriedbytes.com/podcast/episode-6-talking-domain-driven-design-with-david-laribee-part-1/" target="_blank"&gt;podcast&lt;/a&gt; and a &lt;a href="http://www.infoq.com/minibooks/domain-driven-design-quickly" target="_blank"&gt;squeezed version&lt;/a&gt; of the original DDD bible (106 pages versus 500). It is available for free (in a PDF format) from &lt;a href="http://www.oreillynet.com/onjava/blog/2006/06/infoqcom_launches_today.html" target="_blank"&gt;the&lt;/a&gt; &lt;a href="http://www.infoq.com/" target="_blank"&gt;InfoQ&lt;/a&gt; (run and subscribe to their beautiful personalized feed).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-4509021522068025511?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/4509021522068025511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=4509021522068025511' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4509021522068025511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4509021522068025511'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/07/attempting-on-domain-driven-design.html' title='Attempting on Domain Driven Design. Again.'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-7461836760746797891</id><published>2008-07-17T08:20:00.003-05:00</published><updated>2008-07-18T08:41:01.513-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='people'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Should you fear or embrace dynamic languages?</title><content type='html'>&lt;p&gt;Yesterday &lt;a href="http://www.iunknown.com/" target="_blank"&gt;John Lam&lt;/a&gt; (the brain behind a &lt;a href="http://www.ironruby.net/" target="_blank"&gt;Microsoft IronRuby effort&lt;/a&gt;) delivered an excellent (as usual) presentation for a &lt;a href="http://www.metrotorontoug.com/" target="_blank"&gt;Metro Toronto .NET User Group&lt;/a&gt; audience - &amp;quot;IronRuby: Should you fear or embrace dynamic languages?&amp;quot;. &lt;/p&gt;  &lt;p&gt;John is an exceptionally inspiring speaker. If you ever have a chance to attend his &lt;strike&gt;performance&lt;/strike&gt; presentation - drop all your appointments and go! Don't worry even if the presentation is about a Roman cubic art - he is notorious for deviating from the topic and you will hear about many other things. What he will most likely to achieve is make you aspire to be better at whatever you do.&lt;/p&gt;  &lt;p&gt;Ruby perspectives look good. So do the .NET's. By the end of the presentation both questions from the topic are answered for me. Those answers most likely are what John wanted to communicate but the reasons behind them are [possibly|slightly] different: &lt;em&gt;No - &lt;/em&gt;you shouldn't fear the dynamic languages as a concept and &lt;em&gt;No -&lt;/em&gt; an average C# Joe should not be afraid of Ruby sneaking up on him and taking his job away. C# 3.0 matches a Ruby's syntactic sugar in a lot of cases and there is (hopefully) more to come. And &lt;em&gt;Yes -&lt;/em&gt; you must try Ruby at the least. The presentation has finally convinced me that doing so will make me a better developer. A better C# developer.&lt;/p&gt;  &lt;p&gt;So &lt;a href="http://www.imdb.com/title/tt0151804/quotes" target="_blank"&gt;go ahead&lt;/a&gt; and learn Ruby. By the time you are more or less done, the &lt;a href="http://www.ironruby.net/" target="_blank"&gt;IronRuby&lt;/a&gt; will ship (spring 2009 was mentioned) and you will be able to make an informed decision - get hooked on this new cool drug or stick with the good old one :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-7461836760746797891?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/7461836760746797891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=7461836760746797891' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7461836760746797891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7461836760746797891'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/07/should-you-fear-or-embrace-dynamic.html' title='Should you fear or embrace dynamic languages?'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-171757054890869995</id><published>2008-07-12T19:09:00.002-05:00</published><updated>2008-07-15T20:38:21.910-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>Sorting a grid with ObjectDataSource</title><content type='html'>&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.aspx" target="_blank"&gt;ObjectDataSource&lt;/a&gt; is a lazy way to power a grid control (let's say a &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.aspx" target="_blank"&gt;GridView&lt;/a&gt; for example). Surprisingly, the Microsoft team didn't give good thought to any Data Source controls except &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.sqldatasource.aspx" target="_blank"&gt;SqlDataSource&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;The &amp;quot;It just works&amp;quot; approach just doesn't work with ObjectDataSource sorting. I like using generic lists a lot but ObjectDataSource can not sort them: &amp;quot;&lt;em&gt;The data source 'mySource' does not support sorting with IEnumerable data. Automatic sorting is only supported with DataView, DataTable, and DataSet&lt;/em&gt;&amp;quot;. If they were aware of this flaw - why didn't they just fix it and provide nice sorting support? &lt;/p&gt;  &lt;p&gt;Thus the hack is up to us.&lt;/p&gt;  &lt;p&gt;The first step would be supplying the Comparer for our custom class. And if you're rightfully lazy to write a full set of Comparers for each property, then reflection is to the rescue:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ToyComparer : IComparer&amp;lt;Toy&amp;gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; _property; &lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; ToyComparer (&lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName)&lt;br /&gt;    {&lt;br /&gt;        _property = propertyName;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Compare(Toy x, Toy y)&lt;br /&gt;    {&lt;br /&gt;        PropertyInfo property = x.GetType().GetProperty(_property);&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (property == &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;br /&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(&lt;span class="str"&gt;&amp;quot;Invalid property &amp;quot;&lt;/span&gt; +_property);&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; Comparer.DefaultInvariant.Compare&lt;br /&gt;            (property.GetValue(x, &lt;span class="kwrd"&gt;null&lt;/span&gt;), property.GetValue(y, &lt;span class="kwrd"&gt;null&lt;/span&gt;));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The class's List Select Method uses Comparer to sort the output list:&lt;/p&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; List&amp;lt;Toy&amp;gt; GetToys(&lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName)&lt;br /&gt;{&lt;br /&gt;    //list creation is omitted ...&lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (!&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(propertyName))&lt;br /&gt;    {&lt;br /&gt;        list.Sort(&lt;span class="kwrd"&gt;new&lt;/span&gt; ToyComparer(propertyName,order));&lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; list;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The second step is to add a Select parameter to the ObjectDataSource:&lt;/p&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ObjectDataSource&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;mySource&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;SelectMethod&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;GetToys&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;TypeName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Toy&amp;quot;&lt;/span&gt;...&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;SelectParameters&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Parameter&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;propertyName&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Direction&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Input&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;String&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;SelectParameters&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:ObjectDataSource&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;And last but not the least - we need to set the property of the ObjectDataSource and cancel the grid Sorting event to prevent the exception:&lt;/p&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; gridMaster_Sorting(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, GridViewSortEventArgs e)&lt;br /&gt;{&lt;br /&gt;    mySource.SelectParameters[&lt;span class="str"&gt;&amp;quot;propertyName&amp;quot;&lt;/span&gt;].DefaultValue = e.SortExpression;&lt;br /&gt;    e.Cancel = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;If necessary we can pass the sorting order the same way.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-171757054890869995?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/171757054890869995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=171757054890869995' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/171757054890869995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/171757054890869995'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/07/sorting-grid-with-objectdatasource.html' title='Sorting a grid with ObjectDataSource'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-7196734843360572866</id><published>2008-07-04T11:00:00.002-05:00</published><updated>2008-07-21T06:52:30.708-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools and gadgets'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Subversion 1.5 + TortoiseSVN 1.5 + VisualSVN 1.5</title><content type='html'>&lt;p&gt;&lt;a href="http://subversion.tigris.org/" target="_blank"&gt;Subversion 1.5&lt;/a&gt; is released, with the &lt;a href="http://tortoisesvn.tigris.org/" target="_blank"&gt;TortoiseSVN 1.5&lt;/a&gt; following. &lt;/p&gt;  &lt;p&gt;Make sure that you've read the &lt;a href="http://subversion.tigris.org/svn_1.5_releasenotes.html" target="_blank"&gt;release&lt;/a&gt; &lt;a href="http://tortoisesvn.tigris.org/tsvn_1.5_releasenotes.html" target="_blank"&gt;notes&lt;/a&gt; carefully and if you're a happy user of &lt;a href="http://www.visualsvn.com/visualsvn/download/" target="_blank"&gt;VisualSVN&lt;/a&gt; - upgrade it to the version 1.5 as well.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-7196734843360572866?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/7196734843360572866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=7196734843360572866' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7196734843360572866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7196734843360572866'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/07/subversion-15-tortoisesvn-15-visualsvn.html' title='Subversion 1.5 + TortoiseSVN 1.5 + VisualSVN 1.5'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-230726506537129762</id><published>2008-07-04T06:18:00.010-05:00</published><updated>2009-10-09T09:13:42.549-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='introverted programming'/><title type='text'>Introverted programming: Office Kung Fu - art of The Crouching Master</title><content type='html'>&lt;p&gt;It is nice to work for a good company. It is enviable to be respected by your colleagues and respect them in return and looking forward to the next workday. A fat paycheck would top this off and make it your dream job.&lt;/p&gt;  &lt;p&gt;But beware the Office Kung Fu masters. It will take just one to contaminate a healthy collective. As soon as you detect the following main stances of Office Kung Fu, it is time to master them yourself. When the Big S hits the fan, your survival may depend on these very moves: Deny, Blame and Take Credit.&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="221" alt="It wasn&amp;#39;t my fault but I have a pretty good idea..." title="It wasn&amp;#39;t my fault but I have a pretty good idea..." src="http://lh3.ggpht.com/goldobine/SG2JKt7f9dI/AAAAAAAAAHo/Xysd7_MUe08/deny1_thumb1.jpg?imgmax=800" width="172" align="right" border="0" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Deny&lt;/strong&gt; - the main defence stance. Distance yourself from any failure, even potential one, which is not (and especially if it is) your fault.     &lt;br /&gt;A simple &amp;quot;it's not me&amp;quot; defence is too low-power. You may need to practice higher techniques: phrase &amp;quot;I don't think this is OUR group&amp;quot; will likely recruit others to fight on your side (The Summoning Block). Master the swift transition to the attack, do not give your opponent any time to regroup.&lt;/p&gt; &lt;b&gt;Figure 1:&lt;/b&gt; Master blocks the accusation and demonstrates readiness to put blame in return.   &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 15px 0px 0px; border-right-width: 0px" height="217" alt="I have four reasons why these three individuals should be held responsible..." title="I have four reasons why these three individuals should be held responsible..." src="http://lh6.ggpht.com/goldobine/SEqwm2agPuI/AAAAAAAAAHs/zNCcuNZc9Uo/blame1_thumb1.jpg?imgmax=800" width="170" align="left" border="0" /&gt;Blame&lt;/strong&gt; is a crashing attacking blow. Be the first to point fingers. Don't hesitate even if the accused is another Office Kung Fu Master - he/she has to first repel your thrust and his/her responce can be easily depicted as a personal attack on you, the very person who cares about the company so much. The Leech Spree is an example of an indirect attack, which can be executed by a phrase like &amp;quot;Somebody changed this file&amp;quot;. This will ignite an avalanche of blame. Be careful when blaming groups - the other Master may use the Summoning Block against you. &lt;br /&gt;&lt;b&gt;Figure 2:&lt;/b&gt; Master prepares to attack three people at once and his blame is supported by four sound arguments - very powerful Blame By Authority attack. &lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Take credit&lt;/strong&gt; - powerful shift-of-power move. Don't cut others any slack. They will rob you of your (or their own) success behind your back, so hurry up and claim it first. Successfully applied, this attack will strengthen your position while weakening the opponent.&amp;#160; &lt;br /&gt;&lt;strong&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 10px 0px 0px; border-right-width: 0px" height="211" alt="We fixed that build!"  title="We fixed that build!" src="http://lh5.ggpht.com/goldobine/SG2JK_Q4qHI/AAAAAAAAAHw/PBnA9rsbo8E/takecredit1_thumb10.jpg?imgmax=800" width="177" align="left" border="0" /&gt;&lt;/strong&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 0px 0px 5px; border-right-width: 0px" height="197" alt="I hate to brag, but..."  title="I hate to brag, but..." src="http://lh4.ggpht.com/goldobine/SG2JK-EzYTI/AAAAAAAAAH0/YCGyMqUhq1k/takecredit2_thumb17.jpg?imgmax=800" width="161" align="right" border="0" /&gt;Precede blaming attack by taking credit first, thus multiplying the destructive effect (The Tsunami Swoosh). On the contrary, you can emphasize your value to the organization by putting the blame first and taking credit immediately after (The Slapping Blossom). &lt;/p&gt;  &lt;p&gt;While novices can use a highly energetic version (Fig.3), a true master prefers the carefully calculated move (Fig.4) which is likely to bring a lasting recognition (The Humble Ploy).&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The highest art of Office Kung Fu is to combine all these techniques within one sweeping motion: &amp;quot;It is not me, it was Nick's fault but I successfully fixed the problem.&amp;quot;.&lt;/p&gt;  &lt;p&gt;Deny, blame and take credit - and you'll never go home without a promotion.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-230726506537129762?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/230726506537129762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=230726506537129762' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/230726506537129762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/230726506537129762'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/06/introverted-programming-office-kung-fu.html' title='Introverted programming: Office Kung Fu - art of The Crouching Master'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/goldobine/SG2JKt7f9dI/AAAAAAAAAHo/Xysd7_MUe08/s72-c/deny1_thumb1.jpg?imgmax=800' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-8378116010017595713</id><published>2008-07-03T09:17:00.003-05:00</published><updated>2008-07-15T07:19:49.400-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Programming geniuses and death by risk aversion</title><content type='html'>&lt;p&gt;When you read about &lt;a href="http://www.codinghorror.com/blog/archives/000165.html" target="_blank"&gt;architecture&lt;/a&gt; &lt;a href="http://www.joelonsoftware.com/articles/fog0000000018.html" target="_blank"&gt;astronautics&lt;/a&gt; and &lt;a href="http://www.coastaltech.com/genius.htm" target="_blank"&gt;programming geniuses&lt;/a&gt; it seems like a good idea to keep an eye on creativity outbursts. There is some popular medicine out there like &lt;a href="http://en.wikipedia.org/wiki/KISS_principle" target="_blank"&gt;KISS&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/You_Ain't_Gonna_Need_It" target="_blank"&gt;YAGNI&lt;/a&gt; which can help you cope with that insane yearning for Yet Another Framework.&lt;/p&gt;  &lt;p&gt;But as usual the coin has &lt;a href="http://headrush.typepad.com/creating_passionate_users/2006/01/death_by_riskav.html" target="_blank"&gt;two sides&lt;/a&gt;: you still need to empower your users with innovations. Setting computer dreamers free will result in stagnation as their heavy all-inclusive solutions are difficult to maintain and difficult to advance. The more effort is put into the particular architecture, the more people are hesitant to take the risk of making radical changes or let it go altogether, so eventually the solution becomes more obstacle than enabler. &lt;/p&gt;  &lt;p&gt;If there is a ready recipe to mix evolution and revolution successfully it most likely is heavily guarded by the corporation which got filthy rich implementing it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-8378116010017595713?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/8378116010017595713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=8378116010017595713' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/8378116010017595713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/8378116010017595713'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/07/programming-geniuses-and-death-by-risk.html' title='Programming geniuses and death by risk aversion'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-2190250876322746852</id><published>2008-07-03T06:29:00.003-05:00</published><updated>2008-07-15T07:22:14.492-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Dependency injection and composition with extension methods</title><content type='html'>&lt;p&gt;Muddling through the C# 3.0 updates, a colleague and I (inheritance junkies we are) came upon an interesting observation. We departed from the normal base class MyClass:&lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MyCLass&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Update()&lt;br /&gt;    {&lt;br /&gt;        MyProperty=&lt;span style="color: #006080"&gt;&amp;quot;new value&amp;quot;&lt;/span&gt;;&lt;br /&gt;        DoSomething(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Then we extended the class collection with an extension method (this nice code is shamelessly stolen from the &lt;a href="http://www.codeplex.com/umbrella" target="_blank"&gt;Umbrella&lt;/a&gt; &lt;a href="http://www.hanselman.com/blog/TheWeeklySourceCode27SuckLessLibraries.aspx" target="_blank"&gt;library&lt;/a&gt;):&lt;/p&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; ICollection ForEach&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt; ICollection items, Action&amp;lt;T&amp;gt; action)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (items != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (T item &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; items)&lt;br /&gt;        {&lt;br /&gt;            action(item);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; items;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Intended inheritance-driven usage of this method was something like this:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;var list = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;MyCLass&amp;gt;();&lt;br /&gt;list.ForEach(a =&amp;gt; a.Update());&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Technically there were not much sense in implementing an extension method to use it this way. So we proceeded forward and took the Update method content out of the class and injected it through the extension method: &lt;br /&gt;&lt;div&gt;&lt;br /&gt;  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;list.ForEach&lt;br /&gt;(&lt;br /&gt;    a =&amp;gt;&lt;br /&gt;    a.MyProperty=&lt;span style="color: #006080"&gt;&amp;quot;new value&amp;quot;&lt;/span&gt;;&lt;br /&gt;    DoSomething(a);&lt;br /&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;  &lt;br /&gt;Now we do not really need instance Update method anymore and can defer the implementation until we will be really using it.&lt;/p&gt;&lt;br /&gt;Of course, the above implementation has significant limitations, especially if it concerns private or protected members. Also this code is not exactly &lt;a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself" target="_blank"&gt;DRY&lt;/a&gt;-friendly. From another point of view, the dependency injection pattern contradicts the concept of the &amp;quot;black box&amp;quot; to some point.&lt;/p&gt;&lt;br /&gt;I wouldn't repeat that &amp;quot;LINQ is cool&amp;quot; but adopting this approach could bring some interesting results, what do you think?&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-2190250876322746852?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/2190250876322746852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=2190250876322746852' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/2190250876322746852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/2190250876322746852'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/07/dependency-injection-and-composition.html' title='Dependency injection and composition with extension methods'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-7699064870403294966</id><published>2008-07-02T07:26:00.006-05:00</published><updated>2010-02-27T11:13:20.540-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools and gadgets'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Little Subversion trick to improve VisualSVN</title><content type='html'>&lt;p&gt;&lt;a href="http://www.visualsvn.com/" target="_blank"&gt;VisualSVN&lt;/a&gt; is a great product. It is stable, intuitive and if you know &lt;a href="http://tortoisesvn.tigris.org/" target="_blank"&gt;TortoiseSVN&lt;/a&gt; - you pretty much know it all. Until (relatively) recently, the &lt;a href="http://ankhsvn.open.collab.net/" target="_blank"&gt;Ankh&lt;/a&gt; was practically the only Visual Studio plug-in for the Subversion. Unfortunately, it suffered from performance and reliability problems and lost a lot of trust. They claim that problems are solved, but I personally would need something very convincing to try it again. Like a direct order from management.&lt;/p&gt;  &lt;p&gt;Unfortunately the VisualSVN is &lt;a href="http://www.visualsvn.com/support/topic/00007/" target="_blank"&gt;not resolving&lt;/a&gt; the old problem with multiple working copies (you know - when you have a framework and share it between numerous solutions). For some reason neither a Subversion nor a Team System approve of this very &lt;a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself" target="_blank"&gt;DRY&lt;/a&gt; approach. As a result the Solution Explorer in the Visual Studio doesn't track the changes in the project which resides outside the solution's working folder. Not a big deal if the framework is stable but it becomes pretty annoying if some work is still being done.&lt;br /&gt;&lt;p/&gt;To overcome this problem in the Team System you had to sacrifice a black lamb on the intersection of six roads at a full moon and hire a Gemini-born Microsoft consultant within forty days. Subversion provides a more environmentally friendly solution - the &lt;a href="http://svnbook.red-bean.com/en/1.0/ch07s02.html#svn-ch-7-sect-2.3.6" target="_blank"&gt;svn:externals&lt;/a&gt; &lt;a href="http://weierophinney.net/matthew/archives/132-svnexternals.html" target="_blank"&gt;property&lt;/a&gt;. &lt;/p&gt;  &lt;pre class="csharpcode"&gt;svn propedit svn:externals Framework http://svn.repository/Framework/trunk&lt;/pre&gt;&lt;br /&gt;&lt;p/&gt;If you use this property on the main solution folder, the framework project will be checked out inside it and become the eligible (and version controlled) part of the solution. Instead of using the single physical copy of the framework project you would have multiple underneath each of the solutions but all of them will be tracked to the single code base in the SVN.&lt;p/&gt;&lt;br /&gt;The svn:externals property still seems a little bit like a hack and has some stability issues and limitations with branching. Nevertheless it is a reasonable solution - the SVN properties can be managed by a build master and developers don't really need to do any extensive learning.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-7699064870403294966?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/7699064870403294966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=7699064870403294966' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7699064870403294966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7699064870403294966'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/07/little-subversion-trick-to-improve.html' title='Little Subversion trick to improve VisualSVN'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-3521224696671425822</id><published>2008-07-01T06:35:00.001-05:00</published><updated>2008-07-15T07:26:23.696-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Intellisense in NAnt build file editor</title><content type='html'>&lt;p&gt;This is a &lt;a href="http://edgekaos.wordpress.com/2008/01/26/edit-nant-build-file-in-visual-studio-2005-with-intellisense/" target="_blank"&gt;great article&lt;/a&gt; about adding Intellisense to the XML editor - a very useful feature. This also works perfectly with VS 2008 - just use Visual Studio 9 instead of 8. If the registry key in the article is truncated - it is 412B8852-4F21-413B-9B47-0C9751D3EBFB.&lt;/p&gt;  &lt;p&gt;Unfortunately NAntContrib tasks are not included in the original schema but &lt;a href="http://www.dotnetjunkies.com/WebLog/mihirsolanki/archive/2005/05/11/74941.aspx" target="_blank"&gt;these&lt;/a&gt; &lt;a href="http://community.sharpdevelop.net/forums/p/2980/8817.aspx" target="_blank"&gt;articles&lt;/a&gt; provide some insight.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-3521224696671425822?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/3521224696671425822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=3521224696671425822' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3521224696671425822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3521224696671425822'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/06/intellisense-in-nant-build-file-editor.html' title='Intellisense in NAnt build file editor'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-4570121213794149262</id><published>2008-06-20T18:41:00.010-05:00</published><updated>2008-07-04T07:45:58.084-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='weird stuff'/><category scheme='http://www.blogger.com/atom/ns#' term='people'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Wish you were here</title><content type='html'>&lt;p&gt;Absolutely awesome video! Simple but masterful piece which radiates positive energy. And the dancing style is quite catching. &lt;p&gt;   &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:a0fa9c8a-d045-4413-bf95-d30f75d54f1b" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/zlfKdbWwruY&amp;amp;hl=en"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/zlfKdbWwruY&amp;amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt; &lt;/p&gt;&lt;br/&gt; &lt;p&gt;Here is the guy's site - &lt;a title="http://www.wherethehellismatt.com" href="http://www.wherethehellismatt.com"&gt;http://www.wherethehellismatt.com&lt;/a&gt; (and there is a much better quality video available). Toronto is not in the list yet so we still have a chance to make history :)&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-4570121213794149262?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/4570121213794149262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=4570121213794149262' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4570121213794149262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4570121213794149262'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/06/wish-you-were-here.html' title='Wish you were here'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-94030494680073944</id><published>2008-06-17T09:55:00.001-05:00</published><updated>2008-06-17T09:58:44.516-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code quality'/><title type='text'>Code bombs and team morale</title><content type='html'>&lt;p&gt;&lt;a href="http://www.codinghorror.com/blog/" target="_blank"&gt;Jeff Atwood&lt;/a&gt; again did a good reading for us: &lt;a href="http://www.codinghorror.com/blog/archives/001134.html" target="_blank"&gt;code-bombing from the dark room&lt;/a&gt;. This is the essence of why the collective code ownership and even infamous pair-programming are actually helpful in shielding the programmer's ego.&lt;/p&gt;  &lt;p&gt;It is much easier to give up on a 10-lines method than on a whole over-engineered and obtrusive application layer. I am so used to admit my ignorance very casually that it became a defensive mechanism for my otherwise vulnerable and envious soul. I like writing frameworks but majority of them have never seen light of the day. In the &lt;a href="http://www.jaisenmathai.com/blog/2008/04/17/why-everyone-should-write-a-framework-and-never-use-it/" target="_blank"&gt;eyes of others&lt;/a&gt; exactly this practice supposed to make you a better programmer. Probably it did, because I avoided code-bombing my colleagues, providently submitting mere suggestions instead. Most of the time these fruits of weekend labor were criticized but some pieces were adopted after heavy rework, and that, indeed, made me a better developer. Critiques hurt a bit but kept me determined to go ahead and try to get those heartless bastards next time. How does a &amp;quot;suicide code-bombing&amp;quot; sound?&lt;/p&gt;  &lt;p&gt;Software development is people's business and what comes good for a cubicle drone will go good for the whole project. Code reviews, especially if they cover results of months of work, are inefficient and leave people feeling more offended than enlightened. Daily cooperation will allow people admit and accept their mistakes with dignity and confident people are much more opened to learning. It is not even instrumental to have &lt;a href="http://www.codinghorror.com/blog/archives/000051.html" target="_blank"&gt;Jedy programmer&lt;/a&gt; on board as a team of &lt;a href="http://www.agilemodeling.com/essays/generalizingSpecialists.htm" target="_blank"&gt;generalizing specialists&lt;/a&gt; possess enough steam-power to self-propel the average skill level up and forward.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-94030494680073944?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/94030494680073944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=94030494680073944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/94030494680073944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/94030494680073944'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/06/code-bombs-and-team-morale.html' title='Code bombs and team morale'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-4716409929834105925</id><published>2008-06-15T15:40:00.003-05:00</published><updated>2008-06-15T15:43:04.310-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><title type='text'>Testing ASP.NET Ajax autocomplete extender with Watin</title><content type='html'>&lt;p&gt;Back to our &lt;a href="http://lazyloading.blogspot.com/2008/05/aspnet-ajax-toolkit-getting-key-value.html" target="_blank"&gt;Autocomplete extender example&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;One of the biggest reason we hesitate to unleash the ASP.NET Ajax toolkit onto our project is potential performance shortcomings. The load test would be nice addition to the test harness. We do not run Team System (not that we would have Visual Studio Test Edition available anyway) so we can judge TFS load testing suckness from the words of others.&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://watin.sourceforge.net/index.html" target="_blank"&gt;Watin&lt;/a&gt; tool seems to be a very good candidate for the &lt;a href="http://www.softwaretestingsucks.com/software_testing_FAQ1.htm" target="_blank"&gt;black-box&lt;/a&gt; testing. My first attempt to run simple test wasn't any success.  &lt;pre class="csharpcode"&gt;[Test]&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FirstTest()&lt;br /&gt;{&lt;br /&gt;    IE ie=&lt;span class="kwrd"&gt;new&lt;/span&gt; IE(&lt;span class="str"&gt;&amp;quot;http://localhost/Prototype.WebUI/TestDataEntry.aspx&amp;quot;&lt;/span&gt;);&lt;br /&gt;    ie.TextField(Find.ByName(&lt;span class="str"&gt;&amp;quot;ctl00$contentMain$txtManufacturer&amp;quot;&lt;/span&gt;)).TypeText(&lt;span class="str"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;);&lt;br /&gt;    Thread.Sleep(200);&lt;br /&gt;    ie.TextField(Find.ByName(&lt;span class="str"&gt;&amp;quot;ctl00$contentMain$txtManufacturer&amp;quot;&lt;/span&gt;)).TypeText(&lt;span class="str"&gt;&amp;quot;nis&amp;quot;&lt;/span&gt;);&lt;br /&gt;    Thread.Sleep(200);&lt;br /&gt;    ie.Close();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p/&gt;When test runs, I could see that active fields are highlighted in a IE window, text being typed without any sign of Ajax. It's either Watin is missing events (which was unlikely knowing &lt;a href="http://sourceforge.net/mailarchive/forum.php?thread_name=2600e27e0805220540y312ca37aq9c8248e50c816777%40mail.gmail.com&amp;amp;forum_name=watin-users" target="_blank"&gt;Jeroen's&lt;/a&gt; thoroughness) or ASP.NET Ajax techniques are too exotic to catch on (which is more than possible with Microsoft's history of lack attention to details).&lt;br /&gt;&lt;p/&gt;After lengthy investigation and extensive Reflector code digging I found that Autocomplete extender attaches itself to the KeyDown event of the textbox so from this side we were more or less clear. Then I remembered my own &lt;a href="http://lazyloading.blogspot.com/2007/05/testing-aspnet-pages-outside-http.html" target="_blank"&gt;adventures&lt;/a&gt; with &lt;a href="http://lazyloading.blogspot.com/2007/08/cleaner-page-validation-testing-with.html" target="_blank"&gt;ASP.NET testing&lt;/a&gt; and decided to kick other tires - play with runtime events reanimation. To make long story short - the following line brought my Ajax back to life for the Watin testing:&lt;br /&gt;&lt;pre class="csharpcode"&gt;txtManufacturer.Attributes.Add(&lt;span class="str"&gt;&amp;quot;onkeydown&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;p/&gt;That's right - &amp;quot;attach nothing to KeyDown event&amp;quot; - and all will start working as expected. Now we can load test questionable Ajax performance.&lt;br /&gt;&lt;p&gt;I didn't have time to investigate the differences in the generated code but I would start from blaming the ASP.NET Ajax code generation for this glitch. I bet, like with the SQL Data Source Wizard bug, somebody somehow overlooked some possible combinations.&lt;br /&gt;&lt;p/&gt;P.S. I can't wait to lay my hands on Component Art components.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-4716409929834105925?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/4716409929834105925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=4716409929834105925' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4716409929834105925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4716409929834105925'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/06/testing-aspnet-ajax-autocomplete.html' title='Testing ASP.NET Ajax autocomplete extender with Watin'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-7330013764669780734</id><published>2008-06-08T12:07:00.002-05:00</published><updated>2008-06-08T20:17:33.432-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Worktime music: Apocalyptica</title><content type='html'>&lt;p&gt;The Unforgiven&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:7b1c4af3-1f2a-46de-91d9-87175ee31c0d" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/wrc2z59yfGg&amp;amp;hl=en"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/wrc2z59yfGg&amp;amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Seeman (ft. Nina Hagen)&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:5e26e4c2-1d1f-403e-9fb9-4e02c9da7dae" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/xQidXcZW-ac&amp;amp;hl=en"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/xQidXcZW-ac&amp;amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-7330013764669780734?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/7330013764669780734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=7330013764669780734' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7330013764669780734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7330013764669780734'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/06/music-for-work-apocalyptica.html' title='Worktime music: Apocalyptica'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-3542624724394816698</id><published>2008-06-06T12:52:00.002-05:00</published><updated>2008-06-07T08:21:45.106-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='introverted programming'/><title type='text'>Introverted Programming: So what the Japanese management model really teaches us?</title><content type='html'>&lt;p&gt;Not so far ago I've read a not-so interesting opinion on one forum which traditionally criticizes any kind of management style. It has inspired some thinking and this rarity needed to be captured.&lt;/p&gt;  &lt;p&gt;We are used so much to invoke a Japan's authority in a business efficiency - but hardly look beyond the magic of events. Of course - &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development" target="_blank"&gt;agile&lt;/a&gt; &lt;a href="http://agilemanifesto.org/" target="_blank"&gt;this&lt;/a&gt; and &lt;a href="http://www.extremeprogramming.org/" target="_blank"&gt;agile&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Scrum_(development)" target="_blank"&gt;that&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Lean_software_development" target="_blank"&gt;lean development&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Kanban" target="_blank"&gt;kanban&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Just_In_Time_(business)" target="_blank"&gt;just in time manufacturing&lt;/a&gt; - it all seems to work. But if you think about the organization of The Japanese Firm - what first comes to your mind? Loyalty. Not in a sense of &lt;a href="http://en.wikipedia.org/wiki/Omert%C3%A0" target="_blank"&gt;Omerta code&lt;/a&gt; but rather in a sense of people identifying themselves with The Company and perceive their employment as a lifetime commitment. &lt;/p&gt;  &lt;p&gt;So where I am going at? Maybe there is no &lt;a href="http://www.winadvisorygroup.com/MysteryofJapaneseManagement.html" target="_blank"&gt;mystery&lt;/a&gt;. Knowing the devotion and remembering that career advancement in Japanese company traditionally based on seniority, it is safe to assume that the vast majority of management in all levels is home-brewed. And likely their success comes from the deep understanding of the business area and processes (which they've being growing through) rather than from mere formal education (which they perfect nevertheless) or magic business techniques (which they invent and employ based on their expertise).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-3542624724394816698?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/3542624724394816698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=3542624724394816698' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3542624724394816698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3542624724394816698'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/06/introverted-programming-so-what.html' title='Introverted Programming: So what the Japanese management model really teaches us?'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-7518163437050459333</id><published>2008-06-05T21:24:00.004-05:00</published><updated>2008-06-05T21:32:28.225-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code quality'/><title type='text'>"#region is evil" Part II - my bad</title><content type='html'>Ok, it is not always &lt;a href="http://lazyloading.blogspot.com/2008/05/code-quality-region-directive-is-evil.html"&gt;evil&lt;/a&gt;. If you have class with 50 properties, there is little can be done. Refactoring by grouping properties into the types is gross overengineering. So pack this stuff in the #region, I'll look the over way.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-7518163437050459333?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/7518163437050459333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=7518163437050459333' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7518163437050459333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7518163437050459333'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/06/region-is-evil-part-ii-my-bad.html' title='&quot;#region is evil&quot; Part II - my bad'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-2735365832989578794</id><published>2008-06-05T13:57:00.002-05:00</published><updated>2008-06-05T21:40:15.425-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linq'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Smuggling a dose of LINQ to the .NET 2.0</title><content type='html'>&lt;p&gt;As soon as you get hooked on the syntactic sugar like &lt;a href="http://community.bartdesmet.net/blogs/bart/archive/2007/03/03/c-3-0-automatic-properties-explained.aspx" target="_blank"&gt;auto properties&lt;/a&gt; and &lt;a href="http://weblogs.asp.net/dwahlin/archive/2007/09/09/c-3-0-features-object-initializers.aspx" target="_blank"&gt;object initializers&lt;/a&gt;, it is excruciatingly painful to overcome the abstinence returning back in the .NET 2.0. LINQ is even more addictive and it is good to know that there are people around who can supply us with the good stuff if we've found ourselves locked in the Visual Studio 2005 project. &lt;a href="http://www.albahari.com/nutshell/linqbridge.html" target="_blank"&gt;LINQBridge&lt;/a&gt; seems like a solution. The author is Joseph &lt;a href="http://www.amazon.com/gp/product/0596527578?ie=UTF8&amp;amp;tag=cinanu-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0596527578" target="_blank"&gt;&amp;quot;C# 3.0 In a Nutshell&amp;quot;&lt;/a&gt; Albahary.&lt;/p&gt;  &lt;p&gt;P.S. His &lt;a href="http://www.linqpad.net/" target="_blank"&gt;LINQPad&lt;/a&gt; is worth to be looked at too - at least you don't have to fire up a fresh VS2008 project to try LINQ expressions. Would be nice, though, to have an intellisense there.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-2735365832989578794?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/2735365832989578794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=2735365832989578794' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/2735365832989578794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/2735365832989578794'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/06/smuggling-dose-of-linq-to-net-20.html' title='Smuggling a dose of LINQ to the .NET 2.0'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-8501006803871840280</id><published>2008-06-04T10:05:00.000-05:00</published><updated>2008-06-04T12:41:43.229-05:00</updated><title type='text'>Fill'er up</title><content type='html'>&lt;p&gt;I understand that there are more complex cause-and-effect principles involved but wouldn't it be funny if calling a towing service for your car will be cheaper than actually driving it?&lt;/p&gt; &lt;center&gt;   &lt;p&gt;&lt;img height="200" src="http://farm4.static.flickr.com/3184/2550885191_9020b94ec5.jpg?v=0" width="143" /&gt; &lt;/p&gt; &lt;/center&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-8501006803871840280?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/8501006803871840280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=8501006803871840280' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/8501006803871840280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/8501006803871840280'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/06/fill-up.html' title='Fill&amp;#39;er up'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-7840526624226330264</id><published>2008-05-29T08:21:00.009-05:00</published><updated>2008-06-05T21:37:54.147-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='introverted programming'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Introverted Programming: File Oriented Architecture</title><content type='html'>&lt;p&gt;Meet the new kid on the block: FOA - the File Oriented Architecture.&lt;/p&gt;  &lt;p&gt;FOA contracts are simple - applications connect with each other assuming that the counterpart can be found in a certain location. In a pseudo-code contract would look like: "three folders up - two steps right - two folders down - get Foo.Moo instance". FOA has vendor support - in a sense, Microsoft Web Site projects are examples of FOA approach. FOA is a further development of the &lt;a href="http://en.wikipedia.org/wiki/KISS_principle" target="_blank"&gt;KISS&lt;/a&gt; principle - the KISS of a Web 2.0(beta) era, &lt;span style="font-style: italic;"&gt;KIverySS&lt;/span&gt;.&lt;/p&gt;  &lt;p&gt;FOA is a very clean and controllable way to code reuse. "In-depth understanding of FOA principles" looks good in resume (it has "Architecture" in it!). It is much easier concept to understand than SOA or REST so any hiring manager will be on the same page with you. &lt;a href="http://www.waterfall2006.com/beck.html" target="_blank"&gt;Document-Driven Development&lt;/a&gt; tools, such as wordUnit, can be used to ensure binding links accuracy within a Continuous Integration process.&lt;/p&gt;  &lt;p&gt;FOA beginners operate with full paths, like  &lt;/p&gt;&lt;pre class="csharpcode"&gt;AdminConsole console=&lt;br /&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; AdminConsole(&lt;span class="str"&gt;"C:\Documents and Settigns\joe\MyDocuments\Foo\Moo\AdminConsole.aspx"&lt;/span&gt;);&lt;/pre&gt;&lt;br /&gt;But true master knows the power of relative paths:&lt;br /&gt;&lt;pre class="csharpcode"&gt;AdminConsole console=&lt;span class="kwrd"&gt;new&lt;/span&gt; AdminConsole(&lt;span class="str"&gt;"..\..\..\Foo\Moo\AdminConsole.aspx"&lt;/span&gt;);&lt;/pre&gt;&lt;p/&gt;This way the application deployability is much higher. Also the master will encapsulate values in the configuration file where they can be easily changed if any silly developer would suddenly change structure of the bound application. Imagine the flexibility of deployment application over web-farms and clustered servers. We can construct relative paths to a relative locations - the possibilities of combinations are endless.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-7840526624226330264?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/7840526624226330264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=7840526624226330264' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7840526624226330264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7840526624226330264'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/05/introverted-programming-file-oriented.html' title='Introverted Programming: File Oriented Architecture'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-7695139375424546803</id><published>2008-05-29T07:36:00.002-05:00</published><updated>2008-05-29T07:37:56.120-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pc'/><title type='text'>Setting up (or getting back) a default browser</title><content type='html'>Once you installed Firefox and made it default browser, it will be tricky to let Internet Explorer step back in. It is formidable achievement - to defeat Microsoft own on it's home grounds, but it may be a little bit annoying, especially for a debugging.&lt;/p&gt;  &lt;p&gt;So here is how you can help this poor Microsoftee to gain its glory back (system and Visual Studio settings are independent of each other):&lt;/p&gt;  &lt;p&gt;1. For the system (at least for Win XP): &lt;/p&gt;  &lt;p&gt;Control Panel -&amp;gt; Add or Remove Programs -&amp;gt; Set Program Access and Defaults -&amp;gt; Custom (this double chevron on the right side ) -&amp;gt; choose a default Web browser&lt;/p&gt;  &lt;p&gt;Just be aware that the Firefox, pertinacious it is, will add itself back to the Quick Launch menu as soon as it will become default again.&lt;/p&gt;  &lt;p&gt;2. For the Visual Studio:&lt;/p&gt;  &lt;p&gt;First, you have to switch to any aspx (or ascx) layout file.&lt;/p&gt;  &lt;p&gt;&amp;quot;File&amp;quot; menu -&amp;gt; &amp;quot;Browser with...&amp;quot; -&amp;gt; set a default browser of your choice.&lt;/p&gt;  &lt;p&gt;Enjoy the powers of &amp;quot;Lord of the Windows&amp;quot;.&lt;/p&gt;  &lt;p&gt;P.S. All is intermingled in this world. If you tried to get yourself rid of that annoying &lt;a href="http://www.codinghorror.com/blog/archives/000294.html" target="_blank"&gt;Windows Update&lt;/a&gt; &amp;quot;Reboot Now - Or Die From Chafing&amp;quot; popup - beware, the Automated Update service will restart after Internet Explorer is made default browser for the system and continue to nag you.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-7695139375424546803?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/7695139375424546803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=7695139375424546803' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7695139375424546803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7695139375424546803'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/05/setting-up-or-getting-back-default.html' title='Setting up (or getting back) a default browser'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-1193310979453290823</id><published>2008-05-25T07:54:00.002-05:00</published><updated>2008-05-26T17:21:40.208-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pc'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Mac vs. PC - so what's the deal?</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;It is interesting that PC-world haven't got back to Apple for those Mac vs. PC commercials (&lt;em&gt;Update: I was wrong - &lt;a href="http://www.youtube.com/watch?v=_hnOCUkbix0" target="_blank"&gt;they did&lt;/a&gt;).&lt;/em&gt; Partially, I guess, it is because there is no such monolithic entity as evil PC empire - so the campaign&amp;#160; is more like &amp;quot;Mac vs. Everybody&amp;quot;. But there is another side of that: Apple has never worked harder in favor of PC. Put all commercials together - what do you see?&lt;/p&gt;  &lt;p&gt;Doesn't it look like Apple is actually arguing for the choice&lt;/p&gt; &lt;center&gt;   &lt;table cellspacing="0" cellpadding="2" width="519" border="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="middle" width="131"&gt;&lt;img src="http://farm3.static.flickr.com/2075/2521208779_48fde30670.jpg?v=0" /&gt; &lt;/td&gt;          &lt;td valign="middle" width="125"&gt;           &lt;p align="center"&gt;&lt;strong&gt;&lt;font size="5"&gt;vs.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;         &lt;/td&gt;          &lt;td valign="middle" width="258"&gt;&lt;img src="http://farm3.static.flickr.com/2017/2521213753_1476dc2b81.jpg?v=0" /&gt; &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/center&gt;  &lt;p&gt;One could retort that ads can easily impress turtle-neck-sweater-wearing-latt&amp;#233;-drinking designer dudes, who run their Photoshop on Macs anyway. And that's cool - I'd trade my PC for Mac any time if I would be rendering pictures all day. But the corporate CIOs do not need to be reminded about PC troubleshooting - they trust that with their engineers PC problems are easy come and easy go. &lt;/p&gt;  &lt;p&gt;So as a result the ads, witty they are, actually developed totally undesired by Apple perception:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div align="center"&gt;&lt;embed src="http://www.youtube.com/v/Jg1-ywndVNc&amp;amp;hl=en" width="425" height="355" type="application/x-shockwave-flash" wmode="transparent" /&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;OK, OK, not only artists run Macs - I know a whole bunch of deadly efficient (.NET/Ruby/C++/Just-Name-It) developers who use &lt;a href="http://www.apple.com/macbook/" target="_blank"&gt;MacBooks&lt;/a&gt;. But interesting, what are the most popular applications for Mac, aside of Opera browser? I dare to surmise &lt;a href="http://www.apple.com/macosx/features/bootcamp.html" target="_blank"&gt;Boot Camp&lt;/a&gt; or &lt;a href="http://www.parallels.com/en/products/desktop/" target="_blank"&gt;Parallels&lt;/a&gt;. I even bet that you would find them on a majority of die-hard Maceteers' computers.&lt;/p&gt;  &lt;p&gt;And corporations are evil, anyway, so who cares about what those CIOs think? It's all about users and their &lt;a href="http://www.codinghorror.com/blog/archives/001044.html" target="_blank"&gt;freedom&lt;/a&gt;! I support &lt;a href="http://www.codinghorror.com/blog/" target="_blank"&gt;Jeff Atwood&lt;/a&gt; in his &lt;a href="http://www.codinghorror.com/blog/archives/001113.html" target="_blank"&gt;quest for the fair product&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div align="center"&gt;   &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:6b4aebf5-67b6-47e0-8088-4a32bf2a87c8" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/1UNSfm4Of80&amp;amp;feature=related"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/1UNSfm4Of80&amp;amp;feature=related" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;And another omission from Mac marketers - Mac is portrayed as a &lt;a href="http://www.youtube.com/watch?v=lgzbhEc6VVo" target="_blank"&gt;leisure-time computer&lt;/a&gt; (I just afraid to think where that Japanese-camera girl took a picture from). C'mon! Don't you have something else to do after work? Or have friends who you can listen instead of iPod?&lt;/p&gt;  &lt;div align="center"&gt;&lt;embed src="http://www.youtube.com/v/LZtbshemzq8&amp;amp;hl=en" width="425" height="355" type="application/x-shockwave-flash" wmode="transparent" /&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;And at the bottom line - Mac compares itself with PC, but in reality PC has no face. It's not fair. When we are to compare hardware with hardware and soft with soft so we should do this:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;         &lt;p align="center"&gt;&lt;strong&gt;compare personality:&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top"&gt;&lt;strong&gt;&amp;#160;&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top"&gt;         &lt;p align="center"&gt;&lt;strong&gt;or efficiency:&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;&lt;img src="http://farm4.static.flickr.com/3125/2522402026_a3b25322b0.jpg?v=0" /&gt;&lt;/td&gt;        &lt;td valign="top"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top"&gt;&lt;img src="http://farm4.static.flickr.com/3083/2521674841_1d1ffdbc9c.jpg?v=0" /&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;div align="center"&gt;&amp;#160;&lt;/div&gt; Also it all was happening already - &lt;a href="http://www.pbmai.com/pbmai_blog/uploaded_images/1996-macaddict-mac-vs-pc-700766.jpg" target="_blank"&gt;in 1996&lt;/a&gt;. Where the Apple Inc. ended up shortly after?   &lt;p&gt;P.S. Mac is OK, really. As well as PC. And there is &lt;a href="http://lazyloading.blogspot.com/2007/07/cool-apple-commercial.html" target="_blank"&gt;no real difference&lt;/a&gt; between them to be zealot about. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-1193310979453290823?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/1193310979453290823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=1193310979453290823' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1193310979453290823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1193310979453290823'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/05/why-vs-pc-commercial-works-in-pc-favor.html' title='Mac vs. PC - so what&amp;#39;s the deal?'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-6658662582003362402</id><published>2008-05-24T21:49:00.008-05:00</published><updated>2008-05-26T17:21:56.271-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='buzz'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><title type='text'>Pre-manufactured AJAX</title><content type='html'>&lt;img src="http://pics.livejournal.com/lux_and_boo/pic/0001zy9p" border="0" alt="" width=500 /&gt;&lt;br /&gt;Ajax-enable your web-server within minutes. No skill required.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-6658662582003362402?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/6658662582003362402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=6658662582003362402' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6658662582003362402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6658662582003362402'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/05/pre-manufactured-ajax.html' title='Pre-manufactured AJAX'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-7702927476593068465</id><published>2008-05-16T19:34:00.010-05:00</published><updated>2008-05-22T07:10:19.137-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><title type='text'>.NET Framework 3.5 SP1 Beta 1 - use some non-beta stuff today</title><content type='html'>One of the aspect &lt;a href="http://lazyloading.blogspot.com/2008/05/net-35-service-pack-beta-1.html" target="_blank"&gt;of shiny tomorrow&lt;/a&gt; is going to be &lt;a href="http://blogs.msdn.com/brada/archive/2008/05/05/visual-studio-2008-and-net-framework-3-5-sp1-beta.aspx"&gt;Ajax Script Combining Support&lt;/a&gt; - very nice feature no doubt it will be. If you ever fired the &lt;a href="http://lazyloading.blogspot.com/2008/05/pimp-my-ride.html"&gt;Firebug&lt;/a&gt; while debugging ASP.NET Ajax Control Toolkit (which I like more and more every day), you probably saw quite a few scripts being pumped up from the server. This is how the load looks with just one &lt;a href="http://lazyloading.blogspot.com/2008/05/aspnet-ajax-toolkit-getting-key-value.html"&gt;Autocomplete Extender&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://farm4.static.flickr.com/3205/2513798124_aa281a0f20.jpg?v=0" /&gt; &lt;/p&gt;  &lt;p&gt;But fear not - you don't have to wait for the full Service Pack release and you don't have to suffer with crippled Betas. The script combining functionality is already available in a stable form - through the ASP.NET Ajax Control Toolkit. &lt;a href="http://msmvps.com/blogs/luisabreu/archive/2007/06/12/toolkitscriptmanager-there-s-a-new-scriptmanager-in-town.aspx"&gt;ToolkitScriptManager&lt;/a&gt; class inherits from the standard &lt;a href="http://asp.net/ajax/documentation/live/overview/ScriptManagerOverview.aspx"&gt;ScriptManager&lt;/a&gt; and efficienlty eliminates multiple requests, combining scripts which express willingness to be combined in the form of a ScriptCombineAttribute.     &lt;br /&gt;This is the same page with TooliktScriptManager replacing a ScriptManager:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2040/2512977015_2f7503d79a.jpg?v=0" /&gt; &lt;/p&gt;  &lt;p&gt;We saved a quarter-second for page with just for one control - how much Ajax-junkies will gain?&lt;/p&gt;  &lt;p&gt;Now back to the Service Pack 1. Initially I though that ASP.NET team just ported a brilliant Toolkit-guys idea into the upgrade. But from the preview it looks like they did their own ScriptManager extension. New ScriptManager seems to provide more detailed adjustment while TooliktScriptManager is much simpler and elegant. It is too early to say and there is no way I would install Beta from Microsoft again.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-7702927476593068465?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/7702927476593068465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=7702927476593068465' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7702927476593068465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7702927476593068465'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/05/net-framework-35-sp1-beta-1-get-some.html' title='.NET Framework 3.5 SP1 Beta 1 - use some non-beta stuff today'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-1875428513713189086</id><published>2008-05-16T17:00:00.002-05:00</published><updated>2008-05-22T07:12:13.598-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>.NET 3.5 Service Pack Beta 1</title><content type='html'>&lt;center&gt;&lt;em&gt;Welcome to &lt;/em&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2008/05/12/visual-studio-2008-and-net-framework-3-5-service-pack-1-beta.aspx"&gt;&lt;em&gt;Microsoft&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;&lt;a href="http://www.hanselman.com/blog/VS2008AndNet35SP1BetaShouldYouFearThisRelease.aspx"&gt;&lt;em&gt;Labs&lt;/em&gt;&lt;/a&gt;&lt;em&gt; where the future is being made today!&lt;/em&gt; &lt;/center&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://muppet.wikia.com/wiki/Muppet_Labs" target="_blank"&gt;&lt;img src="http://images.wikia.com/muppet/images/f/fd/Labs.alchemist.jpg" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-1875428513713189086?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/1875428513713189086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=1875428513713189086' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1875428513713189086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1875428513713189086'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/05/net-35-service-pack-beta-1.html' title='.NET 3.5 Service Pack Beta 1'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-6268288097848182720</id><published>2008-05-16T16:23:00.004-05:00</published><updated>2008-07-21T06:53:29.193-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools and gadgets'/><category scheme='http://www.blogger.com/atom/ns#' term='pc'/><title type='text'>Hewlett Packard Notebook wireless card problem</title><content type='html'>&lt;p&gt;I can consider computer new if it's under the year old, can I? I've been using my HP Pavilion dv6000 for 7 or 8 months when wireless card went crazy. It wouldn't turn on for a few days, when suddenly resurrect for a day and get back to abyss&amp;#160; for weeks.&lt;/p&gt;  &lt;p&gt;Research has shown that problem is so common for this particular model (every other person referred to a &amp;quot;cheap crappy parts&amp;quot;) that HP decided to bestow upon its unlucky customers a &lt;a href="http://h10025.www1.hp.com/ewfrf/wc/document?docname=c01087277&amp;amp;lc=en&amp;amp;cc=us" target="_blank"&gt;Limited Warranty Service Enhancement&lt;/a&gt; (the model list has grown since my last visit :).&lt;/p&gt;  &lt;p&gt;But I didn't realize how common this problem, until I sent the notebook for repair. Judging by UPS tracking, the shipment was delivered to HP at 9AM May 15th and I've got my machine back on May 16th morning. So they barely had one workday to deal with my machine. I doubt that my case was handled by a super-dedicated employee who forfeited his coffee breaks in order to make me happy. There were scarcely enough time to even &lt;a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&amp;amp;articleId=9015905" target="_blank"&gt;restart Vista&lt;/a&gt; couple of times&lt;a href="#note"&gt;*&lt;/a&gt;, forget the diagnostics. So looks like they have some conveyer when they just replace whatever they do, without even turning machines on, and ship them back.&lt;/p&gt;  &lt;p&gt;&lt;a name="note"&gt;*&lt;/a&gt; I wouldn't be so grumpy about HP if they did not force me to buy the preloaded Vista Home in the first place and, even worse, forced me to replace my heavy-loaded XP Pro with the Vista again before the repair. Otherwise they wouldn't even touch it, they said.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-6268288097848182720?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/6268288097848182720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=6268288097848182720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6268288097848182720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6268288097848182720'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/05/hewlett-packard-notebook-wireless-card.html' title='Hewlett Packard Notebook wireless card problem'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-7739946633549340768</id><published>2008-05-14T09:23:00.002-05:00</published><updated>2008-05-25T16:02:40.605-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Fixing Continuous Integration build for a .NET 3.5 project</title><content type='html'>&lt;p&gt;My CI build fails with the following error:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#ff0000"&gt;C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets(1993,9): error MSB3091: Task failed because &amp;quot;sgen.exe&amp;quot; was not found, or the correct Microsoft Windows SDK is not installed. The task is looking for &amp;quot;sgen.exe&amp;quot; in the &amp;quot;bin&amp;quot; subdirectory beneath the location specified in the InstallationFolder value of the registry key HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v6.0A.        &lt;br /&gt;You may be able to solve the problem by doing one of the following:         &lt;br /&gt;1) Install the Microsoft Windows SDK for Windows Server 2008 and .NET Framework 3.5.         &lt;br /&gt;2) Install Visual Studio 2008.         &lt;br /&gt;3) Manually set the above registry key to the correct location.         &lt;br /&gt;4) Pass the correct location into the &amp;quot;ToolPath&amp;quot; parameter of the task.&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The research has brought quite a few posts about this problem, with &lt;a href="http://dhvik.blogspot.com/2007/11/task-failed-because-was-not-found.html" target="_blank"&gt;Dan H&amp;#228;ndevik's&lt;/a&gt; being the most helpful and &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2466921&amp;amp;SiteID=1" target="_blank"&gt;MSDN Forum's&lt;/a&gt; - the least (surprise, surprise). Unfortunately the proposed manual solution didn't work for me. I blamed it initially on my ambiguous x32/x64 server setup but all my attempts to trick the MSBuild didn't succeed and it kept reproducing that annoying error. I even tried to synchronize NAnt configuration with supposed SDK paths (BTW - there is an &lt;a href="http://codebetter.com/blogs/jeffrey.palermo/archive/2007/11/28/upgrade-nant-for-use-with-vs2008-solutions-and-net-3-5.aspx" target="_blank"&gt;excellent post&lt;/a&gt; about tricking your NAnt 0.85 to run .NET 3.5 assemblies).&lt;/p&gt;  &lt;p&gt;The exception itself is actually confusing - as it appeared afterwards, the mentioned registry key was still missing while build was running OK. My guess that it is hardcoded&amp;#160; somewhere but it's hardly worth digging into the code with Reflector.&lt;/p&gt;  &lt;p&gt;The only solution which eventually helped was to install the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=F26B1AA4-741A-433A-9BE5-FA919850BDBF&amp;amp;displaylang=en" target="_blank"&gt;Windows SDK for Server 2008 and .NET Framework 3.5&lt;/a&gt;. I was confused by the download's title initially (our build runs on the Windows Server 2003) - but SDK didn't seem to harm anything (at least not yet). The installation is much smaller than suggested VS 2008 and now build is healthy (it is still failing for different reasons but that's another story - at least it passes the assembly stage).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-7739946633549340768?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/7739946633549340768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=7739946633549340768' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7739946633549340768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7739946633549340768'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/05/fixing-continuous-integration-build-for.html' title='Fixing Continuous Integration build for a .NET 3.5 project'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-7023099806675547315</id><published>2008-05-13T21:00:00.005-05:00</published><updated>2009-12-05T11:35:25.941-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><title type='text'>ASP.NET Ajax Toolkit - getting a key-value pair from the auto complete extender</title><content type='html'>&lt;p&gt;Autocomplete Extender is a nice control, no doubt. And free. I didn't check earlier versions but current solution uses JSON web services and pretty fast.&lt;br /&gt;Originally the Autocomplete Extender lacked very important functionality  - ability to operate with key-value pairs. If you think about that, the Google search auto complete serves its purpose - the resulting string IS the value which is important for the postback, but it is scarcely the case for the 98% of non-search applications. We need control to mimic dropdown list - so &lt;strike&gt;gimme ya money&lt;/strike&gt; let me keep the value for the entered text! Such a functionality was added some time ago but regretfully the feature was left undocumented.&lt;/p&gt;  &lt;p&gt;You need to make few small changes to the &lt;a href="http://www.asp.net/ajax/ajaxcontroltoolkit/samples/autocomplete/autocomplete.aspx" target="_blank"&gt;original example&lt;/a&gt;: add JavaScript handling on the client and modify Web Service to return more sophisticated array. The Web Service method has to generate the list with the items in {"First":"&amp;lt;Name&amp;gt;,"Second":"&amp;lt;Value&amp;gt;"} format. E.g. &lt;/p&gt;  &lt;pre class="csharpcode"&gt;{"&lt;span class="kwrd"&gt;First&lt;/span&gt;":"Nissan Oakville","&lt;span class="kwrd"&gt;Second&lt;/span&gt;":"34AF44d2-1190-f489"} &lt;/pre&gt;Method &lt;em&gt;AutoCompleteExtender.CreateAutoCompleteItem(name,value)&lt;/em&gt; can help to create proper format.&lt;br /&gt;&lt;p&gt;Page looks like this:&lt;/p&gt;&lt;blockquote&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="text/javascript"&lt;/span&gt; &lt;span class="attr"&gt;language&lt;/span&gt;&lt;span class="kwrd"&gt;="javascript"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; GetCode(source, eventArgs )&lt;br /&gt;{&lt;br /&gt;document.getElementById(&lt;span class="str"&gt;"hCode"&lt;/span&gt;).value = eventArgs.get_value();&lt;br /&gt;}&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Enter Manufacturer: &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:TextBox&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="txtManufacturer"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="hCode"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="hidden"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ajaxToolkit:AutoCompleteExtender&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;="AutoCompleteExtender1"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;TargetControlID&lt;/span&gt;&lt;span class="kwrd"&gt;="txtManufacturer"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;ServicePath&lt;/span&gt;&lt;span class="kwrd"&gt;="~/WebServices/AutoCompleteService.asmx"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;ServiceMethod&lt;/span&gt;&lt;span class="kwrd"&gt;="GetCompletionList"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;CompletionInterval&lt;/span&gt;&lt;span class="kwrd"&gt;="100"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;CompletionSetCount&lt;/span&gt;&lt;span class="kwrd"&gt;="20"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;MinimumPrefixLength&lt;/span&gt;&lt;span class="kwrd"&gt;="2"&lt;/span&gt;&lt;br /&gt;&lt;span class="attr"&gt;OnClientItemSelected&lt;/span&gt;&lt;span class="kwrd"&gt;="GetCode"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;And this is a full web service code:&lt;br /&gt;&lt;pre class="code"&gt;[&lt;span style="color: rgb(43, 145, 175);"&gt;WebService&lt;/span&gt;(Namespace = &lt;span style="color: rgb(163, 21, 21);"&gt;"http://tempuri.org/"&lt;/span&gt;)]&lt;br /&gt;[&lt;span style="color: rgb(43, 145, 175);"&gt;WebServiceBinding&lt;/span&gt;(ConformsTo = &lt;span style="color: rgb(43, 145, 175);"&gt;WsiProfiles&lt;/span&gt;.BasicProfile1_1)]&lt;br /&gt;[&lt;span style="color: rgb(43, 145, 175);"&gt;ToolboxItem&lt;/span&gt;(&lt;span style="color:blue;"&gt;false&lt;/span&gt;)]&lt;br /&gt;[System.Web.Script.Services.&lt;span style="color: rgb(43, 145, 175);"&gt;ScriptService&lt;/span&gt;]&lt;br /&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;AutoCompleteService &lt;/span&gt;: System.Web.Services.&lt;span style="color: rgb(43, 145, 175);"&gt;WebService&lt;br /&gt;&lt;/span&gt;{&lt;br /&gt;&lt;br /&gt;[&lt;span style="color: rgb(43, 145, 175);"&gt;WebMethod&lt;/span&gt;]&lt;br /&gt;[System.Web.Script.Services.&lt;span style="color: rgb(43, 145, 175);"&gt;ScriptMethod&lt;/span&gt;]&lt;br /&gt;&lt;span style="color:blue;"&gt;public string&lt;/span&gt;[] GetCompletionList(&lt;span style="color:blue;"&gt;string &lt;/span&gt;prefixText, &lt;span style="color:blue;"&gt;int &lt;/span&gt;count)&lt;br /&gt;{&lt;br /&gt;   List&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; names = &lt;span style="color:blue;"&gt;new &lt;/span&gt;List&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;();&lt;br /&gt;   &lt;span style="color:blue;"&gt;using &lt;/span&gt;(SqlConnection conn = &lt;span style="color: rgb(43, 145, 175);"&gt;DbGateway&lt;/span&gt;.GetConnection())&lt;br /&gt;   {&lt;br /&gt;       SqlCommand cmd = &lt;span style="color:blue;"&gt;new &lt;/span&gt;SqlCommand(&lt;span style="color: rgb(163, 21, 21);"&gt;"GetManufacturersByPrefix"&lt;/span&gt;, conn);&lt;br /&gt;       cmd.CommandType = &lt;span style="color: rgb(43, 145, 175);"&gt;CommandType&lt;/span&gt;.StoredProcedure;&lt;br /&gt;       cmd.Parameters.Add(&lt;span style="color:blue;"&gt;new &lt;/span&gt;SqlParameter(&lt;span style="color: rgb(163, 21, 21);"&gt;"@prefix"&lt;/span&gt;, prefixText));&lt;br /&gt;       cmd.Parameters.Add(&lt;span style="color:blue;"&gt;new &lt;/span&gt;SqlParameter(&lt;span style="color: rgb(163, 21, 21);"&gt;"@count"&lt;/span&gt;, count));&lt;br /&gt;       conn.Open();&lt;br /&gt;       &lt;span style="color:blue;"&gt;using &lt;/span&gt;(SqlDataReader reader = cmd.ExecuteReader())&lt;br /&gt;       {&lt;br /&gt;           &lt;span style="color:blue;"&gt;while &lt;/span&gt;(reader.Read())&lt;br /&gt;           {&lt;br /&gt;               &lt;span style="color:blue;"&gt;string &lt;/span&gt;item = AjaxControlToolkit.&lt;span style="color: rgb(43, 145, 175);"&gt;AutoCompleteExtender&lt;/span&gt;.CreateAutoCompleteItem&lt;br /&gt;                   (reader[&lt;span style="color: rgb(163, 21, 21);"&gt;"ManufacturerName"&lt;/span&gt;].ToString(),&lt;br /&gt;                   reader[&lt;span style="color: rgb(163, 21, 21);"&gt;"ManufacturerId"&lt;/span&gt;].ToString());&lt;br /&gt;               names.Add(item);&lt;br /&gt;           }&lt;br /&gt;           reader.Close();&lt;br /&gt;       }&lt;br /&gt;       conn.Close();&lt;br /&gt;   }&lt;br /&gt;   &lt;span style="color:blue;"&gt;return &lt;/span&gt;names.ToArray();&lt;br /&gt; }&lt;br /&gt;} &lt;/pre&gt;As a result if postback is required, the &lt;em&gt;hCode&lt;/em&gt; element will hold the value, matching the text from &lt;em&gt;txtManufacturers&lt;/em&gt; box and can be extracted from Request.Form collection.&lt;br /&gt;&lt;p&gt;P.S. Microsoft has to apply some serious ass-kicking to their Documentation Generation (or whatever) Department. Poor MSDN documentation and samples are unbearable and this tradition seems to infect the Microsoft-flavored open source community. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-7023099806675547315?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/7023099806675547315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=7023099806675547315' title='33 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7023099806675547315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/7023099806675547315'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/05/aspnet-ajax-toolkit-getting-key-value.html' title='ASP.NET Ajax Toolkit - getting a key-value pair from the auto complete extender'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>33</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-4543832249897117278</id><published>2008-05-10T08:08:00.002-05:00</published><updated>2008-07-21T06:57:52.216-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools and gadgets'/><category scheme='http://www.blogger.com/atom/ns#' term='vista'/><category scheme='http://www.blogger.com/atom/ns#' term='pc'/><title type='text'>Pimp my ride</title><content type='html'>&lt;p&gt;&lt;img style="margin: 0px 0px 0px 15px;" src="http://www.aolcdn.com/channels/0d/00/4600567e-0011d-04e49-400cb8e1" align="right" height="201" width="264" /&gt; &lt;/p&gt;  &lt;p&gt;Being contracting for a little while I've noticed that I am going through the same routine over and over again, setting up my new workhorse computer at yet anther work place. I realize those thing help me make less efforts while being same productive. Those are my typical steps, what are yours?&lt;/p&gt;  &lt;p&gt;1. Simplify Windows. &lt;/p&gt;  &lt;p&gt;I was lucky so far to not encounter companies who adopted &lt;a href="http://havemacwillblog.com/2007/12/18/10-reasons-why-vista-is-a-disaster/" target="_blank"&gt;Vista &lt;/a&gt;as their development platform. It's either everybody around is smart or those unlucky ones die faster than first candidate would answer their recruiting ad. So no experience with &lt;a href="http://vistasucks.wordpress.com/2007/06/25/microsoft-admits-vista-failure/" target="_blank"&gt;Vista&lt;/a&gt; whatsoever.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Turn off the Appearance Effects.   &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Set folders view to Classic Windows.   &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Purge all junk from the Start Menu (or at least dump it in some "Miscellaneous" subfolder). The Startup folder should be &lt;u&gt;empty&lt;/u&gt;!    &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Drug all the important shortcuts to the desktop - Visual Studio, SQL Management Studio, IIS Manager, .NET Reflector, WinMerge, Virtual PC, Remote Desktop and whatever you need for daily work. And clean up everything else: IE, Outlook, MSN, My Network Places...   &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Being younger and more radical I used to turn on the Classic Windows Schema but compared with &lt;a href="http://www.theinquirer.net/en/inquirer/news/2007/04/21/microsoft-admits-vista-failure" target="_blank"&gt;Vista&lt;/a&gt; XP Schema suddenly looks OK. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;2. &lt;a href="http://www.mozilla.com/" target="_blank"&gt;Firefox&lt;/a&gt; - surprisingly Firefox is still not a part of the default PC image.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Reorganize the toolbar - make buttons small, add "New Tab" icon and move Bookmark Toolbar up there.   &lt;br /&gt;&lt;/li&gt;    &lt;li&gt; &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/60" target="_blank"&gt;Web Developer&lt;/a&gt;, &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1843" target="_blank"&gt;Firebug&lt;/a&gt; - if you didn't try it yet - get them right away. Del.icio.us (the &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1532" target="_blank"&gt;OEM version&lt;/a&gt; will do) and &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/744" target="_blank"&gt;Wikipedia Lookup&lt;/a&gt; addons.   &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.aisto.com/roeder/dotnet/" target="_blank"&gt;.NET Reflector &lt;/a&gt;- Isn't this guy a marketing genius? When you start Reflector, it's all you see in the task bar - "Lutz Roeder's .NET Re...", and it eventually will burn into your mind, who you should thank for this excellent tool.    &lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;4. &lt;a href="http://tortoisesvn.tigris.org/" target="_blank"&gt;Tortoise SVN&lt;/a&gt;. There are two kind of shops around - those with Team System and can't get into rehab and those who don't care (those with Visual SourceSafe do not really care). So &lt;a href="http://subversion.tigris.org/" target="_blank"&gt;Subversion&lt;/a&gt; emerges eventually. There are another good tools, I know, but I have to encounter &lt;a href="http://git.or.cz/" target="_blank"&gt;Git&lt;/a&gt;-enthusiast on my journey to include it to my list. &lt;/p&gt;  &lt;p&gt;5. Most recent addition - &lt;a href="http://winmerge.org/" target="_blank"&gt;WinMerge &lt;/a&gt;tool. Friendly, simple, fast. Free.&lt;/p&gt;  &lt;p&gt;6. Pimping up Visual Studio. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Remove stupid start screen and perverse visual effects. They still are in the VS 2008 - who honestly needs them, considering the IDE speed is so precious?   &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.jetbrains.com/resharper/" target="_blank"&gt;Resharper &lt;/a&gt;(if I can get it). It is absolute necessity for VS 2005 and I can't wait when Version 4.0 will bring the Light to the VS 2008.    &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Two new nice additions to the VS 2008: &lt;a href="http://www.visualsvn.com/" target="_blank"&gt;Visual SVN&lt;/a&gt; and &lt;a href="http://www.codeplex.com/SourceCodeOutliner" target="_blank"&gt;Source Outliner&lt;/a&gt; power toy. The first is not free but is absolutely worth it's $50 price tag. The second is helpful for code reviews (especially if code is &lt;a href="http://lazyloading.blogspot.com/2008/05/code-quality-region-directive-is-evil.html" target="_blank"&gt;polluted with #region directives&lt;/a&gt;). &lt;/li&gt; &lt;/ul&gt;Update:&lt;br /&gt;7.  &lt;a href="http://www.ccleaner.com/" target="_blank"&gt;CCleaner &lt;/a&gt;is the best contractor's friend. Clean it up daily and go nuts at the end-of-service time to keep your privacy and employer decency.&lt;br /&gt;&lt;br /&gt;This list should do. Completing it gives me a feeling that my first day at the new place wasn't completely wasted.  &lt;div class="blogger-post-footer"&gt;&lt;br /&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-4543832249897117278?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/4543832249897117278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=4543832249897117278' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4543832249897117278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4543832249897117278'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/05/pimp-my-ride.html' title='Pimp my ride'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-938972971963137825</id><published>2008-05-09T09:23:00.004-05:00</published><updated>2008-05-09T13:50:54.886-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code quality'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Code quality - #region directive is evil</title><content type='html'>It is, you should agree. It pollutes the code making it very difficult to read (who remembers the hotkey to Expand All?). And it doesn't help a bit.&lt;br /&gt;Even if it seems to be a good idea at the time, think of how painful it will be to read the code when you (or another poor bastard) will be asked to make changes few months down the road (I barely can keep my last-week code in mind).&lt;br /&gt;If one is tempted to use &lt;span style="font-style: italic;"&gt;#region&lt;/span&gt; then it most likely means that &lt;span style="font-style: italic;"&gt;a)&lt;/span&gt; module has grown too big to manage &lt;span style="font-style: italic;"&gt;b)&lt;/span&gt; there are parts of code in the module which are irrelevant to other parts. And usually &lt;span style="font-style: italic;"&gt;a)&lt;/span&gt; is directly caused by &lt;span style="font-style: italic;"&gt;b)&lt;/span&gt;. It doesn't mean that methods or properties from another region are completely unrelated - they just obscure reading. And &lt;span style="font-style: italic;"&gt;#region&lt;/span&gt; addresses this issue very poorly. There is no reason to keep all this code in the same module - split it. It will allow to read two related pieces of code simultaneously, switching with ctrl+tab instead of scrolling back and forth, and it will make a nice, clean, better organized code. And if you think that it is too minimalistic - read about "&lt;a href="http://binstock.blogspot.com/2008/04/perfecting-oos-small-classes-and-short.html" target="_blank"&gt;Perfecting classes and small methods&lt;/a&gt;"&lt;br /&gt;Code &lt;a href="http://www.c-sharpcorner.com/UploadFile/rmcochran/CSharpCohesion02142008092055AM/CSharpCohesion.aspx" target="_blank"&gt;cohesiveness&lt;/a&gt; is the best weapon against monstrous modules. The UtilModules are evil too and I created a lot of them (and keep doing it) to know how bad they are :). UtilModule is kind of unavoidable for junk storage but still there is no excuse for the &lt;span style="font-style: italic;"&gt;#region Database stuff &lt;/span&gt;- separate it to a DbUtilModule!&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-938972971963137825?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/938972971963137825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=938972971963137825' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/938972971963137825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/938972971963137825'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/05/code-quality-region-directive-is-evil.html' title='Code quality - #region directive is evil'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-3369886551135053322</id><published>2008-05-04T07:50:00.006-05:00</published><updated>2008-05-04T07:57:31.694-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><title type='text'>ASP.NET Ajax control toolkit vs. VS 2008</title><content type='html'>&lt;p&gt;If you plan to use some Ajax in your ASP.NET web project, even if you not sure, - just make an Ajax Control Toolkit installation your very first step. In fact - do it as the very first step for any project, just in case - drug any control to the default.aspx. In 50% cases you'll get the error message "The operation could not be complete. Invalid FORMATETC structure". Very informative, and Google doesn't help much. &lt;/p&gt;  &lt;p&gt;It is scary that there are Microsoft very own MVP's among frustrated posters and there is no single question answered. Oops, my bad, - there are answers; this one worked (the only): "Scrap your project and start new one, making the Toolkit test your very first step. If failing again - start new project". Nice. BTW - it is the same for VS 2005, so problem was around for a while. So basically, if you do not wish to spend, like me, half an hour in swearing, while porting semi-complicated structure to the new project, - just be a smart boy and try the Ajax Toolkit as a first step.&lt;/p&gt;  &lt;p&gt;Another sour disappointment in Microsoft quality - the Microsoft-style open-source. Looks like a bunch of MVP's, who herded up for ASP.NET Ajax library initially, lost their interest. I haven't seen any visible activity on the site for a while and the latest installation instructions happily ignore even Orcas. That's why I am a little bit &lt;a href="http://lazyloading.blogspot.com/2008/04/aspnet-dynamic-data.html" target="_blank"&gt;skeptical&lt;/a&gt; about all this &lt;a href="http://asp.net/mvc/" target="_blank"&gt;new&lt;/a&gt; &lt;a href="http://code.msdn.microsoft.com/dynamicdata" target="_blank"&gt;buzz&lt;/a&gt;. Smart boys are playing with their new toys - good for them, but we - mortals down here, are supplied from the Microsoft soulless production floor (where just drones are). So you should either &lt;a href="http://lazyloading.blogspot.com/2008/04/introverted-programming-reading-around.html" target="_blank"&gt;do not care&lt;/a&gt; or try Toolkit (or MVC, or Dynamic Data), starting your project, just in case.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-3369886551135053322?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/3369886551135053322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=3369886551135053322' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3369886551135053322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/3369886551135053322'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/05/aspnet-ajax-control-toolkit-vs-vs-2005.html' title='ASP.NET Ajax control toolkit vs. VS 2008'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-2199893203223166988</id><published>2008-04-28T06:49:00.002-05:00</published><updated>2008-04-28T06:50:25.498-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='introverted programming'/><title type='text'>Introverted Programming: reading around</title><content type='html'>&lt;p&gt;It may become quite depressing to read blogs, listening podcasts and work with professionals. You are constantly reminded that you should know that you don't know anything. It is comforting to know that others knew &lt;a href="http://en.wikipedia.org/wiki/I_know_that_I_know_nothing" target="_blank"&gt;the same &lt;/a&gt; but knowing that is still disheartening, you know. You know what I mean.&lt;/p&gt;  &lt;p&gt;What will make your life much more cheerful is keeping the state of blissful ignorance of this modern and ever changing stuff. What good can come out of taking on many emerging ideas? Half of them will be forgotten and buried within a short time and you'd never guess to avoid wasting your time on the doomed one. Being a mental coach potato will save your nerves, time and dignity. When technology will settle, one can always read "In 24 hours" or "Step by Step" book or wrestle a training course out of the management. Follow the &lt;a href="http://lazyloading.blogspot.com/2007/05/introverted-programming-job-security.html" target="_blank"&gt;job security&lt;/a&gt; guidance and you will be safe for the rest of your time.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-2199893203223166988?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/2199893203223166988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=2199893203223166988' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/2199893203223166988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/2199893203223166988'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/04/introverted-programming-reading-around.html' title='Introverted Programming: reading around'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-6338113257873821013</id><published>2008-04-27T08:17:00.005-05:00</published><updated>2008-04-28T06:43:56.174-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='privacy'/><title type='text'>What's ya doin'?</title><content type='html'>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;That's interesting - I was reading an article with a notable headline &lt;a href="http://blogs.zdnet.com/security/?p=197" target="_blank"&gt;Do you know what's leaking out of your browser?&lt;/a&gt; and got distracted by a pretty cool &lt;a href="http://www.microsoft.com/forefront/easyeasier/index.htm" target="_blank"&gt;Microsoft Forefront Server flash commercial&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img style="margin: 0px 10px 0px 0px;" src="http://farm4.static.flickr.com/3257/2444773637_7c89f49633.jpg?v=0" align="right" /&gt;Purely accidentally I right-clicked the Flash and (for the first time in my life) chose "Settings...". What I have found is pretty scary. What in the world is this setting for?! What kind of pervert would not just enable the access but would like to keep it? Obviously the developer's goal was to make the "Allow" a first-choice action. So far the "Deny" is pre-selected but what if the future release will decide to "improve the customer experience" by knowing the customer more intimately? Or not even just do that but hide this setting so the user wouldn't worry. Do you know exactly how this feature works anyway? I don't.&lt;/p&gt;  &lt;p&gt;Adobe must be aware of some controversy but doesn't seem to be too worried that people could find it disturbing. The support site casually lists the &lt;a href="http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager.html" target="_blank"&gt;Setting Manager&lt;/a&gt; abilities:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;To specify whether websites must ask your permission before using your camera or microphone, you use the Global Privacy Settings panel.&lt;/em&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In other words "You can change colours, set updates frequency and, oh, by the way (yawn) - you can disagree with somebody spying on you. Mmmkey?"&lt;/p&gt;  &lt;p&gt;Are you still worrying? Caaamon! They have the article that will comfort you: &lt;a href="http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_16748&amp;amp;sliceId=2" target="_blank"&gt;Can others use my webcam to spy on me?&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Ads and other applications that use the Flash Player cannot access your webcam without your explicit permission to do so.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That's a relief - people who delivering their advertising (unsolicited) to my house should be allowed to peep explicitly. It is just a spam, after all. But what if next time it will be an anti-terrorist campaign form the NSA? Hmm...&lt;/p&gt;  &lt;p&gt;MSN Messenger can control your input devices too, but you have to turn it on in the first place - sic perform a conscious and explicit action. Development using "advance" (here: questionable) Messenger features is subject of registration and approval (most likely the government will obtain it pretty easy but at least it's a paper trail). Does the Adobe have this kind of regulation? &lt;a style="font-weight: bold;" href="http://phoenixlabs.org/pg2/" target="_blank"&gt;Peer Guardian&lt;/a&gt;, people!&lt;/p&gt;  &lt;p&gt;P.S. It's not like I suspect that you are doing something in front of your computer that you should be ashamed of, but still.... :)&lt;/p&gt;  &lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-6338113257873821013?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/6338113257873821013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=6338113257873821013' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6338113257873821013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/6338113257873821013'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/04/what-ya-doin.html' title='What&amp;#39;s ya doin&amp;#39;?'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-4254262106013501146</id><published>2008-04-25T11:28:00.004-05:00</published><updated>2008-04-25T11:29:40.258-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><title type='text'>The blog I most sorely miss</title><content type='html'>&lt;p&gt;It was a year already without the &lt;a href="http://headrush.typepad.com/" target="_blank"&gt;Kathy Sierra's blog&lt;/a&gt; - my temple of inspiration, taken away from me so untimely. &lt;/p&gt;  &lt;p&gt;I always envied her amusing charts(is there some kind of software for that?) and it was giving me ideas for my shamelessly secondary presentations (which people happened to like). The &lt;a href="http://headrush.typepad.com/creating_passionate_users/2005/12/braindeath_by_m.html" target="_blank"&gt;Zombie Function&lt;/a&gt; helped me to cope with the 8-hour &amp;quot;How we can increase meetings efficiency&amp;quot; department meeting. After &lt;a href="http://headrush.typepad.com/creating_passionate_users/2005/06/kill_your_prese.html" target="_blank"&gt;Stop Your Presentation&lt;/a&gt; I got rid of freshly created slides so auditorium suffered less while I was expounding my ridiculously wrong (at the time!) version of the Continuous Integration algorithm. I did my fair share of &lt;a href="http://headrush.typepad.com/creating_passionate_users/2005/03/motivated_to_le.html" target="_blank"&gt;Just-In-Case&lt;/a&gt; learning but seeing the problem recognized helped me with my therapy and I am clean now (seriously, sir, I am OK. Just the last Ruby book and I quit). &lt;a href="http://www.oreilly.com/store/series/headfirst.csp" target="_blank"&gt;Head First books&lt;/a&gt; are still amazing.&lt;/p&gt;  &lt;p&gt;Blog was good, pictures were good.&lt;/p&gt;  &lt;p&gt;So long.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-4254262106013501146?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/4254262106013501146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=4254262106013501146' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4254262106013501146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4254262106013501146'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/04/blog-i-most-sorely-miss.html' title='The blog I most sorely miss'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-14187516409852485</id><published>2008-04-25T10:43:00.001-05:00</published><updated>2008-04-25T10:43:49.453-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pc'/><category scheme='http://www.blogger.com/atom/ns#' term='animals'/><title type='text'>That's what I need...</title><content type='html'>&lt;p&gt;&lt;a href="http://www.therefinedfeline.com/kitinbox-cat-perch.htm" target="_blank"&gt;&lt;img style="margin: 0px 10px 0px 0px" height="271" src="http://www.therefinedfeline.com/images/KitInBox/HR/hr.kitinboxcatperch1.jpg" width="312" align="left" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Interesting question: does it come stackable?&lt;/p&gt;  &lt;p&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; &lt;img height="131" src="http://farm3.static.flickr.com/2416/2440438417_790e090459.jpg?v=0" width="132" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-14187516409852485?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/14187516409852485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=14187516409852485' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/14187516409852485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/14187516409852485'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/04/that-what-i-need.html' title='That&amp;#39;s what I need...'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-5635496818599521904</id><published>2008-04-23T09:01:00.013-05:00</published><updated>2008-04-25T07:07:38.683-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Enum.TryParse with .NET 3.5 extension methods</title><content type='html'>&lt;p&gt;Among other awesome features introduced in C# 3.0 are amazing extension methods. It looks like taking on board dynamic-language-oriented people like John Lam is starting to pay out for Microsoft. Now this Ruby-style can be done in C#: &lt;/p&gt;&lt;pre class="code"&gt;42.IsInRange(range);&lt;/pre&gt;&lt;p&gt;Woohoo! The feature is quite powerful and if you think about that - a little bit intimidating for a static-language mind. Ruby people will be definitely more comfortable with the idea of such a freedom.&lt;br /&gt;A release earlier - in .NET 2.0 - Microsoft gave us TryParse method, a good way to write cleaner code and &lt;a href="http://lazyloading.blogspot.com/2007/05/benchmarking-net-try-catch-vs-tryparse.html" target="_blank"&gt;improve performance&lt;/a&gt; avoiding costly Try-Catch blocks (judging by the messy code it was the last-minute addition, though). Sadly, for some reason the Enum type wasn't equipped with this useful feature. That means it is a good reason to try out some extensions...&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The following code is a first attempt, which is more in line with the traditional TryParse syntax:&lt;br /&gt;&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static bool &lt;/span&gt;TryParse(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Enum &lt;/span&gt;theEnum, &lt;span style="color: rgb(43, 145, 175);"&gt;Type &lt;/span&gt;enumType, &lt;span style="color:blue;"&gt;object &lt;/span&gt;value, &lt;span style="color:blue;"&gt;out &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Enum &lt;/span&gt;result)&lt;br /&gt;{&lt;br /&gt; result = theEnum;&lt;br /&gt;&lt;span style="color:blue;"&gt;  foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;string &lt;/span&gt;item &lt;span style="color:blue;"&gt;in &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Enum&lt;/span&gt;.GetNames(enumType))&lt;br /&gt; {&lt;br /&gt;&lt;span style="color:blue;"&gt;    if &lt;/span&gt;(item.Equals(value))&lt;br /&gt;   {&lt;br /&gt;     result = (&lt;span style="color: rgb(43, 145, 175);"&gt;Enum&lt;/span&gt;)&lt;span style="color: rgb(43, 145, 175);"&gt;Enum&lt;/span&gt;.Parse(enumType, value.ToString());&lt;br /&gt;   &lt;span style="color:blue;"&gt;  return true&lt;/span&gt;;&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;  if &lt;/span&gt;(&lt;span style="color: rgb(43, 145, 175);"&gt;Enum&lt;/span&gt;.IsDefined(enumType, &lt;span style="color: rgb(43, 145, 175);"&gt;Convert&lt;/span&gt;.ChangeType(value, (&lt;span style="color: rgb(43, 145, 175);"&gt;Enum&lt;/span&gt;.GetUnderlyingType(enumType)))))&lt;br /&gt; {&lt;br /&gt;   result = (&lt;span style="color: rgb(43, 145, 175);"&gt;Enum&lt;/span&gt;)&lt;span style="color: rgb(43, 145, 175);"&gt;Enum&lt;/span&gt;.Parse(enumType, value.ToString());&lt;br /&gt;&lt;span style="color:blue;"&gt;    return true&lt;/span&gt;;&lt;br /&gt; }&lt;br /&gt;&lt;span style="color:blue;"&gt;  return false&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;The usage is obvious:&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;bool &lt;/span&gt;result = type.TryParse(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(43, 145, 175);"&gt;StatusEnum&lt;/span&gt;), &lt;span style="color: rgb(163, 21, 21);"&gt;"SerialMonogamist"&lt;/span&gt;, &lt;span style="color:blue;"&gt;out &lt;/span&gt;parsedEnum);&lt;/pre&gt;I avoided using a brute force approach with catching parsing errors - it defeats the whole purpose of having TryParse in the first place. The parse attempt is split into string and number parsing. The reason I didn't use the &lt;span style="color: rgb(43, 145, 175);"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Enum&lt;/span&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;.IsDefined(enumType, &lt;/span&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;value) for strings is it will &lt;/span&gt;&lt;/span&gt;fail for a numeric values with type different from the enum's underlying type. I assumed that parsing Int16 or Int64 to the Int32-based enum should work flawlessly (mind the Overflow exception).&lt;br /&gt;&lt;p&gt;A little bit different but more elegant code with generics:&lt;br /&gt;&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static bool &lt;/span&gt;TryParse&amp;lt;T&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;T theEnum, &lt;span style="color:blue;"&gt;object &lt;/span&gt;value, &lt;span style="color:blue;"&gt;out &lt;/span&gt;T result)&lt;br /&gt;{&lt;br /&gt; result = theEnum;&lt;br /&gt;&lt;span style="color:blue;"&gt;  foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;string &lt;/span&gt;item &lt;span style="color:blue;"&gt;in &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Enum&lt;/span&gt;.GetNames(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(T)))&lt;br /&gt; {&lt;br /&gt;&lt;span style="color:blue;"&gt;    if &lt;/span&gt;(item.Equals(value))&lt;br /&gt;  {&lt;br /&gt;    result = (T)&lt;span style="color: rgb(43, 145, 175);"&gt;Enum&lt;/span&gt;.Parse(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(T), value.ToString());&lt;br /&gt;  &lt;span style="color:blue;"&gt;  return true&lt;/span&gt;;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;  if &lt;/span&gt;(&lt;span style="color: rgb(43, 145, 175);"&gt;Enum&lt;/span&gt;.IsDefined(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(T), &lt;span style="color: rgb(43, 145, 175);"&gt;Convert&lt;/span&gt;.ChangeType(value, (&lt;span style="color: rgb(43, 145, 175);"&gt;Enum&lt;/span&gt;.GetUnderlyingType(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(T))))))&lt;br /&gt; {&lt;br /&gt;  result = (T)&lt;span style="color: rgb(43, 145, 175);"&gt;Enum&lt;/span&gt;.Parse(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(T), value.ToString());&lt;br /&gt;&lt;span style="color:blue;"&gt;    return true&lt;/span&gt;;&lt;br /&gt; }&lt;br /&gt;&lt;span style="color:blue;"&gt;  return false&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;The method call looks cleaner (CLR is smart enough to deduce a proper signature even if generic type is omitted) but a bit less readable:&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;bool &lt;/span&gt;result = theEnum.TryParse(&lt;span style="color: rgb(163, 21, 21);"&gt;"HonestHusband"&lt;/span&gt;, &lt;span style="color:blue;"&gt;out &lt;/span&gt;parsedEnum);&lt;/pre&gt;I've put some small &lt;a href="http://download146.mediafire.com/fmvrnzgxxpdg/bx4xust9xje/ExtensionMethods.zip" target="_blank"&gt;test coverage project&lt;/a&gt; together and you can use it when trying to perfect my humble code. Good luck! Now it should be less reasons to &lt;a href="http://skizz.biz/blog/2004/01/20/more-reasons-never-to-use-c-enums/" target="_blank"&gt;hate C# generics&lt;/a&gt; :)&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-5635496818599521904?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/5635496818599521904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=5635496818599521904' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/5635496818599521904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/5635496818599521904'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/04/enumtryparse-with-net-35-extension.html' title='Enum.TryParse with .NET 3.5 extension methods'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-1076871608104421059</id><published>2008-04-21T08:41:00.016-05:00</published><updated>2008-04-24T05:22:10.218-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><category scheme='http://www.blogger.com/atom/ns#' term='xfn'/><title type='text'>Adding XHTML Friends Network tags to your site</title><content type='html'>&lt;p&gt;Jut another Web 2.1 feature - &lt;a class="xfnRelationship" rel="friends" style="position: relative;" href="http://gmpg.org/xfn/" target="_blank"&gt;XFN - XHTML Friends Network&lt;/a&gt; tagging. It may grow up into the some kind of Friendorati network, it may not. I like that it inserts nice tiny pictures and shows some personal relations with people you writing about. Doing that why do not do it with some standard?&lt;/p&gt;  &lt;p&gt;First - the &lt;a class="xfnRelationship" rel="xfn" style="position: relative;" href="http://www.koders.com/noncode/fid7927E172F8C7A1E021DB58E93F800255E0D5E653.aspx" target="_blank"&gt;CSS file&lt;/a&gt; (I think it belongs to the &lt;a class="xfnRelationship" rel="guru met" style="position: relative;" href="http://haacked.com/" target="_blank"&gt;Phil Haack&lt;/a&gt;). &lt;/p&gt;  &lt;p&gt;Second - the linking standard: &lt;span style="font-style: italic;"&gt;&amp;lt;a &lt;/span&gt;&lt;strong style="font-style: italic;"&gt;class="xfnRelationship"&lt;/strong&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;strong style="font-style: italic;"&gt;rel="guru"&lt;/strong&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;span style="font-style: italic;"&gt;style="position: relative;" title="Just an example" href="http://www.lazyloading.blogspot.com"  &lt;/span&gt;&lt;strong style="font-style: italic;"&gt;&lt;/strong&gt;&lt;span style="font-style: italic;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;And last but not least - nice images:&lt;/p&gt;  &lt;table border="0" cellpadding="2" cellspacing="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;&lt;img src="http://lh4.ggpht.com/goldobine/SAyUq-J8LtI/AAAAAAAAAEk/yxt3RlppQZM/s144/friends.png" /&gt; &lt;/td&gt;        &lt;td valign="top"&gt;friends&lt;/td&gt;        &lt;td valign="top"&gt;Friends as a monolithic group&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;&lt;img src="http://lh4.ggpht.com/goldobine/SAyUq-J8LvI/AAAAAAAAAE0/X-pJX_AkxbM/s144/xfn-colleague.png" /&gt;&lt;/td&gt;        &lt;td valign="top"&gt;colleague, co-worker&lt;/td&gt;        &lt;td valign="top"&gt;Colleague who you have no idea about&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;&lt;img src="http://lh5.ggpht.com/goldobine/SAyUrOJ8LwI/AAAAAAAAAE8/lxFY01civZc/s144/xfn-colleague-met.png" /&gt; &lt;/td&gt;        &lt;td valign="top"&gt;colleague-met&lt;/td&gt;        &lt;td valign="top"&gt;Colleague who you met (hurray!)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;&lt;img src="http://lh5.ggpht.com/goldobine/SAyUrOJ8LxI/AAAAAAAAAFE/yza60TwnMmY/s144/xfn-friend.png" /&gt; &lt;/td&gt;        &lt;td valign="top"&gt;friend&lt;/td&gt;        &lt;td valign="top"&gt;Friend (colleague in T-shirt)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;&lt;img src="http://lh6.ggpht.com/goldobine/SAyUxeJ8LyI/AAAAAAAAAFM/uJlDW7Cww_0/s144/xfn-friend-met.png" /&gt; &lt;/td&gt;        &lt;td valign="top"&gt;friend-met&lt;/td&gt;        &lt;td valign="top"&gt;Friend who you met&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;&lt;img src="http://lh6.ggpht.com/goldobine/SAyUxeJ8LzI/AAAAAAAAAFU/DIAt3cc31oA/s144/xfn-guru.png" /&gt; &lt;/td&gt;        &lt;td valign="top"&gt;guru&lt;/td&gt;        &lt;td rowspan="2" valign="top"&gt;Perfect way to annoy people by marking them as &lt;span style="font-style: italic;"&gt;minor geek celebrities&lt;/span&gt; (© &lt;a class="xfnRelationship" rel="guru" style="position: relative;" href="http://www.martinfowler.com/" target="_blank"&gt;Martin Fowler&lt;/a&gt;) and to point out humbly that you met The guy&lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;&lt;img src="http://lh6.ggpht.com/goldobine/SAyUxeJ8L0I/AAAAAAAAAFc/r-xx4hRXRQs/s144/xfn-guru-met.png" /&gt; &lt;/td&gt;        &lt;td valign="top"&gt;guru-met&lt;/td&gt;  &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;&lt;img src="http://lh5.ggpht.com/goldobine/SAyU2OJ8L4I/AAAAAAAAAF8/D-zqe1Xn20s/s144/xfn-spouse.png" /&gt; &lt;/td&gt;        &lt;td valign="top"&gt;spouse&lt;/td&gt;        &lt;td valign="top"&gt;Spouse (that's right - handcuffs :)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;&lt;img src="http://lh6.ggpht.com/goldobine/SAyU2eJ8L5I/AAAAAAAAAGE/MwV6exQ53uw/s144/xfn-sweetheart.png" /&gt; &lt;/td&gt;        &lt;td valign="top"&gt;sweetheart&lt;/td&gt;        &lt;td valign="top"&gt;If you use "spouse" tag, I would avoid publishing this one&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;&lt;img src="http://lh6.ggpht.com/goldobine/SAyU2eJ8L6I/AAAAAAAAAGM/4IDakFoRzTE/s144/xfn-sweetheart-met.png" /&gt; &lt;/td&gt;        &lt;td valign="top"&gt;sweetheart-met&lt;/td&gt;        &lt;td valign="top"&gt;Aggravating circumstance&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;&lt;img src="http://lh6.ggpht.com/goldobine/SAyUxeJ8L2I/AAAAAAAAAFs/7OO1kU5ilMI/s144/xfn-parent.png" /&gt; &lt;/td&gt;        &lt;td valign="top"&gt;child&lt;/td&gt;        &lt;td valign="top"&gt;Surprisingly there is no picture for a child-met tag&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;&lt;img src="http://lh4.ggpht.com/goldobine/SAyUq-J8LuI/AAAAAAAAAEs/NkRnAxThhMo/s144/xfn-child.png" /&gt;&lt;/td&gt;        &lt;td valign="top"&gt;parent&lt;/td&gt;        &lt;td valign="top"&gt;I guess when Friendorati will unfold, families will use these tags to find their own&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top"&gt;&lt;img src="http://lh5.ggpht.com/goldobine/SAyU2OJ8L3I/AAAAAAAAAF0/l9jdMqWO6y0/s144/xfn-small.png" /&gt; &lt;/td&gt;        &lt;td valign="top"&gt;XFN&lt;/td&gt;        &lt;td valign="top"&gt;This blog is XFN-compliant&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-1076871608104421059?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/1076871608104421059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=1076871608104421059' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1076871608104421059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1076871608104421059'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/04/adding-xhtml-friends-network-tags-to.html' title='Adding XHTML Friends Network tags to your site'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/goldobine/SAyUq-J8LtI/AAAAAAAAAEk/yxt3RlppQZM/s72-c/friends.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-5351066575615466770</id><published>2008-04-20T21:21:00.004-05:00</published><updated>2008-04-20T21:27:27.562-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='weird stuff'/><title type='text'>They're watching us...</title><content type='html'>&lt;p&gt;There is some kind of weird genetic conspiracy present, I swear. I have those small, really small black flies in my office (fruit flies?), completely harmless non-disgusting (you can't really see more than a flying dot) things. My daughter always lives apple bits and grape brushes so they can survive. I practice catching them in the air and got already pretty good at this - I need just 1.25 strikes in average. &lt;/p&gt;  &lt;p&gt;What weird about all this (except the fact that I am blogging about it) is there is &lt;span style="color: rgb(255,0,0)"&gt;always &lt;/span&gt;just one fly in the air. Like there is some kind of kamikaze airfield and squadrons are waiting on the runway to take off one at the time when the comrade has fallen. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Always. &lt;font size="3"&gt;Just one.&lt;/font&gt; &lt;font size="4"&gt;Immediately replaced by another.&lt;/font&gt; &lt;font size="5"&gt;I am sure I killed it.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;And The Voice told me that it has noticed it too... &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-5351066575615466770?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/5351066575615466770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=5351066575615466770' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/5351066575615466770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/5351066575615466770'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/04/they-watching-us.html' title='They&amp;#39;re watching us...'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-4936650312208258274</id><published>2008-04-19T14:27:00.004-05:00</published><updated>2008-04-19T14:57:04.845-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Make it happen, stop the waste</title><content type='html'>&lt;p&gt;One of the most important mantras of the &amp;quot;&lt;a href="http://www.agileadvice.com/archives/2005/08/justintime_valu.html" target="_blank"&gt;Waste elimination&lt;/a&gt;&amp;quot;: &lt;strong&gt;Make it work, Make it right, Make it fast&lt;/strong&gt;. Following the word of Agile Development and Good Practices I couldn't help but notice that developers, freshly &amp;quot;awaken&amp;quot; to The Truth, have trouble to follow these three Commandments in the right order - including me.&amp;#160; &lt;br /&gt;&lt;a href="http://farm3.static.flickr.com/2061/2405992695_f3b69070f6.jpg?v=0" target="_blank"&gt;&lt;img style="margin: 0px 15px 5px 0px" height="127" title="Tony Soprano - Ultimate Agile Management" src="http://farm3.static.flickr.com/2061/2405992695_f3b69070f6.jpg?v=0" width="300" align="left" /&gt;&lt;/a&gt;The &amp;quot;work&amp;quot; and &amp;quot;right&amp;quot; balance is confusing. When you just got all the power of unit testing in your hands it is very easy to be carried away from &amp;quot;just enough&amp;quot; approach. I am not talking about &amp;quot;just-in-case&amp;quot; features here - only about over-polishing. People get stuck perfecting their code while the resulting package is stalled or kept unstable and managers couldn't resist but blame the Agile for an increased development time.&lt;/p&gt;  &lt;p&gt;Keeping &amp;quot;make it fast&amp;quot; the very last makes sense - until you will have had some statistics from a live application you very likely will waste time, fixing wrong parts which do not affect performance and potentially even missing a real performance hole. Developers can be are smart and experienced enough to anticipate and predict clogs but nevertheless it is a good idea to merely keep an eye on possible bottlenecks and put a minimal efforts eliminating them just for now.&lt;/p&gt; Oh, and you can reduce the time waste even outside the office - &lt;a href="http://www.waitless.org/" target="_blank"&gt;fast-forward through the boring parts of life&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-4936650312208258274?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/4936650312208258274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=4936650312208258274' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4936650312208258274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/4936650312208258274'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/04/make-it-happen-stop-waste.html' title='Make it happen, stop the waste'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-50290113271213162.post-1251059589298049372</id><published>2008-04-17T22:38:00.006-05:00</published><updated>2008-04-18T14:33:09.891-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>ASP.NET Dynamic Data</title><content type='html'>&lt;p&gt;It's all over the place and I won't even bother to link &lt;a href="http://code.msdn.microsoft.com/dynamicdata" target="_blank"&gt;it&lt;/a&gt;. I only hope that after &lt;a href="http://www.hanselman.com/blog/" target="_blank"&gt;Scott Hanselman&lt;/a&gt; and &lt;a href="http://weblogs.asp.net/scottgu/default.aspx" target="_blank"&gt;Scott Guthrie&lt;/a&gt; will pass the architecture to a &lt;strike&gt;drone floor&lt;/strike&gt; production line, it won't be handled to the same summer interns who &lt;strike&gt;screwed up&lt;/strike&gt; built the VS 2005 SqlDataSource wizard ;).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;br/&gt;also check &lt;a href="http://feeds.feedburner.com/LazyLoading?format=xml"&gt;Feed Burner&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/50290113271213162-1251059589298049372?l=lazyloading.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lazyloading.blogspot.com/feeds/1251059589298049372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=50290113271213162&amp;postID=1251059589298049372' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1251059589298049372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/50290113271213162/posts/default/1251059589298049372'/><link rel='alternate' type='text/html' href='http://lazyloading.blogspot.com/2008/04/aspnet-dynamic-data.html' title='ASP.NET Dynamic Data'/><author><name>Michael Goldobin</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
