<?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-33518972</id><updated>2012-01-04T01:31:57.096+11:00</updated><category term='Windows Cmd'/><category term='Development Practices'/><category term='LINQ'/><category term='Visual Studio'/><category term='PowerShell'/><category term='Architecture'/><category term='SQL'/><category term='WCF'/><category term='Data Binding'/><category term='AJAX'/><category term='Windows'/><category term='Management'/><category term='MSBuild'/><category term='IIS'/><category term='ASP.NET'/><category term='.NET'/><category term='Testing'/><title type='text'>MicrosoftMiles</title><subtitle type='html'>Microsoft Musings and Software Development Discussions</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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>41</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-33518972.post-4097733467662721301</id><published>2008-10-31T08:38:00.005+11:00</published><updated>2008-10-31T08:44:33.165+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><title type='text'>Testing Definitions</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;After a recent project meeting, I realised that the participants had differing interpretations of what is involved in each phase of testing. I compiled the definitions below to ensure the team are aligned.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;A &lt;strong&gt;Unit Test&lt;/strong&gt; is a test that ensures that a single class or routine does what it is meant to without needing to cross class or system boundaries in order to execute. This can be represented using the ACID acronym:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;A&lt;/strong&gt;tomic&lt;br /&gt;&lt;strong&gt;C&lt;/strong&gt;onsistent&lt;br /&gt;&lt;strong&gt;I&lt;/strong&gt;solated&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;D&lt;/strong&gt;urable&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;A test that verifies multiple pieces of functionality is not atomic.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;A test that changes results based on external factors (such as user interaction) is not consistent.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;A test that accesses a database, file system or interacts with other classes is not isolated. Neither are tests that need to be run in a specific order.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;A test that fails when specific data isn't available or breaks when other classes in the application change (not including the class under test) is not durable.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Integration Testing&lt;/strong&gt; is the combined execution of two or more classes or components. Integration testing can start as soon as there are two classes to test and should continue until the entire system is complete.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Regression Testing&lt;/strong&gt; is the repetition of previously executed test cases for the purpose of finding defects that previously passed the same set of tests.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;System Testing&lt;/strong&gt; is the execution of the software in its final configuration, including integration with other software and hardware systems. It tests for security, performance, resource loss, timing problems, and other issues that can't be tested at lower levels of integration.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Acceptance Testing&lt;/strong&gt; is confirmation by a key user, through trial or review, that the software meets mutually agreed-upon requirements. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Load Testing&lt;/strong&gt; is the execution of the software with varying levels of throughput to determine at what point the response time degrades or fails.&lt;br /&gt;Recovery testing is the process of testing how well a system can be recovered following a hardware failure or other catastrophic problem.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-4097733467662721301?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/4097733467662721301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=4097733467662721301&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/4097733467662721301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/4097733467662721301'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2008/10/testing-definitions.html' title='Testing Definitions'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-4754143396072416262</id><published>2008-07-06T17:11:00.010+10:00</published><updated>2008-07-06T17:54:19.958+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Update Default Visual Studio 2008 Project Templates</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;To update existing Visual Studio project templates, follow the manual instructions &lt;a href="http://msdn.microsoft.com/en-us/library/ms185319(VS.80).aspx"&gt;here&lt;/a&gt;. Should you wish to change the default templates, they can be found at:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\ProjectTemplates&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;I wanted to set &lt;strong&gt;TreatWarningsAsErrors &lt;/strong&gt;to true by default for all class library projects. First precaution, I took a backup copy of the original zip file prior to unzipping the files. &lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Next step, the line below was added to the &lt;/span&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;to the debug and release &lt;strong&gt;PropertyGroup&lt;/strong&gt; sections of the extracted csproj file.&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;span style="color:#000099;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;treatwarningsaserrors&lt;/span&gt;&lt;span style="color:#000099;"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color:#000099;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;treatwarningsaserrors&lt;/span&gt;&lt;span style="color:#000099;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div align="left"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Then, I recompressed all the extracted files and copied the zip back to the &lt;strong&gt;ProjectTemplates&lt;/strong&gt; directory, overwriting the original zip.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Finally, it is necessary to regenerate the templates as Visual Studio seems to load them from:&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\ProjectTemplatesCache&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;To regenerate the default templates, run &lt;strong&gt;devenv.exe /installvstemplates&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt; from a Visual Studio command prompt.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-4754143396072416262?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/4754143396072416262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=4754143396072416262&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/4754143396072416262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/4754143396072416262'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2008/07/update-default-visual-studio-2008.html' title='Update Default Visual Studio 2008 Project Templates'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-8277990201517929563</id><published>2008-02-24T10:53:00.001+11:00</published><updated>2008-02-29T20:27:11.837+11:00</updated><title type='text'>Disable Shutdown Event Tracker</title><content type='html'>&lt;p&gt;I have recently read a couple of blog posts that promote using &lt;a href="http://weblogs.asp.net/israelio/archive/2008/02/21/windows-server-2008-as-workstation.aspx"&gt;Windows Server 2008 as a Workstation&lt;/a&gt;.&amp;#160; To avoid potential integration issues, I always think it's a good idea to build applications on an environment that mirrors test and production as closely as possible.&amp;#160; So when developing applications with differing deployment targets, for instance, IIS, BizTalk or even the Compact Framework, it's important to have different virtual Windows Server 2003 development images available.&amp;#160; There are other benefits to this approach which I'll list in a future post.&lt;/p&gt;  &lt;p&gt;However, one annoyance with using multiple development environments is the shutdown event tracker which forces you to enter a reason for each system shutdown or restart.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.google.com/milesashton/R8fOo8kgJKI/AAAAAAAAACc/Ykw53Pg_XYY/Shutdown%20Comments%5B2%5D"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="484" alt="Shutdown Comments" src="http://lh6.google.com/milesashton/R8fOpskgJLI/AAAAAAAAACg/MJvd3-ZiugU/Shutdown%20Comments_thumb%5B2%5D" width="406" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;To turn off the Shutdown Event Tracker in Windows Server 2003 or 2008, follow the steps below:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Open the Microsoft Management Console&lt;/li&gt;    &lt;li&gt;Add the Group Policy snap-in &lt;/li&gt;    &lt;li&gt;Under Administrative Templates expand System &lt;/li&gt;    &lt;li&gt;Set Display Shutdown Event Tracer to Disabled&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://lh5.google.com/milesashton/R8fOrckgJMI/AAAAAAAAACk/yw9w-zKnG6E/DisableShutdownEventTracker%5B5%5D"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="346" alt="Disable Shutdown Event Tracker" src="http://lh4.google.com/milesashton/R8fOsMkgJNI/AAAAAAAAACo/3qHFelILoWY/DisableShutdownEventTracker_thumb%5B5%5D" width="484" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-8277990201517929563?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/8277990201517929563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=8277990201517929563&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/8277990201517929563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/8277990201517929563'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2008/02/disable-shutdown-event-tracker.html' title='Disable Shutdown Event Tracker'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-5973931221986165291</id><published>2008-01-15T21:21:00.000+11:00</published><updated>2008-01-22T21:37:55.887+11:00</updated><title type='text'>Software Construction Analogies</title><content type='html'>&lt;div&gt;&lt;font face="Tahoma"&gt;Software construction is often compared with building construction.&amp;#160; In fact, &lt;/font&gt;&lt;a href="http://blogs.construx.com/blogs/stevemcc/default.aspx"&gt;&lt;font face="Tahoma"&gt;Steve McConnell&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma"&gt; devotes a whole chapter to software metaphors in his seminal work, &lt;/font&gt;&lt;a href="http://cc2e.com/"&gt;&lt;font face="Tahoma"&gt;Code Complete 2&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma"&gt;.&amp;#160; &lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font face="Tahoma"&gt;&amp;#160;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font face="Tahoma"&gt;In recent times, I've taken note of some of the analogies used by colleagues and noticed one directly related to construction:&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font face="Tahoma"&gt;&amp;#160;&lt;/font&gt;&lt;/div&gt;  &lt;blockquote&gt;   &lt;div&gt;&lt;font face="Tahoma"&gt;If you only have a hammer, everything looks like a nail.&lt;/font&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;div&gt;&lt;font face="Tahoma"&gt;&amp;#160;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;a href="http://www.abraham-maslow.com/m_motivation/Maslows_Hammer.asp"&gt;&lt;font face="Tahoma"&gt;Maslow's Hammer&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma"&gt; has been stated and paraphrased many times over, especially in software development circles.&lt;/font&gt;&lt;/div&gt;  &lt;br /&gt;  &lt;blockquote&gt;   &lt;div&gt;&lt;font face="Tahoma"&gt;The concept is thus: individuals who are incomplete in their knowledge or training of solutions propose the same type of solution to every problem they encounter. They opt for the more familiar solution to one that may be more effective yet with which they are unskilled.&lt;/font&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;In closing, another colleague of mine recently used, perhaps invented, an analogy that provided a new take on the 'sledgehammer to crack a nut' idiom.&amp;#160; He considered the introduction of Windows SharePoint Services to solve a rudimentary Workflow problem to be the equivalent of 'using a cannon to kill a mosquito'.&amp;#160; Now who could possibly argue with that?&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-5973931221986165291?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/5973931221986165291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=5973931221986165291&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/5973931221986165291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/5973931221986165291'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2008/01/software-construction-analogies.html' title='Software Construction Analogies'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-978380877391142732</id><published>2008-01-09T20:43:00.001+11:00</published><updated>2008-01-09T20:44:38.163+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Management'/><title type='text'>The Quality Reduced Product</title><content type='html'>&lt;p&gt;&lt;font face="Tahoma"&gt;I revisited the concept of the &lt;em&gt;quality reduced product&lt;/em&gt; today when a product manager insisted that the software development team take a really low cost option.&amp;#160; I reminded the product manager that the typical steps in delivering a product in less time and for less money result in lower quality.&amp;#160; Whilst the product's end user willingly consented to this trade off, my warnings regarding the impact on the team were largely ignored.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;The heading of this post is taken from the seminal book for Software Managers, &lt;/font&gt;&lt;a href="http://www.amazon.com/Peopleware-Productive-Projects-Tom-DeMarco/dp/0932633439"&gt;&lt;font face="Tahoma"&gt;Peopleware: Productive Projects and Teams&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma"&gt;&lt;strong&gt;&amp;#160;&lt;/strong&gt;by Tom DeMarco and Timothy Lister.&lt;strong&gt;&amp;#160;&lt;/strong&gt; In the chapter &lt;em&gt;Teamicide &lt;/em&gt;they list the sure-fire ways to inhibit the formation of teams and disrupt project sociology.&amp;#160; Quality reduction of a product is one cause.&lt;/font&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Tahoma"&gt;... [quality] concessions are extremely painful to developers as their self-esteem and enjoyment are undermined by the necessity of building a product of clearly lower quality than they are capable of.&amp;#160; An early casualty of quality reduction is whatever team identification the group has been able to build.&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;This is also discussed in Rob's post &lt;/font&gt;&lt;a href="http://www.softwarebyrob.com/articles/Nine_Things_Developers_Want_More_Than_Money.aspx"&gt;&lt;font face="Tahoma"&gt;Nine Things Developers Want More Than Money&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma"&gt;, he reminds managers that being setup to succeed is key to developer motivation.&amp;#160; &lt;/font&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Tahoma"&gt;Developers want to build software that not only works, but is maintainable; something they can take pride in. This is not in-line with product development&amp;#8217;s goals, which are for developers to build software that works, and nothing more.&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Tahoma"&gt;The first thing to go when time is tight is quality and maintainability. Being forced to build crap is one of the worst things you can do to a craftsman. Delivering a project on-time but knowing it&amp;#8217;s a piece of crap feels a heck of a lot like failure to someone who takes pride in what they build.&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;font face="Tahoma"&gt;In conclusion, whilst the effects of quality reduction are intangible in the short term, the long term effect on a team's engagement and motivation can be catastrophic.&lt;/font&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-978380877391142732?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/978380877391142732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=978380877391142732&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/978380877391142732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/978380877391142732'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2008/01/quality-reduced-product.html' title='The Quality Reduced Product'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-5617610257703442762</id><published>2008-01-07T16:10:00.000+11:00</published><updated>2008-01-07T19:43:15.034+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><title type='text'>Stakeholders Defined</title><content type='html'>&lt;div&gt;&lt;font face="Tahoma"&gt;This post regarding stakeholders is again inspired by and contains excerpts from the book &lt;/font&gt;&lt;a href="http://www.amazon.com/Software-Systems-Architecture-Stakeholders-Perspectives/dp/0321112296/ref=cm_cr_pr_sims_t"&gt;&lt;font face="Tahoma"&gt;Software Systems Architecture: Working with Stakeholders using Viewpoints and Perspectives&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma"&gt;. &lt;/font&gt;&lt;/div&gt;  &lt;br /&gt;  &lt;blockquote&gt;   &lt;div&gt;&lt;font face="Tahoma"&gt;Software systems are not just used, they have to be built and tested, operated, repaired and of course paid for. Each of these activities involves a number of people, each with their own requirements and interests. The people are collectively referred to as stakeholders. Understanding the role of each stakeholder is fundamental to understanding the role of the architect in the development process.&lt;/font&gt;&lt;/div&gt; &lt;/blockquote&gt;  &lt;br /&gt;  &lt;div&gt;&lt;font face="Tahoma"&gt;The IEEE Standard 1471 on architecture description defines a &lt;strong&gt;stakeholder&lt;/strong&gt; as a person, group, or entity with an interest of concern about the realization of a system's architecture. &lt;/font&gt;&lt;/div&gt;  &lt;br /&gt;  &lt;div&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&lt;font face="Tahoma"&gt;I personally have a checklist I like to run through when a new project involving my development team is initiated. I like to make sure that all the necessary teams, such as support or infrastructure, are correctly engaged prior to implementation. From the perspective of a software architect, Nick Rozanski and Eoin Woods succinctly classify these stakeholders according to their roles and concerns as below.&lt;/font&gt;&lt;/div&gt;  &lt;div&gt;&amp;#160;&lt;/div&gt;  &lt;div&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/div&gt;  &lt;table cellspacing="0" cellpadding="2" width="400" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="117"&gt;&lt;strong&gt;&lt;font face="Tahoma"&gt;Stakeholder&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="277"&gt;&lt;strong&gt;&lt;font face="Tahoma"&gt;Role&lt;/font&gt;&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="117"&gt;&lt;font face="Tahoma"&gt;Acquirers &lt;/font&gt;&lt;/td&gt;        &lt;td valign="top" width="277"&gt;&lt;font face="Tahoma"&gt;Oversee the procurement of the system or product. In my experience, these stakeholders are often referred to as 'the business' and are usually the most important stakeholders, providing or authorizing funding. Their goals are usually value for money and efficient expenditure of resources during delivery and operation.&lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="117"&gt;&lt;font face="Tahoma"&gt;Assessors &lt;/font&gt;&lt;/td&gt;        &lt;td valign="top" width="277"&gt;&lt;font face="Tahoma"&gt;Oversee the system's conformance to standards and legal regulation.&lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="117"&gt;&lt;font face="Tahoma"&gt;Communicators &lt;/font&gt;&lt;/td&gt;        &lt;td valign="top" width="277"&gt;&lt;font face="Tahoma"&gt;Explain the system to other stakeholders via documentation and training materials. Analysts communicate the requirements to the developers whilst technical authors create manuals for the users and administrators.&lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="117"&gt;&lt;font face="Tahoma"&gt;Developers &lt;/font&gt;&lt;/td&gt;        &lt;td valign="top" width="277"&gt;&lt;font face="Tahoma"&gt;Construct and deploy the system from specifications or lead the teams that do this.&lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="117"&gt;&lt;font face="Tahoma"&gt;Maintainers &lt;/font&gt;&lt;/td&gt;        &lt;td valign="top" width="277"&gt;&lt;font face="Tahoma"&gt;Manage the evolution of the system once it is operational Their main concerns focus on documentation, instrumentation or change control. In my experience this is often the responsibility of the development team. &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="117"&gt;&lt;font face="Tahoma"&gt;Suppliers&lt;/font&gt;&lt;/td&gt;        &lt;td valign="top" width="277"&gt;&lt;font face="Tahoma"&gt;Build and supply the hardware and infrastructure on which the system will run.&lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="117"&gt;&lt;font face="Tahoma"&gt;Support &lt;/font&gt;&lt;/td&gt;        &lt;td valign="top" width="277"&gt;&lt;font face="Tahoma"&gt;Provide support to users for the product or system when it is running.&lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="117"&gt;&lt;font face="Tahoma"&gt;System Administrators&lt;/font&gt;&lt;/td&gt;        &lt;td valign="top" width="277"&gt;&lt;font face="Tahoma"&gt;Run the system once it is deployed. They focus on concerns such as monitoring, business continuity and disaster recovery and scalability.&lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="117"&gt;&lt;font face="Tahoma"&gt;Testers&lt;/font&gt;&lt;/td&gt;        &lt;td valign="top" width="277"&gt;&lt;font face="Tahoma"&gt;&lt;em&gt;Test the system to ensure that is suitable for use. &lt;/em&gt;Testers act as the conscience of the development team, systematically testing the system in order to establish whether it it is suitable for deployment and use. Unlike developers, testers do not have a sense of ownership of the implementation and with their specialist knowledge and experience means they can perform a more thorough and objective job of evaluating the system than other stakeholders. &lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="117"&gt;&lt;font face="Tahoma"&gt;Users &lt;/font&gt;&lt;/td&gt;        &lt;td valign="top" width="277"&gt;&lt;font face="Tahoma"&gt;Define the system's functionality and ultimately make use of it.&lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;br /&gt;  &lt;div&gt;&lt;font face="Tahoma"&gt;Most development projects should include representatives from most if not all of these stakeholder groups though their importance varies from project to project. I totally agree with authors when they state that not considering a view from each class of stakeholder will lead to problems in the future. &lt;/font&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-5617610257703442762?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/5617610257703442762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=5617610257703442762&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/5617610257703442762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/5617610257703442762'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2008/01/stakeholders-defined.html' title='Stakeholders Defined'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-5890556709438259697</id><published>2008-01-04T17:02:00.000+11:00</published><updated>2008-01-05T10:42:19.910+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><title type='text'>Software Architecture Concepts</title><content type='html'>&lt;p&gt;&lt;span style="font-family: verdana"&gt;&lt;font face="Tahoma"&gt;I'm currently reading &lt;/font&gt;&lt;a href="http://www.amazon.com/Software-Systems-Architecture-Stakeholders-Perspectives/dp/0321112296/ref=cm_cr_pr_sims_t"&gt;&lt;font face="Tahoma"&gt;Software Systems Architecture: Working with Stakeholders using Viewpoints and Perspectives&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma"&gt;. I already think this is a book I should have read years ago! In chapter 2, the authors, Nick &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Rozanski&lt;/span&gt;&lt;/span&gt; and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Eoin&lt;/span&gt;&lt;/span&gt; Woods break down the widely accepted definition of software &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;architecture&lt;/span&gt; by the &lt;/font&gt;&lt;a href="http://www.sei.cmu.edu/architecture/"&gt;&lt;font face="Tahoma"&gt;Software Engineering Institute&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma"&gt; (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;SEI&lt;/span&gt;&lt;/span&gt;) at Carnegie-Mellon University in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Pittsburg&lt;/span&gt;&lt;/span&gt;: &lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: verdana"&gt;&lt;/span&gt;    &lt;blockquote&gt;&lt;span style="font-family: verdana"&gt;&lt;font face="Tahoma"&gt;The &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_5"&gt;architecture&lt;/span&gt; of a software &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_6"&gt;intensive&lt;/span&gt; system is the          &lt;br /&gt;structure or structures of the system, which compromise software elements, the externally visible properties of those elements, and the the relationships          &lt;br /&gt;amongst them.&lt;/font&gt;&lt;/span&gt;&lt;/blockquote&gt; &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;span style="font-family: verdana"&gt;&lt;font face="Tahoma"&gt;I have seen this &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;definition&lt;/span&gt; quoted many times but rarely examined in closer detail. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Rozanski&lt;/span&gt;&lt;/span&gt; and Woods do however analyse &lt;em&gt;structures&lt;/em&gt; and &lt;em&gt;externally visible properties&lt;/em&gt;.        &lt;br /&gt;        &lt;br /&gt;They state that there are two types of system structure, static and dynamic. &lt;strong&gt;Static structures&lt;/strong&gt; of a software system define its internal design-time elements and their &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_8"&gt;arrangement&lt;/span&gt; whilst &lt;strong&gt;dynamic structures&lt;/strong&gt; of software system define it's &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;runtime&lt;/span&gt;&lt;/span&gt; elements and their interactions.        &lt;br /&gt;        &lt;br /&gt;&lt;strong&gt;Externally visible properties &lt;/strong&gt;also manifest themselves in two ways, the externally visible behavior (what the system does) and quality properties (how the system does it). The &lt;strong&gt;externally &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_10"&gt;visible&lt;/span&gt; behavior&lt;/strong&gt; of a software system defines the functional interactions between the system and it's environment. A &lt;strong&gt;quality property&lt;/strong&gt; is a nonfunctional property of a system such as performance, security, or scalability. These are commonly referred to as the &lt;em&gt;&amp;quot;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;&lt;a href="http://en.wikipedia.org/wiki/Ilities"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;ilities&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&amp;quot;&lt;/em&gt;.        &lt;br /&gt;        &lt;br /&gt;So the key take away is that it's the role of the architect to derive the static and dynamic structures for each candidate architecture and understand the extent to which they exhibit the required &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_12"&gt;behaviors&lt;/span&gt; and quality properties.&lt;/font&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family: verdana"&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-5890556709438259697?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/5890556709438259697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=5890556709438259697&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/5890556709438259697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/5890556709438259697'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2008/01/software-architecture-concepts.html' title='Software Architecture Concepts'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-6069949675106530481</id><published>2007-12-29T20:32:00.001+11:00</published><updated>2007-12-29T20:38:28.849+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><title type='text'>Leadership Qualities</title><content type='html'>&lt;p&gt;This excellent list of leadership qualities is taken from the &lt;a href="http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?culture=en-CA&amp;amp;EventID=1032338972&amp;amp;CountryCode=CA"&gt;'Aspiring Architects'&lt;/a&gt; webcast series by &lt;a href="http://blogs.msdn.com/mohammadakif/default.aspx"&gt;Mohammad Akif&lt;/a&gt;.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Ask thought-provoking questions that result in actionable technological patterns or solutions&lt;/li&gt;    &lt;li&gt;Actively mentor others&lt;/li&gt;    &lt;li&gt;Provide thought leadership by enabling others to see things from a different of better &lt;strong&gt;perspective&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;Influence decision makers&lt;/li&gt;    &lt;li&gt;Champion structure, process, best practices and standards&lt;/li&gt;    &lt;li&gt;Promote the capture and reuse of intellectual property&lt;/li&gt;    &lt;li&gt;Effectively build individual partnerships and organizational networks&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The valuable qualities below were also mentioned during the series.&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Practice &lt;strong&gt;diplomacy&lt;/strong&gt;, negotiating and compromising&lt;/li&gt;    &lt;li&gt;Manage and clarify expectations&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-6069949675106530481?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/6069949675106530481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=6069949675106530481&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/6069949675106530481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/6069949675106530481'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2007/12/leadership-qualities.html' title='Leadership Qualities'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-6332194071926775762</id><published>2007-12-28T20:05:00.001+11:00</published><updated>2007-12-28T20:07:41.040+11:00</updated><title type='text'>The Winchester Mystery House</title><content type='html'>&lt;p&gt;I've recently been investigating architecture, more specifically SOA and came across an &lt;a href="http://msdn2.microsoft.com/en-gb/arcjournal/default.aspx"&gt;Architecture Journal&lt;/a&gt; book entitled &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=cb2a8e49-bb3b-49b6-b296-a2dfbbe042d8&amp;amp;displaylang=en"&gt;SOA in the Real World&lt;/a&gt;.&amp;#160; I'm unsure of the author but &lt;a href="http://msdn2.microsoft.com/en-us/architecture/bb833022.aspx"&gt;Chapter 1&lt;/a&gt; is certainly an entertaining and informative read.&amp;#160; I was fascinated by the reference to the &lt;a href="http://en.wikipedia.org/wiki/Winchester_Mystery_House"&gt;Winchester Mystery House&lt;/a&gt; and it's history formed the basis of a New Years message for my team. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;The Winchester Mystery House is an intriguing tourist attraction in the USA near San Jose, CA. The Winchester Mystery House was the home to the heiress of the Winchester fortune (amassed from the sales of Winchester rifles). According to the legend, the heiress went to see a fortune teller and learned she was cursed to be haunted by the spirits of everyone ever killed by a Winchester rifle. The only way to avoid the curse was to build a mansion &amp;#8211; as long as she kept building the spirits would leave her alone. She promptly hired 147 builders (and 0 architects), all of whom began working on the mansion simultaneously. The builders worked on the mansion until the heiress passed away, 38 years later. The result of their efforts is a classic example of implementation without architecture: &lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;The mansion contains 160 rooms, 40 bedrooms, 6 kitchens, 2 basements and 950 doors&lt;/li&gt;      &lt;li&gt;Of the 950 doors, 65 of them open to blank walls; 13 staircases were built and abandoned; and 24 skylights were installed into various floors.&lt;/li&gt;      &lt;li&gt;No architectural blueprint for the mansion was ever created.&lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;Confusing architecture with implementation generates chaotic and unpredictable results &amp;#8211; much like the Winchester Mystery House. &lt;/p&gt;    &lt;p align="center"&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/en/5/5f/Door_to_Nowhere_Winchester_House_6-5-06.jpg" /&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Let's try not make the same mistake with software construction in 2008 ;)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-6332194071926775762?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/6332194071926775762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=6332194071926775762&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/6332194071926775762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/6332194071926775762'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2007/12/winchester-mystery-house.html' title='The Winchester Mystery House'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-8467307948506067488</id><published>2007-12-22T16:10:00.000+11:00</published><updated>2007-12-23T11:58:36.017+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><title type='text'>Favourite Archipedia Entries</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Another Useless Acronym (AUA)&lt;/strong&gt;&lt;br /&gt;Another Useless Acronym (AUA) or what can happen when partially formed new architectural ideas emerge.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Automagically&lt;/strong&gt;&lt;br /&gt;When something has the capability to perform an indispensable task that no one thought was even possible.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Bottom Up Design&lt;/strong&gt;&lt;br /&gt;Bottom up design, as with its counterpart Top down design, are strategies of information processing.&lt;br /&gt;In the Bottom up design approach, individual parts of a system are designed in detail and the design parts are then linked together to form larger components, which are then in turn linked until a complete system is formed. Often the bottom up approach assumes that all facts are known up front as the detailed parts are designed.&lt;br /&gt;&lt;br /&gt;In the Top down design approach to modeling an overview of the system is made, without going into detail and each part of the system is then refined by designing it in more detail. Each new part may then can be refined again until the entire specification is detailed enough. Often the top down approach is used when not all facts or constraints are known about a design.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Choreography&lt;/strong&gt;&lt;br /&gt;Formally a choreography can be defined as a declaration of the activities within collaboration and the sequencing rules and dependencies between these activities.&lt;br /&gt;&lt;br /&gt;Often these days, when people talk about the architecture of business services there are 2 related concepts which often come up - choreography and orchestration.&lt;br /&gt;&lt;br /&gt;The difference between the two is easy to remember depending on your design perspective. Seen from a publicly observable view of a service, choreography is the description of how to interact with the service to consume its functionality. Seen from the same publicly observable viewpoint, orchestration is how service functionality is achieved ("within" a service) by aggregating some service logic and very possibly other Web services.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Cycles&lt;/strong&gt;&lt;br /&gt;Time, resource and effort that ought not to be wasted. "Let's not waste any cycles on something that doesn't matter."&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;A portion of one's capacity to perform work. "Do you have any cycles to burn on the ...". &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Drinking from the Fire Hose&lt;/strong&gt;&lt;br /&gt;Having an overwhelming amount of information thrown at you, commonly at the start of a new job or project.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ivory Tower Architecture&lt;/strong&gt;&lt;br /&gt;An architecture developed in isolation from the developers, or teams of developers, responsible for following it.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;KISS&lt;/strong&gt;&lt;br /&gt;Keep It Simple Stupid is a design philosophy that states simplicity lasts and simplicty is needed to properly convey any ideas. Simplicity is the absence of unnecessary elements. Simplicity isn't a design style, but a perspective on design and an approach which often creates the most usable and beautiful results. &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;a name="Low Hanging Fruit"&gt;&lt;strong&gt;Low Hanging Fruit&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;Management expression for the most available and easy to accomplish objectives.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;a name="Operational Requirements"&gt;&lt;strong&gt;Operational Requirements&lt;/strong&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;A category of requirements that describe the operational expectations for a system, such as availability, security, performance, scalability, manageability, interoperability, and reliability.&lt;br /&gt;&lt;br /&gt;These requirements are distinct from the functional requirements that detail the business functions that the system performs (e.g., calculating the total bill for a shopping basket).&lt;br /&gt;&lt;br /&gt;Also called "non-functional requirements"; also called "non-behavioral requirements". Closely related to the concepts "aspects" and "qualities".&lt;br /&gt;&lt;br /&gt;&lt;a name="Portfolio Management"&gt;&lt;strong&gt;Portfolio Management&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;Portfolio management is a function of IT Governance (which makes it fair game for enterprise architecture). The portfolios in question typically include both the application portfolio and the service portfolio. The focuses of portfolio management typically include: &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;Redundancy analysis -- avoiding having (and paying for and maintaining) multiple artifacts that perform essentially the same function; &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;Gap analysis -- identifying opportunities to improve processes through better automation;&lt;br /&gt;Manageability -- standardization of management interfaces, including vendor selection based on adherence to standard metaphors for management; &lt;/li&gt;&lt;li&gt;Cost rationalization -- analysis of the true ROI of automation and elimination of non-cost-effective systems;&lt;/li&gt;&lt;li&gt;Server consolidation -- reduction of the number of systems being supported, often by standardizing to a small set of server operating systems.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;&lt;a name="Project Stakeholder"&gt;&lt;strong&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Project Stakeholder&lt;/span&gt;&lt;/strong&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;br /&gt;Project stakeholders are any of the interested parties in a given development project. Typical examples of stakeholders include:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Business process owner -- the person responsible for the profit-and-loss of the business process being supported;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;End user -- the people who will actually use the system under development;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Operations -- the people with the pagers whose sleep is at risk;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Executive sponsor -- &lt;strong&gt;the person who can light a fire under non-responsive stakeholders&lt;/strong&gt;; &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;As well as architect, project management, developers, and testers, naturally.&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;&lt;a name="Quality"&gt;&lt;strong&gt;Quality&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;The term "quality" is used in two distinct ways in systems architecture. The first usage is to define a class of common properties that must be addressd by any system. These "qualities" include:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;Security &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;Manageability &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;Availability &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;Reliability &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;Scalability &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;These system qualities may be cross-cutting concerns for the system, and hence may be best addressed using some form of aspect-oriented programming.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;The second usage is closer to the typical English-language usage: how well the system meets the requirements that were defined for it. For a more complete look at this meaning, please see quality management.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="Rat Holing"&gt;&lt;strong&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Rat Holing&lt;/span&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;A slang term for a discussion that spirals away from the topic of the meeting.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="Return on Investment"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;strong&gt;Return on Investment (ROI)&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;A calculation of the economic value being derived from a system as compared to its costs.&lt;br /&gt;When embarking on a new initiative, it is common to predict an ROI for the system under consideration. This calculation needs to look at both development and ongoing operational costs for the system. The calculation is used as a justification for moving ahead with the project.&lt;br /&gt;Once a system is in operation, ROI calculations ignore the "sunk costs" of development, and only compares the value being realized with the ongoing costs (which are more fully understood once the system is in operation than it was when the project was being envisioned). This calculation may, however, consider depreciation of assets that support the system, such as computers and storage devices.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="Taxonomy"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;strong&gt;Taxonomy&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;A taxonomy is a system of classification and with context, such as enterprise or folks or something else, a taxonomy is a description of the context.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;&lt;a name="Time-to-Value"&gt;&lt;strong&gt;Time-to-Value&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;Time-to-value is the elapsed time between the commitment to a project and the perceived realization of value from the investment. Project planners who stress short time-to-value seek to maintain excitement and emotional engagement around the project. Long lags between project inception and perceived first value can cause business process owners to disengage from and deprioritize the project.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;&lt;a name="Waterfall"&gt;&lt;strong&gt;Waterfall&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;Waterfall processes proceed through a unidirectional sequence of discreet steps.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;The term is principally applied to a software development methodology that promotes a sequence along theses lines:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;Conceptualization -- business process owners identify a business need and develop a conceptual model for a solution; &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;Requirements definition -- solutions architects work with business process owners to produce a detailed functional specification; &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;Project definition -- the functional specification is used to generate a set of work items for development; &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;Development -- Developers and test engineers produce and validate a set of deliverables in accordance with the project plan; &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;Acceptance testing -- the resulting system is tested for compliance with the functional requirements; &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;Deployment -- the system is put into production. &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;Critics of waterfall methodologies question how effectively the requirements for a software system can be understood "up front". They promote more agile approaches to software development.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-8467307948506067488?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn2.microsoft.com/en-us/skyscrapr/aa699395.aspx' title='Favourite Archipedia Entries'/><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/8467307948506067488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=8467307948506067488&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/8467307948506067488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/8467307948506067488'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2007/12/favourite-archipedia-entries.html' title='Favourite Archipedia Entries'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-5361009202000378739</id><published>2007-12-22T16:05:00.000+11:00</published><updated>2007-12-22T16:29:52.857+11:00</updated><title type='text'>Don Ferguson Quotes</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;"There is no point in building the Emerald City without building the Yellow Brick Road; and you have to build the road first."&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;"Vision without execution is hallucination."&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-5361009202000378739?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn2.microsoft.com/en-us/arcjournal/bb491122.aspx' title='Don Ferguson Quotes'/><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/5361009202000378739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=5361009202000378739&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/5361009202000378739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/5361009202000378739'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2007/12/don-ferguson-ibm-fellow.html' title='Don Ferguson Quotes'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-8980728530711010903</id><published>2007-05-20T13:23:00.001+10:00</published><updated>2007-05-20T13:27:27.215+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Location of Configuration File</title><content type='html'>&lt;p&gt;&lt;font face="Tahoma" size="2"&gt;If you're unsure where your .NET application is looking for it's config file, check the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.appdomainsetup.configurationfile.aspx"&gt;AppDomainSetup.ConfigurationFile&lt;/a&gt; property.&lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;This property gets or sets the location and configuration filename for the running app domain.&lt;/font&gt; &lt;p&gt;&lt;font face="Courier New" size="2"&gt;AppDomain.CurrentDomain.SetupInformation.ConfigurationFile&lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;Pretty unnecessary when you're writing sensible software, but when your dealing with "Notes + Javascript + ActiveX + .NET" lunacy you might just need this.&lt;/font&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;Thanks to Stonie for the pre-written post ;)&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-8980728530711010903?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/8980728530711010903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=8980728530711010903&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/8980728530711010903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/8980728530711010903'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2007/05/location-of-configuration-file.html' title='Location of Configuration File'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-6505248366027595718</id><published>2007-05-11T19:51:00.001+10:00</published><updated>2007-05-11T19:54:10.701+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Utilise the Obsolete Attribute</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;Rather than just commenting out code that is deprecated, use the &lt;/font&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa664623(VS.71).aspx"&gt;&lt;font face="Tahoma" size="2"&gt;Obsolete Attribute&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt; to decorate types and members of types that are obsolete and will cause compiler warnings to be generated if that type or member is used. It’s a great way to make developers aware that a particular object is changing, and the functionality they are using will be&amp;nbsp;disappearing in a future release.&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-6505248366027595718?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/6505248366027595718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=6505248366027595718&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/6505248366027595718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/6505248366027595718'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2007/05/utilise-obsolete-attribute.html' title='Utilise the Obsolete Attribute'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-6562923703848816633</id><published>2007-05-02T20:11:00.001+10:00</published><updated>2007-05-02T20:15:17.241+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><title type='text'>List Running Web Applications</title><content type='html'>&lt;p&gt;&lt;font face="Courier New"&gt;IISAPP.VBS&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;You can use the command-line script iisapp.vbs, which is stored in &lt;i&gt;systemroot&lt;/i&gt;\system32, to view any worker processes that are currently running.&lt;/font&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-6562923703848816633?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://thesource.ofallevil.com/technet/prodtechnol/WindowsServer2003/Library/IIS/b8721f32-696b-4439-9140-7061933afa4b.mspx?mfr=true' title='List Running Web Applications'/><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/6562923703848816633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=6562923703848816633&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/6562923703848816633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/6562923703848816633'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2007/05/list-running-web-applications.html' title='List Running Web Applications'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-7356218459286958333</id><published>2007-04-17T20:07:00.002+10:00</published><updated>2008-05-02T20:20:58.139+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Cmd'/><title type='text'>Command Prompt AutoComplete</title><content type='html'>&lt;p&gt;&lt;span style="font-family:Tahoma;font-size:85%;"&gt;From a command prompt pressing tab will auto complete a file name or folder.  For example:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;C:\&amp;gt;cd win (TAB) &lt;em&gt;becomes cd windows&lt;/em&gt;&lt;br /&gt;C:\WINDOWS&amp;gt;cd sys (TAB) &lt;em&gt;becomes cd system32&lt;/em&gt;&lt;br /&gt;C:\WINDOWS\SYSTEM32&amp;gt;cmd (TAB) &lt;em&gt;becomes cmd.exe&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Tahoma;font-size:85%;"&gt;Continuing to press tab cycles through all other files matching the pattern.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-7356218459286958333?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/7356218459286958333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=7356218459286958333&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/7356218459286958333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/7356218459286958333'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2007/04/command-prompt-autocomplete.html' title='Command Prompt AutoComplete'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-599715365977814084</id><published>2007-04-17T19:48:00.001+10:00</published><updated>2007-04-17T19:53:10.300+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Long Running WebMethod</title><content type='html'>&lt;p&gt;&lt;span style="font-family:Tahoma;"&gt;By default when you call a Web service method, the HTTP connection is held open until the WebMethod returns its value to the caller. In certain circumstances, where you may need to call a long running WebMethod where there is no return value it is appropriate to start the method processing and immediately return to the caller in a style similar to a "fire-and-forget" process.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Tahoma;"&gt;By decorating the WebMethod with the attrbute &lt;i&gt;&lt;nobr&gt;[SoapDocumentMethod(OneWay=true)]&lt;/nobr&gt;&lt;/i&gt; , the server holds the HTTP connection open while it loads and parses the request message, but then returns immediately to the caller with an HTTP 202 response, indicating it has begun processing the request.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Tahoma;"&gt;The disadvantage of this technique is that the consumer does not get any idea whether the method completed successfully or there were errors. &lt;/span&gt;&lt;p&gt;&lt;span style="font-family:Tahoma;"&gt;Note: By default, SOAP messages are in "document" style of formatting. If you are using Remote Procedure Call (RPC) formatting then use [SoapRpcMethod(OneWay=true)] instead of [SoapDocumentMethod(OneWay=true)].&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-599715365977814084?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/599715365977814084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=599715365977814084&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/599715365977814084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/599715365977814084'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2007/04/long-running-webmethod.html' title='Long Running WebMethod'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-1977631193872948439</id><published>2007-02-03T13:24:00.000+11:00</published><updated>2007-02-03T16:41:44.588+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><title type='text'>Delete All Files Using Powershell</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;Where have I been for the last two months? Looking after my first son, Andre Ashton, born on 30th December 2006. I have however, been doing a phenomenal amount of work on Movie Maker in Vista, it's too much fun! I also purchased a Seagate Barracuda 320Gb SATAII hard disk and a Vantec NexStar3 case with an eSata port. I attach the disk to my laptop with an eSata PCMCIA adapter and it really flies, three times as fast as USB.&lt;br /&gt;&lt;br /&gt;Anyway, here's a &lt;a href="http://www.microsoft.com/windowsserver2003/technologies/management/powershell/default.mspx"&gt;PowerShell&lt;/a&gt; tip. To delete all files in a directory except those with a specific extension&lt;/span&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;, use the &lt;/span&gt;&lt;a href="http://www.microsoft.com/technet/scriptcenter/topics/msh/cmdlets/remove-item.mspx"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Remove-Item Cmdlet&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;Remove-Item e:\video\* -recurse -force -exclude *.mpg&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-1977631193872948439?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.microsoft.com/technet/scriptcenter/topics/msh/cmdlets/remove-item.mspx' title='Delete All Files Using Powershell'/><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/1977631193872948439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=1977631193872948439&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/1977631193872948439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/1977631193872948439'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2007/02/delete-all-files-except-using.html' title='Delete All Files Using Powershell'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-8035864766421570257</id><published>2006-12-10T20:00:00.001+11:00</published><updated>2007-05-11T19:55:16.228+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Select ListControl Value</title><content type='html'>&lt;p&gt;&lt;font face="Tahoma" size="2"&gt;The &lt;/font&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.listcontrol.selectedvalue.aspx"&gt;&lt;font face="Tahoma" size="2"&gt;SelectedValue&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt; property of a &lt;/font&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.listcontrol.selectedvalue.aspx"&gt;&lt;font face="Tahoma" size="2"&gt;ListControl&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt; can be used to select an item in&amp;nbsp;the list.&amp;nbsp; However, if no items in the list control contain the specified value, an &lt;/font&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/system.argumentoutofrangeexception.aspx"&gt;&lt;font face="Tahoma" size="2"&gt;ArgumentOutOfRangeException&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt; is thrown.&amp;nbsp; This exception can be avoided by using the &lt;/font&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.listitemcollection.indexof.aspx"&gt;&lt;font face="Tahoma" size="2"&gt;IndexOf&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt; and &lt;/font&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.listitemcollection.findbyvalue.aspx"&gt;&lt;font face="Tahoma" size="2"&gt;FindByValue&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt; methods of the &lt;/font&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.listitemcollection.aspx"&gt;&lt;font face="Tahoma" size="2"&gt;ListItemCollection&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt;.&lt;/font&gt;&lt;/p&gt; &lt;p&gt; &lt;div style="font-size: 8pt; font-family: lucida sans unicode"&gt;control.SelectedIndex = control.Items.IndexOf(control.Items.FindByValue(value));&lt;/div&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;The &lt;strong&gt;IndexOf&lt;/strong&gt; method returns &lt;strong&gt;-1&lt;/strong&gt; if the specified item is not found and &lt;strong&gt;null&lt;/strong&gt; is returned by the &lt;strong&gt;FindByValue&lt;/strong&gt; method.&lt;/font&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-8035864766421570257?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/8035864766421570257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=8035864766421570257&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/8035864766421570257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/8035864766421570257'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/12/listcontrol-selectedvalue.html' title='Select ListControl Value'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-8033473428291335700</id><published>2006-12-03T20:30:00.001+11:00</published><updated>2006-12-06T20:07:40.000+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Add AutoCompleteExtender to ASP.NET AJAX Web Site</title><content type='html'>&lt;p&gt;&lt;font face="Tahoma" size="2"&gt;There are migration guides on the &lt;/font&gt;&lt;a href="http://ajax.asp.net/"&gt;&lt;font face="Tahoma" size="2"&gt;ASP.NET AJAX&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;homepage detailing how to convert Web Sites originally coded against the Atlas CTP to ASP.NET AJAX 1.0 Beta2.&amp;nbsp; Unfortunately at this time, the &lt;strong&gt;AutoCompleteExtender&lt;/strong&gt; is only included&amp;nbsp;in the &lt;/font&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=77294"&gt;&lt;font face="Tahoma" size="2"&gt;ASP.NET AJAX Futures November CTP&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt;&amp;nbsp;but it's relatively straightforward to add the AutoCompleteExtender to an AJAX&amp;nbsp;Web Site.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;1. Add a reference to the &lt;strong&gt;Microsoft.Extensions.Preview &lt;/strong&gt;assembly, usually located in &lt;strong&gt;C:\Program Files\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\v1.0.61025&lt;/strong&gt;.&amp;nbsp; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;2. Add the elements below to the &lt;em&gt;configuration\system.web\pages\controls&lt;/em&gt; element of the &lt;strong&gt;web.config&lt;/strong&gt; file.&lt;/font&gt;&lt;/p&gt; &lt;div style="font-size: 8pt; background: white; color: black; font-family: lucida sans unicode"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;add&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;tagPrefix&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;asp&lt;/span&gt;"&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;namespace&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Microsoft.Web.Preview.UI&lt;/span&gt;"&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;assembly&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Microsoft.Web.Preview&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;add&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;tagPrefix&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;asp&lt;/span&gt;"&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;namespace&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Microsoft.Web.Preview.UI.Controls&lt;/span&gt;"&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;assembly&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Microsoft.Web.Preview&lt;/span&gt;"&lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&lt;font face="Tahoma" color="#000000" size="2"&gt;3. Add&amp;nbsp;the&amp;nbsp;ScriptManager,&amp;nbsp;TextBox and AutoCompleteExtender controls to the Web Form.&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&lt;font face="Tahoma" color="#000000" size="2"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt; &lt;div style="font-size: 8pt; background: white; color: black; font-family: lucida sans unicode"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;form&lt;/span&gt; &lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;="form1"&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&lt;font color="#000000"&gt;&amp;nbsp; &lt;/font&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;ScriptManager&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;="ScriptManager1"&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;TextBox&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;="txtCity"&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;AutoCompleteExtender&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;="autoCity"&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&lt;/span&gt; &lt;span style="color: red"&gt;CompletionSetCount&lt;/span&gt;&lt;span style="color: blue"&gt;="8"&lt;/span&gt; &lt;span style="color: red"&gt;TargetControlID&lt;/span&gt;&lt;span style="color: blue"&gt;="txtCity"&lt;/span&gt; &lt;span style="color: red"&gt;MinimumPrefixLength&lt;/span&gt;&lt;span style="color: blue"&gt;="1"&lt;/span&gt; &lt;span style="color: red"&gt;ServiceMethod&lt;/span&gt;&lt;span style="color: blue"&gt;="GetCities"&lt;/span&gt; &lt;span style="color: red"&gt;ServicePath&lt;/span&gt;&lt;span style="color: blue"&gt;="AutoCompleteService.asmx"/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&lt;font color="#000000"&gt;&amp;nbsp; &lt;/font&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;form&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="Tahoma"&gt;&lt;/font&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;font size="2"&gt;&lt;font face="Tahoma"&gt;4.&amp;nbsp;Finally, add the Web Service that the AutoCompleteExtender will call, making sure that the &lt;strong&gt;Place code in seperate file&lt;/strong&gt; checkbox is unchecked so the code is inline.&amp;nbsp; The WebMethod needs to accept the prefixText and count as parameters, returning the valid list as a string array.&amp;nbsp; Also note the inclusion of the &lt;strong&gt;Microsoft.Web.Script.Services.&lt;/strong&gt;&lt;span style="color: teal"&gt;&lt;font color="#000000"&gt;&lt;strong&gt;ScriptService &lt;/strong&gt;attribute on the class definition.&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;div style="font-size: 8pt; background: white; color: black; font-family: lucida sans unicode"&gt; &lt;p style="margin: 0px"&gt;&lt;span style="background: yellow"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@&lt;/span&gt; &lt;span style="color: maroon"&gt;WebService&lt;/span&gt; &lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;="C#"&lt;/span&gt; &lt;span style="color: red"&gt;Class&lt;/span&gt;&lt;span style="color: blue"&gt;="AutoCompleteService"&lt;/span&gt; &lt;span style="background: yellow"&gt;%&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Collections;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Web;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Web.Services;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Web.Services.Protocols;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;[Microsoft.Web.Script.Services.&lt;span style="color: teal"&gt;ScriptService&lt;/span&gt;]&lt;/p&gt; &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: teal"&gt;AutoCompleteService&lt;/span&gt;&amp;nbsp; : System.Web.Services.&lt;span style="color: teal"&gt;WebService&lt;/span&gt; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; [&lt;span style="color: teal"&gt;WebMethod&lt;/span&gt;]&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;[] GetCities(&lt;span style="color: blue"&gt;string&lt;/span&gt; prefixText, &lt;span style="color: blue"&gt;int&lt;/span&gt; count)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;string&lt;/span&gt;[] autoCompleteWordList = { &lt;span style="color: maroon"&gt;"Canberra"&lt;/span&gt;, &lt;span style="color: maroon"&gt;"Sydney"&lt;/span&gt;, &lt;span style="color: maroon"&gt;"Darwin"&lt;/span&gt;, &lt;span style="color: maroon"&gt;"Brisbane"&lt;/span&gt;, &lt;span style="color: maroon"&gt;"Adelaide"&lt;/span&gt;, &lt;span style="color: maroon"&gt;"Hobart"&lt;/span&gt;, &lt;span style="color: maroon"&gt;"Melbourne"&lt;/span&gt;, &lt;span style="color: maroon"&gt;"Perth"&lt;/span&gt; };&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal"&gt;Array&lt;/span&gt;.Sort(autoCompleteWordList, &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: teal"&gt;CaseInsensitiveComparer&lt;/span&gt;());&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;int&lt;/span&gt; index = &lt;span style="color: teal"&gt;Array&lt;/span&gt;.BinarySearch(autoCompleteWordList, prefixText, &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: teal"&gt;CaseInsensitiveComparer&lt;/span&gt;());&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (index &amp;lt; 0)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; index = ~index;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;int&lt;/span&gt; matchingCount;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;for&lt;/span&gt; (matchingCount = 0; matchingCount &amp;lt; count &amp;amp;&amp;amp; index + matchingCount &amp;lt; autoCompleteWordList.Length; matchingCount++)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (!autoCompleteWordList[index + matchingCount].StartsWith(prefixText, &lt;span style="color: teal"&gt;StringComparison&lt;/span&gt;.CurrentCultureIgnoreCase))&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal"&gt;String&lt;/span&gt;[] returnCities = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;[matchingCount];&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (matchingCount &amp;gt; 0)&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: teal"&gt;Array&lt;/span&gt;.Copy(autoCompleteWordList, index, returnCities, 0, matchingCount);&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; returnCities;&lt;/p&gt; &lt;p style="margin: 0px"&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt; &lt;p style="margin: 0px"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-8033473428291335700?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/8033473428291335700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=8033473428291335700&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/8033473428291335700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/8033473428291335700'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/12/add-autocompleteextender-to-aspnet-ajax.html' title='Add AutoCompleteExtender to ASP.NET AJAX Web Site'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-8686138272195126297</id><published>2006-11-26T15:26:00.001+11:00</published><updated>2006-11-26T16:36:53.543+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Development Practices'/><title type='text'>Software Estimation Tips</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span lang="EN-AU"&gt;&lt;font face="Tahoma" size="2"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Tahoma" size="2"&gt;These&amp;nbsp;tips&amp;nbsp;are taken from &lt;em&gt;Software Estimation – Demystifying the Black Art&lt;/em&gt; by Steve McConnell, published in the Microsoft Best Practices series.&amp;nbsp; &lt;/font&gt;&lt;font face="Tahoma" size="2"&gt;This book has proved to be an invaluable resource and I recommend it to anyone responsible for providing software estimates, be they&amp;nbsp;developer, team lead or project manager.&amp;nbsp; The&amp;nbsp;tips listed&amp;nbsp;are not exhaustive and&amp;nbsp;should be considered in their original context.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font face="Tahoma" size="2"&gt;Critical Estimation Concepts&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;When you’re asked to provide an estimate, determine whether you’re supposed to be estimating or figuring out how to hit a target. &lt;/font&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;A target is a description of a desirable business objective; a commitment is a promise to deliver defined functionality at a specific level of quality by a certain date. A commitment can be the same as the estimate, or it can be more aggressive or more conservative but do not assume that it is the same. &lt;/font&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Avoid using single point estimations, use ranges. Avoid using artificially narrow ranges so that you do not misrepresent the confidence in your estimates. &lt;/font&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Never intentionally underestimate. The penalty for underestimation is more severe than the penalty for over estimation. Address concerns about over estimation through planning and control, not by bias. &lt;/font&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Recognize a mismatch between a project’s business target and a project’s estimate for what it is: valuable risk information that the project might not be successful. Take corrective action as early as possible. &lt;/font&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Consider the effect of the Cone of Uncertainty on the accuracy of your estimate. Your estimate cannot have more accuracy than is possible at your project’s current position within the Cone. Use predefined ranges in your estimates.&lt;/font&gt;  &lt;p&gt;&lt;a href="http://photos1.blogger.com/x/blogger2/5500/4091/1600/428770/ConeOfUncertainty.gif"&gt;&lt;img style="display: block; margin: 0px auto 10px; cursor: hand; text-align: center" alt="Cone of Uncertainty" src="http://photos1.blogger.com/x/blogger2/5500/4091/400/657773/ConeOfUncertainty.png" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Include all necessary software development activities in your estimates, not just coding and testing. For example:&lt;br&gt;i. Mentoring of new team members;&lt;br&gt;ii. Deployment;&lt;br&gt;iii. Requirements Clarification;&lt;br&gt;iv. Technical Reviews;&lt;br&gt;v. Performance Tuning;&lt;br&gt;vi. Creation of Test Data. &lt;/font&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;On projects that last longer than a few weeks, always include allowances for overhead activities such as vacations, sick days, training days and meetings. &lt;/font&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Never give an off-the-cuff estimate. Even a 15 minute estimate will be more accurate. &lt;/font&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Always document assumptions embedded in an estimate. &lt;/font&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Match the number of significant digits in your estimate (its precision) to your estimate’s accuracy. For example: &lt;br&gt;i. “This Project will take 1 year” is not very precise but could be accurate.&lt;br&gt;ii. “This Project will require 7,214 staff hours” is very precise but not accurate to the precision stated.&lt;/font&gt;  &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Don’t assume that effort scales up linearly as project size does. Effort and communication paths scale up exponentially. &lt;/font&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;&lt;font face="Tahoma" size="2"&gt;Fundamental Estimation Techniques&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Look for something you can count that is a meaningful measure of the scope of work in your environment.&lt;/font&gt;  &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Collect historical data that allows you to compute an estimate from a count. Our organization’s past performance is the best indicator of future performance, industry data is not reliable.&lt;/font&gt;  &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Collect a project’s historical data as soon as possible after the end of a project.&lt;/font&gt;  &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;At all costs, avoid using expert judgement to tweak an estimate that has been derived through computation.&lt;/font&gt;  &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;To create task level estimates, have the people who will actually do the work create the estimate.&lt;/font&gt;  &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Create both Best Case and Worst Case estimates to stimulate the thinking about the full range of possible outcomes. &lt;/font&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Estimate new projects by comparing them to similar past projects, preferably decomposing the estimate into at least five pieces.&lt;/font&gt;  &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Use T-Shirt sizing to help non technical stakeholders rule features in or out whilst the project. The first table can be used to calculate Net Business Value. &lt;/font&gt; &lt;p&gt; &lt;table cellspacing="0" cellpadding="1" width="100%" border="1"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td width="100%" colspan="5"&gt; &lt;p align="center"&gt;&lt;strong&gt;Development Cost&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font size="2"&gt;&lt;font face="Tahoma"&gt;&lt;strong&gt;Business Value&lt;/strong&gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font size="2"&gt;&lt;font face="Tahoma"&gt;&lt;strong&gt;XL&lt;/strong&gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font size="2"&gt;&lt;font face="Tahoma"&gt;&lt;strong&gt;L&lt;/strong&gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font size="2"&gt;&lt;font face="Tahoma"&gt;&lt;strong&gt;M&lt;/strong&gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font size="2"&gt;&lt;font face="Tahoma"&gt;&lt;strong&gt;S&lt;/strong&gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font size="2"&gt;&lt;font face="Tahoma"&gt;&lt;strong&gt;XL&lt;/strong&gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;0 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;4 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;6 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;7 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font size="2"&gt;&lt;font face="Tahoma"&gt;&lt;strong&gt;L&lt;/strong&gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;-4 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;0 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;2 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;3 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font size="2"&gt;&lt;font face="Tahoma"&gt;&lt;strong&gt;M&lt;/strong&gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;-6 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;-2 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;0 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;1 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font size="2"&gt;&lt;font face="Tahoma"&gt;&lt;strong&gt;S&lt;/strong&gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;-7 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;-3 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;-1 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="20%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;0&lt;/font&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;/p&gt; &lt;table cellspacing="0" cellpadding="1" width="100%" border="1"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;strong&gt;&lt;font face="Tahoma" size="2"&gt;Feature &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;strong&gt;&lt;font face="Tahoma" size="2"&gt;Business Value &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;strong&gt;&lt;font face="Tahoma" size="2"&gt;Development Cost &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;strong&gt;&lt;font face="Tahoma" size="2"&gt;Net Business Value&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;A &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;XL &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;M &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;6 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;B &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;M &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;M &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;0 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;C &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;M &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;S &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;1 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;D &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;S &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;L &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;-3 &lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;E &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;S &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;XL &lt;/font&gt;&lt;/p&gt;&lt;/td&gt; &lt;td width="25%"&gt; &lt;p align="center"&gt;&lt;font face="Tahoma" size="2"&gt;-7&lt;/font&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;/p&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Have each team member estimate pieces of the project individually and then review estimates. Don’t just average estimates, arrive at a consensus that everybody is comfortable with. &lt;/font&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Use an estimation software tool to sanity check estimates created by manual methods. Do not treat the output of the tool as divine revelation. For pointers to estimation tools, see &lt;/font&gt;&lt;a href="http://www.construx.com/estimate"&gt;&lt;font face="Tahoma" size="2"&gt;www.construx.com/estimate&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt; &lt;/font&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Focus on estimating size first. Then compute effort, schedule and cost from the size estimate. &lt;/font&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Re-estimate at each milestone. Base new estimates on the project’s actual progress, not on the project’s planned progress. &lt;/font&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Communicate your plan to re-estimate to project stakeholders in advance.&lt;/font&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;&lt;font face="Tahoma" size="2"&gt;Estimation Scheduling Challenges&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Do not shorten a schedule estimate without increasing the effort estimate. &lt;br&gt;i. Larger teams require more coordination and management overhead.&lt;br&gt;ii. Larger teams introduce more communication paths which introduce more chances to miscommunication which introduces more errors. &lt;br&gt;iii. Shorter schedules require more work to be done in parallel. The more work that overlaps, the higher than chance that one piece of work will be based on another defective piece of work increasing the need for rework.&lt;/font&gt;  &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Reduce costs by lengthening the schedule and conducting the project with a smaller team. &lt;/font&gt; &lt;li&gt;&lt;font face="Tahoma" size="2"&gt;Consider the project’s development approach in allocating schedule to different activities.&lt;/font&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-8686138272195126297?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/8686138272195126297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=8686138272195126297&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/8686138272195126297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/8686138272195126297'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/11/software-estimation-tips.html' title='Software Estimation Tips'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-4361652036202884899</id><published>2006-11-23T18:13:00.001+11:00</published><updated>2006-12-05T21:03:17.627+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>ASP.NET2.0 Page Life Cycle</title><content type='html'>&lt;p&gt;&lt;font face="Tahoma" size="2"&gt;Whilst investigating the &lt;/font&gt;&lt;a href="http://ajax.asp.net/docs/tutorials/UpdatePanelClientScripting.aspx"&gt;&lt;font face="Tahoma" size="2"&gt;ASP.NET AJAX Client Page LifeCycle&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt; in my &lt;/font&gt;&lt;a title="Maintaining GridView Scroll Position in an ASP.NET AJAX UpdatePanel" href="http://microsoftmiles.blogspot.com/2006/11/maintaining-gridview-scroll-position-in.html"&gt;&lt;font face="Tahoma" size="2"&gt;previous post&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt;, I also revisted the server side &lt;/font&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms178472.aspx"&gt;&lt;font face="Tahoma" size="2"&gt;ASP.NET Page LifeCycle&lt;/font&gt;&lt;/a&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms178472.aspx"&gt;&lt;/a&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms178472.aspx"&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt;.&amp;nbsp; The overview&amp;nbsp;on MSDN is definitive but this splendid chart,&amp;nbsp;courtesy of&amp;nbsp;Leon Andrianarivony, deserves further propogation.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/x/blogger2/5500/4091/1600/875997/o_aspNet_Page_LifeCycle.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="ASP.NET2.0 Page LifeCycle" src="http://photos1.blogger.com/x/blogger2/5500/4091/400/991421/o_aspNet_Page_LifeCycle.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-4361652036202884899?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/4361652036202884899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=4361652036202884899&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/4361652036202884899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/4361652036202884899'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/11/aspnet20-page-life-cycle.html' title='ASP.NET2.0 Page Life Cycle'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-5329910878902856407</id><published>2006-11-20T21:47:00.001+11:00</published><updated>2006-11-23T18:29:38.516+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Maintaining GridView Scroll Position in an ASP.NET AJAX UpdatePanel</title><content type='html'>&lt;p&gt;&lt;font face="Tahoma" size="2"&gt;Sometimes,&amp;nbsp;it is inappropriate to use the paging feature of the ASP.NET &lt;/font&gt;&lt;a title="GridView" href="http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.aspx"&gt;&lt;font face="Tahoma" size="2"&gt;GridView&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="1"&gt;&lt;font face="Tahoma" size="2"&gt;.&amp;nbsp;&amp;nbsp;Instead, a scrolling&amp;nbsp;grid is more applicable and enclosing the GridView&amp;nbsp;in a &lt;strong&gt;&amp;lt;div&amp;gt;&lt;/strong&gt;&amp;nbsp;tag with the &lt;strong&gt;overflow&lt;/strong&gt;&amp;nbsp;style applied&amp;nbsp;ensures&amp;nbsp;that the over-sized element is clipped and that scroll bars&amp;nbsp;are displayed.&lt;/font&gt; &lt;/font&gt;&lt;/p&gt; &lt;div style="font-size: 10pt; font-family: monospace; background-color: white"&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;UpdatePanel&lt;/span&gt;&lt;span style="color: black"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;="updateGrid"&lt;/span&gt;&lt;span style="color: black"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&lt;/span&gt;&lt;span style="color: black"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;UpdateMode&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="color: blue"&gt;="Conditional"&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt; &lt;div style="font-size: 10pt; font-family: monospace; background-color: white"&gt;&lt;span style="color: blue"&gt;&lt;font face="Lucida Sans Unicode" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;font color="#0000ff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#800000"&gt;input&lt;/font&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;type&lt;/font&gt;&lt;font color="#0000ff"&gt;="hidden"&lt;/font&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;id&lt;/font&gt;&lt;font color="#0000ff"&gt;="hdnScrollTop"&lt;/font&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;runat&lt;/font&gt;&lt;font color="#0000ff"&gt;="server"&lt;/font&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;value&lt;/font&gt;&lt;font color="#0000ff"&gt;="0"&lt;/font&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;font face="Lucida Sans Unicode" size="1"&gt;/&amp;gt; &lt;/font&gt;&lt;/div&gt; &lt;div style="font-size: 10pt; font-family: monospace; background-color: white"&gt;&lt;/font&gt;&lt;/span&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="color: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;span style="color: black"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;="divScroll"&lt;/span&gt;&lt;span style="color: black"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;style&lt;/span&gt;&lt;span style="color: blue"&gt;="width:350px;height:200px; overflow-x:hidden; overflow-y:scroll;"&lt;/span&gt;&lt;span style="color: black"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;onscroll&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="color: blue"&gt;="&lt;font color="#000000"&gt;$get('&lt;/font&gt;&lt;font color="maroon"&gt;hdnScrollTop'&lt;/font&gt;&lt;font color="black"&gt;).value = &lt;/font&gt;this.scrollTop;"&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;gridview&lt;/span&gt;&lt;span style="color: black"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;="grdOrders"&lt;/span&gt;&lt;span style="color: black"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;="server"&lt;/span&gt;&lt;span style="color: black"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;width&lt;/span&gt;&lt;span style="color: blue"&gt;="95%"&lt;/span&gt;&lt;span style="color: black"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;datasourceid&lt;/span&gt;&lt;span style="color: blue"&gt;="objDataSource"&lt;/span&gt;&lt;span style="color: black"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;cellpadding&lt;/span&gt;&lt;span style="color: blue"&gt;="3"&lt;/span&gt;&lt;span style="color: black"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;GridLines&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="color: blue"&gt;="Horizontal"&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;Columns&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;CommandField&lt;/span&gt;&lt;span style="color: black"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;ShowSelectButton&lt;/span&gt;&lt;span style="color: blue"&gt;="True"&lt;/span&gt;&lt;span style="color: black"&gt; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="color: blue"&gt;/&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;Columns&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;gridview&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="color: black"&gt;&amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;div&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;ContentTemplate&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: maroon"&gt;UpdatePanel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt; &lt;/div&gt; &lt;p&gt;&lt;font size="1"&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;&lt;font face="Tahoma"&gt;&lt;span style="color: blue"&gt;&lt;font color="#000000"&gt;It is slightly more complex to persist the scroll position&amp;nbsp;during an syschronous &lt;/font&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;&lt;font color="#000000"&gt;postback using &lt;a href="http://ajax.asp.net/Default.aspx"&gt;ASP.NET AJAX&lt;/a&gt;.&amp;nbsp; It's necessary to&amp;nbsp;store the&amp;nbsp;&lt;strong&gt;scrollTop &lt;/strong&gt;property&amp;nbsp;of the &lt;strong&gt;div&lt;/strong&gt; tag in a &lt;strong&gt;hidden&lt;/strong&gt; field using the client side &lt;strong&gt;onscroll&lt;/strong&gt; event.&amp;nbsp; Note the use of the Sys.UI.DomElement &lt;a title="$get method" href="http://ajax.asp.net/docs/ClientReference/Sys.UI/DomElementClass/a0abda13-b4e7-43ac-9cb7-3a184ec259af.aspx"&gt;$get method&lt;/a&gt;, which is&amp;nbsp;a shortcut to the getElementById method. It's also important that the &lt;strong&gt;hidden input&lt;/strong&gt; element&amp;nbsp;has the &lt;strong&gt;runat="server"&amp;nbsp;&lt;/strong&gt;attribute&lt;strong&gt; &lt;/strong&gt;so the element can be accessed during the &lt;strong&gt;pageLoaded &lt;/strong&gt;function.&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt; &lt;/font&gt;&lt;/font&gt; &lt;p&gt;&lt;span style="color: blue"&gt;&lt;font face="Verdana" color="#000000" size="1"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="color: blue"&gt; &lt;p&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;font color="blue"&gt;&amp;lt;&lt;/font&gt;&lt;font color="maroon"&gt;asp&lt;/font&gt;&lt;font color="blue"&gt;:&lt;/font&gt;&lt;font color="maroon"&gt;ScriptManager&lt;/font&gt;&lt;font color="black"&gt; &lt;/font&gt;&lt;font color="red"&gt;ID&lt;/font&gt;&lt;font color="blue"&gt;="scriptManager"&lt;/font&gt;&lt;font color="black"&gt; &lt;/font&gt;&lt;font color="red"&gt;runat&lt;/font&gt;&lt;font color="blue"&gt;="server"&lt;/font&gt;&lt;font color="black"&gt; &lt;/font&gt;&lt;font color="red"&gt;EnablePartialRendering&lt;/font&gt;&lt;font color="blue"&gt;="True"&lt;/font&gt;&lt;font color="black"&gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;font color="blue"&gt;/&amp;gt;&lt;br&gt;&amp;lt;&lt;/font&gt;&lt;font color="maroon"&gt;script&lt;/font&gt;&lt;font color="black"&gt; &lt;/font&gt;&lt;font color="red"&gt;type&lt;/font&gt;&lt;font color="blue"&gt;="text/javascript"&lt;/font&gt;&lt;font color="black"&gt; &lt;/font&gt;&lt;font color="red"&gt;language&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Lucida Sans Unicode" color="blue" size="1"&gt;="javascript"&amp;gt;&lt;br&gt;&lt;/font&gt;&lt;font color="black"&gt;&lt;font face="Lucida Sans Unicode" color="blue" size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var&lt;/font&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;font color="black"&gt; prm = Sys.WebForms.PageRequestManager.getInstance();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; prm.add_pageLoaded(pageLoaded);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; prm.add_beginRequest(beginRequest);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color="blue"&gt;var&lt;/font&gt;&lt;font color="black"&gt; postbackElement;&lt;/font&gt; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;font color="black"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="blue"&gt;function&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;font color="black"&gt; beginRequest(sender, args) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;postbackElement = args.get_postBackElement();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="blue"&gt;function&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;font color="black"&gt; pageLoaded(sender, args) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="blue"&gt;var&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;font color="black"&gt; updatedPanels = args.get_panelsUpdated();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="blue"&gt;if&lt;/font&gt;&lt;font color="black"&gt; (&lt;/font&gt;&lt;font color="blue"&gt;typeof&lt;/font&gt;&lt;font color="black"&gt;(postbackElement) == &lt;/font&gt;&lt;font color="maroon"&gt;"undefined"&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;font color="black"&gt;) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="blue"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;font color="black"&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="blue"&gt;if&lt;/font&gt;&lt;font color="black"&gt; (postbackElement.id.toLowerCase().indexOf(&lt;/font&gt;&lt;font color="maroon"&gt;'grdorders'&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;font face="Lucida Sans Unicode"&gt;&lt;font color="black"&gt;) &amp;gt; -1) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$get(&lt;font color="maroon"&gt;"divScroll"&lt;/font&gt;&lt;font color="black"&gt;).scrollTop = $get(&lt;/font&gt;&lt;font color="maroon"&gt;"hdnScrollTop"&lt;/font&gt;&lt;font color="black"&gt;).value;&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/font&gt;&lt;br&gt;&lt;font color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;br&gt;&lt;font color="blue"&gt;&amp;lt;/&lt;/font&gt;&lt;font color="maroon"&gt;script&lt;/font&gt;&lt;font color="blue"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt; &lt;/font&gt;&lt;/font&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&lt;span style="color: blue"&gt;&lt;font color="#000000"&gt;&lt;font face="Tahoma" size="2"&gt;In order that the scroll position of the &lt;strong&gt;div&lt;/strong&gt; can be reset after a postback, it is first necessary to add a reference to the &lt;/font&gt;&lt;a href="http://ajax.asp.net/docs/ClientReference/Sys.WebForms/PageRequestManagerClass/default.aspx"&gt;&lt;font face="Tahoma" size="2"&gt;PageRequestManager&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt;.&amp;nbsp; To use the PageRequestManager class in client script, you must first have a &lt;/font&gt;&lt;a href="http://ajax.asp.net/docs/mref/3b24af40-d9f2-7ddd-cb8e-38a9bb90b9c6.aspx"&gt;&lt;font face="Tahoma" size="2"&gt;ScriptManager&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt; server control on the page. To access the PageRequestManager class, you must have the &lt;/font&gt;&lt;a href="http://ajax.asp.net/docs/mref/3b69f3d9-a3c9-7cf7-f391-6a97c48f2f77.aspx"&gt;&lt;font face="Tahoma" size="2"&gt;EnablePartialRendering&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt; set to &lt;span class="keyword"&gt;true&lt;/span&gt; (the default) on the ScriptManager control. When EnablePartialRendering is set to &lt;span class="keyword"&gt;true&lt;/span&gt;, the MicrosoftAjaxWebForms.js file that contains the PageRequestManager class is included as a script resource for the page.&amp;nbsp; Once you have the current instance of the PageRequestManager, you can access all of its methods, properties, and events such as &lt;strong&gt;beginRequest&lt;/strong&gt; and &lt;strong&gt;pageLoaded&lt;/strong&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font face="Tahoma" size="2"&gt; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: blue"&gt;&lt;font face="Tahoma" color="#000000" size="2"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: blue"&gt;&lt;font color="#000000"&gt;&lt;font face="Tahoma" size="2"&gt;The &lt;/font&gt;&lt;a href="http://ajax.asp.net/docs/ClientReference/Sys.WebForms/PageRequestManagerClass/PageRequestManagerBeginRequestEvent.aspx"&gt;&lt;font face="Tahoma" size="2"&gt;beginRequest&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt; event is raised before the processing of an asynchronous postback begins and the postback is sent to the server.&amp;nbsp; Here we get a reference to the element that has raised the postback.&amp;nbsp; &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: blue"&gt;&lt;font face="Tahoma" color="#000000" size="2"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: blue"&gt;&lt;font face="Tahoma" color="#000000" size="2"&gt;The &lt;/font&gt;&lt;a href="http://ajax.asp.net/docs/ClientReference/Sys.WebForms/PageRequestManagerClass/PageRequestManagerPageLoadedEvent.aspx"&gt;&lt;font face="Tahoma" size="2"&gt;pageLoaded&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" color="#000000" size="2"&gt; event is raised after all content on the page is refreshed.&amp;nbsp; The function initially determines if the page has been posted back by checking the &lt;strong&gt;typeof&lt;/strong&gt; the &lt;strong&gt;postbackElement&lt;/strong&gt;.&amp;nbsp; If the postback was raised by a our GridView, the &lt;strong&gt;scrollTop&amp;nbsp;&lt;/strong&gt;property&amp;nbsp;of our &lt;strong&gt;div&lt;/strong&gt; tag is set to the value stored in the hidden field.&lt;/font&gt;&lt;/span&gt;&lt;font face="Tahoma" size="2"&gt; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: blue"&gt;&lt;font face="Tahoma" color="#000000" size="2"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: blue"&gt;&lt;font color="#000000"&gt;&lt;a title="Client Page Life-cycle Events" href="http://ajax.asp.net/docs/tutorials/UpdatePanelClientScripting.aspx"&gt;&lt;font face="Tahoma" size="2"&gt;Client Page Life-cycle Events&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt; are also integral to&amp;nbsp;&lt;/font&gt;&lt;a title="Customizing Error Handling in Partial-Page Updates" href="http://ajax.asp.net/docs/tutorials/DisplayAsyncErrorMessage.aspx"&gt;&lt;font face="Tahoma" size="2"&gt;Customizing Error Handling in Partial-Page Updates&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma" size="2"&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font face="Tahoma" size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;/p&gt;&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-5329910878902856407?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/5329910878902856407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=5329910878902856407&amp;isPopup=true' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/5329910878902856407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/5329910878902856407'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/11/maintaining-gridview-scroll-position-in.html' title='Maintaining GridView Scroll Position in an ASP.NET AJAX UpdatePanel'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33518972.post-4631780281118670854</id><published>2006-11-16T21:10:00.000+11:00</published><updated>2006-11-16T21:26:57.940+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>ASP.NET Panel GroupingText Property</title><content type='html'>&lt;p style="font-family:verdana;font-size:85%;"&gt;I discovered the &lt;a href="http://msdn2.microsoft.com/en-US/library/system.web.ui.webcontrols.panel.groupingtext.aspx" title="GroupingText"&gt;GroupingText&lt;/a&gt;&amp;nbsp;property of the ASP.NET2.0 Panel control today.&amp;nbsp;&amp;nbsp;When the property is set, the control actually renders a &lt;b&gt;&amp;lt;fieldset&amp;gt;&lt;/b&gt; tag to group child form elements together with a caption and a smooth cornered border.&amp;nbsp;The caption itself is created using the &amp;lt;&lt;b&gt;legend&amp;gt;&lt;/b&gt; tag.&amp;nbsp; The browser is&amp;nbsp;responsible for the appearance of the caption and labels I think it looks really neat in IE7.&lt;/p&gt;&lt;p align="center"&gt;&lt;br /&gt;&lt;img align="center" src="http://docs.google.com/File?id=ddkcmxzz_5df28d5" style="WIDTH:529px; HEIGHT:413px" title="GroupingText"/&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-4631780281118670854?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/4631780281118670854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=4631780281118670854&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/4631780281118670854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/4631780281118670854'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/11/i-discovered-groupingtext-property-of.html' title='ASP.NET Panel GroupingText Property'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-8889572041428432695</id><published>2006-11-14T12:55:00.000+11:00</published><updated>2006-11-16T21:27:59.193+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>WCF Contracts Defined</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;A WCF service publishes the operations that it supports by using a &lt;strong&gt;service contract&lt;/strong&gt;. This contract defines the operations that the service provides, without specifying how the operations should be implemented.&lt;br /&gt;&lt;br /&gt;Operations are defined by adding methods to a &lt;strong&gt;Service Contract&lt;/strong&gt; interface that is annotated with the &lt;strong&gt;OperationContract&lt;/strong&gt; attribute. Only methods that are qualified by the &lt;strong&gt;OperationContract&lt;/strong&gt; attribute are service operations, and can be exposed to clients.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;[ServiceContract]&lt;br /&gt;public interface IOrderService { &lt;br /&gt;&amp;nbsp;&amp;nbsp;[OperationContract]&lt;br /&gt;&amp;nbsp;&amp;nbsp;void CreateOrder(int orderNumber);&lt;br /&gt;&amp;nbsp;&amp;nbsp;[OperationContract]&lt;br /&gt;&amp;nbsp;&amp;nbsp;void AddItemToOrder(int orderNumber, Item itm);&lt;br /&gt;&amp;nbsp;&amp;nbsp;[OperationContract]&lt;br /&gt;&amp;nbsp;&amp;nbsp;Order GetOrderDetails(int orderNumber);&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;br /&gt;A WCF service is implemented by creating a class that implements the service interface.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;font-family:courier new;"&gt;&lt;br /&gt;public class OrderService : IOrderService { &lt;br /&gt;&amp;nbsp;&amp;nbsp;void CreateOrder(int orderNumber) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// implementation details&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;void AddItemToOrder(int orderNumber, Item itm) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// implementation details &lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;Order GetOrderDetails(int orderNumber) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// implementation details&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;br /&gt;&lt;strong&gt;Data contracts&lt;/strong&gt; define how complex types are serialized when they are used in WCF service operations. They defined by applying the &lt;strong&gt;DataContract&lt;/strong&gt; attribute to a class, and then adding &lt;strong&gt;DataMember&lt;/strong&gt; attributes to fields and properties to show which members are to be exposed to clients.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;[DataContract]&lt;br /&gt;public class Order {&lt;br /&gt;&amp;nbsp;&amp;nbsp;[DataMember]&lt;br /&gt;&amp;nbsp;&amp;nbsp;public int OrderNumber;&lt;br /&gt;&amp;nbsp;&amp;nbsp;[DataMember]&lt;br /&gt;&amp;nbsp;&amp;nbsp;public String ClientName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;br /&gt;&lt;strong&gt;Message contracts&lt;/strong&gt; describe the entire SOAP message format. They can use data contracts and serializable types to emit schema for complex types, and they also make it possible to control the SOAP message headers and body explicitly, by using a single type. Message contracts provide a simple method to add custom SOAP headers to incoming and outgoing messages.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;[MessageContract]&lt;br /&gt;public class MyRequest {&lt;br /&gt;&amp;nbsp;&amp;nbsp;[MessageHeader]&lt;br /&gt;&amp;nbsp;&amp;nbsp;public string field1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;[MessageBody]&lt;br /&gt;&amp;nbsp;&amp;nbsp;public string field2; &lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;br /&gt;A WCF service reports errors by using &lt;strong&gt;Fault&lt;/strong&gt; objects. &lt;strong&gt;Fault contracts&lt;/strong&gt; document the errors that WCF code is likely to produce, and WCF maps Fault objects to SOAP faults. Note that the type specified in the FaultContract does not have to be an exception.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;[OperationContract]&lt;br /&gt;[FaultContract(typeof(DivideByZeroException))]&lt;br /&gt;void SomeMethod();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;br /&gt;A Fault is generated by throwing a &lt;strong&gt;FaultException&lt;/strong&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;throw new FaultException&lt;dividebyzeroexception&gt;(someException);&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-8889572041428432695?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/8889572041428432695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=8889572041428432695&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/8889572041428432695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/8889572041428432695'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/11/wcf-contracts-defined.html' title='WCF Contracts Defined'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-1684911586674851865</id><published>2006-11-09T20:37:00.000+11:00</published><updated>2006-11-10T08:53:20.386+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Share Common Files in Visual Studio</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;Under normal circumstances, when you add an existing file to a project, Visual Studio makes a copy of the file, local to the project. This is good for isolating breaking changes, but not so good if you want to share a single copy of a file. &lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;An alternative is to share common files, perhaps containing assembly info or a strong name key, that need to be referenced throughout your code base.  &lt;/span&gt;&lt;span style="font-family:verdana;"&gt;To link files across projects by using the &lt;strong&gt;Add As Link&lt;/strong&gt; context menu in the &lt;strong&gt;Add Existing Item&lt;/strong&gt; dialog.&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;a href="http://photos1.blogger.com/blogger2/5500/4091/1600/AddAsLink.1.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger2/5500/4091/400/AddAsLink.1.jpg" border="0" /&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Once added, the linked file can be identified in Solution Explorer by the shortcut symbol at the foot of it's icon.  The major benefit is that any changes saved to either the original or any linked file are replicated across the original and all linked files immediately. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-1684911586674851865?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/1684911586674851865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=1684911586674851865&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/1684911586674851865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/1684911586674851865'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/11/sharing-common-files-in-visual-studio.html' title='Share Common Files in Visual Studio'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-7119685213278198598</id><published>2006-11-08T16:49:00.000+11:00</published><updated>2006-11-10T08:53:38.492+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Create a new GUID in SQL Server</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;To create a new &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0" onclick="BLOG_clickHandler(this)"&gt;uniqueidentifier&lt;/span&gt; or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1" onclick="BLOG_clickHandler(this)"&gt;&lt;a href="http://en.wikipedia.org/wiki/Globally_Unique_Identifier"&gt;GUID&lt;/a&gt;&lt;/span&gt; (Globally Unique Identifier) in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2" onclick="BLOG_clickHandler(this)"&gt;SQL&lt;/span&gt; Server use the &lt;a href="http://msdn2.microsoft.com/en-us/library/ms190348.aspx"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3" onclick="BLOG_clickHandler(this)"&gt;newid&lt;/span&gt;()&lt;/a&gt; function:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;select &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4" onclick="BLOG_clickHandler(this)"&gt;newid&lt;/span&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;This function can be useful for creating test data but there is another use. It's also possible to select a random record using the script below:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;select top 1 *&lt;br /&gt;from &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5" onclick="BLOG_clickHandler(this)"&gt;dbo&lt;/span&gt;.Customer&lt;br /&gt;order by &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6" onclick="BLOG_clickHandler(this)"&gt;newid&lt;/span&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;I can't really think of any situation where this randomisation technique would have been helpful but, you never know !&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-7119685213278198598?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/7119685213278198598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=7119685213278198598&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/7119685213278198598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/7119685213278198598'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/11/create-guid-select-random-record-in-sql.html' title='Create a new GUID in SQL Server'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-3009589739708475415</id><published>2006-11-05T19:52:00.000+11:00</published><updated>2007-04-17T19:55:34.742+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Cmd'/><title type='text'>Command Prompt Previous Command List</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;This Command Prompt functionality has been around since Windows 2k and it's still available in Vista. I don't believe it's particularly well known and can be useful. Rather than just cycling through previous commands using the cursor keys, a list of the previous commands can be recalled by pressing &lt;strong&gt;F7&lt;/strong&gt;. Select the required command using the cursor keys and hit enter to execute.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger2/5500/4091/1600/CommandPrompt.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="Command Prompt Command List" src="http://photos1.blogger.com/blogger2/5500/4091/400/CommandPrompt.jpg" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-3009589739708475415?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/3009589739708475415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=3009589739708475415&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/3009589739708475415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/3009589739708475415'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/11/command-prompt-previous-command-list.html' title='Command Prompt Previous Command List'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-1713901897009718331</id><published>2006-11-04T16:34:00.000+11:00</published><updated>2006-11-11T09:15:25.004+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Avoid releasing ASP.NET applications with &lt;compilation debug="true" /&gt; using &lt;deployment retail=”true”/&gt;</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;I think most people are aware that running production ASP.NET applications with &amp;lt;compilation debug="true"/&amp;gt; is bad practice for a number of reasons but specifically because compilation takes longer due as batch optimizating is disabled and scripts and images downloaded from the WebResources.axd handler are not cached.&lt;br /&gt;&lt;br /&gt;One of the great tricks I learnt at a Scott Guthrie session at TechEd in Sydney earlier this year, was that you can avoid the accidental deployment of applications with &lt;strong&gt;&amp;lt;compilation debug="true"/&amp;gt;&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Specifically, by setting the &lt;strong&gt;&amp;lt;deployment retail="true"/&amp;gt;&lt;/strong&gt; switch within your machine.config file, you will disable the &amp;lt;compilation debug="true"/&amp;gt; switch, disable the ability to output trace output in a page, and turn off the ability to show detailed error messages remotely across all ASP.NET applications on the server.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;lt;system.web&amp;gt;&lt;br /&gt;&amp;lt;deployment retail="true/"&amp;gt;&lt;br /&gt;&amp;lt;/system.web&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's worth noting that regardless of the increased memory footprint, adding &lt;strong&gt;debug symbols&lt;/strong&gt; to release assemblies can be extremely useful as it allows detailed stack trace and line error messages to be logged when exceptions occur. It's important to note that the generated &lt;strong&gt;pdb&lt;/strong&gt; files must be be deployed with the assemblies for the additional debug information to be available.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;To add debug symbols to a &lt;strong&gt;Web Deployment Project &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;open the project &lt;strong&gt;Property Pages &lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;check the &lt;strong&gt;Generate debug information&lt;/strong&gt; checkbox&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="center"&gt;&lt;a href="http://photos1.blogger.com/blogger2/5500/4091/1600/DebugSymbols1.jpg"&gt;&lt;img style="CURSOR: hand" alt="Web Deployment Project - Generate Debug Symbols" src="http://photos1.blogger.com/blogger2/5500/4091/400/DebugSymbols1.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;u&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;/u&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style="font-family:Verdana;"&gt;&lt;span style="font-size:85%;"&gt;To add debug information to a &lt;strong&gt;Web Application Project&lt;/strong&gt; or &lt;strong&gt;Class Library&lt;/strong&gt;:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Verdana;"&gt;&lt;/span&gt;&lt;span style="font-family:Verdana;"&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;open the project &lt;strong&gt;Property Pages &lt;/strong&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;click the &lt;strong&gt;Build&lt;/strong&gt; tab&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;click the &lt;strong&gt;Advanced&lt;/strong&gt; button&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;select &lt;strong&gt;pdb-only&lt;/strong&gt; in the Debug info dropdown&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;click the &lt;strong&gt;OK &lt;/strong&gt;button&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://photos1.blogger.com/blogger2/5500/4091/1600/DebugSymbols2.jpg"&gt;&lt;img style="CURSOR: hand" alt="Web Application Project - Debug Info" src="http://photos1.blogger.com/blogger2/5500/4091/400/DebugSymbols2.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-1713901897009718331?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://weblogs.asp.net/scottgu/archive/2006/04/11/Don_1920_t-run-production-ASP.NET-Applications-with-debug_3D001D20_true_1D20_-enabled.aspx' title='Avoid releasing ASP.NET applications with &amp;lt;compilation debug=&quot;true&quot; /&amp;gt; using &amp;lt;deployment retail=”true”/&amp;gt;'/><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/1713901897009718331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=1713901897009718331&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/1713901897009718331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/1713901897009718331'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/11/avoid-debugtrue-with-retailtrue.html' title='Avoid releasing ASP.NET applications with &amp;lt;compilation debug=&quot;true&quot; /&amp;gt; using &amp;lt;deployment retail=”true”/&amp;gt;'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-4754091024477515037</id><published>2006-11-01T20:10:00.000+11:00</published><updated>2006-11-03T09:17:14.960+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='MSBuild'/><title type='text'>Customising Web Deployments with MSBuild</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;Managing web site build configurations has been dramatically simplified with the introduction of the &lt;/span&gt;&lt;a href="http://msdn2.microsoft.com/en-us/asp.net/aa336619.aspx"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Web Deployment Project&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;. &lt;/span&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;When a Web Deployment Project is used in conjunction with a web site which of course has no project file, the App_Code directory is easily excluded and a clean build directory results. &lt;a href="http://msdn2.microsoft.com/en-us/asp.net/aa336618.aspx"&gt;Web Application Projects&lt;/a&gt; on the other hand, have a host of additional files that aren't necessary for deployment and by default, are not removed by the Web Deployment Project. This prompted an investigation of the &lt;a href="http://msdn2.microsoft.com/en-us/library/wea2sca5.aspx"&gt;MSBuild&lt;/a&gt; script, automatically generated by the Web Deployment Project UI.  Luckily, Wayne Brantley has posted some great tips on &lt;/span&gt;&lt;a href="http://waynebrantley.com/blogs/aspnetbytes/archive/2006/02/08/5.aspx"&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;customising web deployments with MSBuild&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;To view the MSBuild script, right click on the Web Deployment Project in Visual Studio, and select &lt;strong&gt;Open Project File.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;To remove files and folders not required once deployed, add the elements below to the &lt;strong&gt;ItemGroup&lt;/strong&gt; section.&lt;/span&gt; &lt;p&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;ItemGroup&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt; Exclude folders &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;ExcludeFromBuild&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;$(SourceWebPhysicalPath)\helpers\**\*.*&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;ExcludeFromBuild&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;$(SourceWebPhysicalPath)\obj\**\*.*&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;ExcludeFromBuild&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;$(SourceWebPhysicalPath)\proxies\**\*.*&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;ExcludeFromBuild&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;$(SourceWebPhysicalPath)\properties\**\*.*&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt;/&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt;Exclude file types&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;ExcludeFromBuild&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;$(SourceWebPhysicalPath)\**\*.csproj&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;ExcludeFromBuild&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;$(SourceWebPhysicalPath)\**\*.scc&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;ExcludeFromBuild&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;$(SourceWebPhysicalPath)\**\*.user&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;ExcludeFromBuild&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;$(SourceWebPhysicalPath)\**\*.vspscc&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;ItemGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;It's also possible to deploy specific files depending on the build configuration. For instance, to replace the &lt;em&gt;web.config&lt;/em&gt; file when building in &lt;em&gt;release &lt;/em&gt;configuration, create a file named &lt;em&gt;web.config.release&lt;/em&gt; and add the elements below to the MSBuild script. This works for any file type in the root directory named *.release, not just config files.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;ItemGroup&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;MySourceConfigFiles&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;$(SourceWebPhysicalPath)\*.$(Configuration)&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;MyUnNeededDestFiles&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;$(SourceWebPhysicalPath)\*.release&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;ItemGroup&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:78%;"&gt;&amp;gt;&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;AfterBuild&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;Copy&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;SourceFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;@(MySourceConfigFiles)&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;DestinationFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;@(MySourceConfigFiles-&amp;gt;'$(OutputPath)\%(Filename)')&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;Delete&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Files&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;span style="color:blue;"&gt;@(MyUnNeededDestFiles-&amp;gt;'$(OutputPath)\%(Filename)%(Extension)')&lt;/span&gt;&lt;span style="color:black;"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-4754091024477515037?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/4754091024477515037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=4754091024477515037&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/4754091024477515037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/4754091024477515037'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/11/customising-web-deployments-with.html' title='Customising Web Deployments with MSBuild'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-7378709913859326270</id><published>2006-11-01T19:44:00.000+11:00</published><updated>2006-11-02T10:00:56.225+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Remove time from datetime in SQL Server</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;This was going to be a one liner but as ever, there's always something new to learn. Whenever I've needed to remove the time portion from a datetime in SQL Server I've generally used this SQL:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;color:#000000;"&gt;select convert(datetime, convert(char, getdate(), 106))&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;However, I found a faster method where no string conversion is necessary &lt;a href="http://www.cubido.at/Blog/tabid/176/EntryID/62/Default.aspx"&gt;here&lt;/a&gt;. The performance improvement is only slight, 10k conversions are 0.21 seconds quicker, but it's interesting nonetheless.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-size:85%;"&gt;Internally SQL Server stores datetime values as two 4-byte integers. The first one represents the days since 1st Jan. 1900 and the second one the number of milliseconds since midnight. Therefore another solution is to convert the datetime value to float, strip the digits behind the decimal point and convert it back to datetime again:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;select cast(floor(cast(getdate() as float)) as datetime)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Captain Sybase ;)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-7378709913859326270?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/7378709913859326270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=7378709913859326270&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/7378709913859326270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/7378709913859326270'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/11/remove-time-from-datetime-in-sql-server.html' title='Remove time from datetime in SQL Server'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-5118799859625798424</id><published>2006-11-01T09:44:00.000+11:00</published><updated>2006-11-01T12:07:19.514+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Authentication and Access Control Diagnostics</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;In my previous post, I talked about an IIS issue when using &lt;a href="http://microsoftmiles.blogspot.com/2006/10/authentication-required-with-domain.html"&gt;integrated authentication and a custom service account that does not have a service principal name&lt;/a&gt;. The problem took some time to diagnose and solve, and it was only later that the Authentication and Access Control Diagnostics tool came to my attention. I replicated the original issue and ran the tool with some very positive results.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Diagnosis with the &lt;strong&gt;Check Authentication &lt;/strong&gt;task, clearly indicates that the custom identity of the application pool under which the virtual directory is running, does not have a service principle name and Kerberos authentication will fail -&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger2/5500/4091/1600/authdiag1a.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger2/5500/4091/400/authdiag1a.jpg" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Once Kerberos authentication is disabled, only NTLM is available. Rerunning the &lt;strong&gt;Check Authentication&lt;/strong&gt; task results in the warning below -&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger2/5500/4091/1600/authdiag3.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger2/5500/4091/400/authdiag3.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;I think this is a great tool, and one that will save my team a great deal of time in future.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-5118799859625798424?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.microsoft.com/downloads/details.aspx?FamilyID=e90fe777-4a21-4066-bd22-b931f7572e9a&amp;DisplayLang=en' title='Authentication and Access Control Diagnostics'/><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/5118799859625798424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=5118799859625798424&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/5118799859625798424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/5118799859625798424'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/11/authentication-and-access-control.html' title='Authentication and Access Control Diagnostics'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-4307885331994850777</id><published>2006-10-28T16:43:00.000+10:00</published><updated>2006-10-28T17:38:13.595+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Error 401.1 when when using integrated authentication and a custom service account</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;There's a great MSDN article, with step by step instructions on &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag2/html/paght000009.asp?_r=1"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;how to set up a service account for an ASP.NET 2.0 application&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt; should you not want to user the Network Service account.&lt;/span&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;em&gt;Once a user account has been created, assign ASP.NET permissions to the new account by running the command below from the framework prompt. &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;em&gt;&lt;strong&gt;aspnet_regiis -ga MachineName\AccountName&lt;/strong&gt; &lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;em&gt;&lt;span style="font-size:85%;"&gt;Where MachineName is the name of your server or the domain name if you are using a domain account, and AccountName is the name of your custom account. &lt;/span&gt;&lt;span style="font-size:85%;"&gt;When you run aspnet_regiis.exe with the -ga switch, the command grants the following rights to the account: &lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;em&gt;Access to the IIS Metabase Permission to write to the %Windir%\Microsoft.NET\Framework\version\Temporary ASP.NET Files folder &lt;/em&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;em&gt;The account is also a member of the local Users group; therefore, it has read access to the \Inetpub directory tree (these directories have an ACL that grants read access to the Users group). &lt;/em&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:verdana;"&gt;Should you be using the &lt;/span&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx"&gt;&lt;span style="font-family:verdana;"&gt;XmlSerializer Class&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;, the account must also have permission to write to the temporary directory (as defined by the TEMP environment variable) in order to deserialize an object. &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-size:85%;"&gt;The article also details one of the disadvantages of using a custom account -&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;em&gt;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;em&gt;When you change the identity of your application pool to use a domain account instead of a machine account, you lose the ability to perform Kerberos authentication until a domain administrator runs the Setspn utility to create a service principal name (SPN) for the domain account. If you have multiple applications on the same server that use separate domain identities and they need to use Kerberos authentication, then you need to use separate Domain Name System (DNS) names for each application.&lt;/em&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;If your account does not have a service principal name and for some time, your web site will require authentication and user's will be prompted for a user name and password but even valid credential will not be authenticated. Should you be unable to create a service principle name, a&lt;/span&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;nother MSDN article, &lt;a href="http://support.microsoft.com/kb/215383"&gt;How to configure IIS to support both the Kerberos protocol and the NTLM protocol for network authentication&lt;/a&gt;, details how to enable/disable Kerberos authentication.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;em&gt;IIS passes the Negotiate security header when Integrated Windows authentication is used to authenticate client requests. The Negotiate security header lets clients select between Kerberos authentication and NTLM authentication. &lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-size:85%;"&gt;1. the following command, usually located in &lt;strong&gt;C:\Inetpub\Adminscripts&lt;/strong&gt; to retrieve the current &lt;/span&gt;&lt;span style="font-size:85%;"&gt;values for the &lt;strong&gt;NTAuthenticationProviders&lt;/strong&gt; metabase property:&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;strong&gt;cscript adsutil.vbs get w3svc/WebSite/root/NTAuthenticationProviders&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;em&gt;In this command, WebSite is a placeholder for the Web site ID number. The Web site ID number of the default Web site is 1.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;em&gt;This command fails if the NTAuthenticationProviders metabase property is not defined. If the Negotiate process is enabled, this command returns the following information:&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;strong&gt;NTAuthenticationProviders : (STRING) "Negotiate,NTLM" &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;em&gt;2. If the command in step 1 does not return the string "Negotiate,NTLM," use the following command to disable the Negotiate process:&lt;/em&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;strong&gt;cscript adsutil.vbs set w3svc/WebSite/root/NTAuthenticationProviders "NTLM"&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;em&gt;Repeat step 1 to verify that the Negotiate process has been disabled.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Next week, I'm going to look into how the Microsoft &lt;/span&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e90fe777-4a21-4066-bd22-b931f7572e9a&amp;amp;DisplayLang=en"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Authentication and Access Control Diagnostics 1.0 Tool&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt; could have helped solve this problem.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-4307885331994850777?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/4307885331994850777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=4307885331994850777&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/4307885331994850777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/4307885331994850777'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/10/authentication-required-with-domain.html' title='Error 401.1 when when using integrated authentication and a custom service account'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-3468382192834429968</id><published>2006-10-23T20:57:00.000+10:00</published><updated>2006-10-24T09:08:27.911+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Binding'/><title type='text'>Data Binding Child Object Properties</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;I don't know why but I always have trouble remembering the syntax to databind child object properties. When using a &lt;strong&gt;GridView&lt;/strong&gt;, a &lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.templatefield.aspx"&gt;TemplateField&lt;/a&gt; must be used to get the values from the child object as a &lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.boundfield.aspx"&gt;BoundField&lt;/a&gt; do not work correctly in this scenario. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;In order to bind to properties of a Customer object which is a property of another class, use the syntax below:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&amp;lt;%# ((Customer)Eval("Customer")).ID %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;%# ((Customer)Eval("Customer")).Name %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Note that a null customer property value will cause problems with this approach and &lt;/span&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;don't forget to add the a reference to the Customer class using the &lt;strong&gt;Import&lt;/strong&gt; directive.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&amp;lt;%@ Import namespace="MyNamespace.Customer" %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Another fiddly issue can be embedding a nested data control such as &lt;strong&gt;Repeater&lt;/strong&gt; within a &lt;strong&gt;GridView&lt;/strong&gt; column and databinding to a child object.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&amp;lt;asp:Repeater ID="rpt" runat="server" DataSource='&amp;lt;%# ((Customer)Container.DataItem).Address%&amp;gt;'&amp;gt;&lt;br /&gt;&amp;lt;ItemTemplate&amp;gt;&amp;lt;%# Container.DataItem %&amp;gt;&amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;&amp;lt;/asp:Repeater&amp;gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-3468382192834429968?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/3468382192834429968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=3468382192834429968&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/3468382192834429968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/3468382192834429968'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/10/data-binding-child-object-properties.html' title='Data Binding Child Object Properties'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-3185413622834502222</id><published>2006-10-17T19:47:00.000+10:00</published><updated>2006-10-21T17:51:28.786+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Replacing nested web.config sections using Web Deployment Projects</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;It's relatively straightforward to replace specific sections of a Visual Studio 2005 Web Site web.config using a &lt;/span&gt;&lt;a href="http://msdn2.microsoft.com/en-us/asp.net/aa336619.aspx"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Web Deployment Project&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;. Scott Guthrie has a great &lt;/span&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2005/11/06/429723.aspx"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;blog post&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt; on the Web Deployment Project feature set, but I stumbled across a minor issue today when I tried to replace the &lt;em&gt;compilation &lt;/em&gt;section.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;To replace web.config sections, open the &lt;strong&gt;Web Deployment Property Pages&lt;/strong&gt; and select &lt;strong&gt;Deployment&lt;/strong&gt; in the left hand menu. Click the checkbox to &lt;strong&gt;Enable Web.config file section replacement&lt;/strong&gt;. Whilst the &lt;strong&gt;examples&lt;/strong&gt; hyperlink shows a tooltip on how to replace the appSettings and connectionStrings sections using sectionName=filename, when I attempted to replace the &lt;em&gt;compilation&lt;/em&gt; element in the web.config, I received the following build error.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;Error 2 web.config(1): error WDP00002: missing section compilation. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;To successfully replace the compilation element or other nested elements, it's necessary to use an XPath expression. For example, &lt;strong&gt;system.web/compilation&lt;/strong&gt; as below. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger2/5500/4091/1600/WebDeploymentProject.0.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="Web Deployment Project Property Pages" src="http://photos1.blogger.com/blogger2/5500/4091/400/WebDeploymentProject.0.jpg" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-3185413622834502222?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/3185413622834502222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=3185413622834502222&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/3185413622834502222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/3185413622834502222'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/10/replacing-nested-webconfig-sections.html' title='Replacing nested web.config sections using Web Deployment Projects'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-1969568188619089132</id><published>2006-10-16T12:38:00.000+10:00</published><updated>2006-10-21T17:51:45.198+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><title type='text'>IIS Extended Logging Properties</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;Countless times, the .NET exception, &lt;span style="color:#ff0000;"&gt;The request failed with HTTP status 401: Access Denied&lt;/span&gt; dumbfounds developers. To determine under what user is trying to access a resource extend the default logging available in Internet Information Services (IIS). &lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Right click on the Web Site you want to manage.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;Click &lt;strong&gt;Properties&lt;/strong&gt; in the &lt;strong&gt;Enable Logging &lt;/strong&gt;panel of the &lt;strong&gt;Web Site &lt;/strong&gt;tab.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger2/5500/4091/1600/WebSiteProperties.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="Web Site Properties" src="http://photos1.blogger.com/blogger2/5500/4091/400/WebSiteProperties.jpg" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;Click the &lt;strong&gt;Extended Properties tab &lt;/strong&gt;and check the &lt;strong&gt;User Name (cs-username) &lt;/strong&gt;checkbox under &lt;strong&gt;Extended Properties.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger2/5500/4091/1600/ExtendedProperties.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="Extended Properties" src="http://photos1.blogger.com/blogger2/5500/4091/400/ExtendedProperties.jpg" border="0" /&gt;&lt;/a&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;Once the User Name is checked, the the windows user who is accessing the resource will be logged as below.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;02:40:00 127.0.0.1 domain\username W3SVC1 AUHDQL99 POST /TestAuthentication/Default.aspx 500&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-1969568188619089132?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/1969568188619089132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=1969568188619089132&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/1969568188619089132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/1969568188619089132'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/10/iis-extended-logging-properties.html' title='IIS Extended Logging Properties'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-2344936637045737561</id><published>2006-10-16T11:02:00.000+10:00</published><updated>2006-11-01T19:44:41.575+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Colour Your Console Apps</title><content type='html'>&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;a href="http://photos1.blogger.com/blogger2/5500/4091/1600/ConsoleColor.jpg"&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;A new feature in .NET2.0 is the ability to add colour to console applications. There's now no need to use Interop to import Kernel32.dll as was previously the case. Simply use the &lt;strong&gt;ForegroundColor&lt;/strong&gt; and &lt;strong&gt;BackgroundColor&lt;/strong&gt; properties of the &lt;strong&gt;Console&lt;/strong&gt; object to give your console apps more readability as below. Lovely !&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:Monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:teal;"&gt;Console&lt;/span&gt;&lt;span style="color:black;"&gt;.ForegroundColor = System.&lt;/span&gt;&lt;span style="color:teal;"&gt;ConsoleColor&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:black;"&gt;.Cyan;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:teal;"&gt;Console&lt;/span&gt;&lt;span style="color:black;"&gt;.BackgroundColor = System.&lt;/span&gt;&lt;span style="color:teal;"&gt;ConsoleColor&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:black;"&gt;.Magenta;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:teal;"&gt;Console&lt;/span&gt;&lt;span style="color:black;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="color:maroon;"&gt;"Hello"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:black;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color:teal;"&gt;Console&lt;/span&gt;&lt;span style="color:black;"&gt;.ForegroundColor = System.&lt;/span&gt;&lt;span style="color:teal;"&gt;ConsoleColor&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:black;"&gt;.Magenta;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:teal;"&gt;Console&lt;/span&gt;&lt;span style="color:black;"&gt;.BackgroundColor = System.&lt;/span&gt;&lt;span style="color:teal;"&gt;ConsoleColor&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:black;"&gt;.Cyan;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:teal;"&gt;Console&lt;/span&gt;&lt;span style="color:black;"&gt;.WriteLine(&lt;/span&gt;&lt;span style="color:maroon;"&gt;"Miles"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:black;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color:teal;"&gt;Console&lt;/span&gt;&lt;span style="color:black;"&gt;.ReadLine();&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;&lt;a href="http://photos1.blogger.com/blogger2/5500/4091/1600/ConsoleColor.0.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger2/5500/4091/400/ConsoleColor.0.jpg" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-2344936637045737561?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/2344936637045737561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=2344936637045737561&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/2344936637045737561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/2344936637045737561'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/10/colour-in-console-application.html' title='Colour Your Console Apps'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-1749355769593195889</id><published>2006-10-16T10:38:00.000+10:00</published><updated>2006-10-24T09:07:25.745+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>Break When an Exception is Thrown</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;A colleague of mine recently had an issue with a .NET exception that was caught in a try catch block, not reported and subsequently caused issues. Make sure you have the &lt;strong&gt;Exceptions...&lt;/strong&gt; option in the &lt;strong&gt;Debug&lt;/strong&gt; menu. If not, add it using the &lt;strong&gt;Customize...&lt;/strong&gt; option in the &lt;strong&gt;Tools&lt;/strong&gt; menu. Then, to break whenever an exception is thrown follow these simple steps -&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;On the &lt;strong&gt;Debug&lt;/strong&gt; menu, click &lt;strong&gt;Exceptions..&lt;/strong&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;In the &lt;strong&gt;Exceptions&lt;/strong&gt; dialog box, select &lt;strong&gt;Thrown&lt;/strong&gt; for Common Language Runtime Exceptions.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;It's possible to limit the exception types by expanding the tree and checking specific options. Pretty neat I thought.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://photos1.blogger.com/blogger2/5500/4091/1600/Exceptions.jpg"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger2/5500/4091/400/Exceptions.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-1749355769593195889?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn2.microsoft.com/en-us/library/d14azbfh.aspx' title='Break When an Exception is Thrown'/><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/1749355769593195889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=1749355769593195889&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/1749355769593195889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/1749355769593195889'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/10/break-when-exception-is-thrown.html' title='Break When an Exception is Thrown'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-4576464423762206756</id><published>2006-10-07T13:42:00.000+10:00</published><updated>2006-10-21T17:52:52.278+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>LINQ Project Types do not appear if VB.NET is not installed</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;I installed &lt;a href="http://msdn.microsoft.com/data/ref/linq/"&gt;LINQ (Language Integrated Query)&lt;/a&gt; earlier this week and had a bit of trouble getting going. I live in a world of C# and don't have VB.NET installed on my aging laptop at home. This caused the LINQ Preview (May 2006) installer to skip a few tasks during install and the project types that should appear in the Visual Studio New Project menu didn't appear. Well it didn't take me long to hunt this one on down MSDN forums but here's what to do if you have this problem. Remove the LINQ Preview if you've already installed it and the project types are missing or simply install using this command line from the same directory as "LINQ Preview (May 2006).msi" :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;msiexec.exe /i "LINQ Preview (May 2006).msi" VCSPROJECTTEMPLATESDIR.C7A0C9D96EB648548BD084A2A4C688EB="&lt;u&gt;C:\Program Files\Microsoft Visual Studio 8&lt;/u&gt;\Common7\IDE\ProjectTemplates\CSharp\LINQ Preview\" VCSPKGDIR.C7A0C9D96EB648548BD084A2A4C688EB="&lt;u&gt;C:\Program Files\Microsoft Visual Studio 8&lt;/u&gt;\VC#\VCSPackages\" VCSIDEDIR.C7A0C9D96EB648548BD084A2A4C688EB="&lt;u&gt;C:\Program Files\Microsoft Visual Studio 8&lt;/u&gt;\Common7\IDE\" DEBUGVISUALIZERDIR.C7A0C9D96EB648548BD084A2A4C688EB="&lt;u&gt;C:\Program Files\Microsoft Visual Studio 8&lt;/u&gt;\Common7\Packages\Debugger\Visualizers\" CSWEBPROJECTTEMPLATESDIR.4AE13B6F621C49B9995EB64016EC2E60="&lt;u&gt;C:\Program Files\Microsoft Visual Studio 8&lt;/u&gt;\Common7\IDE\ProjectTemplates\Web\CSharp\1033" CSITEMTEMPLATEDIR.92D1EB66EA714CFE9C88A25F2388CD0F="&lt;u&gt;C:\Program Files\Microsoft Visual Studio 8&lt;/u&gt;\Common7\IDE\ItemTemplates\CSharp\1033" DEVENV="&lt;u&gt;C:\Program Files\Microsoft Visual Studio 8\&lt;/u&gt;Common7\IDE\Devenv.exe" DEVENVPATH="&lt;u&gt;C:\Program Files\Microsoft Visual Studio 8\&lt;/u&gt;Common7\IDE\"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Please replace relevant Visual Studio paths (underlined) with actual Visual Studio installation path. Couldn't be simpler ;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://photos1.blogger.com/blogger2/5500/4091/1600/Linq.jpg"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger2/5500/4091/400/Linq.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-4576464423762206756?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=394734&amp;SiteID=1&amp;PageID=1' title='LINQ Project Types do not appear if VB.NET is not installed'/><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/4576464423762206756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=4576464423762206756&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/4576464423762206756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/4576464423762206756'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/10/linq-project-types-do-not-appear-if.html' title='LINQ Project Types do not appear if VB.NET is not installed'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-115941173434562447</id><published>2006-09-28T12:36:00.000+10:00</published><updated>2006-10-21T17:53:22.443+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>SQL Server Reports</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;I wrote a SQL query the other day to determine how many rows there were in each table in my database. I now realise this information is available directly using a &lt;strong&gt;Management Studio Report&lt;/strong&gt;. From SQL Server Management Studio, select the database you would like to work with from the Object Explorer. From the Database Summary page click the report button in the toolbar. There are several reports available from this drop down button but &lt;em&gt;Disk Usage Report&lt;/em&gt; is the one we want. Then expand the &lt;em&gt;Disk Space Used by Tables&lt;/em&gt; section and hey presto, there are the record counts and plenty more besides !&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/8072/148/1600/SQL%20Server%20Disk%20Usage.1.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/8072/148/400/SQL%20Server%20Disk%20Usage.0.jpg" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-115941173434562447?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/115941173434562447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=115941173434562447&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/115941173434562447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/115941173434562447'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/09/sql-server-reports.html' title='SQL Server Reports'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-115923958134816971</id><published>2006-09-26T12:54:00.000+10:00</published><updated>2006-10-21T17:53:41.122+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Additional Remote Desktop Connection</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;We're forever running short of our Remote Desktop Licenses on Windows Server 2003 which means only 2 people are able to connect to a server remotely. However, there is a third connection available remotely, the console itself. Launch remote desktop using the following command line to access the magic third connection !&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;%SystemRoot%\System32\mstsc.exe -console&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;It is worth pointing out that if anybody is physically logged onto the machine, it will log them out, though in the case of a remote data center this isn't a problem.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Also, to see which terminal server sessions are free/used, type the following in a command prompt&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;qwinsta /server:servername&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-115923958134816971?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/115923958134816971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=115923958134816971&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/115923958134816971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/115923958134816971'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/09/additional-remote-desktop-connection.html' title='Additional Remote Desktop Connection'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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-33518972.post-115923920894800688</id><published>2006-09-26T12:39:00.000+10:00</published><updated>2006-11-21T09:38:59.864+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>Predicate Pleasure</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;I've been playing around with predicates in my latest developments but had been using private members to store my find criteria as demonstrated in the dinosaur example on &lt;a href="http://msdn2.microsoft.com/en-us/library/x0b5b5bc.aspx"&gt;MSDN2&lt;/a&gt;. However, I now realise that my preferred way to use predicates is using anonymous methods as below.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;private Customer FindCustomerByName(string name)&lt;br /&gt;{&lt;br /&gt;return Customers.Find(delegate(Customer customer) { return customer.name.Equals(name); });&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;I think this is a much neater way of going about things.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Bye for now !&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;http://microsoftmiles.blogspot.com/atom.xml&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33518972-115923920894800688?l=microsoftmiles.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://microsoftmiles.blogspot.com/feeds/115923920894800688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33518972&amp;postID=115923920894800688&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/115923920894800688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33518972/posts/default/115923920894800688'/><link rel='alternate' type='text/html' href='http://microsoftmiles.blogspot.com/2006/09/predicate-pleasure.html' title='Predicate Pleasure'/><author><name>Miles Ashton</name><uri>http://www.blogger.com/profile/10708169409794517080</uri><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>
