<?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-1902158034220893892</id><updated>2012-01-24T11:00:50.036Z</updated><category term='MVC'/><category term='Velocity'/><category term='Powershell'/><category term='debugging'/><category term='Installer'/><category term='Windows 3.11'/><category term='AppFabric'/><category term='VB.NET'/><category term='beta 2'/><category term='defraggler'/><category term='msizap'/><category term='ASP.NET'/><category term='browsers'/><category term='chrome'/><category term='stackoverflow'/><category term='compression'/><category term='VBUG'/><category term='windows search'/><category term='sharepoint'/><category term='&quot;Enterprise Library&quot;'/><category term='&quot;edge ug&quot;'/><category term='&quot;book review&quot;'/><category term='DDD'/><category term='EpiCenter'/><category term='intellipoint'/><category term='devday'/><category term='LDNUG'/><category term='WinForms'/><category term='database'/><category term='web.config'/><category term='blue screen of death'/><category term='Tecra'/><category term='scalability'/><category term='OpenXML'/><category term='Office'/><category term='&quot;Visual Studio&quot;'/><category term='security'/><category term='nxtgen'/><category term='&quot;code complete&quot;'/><category term='book'/><category term='sql server'/><category term='SDK'/><category term='C#'/><category term='webdd'/><category term='Toshiba'/><category term='VirtualPC'/><category term='world tour'/><category term='software'/><category term='vNext'/><category term='IE'/><category term='NEBytes'/><category term='SQL Express'/><category term='caching'/><category term='dr'/><category term='google'/><title type='text'>Diary of a DotNet Developer</title><subtitle type='html'>Not poems and rubbish - Science!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>75</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-4226836443364008202</id><published>2011-11-18T13:28:00.001Z</published><updated>2011-11-18T15:28:14.118Z</updated><title type='text'>The Case of the Hung Visual Studio Installer</title><content type='html'>&lt;span style="font-family: Verdana, sans-serif;"&gt;(with apologies to &lt;a href="http://blogs.technet.com/b/markrussinovich/" target="_blank"&gt;Mark Russinovich&lt;/a&gt; :-) ) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;I got my shiny new work laptop on Tuesday this week, a HP EliteBook 8560P. Mmm, shiny. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;So a portion of the remainder of my week has been spent on installing things like SQL Server and other development tools on it. Until I got to Visual Studio 2010, for which the installer hung at the end of the first screen (the one where it installs Setup components before you get to choose which bits of VS you actually want to install). &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;A few details. I'm running Windows 7 Enterprise, and I was installing Visual Studio 2010 Ultimate. I was using &lt;/span&gt;&lt;a href="http://www.slysoft.com/en/virtual-clonedrive.html" target="_blank"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Virtual CloneDrive&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; to mount an ISO image of the Visual Studio DVD from a USB hard drive. All things I've done before without any issues. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;strong&gt;Thought 1: My ISO image has got subtly corrupted somehow&lt;/strong&gt;. I downloaded from MSDN a new ISO image of Visual Studio. No joy. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;strong&gt;Thought 2: There's a problem with running the installer off a mounted ISO&lt;/strong&gt;. Despite being sure I'd successfully run off a mounted ISO before, I burned a DVD and ran the installer from there. No joy. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;At this point I tweeted that I was struggling: &lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-bfQfsL7NqLE/TsZiJqOxInI/AAAAAAAAAGg/AYjUo07DdT4/s1600/VS2010InstallerHangingTweet.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="105" src="http://4.bp.blogspot.com/-bfQfsL7NqLE/TsZiJqOxInI/AAAAAAAAAGg/AYjUo07DdT4/s320/VS2010InstallerHangingTweet.png" width="320" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;I was grousing more than expecting anyone to offer advice, but I received these tweets back: &lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-3Y5fFW_4EBA/TsZjTz34XCI/AAAAAAAAAGs/G_YvqMteEaA/s1600/VS2010InstallerHangingTweetResponse.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="176" src="http://4.bp.blogspot.com/-3Y5fFW_4EBA/TsZjTz34XCI/AAAAAAAAAGs/G_YvqMteEaA/s320/VS2010InstallerHangingTweetResponse.png" width="320" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Fair enough, I'll give that a go:&lt;/span&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;strong&gt;Thought 3: It is working, I'm just not giving it long enough to work.&lt;/strong&gt; I ran the installer for at least 8 hours overnight Wednesday. No joy. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;At this point I was Googling pretty hard for issues relating to the Visual Studio hanging, but no one seemed to have had a problem at the same stage as me. It did lead to me trying &lt;/span&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;strong&gt;Thought 4: A missing Registry key&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;I added the key. No joy. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;and &lt;/span&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;strong&gt;Thought 5: The installer was trying to write temporary files to the external USB drive&lt;/strong&gt;. I copied the ISO onto the hard drive, disconnected the external USB drive and re-ran the installer. No joy. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Desperation was setting in at this point, and I began to wonder if the problem was my install order. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;strong&gt;Thought 6: Because I've installed SQL Server (and SQL Express), something in SQL Server is interfering with the install&lt;/strong&gt;. I uninstalled both instances of SQL Server 2008 and the shared components. No joy. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;strong&gt;Here comes the science bit...&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;I'd already been running SysInternals' &lt;/span&gt;&lt;a href="http://technet.microsoft.com/en-gb/sysinternals/bb896653" target="_blank"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Process Explorer&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; to try and see what was going on with the installer process but it didn't really show me enough detail. However I notioced from a discussion on the Microsoft forum someone else using &lt;/span&gt;&lt;a href="http://technet.microsoft.com/en-gb/sysinternals/bb896645" target="_blank"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Process Monitor&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;, so I fired that up instead, and filtered it so I was just looking at setup.exe. This is what I saw: &lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-fwOyXuC5CtI/TsZ4iZrhd_I/AAAAAAAAAG0/0DyRDWblIqI/s1600/ProcMon+Hung+VS2010+Installer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" hda="true" height="233" src="http://3.bp.blogspot.com/-fwOyXuC5CtI/TsZ4iZrhd_I/AAAAAAAAAG0/0DyRDWblIqI/s640/ProcMon+Hung+VS2010+Installer.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;My first thought here was: why is setup.exe trying to write files to live.sysinternals.com?, closely followed by: have I done this right or is Process Monitor somehow screwing up these results? And suddenly, in one of my occasional flashes of intuition, it clicked. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;strong&gt;The Answer&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;I have a drive mapped to &lt;/span&gt;&lt;a href="http://live.sysinternals.com/" target="_blank"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;\\live.sysinternals.com\tools&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;, and the drive that I have mapped is the I: drive. 'Cos, y'know, Internals begins with I. Turns out that the Visual Studio installer maps a folder in your %TEMP% folder to I: too and then uses it for decompressing some of the CAB files that the installer uses. Since I already had an I: drive, the installer was trying to use it but failing as I (obviously) don't have write privileges to the SysInternals folder, and the whole thing ended up in an infinite loop. I unmapped my I: drive from the SysInternals folder, re-ran the installer and everything installed successfully. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify" class="separator" style="clear: both;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Now, clearly, the set of people who a) have an I: drive mapped but b) don't have write access to it and c) need to install Visual Studio, is going to be pretty small, but at the same time I can't help feeling the installer should have handled this better. In the end it was a simple workaround for me to resolve it, but it took me too long to discover the problem. Logged on Connect at &lt;/span&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/705657."&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;https://connect.microsoft.com/VisualStudio/feedback/details/705657.&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-4226836443364008202?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/4226836443364008202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=4226836443364008202' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4226836443364008202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4226836443364008202'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2011/11/case-of-hung-visual-studio-installer.html' title='The Case of the Hung Visual Studio Installer'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-bfQfsL7NqLE/TsZiJqOxInI/AAAAAAAAAGg/AYjUo07DdT4/s72-c/VS2010InstallerHangingTweet.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-3972573755375491403</id><published>2011-11-08T17:04:00.000Z</published><updated>2011-11-08T17:06:57.252Z</updated><title type='text'>World Clocks with jClock and TimeZoneInfo</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;Everyone else seems to be writing about the clocks changing this week, I don't see why I should miss out... &lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Last year while I was working on our group intranet project, I wrote a web part for diplaying times around the world corresponding to some of our major offices. It uses the &lt;a href="http://plugins.jquery.com/project/jclock" target="_blank"&gt;jClock&lt;/a&gt; jQuery plugin so it does actually tick every second instead of being static (and in a future release I'm going to change this so it doesn't show the seconds and only ticks every minute instead). The list of locations is driven by an XML file so we can dynamically add more if we open offices in other time zones.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-fJeRb0e84iI/Tre1vcanfzI/AAAAAAAAAGE/vzQ-4dA0td8/s1600/WorldClocks.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-fJeRb0e84iI/Tre1vcanfzI/AAAAAAAAAGE/vzQ-4dA0td8/s1600/WorldClocks.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;jClock by default shows you your local time, or you can give it an offset (in decimal) from GMT/UTC if you want to display the time from a different timezone. So the XML file that we went into production with last year was along the lines of;&lt;/div&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;locations&amp;gt;&lt;br /&gt;    &amp;lt;location&amp;gt;&lt;br /&gt;        &amp;lt;name&amp;gt;London&amp;lt;/name&amp;gt;&lt;br /&gt;        &amp;lt;offset&amp;gt;0&amp;lt;/offset&amp;gt;&lt;br /&gt;    &amp;lt;/location&amp;gt;&lt;br /&gt;    &amp;lt;location&amp;gt;&lt;br /&gt;        &amp;lt;name&amp;gt;Stockholm&amp;lt;/name&amp;gt;&lt;br /&gt;        &amp;lt;offset&amp;gt;1.0&amp;lt;/offset&amp;gt;&lt;br /&gt;    &amp;lt;/location&amp;gt;&lt;br /&gt;&amp;lt;/locations&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;The serverside code in the web part then uses a HtmlTextWriter to generate a set of DIVs and a block of JavaScript that sets up jClock.&lt;/div&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &amp;nbsp;&amp;nbsp; $(document).ready(function ()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('#jclock').jclock();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('#jclockLondon').jclock({ utc: true, utc_offset: 0 });&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('#jclockStockholm').jclock({ utc: true, utc_offset: 1 });&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;h2&amp;gt;WORLD CLOCKS&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;div style="text-align: center;"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;    &amp;lt;div&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;        &amp;lt;span&amp;gt;Local time:&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;        &amp;lt;span id="jclock"&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;    &amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;    &amp;lt;div style='background-color: #F0F0F0; width: 100%;'&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;        &amp;lt;span&amp;gt;London&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;        &amp;lt;span id='jclockLondon'&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;    &amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;    &amp;lt;div&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;        &amp;lt;span&amp;gt;Stockholm&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;        &amp;lt;span id='jclockStockholm'&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;    &amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;The&amp;nbsp; two generated strings are put into a &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.pair.aspx" target="_blank"&gt;Pair&lt;/a&gt; and then cached as one object to cut down some of the work for the server. And all this was fine, until the clocks changed in the spring. I worked out the new offsets and updated the XML file on the server, so then we had;&lt;/div&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;locations&amp;gt;&lt;br /&gt;    &amp;lt;location&amp;gt;&lt;br /&gt;        &amp;lt;name&amp;gt;London&amp;lt;/name&amp;gt;&lt;br /&gt;        &amp;lt;offset&amp;gt;1.0&amp;lt;/offset&amp;gt;&lt;br /&gt;    &amp;lt;/location&amp;gt;&lt;br /&gt;    &amp;lt;location&amp;gt;&lt;br /&gt;        &amp;lt;name&amp;gt;Stockholm&amp;lt;/name&amp;gt;&lt;br /&gt;        &amp;lt;offset&amp;gt;2.0&amp;lt;/offset&amp;gt;&lt;br /&gt;    &amp;lt;/location&amp;gt;&lt;br /&gt;&amp;lt;/locations&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;When the clocks changed again last week, I realised that this was going to be unsustainable and needed reworking. My first thought was to add a set of dates to the XML that denoted when to switch between winter and summer times. I coded this up, tested it, and checked it in, thinking I was done. Until it was pointed out to me that not everyone changes their clocks on the same date.&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;With a steer from &lt;a href="https://twitter.com/#%21/gustaflidvall" target="_blank"&gt;Gustaf&lt;/a&gt;, I looked into the &lt;a href="http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx" target="_blank"&gt;System.TimeZoneInfo&lt;/a&gt; class. Now I wish I'd looked at this last year...&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;To get an instance of the TimeZoneInfo class, you call the static method FindSystemTimeZoneById and pass it the string Id of the timezone you want e.g. 'GMT&amp;nbsp;Standard&amp;nbsp;Time'. You can see all the timezones that your system supports by calling GetSystemTimeZones, which returns a ReadOnlyCollection of all the timezones Windows knows about. Each timezone has an id but also a DisplayName e.g. ' - it's the DisplayName that you see if you go into the Control Panel to change your system's timezone:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-FexbPWZBOBw/TrlaO-nRPiI/AAAAAAAAAGM/nMA3fFLq-q0/s1600/TimeZoneInfo+DisplayName.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="179" src="http://3.bp.blogspot.com/-FexbPWZBOBw/TrlaO-nRPiI/AAAAAAAAAGM/nMA3fFLq-q0/s320/TimeZoneInfo+DisplayName.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;The id is constant across all installations of Windows, however the Displayname is localised - this was an important point for me as our intranet runs on servers in Sweden. For our World Clocks web part, the key function of TimeZoneInfo is GetUTCOffset. This takes a DateTime parameter which allows you to calculate the UTC offset for any given timezone on any given date. The key point is that this automatically factors in daylight savings times e.g. British Summer Time. I'd expected British Summer Time (or equally Central European Summer Time) to be listed as separate timezones, but they aren't, the timezone knows when it should apply changes for daylight savings e.g.&lt;/div&gt;&lt;br /&gt;&lt;pre style="background: white; color: black; font-family: Consolas;"&gt;&lt;span style="color: #2b91af;"&gt;TimeZoneInfo&lt;/span&gt;&amp;nbsp;info&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;TimeZoneInfo&lt;/span&gt;.FindSystemTimeZoneById(&lt;span style="color: #a31515;"&gt;"GMT&amp;nbsp;Standard&amp;nbsp;Time"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"Id:&amp;nbsp;{0}&amp;nbsp;-&amp;nbsp;DisplayName:&amp;nbsp;{1}"&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; "&gt;info.Id,info.DisplayName));&lt;br /&gt;&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"Summer&amp;nbsp;offset&amp;nbsp;is&amp;nbsp;{0}"&lt;/span&gt;,&amp;nbsp;&lt;/pre&gt;&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; "&gt;info.GetUtcOffset(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;DateTime&lt;/span&gt;(2011,5,7))));&lt;br /&gt;&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"Winter&amp;nbsp;offset&amp;nbsp;is&amp;nbsp;{0}"&lt;/span&gt;,&amp;nbsp;&lt;/pre&gt;&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; "&gt;info.GetUtcOffset(&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;DateTime&lt;/span&gt;(2011,11,7))));&lt;br /&gt;&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.ReadLine();&lt;/pre&gt;&lt;br /&gt;produces&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-eIQa7nq7B4w/TrleA8fAqjI/AAAAAAAAAGU/d-X1mUTE_vo/s1600/GMT+Offsets.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="89" src="http://1.bp.blogspot.com/-eIQa7nq7B4w/TrleA8fAqjI/AAAAAAAAAGU/d-X1mUTE_vo/s640/GMT+Offsets.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;One of my colleagues asked what will happen if the rules for a given timezone change e.g. suppose the UK changes the dates on which the clocks change. The answer is this is now Microsoft's problem instead of mine, all the timezone information is held in the Registry and if any timezone changes, Microsoft will release a Windows Update that contains the new information.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;So I've got rid of an annoying manual job in changing the XML twice a year, and the XML itself is much simpler because now for each location all it needs is a name, and a timezone id. Simples.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-3972573755375491403?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/3972573755375491403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=3972573755375491403' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/3972573755375491403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/3972573755375491403'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2011/11/world-clocks-with-jclock-and.html' title='World Clocks with jClock and TimeZoneInfo'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-fJeRb0e84iI/Tre1vcanfzI/AAAAAAAAAGE/vzQ-4dA0td8/s72-c/WorldClocks.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-4666537184085425498</id><published>2011-06-10T15:10:00.000+01:00</published><updated>2011-06-10T15:10:02.081+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='DDD'/><title type='text'>Guathon 2011</title><content type='html'>&lt;span style="font-family: Verdana, sans-serif;"&gt;Monday this week saw this years Guathon in London, a day of technical presentations from St Scott of Guthrie, ably assisted this year by Steve Sanderson. The event is free and held in a cinema - now I know how big I want my next monitor to be :-) Unfortunately, due to Microsoft's lack of organisation in changing the venue at the last minute, there were lots of empty seats and many more developers could have attended. This year Scott did the first and last sessions, with Steve covering the late-morning/early-afternoon shifts.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;strong&gt;Build An App Using ASP.NET MVC 3, EF Code First, NuGet, and IIS&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;/b&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;The first session (which due to National Express East Anglia's incompetence I missed the start of) was Scott covering some of the features of MVC3/Razor and Code-First Entity Framework. This was probably the session I got the most out of all day, as I haven't done any MVC/EF in anger yet there was a lot of value here for me. Key points I took away were:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Razor syntax&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;@ - starts a code block&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;@:&amp;nbsp; - is the prefix for a string literal e.g. if you want to output some HTML inside a code block&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;There is detection for the @ symbol inside an email address that means it automatically renders a mailto: link&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;@@ - acts as an escape character&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;@helper - one of the biggest things for me, I've never seen this before. @helper allows you to write a helper method that acts like a method but with Razor syntax so you can call the helper to display a canned piece of HTML. Helpers can be declared in-line or in a partial class within the App_Code folder. Scott also mentioned that &lt;/span&gt;&lt;a href="http://blog.davidebbo.com/"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;David Ebbo&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; (&lt;/span&gt;&lt;a href="http://twitter.com/davidebbo"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;@davidebbo&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;) has a project on his website that allows you to write helpers that are compiled into an assembly. It's actually now on CodePlex at &lt;/span&gt;&lt;a href="http://razorgenerator.codeplex.com/"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;http://razorgenerator.codeplex.com/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;@model -By default the Model variable in a page is of the dynamic type, which means at design-time you don't get (much) Intellisense from it, however an @model declaration at the top of the page allows you to specify the exact type of Model, and you then get proper Intellisense support. If you create the View as a strongly-typed view and select the concrete type the View will support, it puts an @model declaration in for you.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;_ViewStart.cshtml - Allows you to setup defaults for a set of views, including setting the _Layout.cshtml page. Someone asked whether you can have multiple _ViewStarts, Scott didn't know but was surprised when someone else said that you can. Gunnar Peipman's &lt;/span&gt;&lt;a href="http://weblogs.asp.net/gunnarpeipman/archive/2010/10/10/asp-net-mvc-3-beta-view-start-files-for-razor-view-engine.aspx"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;blog&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; makes this clear - a _ViewStart is scoped to the folder that it is in.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;_Layout.cshtml - The Razor equivalent of an ASP.NET Master page.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/font&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Scott also showed off a couple of tools:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.modernizr.com/"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Modernizr.js&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; - allows you to detect which HTML5 and CSS3 features are supported on the browser instead of detecting these from the User-Agent string. Scott also showed off some HTML5 features in his demos, to which somebody asked if you could use those outside Razor. Scott's reply? "Yes, you can open your project and start typing the HTML5 tags" :-)&lt;/span&gt;&lt;br /&gt;&lt;a href="http://getglimpse.com/"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Glimpse&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; - "FireBug for your server" is the best description of this tool. It shows you on the client what is happening on your server, how your server is configured. And I confess I'm pleased to see this is currently available for ASP.NET only, I'd assumed it was something other frameworks had had for a while but it seems not.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/font&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;strong&gt;Dynamic Web UIs with Knockout.js&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;Steve's first session covered Knockout.js, an MVVM framework that works with any JSON feed. I think I may have misunderstood the principle behind this, it seemed to me to be largely another jQuery templating framework, although looking on the website it says that you can use your choice of templating engine. Talking to others in the evening though, there seem to be other concerns around Knockout - lack of testability and accessibility were the principal ones, and no degradation support means for me I'm unlikely to use Knockout. Plus I'm primarily a server-side guy - I can do some jQuery but right now I don't have the bandwidth to learn another JavaScript framework.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/font&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;strong&gt;C#5 and Asynchronous Web Applications&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;After lunch Steve was on again, demoing some of the asynchronous bits that are coming in C#5. Steve talked about polling, long polling and sockets. The difference between these is as follows (I've probably got these wrong, if I have someone please tell me so I don't look a complete Muppet):&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;polling - call a service at a regular interval e.g. every second, the service returns any changes made since the last call.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;long polling - call a service, the call doesn't return until the service has some data to return to the client, however long this takes.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;sockets - opens a channel between the caller and a service and the service then returns data to the client whenever it has any, keeping the channel open.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Of these sockets is the best, however there is currently limited support for it on browsers so we won't see this go mainstream for a little while yet.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;strong&gt;Cloud Development&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;The last session of the day saw Scott back on the podium talking about developing for the cloud and Windows Azure. Scott has recently taken on management of the Azure team, although this was badly publicised as it sounded like Scott had moved away from ASP.NET and all the other things he was managing - this is not so, he's still in charge of ASP.NET and everything else, the Azure stuff is &lt;i&gt;in addition to&lt;/i&gt;, not &lt;i&gt;instead of&lt;/i&gt;. Scott talked about and showed off a lot of the infrastructure behind Azure, including fun facts like:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;the ratio of servers to staff in the data centres is 15 000:1&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;the centres are constructed from containers&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;the newer containers they are deploying don't have roofs which saves a lot of energy on cooling&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;for every watt of energy that powers a server, they only use an additional 0.1 of a watt on ancillary usage such as heating/cooling etc&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;This gives you a much lower TCO when you use services in the cloud, however Scott came out with the quote of the day when talking about this:&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;strong&gt;"Developers don't care about money, we just care about developing cool stuff."&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;Employers, take note...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/font&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;Scott demo'ed developing an ASP.NET application to be hosted in the cloud and showed the steps necessary to set this up. I was interested to hear that there is/will be a PowerShell commandlet for deploying solutions to your Azure setup.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/font&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;Scott showed off some forthcoming technology on Azure, a Queuing service allowing you to de-couple parts of your business processes, which was interesting and made me wonder whether Microsoft might be thinking of putting some of the BizTalk infrastructure in the cloud. This would be a big win, I think, in terms of making BizTalk a more accessible technology and getting more take-up - we looked at BizTalk for a project a couple of years ago but the costs for setting up BizTalk on-site are currently prohibitive.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif; font-size: small;"&gt;Scott presented&amp;nbsp;a mini-case study on EasyJet - they host their applications in the cloud and then connect to them in airports using local WiFi, which saves them money on having to setup infrastructure in every airport they operate in. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Scott touched on the Azure AppFabric caching service, which I'm interested to know more about - I'm still fuzzy on the benefits. The throughput rate for the caching service is 4Tb/s - not too shabby. Scott also mentioned, almost, as my old German teacher would say, &lt;em&gt;en passant&lt;/em&gt;, that Microsoft will shortly be rolling out a Content Delivery Network service on the Azure infrastructure, which is something I find really exciting. But maybe I'm just sad that way...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Thanks to Scott and Steve for presenting, &lt;/span&gt;&lt;a href="http://weblogs.asp.net/Plip/"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Phil&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; and &lt;/span&gt;&lt;a href="http://blogs.ipona.com/davids/default.aspx"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Dave&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; for organising it all, and &lt;/span&gt;&lt;a href="http://paulstack.co.uk/blog/"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Paul&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;, &lt;/span&gt;&lt;a href="http://designcoderelease.blogspot.com/"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Nathan&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;, &lt;/span&gt;&lt;a href="http://twitter.com/#!/johanbarnard"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Johan&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; and &lt;/span&gt;&lt;a href="http://tiwtter.com/danstuken"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Dan&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; for the conversation over dinner at TGIs!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-4666537184085425498?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/4666537184085425498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=4666537184085425498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4666537184085425498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4666537184085425498'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2011/06/guathon-2011.html' title='Guathon 2011'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-4665392077831044164</id><published>2011-02-17T13:58:00.000Z</published><updated>2011-02-17T13:58:54.959Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='&quot;Visual Studio&quot;'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Making a Hybrid Web Application Project Type</title><content type='html'>&lt;span style="font-family: Verdana, sans-serif;"&gt;Like so many of my blog entries, I've been meaning to write this one for weeks. Ever since Scott Hanselman wrote &lt;/span&gt;&lt;a href="http://www.hanselman.com/blog/IntegratingASPNETMVC3IntoExistingUpgradedASPNET4WebFormsApplications.aspx"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Integrating ASP.NET MVC 3 into existing upgraded ASP.NET 4 Web Forms applications&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;, in fact. Scott just wrote &lt;/span&gt;&lt;a href="http://www.hanselman.com/blog/CreatingANuGetPackageIn7EasyStepsPlusUsingNuGetToIntegrateASPNETMVC3IntoExistingWebFormsApplications.aspx"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;an updated post&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; on using NuGet to bring the MVC bits into a WebForms application, which is a muc easier way to do it. But to me, Scott's still missing the final piece of the puzzle which is: do this once, create it a &lt;em&gt;project type&lt;/em&gt; from it, and forget about it.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;So, creating a hybrid project type. First of all, &lt;/span&gt;&lt;a href="http://www.hanselman.com/blog/CreatingANuGetPackageIn7EasyStepsPlusUsingNuGetToIntegrateASPNETMVC3IntoExistingWebFormsApplications.aspx"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;go do Scott's NuGet stuff&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; and create your hybrid application. Oh, and add any of your other favourite references - NHibernate, CastleWindsor, whatever. It's OK, I'll wait.&lt;/span&gt; &lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;/span&gt;&amp;nbsp; &lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Done that. Good.&lt;/span&gt; &lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;/span&gt;&amp;nbsp; &lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Now click File|Export Template... and open the Export Template Wizard. Check the 'Project Template' radio button so we export the hybrid project as a template. Click Next.&lt;/span&gt; &lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;/span&gt;&amp;nbsp; &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-A4plKOiQjP0/TV0XsX4-87I/AAAAAAAAAFo/TF3hZt23I_c/s1600/ETWScreen1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="313" j6="true" src="http://4.bp.blogspot.com/-A4plKOiQjP0/TV0XsX4-87I/AAAAAAAAAFo/TF3hZt23I_c/s400/ETWScreen1.png" width="400" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;On the second screen, enter a suitable name for the project type and description, and choose an icon if you want.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-pkwE6rYvAbY/TV0X7qVooiI/AAAAAAAAAFs/l10cuOkTQcs/s1600/ETWScreen2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="313" j6="true" src="http://2.bp.blogspot.com/-pkwE6rYvAbY/TV0X7qVooiI/AAAAAAAAAFs/l10cuOkTQcs/s400/ETWScreen2.png" width="400" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Click Finish and you're done!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-NoZY4a3h8uA/TV0YZihc6bI/AAAAAAAAAFw/OP05LtG6MuA/s1600/NewProjectWithHybridApplication.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="276" j6="true" src="http://1.bp.blogspot.com/-NoZY4a3h8uA/TV0YZihc6bI/AAAAAAAAAFw/OP05LtG6MuA/s400/NewProjectWithHybridApplication.png" width="400" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-4665392077831044164?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/4665392077831044164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=4665392077831044164' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4665392077831044164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4665392077831044164'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2011/02/making-hybrid-web-application-project.html' title='Making a Hybrid Web Application Project Type'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-A4plKOiQjP0/TV0XsX4-87I/AAAAAAAAAFo/TF3hZt23I_c/s72-c/ETWScreen1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-4958879183332789084</id><published>2011-01-30T22:48:00.001Z</published><updated>2011-01-30T22:49:29.901Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='DDD'/><title type='text'>What's A DDD9?</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;Some of my (non-geek) colleagues who follow &lt;a href="http://twitter.com/philpursglove"&gt;me&lt;/a&gt; on Twitter have asked me recently: what's a DDD9? The answer: for the UK .net community, it's the major event of the year. Held annually at Microsoft's offices in Reading, it is a free one-day conference run totally by the community. The DDD stands for Developer Developer Developer, from Steve Ballmer's chant of several years ago (&lt;a href="http://www.youtube.com/watch?v=8To-6VIJZRE"&gt;http://www.youtube.com/watch?v=8To-6VIJZRE&lt;/a&gt;) *. Microsoft employees are welcome to attend, but they aren't allowed to speak. It is only advertised through word-of-mouth and Twitter: this year it sold out 350 spaces in 12 minutes, the waiting list for spaces was full after another 30 minutes. You may find this slightly more notable as DDD is held on a Saturday, which ensures that the people who are there are the kind of passionate people who are prepared to give up a large part (or in many cases the entirety) of their weekend to attend. The programme is completely voted for by the attendees, this year there was again a great mix of &lt;i&gt;technical&lt;/i&gt; and &lt;i&gt;technique&lt;/i&gt; sessions. The sessions I saw this year were:&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;.net Collections Deep Dive - &lt;a href="http://twitter.com/garyshort"&gt;Gary Short&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Actually I wanted to see all four talks in the first session, but I picked Gary's as I don't think I've ever seen him talk before. This was a session going through many of the Collection classes available in .net, how they work internally and in what circumstances each one offers better performance. It included such gems as the fact that in the multithreaded collections if you call the Count property it is not guaranteed to be accurate unless you can be sure all threads have exited. In which case it wouldn't be, y'know, multithreaded. The top tip I took away was that if you know how many elements you are going to put in a collection, to set the Capacity in the initialiser:&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;List&lt;string&gt; myListOfTenElements = new List&lt;string&gt;(10);&lt;/string&gt;&lt;/string&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;CQRS, Fad or Future - &lt;a href="http://twitter.com/ICooper"&gt;Ian Cooper&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;OK, so I, um, didn't actually see this session, I got chattinjg to people in the speakers lounge. The presence of chocolate and raspberry cheesecake brownies (made by me) was a total coincidence. This was still quite useful as I was able to talk to &lt;a href="http://twitter.com/davesussman"&gt;Dave Sussman&lt;/a&gt; about a CSS issue I'd been having and get some advice. However I look forward to seeing Ian's slides and maybe catching this talk at a user group sometime.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;A Primer on RavenDB - &lt;a href="http://twitter.com/robashton"&gt;Rob Ashton&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;One of the sessions I really wanted to see as I'm interested in playing with RavenDB and I can see cases in WSP where it could be a very good technical fit. Rob is quite opinionated, especially on how MongoDB and RavenDB differ. Rob recommends getting the unstable version of RavenDB to play with so you can see the features, although I think at least initially I'll be using the stable build until I've found my feet with it. One of the things I'm most impressed with is the fact that for unit testing purposes, you can run RavenDB completely in memory with no impact to disk.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Is Your Code SOLID - &lt;a href="http://twitter.com/NathanGloyn"&gt;Nathan Gloyn&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;This talk walked through the SOLID principles of software engineering.Nathan began with a pretty ropey bit of code, and then talked through each principle before demonstrating how the code changed after the application of the principle. A really interesting session for me, SOLID is something I need to think about more as I write software.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;CSS Is Code - &lt;a href="http://twitter.com/helephant"&gt;Helen Emerson&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Helen's theme was that CSS code is as important as application source code, but that the rules and principles we apply to source code aren't often applied to CSS. Probably not the right session for me given that I'm a total numpty where CSS is concerned, although it was useful to see that in Helen's demos there were things that chimed with some of the CSS we used on the Intranet last year.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;A Beginner's Guide to Continuous Integration - &lt;a href="http://twitter.com/stack72"&gt;Paul Stack&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;A great session to round off the day from Paul Stack, talking about how to use CI to reduce the time it takes to release your software. Like RavenDB, CI is something I definitely want to look into, in fact in that respect it was a shame it was a Saturday as I was fired up enough that I wanted to go straight into the office and set up a CI server. The only real negative in this session for me was that there was little discussion of how to set up CI with TFS, although Paul tells me this is straightforward.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;The Social Network&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;There's much more to DDD than just a technical conference - for many if not all of the delegates it is as much a social event as a learning opportunity. It's a chance to catch up with old friends, make new ones, or just an opportunity to put faces to Twitter handles - I've been chatting with Nathan and Paul on Twitter for months but Saturday was the first time I'd met them. And the socialising continues into the evening - there is a Geek Dinner after the conference, at which 40 of us take over most of Pizza Express to eat, drink and chat. &lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;We had an interesting conversation at our end of the table about the nature of developers and DDD and why it seems to work for us but no-one else. There simply doesn't seem to be any other profession that does events like this - even inside IT, there's no equivalent event for IT Pros.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;* I did discover through the power of Google an alternative DDD9 conference - &lt;a href="http://www.google.co.uk/url?sa=t&amp;amp;source=web&amp;amp;cd=2&amp;amp;ved=0CB4QFjAB&amp;amp;url=http%3A%2F%2Fwww.dur.ac.uk%2Ftheology.religion%2Fabout%2Fevents%2F%3Feventno%3D4488&amp;amp;rct=j&amp;amp;q=ddd9%20death&amp;amp;ei=9-lFTZ_BOZOxhQfamIGzAQ&amp;amp;usg=AFQjCNGoIcKTzmNWoA1K4L1Ao2eJdPj5UA&amp;amp;cad=rja"&gt;Death, Dying and Disposal&lt;/a&gt;. Which doesn't sound anything like as much fun.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-4958879183332789084?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/4958879183332789084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=4958879183332789084' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4958879183332789084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4958879183332789084'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2011/01/whats-ddd9.html' title='What&apos;s A DDD9?'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-7347599738071262771</id><published>2010-12-23T15:18:00.000Z</published><updated>2010-12-23T15:18:54.799Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>switch vs Select Case</title><content type='html'>&lt;span style="font-family: Verdana, sans-serif;"&gt;I knew if I looked long enough, I'd find something you can do in VB.NET that you can't do in C#. And I &lt;em&gt;think&lt;/em&gt; I just found it.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Consider this bit of markup:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Why is it not possible to use an existing approved supplier?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;lt;asp:radiobutton id="ClientNominatedRadioButton" runat="server" text="Nominated/named by client" GroupName="NewSupplierReasonRadioButtonGroup" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;lt;asp:radiobutton id="AlreadyOnSiteRadioButton" runat="server" text="Already on site" GroupName="NewSupplierReasonRadioButtonGroup" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;lt;asp:radiobutton id="NewLocationRadioButton" text="New location and no existing supplier" runat="server" GroupName="NewSupplierReasonRadioButtonGroup" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;lt;asp:radiobutton id="OtherRadiobutton" runat="server" text="Other (please state)" GroupName="NewSupplierReasonRadioButtonGroup" runat="server" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;At some point, I'll want to examine this set of radio buttons to deduce which one is selected. In VB.NET, I would normally do this with a Select Case construct, viz.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Select Case True&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case ClientNominatedRadioButton.Checked&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case AlreadyOnSiteRadioButton.Checked&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case NewLocationRadioButton.Checked&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Case OtherRadiobutton.Checked&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;End Select&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;which I always think is a more elegant construct than a thousand 'if...then...else if...then..else if' blocks.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;But it seems this construct is not available in C# - here's a screenshot from Visual Studio:&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3XWsi_HTCuw/TRNnIkHGJFI/AAAAAAAAAFc/xBFrzj4Wvcs/s1600/BrokenSwitch.png" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" n4="true" src="http://4.bp.blogspot.com/_3XWsi_HTCuw/TRNnIkHGJFI/AAAAAAAAAFc/xBFrzj4Wvcs/s320/BrokenSwitch.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;The tooltip for the red squiggly reads 'Code is unreachable. A constant value is expected'. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;/span&gt;&amp;nbsp; &lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;All of which leaves me slightly confused. If they compile down to the same bytecode then why does this approach work in only one language? And is there a more elegant way to determine the selected radiobutton than the aforementioned 'if...then' block?&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-7347599738071262771?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/7347599738071262771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=7347599738071262771' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/7347599738071262771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/7347599738071262771'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/12/switch-vs-select-case.html' title='switch vs Select Case'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3XWsi_HTCuw/TRNnIkHGJFI/AAAAAAAAAFc/xBFrzj4Wvcs/s72-c/BrokenSwitch.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-2900768741895806090</id><published>2010-10-26T13:23:00.001+01:00</published><updated>2010-10-26T13:23:26.361+01:00</updated><title type='text'>Twenty Top 2010 Tips</title><content type='html'>Placeholder&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-2900768741895806090?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/2900768741895806090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=2900768741895806090' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2900768741895806090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2900768741895806090'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/10/twenty-top-2010-tips.html' title='Twenty Top 2010 Tips'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-8459887449429608785</id><published>2010-08-25T10:58:00.001+01:00</published><updated>2010-08-25T11:07:58.943+01:00</updated><title type='text'>DateTime.DaysInMonth</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;I stumbled upon this yesterday and thought it was worth publicising a bit.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;I'm writing a tidgy little app that will take a load of data about our press releases out of one of our databases and turn into flat HTML files. It needs to write separate files for years and months - years are easy as it's just a &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;for&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt; loop, and months are also a &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;for&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt; loop, but I need to know the end date for each month so I can create the appropriate SQL query. I'd written a &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;switch&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt; block to calculate the last day of the month:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;for (int i = 1; i &amp;lt; 13; i++)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DateTime startDate = new DateTime(int.Parse(year), i, 1, 0, 0, 0);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DateTime endDate;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;switch (i)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 9, 4, 6, 11:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;endDate = new DateTime(int.Parse(year), i, 30, 23, 59, 59);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 2:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;endDate = new DateTime(int.Parse(year), i, 28, 23, 59, 59);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// TODO: Leap years&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;endDate = new DateTime(int.Parse(year), i, 31, 23, 59, 59);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;But further down in my code, I was doing something else with the DateTime class and I spotted it has a DaysInMonth function. You give it a year and a month (both ints), and it calculates the number of days in the month for you, and deals with the leap years that I hadn't got round to doing. Which means I can collapse my &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;for&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt; down to:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;for (int i = 1; i &amp;lt; 13; i++)&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DateTime startDate = new DateTime(int.Parse(year), i, 1, 0, 0, 0);&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;DateTime endDate&amp;nbsp;= new DateTime(int.Parse(year), DateTime.DaysInMonth(int.Parse(year), i), 30, 23, 59, 59);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Smaller code for the win!&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;EDIT: I just looked &lt;a href="http://msdn.microsoft.com/en-us/library/system.datetime.daysinmonth(v=VS.100).aspx"&gt;DaysInMonth&lt;/a&gt; up on MSDN and I'm surprised to discover it's been in the Framework since .NET 1.0!&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-8459887449429608785?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/8459887449429608785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=8459887449429608785' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/8459887449429608785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/8459887449429608785'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/08/datetimedaysinmonth.html' title='DateTime.DaysInMonth'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-8096655985144727868</id><published>2010-08-14T19:33:00.001+01:00</published><updated>2010-08-14T19:48:12.343+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='devday'/><title type='text'>A Good Day</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;Yesterday had an inauspicious start when the alarm went at 6am. I woke my wife up (again) when getting dressed. And when I got to the station I didn't have time to go to the shop and get a paper to read on the train.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;But then...&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;The ticket inspector had an unexpected sense of humour.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;A totally hot woman sat next to me on the train. &lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;I wrote a StackOverflow &lt;a href="http://stackoverflow.com/questions/3474275/checking-hidden-field-is-empty-or-not/3474313#3474313"&gt;answer&lt;/a&gt; on the hateful editor on my phone.&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;And it was accepted.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Getting off the train I bumped into an ex-colleague I haven't seen for four or five years.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;I got to spend the whole day getting my geek on watching ScottGu present on VS2010, ASP.NET 4, EF4 and MVC...&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Amusingly, as I was waiting outside the cinema an American girl walked past and I heard her say 'must be a premiere' - I wonder how she'd have reacted if I'd told her we were all waiting to see a man from Microsoft...&lt;br /&gt;&lt;br /&gt;VS2010 and ASP.NET 4&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;The first session was on what's in VS2010 and ASP.NET 4. As I've been using VS2010 since April I wasn't sure just how much I'd get from this session - the answer was, obviously, loads.&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;I've already been using the HTML snippets, but now I know that there's a setting where I can turn off the requirement for an angle bracket before VS offers to complete the tag for me. What I didn't know is that there's a set of snippets for JavaScript as well. And a &lt;a href="http://jquerysnippets.codeplex.com/documentation?referringTitle=Home"&gt;set for jQuery&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;We all learned that Scott doesn't like regions round his privates - cue much sniggering, I'm not sure it means quite the same thing in the States. But the learning point was that if you like regions done one way and your team mate prefers another, you can have regions that are private to you and won't show up when your colleague opens the file in VS. Ctrl + M, Ctrl + K is the keystroke to create one of these.&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Someone asked if there's a way to label these regions, to which the answer is no, however someone else pointed out that if you put a comment at the top of the region, it can work as a label when you hover over the collapsed region.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;I picked up a &lt;i&gt;bundle&lt;/i&gt; of new shortcut keys. &lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Collapse all regions - Ctrl + M, Ctrl + O&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Incremental Search - Ctrl + I&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Navigate files - Ctrl + Alt + Down Arrow&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Navigate to - Ctrl + ,&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;View Call Hierarchy - Ctrl + K, Ctrl + T&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;Scott demoed some of the debugging features in VS2010, including pinning of watched variables, conditional breakpoints where the debugger only stops on a certain Boolean condition. And trace points, which allow you to write debugging messages to a TraceListener - optionally you can also continue executing your code, which neatly handles debugging a multi-threaded situation where breaking into the debugger hides the bug you're actually trying to find (&lt;a href="http://en.wikipedia.org/wiki/Uncertainty_principle#Uncertainty_principle_and_observer_effect"&gt;the Heisenberg uncertainty principle&lt;/a&gt; in action!). &lt;br /&gt;Scott showed how to use the ASP.NET Routing module in WebForms (the same one as used in ASP.NET MVC), and also showed off some of the deployment features, especially the Transforms which allow you to generate custom web.config files for different environments. Scott also told us that in the next couple of weeks there will be a new hosting gallery appearing on http://asp.net, which will allow you to search for a web host based on features they support. &lt;br /&gt;&lt;br /&gt;MVC2 &amp;amp; EF4&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;I've seen a number of sessions in the last year on MVC and Entity Framework, but this was the first time I actually felt I was starting to 'get' it. I should have Scott sat next to me at work, think how much more productive I'd be!&lt;br /&gt;Due to popular demand (and some well-publicised issues with the registration system for the day), Scott built a system based around developer events. For this session Scott started with a database, and built an entity model from it, then showed some of the features in MVC for displaying and editing data from the model. Highlights for me were the ease of allowing client-side validation - &amp;lt;% HTML.EnableClientValidation %&amp;gt;. That's it, one line of code!I was also very impressed with the scaffolding feature that allows you to build an editor page really quickly for a model. Whereas previously, you'd have written something like &amp;lt;% Html.TextBoxFor(fieldname) %&amp;gt; and the page will output a text-type INPUT tag (where field name is a string value), you can use the scaffolding to say &amp;lt;% Html.EditorFor(fieldname) %&amp;gt;, and the page will output a field appropriate to the data type of the field - a textbox for a string field, a checkbox for a Boolean field etc. And you can take this a level further - if you write &amp;lt;% Html.EditorFor(model) %&amp;gt;, ASP.NET iterates over the class and outputs the set of controls necessary to display and edit all the fields in the class - seriously cool.&lt;br /&gt;In a large application, the number of controllers and views can grow so large as to make it difficult to pick a particular one out of the clutter, so Scott demonstrated how you can split an application up into Areas which allow you to group sets of controllers and views together to make it more manageable. Finally in this session Scott showed off some of the unit testing features. This included the gems that the 'Do you want to create unit tests' dialog when you create a new project is referred to as the 'Guilt' dialog, and the 'No I don't want to create unit tests' radio button is known as the 'I suck' button.&lt;br /&gt;&lt;br /&gt;Windows Phone 7&lt;br /&gt;After lunch, Scott took a (well-deserved) break and handed over to &lt;a href="http://blogs.msdn.com/b/mikeormond/"&gt;Mike Ormond&lt;/a&gt; to talk about Windows Phone 7. There are two programming models available for WP7, one in Silverlight and one in XNA. The Silverlight model should be used for event-driven type applications, the XNA one is more suited for time-driven apps e.g. game. However both types of apps can use features from the other if necessary. Mike also talked about how applications are distributed to a device, however what wasn't completely clear to me was how, as a corporate developer, if I write an app to be used internally to the company, I distribute the app and whether or not I have to release it to the marketplace. I was, mostly, quite intrigued about the platform as a whole - maybe later in the year I'll look more closely into developing for it.&lt;br /&gt;&lt;br /&gt;Web Futures&lt;br /&gt;The final session saw Scott back and talking about a number of the things that should be released by Microsoft later in the year, including IIS Express, MVC3, code-first Entity Framework and Razor. Of these, the ones that interested me most are IIS Express, and code-first EF. IIS Express I'm looking forward to as it will allow us to locally test our SSL pages (it comes with a local certificate). Code-first EF was interesting, although having not done any EF work I don't really know how much difference it would make. Similarly with Razor, I haven't done any MVC so I couldn't really appreciate the differences. Finally Scott showed off some TDD and in ten minutes explained Dependency Injection. I've been reading odd bits around DI over the last year, but I can honestly say I picked up more in that ten minutes than I did over the preceding 12 months!&lt;br /&gt;&lt;br /&gt;And then we went to the pub with Scott to interrogate him, in which:&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;I learned that Dependency Injection and Inversion of Control are (more or less) the same thing.&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;We were all amazed at how much of Microsoft ScottGu runs. &lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;I learned the year the HTML 4 spec was ratified, though Dave Sussman says I can't tell anyone this.&lt;br /&gt;&lt;br /&gt;It was A Good Day.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-8096655985144727868?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/8096655985144727868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=8096655985144727868' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/8096655985144727868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/8096655985144727868'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/08/good-day.html' title='A Good Day'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-5819251109810491602</id><published>2010-08-12T17:48:00.000+01:00</published><updated>2010-08-12T17:48:32.367+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='&quot;Enterprise Library&quot;'/><title type='text'>Data does not exist in the namespace Microsoft.Practices.EnterpriseLibrary</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;I started to build a new application this afternoon. It's nothing complicated, it just needs to read all the data for the forum on our Intranet and write it into flat files so we can archive it somewhere on our new improved Intranet. I fired up Visual Studio and knocked up a UI - basically it has a Start button and a number of progress bars. Switching to the code, I added a reference to the Enterprise Library 4.1 Data Access Application Block and wrote some code to read the data. Having got to the first point where I wanted to check that things were going more or less as I wanted them, I hit F5 to build and run the application.&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;The type or namespace name 'Data' does not exist in the namespace 'Microsoft.Practices.EnterpriseLibrary' (are you missing an assembly reference?)&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Er, huh? I hit Rebuild with the same result.&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;I checked that I'd added the block - yep, there it was in my project References.&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Rebuild. No joy.&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;In the immortal words of Kenneth Williams, &lt;a href="http://www.sadena.com/BBC-Radio/Kenneth%20Williams/Kenneth%20Williams%20-%20Stop%20Messin%20About.mp3"&gt;"stop messing about"&lt;/a&gt;. I actually fired up Explorer and browsed to the DLL under my Program Files folder to ensure it was there.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Still no joy...&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;And then I had a flash of inspiration. The default .NET Framework version for the application was set to '.NET Framework 4.0 Client Profile' - what if that was causing a problem? That's caught me out before when I've been playing with MEF stuff. I changed it to the .NET Framework 4.0 full profile, hit Rebuild again and - success!&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;I solved my problem, but I'm sure I can't be the only one who's run into this one. It's trivial for me to solve because this application will only ever run on my laptop, but for someone who wants to use the Enterprise Library but also needs a minimal footprint when their app is installed, the two things become mutually incompatible. I can't help feeling that when you add a reference by browsing to a DLL, as I did, that Visual Studio should do a bit of inspection on the DLL and warn you if it's incompatible with the framework version you're currently using.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-5819251109810491602?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/5819251109810491602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=5819251109810491602' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/5819251109810491602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/5819251109810491602'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/08/data-does-not-exist-in-namespace.html' title='Data does not exist in the namespace Microsoft.Practices.EnterpriseLibrary'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-2593415221397702315</id><published>2010-07-22T14:20:00.000+01:00</published><updated>2010-07-22T14:20:55.220+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppFabric'/><category scheme='http://www.blogger.com/atom/ns#' term='world tour'/><category scheme='http://www.blogger.com/atom/ns#' term='nxtgen'/><title type='text'>AppFabric Goes South(ampton)</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;(Very!) Belated thanks to the good developers of the NxtGen user group in Southampton for having me down last week to give my Developers Guide to Distributed Caching with Windows Server AppFabric talk. Despite a horrible journey round the M25, I had a really good time - I felt the session went well, the technology didn't let me down, and there were some really good and interesting discussions during the session and afterwards in the pub. It was also good to put a few faces to Twitter names!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-2593415221397702315?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/2593415221397702315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=2593415221397702315' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2593415221397702315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2593415221397702315'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/07/appfabric-goes-southampton.html' title='AppFabric Goes South(ampton)'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-2720188122275872440</id><published>2010-06-13T18:07:00.001+01:00</published><updated>2010-06-13T19:34:12.044+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppFabric'/><category scheme='http://www.blogger.com/atom/ns#' term='world tour'/><category scheme='http://www.blogger.com/atom/ns#' term='EpiCenter'/><title type='text'>AppFabric Goes to Ireland</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;Last week I gave my Distributed Caching with Windows Server Appfabric talk at &lt;a href="http://epicenter.ie/2010.html"&gt;EpiCenter&lt;/a&gt;, the Irish Software Show, at Trinity College in Dublin. My audience was a little, ahem, disappointing, particularly in the week that AppFabric was officially announced and released, since I only had one audience member, &lt;a href="http://www.markhneedham.com/blog/"&gt;Mark Needham&lt;/a&gt; of &lt;a href="http://thoughtworks.com/"&gt;Thoughtworks&lt;/a&gt;, who was presenting in the afternoon. I also had technical troubles with AppFabric again - clearly in a previous life I seriously pissed off the demo gods. I've now torn down my AppFabric demo infrastructure to rebuild it - this also gives me a chance to recompile my demos with the release version of AppFabric - I've been using the Release Candidate.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;My slides from EpiCenter can be seen on &lt;a href="http://www.slideshare.net/philpursglove/the-need-for-speed-epicenter-2010"&gt;Slideshare&lt;/a&gt;, and my demo code is downloadable &lt;a href="http://philippursglove.com/velocity/epicenter_csappfabricdemos.zip"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-2720188122275872440?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/2720188122275872440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=2720188122275872440' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2720188122275872440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2720188122275872440'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/06/appfabric-goes-to-ireland.html' title='AppFabric Goes to Ireland'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-6076227279288712417</id><published>2010-06-08T12:06:00.000+01:00</published><updated>2010-06-08T12:06:59.931+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppFabric'/><title type='text'>Windows Server AppFabric is out!</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;As announced at TechEd yesterday, v1 of Windows Server AppFabric was released to the web at the weekend (though like the Release Candidate, I found out the Chris Alcock's excellent &lt;a href="http://blog.cwa.me.uk/"&gt;Morning Brew blog&lt;/a&gt;). You can download it directly &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=467e5aa5-c25b-4c80-a6d2-9f8fb0f337d2"&gt;here&lt;/a&gt;, or through the Windows Platform Installer. There's an installation guide &lt;a href="http://www.microsoft.com/downloads/info.aspx?na=40&amp;amp;p=4&amp;amp;SrcDisplayLang=en&amp;amp;SrcCategoryId=&amp;amp;SrcFamilyId=467e5aa5-c25b-4c80-a6d2-9f8fb0f337d2&amp;amp;u=http%3a%2f%2fgo.microsoft.com%2ffwlink%2f%3fLinkID%3d184618"&gt;here&lt;/a&gt;. If you've been using the Beta 2 Refresh release, the installer will allow you to upgrade from this to the release version - there are details &lt;a href="http://msdn.microsoft.com/en-us/library/ff637697.aspx"&gt;here&lt;/a&gt;. &lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Additional coverage:&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Official announcement from the &lt;a href="http://blogs.iis.net/appfabric/archive/2010/06/07/windows-server-appfabric-now-generally-available.aspx"&gt;AppFabric blog&lt;/a&gt; &lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;a href="http://coolthingoftheday.blogspot.com/2010/06/windows-server-appfabric-v1-rtw-and.html"&gt;Greg Duncan&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-6076227279288712417?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/6076227279288712417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=6076227279288712417' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/6076227279288712417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/6076227279288712417'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/06/windows-server-appfabric-is-out.html' title='Windows Server AppFabric is out!'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-8327463148389654870</id><published>2010-06-08T09:23:00.000+01:00</published><updated>2010-06-08T09:23:39.634+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppFabric'/><category scheme='http://www.blogger.com/atom/ns#' term='world tour'/><title type='text'>The Irish Software Show</title><content type='html'>It's the Irish Software Show this week! There are 80 sessions taking place from top speakers including &lt;a href="http://www.craigmurphy.com/"&gt;Craig Murphy&lt;/a&gt;, &lt;a href="http://msmvps.com/blogs/jon_skeet/"&gt;Jon Skeet&lt;/a&gt;, &lt;a href="http://alandean.blogspot.com/"&gt;Alan Dean&lt;/a&gt; and many others. And also, ahem, me.&lt;br /&gt;&lt;br /&gt;I'm doing my session on Distributed Caching with Windows Server AppFabric tomorrow, Wednesday 9th June. I shall also be attempting to whip the crowd into a frenzy before Jon Skeet does his first session - yes, I'm Jon Skeet's warm-up man!&lt;br /&gt;&lt;br /&gt;If you haven't got tickets for the show yet, it's not too late! And even better, the organisers have very kindly allocated some concession tickets to me: if you go to &lt;a href="http://epicenter.ie/2010_Phil_Pursglove_Page"&gt;my page&lt;/a&gt; on the &lt;a href="http://epicenter.ie/2010.html"&gt;EpiCenter&lt;/a&gt; website, you can get up to €90 off the price of your ticket! And I'll see you tomorrow!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-8327463148389654870?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/8327463148389654870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=8327463148389654870' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/8327463148389654870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/8327463148389654870'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/06/irish-software-show.html' title='The Irish Software Show'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-4776002138883831715</id><published>2010-05-28T16:57:00.001+01:00</published><updated>2010-05-28T16:59:24.931+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppFabric'/><title type='text'>What's New in the AppFabric Release Candidate</title><content type='html'>&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;The Windows Server AppFabric Release Candidate was, well, released last week. Here's a quick look at changes from Beta 2.&lt;/span&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;strong&gt;What's New in PowerShell&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Possibly the most visible change is the return of the Start Menu item for Powershell with the AppFabric module pre-loaded. &lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3XWsi_HTCuw/S_p1fRKW5lI/AAAAAAAAAEg/CIoiVHmEVO4/s1600/AppFabric+RC+Start+Menu.png" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;img border="0" gu="true" src="http://4.bp.blogspot.com/_3XWsi_HTCuw/S_p1fRKW5lI/AAAAAAAAAEg/CIoiVHmEVO4/s320/AppFabric+RC+Start+Menu.png" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;This fires up the Powershell console and runs 'Import-Module DistributedCacheAdministration' from the command-line, with the No-Exit switch to keep the console open. However it seems (at least on my Windows 7 machine) that there is something not quite right with this, as I now have to Exit from Powershell twice before the console actually closes. I've checked this on a VM running Windows Server 2008 as well as my Windows 7 laptop and it behaves the same on both platforms. Usefully, however, it also runs 'Use-CacheCluster', which if you're anything like me, saves you trying to run a cache command, &lt;em&gt;then&lt;/em&gt; running Use-CacheCluster, then running your original command again.&lt;/span&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_3XWsi_HTCuw/S_p2rls46QI/AAAAAAAAAEo/FObbuJBvnv8/s1600/AppFabric+RC+Powershell+Exit.png" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;img border="0" gu="true" src="http://3.bp.blogspot.com/_3XWsi_HTCuw/S_p2rls46QI/AAAAAAAAAEo/FObbuJBvnv8/s320/AppFabric+RC+Powershell+Exit.png" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;I'm slightly disapppointed that the cachehelp command hasn't made a reappearance, so overall for Powershell I think I'll stick with my customised profile for importing the AppFabric commandlets.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;&lt;strong&gt;What's New in Licensing&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;Err, nothing. There is no Go-Live license for the Release Candidate, although to be fair you might as well now wait another few weeks for the v1 release.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;&lt;strong&gt;What's New in the Caching API&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;Again, nothing (that I can see), although since Beta 2 was the feature-complete release, it would be wrong to be making changes now.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-4776002138883831715?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/4776002138883831715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=4776002138883831715' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4776002138883831715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4776002138883831715'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/05/whats-new-in-appfabric-release.html' title='What&apos;s New in the AppFabric Release Candidate'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3XWsi_HTCuw/S_p1fRKW5lI/AAAAAAAAAEg/CIoiVHmEVO4/s72-c/AppFabric+RC+Start+Menu.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-8542562966850055590</id><published>2010-05-20T09:56:00.001+01:00</published><updated>2010-05-20T09:57:37.090+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppFabric'/><category scheme='http://www.blogger.com/atom/ns#' term='world tour'/><category scheme='http://www.blogger.com/atom/ns#' term='NEBytes'/><title type='text'>AppFabric Goes North!</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;Thanks to &lt;a href="http://nebytes.net/"&gt;NEBytes&lt;/a&gt; for having me up to speak last night (and thanks to &lt;a href="http://www.andrewwestgarth.co.uk/"&gt;Andy&lt;/a&gt; (and Tammy :-) ) for putting me up). I ran my AppFabric distributed caching session, and for the first time nothing broke! Lots of performance problems though, caused by trying to run too many VMs on not enough memory. I think when I get home I'll review my demos: I want to run them all in one VS project to make it easier to swap between them as I'll just be able to run up one Cassini instance that'll contain all the demos. I was also thinking last night I might change the Regions/tagging demo so I get the objects from the database as required and &lt;i&gt;then&lt;/i&gt; cache them in a lazy style. Watch this space.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;I missed the first half of &lt;a href="http://www.jonoble.com/"&gt;Jonathan Noble&lt;/a&gt;'s session on Powershell 2.0, but I was quite impressed with what I did see. My use of Powershell can be described as 'fledgling' at best (even though it's used in managing AppFabric clusters and caches), so it was instructive to see it really put through it's paces. The remoting tools built into Powershell 2.0 look particularly impressive, it's made me think about how we manage our web servers at work and whether we should be using Powershell from our desktops instead of RDPing onto the servers and then using the IIS MMC.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;I'd have liked a bit more time to look round Newcastle as it's somewhere I've never visited - maybe next time. I did get to drive past the &lt;a href="http://en.wikipedia.org/wiki/Angel_of_the_North"&gt;Angel of the North&lt;/a&gt;, which was disappointingly somewhat less impressive than I'd anticipated. And this morning on the way back I got to see (if only on the horizon) the &lt;a href="http://en.wikipedia.org/wiki/Middlesborough_Transporter_Bridge"&gt;Middlesborough Transporter Bridge&lt;/a&gt;! (Thanks for the A19 tip Andy!)&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-8542562966850055590?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/8542562966850055590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=8542562966850055590' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/8542562966850055590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/8542562966850055590'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/05/appfabric-goes-north.html' title='AppFabric Goes North!'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-3405492782729254854</id><published>2010-04-28T18:03:00.000+01:00</published><updated>2010-04-28T18:03:53.595+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppFabric'/><category scheme='http://www.blogger.com/atom/ns#' term='Powershell'/><title type='text'>Rebuilding CacheHelp</title><content type='html'>&lt;span style="font-family: Verdana, sans-serif;"&gt;Ron Jacobs blogged &lt;/span&gt;&lt;a href="http://blogs.msdn.com/rjacobs/archive/2010/04/27/using-appfabric-caching-powershell-cmdlets-with-appfabric-beta-2-refresh.aspx"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;yesterday&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; about using the AppFabric Beta 2 Refresh and the fact that the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;cachehelp&lt;/span&gt; command seems to have disappeared. If you rely on cachehelp as much as I do, fear not! To paraphrase the start of &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/The_Six_Million_Dollar_Man"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;The Six Million Dollar Man&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;, 'we can rebuild it'...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Powershell includes a &lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Set-Alias&lt;/span&gt; command, which we can use to create aliases for existing commands e.g. &lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Set-Alias nc New-Cache&lt;/span&gt;. Ron helpfully provided the Powershell command we need to retrieve the AppFabric commands - &lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Get-Command -module distributedcacheadministration&lt;/span&gt; - BUT you can't create an alias for a whole command-line with parameters, only for an individual command. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Fortunately we can get round this by creating a Powershell function which wrappers the commandline:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;function getVelocityCommands&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get-Command -module distributedcacheadministration&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Now we can use &lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Set-Alias GetCacheHelp getVelocityCommands&lt;/span&gt; to create an alias which calls the function. And we're done!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Almost...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Aliases and functions are session-based - once you close down Powershell, you'll lose them. To make them persistent, you'll need to add them to your Powershell profile. There's a great&amp;nbsp;tutorial &lt;/span&gt;&lt;a href="http://technet.microsoft.com/en-us/library/ee692764.aspx"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; on creating Powershell profiles. Too much work? Then download &lt;a href="http://www.philippursglove.com/Velocity/Microsoft.Powershell_Profile.ps1.zip"&gt;this profile&lt;/a&gt;, which imports the AppFabric commands and creates the cachehelp alias for you.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-3405492782729254854?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/3405492782729254854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=3405492782729254854' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/3405492782729254854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/3405492782729254854'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/04/rebuilding-cachehelp.html' title='Rebuilding CacheHelp'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-9173718850860081587</id><published>2010-04-26T14:11:00.000+01:00</published><updated>2010-04-26T14:11:36.227+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppFabric'/><title type='text'>AppFabric For .Net 4.0</title><content type='html'>&lt;span style="font-family: Verdana, sans-serif;"&gt; &lt;/span&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;So a fortnight ago .NET and VS2010 were released, and shortly after that I tried to install the AppFabric Beta 2 release on my laptop. No go - Beta 2 has a dependency on the .NET 4 Release Candidate and will not install on the .NET 4.0 RTM release. I emailed &lt;/span&gt;&lt;a href="http://blogs.msdn.com/rjacobs"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Ron Jacobs&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; (who has made the mistake of being associated with AppFabric &lt;em&gt;and&lt;/em&gt; being contactable) about this and asked when we'd see a release that ran on the .NET 4.0 RTM release. He answered me and then wrote up &lt;/span&gt;&lt;a href="http://blogs.msdn.com/rjacobs/archive/2010/04/14/windows-server-appfabric-beta-2-and-visual-studio-2010-net-4-rtm.aspx"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;this blog&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; (and when he talks about emails rolling in, it's mine he quotes so I'm slightly suspicious of how many he really got about this), which says that .NET developers who want to use AppFabric will have to stay on the .NET 4.0/VS2010 RC versions until an unspecified time between now and the end of June when AppFabric will RTM. &lt;span id="goog_1296900786"&gt;&lt;/span&gt;I can't say that I was hugely impressed&lt;span id="goog_1296900787"&gt;&lt;/span&gt; with this:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_3XWsi_HTCuw/S9WPD9goDVI/AAAAAAAAAEM/Y8W6xKwTl1Y/s1600/AppFabric+Bitching.png" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="70" src="http://3.bp.blogspot.com/_3XWsi_HTCuw/S9WPD9goDVI/AAAAAAAAAEM/Y8W6xKwTl1Y/s640/AppFabric+Bitching.png" tt="true" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;So I was quite surprised today to look at Alvin Ashcraft's Dew Drop and find:&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_3XWsi_HTCuw/S9WP4DMhifI/AAAAAAAAAEU/mbdWWpqe0ro/s1600/AppFabric+Bitching+2.png" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="176" src="http://1.bp.blogspot.com/_3XWsi_HTCuw/S9WP4DMhifI/AAAAAAAAAEU/mbdWWpqe0ro/s640/AppFabric+Bitching+2.png" tt="true" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Which appears to be AppFabric Beta 2 rebuilt for .NET 4.0 RTM. I haven't tested it yet, but I've installed it and can confirm it installs OK onto a Windows 7 machine with .NET 4.0 RTM.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;There's nothing yet about this on either Ron Jacob's blog, the &lt;a href="http://blogs.msdn.com/velocity"&gt;Velocity blog&lt;/a&gt; or&amp;nbsp;the &lt;a href="http://blogs.msdn.com/endpoint"&gt;.NET Endpoint blog&lt;/a&gt;. And I'd like Microsoft to explain their change of heart - right now, I'm interpreting it as being that AppFabric may miss it's RTM deadline of 30th June. But someone should feel free to tell me different.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-9173718850860081587?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/9173718850860081587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=9173718850860081587' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/9173718850860081587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/9173718850860081587'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/04/appfabric-for-net-40.html' title='AppFabric For .Net 4.0'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3XWsi_HTCuw/S9WPD9goDVI/AAAAAAAAAEM/Y8W6xKwTl1Y/s72-c/AppFabric+Bitching.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-6203391488603792360</id><published>2010-04-20T12:53:00.000+01:00</published><updated>2010-04-20T12:53:08.477+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='caching'/><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><category scheme='http://www.blogger.com/atom/ns#' term='AppFabric'/><category scheme='http://www.blogger.com/atom/ns#' term='scalability'/><title type='text'>Building A PageStatePersister With AppFabric</title><content type='html'>&lt;div style="font-family: Verdana, sans-serif;"&gt;One of my favourite demos to do at user group sessions is to show off how you can use the SessionPageStatePersister to store page state information (Viewstate and Controlstate) on the server in Session state instead of round-tripping it to the client. But yesterday it occurred to me that you could do the same thing quite easily with AppFabric caching*.&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana, sans-serif;"&gt;ASP.NET has shipped with two page state persistence mechanisms since ASP.NET 2.0 was released - HiddenFieldPageStatePersister, which is the one used by default and produces those &lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;lt;input id="__VIEWSTATE" type="hidden" value="AnEnormousBase64EncodedTree" /&amp;gt;&lt;/span&gt; tags that we all hate so much, and SessionPageStatePersister, which instead stores the state on the web server in Session state and cuts out the roundtripping. To use the SessionPageStatePersister you need to write an Adapter class and a .browser file:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;using System.Web.UI;&lt;br /&gt;using System.Web.UI.Adapters;&lt;br /&gt;&lt;br /&gt;namespace Adapter&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class Adapter: System.Web.UI.Adapters.PageAdapter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override PageStatePersister GetStatePersister()&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new SessionPageStatePersister(this.Page);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;lt;browser refID="default"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;controladapters&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;adapter controltype="System.Web.UI.Page"&amp;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; adapterType="Adapter.Adapter" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/controladapters&amp;gt;&lt;br /&gt;&amp;lt;/browser&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;SessionPageStatePersister is built into the .NET Framework, so our adapter can just new it up and return it in the GetStatePersister function. If we want to build a PageStatePersister with AppFabric, however, we've got a bit more work to do. We need a class that inherits from PageStatePersister so we can implement the Save and Load methods.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;using System.Web.UI;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;using System.Web.UI.WebControls;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;namespace AppFabricPageStatePersister&lt;br /&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class Persister : System.Web.UI.PageStatePersister&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Persister(Page page) : base(page)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private const string HiddenFieldId = "StateIdHiddenField";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void Load()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Read page's incoming state Id from hidden field&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string stateIdString = Page.Request.Form[HiddenFieldId];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pair cachedState = (Pair) CacheHelper.Get(stateIdString);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewState = cachedState.First;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ControlState = cachedState.Second;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void Save()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pair statePair;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Build a Pair from the Page's View- and ControlState&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; statePair = new Pair(ViewState, ControlState);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Generate a new ID to use as the key for storing in the cache&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Guid stateId = Guid.NewGuid();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Put the Pair in the cache&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CacheHelper.Put(stateId.ToString(), statePair);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Write the key out into the page in a hidden field so we can get it back later&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Page.ClientScript.RegisterHiddenField(HiddenFieldId, stateId.ToString());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;CacheHelper is an abstraction over AppFabric so my Persister class isn't cluttered with calls to the AppFabric objects:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;using System.Web.Configuration&lt;br /&gt;using Microsoft.ApplicationServer.Caching;&lt;br /&gt;&lt;br /&gt;namespace AppFabricPageStatePersister&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class CacheHelper&lt;br /&gt;&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; public static object Get(string Key)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataCacheFactory factory;&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; DataCache cache;&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; string cacheName;&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; factory = new DataCacheFactory();&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; cacheName = WebConfigurationManager.AppSettings["StatePersistenceCacheName"].ToString();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cache = factory.GetCache(cacheName);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return cache.Get(Key);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void Put(string Key, object Value)&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataCacheFactory factory;&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; DataCache cache;&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; string cacheName;&lt;br /&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; factory = new DataCacheFactory();&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; cacheName = WebConfigurationManager.AppSettings["StatePersistenceCacheName"].ToString();&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; cache = factory.GetCache(cacheName);&lt;br /&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; cache.Put(Key, Value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;The adapter is straightforward - like the SessionPageStatePersister adapter, all it needs to do is return a new instance of AppFabricPageStatePersister, and the .browser file just needs to point at AppFabricPageStatePersister.Adapter.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;namespace AppFabricPageStatePersister&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class Adapter : System.Web.UI.Adapters.PageAdapter&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override System.Web.UI.PageStatePersister GetStatePersister()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new Persister(this.Page);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;lt;browser refID="default"&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;controlAdapters&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;adapter controlType="System.Web.UI.Page"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;adapterType="AppFabricPageStatePersister.Adapter" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/controlAdapters&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;lt;/browser&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Simples.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;Download this demo code: &lt;a href="http://philippursglove.com/velocity/appfabricpagestatepersistercs.zip"&gt;C#&lt;/a&gt; &lt;a href="http://philippursglove.com/velocity/appfabricpagestatepersistervb.zip"&gt;VB&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;* Yes, I &lt;i&gt;know&lt;/i&gt; you could put your Session state in AppFabric and continue to use the SessionPageStatePersister but I'm assuming you can't/don't want to use Session state.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-6203391488603792360?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/6203391488603792360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=6203391488603792360' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/6203391488603792360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/6203391488603792360'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/04/building-pagestatepersister-with.html' title='Building A PageStatePersister With AppFabric'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-2300814018283797134</id><published>2010-03-29T18:49:00.002+01:00</published><updated>2010-03-29T19:00:09.913+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='&quot;book review&quot;'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Book Review: Beginning ASP.NET Security</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;If you're doing web development with ASP.NET, you need &lt;a href="http://www.play.com/Books/Books/4-/9853133/Beginning-Asp-Net-Security/Product.html"&gt;this book&lt;/a&gt;. Simple as, end of.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;And I'm not just saying that because I'm mentioned in it (page 235 for those of you playing along at home).&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;When I heard &lt;a href="http://www.idunno.org/"&gt;Barry&lt;/a&gt; was writing a book, I knew it'd be a good one to get, having seen Barry speak on security topics at several user groups and conferences. And now I've read it I can see it's going to become one of those books that never gets put away neatly on a shelf, it's always going to be open on someone's desk. Experienced developers shouldn't be put off by the 'Beginning ...' in the title, this book is for every ASP.NET/MVC/Silverlight/WCF developer who has security concerns. Which should be all of you.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;The approach of the book is task-oriented; each chapter describes one or more vulnerabilities that a web developer may come across, and then describes how to mitigate against them. I started learning right from the first technical chapter, which covers validation: there are several things I've picked up about the ASP.NET validator controls, including how to validate input data against a .NET data type and how to write a custom validator. Cross-Site Request Forgery isn't quite what I thought it was either. Of course, things like Cross Site Scripting and SQL injection are covered, but also some of the more obscure vulnerabilities that are traps for the unwary; I'd never heard of things like traversal attacks and XPath injection. There is an excellent chapter on encryption covering all the options available in the .NET Framework for encypting and decrypting your data, although I'd have liked to see for each type of encryption some more suggested scenarios in which each method is appropriate. Coming right up-to-date Barry also covers how to use external authentication providers like OpenId, *ahem* LiveId and Windows Identity Foundation, and finally has a whole chapter on securing MVC applications, lest the lack of Viewstate and auto-encoding &amp;lt;%: tags leads MVC developers to believe there's nothing more they need to do.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Right, I'm off to do a security review of all our live sites. I may be some time...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-2300814018283797134?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/2300814018283797134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=2300814018283797134' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2300814018283797134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2300814018283797134'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/03/book-review-beginning-aspnet-security.html' title='Book Review: Beginning ASP.NET Security'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-8549006607529109590</id><published>2010-03-03T11:20:00.001Z</published><updated>2010-03-03T11:23:56.509Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><category scheme='http://www.blogger.com/atom/ns#' term='AppFabric'/><title type='text'>What's New in AppFabric Caching Beta 2</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;Typical - just as I get an AppFabric Beta 1 caching cluster &lt;a href="http://twitter.com/philpursglove/status/9624752787"&gt;up and running&lt;/a&gt; for &lt;a href="http://edgeug.net/"&gt;Edge UG&lt;/a&gt; this month, they &lt;a href="http://twitter.com/AppFabric/status/9837247552"&gt;release&lt;/a&gt; Beta 2!&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;This is, by all accounts, now a &lt;a href="http://blogs.msdn.com/endpoint/archive/2010/03/01/windows-server-appfabric-beta-2-available.aspx"&gt;feature complete&lt;/a&gt; release for v1.0 with the RTM expected in Q3 this year. There is, however, no Go Live licence here, unlike Visual Studio. Let's take a look at&amp;nbsp;AppFabric B2&amp;nbsp;and see what's changed (from a&amp;nbsp;caching perspective)...&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;b&gt;What's New in Installation&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;First of all, this release is aligned with the Release Candidate of &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=a9ef9a95-58d2-4e51-a4b7-bea3cc6962cb&amp;amp;displaylang=en"&gt;.NET 4.0&lt;/a&gt; and &lt;a href="http://go.microsoft.com/fwlink/?LinkID=183179"&gt;VS2010&lt;/a&gt;, so the dependency on the .NET Framework is moved up from the beta to the .NET 4.0 Release Candidate. Note that if you're removing the .NET 4.0 Beta in order to install AppFabric, you need to do this in Control Panel|Programs and Features, and uninstall the .NET 4.0 Framework Extended first, then the the .NET 4.0 Client Profile.&lt;br /&gt;&lt;br /&gt;The installer seems to have had quite a bit of time spent on it for this release.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_3XWsi_HTCuw/S42GdTjdZYI/AAAAAAAAADY/RRakK4XdgEo/s1600-h/AppFabric+B2+Installer+P1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://2.bp.blogspot.com/_3XWsi_HTCuw/S42GdTjdZYI/AAAAAAAAADY/RRakK4XdgEo/s400/AppFabric+B2+Installer+P1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;The set of features to install is largely the same as we saw in Beta 1, with the addition of an administration piece for the Dublin workflow component. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3XWsi_HTCuw/S42I27KsuyI/AAAAAAAAADg/oZWyXGCEoO8/s1600-h/AppFabric+B2+Service.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/_3XWsi_HTCuw/S42I27KsuyI/AAAAAAAAADg/oZWyXGCEoO8/s400/AppFabric+B2+Service.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Post-installation, the AppFabric caching service has been renamed and no longer refers to the Velocity codename; it also now is not marked as a CTP (unlike the caching service in Appfabric Beta 1 which still showed as CTP4).&lt;br /&gt;&lt;br /&gt;Installation and configuration have been decoupled into two separate wizards, which should make it possible to reconfigure a cluster without having to un- and re-install.The configuration wizard can be started at the end of installation, or separately from the Start menu.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3XWsi_HTCuw/S42JXll-_8I/AAAAAAAAADo/kFP2zJmlY94/s1600-h/AppFabric+B2+Installer+P2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/_3XWsi_HTCuw/S42JXll-_8I/AAAAAAAAADo/kFP2zJmlY94/s400/AppFabric+B2+Installer+P2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3XWsi_HTCuw/S42JiNM0UkI/AAAAAAAAADw/CsQTM2_pnlM/s1600-h/AppFabric+B2+Start+Menu.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="371" src="http://4.bp.blogspot.com/_3XWsi_HTCuw/S42JiNM0UkI/AAAAAAAAADw/CsQTM2_pnlM/s400/AppFabric+B2+Start+Menu.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;What's New in Configuration&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3XWsi_HTCuw/S42O4Wpz4FI/AAAAAAAAAD4/y6g-CpDoj2E/s1600-h/AppFabric+B2+Config+P1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/_3XWsi_HTCuw/S42O4Wpz4FI/AAAAAAAAAD4/y6g-CpDoj2E/s400/AppFabric+B2+Config+P1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;As before when configuring the caching piece you have to decide whether to store configuration information in SQL Server or using XML and a network share. There's still no guidance on when you should use one or the other, although included in this release is a comprehensive help file.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3XWsi_HTCuw/S42PC8kVJfI/AAAAAAAAAEA/zuZwcIxkU_U/s1600-h/AppFabric+B2+Config+P2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/_3XWsi_HTCuw/S42PC8kVJfI/AAAAAAAAAEA/zuZwcIxkU_U/s400/AppFabric+B2+Config+P2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Selecting the SQL Server provider and clicking the Configure button opens this sub-dialog where you can build up the connection string to the configuration database. It's now explicit that if you enter the name of a database that doesn't exist and select the 'Create...' checkbox then the configurator will go and create the database for you. If you're adding a server to an existing cluster, then the 'Register...' checkbox is the one to select; if you unselect both checkboxes you lose the ability to enter any connection string information. However there seems to be a slight bug in that whether you create a new database from scratch or register a server to an existing database, when you return to the main configuration screen you can still choose whether you are creating a new cluster or joining an existing cluster.&lt;br /&gt;As before, the configurator allows you set the size of the cluster to optimise the clusters' performance. The help file states that 'once you set the cluster size during configuration, you cannot change it later', however it's unclear how this fits in with the ability to re-run the configurator from the Start menu.&lt;br /&gt;&lt;br /&gt;As I run my Velocity VM cluster with Windows Firewall disabled, I'm pleased to see that the Cache Node configuration page now detects when the firewall is disabled and accordingly disables the firewall exceptions checkboxes. This is a change to Beta 1 where the Velocity installer log would register a warning if the firewall was disabled.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What's New in Powershell&lt;/b&gt;&lt;br /&gt;In a change from previous installs, there doesn't seem to be a Velocity Administration Powershell console installed by default; to access the Velocity Powershell commands you need to run up Powershell and then run '&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;import-module DistributedCacheAdministration&lt;/span&gt;'. Or you can add it to your Powershell profile - run '&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;get-help profiles&lt;/span&gt;' for details on doing this.&lt;br /&gt;Looking at the list of Powershell commands available it seems that, unforgivably, there's still no commandlets for managing regions.The Install-Data and Install-Bits cmdlets that were in Beta 1 have disappeared.&lt;br /&gt;&lt;br /&gt;A new feature is that it seems you can now use Powershell on any server with the Velocity cmdlets installed to manage any Velocity cluster, by using the '&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Use-CacheCluster&lt;/span&gt;' cmdlet with a connection string to a configuration store (though the documentation talks about a connection string which implies this only works with the SQL Server provider). This cmdlet sets the context of subsequent commands e.g. &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Start-CacheCluster&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Restart-CacheCluster&lt;/span&gt;. This enables you to manage multiple clusters from a server that isn't in &lt;i&gt;any&lt;/i&gt; cluster. If you're running &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Use-CacheCluster&lt;/span&gt; on a server that is inside a cluster and has Cache Administration (from the installer) set up, you don't need to use any parameters, the current cluster is implied.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What's New in Client Configuration&lt;/b&gt;&lt;br /&gt;The assemblies that you need to add to a project to use Velocity have been renamed, to Microsoft.ApplicationServer.Caching.Core.dll and Microsoft.ApplicationServer.Caching.Client.dll (in Windows\System32\AppFabric). The namespace has changed again, to Microsoft.ApplicationServer.Caching. And the requirement to also reference the Fabric assemblies has been removed, so there's only two references to add which makes the whole thing seem much cleaner.&lt;br /&gt;The MSDN article on &lt;a href="http://msdn.microsoft.com/en-us/library/ee790876.aspx"&gt;setting up the client environment&lt;/a&gt; states that there is a problem with referencing these DLLs as Visual Studio is unable to browse to Windows\System32\AppFabric, and that you need to hand-edit the project file to include these references. This seems to be incorrect, as I've just done it - I suspect that this may be due to the fact I'm running Visual Studio under an account which is an administrator on the server and thus has access to everything. &lt;br /&gt;A couple of the old annoyances when writing client code are still there:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;DataCacheFactory.GetCache is still not a static method, you still need to new up a DataCacheFactory.&lt;/li&gt;&lt;li&gt;Some of the code around using DataCacheServerEndpoints seems to have been refactored a little bit, but it still runs on an array, not a List(Of DataCacheServerEndPoint). But you can, of course, still get round this by using a List(Of DataCacheServerEndpoint) and then calling .ToArray on it.&lt;/li&gt;&lt;/ul&gt;That's all I've discovered that's new (for now), but I'll post more updates as I discover things!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-8549006607529109590?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/8549006607529109590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=8549006607529109590' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/8549006607529109590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/8549006607529109590'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/03/whats-new-in-appfabric-caching-beta-2.html' title='What&apos;s New in AppFabric Caching Beta 2'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3XWsi_HTCuw/S42GdTjdZYI/AAAAAAAAADY/RRakK4XdgEo/s72-c/AppFabric+B2+Installer+P1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-4601473652475329480</id><published>2010-02-20T18:27:00.003Z</published><updated>2010-03-03T11:29:50.872Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><category scheme='http://www.blogger.com/atom/ns#' term='&quot;edge ug&quot;'/><category scheme='http://www.blogger.com/atom/ns#' term='world tour'/><category scheme='http://www.blogger.com/atom/ns#' term='nxtgen'/><category scheme='http://www.blogger.com/atom/ns#' term='NEBytes'/><title type='text'>A Developer's Guide To Velocity on tour!</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;Following on from &lt;a href="http://geekswithblogs.net/twickers"&gt;Liam&lt;/a&gt;'s recent &lt;a href="http://geekswithblogs.net/twickers/archive/2010/02/15/137977.aspx"&gt;tour dates&lt;/a&gt; blog,I thought I should do something similar...&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;First of all I need to offer belated thanks to &lt;a href="http://nxtgenug.net/Region.aspx?RegionID=11"&gt;NxtGen Manchester&lt;/a&gt; for having me up to speak in January. I had a good time even though something went wonky in my VMs while I was running my demos that morning which meant I couldn't run the demos in the evening. I hope everyone still got an appreciation of the capabilities of Velocity.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;I'm running this session again at &lt;a href="http://edgeug.net/"&gt;Edge UG&lt;/a&gt; at Microsoft in London on 17th March - visit &lt;a href="http://edgeug.net/"&gt;http://edgeug.net&lt;/a&gt; to sign up. I &lt;i&gt;may&lt;/i&gt; be running it at &lt;a href="http://developerdeveloperdeveloper.com/scotland2010/"&gt;DDD Scotland&lt;/a&gt; if I've been voted in. Subject to agreement on dates it'll be at &lt;a href="http://nxtgenug.net/Region.aspx?RegionID=9"&gt;NxtGen Southampton&lt;/a&gt; in June. I've also been talking to &lt;a href="http://nxtgenug.net/Region.aspx?RegionID=8"&gt;NxtGen Cambridge&lt;/a&gt; and &lt;a href="http://www.nebytes.net/"&gt;NEBytes&lt;/a&gt; about doing it for them over the summer.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;UPDATE: Well I didn't get voted in for DDD Scotland, but there'll be another opportunity to vote for me at &lt;a href="http://dddsouthwest.com/"&gt;DDD Southwest&lt;/a&gt;.And I now have a confirmed date for NxtGen Southampton - 24th June.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-4601473652475329480?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/4601473652475329480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=4601473652475329480' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4601473652475329480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4601473652475329480'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/02/developers-guide-to-velocity-on-tour.html' title='A Developer&apos;s Guide To Velocity on tour!'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-6629604264209289558</id><published>2010-02-07T21:52:00.001Z</published><updated>2010-02-07T22:04:59.920Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='DDD'/><title type='text'>What I Learned At DDD8</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;First thing&amp;nbsp;on Saturday&amp;nbsp;morning my Twitterstream was full of sleepy geeks converging on Reading - yes, it was time once again for &lt;a href="http://www.developerdeveloperdeveloper.com/DDD8"&gt;DDD&lt;/a&gt; at Microsoft. DDDs are free one-day conferences where all the content is from the UK Microsoft developer community - Microsoft speakers are not allowed to speak, although they usually come just to hang out. The community also decide the sessions that form the agenda by voting on submissions. I was lucky enough to speak at DDD7, but my session didn't make it into DDD8 (which was for the best as hardware failure meant I wouldn't have been able to do any demos). They're also a good networking event - a useful addition this year was to have people's Twitter names on their badges, which meant that if, like me, you follow a number of people you've never met, you could start to spot them and say hello. In fact, at one point I thought 'this is just a social thing with some technical content tacked on'!&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Once I was at Microsoft and checked in, the first person I saw was &lt;a href="http://www.harriyott.com/"&gt;Simon Harriyott&lt;/a&gt;, who I met for the first time the preceding Thursday at &lt;a href="http://idunno.org/"&gt;Barry Dorrans&lt;/a&gt;' leaving drinks. Of which more later. As I was getting my sausage sandwich and coffee, I also bumped into &lt;a href="http://www.vbug.com/"&gt;VBUG&lt;/a&gt; Chair &lt;a href="http://twitter.com/timleung"&gt;Tim Leung&lt;/a&gt; and had a quick catch-up with him before it was time to head into the first session of the day...&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;a href="http://www.barrycarr.org.uk/"&gt;Barry Carr&lt;/a&gt; - Contractual Obligations: Getting Up and Running With Code Contracts&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;I walked into this session and pleasingly got a seat next to virtualisation guru and all-round good guy &lt;a href="http://geekswithblogs.net/twickers"&gt;Liam Westley&lt;/a&gt;, and behind &lt;a href="http://www.guysmithferrier.com/"&gt;Guy Smith-Ferrier&lt;/a&gt; and &lt;a href="http://garyshortblog.wordpress.com/"&gt;Gary Short&lt;/a&gt;. I picked this session as it sounded to be similar to some work that was done at my last company, and it proved to be a very interesting talk. The concept of code contracts stems from some work done by the &lt;a href="http://en.wikipedia.org/wiki/Bertrand_Meyer#Wikipedia_hoax"&gt;not-yet-dead&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Bertrand_Meyer"&gt;Bertrand Meyer&lt;/a&gt;, father of the Eiffel programming language. Contracts allow you to specify pre- and post-conditions on methods, functioning like Asserts. One of the most interesting demos was where Barry stepped through some code, which had both pre- and post-conditions declared at the start of a function followed by the body of the function; as Barry stepped through the code Visual Studio seemed to be jumping around the code instead of following the flow of code as written, due to the way that Code Contracts amends the IL that your .NET code outputs. However the highlight of this talk was probably when one delegate had the temerity to ask a question; his reward was a USB stick, however Barry threw it to him unintentionally hard and nearly took him out!&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;I followed this with ...&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;a href="http://neildoesdotnet.blogspot.com/"&gt;Neil Robbins&lt;/a&gt; - Hello Document Databases&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Neil said up front that he's a new speaker and that this was his first DDD session, and proceeded to give a blinding talk on NoSQL and CouchDB. CouchDB (and its' GUI, Futon) are all based around a mantra of Relax, which several of us shouted out from the audience at certain points when Neil got tied up by some Linuk case-sensitivity issues :-) Neil's demos were done with CouchDB running on Ubuntu, which was a slight disappointment for me as it effectively means CouchDB is something I won't be able to run at work; Neil's comment is that the installer for CouchDB on Windows is only a beta. Which is a shame as CouchDB looks like exactly the kind of technology we could do with at work for asset management software - we've had several conversations recently around the &lt;a href="http://en.wikipedia.org/wiki/Entity-attribute-value_model"&gt;Entity-Attribute-Value&lt;/a&gt; pattern, which seems to be the major problem that CouchDB solves.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;a href="http://twitter.com/argibson"&gt;Andy Gibson&lt;/a&gt; - Web Application Testing with Selenium&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;This was an introduction to using Selenium, which is something I need to look into further, however I have to confess to too much Twittering and not enough paying attention in this session, particularly after &lt;a href="http://twitter.com/johnnonolan"&gt;John Nolan&lt;/a&gt; tweeted that he needed some water (Memphis was by now getting seriously warm) and minutes later &lt;a href="http://twitter.com/camurphy"&gt;Craig Murphy&lt;/a&gt; brought some in for him!&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;a href="http://twitter.com/simon_sabin"&gt;Simon Sabin&lt;/a&gt; - Entity Framework - How to Stop Your DBA Having a Heart Attack&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;I went into this session intending to pick up some knowledge about the Entity Framework, as I basically don't have any and one of my colleagues is intending to use it on his next project.But for that, and for me really, it was the wrong session. I still took some points away from it though, the key one being that although the SQL produced by the Entity Framework can look like it won't perform well, you can spend a lot of time trying to optimise it yourself but get only comparable results. Another good takeaway concerned the DATE datatype in&amp;nbsp; SQL Server 2008 - traditionally when trying to restrict results to a single date, we've used a SQL BETWEEN clause with the bounds set to midnight and 23:59 for the date in question; in SQL 2008 we can cast DATETIME values to DATE and just search for rows where the date is the date in question.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Oh, and for my personal future reference it's pronounced Say-bin.&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;a href="http://twitter.com/blowdart"&gt;Barry Dorrans&lt;/a&gt; - A Developers Guide To Encryption&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;And on to the last session of the day, and Barry's last DDD presentation before leaving the UK to go and work for Microsoft in Redmond. I first met Barry back at DDD1 and I've seen him speak a few times since then, and he's always been good. However, I already knew that his session was going to have some disruption, having had a chat with Phil Winstanley about it at the aforementioned leaving drinks. And also having provided to Phil and Craig Murphy, the organisers, a video of a rather younger Barry when he was on The Crystal Maze. And we weren't disappointed, either by the session (very good) or the disruptions (very funny). Barry wasn't too fazed by the videos that kept appearing on the big screen (or by Jon Skeet and others pointing out both mistakes in his code and typos on his slides). It started with coverage of hashing (which is NOT encryption), and then proceeded to show symmetric and asymmetric (private/public key) encryption, X.509 certificate encryption and XML encryption. I think everyone will remember Barry's key point about symmetric encryption keys, which can become diluted the more they are used for: Barry's message is keys are like condoms, don't re-use them. The only thing I would have liked to see would have been for each level of encryption the kind of data you might protect with it e.g. the correct level of encryption for storing, say, credit card data.&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;All in all another excellent day at Microsoft, I should like to say a big thank you and well done once again to the organisers, looking forward to DDD9!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-6629604264209289558?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/6629604264209289558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=6629604264209289558' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/6629604264209289558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/6629604264209289558'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/02/what-i-learned-at-ddd8.html' title='What I Learned At DDD8'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-951922968441649519</id><published>2010-01-28T16:16:00.017Z</published><updated>2010-03-18T11:00:57.257Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='caching'/><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Extensible Output Caching with Velocity</title><content type='html'>&lt;span style="font-family: Verdana, sans-serif;"&gt;This morning &lt;/span&gt;&lt;a href="http://weblogs.asp.net/scottgu"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Scott Gu&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; posted an &lt;/span&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/01/27/extensible-output-caching-with-asp-net-4-vs-2010-and-net-4-0-series.aspx"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;article&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt; on his blog about the extensibility points now built into output caching in ASP.NET 4.0. &lt;a href="http://www.twitter.com/grumpydev"&gt;Steve Robbins&lt;/a&gt; said to me that it looked easy to wire up Velocity, and I was pleased to see that when ASP.NET 4.0 ships there will be a set of samples showing how to use Velocity as an output cache provider, however since Scott said that writing an output cache provider is just a case of inheriting from System.Web.Caching.OutputCacheProvider and overriding four methods, I decided to have a look at it at lunchtime. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;And it does seem remarkably simple - here's my code:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Imports Microsoft.Data.Caching&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Public Class VelocityOutputCacheProvider&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits System.Web.Caching.OutputCacheProvider&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Private Const cacheName As String = "VelocityOutputCache"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Private mCache As DataCache&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Public Sub New()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim factory As DataCacheFactory&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; factory = New DataCacheFactory&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mCache = factory.GetCache(cacheName)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As Exception&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Throw&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Finally&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; factory = Nothing&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;End Sub&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Public Overrides Function Add(ByVal key As String, ByVal entry As Object, ByVal utcExpiry As Date) As Object&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mCache.Add(key, entry, (utcExpiry - DateTime.UtcNow))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; Catch ex As Exception&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Throw&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Finally&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;End Function&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Public Overrides Sub Remove(ByVal key As String)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Call mCache.Remove(key)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As Exception&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Throw&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Finally&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;End Sub&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Public Overrides Function [Get](ByVal key As String) As Object&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Dim cachedObject As Object&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cachedObject = mCache.Get(key)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return cachedObject&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As Exception&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Throw&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Finally&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;End Function&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;Public Overrides Sub [Set](ByVal key As String, ByVal entry As Object, ByVal utcExpiry As Date)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Call mCache.Put(key, entry, (utcExpiry - DateTime.UtcNow))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Catch ex As Exception&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Throw&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Finally&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;End Class&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;The only thing I'm a little fuzzy on is what object the Add method should return.&lt;/span&gt; &lt;span style="font-family: Verdana, sans-serif;"&gt;It's slightly awkward that the Velocity Cache.Add method takes a TimeSpan parameter where the OutputCacheProvider passes in a point in time, so I've calculated a TimeSpan by subtracting the current time from the passed-in Date.&lt;/span&gt; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Something that's slightly unclear is how this would behave in a server farm. It depends whether each server maintains it's own set of cached pages, or the cached pages are common and available to all servers. If the latter then this would be a truly awesome boost to scalability since for any given web page only the first server that picked up a request for a given URL would need to compile it - other servers in the farm would then be able to pick up the cached copy and return it to the client.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;Update: When the Add method is called, you don't need to return anything, just put the object into the cache and ASP.NET takes care of the rest. You get a warning that the function doesn't return anything but this can be ignored.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-951922968441649519?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/951922968441649519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=951922968441649519' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/951922968441649519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/951922968441649519'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/01/extensible-output-caching-with-velocity.html' title='Extensible Output Caching with Velocity'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-340004835242208306</id><published>2010-01-06T12:18:00.000Z</published><updated>2010-01-06T12:18:04.093Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='caching'/><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><category scheme='http://www.blogger.com/atom/ns#' term='AppFabric'/><title type='text'>Installing AppFabric Caching Beta 1, Part 4</title><content type='html'>&lt;span style="font-family: Verdana, sans-serif;"&gt;I'm pleased to report that I've (at last) had a measure of success with the AppFabric installer :-)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;I mentioned in my last entry that I'd posted on the MSDN AppFabric Caching forum about the problems I'd been having with the installer.&amp;nbsp;I also&amp;nbsp;made two of my installation logs available. I'm indebted to Rahul Kaura from Microsoft, who pointed out that these were AppFabric general installation&amp;nbsp;logs and steered me towards the cache-specific installation logs. These logs are found in the same place as the AppFabric logs i.e. your %TEMP% folder, are called DistributedCacheAppServerConfig(DateTime).log and&amp;nbsp;I've found them&amp;nbsp;&lt;em&gt;invaluable&lt;/em&gt; in diagnosing and fixing installation problems.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;So what were the problems I was having? From reading the log they seem to be largely around&amp;nbsp;permissions to the Registry:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;2010-01-06 11:52:52, Info DCACHE Adding access for NT AUTHORITY\NETWORK SERVICE on registry key HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Distributed Cache\Version&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;2010-01-06 11:53:16, Error DCACHE System.InvalidOperationException: This access control list is not in canonical form and therefore cannot be modified.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;at System.Security.AccessControl.CommonAcl.ThrowIfNotCanonical()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;at System.Security.AccessControl.CommonAcl.AddQualifiedAce(SecurityIdentifier sid, AceQualifier qualifier, Int32 accessMask, AceFlags flags, ObjectAceFlags objectFlags, Guid objectType, Guid inheritedObjectType)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;at System.Security.AccessControl.DiscretionaryAcl.AddAccess(AccessControlType accessType, SecurityIdentifier sid, Int32 accessMask, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;at System.Security.AccessControl.CommonObjectSecurity.ModifyAccess(AccessControlModification modification, AccessRule rule, Boolean&amp;amp; modified)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;at System.Security.AccessControl.CommonObjectSecurity.AddAccessRule(AccessRule rule)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;at Microsoft.Data.Caching.InstallConfig.Program.SetResetLocalPermissions(Boolean grant)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;at Microsoft.Data.Caching.InstallConfig.Program.PostConfigServiceInstallSteps()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;at Microsoft.Data.Caching.InstallConfig.Program.Install()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;at Microsoft.Data.Caching.InstallConfig.Program.Main(String[] args)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;2010-01-06 11:53:16, Error DCACHE Unexpected Error: This access control list is not in canonical form and therefore cannot be modified.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;2010-01-06 11:53:16, Info DCACHE Configuration failed, Rolling back...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;which is sort of annoying as I've been running the installer under an account that is a Domain Administrator, and the Domain Admins group is part of the Administrators group on each of my cache servers. The solution was to add the account I'm using to install AppFabric to the ACL for HKEY_LOCAL_MACHINE with full permission.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;The installer still reports that it fails to configure AppFabric, but this is because the log includes a Warning that the Windows Firewall is disabled, which I'm reasonably sure I can ignore.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;So, I now have an AppFabric caching cluster with three servers. Onward to actually using it!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-340004835242208306?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/340004835242208306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=340004835242208306' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/340004835242208306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/340004835242208306'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2010/01/installing-appfabric-caching-beta-1.html' title='Installing AppFabric Caching Beta 1, Part 4'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-8082741220380036467</id><published>2009-12-18T20:48:00.001Z</published><updated>2009-12-18T20:50:59.133Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='caching'/><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><category scheme='http://www.blogger.com/atom/ns#' term='AppFabric'/><title type='text'>Installing AppFabric Caching Beta 1, Part 3</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;In &lt;a href="http://diaryofadotnetdeveloper.blogspot.com/2009/11/installing-appfabric-caching-beta-1.html"&gt;Part 1&lt;/a&gt; of this (unintentional) series, I talked about how the AppFabric installer works only with Integrated Security and so I needed a domain before I could install it, and in &lt;a href="http://diaryofadotnetdeveloper.blogspot.com/2009/11/installing-appfabric-caching-beta-1_24.html"&gt;Part 2&lt;/a&gt; I talked about how I then built said domain. At this point I tried once again to install AppFabric on CACHESERVER1, with all it's Integrated Security goodness. And failed. When the installer got to the configuration screen, I entered SQLSERVER in the connection string dialog, then clicked on the dropdownlist to get the list of databases on SQLSERVER. I then got a Timeout error in trying to retrieve the list of databases. No matter what I tried, I couldn't get this to work. I created a UDL file on CACHESERVER1, running Integrated Security, pointing at SQLSERVER, and confirmed that I could not only see SQLSERVER and retrieve a list of databases, but successfully connect to a database. I raised this as a question on &lt;a href="http://stackoverflow.com/questions/1804785/appfabric-installation-problem"&gt;StackOverflow&lt;/a&gt; and on the MSDN &lt;a href="http://social.msdn.microsoft.com/Forums/en/velocity/thread/79a69f4b-95dd-4eba-903c-3866f15f9c06"&gt;AppFabric Caching forum&lt;/a&gt; (where it looks like I'm &lt;a href="http://social.msdn.microsoft.com/Forums/en/velocity/thread/79a69f4b-95dd-4eba-903c-3866f15f9c06"&gt;not the only one&lt;/a&gt; having trouble with installations). And whilst it looks like at least some of the AppFabric team have been answering questions on the MSDN forum, I've had no answer at all to my posts. &lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Since then, my development laptop has been rebuilt with Windows 7, which has necessitated rebuilding my server environment from scratch with Virtual PC for Windows 7 (though there was a flirtation with &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt;, which I may yet go back to, although at the moment I find the process for setting up differencing disks a little too involved for my taste). With a rebuilt set of servers, I turned back to the AppFabric install, however there was one subtle difference in the server builds this time around. In trying to use the UDL files to verify that the server could contact the database ahead of the install, I encountered a problem that the SQL Server Native Client provider was not installed, so to fix this I installed the Client Connectivity bits from the SQL Server 2008 disc. When I then tried the AppFabric installer, this resolved the issue of not being able to any databases on the server. Result!&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Well, not really. Although this let me proceed with the installation, the installation failed with error code 2. And no explanation for what this error means or how to fix it. And once again, the MSDN Forum has (so far) been no help. I've tried a few other things since then, including using the XML Provider for storing the configuration information instead of SQL Server. This I actually watched as it created a ClusterConfig.xml file on the network share I'd set up (thus proving that the account had enough rights on the folder), and then&amp;nbsp; removed the file again. The installation failed with error code 2. Tonight I tried something else - when you select the SQL Server provider and go to enter the connection string, you can enter your own connection string, or leave it selected at Default. I tried it with Default, thinking that this would create, perhaps, a SQLExpress database that I could then transfer to my SQL Server. At the very least it would give me a working AppFabric installation that I could play with. No. Leaving the Default radio button checked does, from what I can see, nothing. There is no 'Default' connection string, in fact the installer doesn't even allow you to continue if you select this, making it the stupidest UI possible.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3XWsi_HTCuw/Syvou1TLXNI/AAAAAAAAADQ/wfXD0mpeqrk/s1600-h/AppFabric+Default+COnnection+String.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_3XWsi_HTCuw/Syvou1TLXNI/AAAAAAAAADQ/wfXD0mpeqrk/s640/AppFabric+Default+COnnection+String.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: left;"&gt;All of which leaves me totally stalled on working with AppFabric since I have yet to find a working configuration. It's all very tiresome. &lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-8082741220380036467?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/8082741220380036467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=8082741220380036467' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/8082741220380036467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/8082741220380036467'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/12/installing-appfabric-caching-beta-2.html' title='Installing AppFabric Caching Beta 1, Part 3'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3XWsi_HTCuw/Syvou1TLXNI/AAAAAAAAADQ/wfXD0mpeqrk/s72-c/AppFabric+Default+COnnection+String.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-4160211184068346762</id><published>2009-11-24T16:46:00.002Z</published><updated>2009-11-24T16:53:55.508Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='caching'/><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><category scheme='http://www.blogger.com/atom/ns#' term='VirtualPC'/><category scheme='http://www.blogger.com/atom/ns#' term='AppFabric'/><title type='text'>Installing AppFabric Caching Beta 1, Part 2</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;Last week I &lt;a href="http://diaryofadotnetdeveloper.blogspot.com/2009/11/installing-appfabric-caching-beta-1.html"&gt;blogged&lt;/a&gt; about how far I'd got with installing the AppFabric Beta 1 caching engine, in which I got stalled because the caching configuration only supports Integrated Security with SQL Server. In this part I'll cover how I've got round this problem by building a domain on my virtual servers. IT Pros may wish to skip ahead to Part 3 (or point out in the comments my no doubt numerous mistakes in how I've gone about this).I've used two reference sources in going about this: &lt;a href="http://support.microsoft.com/kb/324753"&gt;this&lt;/a&gt; Microsoft article, and &lt;a href="http://nxtgenug.spaces.live.com/"&gt;Dave&lt;/a&gt; &lt;a href="http://twitter.com/mcmahond"&gt;McMahon&lt;/a&gt;s Network Admin for Developers sessions (&lt;a href="http://video.nunney.me.uk/ddd7/A_Developers_Guide_to_Network_Admin_%20Part_1.wmv"&gt;part 1&lt;/a&gt; &lt;a href="http://video.nunney.me.uk/ddd7/A_Developers_Guide_to_Network_Admin_Part_2.wmv"&gt;part 2&lt;/a&gt;) from &lt;a href="http://video.nunney.me.uk/ddd7/"&gt;DDD7&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;My setup is as follows: &lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_3XWsi_HTCuw/Swv9aCHsMpI/AAAAAAAAACI/RhlMPfapxJM/s1600/AppFabric+Server+Configuration.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_3XWsi_HTCuw/Swv9aCHsMpI/AAAAAAAAACI/RhlMPfapxJM/s320/AppFabric+Server+Configuration.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;All servers are running Windows Server 2008 on Virtual PC 2007, and all on fixed IP addresses from 192.168.10.1 upwards. Liam's &lt;a href="http://geekswithblogs.net/twickers/archive/2009/10/04/135291.aspx"&gt;already blogged&lt;/a&gt; about my initial troubles in getting these servers to talk to each other - they currently all have each other's names and IP addresses in their hosts file.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;So, building the domain. Step 1 is installing the Active Directory Domain Services role on to SQLSERVER. This allowed me to create my velocity.local domain with SQLSERVER as the domain controller. I then created a pair of users, VelocityAdmin and VelocityUser - my plan is to use VelocityAdmin to install AppFabric onto the CACHESERVERs and then change it to use VelocityUser in normal usage, but we'll get to that in Part 3. I've also created SQL Server logons for those accounts with permissions on my VelocityConfig database.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;With the domain and domain controller all set up and running Active Directory and DNS I can now add the other servers to the domain, and this is where I hit a problem. Every time I tried to add CACHESERVER1 to the domain, I got an error:&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_3XWsi_HTCuw/SwwK0R21tmI/AAAAAAAAACQ/Zlaile3Fj3E/s1600/AppFabric+DNS+Error.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_3XWsi_HTCuw/SwwK0R21tmI/AAAAAAAAACQ/Zlaile3Fj3E/s320/AppFabric+DNS+Error.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;I tried a number of different things to get round this but eventually I figured it out - when I configured the network settings originally (in a non-domain world), I didn't setup a DNS server. Once I entered the IP address for SQLSERVER, I could join servers to the domain.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; font-family: Verdana,sans-serif; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3XWsi_HTCuw/SwwMPvs7qvI/AAAAAAAAACY/3Pq7E5DQeks/s1600/AppFabric+DNS+Corrected.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_3XWsi_HTCuw/SwwMPvs7qvI/AAAAAAAAACY/3Pq7E5DQeks/s640/AppFabric+DNS+Corrected.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;So at the end of all that I now have a network of servers all running under a domain. The next piece of the puzzle is to go back and try installing AppFabric Beta again, which will be Part 3 of this short series.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-4160211184068346762?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/4160211184068346762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=4160211184068346762' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4160211184068346762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4160211184068346762'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/11/installing-appfabric-caching-beta-1_24.html' title='Installing AppFabric Caching Beta 1, Part 2'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3XWsi_HTCuw/Swv9aCHsMpI/AAAAAAAAACI/RhlMPfapxJM/s72-c/AppFabric+Server+Configuration.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-8404539798367636157</id><published>2009-11-20T10:06:00.004Z</published><updated>2009-11-26T17:18:02.838Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='caching'/><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><category scheme='http://www.blogger.com/atom/ns#' term='AppFabric'/><title type='text'>Installing AppFabric Caching Beta 1, Part 1</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;So Velocity now has a 'proper' name - AppFabric Caching, and it's finally in beta.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;AppFabric Beta 1 can be downloaded from &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=0BD0B14F-D112-4F11-94BF-90B489622EDD&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=0BD0B14F-D112-4F11-94BF-90B489622EDD&amp;amp;displaylang=en&lt;/a&gt; but it has a big list of dependencies and Microsoft didn't link to the download page for each dependency :-(&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;So, things you will need to install before installing AppFabric Beta 1 on Windows Server 2008:&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Windows Server 2008 SP2 (&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=656C9D4A-55EC-4972-A0D7-B1A6FEDF51A7&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=656C9D4A-55EC-4972-A0D7-B1A6FEDF51A7&amp;amp;displaylang=en&lt;/a&gt;)&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;.Net Framework 3.5 SP 1 (&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=AB99342F-5D1A-413D-8319-81DA479AB0D7&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=AB99342F-5D1A-413D-8319-81DA479AB0D7&amp;amp;displaylang=en&lt;/a&gt;)&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;.Net Framework 4.0 Beta 2 (&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9F5E8774-C8DC-4FF6-8285-03A4C387C0DB&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=9F5E8774-C8DC-4FF6-8285-03A4C387C0DB&amp;amp;displaylang=en&lt;/a&gt;)&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;KB970772 and KB970773 hotfixes (&lt;a href="http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=970772&amp;amp;kbln=en-us"&gt;http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=970772&amp;amp;kbln=en-us&lt;/a&gt;) and (&lt;a href="http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=970773&amp;amp;kbln=en-us"&gt;http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=970773&amp;amp;kbln=en-us&lt;/a&gt;)&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;IIS Web Deployment Tool (&lt;a href="http://go.microsoft.com/?linkid=9684516"&gt;http://go.microsoft.com/?linkid=9684516&lt;/a&gt;)&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Powershell V2 RC (&lt;a href="https://connect.microsoft.com/windowsmanagement/Downloads/DownloadDetails.aspx?DownloadID=21268"&gt;https://connect.microsoft.com/windowsmanagement/Downloads/DownloadDetails.aspx?DownloadID=21268&lt;/a&gt;)&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Go get it all and install it - it's OK, I'll wait...&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Got all that? Good, let's continue...&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Fire up the AppFabric installer. Once you get past the licensing, you get to this screen:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3XWsi_HTCuw/SwVvLRC_MnI/AAAAAAAAABo/pXGFwdlnag4/s1600/AppFabric+Install+Screen+1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_3XWsi_HTCuw/SwVvLRC_MnI/AAAAAAAAABo/pXGFwdlnag4/s400/AppFabric+Install+Screen+1.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;This is where you select what to install. By default the Worker and Distributed Cache Service components are selected. The Worker component is for the Workflow and Windows Communications Frameworks parts of AppFabric. Assuming you're just interested in the caching side, unselect Worker and select the others.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Then we're into the caching configuration screen. If you installed one of the Velocity CTPs this will look fairly familiar.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/_3XWsi_HTCuw/SwVw4KNY_tI/AAAAAAAAABw/ywCAtDn6CAg/s1600/AppFabric+Install+Screen+2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_3XWsi_HTCuw/SwVw4KNY_tI/AAAAAAAAABw/ywCAtDn6CAg/s400/AppFabric+Install+Screen+2.png" /&gt;&lt;/a&gt; Note that the default is Join Cluster, not New Cluster, and that there's now a fourth port required (though it might have looked a bit better if the four ports had been arranged in ascending order).&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp;You can still choose whether to store the caching configuration in XML files on a network share or in a SQL Server database, but there are some changes here, especially in the way you enter a SQL Server connection string.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://1.bp.blogspot.com/_3XWsi_HTCuw/SwV6Qf9UuhI/AAAAAAAAAB4/WtVA6K0IO-k/s1600/AppFabric+Install+Screen+2+SQL+Selection.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_3XWsi_HTCuw/SwV6Qf9UuhI/AAAAAAAAAB4/WtVA6K0IO-k/s400/AppFabric+Install+Screen+2+SQL+Selection.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Whereas previously you could enter by hand a connection string, you now enter the name of the server and, once the list of databases has been retrieved from the server, the name of the database that holds the configuration information. The installer then creates the connection string for you. Or you can click the Default radio button and go with the default connection string. However as this puts nothing into the connection string box, you can't see what the default is. More annoyingly, if you do click the Default option, you then can't get back into this dialog to change your mind without cancelling out of the installer and starting the install again.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/_3XWsi_HTCuw/SwV7IZC69KI/AAAAAAAAACA/gcvCYrlWVnI/s1600/AppFabric+Install+Screen+2+SQL+Connection+String.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_3XWsi_HTCuw/SwV7IZC69KI/AAAAAAAAACA/gcvCYrlWVnI/s400/AppFabric+Install+Screen+2+SQL+Connection+String.png" /&gt;&lt;/a&gt;&lt;br /&gt;Note that the connection string is using Integrated Security. And you can't change it. And you can't set the account that AppFabric runs under. &lt;br /&gt;I liked the old installer where you entered your own connection string. It had a couple of quirks about what it considered to be a valid connection string, but that was OK because I'd learnt what they were. Now I feel like I've lost an element of control - I'd rather decide myself that I want Integrated Security, thank you.&lt;br /&gt;&lt;br /&gt;And this is as far as I've got on my Velocity demo setup. Every time I finish the install, it installs the caching engine but fails to configure it. I suspect this is because although I have a network of virtual servers set up, I now need to add a domain and accounts so that the Integrated Security works.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;a href="http://diaryofadotnetdeveloper.blogspot.com/2009/11/installing-appfabric-caching-beta-1_24.html"&gt;To be continued...&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-8404539798367636157?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/8404539798367636157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=8404539798367636157' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/8404539798367636157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/8404539798367636157'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/11/installing-appfabric-caching-beta-1.html' title='Installing AppFabric Caching Beta 1, Part 1'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3XWsi_HTCuw/SwVvLRC_MnI/AAAAAAAAABo/pXGFwdlnag4/s72-c/AppFabric+Install+Screen+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-503386624488425289</id><published>2009-10-31T17:36:00.001Z</published><updated>2009-10-31T17:52:16.739Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='stackoverflow'/><category scheme='http://www.blogger.com/atom/ns#' term='devday'/><title type='text'>StackOverflow DevDays Cambridge Review</title><content type='html'>&lt;div style="font-family: Verdana,sans-serif;"&gt;I attended the StackOverflow DevDays event in Cambridge yesterday, here's my review now I've had a little time to compose my thoughts...&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Overall I enjoyed it lots - I saw lots of interesting bits and pieces that I want to go back and investigate properly. Here's the session-by-session breakdown:&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Keynote - &lt;a href="http://joelonsoftware.com/"&gt;Joel Spolsky&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Joel's theme was Simplicity vs Power and the (perceived) paradox that giving users more choice makes them less happy. It was an interesting session with some food for thought about UI design.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Yahoo Developer Tools - &lt;a href="http://icant.co.uk/"&gt;Christian Heilmann&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;I'd expected this to be about the YUI Yahoo Javascript library, however it was actually more about creating mashups using Yahoo's YQL library. Which is fine because YQL seems very cool. It takes SQL and applies it to the Internet- sites like Flickr and Yahoo Maps look like tables and can be joined, so you could, say, put up a map and overlay it with pictures taken in the appropriate places. One thing that was very impressive was Christian's use of the tools to create a tag predictor for StackOverflow, which when you type a question, looks at what you've typed and uses it to generate a set of tags for the question - I expect we'll see this implemented on the site before too long.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;An audio recording of Christian's talk is &lt;a href="http://is.gd/4IibE"&gt;&lt;/a&gt;&lt;a href="http://www.archive.org/details/IntroductionToTheYahooDeveloperTools-StackoverflowDevdayCambridge"&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Seven Principles for Systems Security - &lt;a href="http://www.cl.cam.ac.uk/%7Efms27/"&gt;Frank Stajano&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;This talk showed the principles by which people get scammed, whether in a shell game in the real world, or as part of a 419 fraud. Frank used video from BBC's The Real Hustle to demonstrate some of these principles. Unfortunately I didn't think there was enough linking of the principles to designing security into systems, so whilst it was an interesting session, it was only generically so. Frank's original paper can be found &lt;a href="http://www.cl.cam.ac.uk/%7Efms27/papers/UCAM-CL-TR-754.pdf"&gt;here&lt;/a&gt;.&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;(I should mention that I don't think I'd fall for the scam involving the honeytrap - I'm a geek, if a pretty girl starts talking to &lt;i&gt;me&lt;/i&gt;, I'm instantly suspicious!)&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;FogBugz - Joel Spolsky&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;I saw Joel last time he came to Cambridge on the FogBugz World Tour, so I'd seen much of this before. The section on Kiln was new though, and it looks interesting. It does however rely on an available Internet connection - our company lost our main Internet feed last year for about six weeks, we'd have been boned if we'd been using it then.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;ASP.NET MVC - &lt;a href="http://blog.codeville.net/"&gt;Steve Sanderson&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;This was a tour through developing an application using the MVC stack for ASP.NET, although ASP.NET MVC 2.0 would have been a more accurate title as Steve used the MVC 2 bits for all his code. Which was no bad thing, and it was really interesting to see him using jQuery, including jQueryUI - I did feel that this session and the session after it would have worked better the other way round, with an intro to jQuery first and then showing it 'hands-on' integrating with ASP.NET. Steve went through it all really quickly, which I think may have worked against him a bit as he was on after lunch, however for a change in the first afternoon session of a conference I managed to stay awake and interested!&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;jQuery - &lt;a href="http://remysharp.com/"&gt;Remy Sharp&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;This was an overview of the core jQuery library, and although Remy was an engaging presenter, I felt it suffered a bit in trying to go through &lt;i&gt;everything &lt;/i&gt;that jQuery covers, I thought it would have worked better in focussing on some of the common tasks that developers need to address with JavaScript and showing how using jQuery makes it easier/less code etc. One thing Remy did cover was how to create a jQuery plugin, which takes a lot less code than I'd anticipated. At the end of the session Remy started to use jQuery to build a tag cloud based on the Twitter lists he's on, which was getting really interesting until he ran out time. I thought he was going to finish coding it in the break and then show it at the start of the next session, but actually he finished and demoed it in the break, so I missed it :-(&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Python&amp;nbsp; - &lt;a href="http://www.voidspace.org.uk/python/weblog/index.shtml"&gt;Michael Foord&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;The last technical session of the day was on IronPython, which is something I've flirted with learning now and again. Michael demonstrated using it to build a spell checker which uses the algorithm that Google uses when you mistype something and it comes back with 'Did you mean...'. Which is done in 21 lines of code and uses some statistical analysis based on some source text like a dictionary, the works of Shakespeare etc. It works out every permutation of letters based on what you typed and compares it to every word in the source text to find the most likely word you meant e.g. in the source text 'the' occurred about 80 000 times, meaning if you type 'teh' it's most likely you meant 'the' and that's what it matches you up with. Michael then demonstrated that the results of the algorithm can be fed into itself enabling it to correct two errors in a word. Very neat and worth some investigation.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;StackOverflow - &lt;a href="http://www.codinghorror.com/"&gt;Jeff Atwood&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Jeff talked about the evolution of the StackOverflow trilogy, the team, StackExchange and the importance of having someone hate you. He talked about how it's OK to fail sometimes as that means you are pushing the boundaries. But his main thrust wasn't particularly about coding at all, it was more about the importance of writing, which he said is probably the single most important skill for developers. He backed this up with quotes from people like Douglas Crockford and Jon Skeet. As part of this, he revealed the etymology of the Strunk and White badge on the SO sites - it comes from &lt;a href="http://www.amazon.co.uk/Elements-Style-William-Strunk-Jr/dp/020530902X/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1256988885&amp;amp;sr=8-1"&gt;this book&lt;/a&gt;, which certainly in the UK I don't think is known at all (I think &lt;a href="http://www.amazon.co.uk/New-First-Aid-English/dp/0340882875/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1256989016&amp;amp;sr=1-1"&gt;this&lt;/a&gt; may be the closest equivalent). (Jeff said on the way to the pub that he accidentally localised the site to the USA with this badge!)&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;As a result of seeing Jeff's thoughts on this, I resolve to try and write better SO answers!&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;On to the infrastructure:&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Even though I've worked in Cambridge for years, the colleges aren't somewhere I'm really familiar with. So although my satnav got me to the right road, I was then looking for the college. And I nearly drove right past it whilst looking for a sign for a car park. Which then led to my discovery that there was no car park - I ended up parking down a side street where I think I got just about the last space.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;Check-in was good - I'd expected there might have been a problem as I originally registered for the London day, then switched to Cambridge. Amiando would only let me print out a London ticket, but in the event there was no issue at all with this. And it was nice to run into my old friend &lt;a href="http://twitter.com/exogistic"&gt;Graham Parker&lt;/a&gt; helping out.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;The food was fine - having seen some of the talk on Twitter from London about what had happened there, I was a little concerned about this. I didn't try the biscuits or the fruit cake, but the main finger buffet lunch was fine, particularly the sausage rolls! I have to say, though, that having seen the tables laid out in the refectory, I'd expected we were actually having a sit-down lunch. The coffee was OK, not great by any means but it contained caffeine which, let's face it, is the important thing.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;In the hall itself I found the chairs pretty comfortable, but I'd have preferred chairs with a fold-out desk that you could have put a pad on to make notes.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;The big annoyance for me was the wi-fi - I was accessing it on my phone, which meant that I kept having to put the key in and then accept the terms &amp;amp; conditions. I would have thought an open connection would have been easier for everyone.&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Verdana,sans-serif;"&gt;All in all, a solid day's learning - I'll most likely be back next year!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-503386624488425289?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/503386624488425289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=503386624488425289' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/503386624488425289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/503386624488425289'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/10/stackoverflow-devdays-cambridge-review.html' title='StackOverflow DevDays Cambridge Review'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-3110182056367897971</id><published>2009-10-13T10:24:00.001+01:00</published><updated>2009-10-13T13:56:41.286+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Toshiba'/><category scheme='http://www.blogger.com/atom/ns#' term='VirtualPC'/><category scheme='http://www.blogger.com/atom/ns#' term='Tecra'/><title type='text'>Enabling Hardware Virtualisation On A Toshiba Tecra</title><content type='html'>&lt;span style="font-family: Verdana, sans-serif;"&gt;I've been doing a bit of playing recently with Virtual PC (and struggling, but that's a subject for a longer post). One of the options in Virtual PC is to selectively enable hardware-assisted virtualisation, however the option was greyed out on my Toshiba Tecra. Until yesterday when a chance comment by a colleague (who's also looking at VirtualPC to enable some work with SQL Server 2000 Analysis Services) let me know how to enable it...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;As your laptop boots, hit [Esc] to get into the BIOS setup. You should then get a prompt at the top of the screen that reads 'Check system and press F1' - hit F1 to get into the BIOS. On the first page of the BIOS on the right-hand side is a pane for virtualisation, with a setting for enabling it - it was disabled on mine, I suspect/assume that's how they leave the factory. Highlight the setting, hit [Space] to change it, then hit [End] to save your changes and restart the machine. Let it boot into Windows, fire up Virtual PC, and you should now find that hardware-assisted virtualisation is enabled.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;Edit: In my excitement to post this, there was something I forgot to add. I'd saved my running virtual machines, however when I fired them up again after enabling hardware virtualisation they would not run correctly. I needed to clear the saved state and fire them up again from scratch. Not an issue particularly, just something to be aware of.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-3110182056367897971?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/3110182056367897971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=3110182056367897971' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/3110182056367897971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/3110182056367897971'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/10/enabling-hardware-virtualisation-on.html' title='Enabling Hardware Virtualisation On A Toshiba Tecra'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-4736452245777410963</id><published>2009-09-24T11:13:00.000+01:00</published><updated>2009-09-24T11:13:18.300+01:00</updated><title type='text'>On the Demise of Visual Systems Journal</title><content type='html'>&lt;span style="font-family: Verdana,sans-serif;"&gt;I was disappointed to receive the latest edition of &lt;a href="http://www.vsj.co.uk/"&gt;Visual Systems Journal&lt;/a&gt; last week. Not because of anything in the content but because it's the last (print) issue. I've been reading VSJ for over a decade (I think - it's been going 12 years, and I'm &lt;i&gt;reasonably&lt;/i&gt; sure I received a copy of the first issue) and it's always been quite rewarding - there's always been at least one article in it that I've got something out of, and usually several. Their book reviews have also always been insightful.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;They are moving to being an entirely online publication, which means I probably won't see anything more from them - not only do I get prompted to actually read it when the physical magazine turns up on my desk, but I think things sink in deeper when I read them from a tangible page than a virtual one. And I won't get either of those benefits from looking at their website, assuming I remember to hit it at all. I see their website, ironically, still has the link offering free subscriptions.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana;"&gt;They also run the &lt;a href="http://www.devweek.com/"&gt;DevWeek&lt;/a&gt; (where I had my first real objects epiphany) and &lt;a href="http://www.software-architect.co.uk/"&gt;Software Architect&lt;/a&gt; conferences, although I always felt they never really made the most of these assets - they had high-quality people like John Robbins, Jeff Prosise and Don Box around and never got them to produce any articles.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-4736452245777410963?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/4736452245777410963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=4736452245777410963' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4736452245777410963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4736452245777410963'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/09/on-demise-of-visual-systems-journal.html' title='On the Demise of Visual Systems Journal'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-1763053391499685042</id><published>2009-08-11T21:39:00.002+01:00</published><updated>2009-08-11T21:56:21.245+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql server'/><category scheme='http://www.blogger.com/atom/ns#' term='Installer'/><title type='text'>SQL Server 2008 Installation Problem</title><content type='html'>I'm blogging this in the hope that it might help someone else who's struggling with an install...&lt;br /&gt;&lt;br /&gt;I had my laptop rebuilt last Friday, so I've spent the last two days at InstallFest :-) (I would have done most of my installing over the weekend but due to a slight oversight IT forgot to make my account an Administrator so all I could was download installers).&lt;br /&gt;&lt;br /&gt;I started installing SQL Server 2008 Developer last night at home, but hit a problem with it. I tried again and got the same error, the exact text of which I'm repeating here in case someone Googles for it:&lt;br /&gt;&lt;br /&gt;"Wait on the Database Engine recovery handle failed"&lt;br /&gt;&lt;br /&gt;I put it down to a flaky connection to our VPN (a reasonable guess since our VPN has been playing up for me for a few weeks, although I think me and IT solved this between us this afternoon), so I tried again this morning in the office. Same result.&lt;br /&gt;&lt;br /&gt;I Googled the error and found &lt;a href="http://support.microsoft.com/default.aspx/kb/960781"&gt;KB960781&lt;/a&gt; which has the exact error message, but applies to upgrading SQL to SQL 2008 where the sa account has been renamed. As I was doing a clean install, this wasn't likely to be my culprit.&lt;br /&gt;&lt;br /&gt;However, my fourth install attempt succeeded! What changed? I'd been configuring the SQL services to run  under the Network Service account, but for this install I changed the account to the local System account. I'm guessing I could now change this back to Network Service, but I'd rather not chance it. What was the underlying issue? Frankly, I've no idea - my working theory is that there are some permissions missing from my Network Service account.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-1763053391499685042?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/1763053391499685042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=1763053391499685042' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/1763053391499685042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/1763053391499685042'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/08/sql-server-2008-installation-problem.html' title='SQL Server 2008 Installation Problem'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-2606471819965076301</id><published>2009-08-07T11:23:00.003+01:00</published><updated>2009-08-11T22:22:52.688+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><category scheme='http://www.blogger.com/atom/ns#' term='world tour'/><category scheme='http://www.blogger.com/atom/ns#' term='nxtgen'/><title type='text'>@philpursglove is in Demo Hell</title><content type='html'>&lt;div&gt;Last Tuesday I took my new session on &lt;a href="http://blogs.msdn.com/velocity"&gt;Velocity&lt;/a&gt; to the &lt;a href="http://www.nxtgenug.net"&gt;NxtGen User Group&lt;/a&gt; at Oxford, having responded to &lt;a href="http://idunno.org"&gt;Barry&lt;/a&gt;'s plea for a speaker. And I had a bit of a &lt;a href="http://twitter.com/blowdart/status/3129829486"&gt;'mare&lt;/a&gt;. In fact, a lot of a &lt;a href="http://twitter.com/irtimaled/status/3130560602"&gt;'mare&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I knew I was in trouble when I fired up my laptop and the Velocity Powershell console showed an error immediately. So I tried to fix it by uninstalling and reinstalling only to discover that if you have no network connection  Velocity will not install. At all. It makes no difference whether you're using a network share on the local machine to store the cluster config, or trying to store it in a SQL database on the local machine - no network, no cache.&lt;br /&gt;&lt;br /&gt;So I'd like to thank everyone for listening and offering suggestions as to how I might have got things working faster. I've put my slides up at &lt;a href="http://philippursglove.com/velocity"&gt;http://philippursglove.com/velocity&lt;/a&gt; , but I'm doing a bit more work on the demos, I'll put them up later this week.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-2606471819965076301?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/2606471819965076301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=2606471819965076301' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2606471819965076301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2606471819965076301'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/08/philpursglove-is-in-demo-hell.html' title='@philpursglove is in Demo Hell'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-2552977011573318419</id><published>2009-07-01T09:01:00.005+01:00</published><updated>2009-08-14T23:12:56.136+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='&quot;code complete&quot;'/><category scheme='http://www.blogger.com/atom/ns#' term='&quot;book review&quot;'/><title type='text'>Book Review: Code Complete</title><content type='html'>&lt;div style="font-family: verdana;"&gt;Back in April, inspired by &lt;a href="http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/04/02/omg-someone-did-a-book-report.aspx"&gt;John Robbins' blogpost&lt;/a&gt; about it, I &lt;a href="http://diaryofadotnetdeveloper.blogspot.com/2009/04/answering-call.html"&gt;promised&lt;/a&gt; I'd read &lt;a href="http://www.play.com/Books/Books/4-/235865/Code-Complete/Product.html"&gt;Code Complete&lt;/a&gt; and review it here. I finished it last night (I confess I've read one or two other novels in between), but I can't believe it's taken me almost three months. Lest you think I'm some kind of slow reader, I will add at this point that there were also nights when I didn't read at all!&lt;br /&gt;As soon as I finished it I felt like I should pick it up again and start from scratch - it's easy to see why people read it once a year. It's also easy to see why those who have read it suggest that everyone else should read it too - it's chock full (and I mean it's absolutely full at 862 pages &lt;span style="font-style: italic;"&gt;plus&lt;/span&gt; bibliography and index) of tips, suggestions and methods to enable you to be a better developer.&lt;br /&gt;I loved the checklist at the end of each section that you can apply to your development processes - &lt;a href="http://cc2e.com/Page.aspx?nid=73"&gt;these&lt;/a&gt; are also available (registration required) on the book's &lt;a href="http://cc2e.com/"&gt;website&lt;/a&gt; though it's a slight disappointment that they aren't available as a Word or PDF download. &lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;The message of the book is that creating high-quality software doesn't have to cost more and/or take longer than creating low-quality software, and it then lays out tools to help you do that.&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: verdana;"&gt;It's nice to come across recommendation for things like coding styles and think 'I'm doing that already'. It's also good that the coding examples in the book are done in a variety of languages - I was fully expecting all the samples to be in C and therefore impenetrable to me, however they are done in a mix of C, Java and VB.&lt;br /&gt;&lt;br /&gt;What didn't I like? McConnell talks in several places about programming &lt;em&gt;into&lt;/em&gt; a language rather than programming &lt;em&gt;in&lt;/em&gt; a language, and if I'm honest I'm not qure I entirely got what he means with this. And I found it a bit dry in places, but then I'd expect a book on software engineering written by &lt;a href="http://www.matthewreilly.com/"&gt;Matthew Reilly&lt;/a&gt; (whose books are faster paced than anything else I've ever read) to be at least a &lt;span style="font-style: italic;"&gt;little&lt;/span&gt; dry.&lt;br /&gt;&lt;br /&gt;And I can already report some success traceable directly to Code Complete; I've tried laying out some code in a class using pseudocode that then forms the comments in the body of the code. And it is definitely a useful technique as I found it did make me think about the structure of the code before writing the code itself. So something to take forward there...&lt;br /&gt;&lt;br /&gt;What's next for me? I may read it again in a few months - I suspect it's going to go round all our team first as I have two takers lined up already. In the interim, I have Professional ASP.NET MVC to read. I guess I should also read Writing Secure Code as I haven't read that either!&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: verdana;font-family:verdana;" &gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-2552977011573318419?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/2552977011573318419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=2552977011573318419' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2552977011573318419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2552977011573318419'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/07/book-review-code-complete.html' title='Book Review: Code Complete'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-1856970846531810194</id><published>2009-06-24T10:59:00.004+01:00</published><updated>2009-06-25T10:15:46.526+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='world tour'/><category scheme='http://www.blogger.com/atom/ns#' term='scalability'/><category scheme='http://www.blogger.com/atom/ns#' term='VBUG'/><title type='text'>VBUG London</title><content type='html'>&lt;div style="FONT-FAMILY: verdana"&gt;My thanks to &lt;a href="http://vbug.com/"&gt;VBUG&lt;/a&gt; London for allowing me to speak on Tuesday night, and also to &lt;a href="http://www.samstir.com/"&gt;Sam&lt;/a&gt; and Keith for organising it. I hope everyone found the session useful - I really enjoyed it. And the pizza was good too :-)&lt;br /&gt;&lt;br /&gt;I've updated the slides and code samples at &lt;a href="http://www.philippursglove.com/ScalableASPNET"&gt;http://www.philippursglove.com/ScalableASPNET&lt;/a&gt; - the Velocity demo is now updated to Velocity CTP3. I re-ran the Velocity demo yesterday morning and it worked perfectly. I suspect that it failed on Tuesday as my laptop couldn't contact a domain controller to verify my admin credentials :-(&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-1856970846531810194?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/1856970846531810194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=1856970846531810194' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/1856970846531810194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/1856970846531810194'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/06/vbug-london.html' title='VBUG London'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-3415178884788463233</id><published>2009-05-26T16:45:00.008+01:00</published><updated>2009-06-01T17:22:40.809+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LDNUG'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='VBUG'/><title type='text'>What I Learned Last Week</title><content type='html'>&lt;span style="font-family:verdana;"&gt;I went down to London twice last week for user groups; &lt;a href="http://vbug.com/"&gt;VBUG&lt;/a&gt; on Tuesday for 'How To Stop Your Website Being Stung', and &lt;a href="http://dnug.org.uk/"&gt;DNUG&lt;/a&gt; on Thursday for 'WebForms vs MVC'.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;How To Stop Your Website Being Stung&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I was pleased to see this session from the ever-present &lt;a href="http://idunno.org/"&gt;Barry Dorrans&lt;/a&gt; as I'd wanted to see it at WebDD but went to &lt;a href="http://andrewwestgarth.co.uk/"&gt;Andy Westgarth&lt;/a&gt;'s session instead. Barry took us through the &lt;a href="http://owasp.org/"&gt;OWASP&lt;/a&gt; &lt;a href="http://www.owasp.org/index.php/Top_10_2007"&gt;Top Ten list of web application vulnerabilities&lt;/a&gt;, and demonstrated how to mitigate against them in code. This was a really good session for me as it's directly relevant to some security testing I've been involved with recently. Among the highlights were:&lt;br /&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;Use the &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.permissions.principalpermission.aspx"&gt;PrincipalPermission&lt;/a&gt; attribute to protect your code.&lt;/li&gt;&lt;li&gt;When outputting user-entered content, HTMLEncode it - this protects you against persistent cross-site scripting that makes it past your input checking.&lt;/li&gt;&lt;li&gt;Use the &lt;a href="http://antixss.codeplex.com/"&gt;AntiXSS library&lt;/a&gt;'s HTMLEncode method rather than the HttpServerUtility object's version as the AntiXSS library has more tests.&lt;/li&gt;&lt;li&gt;Don't trust MIME types for uploaded files - I didn't know you could futz with this, although in retrospect I don't know why I'm surprised either.. And obviously never trust the uploaded file's extension (hangs head in shame).&lt;/li&gt;&lt;li&gt;Use salts every time you do any form of encryption.&lt;/li&gt;&lt;li&gt;Don't leak information. This could be through viewstate, or a &lt;a href="http://en.wikipedia.org/wiki/Yellow_Screen_of_Death#Yellow"&gt;YSOD&lt;/a&gt;. &lt;/li&gt;&lt;li&gt;Pages have an OnError event, which you can use to call Server.Transfer to switch to your error screen, which doesn't indicate to the client that an error occurred.&lt;/li&gt;&lt;/ul&gt;And those are just the points I noted down, there was lots more good info. Barry's slides are available &lt;a href="http://idunno.org/presentations/webdd09/Dontgetstung.pptx"&gt;here&lt;/a&gt;, and the code samples are &lt;a href="http://idunno.org/presentations/webdd09/DontgetstungSamples.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;WebForms vs MVC&lt;/strong&gt;&lt;br /&gt;I'd been looking forward to this meeting for a couple of weeks, and I wasn't disappointed. Billed as &lt;a href="http://farm4.static.flickr.com/3590/3582145004_00245b1d92.jpg?v=0"&gt;Clash of the Titans&lt;/a&gt;, this featured &lt;a href="http://weblogs.asp.net/plip"&gt;Phil Winstanley&lt;/a&gt; speaking for WebForms and &lt;a href="http://serialseb.blogspot.com/"&gt;Sebastian Lambla&lt;/a&gt; on the side of MVC. It was the first time I've seen Seb present, and he's, um, energetic :-) I thought Seb got sidetracked into more of a TDD demonstration halfway through rather than keeping on topic with MVC. It was interesting to see Phil do some ASP.NET testing with WaTiN - it's something I must look at. There's a &lt;a href="http://developerdeveloperdeveloper.com/"&gt;DDD&lt;/a&gt; session waiting to happen for someone to do some comparisons between &lt;a href="http://watin.sourceforge.net/"&gt;WaTiN&lt;/a&gt;, &lt;a href="http://seleniumhq.org/"&gt;Selenium&lt;/a&gt; and the &lt;a href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=22739"&gt;Lightweight Test Framework&lt;/a&gt; - ASP.NET Testing Smackdown anyone? Nice to see SessionPageStatePersister make an appearance too - everyone should use it!&lt;br /&gt;&lt;br /&gt;As holder of the WebForms Thumb (you had to be there!) I'd love to report that Phil carried the day, however &lt;a href="http://blog.mrlacey.co.uk/2009/05/aspnet-mvc-vs-webforms.html"&gt;commentators&lt;/a&gt; agreed it was a draw, but it would be interesting (hint hint guys!) to see a 'rematch' once there is some guidance on what types of application suit either school of thought - this is definitely the weak spot with MVC right now.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-3415178884788463233?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/3415178884788463233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=3415178884788463233' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/3415178884788463233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/3415178884788463233'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/05/what-i-learned-last-week.html' title='What I Learned Last Week'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-2967889134224833346</id><published>2009-04-28T19:26:00.004+01:00</published><updated>2009-04-28T22:48:49.751+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Today's Learning Points - AutoCompleteType &amp; RegisterStartupScript</title><content type='html'>&lt;span style="font-family:verdana;"&gt;Just wanted to share a couple of things I discovered in ASP.NET today.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;AutoCompleteType&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;We had some security testing done on our main web app a few months ago, as a result of which we did work around things like password expiry, complexity etc. We got retested last week and we've been asked to review three points, which I've been looking at today. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;One of the points was that on our login page, our password textbox is auto-completable. So I edited the page today to add "autocomplete='off'", however as I started typing Intellisense kicked in and revealed to me the &lt;/span&gt;&lt;a style="font-family: verdana;" href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.autocompletetype%28loband%29.aspx"&gt;AutoCompleteType attribute&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;. I'd never seen this before! There's a whole Enum of options you can use for autocompletion, or if you set AutoCompleteType="None" then input elements that share a common ID will share their values for autocompletion.&lt;br /&gt;To output "autocomplete='off'" the ASP.NET markup is &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;asp:textbox runat="server" id="TextBox1" autocompletetype="Disabled"&gt;&lt;/asp:textbox&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;However when I was checking the output in View Source, the autocomplete attribute wasn't being rendered at all, presumably because, duh, it opens a security hole. So how did our testers pick up on this? We suspect they'd used the 'Do you want &lt;browser&gt; to remember this password' feature, which we don't believe we can defend against.&lt;/browser&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:verdana;" &gt;RegisterStartupScript&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;I dropped some project work onto our internal test site last week, where I've done some enhancements and also moved the project up to ASP.NET 3.5 and added a couple of UpdatePanels with some controls from the AjaxControlToolkit. I had an email today from our user who is doing some testing, who said that some of the buttons didn't seem to do anything eny more. I ran the project upon my laptop, checked it and found I was seeing the same behaviour. I dug into the code and reminded myself that the buttons that weren't working, worked by emitting some script using ClientScriptManager.RegisterStartupScript. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Knowing that the major change to the page was to add UpdatePanels, it didn't take much to deduce that a combination of UpdatePanels and partial page rendering had broken the RegisterStartupScript model. But how to solve it? My first thought was to change the ScriptManager's rendering mode to disable partial page rendering on the basis that if you re-render the entire page then a startup script might be correctly emitted, however on trying this I learned you can't change the rendering mode in any event that occurs after Page_Init. But I did spot that there are several other methods on ScriptManager, including  one called RegisterStartupScript. I swapped out my calls from ClientScript.RegisterStartupScript to ScriptManager.RegisterStartupScript, ran it up, and success, my buttons were functional once more. And I should go on to learn the other methods of ScriptManager...&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-2967889134224833346?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/2967889134224833346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=2967889134224833346' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2967889134224833346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2967889134224833346'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/04/todays-learning-points-autocompletetype.html' title='Today&apos;s Learning Points - AutoCompleteType &amp; RegisterStartupScript'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-7844203568313801980</id><published>2009-04-19T19:24:00.006+01:00</published><updated>2009-04-21T20:38:04.537+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='&quot;Visual Studio&quot;'/><category scheme='http://www.blogger.com/atom/ns#' term='vNext'/><category scheme='http://www.blogger.com/atom/ns#' term='DDD'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='webdd'/><title type='text'>WebDD Roundup</title><content type='html'>I had a really enjoyable day at &lt;a href="http://developerdeveloperdeveloper.com/webdd09"&gt;WebDD&lt;/a&gt; yesterday. Aside from presenting &lt;a href="http://diaryofadotnetdeveloper.blogspot.com/2009/04/aspnet-scalability-at-webdd.html"&gt;my own session&lt;/a&gt; and catching up with people like &lt;a href="http://www.andrewwestgarth.co.uk/Blog/"&gt;Andy Westgarth&lt;/a&gt; and &lt;a href="http://idunno.org/archive/2009/04/18/donrsquot-get-stung-ndash-an-introduction-to-the-owasp-top.aspx"&gt;Barry&lt;/a&gt;, I attended four other sessions:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ASP.NET 3.5 - Miss something? - &lt;a href="http://blog.hmobius.com/"&gt;Dan Maharry&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;This was a really interesting session covering a number of out-of-band releases from Microsoft that may have been a little overshadowed by the ASP.NET MVC release. For me, the high points that I need to go off and investigate further are:&lt;br /&gt;&lt;a style="font-style: italic;" href="http://www.codeplex.com/aspnet/Wiki/View.aspx?title=ASP.NET%20QA&amp;amp;referringTitle=Home"&gt;Lightweight Test Framework&lt;/a&gt;&lt;br /&gt;This is a framework which was initially used internally by Microsoft's QA teams for ASP.NET but has now been released on Codeplex. It is a single DLL which works cross-browser and supports integration testing for ASP.NET sites. It also supports AJAX callbacks.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;AJAX HistoryState and Back-button Support&lt;/span&gt;&lt;br /&gt;This is a feature that was added in ASP.NET 3.5 SP1. It provides a method enabling the Back button to be fully supported by AJAX postbacks so that the browser's History list includes entries showing different states. I'm afraid I threw Dan a little bit as I asked about how well supported this is across different browsers - my thoughts were that I could see this would work with IE but I wasn't really expecting it to work in Firefox (or, to be frank, any other browser). However Dan confirmed that it does work in Firefox, though he hadn't tested it in against the other browsers. Definitely one to look into.&lt;br /&gt;&lt;a style="font-style: italic;" href="http://msdn.microsoft.com/en-us/library/cc488552.aspx"&gt;Composite Scripts&lt;/a&gt;&lt;br /&gt;This is a method by which a number of JScript references can be combined into a single file, meaning your site only has one file to download instead of opening up a number of connections to download seperate files. I was unsure about this from a scalability point of view as it involves referencing scripts inside the ScriptManager control (which normally prevents the browser caching scripts since the URL is different for each postback), however the combined file is also put into the output cache instead of being compiled on the fly.&lt;br /&gt;This was Dan's first time presenting at a DDD but I thought he presented very well and I'd like to see more from him in the future.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What's Good in .NET 4.0 and VS2010 - &lt;a href="http://www.simpleisbest.co.uk/"&gt;Alex Mackey&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;This session covered a number of things from the next release of the CLR and Visual Studio 2010. The things that stood out for me from this session were:&lt;br /&gt;The improved code editing experience, including highlighting of every instance of a method call whenever you enter one of them, and showing the hierarchy of calls down to the method you are currently editing.&lt;br /&gt;Something called &lt;span style="font-style: italic;"&gt;variance &lt;/span&gt;and &lt;span style="font-style: italic;"&gt;contravariance &lt;/span&gt;- I'll be honest, I didn't understand this. At all.&lt;br /&gt;For ASP.NET:&lt;br /&gt;Much better control around disabling Viewstate, including better support in the grid controls around working without Viewstate.&lt;br /&gt;Static client IDs for controls.&lt;br /&gt;The ability to compress Viewstate (though attendees to &lt;a href="http://diaryofadotnetdeveloper.blogspot.com/2009/04/aspnet-scalability-at-webdd.html"&gt;my session&lt;/a&gt; will have seen that this is possible in ASP.NET 2.0)&lt;br /&gt;Environment-specific changes for web.config files e.g. web.config.debug, which looks like a mix of XSLT and the .dconfig configuration deltas from the Enterprise Library.&lt;br /&gt;Better server-side control over META tags, for those developers interested in SEO-type activities.&lt;br /&gt;&lt;br /&gt;For Workflow:&lt;br /&gt;Performance improvements - up to 10x better performance.&lt;br /&gt;A new workflow type, the Flowchart, which is a hybrid between the existing Sequential and State Machine workflows.&lt;br /&gt;It will be easier to include information in a workflow, hopefully remving the need for the ExternalDataExchange object.&lt;br /&gt;Overall, Alex' recommendation was that if you're currently thinking of developing a workflow application, wait for this version. This was particularly relevant for me, as I'm currently looking at a workflow app for a project at work.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;I want it on that one, that one and that one! And it all needs to be synched!&lt;/span&gt; - &lt;a href="http://www.andrewwestgarth.co.uk"&gt;Andy Westgarth&lt;/a&gt;&lt;br /&gt;This session from VBUG Chairman Andy Westgarth covered the new Web Deployment bits coming from Microsoft. This tool is built on top of MSBuild and allows you build deployment packages to be deployed to IIS. These packages are not MSIs, the idea of the tool is to produce a package that can be passed to IT types without the need to handhold them as they deploy your application. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ASP.NET 4.0&lt;/span&gt; - &lt;a href="http://www.mikeo.co.uk"&gt;Mike Ormond&lt;/a&gt;&lt;br /&gt;This session from Mike Ormond of Microsoft was, like Alex, concerned with .NET 4.0, however it was much more focussed on ASP.NET. The highlights I picked out were:&lt;br /&gt;VS2010 is going to be productivity-focussed - there will be a new range of snippets for both HTML and AJAX authoring, although Mike pointed out that a snippet called '&lt;span style="font-family: courier new;"&gt;requiredfieldvalidator&lt;/span&gt;' doesn't actually save you much typing. A nice feature is that when you add a validator, it will try and attach itself to the nearest control that can be validated - nice, but it seems Microsoft haven't grasped that not many people use the designer, they code the HTML in Source View.&lt;br /&gt;Mike covered some of the new provider-based caching functionality and demonstrated a custom cache provider. Velocity was mentioned, but only as one of the available providers. Mike also mentioned that the existing System.Web.Cache namespace is likely going to be moved to a more general namespace, which explains the decision of the Velocity team to &lt;a href="http://blogs.msdn.com/velocity/archive/2009/04/08/announcing-velocity-ctp3.aspx"&gt;change their namespace&lt;/a&gt; - it seems likely to me that SYstem.Web.Cache will become System.Data.Caching. This is a small change but will clear up a lot of &lt;a href="http://www.hanselman.com/blog/UsingTheASPNETCacheOutsideOfASPNET.aspx"&gt;confusion&lt;/a&gt; over whether you should use System.Web.Cache in a WinForms application.&lt;br /&gt;In WebForms, the need for the &lt;a href="http://www.asp.net/cssadapters/"&gt;CSSFriendly&lt;/a&gt; adapters will go away - controls will be much easier to style in CSS out of the box. Mike also covered the Routing engine (which was split off from the MVC effort) which gives you much better control over URLs you generate inside your application, and the NamingPanel, a new control which is part of increased control you will have over client IDs.&lt;br /&gt;&lt;br /&gt;I'd have liked to have seen Andy Gibson's session on jQuery but it was on at the same time as me :-( however all the sessions have been videoed so I will be able to see it on the web!&lt;br /&gt;I had a great day, it was just a shame I couldn't stick around for beers afterwards. Next time!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-7844203568313801980?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/7844203568313801980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=7844203568313801980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/7844203568313801980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/7844203568313801980'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/04/webdd-roundup.html' title='WebDD Roundup'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-6705254191535285165</id><published>2009-04-18T21:22:00.004+01:00</published><updated>2009-04-19T18:32:35.683+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='caching'/><category scheme='http://www.blogger.com/atom/ns#' term='DDD'/><category scheme='http://www.blogger.com/atom/ns#' term='webdd'/><category scheme='http://www.blogger.com/atom/ns#' term='world tour'/><category scheme='http://www.blogger.com/atom/ns#' term='scalability'/><category scheme='http://www.blogger.com/atom/ns#' term='compression'/><title type='text'>ASP.NET Scalability at WebDD</title><content type='html'>&lt;span style="font-family:verdana;"&gt;Thanks to everyone who attended my session on ASP.NET scalability at &lt;/span&gt;&lt;a style="font-family: verdana;" href="http://www.developerdeveloperdeveloper.com/webdd09"&gt;WebDD&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; today - I hope you all found it useful. I got to the end of the section on caching, which is more or less the first half, and realised I had ten minutes left for the entire second half, so apologies for having to race through the rest of the slides. If anyone has any questions please feel free to post them in the comments here and I'll answer them.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;I had a few questions afterwards over coffee, which were:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Q) Output Caching. Can you VaryBy things other than elements in the QueryString?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;A) Yes, there are a range of VaryBy options: VaryByContentEncoding, VaryByControl, VaryByHeader, and VaryByCustom. In each case ultimately it boils down to a string. There's a discussion of all these options on &lt;/span&gt;&lt;a style="font-family: verdana;" href="http://msdn.microsoft.com/en-us/library/hdxfb6cy%28loband%29.aspx"&gt;MSDN&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;, but basically VaryByContentEncoding's probably not going to help you too much since this looks at what encodings your browser can accept e.g. compressed content (and remember that I mentioned all the current browsers (and previous generation browsers) can accept compressed content). VaryByHeader looks at a semi-colon seperated list of HTTP headers. VaryByControl looks at the controls declared inside a UserControl. VaryByCustom is perhaps the most interesting as it allows you to roll your own scheme by implementing GetVaryByCustomString in your Global.asax file, or if you set it to 'browser' it caches page instances based on the browser name and major version.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Q) Is there a reason not to use VaryByParam=*?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;A) VaryByParam=* will cache pages on &lt;/span&gt;&lt;span style="font-style: italic;font-family:verdana;" &gt;all combinations&lt;/span&gt;&lt;span style="font-family:verdana;"&gt; of elements in the QueryString - I can only tell you what it does, it's up to you to decide whether this facility is going to fit into your application or not.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Q) Can you cache objects for longer than 20 minutes?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;A) Yes. If you use sliding expiration, it takes a System.TimeSpan object. TimeSpan has three constructors - I used the hours/minutes/seconds constructor, but there's nothing to stop you using the second constructor which adds a days parameter onto the constructor. Bear in mind, however, that doing that means you're sacrificing that much memory on your server for that length of time. As with so many things in scalability, it's a trade-off...&lt;br /&gt;&lt;br /&gt;Q) Do you need command-line access to your server to enable a SQL database for SQLCacheDependencies?&lt;br /&gt;A) No. There's two options here: one is to keep in mind that the ASPNET_REGSQL command-line tool takes a server name from the -S parameter - this can be any SQL server that is on your network, you don't have to run the tool locally to the server you're enabling.&lt;br /&gt;The second option is to use the SqlCacheDependencyAdmin static class, which gives you the ability to programmatically enable and disable databases and tables for cache dependencies.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-6705254191535285165?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/6705254191535285165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=6705254191535285165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/6705254191535285165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/6705254191535285165'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/04/aspnet-scalability-at-webdd.html' title='ASP.NET Scalability at WebDD'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-382079794605282557</id><published>2009-04-16T13:48:00.003+01:00</published><updated>2009-04-29T14:53:32.348+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><category scheme='http://www.blogger.com/atom/ns#' term='Installer'/><title type='text'>Manually Uninstalling Velocity CTP2</title><content type='html'>&lt;span style="font-family:verdana;"&gt;Now that &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=b24c3708-eeff-4055-a867-19b5851e7cd2"&gt;Velocity CTP3&lt;/a&gt; is out I was looking forward to installing it however going through Add/Remove Programs it prompted me to locate the original installation MSI. Which I haven't got any more :-(&lt;br /&gt;&lt;br /&gt;However I contacted the &lt;a href="http://blogs.msdn.com/velocity"&gt;Velocity team&lt;/a&gt; and they sent me instructions for manually removing CTP2.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;"Note: To un-install Velocity CTP bits use 'Add-Remove Program', however for scenarios where a user is unable to un-install e.g.&lt;br /&gt;'Add-Remove Program' entry is missing, following workaround of using manual steps for un-installation can be used, but they need to be done at users discretion.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;Below steps assume removal of Velocity Service and product from a single machine, to un-install multi node Velocity cluster below steps need to be performed on each machine (node)&lt;br /&gt;&lt;br /&gt;1. Under 'Administration Tools' -&gt; 'Services' ensure that Velocity service DistributedCacheService with Display Name "Microsoft project code named "Velocity" is stopped&lt;br /&gt;&lt;br /&gt;2. Go to Command Prompt and use SC.EXE command to delete velocity service i.e.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SC.EXE delete DistributedCacheService&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;3. To ensure removal of entries from 'Add-Remove Program' for existing 'Velocity Installer', Download and install 'Windows Installer Cleanup Tool' as per following KB&lt;br /&gt;&lt;a href="http://support.microsoft.com/kb/290301"&gt;http://support.microsoft.com/kb/290301&lt;/a&gt; , Or directly from&lt;br /&gt;&lt;a href="http://download.microsoft.com/download/e/9/d/e9d80355-7ab4-45b8-80e8-983a48d5e1bd/msicuu2.exe"&gt;http://download.microsoft.com/download/e/9/d/e9d80355-7ab4-45b8-80e8-983a48d5e1bd/msicuu2.exe&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Launch the above installed Tool and from the list choose 'Microsoft project code name "Velocity" CTP2' and select Remove&lt;br /&gt;&lt;br /&gt;4. Next delete files under installed folder, typically under \Program Files\Microsoft Distributed Cache\V1.0&lt;br /&gt;&lt;br /&gt;5. Remove 'Firewall Exception' for DistributedCacheService&lt;br /&gt;&lt;br /&gt;6. If Cluster Config Store chosen during installation was 'XML'&lt;br /&gt;or 'SQL Server Compact' then remove the files from the Network Share Folder (which was provided during installation)&lt;br /&gt;&lt;br /&gt;Else if 'SQLClient Provider' was used as the Cluster Config Store then -&lt;br /&gt;&lt;br /&gt;Drop the database (provided as 'Initial Catalog' ) which was mentioned in the connection string during installation.&lt;br /&gt;&lt;br /&gt;or, To avoid Dropping the database in case you want to keep it, you can also just drop the table 'dbo.config' present in the above mentioned database."&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;I haven't tried these instructions out yet as I don't want to fry my laptop ahead of WebDD this weekend but I will try them next week and report back.&lt;/p&gt;&lt;/span&gt;&lt;p&gt;UPDATE: I ran through these instructions last week, for me they worked perfectly. The only thing I struggled with was the fact that IT have locked down the UI for firewall exceptions so I couldn't remove the ones I had set up. However I was able to remove them by hacking the Registry.&lt;/p&gt;&lt;span style="font-family:verdana;"&gt;&lt;p&gt;I now have Velocity CTP3 installed - details coming soon!&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-382079794605282557?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/382079794605282557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=382079794605282557' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/382079794605282557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/382079794605282557'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/04/manually-uninstalling-velocity-ctp2.html' title='Manually Uninstalling Velocity CTP2'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-996361224194566440</id><published>2009-04-03T09:54:00.002+01:00</published><updated>2009-04-03T10:12:15.649+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='&quot;code complete&quot;'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Answering the call</title><content type='html'>One of the feeds in my &lt;a href="http://my.live.com/"&gt;live.com&lt;/a&gt; Tech tab (which is distinct from my Microsoft tab :-) ) is Wintellog, which is an aggregated feed of all the bloggers at &lt;a href="http://www.wintellect.com/"&gt;Wintellect&lt;/a&gt;. I've seen several of these guys speak over the years, mostly at &lt;a href="http://www.devweek.com/"&gt;DevWeek&lt;/a&gt; - they are all top-notch and I thoroughly recommend seeing them if you get chance.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Yesterday &lt;a href="http://www.wintellect.com/CS/blogs/jrobbins/default.aspx"&gt;John Robbins&lt;/a&gt; wrote something of &lt;a href="http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/04/02/omg-someone-did-a-book-report.aspx"&gt;a call to action&lt;/a&gt;: read &lt;a href="http://www.play.com/Books/Books/4-/235865/Code-Complete/Product.html"&gt;Code Complete&lt;/a&gt; and write a 'book report' on it as a comment in his blog.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Guilty confession time: I've never read it, despite it being on my desk for a number of years. It's not something I'm proud of, but I'm confessing. And I'm undertaking to answer the call: I took it home last night, and I'm going to read it (as soon as I finish the excellent &lt;a href="http://www.play.com/Books/Books/4-/5324931/The-Six-Sacred-Stones/Product.html"&gt;Six Sacred Stones&lt;/a&gt;). I'll post my review here as well as on John's blog, and I encourage everyone to do the same.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-996361224194566440?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/996361224194566440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=996361224194566440' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/996361224194566440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/996361224194566440'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/04/answering-call.html' title='Answering the call'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-5997524878998980093</id><published>2009-03-26T09:41:00.003Z</published><updated>2009-03-30T10:00:15.684+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DDD'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='webdd'/><category scheme='http://www.blogger.com/atom/ns#' term='world tour'/><category scheme='http://www.blogger.com/atom/ns#' term='scalability'/><title type='text'>Speaking at WebDD</title><content type='html'>&lt;span style="font-family:verdana;"&gt;I had an email from &lt;a href="http://www.secretvolcanolair.co.uk/"&gt;Phil Winstanley&lt;/a&gt; overnight to say that my talk on writing &lt;a href="http://www.philippursglove.com/ScalableASPNET"&gt;scalable ASP.NET&lt;/a&gt; has been accepted for &lt;a href="http://www.developerdeveloperdeveloper.com/webdd09"&gt;WebDD&lt;/a&gt; at Reading on 18th April.&lt;br /&gt;&lt;br /&gt;I'm looking forward to running it again, this'll be the third outing. Maybe &lt;a href="http://idunno.org/archive/2009/03/26/irsquom-presenting-at-webdd.aspx"&gt;Barry&lt;/a&gt;'ll get to it this time...&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Update: &lt;a href="http://developerdeveloperdeveloper.com/webdd09/Register.aspx"&gt;Delegate registration&lt;/a&gt; is now open. Book early to avoid disappointment.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-5997524878998980093?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/5997524878998980093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=5997524878998980093' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/5997524878998980093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/5997524878998980093'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/03/speaking-at-webdd.html' title='Speaking at WebDD'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-486069440080551361</id><published>2009-03-04T11:01:00.004Z</published><updated>2009-03-05T14:54:49.463Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='caching'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='world tour'/><category scheme='http://www.blogger.com/atom/ns#' term='scalability'/><category scheme='http://www.blogger.com/atom/ns#' term='nxtgen'/><title type='text'>Thanks to NxtGen Oxford</title><content type='html'>&lt;span style="font-family:verdana;"&gt;Thanks to everyone at NxtGen Oxford who came to see my ASP.NET scalability presentation last night. The code and slides are available for you to download at &lt;/span&gt;&lt;a style="FONT-FAMILY: verdana" href="http://www.philippursglove.com/ScalableASPNET"&gt;http://www.philippursglove.com/ScalableASPNET&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;. I haven't had chance yet to work out why the SqlCacheDependency demo didn't behave, I'll look at this later on today and update this blog entry when I've worked it out! Feel free to email me at phil@philippursglove.com or comment here if there are things that need more explanation or you just want to discuss something.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;Update: I just figured out why the &lt;span style="font-family:courier new;"&gt;aspnet_regsql&lt;/span&gt; command-line was failing when I tried to enable my Northwind database for caching. I hibernated my laptop when I left the office on Tuesday afternoon, on Tuesday evening when I switched it back on it couldn't contact our domain. So when I tried to run &lt;span style="font-family:courier new;"&gt;aspnet_regsql&lt;/span&gt; with the '-E' switch for integrated authentication, I couldn't be authenticated against our domain and consequently SQL Server's security (correctly) wouldn't let me do anything. If I'd instead used the '-U' and '-P' switches with an administrator username and password it would have worked.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-486069440080551361?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/486069440080551361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=486069440080551361' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/486069440080551361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/486069440080551361'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/03/thanks-to-nxtgen-oxford.html' title='Thanks to NxtGen Oxford'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-273917634617651705</id><published>2009-02-19T13:21:00.002Z</published><updated>2009-02-19T13:24:40.563Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='DDD'/><category scheme='http://www.blogger.com/atom/ns#' term='webdd'/><category scheme='http://www.blogger.com/atom/ns#' term='world tour'/><title type='text'>WebDD</title><content type='html'>&lt;span style="font-family:verdana;"&gt;I was pleased to see a tweet from &lt;a href="http://weblogs.asp.net/plip/"&gt;Phil Winstanley&lt;/a&gt; yesterday announcing that there will be another &lt;a href="http://developerdeveloperdeveloper.com/webdd09/"&gt;WebDD&lt;/a&gt; this year. I went to the one in 2007 and had a fab time.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Once I've come up with some words about myself I'll be submitting my scalability in ASP.NET session. I'm also trying to write a session on scalability with Velocity - maybe this'll be the kick I need...&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-273917634617651705?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/273917634617651705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=273917634617651705' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/273917634617651705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/273917634617651705'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/02/webdd.html' title='WebDD'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-242254619591801447</id><published>2009-02-07T16:45:00.002Z</published><updated>2009-02-07T17:00:01.734Z</updated><title type='text'>Twitter</title><content type='html'>&lt;span style="font-family: verdana;"&gt;My tweets are &lt;a href="http://twitter.com/philpursglove"&gt;now available&lt;/a&gt;. &lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-242254619591801447?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/242254619591801447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=242254619591801447' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/242254619591801447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/242254619591801447'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/02/twitter.html' title='Twitter'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-5059062582074350432</id><published>2009-01-23T14:44:00.002Z</published><updated>2009-02-07T16:08:48.118Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='web.config'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>web.config Administration</title><content type='html'>&lt;div&gt;&lt;span style="font-family:verdana;"&gt;This sucks :-(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;I was deploying a new ASP.NET 3.5 application to our web servers this afternoon, which uses the AjaxControlToolkit. As part of this the web.config included a 'remove name="ScriptModule"' in the httpModules section. However there was no httpModule called ScriptModule in the parent web.config. When I fired up the application it threw a &lt;a href="http://en.wikipedia.org/wiki/Yellow_Screen_of_Death#ASP.NET"&gt;YSOD&lt;/a&gt; immediately. It seems that if you try to remove an entry that doesn't exist, the compiler throws an exception. This seems a little bonkers to me - if you're trying to remove an entry, why should it matter that it doesn't exist? It's easy to fix, obviously, just a bit annoying and I don't see what purpose it serves...&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-5059062582074350432?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/5059062582074350432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=5059062582074350432' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/5059062582074350432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/5059062582074350432'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2009/01/webconfig-administration.html' title='web.config Administration'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-5280526020842092093</id><published>2008-12-09T14:28:00.003Z</published><updated>2008-12-09T14:38:41.200Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='msizap'/><category scheme='http://www.blogger.com/atom/ns#' term='defraggler'/><title type='text'>Saving Space From C:\Windows\Installer</title><content type='html'>&lt;span style="font-family: verdana;"&gt;My home PC has been getting critically short of space recently - medium-term I need to get another hard drive for it but I need to take the case off first to see if I have a SATA connection and it's just a hassle.&lt;br /&gt;&lt;br /&gt;I deleted a load of old data last weekend but it hasn't made the dent I was hoping for. I noticed my C:\Windows\Installer folder was huge, like taking up nearly 30% of the used space. I had a look to see it was full of MSI and MSP files, which I didn't know for certain whether I could delete or not. However I Googled the folder path and discovered the existence of &lt;a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;290301"&gt;MsiZap&lt;/a&gt;, which will clean up old Installer files from C:\Windows\Installer. You have to install it and then run &lt;span style="font-family: courier new;"&gt;'MsiZap G'&lt;/span&gt; from a command line. ZAP! 14Gb gone and a much healthier hard drive :-)&lt;br /&gt;&lt;br /&gt;I also discovered &lt;a href="http://www.defraggler.com/"&gt;Defraggler&lt;/a&gt; this week, which might be a better defragger then the Windows XP one or not, but even if it isn't it looks much better as you can see your data moving around the drive as it gets defragged.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-5280526020842092093?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/5280526020842092093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=5280526020842092093' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/5280526020842092093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/5280526020842092093'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/12/saving-space-from-cwindowsinstaller.html' title='Saving Space From C:\Windows\Installer'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-6439287056370454753</id><published>2008-12-04T11:00:00.003Z</published><updated>2008-12-04T11:08:38.188Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql server'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Express'/><category scheme='http://www.blogger.com/atom/ns#' term='compression'/><title type='text'>SQLExpress and Compressed Files</title><content type='html'>Another of those things I'm blogging for future reference...&lt;br /&gt;&lt;br /&gt;A little while ago I ran the Windows Disk Cleanup utility to recover some space on my hard drive. One of the things it did was go through my filesystem and compress files that I hadn't used in a little while.&lt;br /&gt;&lt;br /&gt;I went back to some of those files yesterday - a WinForms project that I started ages ago that uses a SQL Express database - but when I tried to run the project I got strange errors in my DAL. I fired up SQL Management Studio and attached to my SQL Express instance, where things got even stranger. I had two databases showing, one with the path to my database and one with just the name of the database, but no plus sign next to them to expand them. Couldn't detach them, couldn't delete them. I did a bit of Googling and I saw a comment that SQL Express doesn't work with compressed files. Almost instantly I figured out what had happened - I uncompressed all the files in the folder and everything started behaving itself again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-6439287056370454753?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/6439287056370454753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=6439287056370454753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/6439287056370454753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/6439287056370454753'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/12/sqlexpress-and-compressed-files.html' title='SQLExpress and Compressed Files'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-5221814757247143954</id><published>2008-12-02T16:29:00.002Z</published><updated>2008-12-02T16:54:16.110Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='caching'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Removing Items From the OutputCache</title><content type='html'>&lt;a href="http://stackoverflow.com/questions/11585/clearing-page-cache-in-aspnet"&gt;&lt;span style="font-family:verdana;"&gt;Today's learning point&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt; from &lt;/span&gt;&lt;a href="http://stackoverflow.com/"&gt;&lt;span style="font-family:verdana;"&gt;StackOverflow&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Whilst it's clear that using output caching is a Good Thing, it can be a little counter-productive sometimes if a user changes some detail that invalidates the cached version of the page e.g. changing the price of a product, adding a new comment to a blog post. But as I've now discovered you can programmatically remove the cached version of the page by calling this static method on the Response stream:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Call HttpResponse.RemoveOutputCacheItem(myCachedUrl)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Looking it up on MSDN I discovered that this method has been present since .NET 1.1 and I've never come across it before!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-5221814757247143954?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/5221814757247143954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=5221814757247143954' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/5221814757247143954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/5221814757247143954'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/12/removing-items-from-outputcache.html' title='Removing Items From the OutputCache'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-4035984603568215094</id><published>2008-11-23T15:16:00.005Z</published><updated>2008-11-24T10:43:23.968Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='caching'/><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><category scheme='http://www.blogger.com/atom/ns#' term='DDD'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='scalability'/><title type='text'>DDD7 - ASP.NET Scalability</title><content type='html'>I'd like to thank the organisers and attendees for giving me the opportunity to present 'This One Goes Up To 11, or How To Write Scalable ASP.NET' yesterday at &lt;a href="http://www.developerday.co.uk/"&gt;DDD7&lt;/a&gt; at Microsoft in Reading. It was my first time presenting at DDD, and I really enjoyed it. My session seemed to go quite well, there were a couple of demos I need to go through again to figure out why they didn't work, but overall I felt it was quite well received. All the sessions were videoed for &lt;a href="http://channel9.msdn.com/Unitedkingdom/"&gt;Channel 9&lt;/a&gt; , which is both quite exciting &lt;span style="FONT-STYLE: italic"&gt;and&lt;/span&gt; means I'll get to see the sessions I couldn't get into :-)&lt;br /&gt;&lt;br /&gt;A session I did get into was Phil and Dave's ASP.NET 4.0 runthrough. A lot of things are still under wraps, but one of the most useful things they demoed was the ability to set a control's ID and not have it munged with the control's container name when the html hits the browser. Which is nice. I feel validated in being unsure about MVC now I've heard that Phil's not keen on. It'll be interesting to see the new provider-based caching model when it arrives, especially as this will fit really well with Velocity. I'm not, however, at all sure about the new WPF-based Studio.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Edit:&lt;/strong&gt; My slides and code samples are now available at &lt;a href="http://www.philippursglove.com/ScalableASPNET"&gt;www.philippursglove.com/ScalableASPNET&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-4035984603568215094?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/4035984603568215094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=4035984603568215094' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4035984603568215094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4035984603568215094'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/11/ddd7-aspnet-scalability.html' title='DDD7 - ASP.NET Scalability'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-8830505931137085597</id><published>2008-11-05T09:09:00.002Z</published><updated>2008-11-05T09:24:15.223Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows 3.11'/><title type='text'>Goodbye Windows 3.1</title><content type='html'>In amongst all the Presidential news going on today, this headline caught my eye: &lt;a href="http://news.bbc.co.uk/1/hi/technology/7707016.stm"&gt;Closing Windows&lt;/a&gt;. Microsoft are ceasing to sell licences for Windows 3.1/11, the operating system I cut my teeth on (which probably dates me hugely although probably not as much as my recollections of loading programs off tape on my Commodore 64 - ah happy days).&lt;br /&gt;&lt;br /&gt;I did my first professional coding on Win3.11 in 1997, using VB4.0 (ugh) for the client and Access 2.0 for the database (double ugh). Fortunately I &lt;em&gt;didn't&lt;/em&gt; keep a copy of the code, although I think about reworking it occasionally as a web app with all I've learned since then.&lt;br /&gt;&lt;br /&gt;I confess I had no idea MS still sold licenses for it as an embedded OS, though I guess it makes sense as a solid OS and if you have no need for a display etc it probably worked quite well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-8830505931137085597?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/8830505931137085597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=8830505931137085597' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/8830505931137085597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/8830505931137085597'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/11/goodbye-windows-31.html' title='Goodbye Windows 3.1'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-231127745259647343</id><published>2008-11-03T22:24:00.003Z</published><updated>2008-11-05T09:29:16.207Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><title type='text'>Velocity CTP2</title><content type='html'>CTP2 of Velocity was announced at PDC last week - the announcement on the Velocity blog is &lt;a href="http://blogs.msdn.com/velocity/archive/2008/10/28/announcing-ctp2-of-microsoft-project-code-name-velocity.aspx"&gt;here&lt;/a&gt;, you can download the bits &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=B24C3708-EEFF-4055-A867-19B5851E7CD2&amp;amp;displaylang=en"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;First thoughts are that they've done a lot of work since CTP1.&lt;br /&gt;&lt;br /&gt;I installed this CTP tonight and ran up a super-quick demo, and it worked perfectly first time. And by perfectly I mean once I'd fixed my code. And by first time, I mean once I'd updated my web.config. This is good as it means all the problems were on my end, not theirs! (Same old story)&lt;br /&gt;&lt;br /&gt;I'm going to have a bit more of a play today/tomorrow and will post some more details then. I've also got the PDC videos to watch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-231127745259647343?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/231127745259647343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=231127745259647343' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/231127745259647343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/231127745259647343'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/11/velocity-ctp2.html' title='Velocity CTP2'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-7344524555789495951</id><published>2008-10-10T10:16:00.003+01:00</published><updated>2008-11-27T17:20:34.323Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='DDD'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='scalability'/><title type='text'>How to Write Scalable ASP.NET</title><content type='html'>Like &lt;a href="http://idunno.org/archive/2008/10/10/ddd7-top-10-wcf-tips-amp-tricks.aspx"&gt;Barry&lt;/a&gt;, I got my email last night to tell me my talk on writing ASP.NET that scales sensibly (or indeed at all given the standard of code I've been reworking for the last two weeks) has been selected for inclusion at &lt;a href="http://www.developerday.co.uk/"&gt;DDD7&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Suddenly I'm rather nervous and wondering if I can actually pull this off...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-7344524555789495951?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/7344524555789495951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=7344524555789495951' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/7344524555789495951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/7344524555789495951'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/10/how-to-write-scalable-aspnet.html' title='How to Write Scalable ASP.NET'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-6278429060054757051</id><published>2008-10-02T09:56:00.002+01:00</published><updated>2008-10-02T10:04:07.023+01:00</updated><title type='text'>.webinfo Files</title><content type='html'>Just one of those things I'm blogging so I can look it up when it happens again...&lt;br /&gt;&lt;br /&gt;I converted one of our Web Application projects the other day from Visual Studio 2005 to Visual Studio 2008. It all built on my machine without any problem, but when one of my colleagues opened the updated project in 2008 on his machine it opened as a Website.&lt;br /&gt;&lt;br /&gt;Eventually I compared folders between my machine and his, and I spotted a &lt;em&gt;ProjectName&lt;/em&gt;.vbproj.webinfo file. I had a quick look at it in Notepad, the contents all looked correct but I had a sneaking suspicion that this was the culprit. I moved the file up a folder, and then re-opened the project in VS, just to see what happened. And it opened as a Web Application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-6278429060054757051?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/6278429060054757051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=6278429060054757051' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/6278429060054757051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/6278429060054757051'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/10/webinfo-files.html' title='.webinfo Files'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-3862078018441362207</id><published>2008-09-04T12:11:00.002+01:00</published><updated>2008-09-04T12:12:58.436+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='browsers'/><category scheme='http://www.blogger.com/atom/ns#' term='chrome'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Chrome</title><content type='html'>Installed Chrome yesterday but haven't been able to do anything with it yet as it shares its' proxy settings with IE. Which sucks.&lt;br /&gt;I'd much rather it managed its' proxy settings separately like Firefox and Opera.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-3862078018441362207?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/3862078018441362207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=3862078018441362207' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/3862078018441362207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/3862078018441362207'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/09/chrome.html' title='Chrome'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-1971877964788965004</id><published>2008-08-29T16:27:00.002+01:00</published><updated>2008-09-04T12:11:17.782+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IE'/><category scheme='http://www.blogger.com/atom/ns#' term='browsers'/><category scheme='http://www.blogger.com/atom/ns#' term='beta 2'/><title type='text'>IE 8 Beta 2: Rolled Back</title><content type='html'>I've had to roll back IE 8 Beta 2 :-(&lt;br /&gt;&lt;br /&gt;I couldn't work out how to adjust the security enough to make our menus work in our own application, and also our intranet menus weren't working either. Looks like I'll have to have a look at the UserAgent string to fix that.&lt;br /&gt;&lt;br /&gt;So I'm back on IE7, which I love.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-1971877964788965004?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/1971877964788965004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=1971877964788965004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/1971877964788965004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/1971877964788965004'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/08/ie-8-beta-2-rolled-back.html' title='IE 8 Beta 2: Rolled Back'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-5587817398518911392</id><published>2008-08-28T15:24:00.003+01:00</published><updated>2008-09-04T12:09:06.739+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IE'/><category scheme='http://www.blogger.com/atom/ns#' term='browsers'/><category scheme='http://www.blogger.com/atom/ns#' term='beta 2'/><title type='text'>IE8 Beta 2: First Thoughts</title><content type='html'>IE8 Beta 2 is available from &lt;a href="http://www.microsoft.com/ie"&gt;http://www.microsoft.com/ie&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I installed it today - haven't given it much of a workout yet but here are some first thoughts.&lt;br /&gt;&lt;br /&gt;Standards mode by default is interesting, I think I'm going to see some odd result over the next few weeks.&lt;br /&gt;I &lt;strong&gt;love&lt;/strong&gt; that items in the Address Bar history can now be individually removed, the drawback with this is where they've put the button. It'sright on the right-hand edge of the dropdown area, which means if you drop it down from the arrow, it's then far too easy to click on a url and delete it instead of going to it. More usability research required here Microsoft!&lt;br /&gt;Looks like security has been bumped up a bit again, which as a general concept I approve of. However it looks like it's broken our scriptlet-based menu and I haven't found how to turn the security down enough to resurrect it yet :-(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-5587817398518911392?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/5587817398518911392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=5587817398518911392' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/5587817398518911392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/5587817398518911392'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/08/ie8-beta-2-first-thoughts.html' title='IE8 Beta 2: First Thoughts'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-4795362943479477367</id><published>2008-08-22T14:16:00.002+01:00</published><updated>2008-08-22T14:35:57.787+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dr'/><category scheme='http://www.blogger.com/atom/ns#' term='sharepoint'/><title type='text'>Recovering the Sharepoint Central Admin Website</title><content type='html'>I've been through a process of discovery today of some of the rules of Sharepoint.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;You do not stop the Sharepoint Central Admin service.&lt;/li&gt;&lt;li&gt;You DO NOT stop the Sharepoint Central Admin service.&lt;/li&gt;&lt;/ol&gt;I stopped the Sharepoint Central Admin service (by accident). This is such a fundamental thing not to do that it totally baffles me that Microsoft provide a UI to do it for you.&lt;br /&gt;&lt;br /&gt;To get it back, you need to run the Sharepoint Products and Technologies Configuration Wizard. If you've already created a site, you'll be asked if you want to overwrite it, create a new site, or not to create a site. I chose not to create a site as I didn't want to screw up previous work. The wizard then ran through and at the end of it I had a working admin site again.&lt;br /&gt;&lt;br /&gt;I tried some playing around with the STSADM command-line tool with the -createadminvs option, which looks like it ought to create a new admin website for you (I'm assuming the vs bit is short for Virtual Site) but I couldn't make this work and I couldn't find any discussion of this through Google to suggest what I was missing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-4795362943479477367?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/4795362943479477367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=4795362943479477367' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4795362943479477367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4795362943479477367'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/08/recovering-sharepoint-central-admin.html' title='Recovering the Sharepoint Central Admin Website'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-7755407113973020945</id><published>2008-08-15T16:09:00.003+01:00</published><updated>2008-08-15T16:17:28.079+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vNext'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>What I Want in ASP.NET 4.0</title><content type='html'>Well, &lt;em&gt;a&lt;/em&gt; thing rather than &lt;em&gt;the&lt;/em&gt; thing...&lt;br /&gt;&lt;br /&gt;We're looking at redoing the menu ystem for &lt;a href="http://www.enforma-nx.com/"&gt;our application&lt;/a&gt; which means we're getting into all the yummy provider goodness that shipped with ASP.NET 2.0.&lt;br /&gt;&lt;br /&gt;Except there's a provider missing and it's one we could really do with. Although we can use the XmlSiteMapProvider to generate a menu, it doesn't stop a user typing a URL directly into the address bar. We can stop this by setting up each URL with a &lt;location&gt; element in web.config, but this isn't manageable. What we really want is a LocationProvider, though we'd settle quite happily for an add-on to the SiteMapProvider that does the same thing. The frustrating thing is there's already a ConfigurationLocation class that wraps the &lt;location&gt; element but I can't see any way to get at it to generate a collection that is used across the site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-7755407113973020945?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/7755407113973020945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=7755407113973020945' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/7755407113973020945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/7755407113973020945'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/08/what-i-want-in-aspnet-40.html' title='What I Want in ASP.NET 4.0'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-7189379582356250759</id><published>2008-08-07T12:10:00.003+01:00</published><updated>2008-08-08T10:12:10.352+01:00</updated><title type='text'>ReMix Discount</title><content type='html'>Kudos to the boys and girls at &lt;a href="http://www.theregister.co.uk/"&gt;El Reg&lt;/a&gt;. They've posted a &lt;a href="http://www.theregister.co.uk/2008/08/06/remix08/"&gt;discount code&lt;/a&gt; for £50 off a ticket to &lt;a href="http://www.microsoft.com/uk/remix08/"&gt;Remix&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Am I going? Certainly not on the strength of this discount on it's own.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now that an &lt;a href="http://www.microsoft.com/uk/remix08/agenda.aspx"&gt;agenda&lt;/a&gt;'s been published, I'm considering it. I'd be interested to see &lt;a href="http://weblogs.asp.net/scottgu"&gt;ScottGu&lt;/a&gt;'s (all hail, we're not worthy etc) session on ASP.NET MVC, but right now that's about the only must-see. Hopefully it'll all be videoed so I can watch at my leisure later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-7189379582356250759?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/7189379582356250759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=7189379582356250759' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/7189379582356250759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/7189379582356250759'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/08/remix-discount.html' title='ReMix Discount'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-1305568234926281644</id><published>2008-08-07T12:07:00.003+01:00</published><updated>2008-08-07T14:53:39.935+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows search'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Windows Search 4.0</title><content type='html'>I'm sort of blogging this to see if anyone else has had similar symptoms.&lt;br /&gt;I've been having trouble getting the security patch KB948109 installed on my laptop - SMS has tried installing the patch about six times now, it seems like my SQL Server instance is patched but my SQL Express instance refuses to take it even if I stop the SQL Express service :-(&lt;br /&gt;One of the things I tried last week manually going to Windows Update to install it. While I was there I noticed Windows Search 4.0 and thought I'd install that too. Big mistake.&lt;br /&gt;Immediately after I installed Search, any use of the Google Toolbar crashed the toolbar and then IE. It took me a day and a half to get back to some kind of working configuration, even using Windows Restore didn't solve the problem. I don't have a proper resolution now, I can't use the Google Toolbar and using the IE Search box with Google has ... interesting effects.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_3XWsi_HTCuw/SJr-Gm17OZI/AAAAAAAAAAM/2RUcKbE7ghY/s1600-h/SCrewed+Up+Google+Top+Cropped.png"&gt;&lt;img style="FLOAT: right; MARGIN: 0px 0px 10px 10px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5231773306603649426" border="0" alt="" src="http://2.bp.blogspot.com/_3XWsi_HTCuw/SJr-Gm17OZI/AAAAAAAAAAM/2RUcKbE7ghY/s200/SCrewed+Up+Google+Top+Cropped.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_3XWsi_HTCuw/SJr-GmO2l2I/AAAAAAAAAAU/0ggQmfKWKp0/s1600-h/Screwed+Up+Google+Bottom+Cropped.png"&gt;&lt;img style="FLOAT: right; MARGIN: 0px 0px 10px 10px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5231773306439767906" border="0" alt="" src="http://1.bp.blogspot.com/_3XWsi_HTCuw/SJr-GmO2l2I/AAAAAAAAAAU/0ggQmfKWKp0/s200/Screwed+Up+Google+Bottom+Cropped.png" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-1305568234926281644?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/1305568234926281644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=1305568234926281644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/1305568234926281644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/1305568234926281644'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/08/windows-search-40.html' title='Windows Search 4.0'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3XWsi_HTCuw/SJr-Gm17OZI/AAAAAAAAAAM/2RUcKbE7ghY/s72-c/SCrewed+Up+Google+Top+Cropped.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-7360955359888969416</id><published>2008-08-05T09:29:00.003+01:00</published><updated>2008-08-05T13:55:05.454+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Non-Relational Databases</title><content type='html'>I read &lt;a href="http://www.theregister.co.uk/2008/08/04/mysql_drizzle/"&gt;this piece&lt;/a&gt; on The Register yesterday about the new database from the original makers of MySQL. I was particularly intrigued by the statements 'won't support Windows ... and neither will it be SQL relational compliant'. All I could hear was Sir Humphrey congratulating them on a 'courageous decision'.&lt;br /&gt;But I got to thinking about it last night and it occurred to me that Velocity does more or less the same things i.e. allows you to perform CRUD operations on data in a non-relational store, is suited to cloud computing etc.&lt;br /&gt;Except Velocity works on Windows, and Drizzle doesn't. Which really is a courageous decision - love it or hate it, it's the most widely used OS. As a Microsoft developer, if I can't use something on Windows I'm not going to use it at all, so it's difficult to see Drizzle taking off. Maybe Microsoft should make a publicly-available Velocity store available in the cloud and position it as a competitor to Drizzle. Now that would be a Live/Mesh/Whatever service I'd like to use.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-7360955359888969416?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/7360955359888969416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=7360955359888969416' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/7360955359888969416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/7360955359888969416'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/08/non-relational-databases.html' title='Non-Relational Databases'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-4501905019576331295</id><published>2008-07-23T16:25:00.003+01:00</published><updated>2008-07-23T16:26:49.117+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><title type='text'>Velocity Samples</title><content type='html'>This week's UK MSDN Flash included a piece about Velocity and a link to &lt;a href="http://code.msdn.microsoft.com/velocity"&gt;http://code.msdn.microsoft.com/velocity&lt;/a&gt;, which has code samples. Downloading now, will report back later.&lt;br /&gt;&lt;br /&gt;Slightly annoyed that I've seen no mention of these on the Velocity team blog!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-4501905019576331295?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/4501905019576331295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=4501905019576331295' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4501905019576331295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/4501905019576331295'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/07/velocity-samples.html' title='Velocity Samples'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-2177206894310200954</id><published>2008-07-21T12:15:00.002+01:00</published><updated>2008-07-21T12:27:30.518+01:00</updated><title type='text'>Browsers</title><content type='html'>In the past I've always been pretty unfazed by different browsers and I suppose I still am - IMHO far too many people see &lt;a href="http://www.getfirefox.com/"&gt;Firefox&lt;/a&gt; as the Second Coming. But I think I may be wavering...&lt;br /&gt;&lt;br /&gt;I used Firefox a lot last week on my BizTalk course at &lt;a href="http://www.develop.com/"&gt;DevelopMentor&lt;/a&gt;, and the installation of FireFox on the machines had a couple of really nice FF plug-ins that I hadn't come across before.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://fasterfox.mozdev.org/"&gt;FasterFox&lt;/a&gt; - which shows you how long a page takes to download. This is really nice, the only thing I don't like is having to register with Mozilla before it would let me install it.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.stemhaus.com/firefox/foxclocks/"&gt;FoxClocks&lt;/a&gt; - which puts clocks for different time zones on the FireFox status bar.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;And now I'm missing these features in IE :-(&lt;/p&gt;&lt;p&gt;And then...&lt;/p&gt;&lt;p&gt;I was sat at Starbucks at Liverpool St on Friday afternoon waiting to get a train back to East Anglia, and browsing on my N95. T-Mobile offered me 'Cool Applications' - how could I not follow the link! Which led to me installing &lt;a href="http://www.operamini.com/"&gt;Opera Mini&lt;/a&gt; on my phone. I had a little play with it, so far I'm not overly impressed (there's no pointer!) BUT this may be a case of me just being used to the Symbian web browser....&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-2177206894310200954?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/2177206894310200954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=2177206894310200954' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2177206894310200954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2177206894310200954'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/07/browsers.html' title='Browsers'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-6993352102158762544</id><published>2008-07-11T12:15:00.002+01:00</published><updated>2008-07-11T12:28:53.120+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><title type='text'>Velocity: Struggling :-(</title><content type='html'>I've finally got to writing some code against Velocity (one of our servers at work has decided it's not going to talk to the domain controller any more so nobody can log onto it). And ... it's not working :-(&lt;br /&gt;I'm pretty sure I'm doing the right things, I suspect it's a configuration issue. The exception I'm getting (having modified my code slightly to throw CacheExceptions rather than just Exceptions) is '&lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3513797&amp;amp;SiteID=1"&gt;Could not connect to cache service&lt;/a&gt;'. I'm slightly gratified to see Christian Weyer gets the same problem - if someone like that gets it, what chance do I have! ;-)&lt;br /&gt;&lt;br /&gt;For now, I've removed the extra instances so I'm back to a single host. I thought briefly that it was due to not having set up 'Everyone' to have read/write access but that didn't fix it. Worth remembering as a setup action though.&lt;br /&gt;&lt;br /&gt;I'm going to review all my .config files to see if I've missed something - if I don't find anything then I guess it's for &lt;a href="http://blogs.msdn.com/velocity"&gt;the Velocity team&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-6993352102158762544?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/6993352102158762544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=6993352102158762544' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/6993352102158762544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/6993352102158762544'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/07/velocity-struggling.html' title='Velocity: Struggling :-('/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-6293692366463154689</id><published>2008-07-10T09:28:00.003+01:00</published><updated>2008-07-10T09:50:16.636+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><title type='text'>Pixel8ed Podcast</title><content type='html'>I listened to Craig Shoemakers' &lt;a href="http://pixel8.infragistics.com/"&gt;Pixel8ed&lt;/a&gt; podcast on &lt;a href="http://pixel8.infragistics.com/#Episode:9471"&gt;debugging with John Robbins &lt;/a&gt;yesterday. This isn't a podcast I've come across before, I followed the link from &lt;a href="http://www.wintellect.com/CS/blogs/jrobbins/archive/2008/07/09/hear-my-interview-on-debugging.aspx"&gt;John Robbins' blog&lt;/a&gt;. I generally liked it though I found some of the music under the speech a bit distracting.&lt;br /&gt;&lt;br /&gt;I've used some of the attributes Craig talks about before - I'm a fan of DebuggerStepthrough for code like property getter/setters where I'm pretty sure they're bulletproof bits of code. I think it's worth noting that you can still set breakpoints in code with DebuggerStepthrough on it and your code will break there if you still need to debug it.&lt;br /&gt;&lt;br /&gt;Haven't come across Tess Ferrandez' blog before but it looks like she may well deal with some hardcore ASP.NET debugging situations. I love her Yoda-like 'if it is broken, fix it you should'! Subscribed.&lt;br /&gt;&lt;br /&gt;I saw John Robbins speak at DevWeek a few years ago - the man's a legend! I love the concept of a developer who used to be in Special Forces. And it reminds me that I must go back and read some more of his 'Debugging .NET 2.0 Applications'.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-6293692366463154689?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/6293692366463154689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=6293692366463154689' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/6293692366463154689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/6293692366463154689'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/07/pixel8ed-podcast.html' title='Pixel8ed Podcast'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-2643875481891150670</id><published>2008-07-08T13:52:00.003+01:00</published><updated>2008-07-08T14:01:19.985+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><title type='text'>Velocity: Regions</title><content type='html'>I did a bit more digging into Velocity last night. I still haven't written any code yet but I'm getting there!&lt;br /&gt;&lt;br /&gt;I was poking around in the Object Browser at the System.Data.Caching namespace and I discovered that the context-sensitive help for each method is probably more helpful than the helpfile.&lt;br /&gt;&lt;br /&gt;But more interesting than that, the help for Cache.Add(key As String, value As Object) suggests that if you call this particular overload, the item gets cached in the default region of the cache. Which raises all kinds of questions: if there is a region created by, well, default, which host is it tied to? Does the default region span hosts (in which case regions suddenly become a lot more appealing to me)? Can I use the default region everywhere?&lt;br /&gt;&lt;br /&gt;Now I've got multiple instances, I can do a bit more experimentation with regions and see if they start to be a bit more useful, but I suspect my next course of action is to run ClientLibrary through Reflector and have a look at what Cache.Add actually does.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-2643875481891150670?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/2643875481891150670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=2643875481891150670' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2643875481891150670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2643875481891150670'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/07/velocity-regions.html' title='Velocity: Regions'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-5095853700411301339</id><published>2008-07-08T13:41:00.002+01:00</published><updated>2008-07-08T13:48:58.820+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><title type='text'>Creating Multiple Velocity Instances on a Single Machine</title><content type='html'>&lt;span style="font-family:verdana;"&gt;I now have three instances of Velocity running on my laptop, as per &lt;/span&gt;&lt;a href="http://blogs.msdn.com/velocity/archive/2008/06/10/creating-multiple-velocity-instances-on-a-single-machine.aspx"&gt;&lt;span style="font-family:verdana;"&gt;these instructions&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;"&gt;. I found it a little painful, though probably I wasn't reading the directions closely enough - it took me a while to get all the .config files set up right as I got confused between the cacheHostName (which is the name of the Windows service) and the hostName (which is the machine name). There may have been additional confusion involving the folder names...&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-5095853700411301339?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/5095853700411301339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=5095853700411301339' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/5095853700411301339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/5095853700411301339'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/07/creating-multiple-velocity-instances-on.html' title='Creating Multiple Velocity Instances on a Single Machine'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-5586860678253261899</id><published>2008-07-04T20:27:00.004+01:00</published><updated>2008-07-08T13:52:42.430+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><title type='text'>Velocity: Digging Deeper</title><content type='html'>&lt;span style="font-family:arial;"&gt;I started looking properly at some Velocity bits and pieces this afternoon, including starting to write a little code against it. And I've already found one or two frustrations, or at least things that don't seem to work quite the way &lt;span style="FONT-STYLE: italic"&gt;I&lt;/span&gt; want them to.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;CacheFactory&lt;/span&gt;&lt;br /&gt;You use the CacheFactory to create an instance of a Cache. So far, so good - I like the Factory pattern. What I'm not so keen on here is that the CacheFactory's methods all have to be called on an instance e.g. instead of:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Dim cache As Cache&lt;br /&gt;cache = CacheFactory.GetCache("MyCache")&lt;br /&gt;...&lt;br /&gt;you have to write:&lt;br /&gt;Dim factory As CacheFactory&lt;br /&gt;Dim cache As Cache&lt;br /&gt;&lt;br /&gt;factory = New CacheFactory&lt;br /&gt;cache = factory.GetCache("MyCache")&lt;br /&gt;&lt;/span&gt;[EDIT: It came back to me at the weekend that these are called &lt;em&gt;static&lt;/em&gt; methods, or &lt;em&gt;Shared&lt;/em&gt; in the one true language of VB]&lt;br /&gt;It's a small annoyance, but I'm a small person sometimes.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Regions&lt;/span&gt;&lt;br /&gt;I'm going to come right out and say it: I don't get Regions. I'm completely sold on the concept of a single cross-machine cache - it solves the major issue with the ASP.NET Cache (which runs per-machine). So why then require Regions to live on a single machine? It's like they're saying "here, do this to be fault-tolerant, but to get the most out of it you have to do things that aren't fault tolerant".&lt;br /&gt;It's doubly frustrating when you discover that if you want to add an item to a Velocity cache with an expiry time, you have to add it to a Region. The Cache on its' own just allows you to add an item that's there forever.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;CacheDependencies&lt;/span&gt;&lt;br /&gt;I really think dependencies are the biggest missing element in the first CTP of Velocity. The SqlCacheDependency in .NET 2.0 was the biggest enabler for caching as it meant you could run multiple web servers and keep their caches in sync with database changes without much effort. You can't do this in CTP1.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I'm interested to see &lt;a href="http://idunno.org/"&gt;Barry &lt;/a&gt;has proposed a session on Velocity for &lt;a href="http://www.developerday.co.uk/"&gt;DDD7&lt;/a&gt;. That's good 'cos it means I can pick his brain for suggestions to solve some of these things!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-5586860678253261899?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/5586860678253261899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=5586860678253261899' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/5586860678253261899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/5586860678253261899'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/07/velocity-digging-deeper.html' title='Velocity: Digging Deeper'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-3562520884194870355</id><published>2008-07-04T20:05:00.004+01:00</published><updated>2008-07-10T09:51:24.350+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql server'/><category scheme='http://www.blogger.com/atom/ns#' term='blue screen of death'/><category scheme='http://www.blogger.com/atom/ns#' term='intellipoint'/><title type='text'>Blue Screen: SQL Server Management Studio vs Intellipoint 6.2</title><content type='html'>&lt;span style="font-family:arial;"&gt;I've been randomly getting the Blue Screen of Death when using SQL Server Management Studio 2005, mostly when either scrolling across an open table or resizing a column. It did it again today and I'd had enough.&lt;br /&gt;&lt;br /&gt;A bit of Googling suggests that the problem is between &lt;a href="http://botsikas.blogspot.com/2007/06/ssms-and-win32ksys-blue-screen.html"&gt;Management Studio and Intellipoint&lt;/a&gt;. I started hunting through Microsoft's support pages looking for someone to pin this on but it seems the SQL Server team are aware of this but said &lt;a href="http://codeclimber.net.nz/archive/2008/06/03/When-mice-interact-with-SQL-Management-Studio-and-cause-a.aspx"&gt;they aren't going to fix it&lt;/a&gt; (though &lt;a href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=349202"&gt;this report&lt;/a&gt; is marked as Active at time of writing). Anyway I ended up on the Hardware Support pages where I discovered that I get two free support calls with my Wireless Presenter Mouse. So I've logged the problem with them but with the Intellipoint team, not the SQL Server team. Hopefully the Intellipoint team can either come up with a hotfix or alternatively make the SQL Server team come up with a hotfix. Either way I'm hoping we can get a permanent resolution to the problem.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Update:&lt;/span&gt; I've had a first contact from Microsoft. Didn't get to talk to them as I'd already left for the day but I'm hopeful this means they've accepted the issue!&lt;br /&gt;&lt;strong&gt;Update 2:&lt;/strong&gt; Looks like my contact at Microsoft is now trying to pass this off to the Windows team.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-3562520884194870355?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/3562520884194870355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=3562520884194870355' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/3562520884194870355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/3562520884194870355'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/07/blue-screen-sql-server-management.html' title='Blue Screen: SQL Server Management Studio vs Intellipoint 6.2'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-728851294710651097</id><published>2008-07-03T12:07:00.002+01:00</published><updated>2008-07-03T12:11:16.093+01:00</updated><title type='text'>Andy Is An MVP!</title><content type='html'>Saw yesterday that &lt;a href="http://www.andrewwestgarth.co.uk/"&gt;Andy Westgarth&lt;/a&gt; has been &lt;a href="http://www.andrewwestgarth.co.uk/Blog/post/2008/07/Awarded-Microsoft-MVP-Award-for-IIS!.aspx"&gt;made&lt;/a&gt; an MVP for IIS. Andy's done a lot of work in evangelising the new features in IIS7 for ASP.NET developers and it's great that Microsoft have rewarded him for it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-728851294710651097?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/728851294710651097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=728851294710651097' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/728851294710651097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/728851294710651097'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/07/andy-is-mvp.html' title='Andy Is An MVP!'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-2465057215585255199</id><published>2008-06-30T10:12:00.004+01:00</published><updated>2008-06-30T12:31:00.116+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='caching'/><category scheme='http://www.blogger.com/atom/ns#' term='Velocity'/><title type='text'>Velocity First Look</title><content type='html'>Normally I avoid CTPs like the plague, but I'm interested enough in this one that I installed the first CTP of the Velocity caching engine over the weekend.&lt;br /&gt;&lt;br /&gt;Haven't tried coding against it yet but I had a bit of a play with the command-line admin console and read some of the help.&lt;br /&gt;&lt;br /&gt;The most obvious missing element right now is a CacheDependency object (+ subclasses viz. SqlCacheDependency) - I've been trying to think of a way to chain this and the ASP.NET Cache together to retain the ability to have dependencies butI haven't come up with one yet :-(&lt;br /&gt;&lt;br /&gt;I'm intrigued by the idea that you can lock and unlock cached objects, though since in the finished version it should run across multiple servers I guess this is a way to avoid race conditions.&lt;br /&gt;&lt;br /&gt;Edit: Something else missing I just discovered is that the service out of the box doesn't survive a restart i.e. you have to go into the Admin console and issue a new 'START CLUSTER' command. I've now marked the Windows service as 'Automatic', not 'Manual'.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-2465057215585255199?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/2465057215585255199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=2465057215585255199' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2465057215585255199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/2465057215585255199'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/06/velocity-first-look.html' title='Velocity First Look'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-395335790673021309</id><published>2008-06-26T14:36:00.003+01:00</published><updated>2008-06-26T14:44:51.720+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenXML'/><category scheme='http://www.blogger.com/atom/ns#' term='SDK'/><category scheme='http://www.blogger.com/atom/ns#' term='Office'/><title type='text'>Open XML SDK</title><content type='html'>Well that was disappointing.&lt;br /&gt;&lt;br /&gt;I installed the MS OpenXML SDK this morning (from &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=AD0B72FB-4A1D-4C52-BDB5-7DD7E816D046&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=AD0B72FB-4A1D-4C52-BDB5-7DD7E816D046&amp;amp;displaylang=en&lt;/a&gt;) after reading about it in &lt;a href="http://office-watch.com/office/index.asp"&gt;Woody's Office Watch&lt;/a&gt;. I was hoping it would have classes to let you generate Office documents on a server without having Office itself installed (been bitten by this before). Unfortunately, it doesn't. Or at least not that I can see from looking at the Class Reference in the Help.&lt;br /&gt;&lt;br /&gt;BTW Microsoft, what's with shipping the help file as a CHM? I thought all DevDiv products now shipped with MSDN-style help (don't know the technical name for that one). The helpfile is also slightly unpolished - all the 'How Do I' topics are suffixed with '... using the OpenXML API' - isn't that slightly obvious &lt;em&gt;in the OpenXML API Help&lt;/em&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-395335790673021309?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/395335790673021309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=395335790673021309' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/395335790673021309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/395335790673021309'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/06/open-xml-sdk.html' title='Open XML SDK'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-3225094090408062467</id><published>2008-06-25T10:40:00.001+01:00</published><updated>2008-06-30T10:26:02.384+01:00</updated><title type='text'>Editing Collections</title><content type='html'>If you try to edit a collection using, say, a For...Each loop e.g.&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;For Each item in Collection.items&lt;br /&gt;    item.Delete()&lt;br /&gt;Next item&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;it's quite feasible to get an error which says you can't edit the collection you're iterating over while you're iterating over it. Which kind of makes sense.&lt;br /&gt;&lt;br /&gt;The trick to doing it is to iterate over it backwards e.g.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Dim i As Integer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;For i = Collection.Count To 0 Step -1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    item = Collection.Item(i)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    item.Delete()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Next i&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This way, you remove the items from the end of the collection, not the middle, which allows the .NET Runtime to keep track of the collection correctly.&lt;br /&gt;&lt;br /&gt;(This might seem obvious to some but it held up some coding for me for about a month until a colleague made  chance remark about it!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-3225094090408062467?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/3225094090408062467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=3225094090408062467' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/3225094090408062467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/3225094090408062467'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/06/editing-collections.html' title='Editing Collections'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1902158034220893892.post-349534179922351385</id><published>2008-06-24T01:30:00.000+01:00</published><updated>2008-06-24T12:27:11.105+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WinForms'/><title type='text'>CancelButtons and Visual Inheritance</title><content type='html'>I started writing a new WinForms app yesterday, which is going to be a Wizard. I created a base form to inherit from so that all forms would be the same size, have Next &amp;amp; Previous buttons etc. I also added a button called CancelButton, which has to be marked as Shadows so it doesn't screw up the CancelButton property of the form itself.&lt;br /&gt;However when I tried to create the first form subclassing my base form, I got an 'Ambiguous match found' error in the Visual Studio designer. Couldn't find any obvious solution from Googling (partly why I'm blogging it here), but the solution was to rename the button on the base form to 'MyCancelButton' (or, I suspect, anything but CancelButton). It seems that even if my CancelButton was marked as Shadows, the VB.NET compiler isn't quite cute enough to figure out what's supposed to happen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1902158034220893892-349534179922351385?l=philpursglove.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://philpursglove.blogspot.com/feeds/349534179922351385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1902158034220893892&amp;postID=349534179922351385' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/349534179922351385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1902158034220893892/posts/default/349534179922351385'/><link rel='alternate' type='text/html' href='http://philpursglove.blogspot.com/2008/06/cancelbuttons-and-visual-inheritance.html' title='CancelButtons and Visual Inheritance'/><author><name>Phil</name><uri>http://www.blogger.com/profile/03175106028217224674</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/_3XWsi_HTCuw/SiUHda6LoaI/AAAAAAAAABI/NZHmXx0IOIY/S220/XBox+Avatar+Headshot.png'/></author><thr:total>0</thr:total></entry></feed>
