<?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-6591634966281957831</id><updated>2012-02-16T17:17:39.144Z</updated><category term='xml'/><category term='Vista'/><category term='C++/CLI'/><category term='SolutionsLinux2007'/><category term='Architecture'/><category term='Listening To...'/><category term='C++ Interop'/><category term='wifi'/><category term='web'/><category term='Istanbul'/><category term='FOWADUBLIN10'/><category term='SQL Server'/><category term='unit-testing'/><category term='Build'/><category term='Skills Matter'/><category term='IDE'/><category term='TechEd2007'/><category term='Finance'/><category term='time'/><category term='Udi Dahan'/><category term='C++'/><category term='C#'/><category term='Windows Phone 7'/><category term='Maps'/><category term='FOWALONDON07'/><category term='Methods'/><category term='XPath'/><category term='Travel'/><category term='Linq'/><category term='Database'/><category term='Vaio'/><category term='CEBIT'/><category term='UKTechDays'/><category term='Links'/><category term='Privacy'/><category term='TechEd EMEA 2008'/><category term='Tools'/><category term='ToRead'/><category term='Ipad'/><category term='expos'/><category term='Safari Books Online'/><category term='Trying Out...'/><category term='Windows 7'/><category term='Books'/><category term='fowa'/><title type='text'>Coding in London</title><subtitle type='html'>Notes about software engineering, London, .NET, bars, C#, cocktails, automated testing, restaurants, agile methods, travel and C++.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default?start-index=101&amp;max-results=100'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>159</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-3354777853404457614</id><published>2011-11-23T20:19:00.001Z</published><updated>2011-11-23T20:19:30.058Z</updated><title type='text'>Windows Service Gotchas</title><content type='html'>&lt;ul&gt;   &lt;li&gt;the current directory is not the location of the executable, it’s System32! But that’s &lt;a href="http://haacked.com/archive/2004/06/29/706.aspx"&gt;easy to change&lt;/a&gt;.&lt;/li&gt;    &lt;li&gt;anything logged to the console will be lost. You can redirect anything you output with System.Diagnostics.Trace. That includes for instance the internal debugging output from log4net (useful when you don’t know why your service is not logging anything).&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Quoted from log4net &lt;a href="http://logging.apache.org/log4net/release/faq.html"&gt;documentation&lt;/a&gt;: &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;There are 2 different ways to enable internal debugging in log4net. These are listed below. The preferred method is to specify the log4net.Internal.Debug option in the application's config file. &lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;Internal debugging can also be enabled by setting a value in the application's configuration file (not the log4net configuration file, unless the log4net config data is embedded in the application's config file). The log4net.Internal.Debug application setting must be set to the value true. For example: &lt;/p&gt;        &lt;pre&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;
&amp;lt;configuration&amp;gt;
    &amp;lt;appSettings&amp;gt;
        &amp;lt;add key=&amp;quot;log4net.Internal.Debug&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;
    &amp;lt;/appSettings&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;

      &lt;p&gt;This setting is read immediately on startup an will cause all internal debugging messages to be emitted. &lt;/p&gt;
    &lt;/li&gt;

    &lt;li&gt;
      &lt;p&gt;To enable log4net's internal debug programmatically you need to set the log4net.Util.LogLog.InternalDebugging property to true. Obviously the sooner this is set the more debug will be produced. &lt;/p&gt;
    &lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;Internal debugging messages are written to the console and to the System.Diagnostics.Trace system. If the application does not have a console the messages logged there will be lost. Note that an application can redirect the console stream by setting the System.Console.Out. The Trace system will by default send the message to an attached debugger (where the messages will appear in the output window). If the process does not have a debugger attached then the messages are sent to the system debugger. A utility like DebugView from &lt;a href="http://www.sysinternals.com"&gt;http://www.sysinternals.com&lt;/a&gt; may be used to capture these messages. &lt;/p&gt;

  &lt;p&gt;As log4net internal debug messages are written to the System.Diagnostics.Trace system it is possible to redirect those messages to a local file. You can define a trace listener by adding the following to your application's .config file: &lt;/p&gt;

  &lt;pre&gt;&amp;lt;configuration&amp;gt;
    ...
    
    &amp;lt;system.diagnostics&amp;gt;
        &amp;lt;trace autoflush=&amp;quot;true&amp;quot;&amp;gt;
            &amp;lt;listeners&amp;gt;
                &amp;lt;add 
                    name=&amp;quot;textWriterTraceListener&amp;quot; 
                    type=&amp;quot;System.Diagnostics.TextWriterTraceListener&amp;quot; 
                    initializeData=&amp;quot;C:\tmp\log4net.txt&amp;quot; /&amp;gt;
            &amp;lt;/listeners&amp;gt;
        &amp;lt;/trace&amp;gt;
    &amp;lt;/system.diagnostics&amp;gt;

    ...
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;

  &lt;p&gt;Make sure that the process running your application has permission to write to this file. &lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-3354777853404457614?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/3354777853404457614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=3354777853404457614' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3354777853404457614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3354777853404457614'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/11/windows-service-gotchas.html' title='Windows Service Gotchas'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-707670728184298730</id><published>2011-11-21T22:27:00.001Z</published><updated>2011-11-21T22:29:43.259Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Privacy'/><title type='text'>Your Home Address on the Web</title><content type='html'>&lt;a href="http://lh5.ggpht.com/-jZG22pF002o/TsrQVN7GgVI/AAAAAAAAASU/yKrJG4LkmGk/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 5px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://lh5.ggpht.com/-qtOJE_j9AS8/TsrQVthECvI/AAAAAAAAASc/Rw_ZzfcgAHk/image_thumb%25255B1%25255D.png?imgmax=800" width="424" height="291" /&gt;&lt;/a&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I’ve always thought privacy concerns over Facebook were exaggerated -they usually come from your parents who have been publishing their home address and phone number on the white pages for decades anyway. There is much much worse.&lt;/p&gt;  &lt;p&gt;The mere act of voting in the UK ends up in having your &lt;strong&gt;home address&lt;/strong&gt; published on the web.&lt;/p&gt;  &lt;p&gt;If you registered to vote on the Electoral Roll and ticked the wrong box, the one with the confusing caption, something like “tick here if you don’t want your details to appear in the private listing”, then all your past addresses are on the web, year by year. Yippee!&lt;/p&gt;  &lt;p&gt;It’s not just your home address, but also &lt;strong&gt;the list of people who lived with you&lt;/strong&gt;. That must be the most blatant breach of privacy I’ve ever seen. It’s like Facebook for flatmates with privacy settings set to ‘Everyone’.&lt;/p&gt;  &lt;p&gt;Look at &lt;a href="http://www.192.com/atoz/people/randall/david/"&gt;this&lt;/a&gt;. Only the first part of the postcode is available. To get the full info all you have to do is register at &lt;a href="http://www.192.com/"&gt;192.com&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-707670728184298730?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/707670728184298730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=707670728184298730' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/707670728184298730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/707670728184298730'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/11/ive-always-thought-privacy-concerns.html' title='Your Home Address on the Web'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-qtOJE_j9AS8/TsrQVthECvI/AAAAAAAAASc/Rw_ZzfcgAHk/s72-c/image_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-3867015343565596854</id><published>2011-10-31T19:05:00.001Z</published><updated>2011-11-03T19:39:55.007Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Books'/><title type='text'>Currently Reading or Watching…</title><content type='html'>&lt;ul&gt;   &lt;li&gt;Authentication, authorization and impersonation in WCF: &lt;a href="http://techbus.safaribooksonline.com/book/certification/mcts/9780735625655/user-level-security/lesson_2colon_authorization_and_imperson"&gt;WCF Training Kit&lt;/a&gt; (Safari Books Online) &lt;/li&gt;    &lt;li&gt;Herb Sutter: &lt;a href="http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-835T"&gt;Writing modern C++ code: how C++ has evolved over the years&lt;/a&gt; (video from the //build/ event) &lt;/li&gt;    &lt;li&gt;Active, dormant and tombstoned apps: &lt;a href="http://channel9.msdn.com/Events/BUILD/BUILD2011/APP-823T"&gt;Multithreading in Mango&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-3867015343565596854?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/3867015343565596854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=3867015343565596854' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3867015343565596854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3867015343565596854'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/10/currently-reading-or-watching.html' title='Currently Reading or Watching…'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-469210939914580076</id><published>2011-10-23T21:02:00.001+01:00</published><updated>2011-10-27T19:37:20.491+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Finance'/><title type='text'>Current Reading About Hedging</title><content type='html'>&lt;p&gt;Where to invest in case of a catastrophe?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.moneyweek.com/investments/precious-metals-and-gems/gold/nows-a-good-time-to-buy-gold-55919"&gt;If you don’t own gold, now is a good time to buy&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.marketwatch.com/story/how-bill-gates-is-betting-on-inflation-2011-10-18?pagenumber=2"&gt;How Bill Gates is betting on inflation&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://seekingalpha.com/article/258873-crisis-investing-hedging-for-and-against-catastrophe"&gt;Crisis Investing: Hedging for and Against Catastrophe&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-469210939914580076?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/469210939914580076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=469210939914580076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/469210939914580076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/469210939914580076'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/10/current-reading-about-hedging.html' title='Current Reading About Hedging'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-3473543460771201010</id><published>2011-10-15T18:01:00.001+01:00</published><updated>2011-10-16T19:54:28.728+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Build'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>TeamCity, msbuild and Version Numbers</title><content type='html'>&lt;p&gt;How to automatically set all your solution’s projects to the same version number with msbuild and TeamCity?&lt;/p&gt;  &lt;p&gt;We have a number of solutions mixing native and managed projects.&lt;/p&gt;  &lt;p&gt;The mechanism we use to ensure all DLLs and EXEs have the same version number relies on modifying 2 files: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A VersionInfo.h file for native projects &lt;/li&gt;    &lt;li&gt;A VersionInfo.cs file for managed projects &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The .h file contains something like this:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;#define PROJECT_VERSION 3,9,0,1234&lt;/font&gt; &lt;font face="Courier New"&gt;     &lt;br /&gt;#define PROJECT_VERSION_STR “3.9.0.1234”&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;All native projects in the solution have a resource file (.rc) that includes this unique VersionInfo.h.&amp;#160; This is how the exe/dll obtain their version info.&lt;/p&gt;  &lt;p&gt;On the .NET side, the VersionInfo.cs file contains:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;[assembly: Assemblyversion(“3.9.0.1234”)]      &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;[assembly: AssemblyFileversion(“3.9.0.1234”)]&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;All managed projects in the solution compile this VersionInfo.cs file (using a soft link, no duplication necessary).&lt;/p&gt;  &lt;p&gt;So all we have to do in order to ensure that the 30+ binaries have exactly the same version number is to get our build script to modify the .h and the .cs just before building the solution.&lt;/p&gt;  &lt;p&gt;Sounds easy! &lt;/p&gt;  &lt;p&gt;Then there is the question of where to store the “3.9.0.1234” version. It should be in &lt;strong&gt;one single place &lt;/strong&gt;of course. An obvious choice seems to be the TeamCity build number.&lt;/p&gt;  &lt;p&gt;From &lt;em&gt;Major.Minor.Build.Revision&lt;/em&gt;, we can set &lt;em&gt;Major.Minor.Build &lt;/em&gt;by hand in TeamCity and have the &lt;em&gt;Revision &lt;/em&gt;set automatically to the current SVN revision number, which is a handy way to relate builds to SVN revisions.&lt;/p&gt;  &lt;p&gt;In the TeamCity project settings, the build number format field looks like this: &lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;3.9.0.%build.vcs.number.MyProject_SVN_Root%&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-RFF6b2QGjhw/TpnK4HM6fDI/AAAAAAAAAQ4/g4ZZBAFe4ko/s1600-h/ScreenHunter_01%252520Oct.%25252015%25252018.37%25255B8%25255D.gif"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="ScreenHunter_01 Oct. 15 18.37" border="0" alt="ScreenHunter_01 Oct. 15 18.37" src="http://lh3.ggpht.com/-zky5sWafDMA/TpnK5UqgUuI/AAAAAAAAAQ8/bAyktDipMxc/ScreenHunter_01%252520Oct.%25252015%25252018.37_thumb%25255B4%25255D.gif?imgmax=800" width="712" height="307" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Then within our msbuild XML file we refer to the build number set in TeamCity like this:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;$(BUILD_NUMBER)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The following msbuild lines update the version number stored in the VersionInfo.cs.&lt;/p&gt;  &lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;FileUpdateFiles&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Files&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;VersionInfo.cs&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #ff0000"&gt;Regex&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;(\d+)\.(\d+)\.(\d+)\.(\d+)&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #ff0000"&gt;ReplacementText&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$(BUILD_NUMBER)&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;This regex does wonders to replace “1.2.3.4” with “3.9.0.1234”. But now, more tricky: when doing the string replace in VersionInfo.h (it’s always the native projects that cause trouble &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Winking smile" src="http://lh6.ggpht.com/-gDSxnl3-IVs/TpnlVkoie9I/AAAAAAAAARE/gMoHAyF2Lz0/wlEmoticon-winkingsmile%25255B2%25255D.png?imgmax=800" /&gt;), how do you replace&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New"&gt;#define PROJECT_VERSION &lt;strong&gt;1,2,3,4&lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;

&lt;p&gt;with &lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New"&gt;#define PROJECT_VERSION &lt;strong&gt;3,9,0,1234&lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;

&lt;p&gt;given the string in $(BUILD_NUMBER) “3.9.0.1234”. &lt;/p&gt;

&lt;p&gt;Can’t do anything a bit subtle with msbuild without having to download and install third-party tasks… So I’m currently looking into the &lt;em&gt;TextString&lt;/em&gt; task from the &lt;a href="http://msbuildextensionpack.com"&gt;MsBuild Extension Pack&lt;/a&gt; to tokenise the version string and then concatenate it back to the appropriate format. It’s all a bit complicated, there must be an easier way to do this…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (16/10/2011):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s actually not that bad, here is the code that formats $(BUILD_NUMBER) and updates the .h /.cs VersionInfo files.&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;TextString&lt;/span&gt; &lt;span style="color: #ff0000"&gt;TaskAction&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Replace&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #ff0000"&gt;OldString&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$(BUILD_NUMBER)&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #ff0000"&gt;OldValue&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;                &lt;span style="color: #ff0000"&gt;NewValue&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Output&lt;/span&gt; &lt;span style="color: #ff0000"&gt;PropertyName&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;FormattedBuildNumber&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;              &lt;span style="color: #ff0000"&gt;TaskParameter&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;NewString&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;TextString&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Message&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Replacing version in VersionInfo.h with $(FormattedBuildNumber) and $(BUILD_NUMBER)&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Message&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;FileUpdateFiles&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Files&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;VersionInfo.h&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #ff0000"&gt;Regex&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;(\d+)\.(\d+)\.(\d+)\.(\d+)&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #ff0000"&gt;ReplacementText&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$(BUILD_NUMBER)&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;FileUpdateFiles&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Files&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;VersionInfo.h&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #ff0000"&gt;Regex&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;(\d+)\,(\d+)\,(\d+)\,(\d+)&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #ff0000"&gt;ReplacementText&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$(FormattedBuildNumber)&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Message&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Text&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;Replacing version in VersionInfo.cs with $(BUILD_NUMBER)&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Message&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;FileUpdateFiles&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Files&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;VersionInfo.cs&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #ff0000"&gt;Regex&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;(\d+)\.(\d+)\.(\d+)\.(\d+)&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;      &lt;span style="color: #ff0000"&gt;ReplacementText&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;&amp;quot;$(BUILD_NUMBER)&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,&amp;#39;Courier New&amp;#39;,courier,monospace; font-size: 12px"&gt;&lt;/pre&gt;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-3473543460771201010?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/3473543460771201010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=3473543460771201010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3473543460771201010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3473543460771201010'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/10/teamcity-msbuild-and-version-numbers.html' title='TeamCity, msbuild and Version Numbers'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-zky5sWafDMA/TpnK5UqgUuI/AAAAAAAAAQ8/bAyktDipMxc/s72-c/ScreenHunter_01%252520Oct.%25252015%25252018.37_thumb%25255B4%25255D.gif?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-6643126836076572586</id><published>2011-10-03T21:03:00.001+01:00</published><updated>2011-10-03T21:03:41.320+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fowa'/><title type='text'>Getting Ready For FOWA London 2011</title><content type='html'>&lt;p&gt;This is the schedule for tomorrow’s first day of FOWA (Forum of Web Apps) at the Brewery between Shoreditch and Whitechapel.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://futureofwebapps.com/london-2011/schedule/"&gt;http://futureofwebapps.com/london-2011/schedule/&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-6643126836076572586?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/6643126836076572586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=6643126836076572586' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6643126836076572586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6643126836076572586'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/10/getting-ready-for-fowa-london-2011.html' title='Getting Ready For FOWA London 2011'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-7122037493865533724</id><published>2011-09-27T22:19:00.001+01:00</published><updated>2011-09-27T22:19:18.030+01:00</updated><title type='text'>Body of Lies</title><content type='html'>&lt;p&gt;I just saw &lt;em&gt;&lt;a href="http://www.lovefilm.com/film/Body-of-Lies/107888/?play_immediately=1"&gt;Body of Lies&lt;/a&gt;&lt;/em&gt; by Ridley Scott. At minute 1h38’ there is a scene where Di Caprio talks on the phone to the bad guys who kidnapped his girlfriend. The call is recorded so to make that obvious to the audience, there is a massive old-school tape recorder spinning in the background. Cell phones, drones and satellites… You can never go wrong with good old reel-to-reel tape recording.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-7122037493865533724?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/7122037493865533724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=7122037493865533724' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7122037493865533724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7122037493865533724'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/09/body-of-lies.html' title='Body of Lies'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-4341673740552231925</id><published>2011-09-24T19:50:00.001+01:00</published><updated>2011-09-24T21:02:57.271+01:00</updated><title type='text'>I Own a Domain Name I Can’t Use!</title><content type='html'>&lt;a href="http://lh4.ggpht.com/-oQkU1f_gBTY/Tn43bX2ggUI/AAAAAAAAAQM/3SkGpOQBnPs/s1600-h/Checkout2%25255B3%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 5px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="Checkout2" border="0" alt="Checkout2" src="http://lh6.ggpht.com/-ufKCFjIjEPg/Tn43bzOwQHI/AAAAAAAAAQQ/g1t0kMuHqMM/Checkout2_thumb%25255B1%25255D.jpg?imgmax=800" width="576" height="266" /&gt;&lt;/a&gt;  &lt;p&gt;I bought a domain name through Blogger a few months ago, got my receipt through Google Checkout and went on holiday. The Google Checkout receipt has a link to retrieve the Google Apps account to manage the domain: that link doesn’t work any more and the domain does not appear in Blogger. &lt;/p&gt;  &lt;p&gt;My domain fell into a black hole: I can prove I bought it, but I can’t use it! &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-4341673740552231925?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/4341673740552231925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=4341673740552231925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/4341673740552231925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/4341673740552231925'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/09/i-own-domain-name-i-cant-use.html' title='I Own a Domain Name I Can’t Use!'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-ufKCFjIjEPg/Tn43bzOwQHI/AAAAAAAAAQQ/g1t0kMuHqMM/s72-c/Checkout2_thumb%25255B1%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-9113042311867551159</id><published>2011-09-20T20:05:00.001+01:00</published><updated>2011-09-20T20:06:28.939+01:00</updated><title type='text'>Currently reading… (Read It Later)</title><content type='html'>&lt;ul&gt;   &lt;li&gt;Windows 8: &lt;a href="http://dougseven.com/2011/09/15/a-bad-picture-is-worth-a-thousand-long-discussions/"&gt;A bad picture is worth a thousand long discussions&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Economy: &lt;a href="http://www.lepoint.fr/economie/grece-questions-sur-une-interminable-crise-20-09-2011-1375357_28.php"&gt;Grece, questions sur une interminable crise&lt;/a&gt; (Le Point)&lt;/li&gt;    &lt;li&gt;DB: &lt;a href="http://michaeljswart.com/2011/09/mythbusting-concurrent-updateinsert-solutions/"&gt;Mythbusting: Concurrent Update/Insert Solutions&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Misc: &lt;a href="http://www.guardian.co.uk/science/2011/sep/20/italian-scientists-trial-predict-earthquake"&gt;Italian scientists on trial for failing to predict earthquake&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-9113042311867551159?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/9113042311867551159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=9113042311867551159' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/9113042311867551159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/9113042311867551159'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/09/currently-reading-read-it-later.html' title='Currently reading… (Read It Later)'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-6450805935960273166</id><published>2011-09-10T13:34:00.000+01:00</published><updated>2011-09-11T15:58:35.293+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><title type='text'>Fire-proof Software #2: Designing Fault Tolerant Systems</title><content type='html'>&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-uKzhXubeVlE/TmzLcGaiDkI/AAAAAAAAAQA/36WqAE3z-sY/s1600-h/Blog%2525202011-09-11%252520003%252520%252528800x600%252529%252520%252528640x479%252529%25255B5%25255D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="OLYMPUS DIGITAL CAMERA" border="0" alt="OLYMPUS DIGITAL CAMERA" src="http://lh6.ggpht.com/-2o9wxt54gTU/TmzLch_vQfI/AAAAAAAAAQE/AyHRxTegTX8/Blog%2525202011-09-11%252520003%252520%252528800x600%252529%252520%252528640x479%252529_thumb%25255B2%25255D.jpg?imgmax=800" width="557" height="433" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Follow-up from &lt;a href="http://www.codinginlondon.com/2011/09/designing-fault-tolerant-system.html"&gt;part 1&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;This is a few of the failure conditions we see with real production software, along with some approaches to deal with them. The general idea is to define &lt;strong&gt;activities&lt;/strong&gt;. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Each activity is a unit of work that may either complete or fail and that can be retried if necessary. &lt;/li&gt;    &lt;li&gt;An activity has a &lt;strong&gt;start&lt;/strong&gt; and an &lt;strong&gt;end&lt;/strong&gt;, as well as a &lt;strong&gt;status&lt;/strong&gt; (Complete/Failed). &lt;/li&gt;    &lt;li&gt;An activity also has &lt;strong&gt;success criteria&lt;/strong&gt; that allow a process to check the activity actually completed. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The database contains a schedule of those activities along with a MaxRunTime value and a flag indicating if it's currently running. The MaxRunTime allows processes to spot an activity that timed out.    &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Input data not available (Failure of one of the upstream systems)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;You can’t bet on the fact that upstream systems will work, regardless of the reason why, they &lt;strong&gt;will&lt;/strong&gt; fail. There is no point trying to imagine the reasons behind the potential failure, what matters is the &lt;strong&gt;impact of the failure&lt;/strong&gt; on your system and on the business.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Have a retry policy for each activity (retry period + retry window) &lt;/li&gt;    &lt;li&gt;Use a stale version of the data (previous day for instance) if acceptable with the business. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Notification not available&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Back-up the notification mechanism with an activity schedule: an activity should automatically start at a defined time if it hasn’t already. &lt;/li&gt;    &lt;li&gt;If an activity has already started following a notification, the DB flag in the activity schedule table will guarantee that it doesn't start again. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Process crash&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Have a Windows service detect the process crash and restart the process. &lt;/li&gt;    &lt;li&gt;If the process crashes following an &lt;strong&gt;unhandled exception&lt;/strong&gt;, the currently running activity will be automatically marked as failed. When the process starts again it should attempt to schedule or start the failed activity. &lt;/li&gt;    &lt;li&gt;If the process is simply &lt;strong&gt;killed&lt;/strong&gt; with no opportunity to mark the current activity as &lt;em&gt;failed&lt;/em&gt; the activity will still appear as &lt;em&gt;running&lt;/em&gt; in the ActivitySchedule. When the process starts again it will see that its activity is currently running and will simply schedule a check at StartTime + MaxRunTime. Obviously the check will fail and the process will restart the activity. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Process stalls&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Kill it with a watchdog thread: this is a pattern used by embedded systems on real-time OSs to reset a stalled CPU. Inside the app server process the main thread –the one that does all the work- should periodically reset the watchdog flag. If the watchdog flag is not reset after a defined period of time the watchdog thread kills the process after failing the current activity. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Server down or unreachable&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Use 2 servers, one primary and one backup. &lt;/li&gt;    &lt;li&gt;Each server runs identical processes scheduling the same activities. Both processes will attempt to start their activity at the same time however the ActivitySchedule table in the DB will allow &lt;strong&gt;only one&lt;/strong&gt; process to actually start the activity. &lt;/li&gt;    &lt;li&gt;If one server goes down, all processes will simply attempt to reschedule their activities upon restart. &lt;/li&gt;    &lt;li&gt;If one server goes down while an activity is running, the activity will still appear as &lt;em class="em rangy_1"&gt;running&lt;/em&gt; in the ActivitySchedule. Upon restart processes will see the activity is marked as &lt;em class="em rangy_1"&gt;running&lt;/em&gt; and will schedule a check at the expected completion time. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Database not available&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Avoid maintaining a single DB connection for too long, that reduces the opportunities of the system to reconnect. &lt;/li&gt;    &lt;li&gt;If you can detect the connection failure and don’t want the complexity of implementing a retry mechanism, at least &lt;strong&gt;fail the current activity&lt;/strong&gt; to take advantage of the activity’s retry policy. &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-6450805935960273166?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/6450805935960273166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=6450805935960273166' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6450805935960273166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6450805935960273166'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/09/sink-proof-software-2-designing-fault.html' title='Fire-proof Software #2: Designing Fault Tolerant Systems'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-2o9wxt54gTU/TmzLch_vQfI/AAAAAAAAAQE/AyHRxTegTX8/s72-c/Blog%2525202011-09-11%252520003%252520%252528800x600%252529%252520%252528640x479%252529_thumb%25255B2%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-3088132119968525944</id><published>2011-09-03T15:58:00.000+01:00</published><updated>2011-09-04T13:43:48.471+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><title type='text'>Sink-Proof Software #1: Designing Fault Tolerant Systems</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.ggpht.com/-UZnVXejGTB4/TmJBPnfZMmI/AAAAAAAAAP0/kMXlfObBlPM/s1600-h/Scotland%252520075%252520%252528480x640%252529%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 5px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="OLYMPUS DIGITAL CAMERA" border="0" alt="OLYMPUS DIGITAL CAMERA" src="http://lh3.ggpht.com/-FI2YKJXgeUM/TmJBP8rl9CI/AAAAAAAAAP4/CdIuQ0dnl2s/Scotland%252520075%252520%252528480x640%252529_thumb%25255B1%25255D.jpg?imgmax=800" width="348" height="470" /&gt;&lt;/a&gt;Middleware Enterprise apps usually do straightforward things: they pump data from here, crunch it a bit, dump it there. Complexity comes from the variety of data sources, their reliability and more importantly &lt;strong&gt;how much availability (up-time) the business requires&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;Say you write an app that processes a daily list of financial instruments to perform a Present Value calculation. What if the &lt;strong&gt;input data is not available&lt;/strong&gt;, i.e. if that list of instruments is not ready? Do you raise a critical fault and give up? Do you use a stale list of instruments? Do you wait a bit and retry? How long should you retry, should you retry forever until the list is available or is there a point where you should give up? Should the retry period be constant or should it increase exponentially to save resources?&lt;/p&gt;  &lt;p&gt;What if one of your processes was waiting for a &lt;strong&gt;notification &lt;/strong&gt;from another system and that notification was never received?&lt;/p&gt;  &lt;p&gt;What do you do if a &lt;strong&gt;process crashes&lt;/strong&gt; because of an unhandled exception, an out-of-memory exception or a third-party library bug? Is there a system in place to restart the process automatically? Does it take over its task where it left off or does it restart from scratch? &lt;/p&gt;  &lt;p&gt;What do you do if a &lt;strong&gt;process stalls&lt;/strong&gt;? Because of a blocked DB call for instance, or some synchronous API call that never comes back…&lt;/p&gt;  &lt;p&gt;What if that process was handling client requests? Do you have a backup process to handle the requests while the primary process recovers? Can the system handle a down time?&lt;/p&gt;  &lt;p&gt;What do you do if &lt;strong&gt;the entire application server goes down&lt;/strong&gt; either because an engineer tripped on the power cable, the server room was flooded by hurricane Irene, a plane crashed on your main datacentre, the datacentre's power supply failed or there is no more network connectivity to the datacentre?&lt;/p&gt;  &lt;p&gt;What do you do if the &lt;strong&gt;database is not available&lt;/strong&gt; for some time? Do you store data in memory temporarily? Do you detect it and try and reconnect or do you just fail on all subsequent DB calls? Do you reroute the DB logging to log files so that logs remain accessible?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-3088132119968525944?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/3088132119968525944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=3088132119968525944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3088132119968525944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3088132119968525944'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/09/designing-fault-tolerant-system.html' title='Sink-Proof Software #1: Designing Fault Tolerant Systems'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-FI2YKJXgeUM/TmJBP8rl9CI/AAAAAAAAAP4/CdIuQ0dnl2s/s72-c/Scotland%252520075%252520%252528480x640%252529_thumb%25255B1%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-8915337578639023460</id><published>2011-08-17T22:35:00.001+01:00</published><updated>2011-08-21T20:42:53.303+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><title type='text'>Do I need this config file?</title><content type='html'>&lt;p&gt;Config files are all over the place with .NET: WCF, Log4Net, everything comes with an XML config file even if you didn't ask for one.&lt;/p&gt;&lt;p&gt;But when you think about it, why do you need config files really? Usually that's because you want to change some behaviour without having to rebuild the code. Ok. But what is so bad about rebuilding the code?&lt;/p&gt;&lt;p&gt;In the Enterprise world if you intend to make a change to a config file in production, you’re not going to just change the file on the production server (unless you're Jack Bauer and you have a death wish after your wife was murdered). You're going to make the change in the staging environment first then test it. If the system didn’t collapse then you'll raise a change request, have it approved by change management and eventually release it in prod. Well now compare that with rebuilding the code... mmm? Same amount of hassle, you'd have to go through the same steps anyway.&lt;/p&gt;&lt;p&gt;I find the main benefit of config files in Enterprise server apps is to ease the pain involved in moving from development to staging and from staging to production. This is where the config files are really useful because you have &lt;strong&gt;one code base&lt;/strong&gt; for &lt;strong&gt;many environments&lt;/strong&gt;. Connection strings, timeout values, environment identifiers, log file paths, simulated dates, weekend definitions, job start times, retry windows, SMTP servers, Tibco RV transport settings... They all depend on where you run the code from.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-8915337578639023460?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/8915337578639023460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=8915337578639023460' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/8915337578639023460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/8915337578639023460'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/08/do-i-need-this-config-file.html' title='Do I need this config file?'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-6430114534311804298</id><published>2011-06-30T21:08:00.001+01:00</published><updated>2011-09-03T12:03:08.569+01:00</updated><title type='text'>Using Mobile Broadband in Europe with Huawey Mifi</title><content type='html'>&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-LNUf1QUU-6U/TmIJMkTSWiI/AAAAAAAAAPo/thwo0A8LqmU/s1600-h/Blog%2525202011-09-03%252520001%252520%252528478x640%252529%252520%252528373x500%252529%252520%252528224x300%252529%25255B3%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top: 0px; border-right: 0px; padding-top: 0px" title="Blog 2011-09-03 001 (478x640) (373x500) (224x300)" border="0" alt="Blog 2011-09-03 001 (478x640) (373x500) (224x300)" align="right" src="http://lh3.ggpht.com/-2pgKXXeEOvU/TmIJM_9JFUI/AAAAAAAAAPs/HP9SmLBLMoU/Blog%2525202011-09-03%252520001%252520%252528478x640%252529%252520%252528373x500%252529%252520%252528224x300%252529_thumb.jpg?imgmax=800" width="183" height="244" /&gt;&lt;/a&gt;I was in &lt;a href="http://www.codinginlondon.com/2011/03/using-mobile-broadband-in-singapore.html"&gt;Singapore&lt;/a&gt; recently and used the little Huawey with a local SIM card to get mobile internet for the iPhone, iPad and Vaio.&lt;/p&gt;  &lt;p&gt;To do the same in Europe, I’m trying out MaxRoam. You pay 10 Euros for the SIM card then you top it up as you go. &lt;/p&gt;  &lt;p&gt;Steps:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Buy the card &lt;/li&gt;    &lt;li&gt;Activate it on the MaxRoam website &lt;/li&gt;    &lt;li&gt;Insert the SIM in the Mifi device &lt;/li&gt;    &lt;li&gt;Plug the Mifi device to your PC over USB &lt;/li&gt;    &lt;li&gt;Install the drivers located on the Mifi. This also creates a little shortcut on the desktop. &lt;/li&gt;    &lt;li&gt;Launch the shortcut that opens the configuration page of the Mifi. &lt;/li&gt;    &lt;li&gt;There you can unlock the SIM by typing its code and specify the MaxRoam APN details. &lt;/li&gt;    &lt;li&gt;The MaxRoam website tells you how much you have left on your account and lets you top-up. &lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-6430114534311804298?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/6430114534311804298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=6430114534311804298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6430114534311804298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6430114534311804298'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/06/using-mobile-broadband-in-europe-with.html' title='Using Mobile Broadband in Europe with Huawey Mifi'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-2pgKXXeEOvU/TmIJM_9JFUI/AAAAAAAAAPs/HP9SmLBLMoU/s72-c/Blog%2525202011-09-03%252520001%252520%252528478x640%252529%252520%252528373x500%252529%252520%252528224x300%252529_thumb.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-5745991299337201787</id><published>2011-05-25T18:19:00.001+01:00</published><updated>2011-05-30T17:59:41.897+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UKTechDays'/><title type='text'>UK tech.days Day 3–Client Apps</title><content type='html'>&lt;p&gt;The last day was all about writing Windows GUIs.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-1j3W7NdUVEk/TePMNsnD8rI/AAAAAAAAAPY/LCnr-HYGjdo/s1600-h/UKTechDays%2525202011-05-25%252520001%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px; padding-top: 0px" title="UKTechDays 2011-05-25 001" border="0" alt="UKTechDays 2011-05-25 001" align="right" src="http://lh5.ggpht.com/-KgZd8__UvLY/TePMOPKhR2I/AAAAAAAAAPc/ToKmF6oVCgc/UKTechDays%2525202011-05-25%252520001_thumb%25255B1%25255D.jpg?imgmax=800" width="391" height="272" /&gt;&lt;/a&gt;During the intro &lt;strong&gt;Mark Quirk&lt;/strong&gt; listed the technologies currently available for building client apps. He gave his personal recommendation about which one to choose: “if you’re not sure which one to go for give a try to &lt;strong&gt;Silverlight&lt;/strong&gt; and see if it works for you.” When he asked “show of hands, who here has written code in Silverlight?” most of the attendees in the packed room raised their hand (I didn’t).&lt;/p&gt;  &lt;p&gt;Amazing how Silverlight has quickly moved from something that was rather niche to a mainstream Windows technology. Now it is the toolkit you use by default when you don’t have a compelling reason to use any other (a bit like MFC 15 years ago). What used to be just a cut-down version of the .NET framework for browser plug-in is now much more…&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Mike Taulty&lt;/strong&gt; went over what’s coming in Silverlight 5:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;access to low-level XNA APIs for 3D graphics &lt;/li&gt;    &lt;li&gt;video: playback rate control and pitch correction &lt;/li&gt;    &lt;li&gt;the client networking stack is faster and was moved to its own thread. &lt;/li&gt;    &lt;li&gt;faster app startup through multi-core JITing &lt;/li&gt;    &lt;li&gt;faster XAML parser &lt;/li&gt;    &lt;li&gt;WS-Trust support for SAML security tokens &lt;/li&gt;    &lt;li&gt;support for multiple top-level windows &lt;/li&gt;    &lt;li&gt;trusted browser application: if you sign the XAP you can run an in-browser Silverlight app in fully trusted mode and therefore be able to do nasty things such as P/Invoke… &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Impressive… One by one the limitations associated with Silverlight are going away.&lt;/p&gt;      &lt;p&gt;&lt;strong&gt;Laurent Bugnion&lt;/strong&gt; talked about MVVM, showing a solution where 3 projects (Silverlight, WPF and Web) were accessing the same service. Some videos of his previous talks &lt;a href="http://www.galasoft.ch/mvvmvideo1"&gt;here&lt;/a&gt; and &lt;a href="http://www.galasoft.ch/mvvmvideo2"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-5745991299337201787?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/5745991299337201787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=5745991299337201787' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5745991299337201787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5745991299337201787'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/05/uk-techdays-day-3client-apps.html' title='UK tech.days Day 3–Client Apps'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-KgZd8__UvLY/TePMOPKhR2I/AAAAAAAAAPc/ToKmF6oVCgc/s72-c/UKTechDays%2525202011-05-25%252520001_thumb%25255B1%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-5557817420130100688</id><published>2011-05-24T18:37:00.001+01:00</published><updated>2011-05-29T18:58:55.854+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UKTechDays'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><title type='text'>Windows Phone 7–Day 2 of UK tech.days</title><content type='html'>&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="UKTechDays 2011-05-24 002" border="0" alt="UKTechDays 2011-05-24 002" src="http://lh4.ggpht.com/_QNxJ6n10eEU/TdwGCRJ6AZI/AAAAAAAAAPI/DGft4-KfZ2A/UKTechDays%202011-05-24%20002%5B5%5D.jpg?imgmax=800" width="513" height="392" /&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="If (Developpers.Happy()) return OnInvestment;" border="0" alt="If (Developpers.Happy()) return OnInvestment;" align="right" src="http://lh3.ggpht.com/_QNxJ6n10eEU/TdvxLDfnfuI/AAAAAAAAAPA/uDJnDtToIig/UKTechDays%202011-05-24%20004%20cropped_thumb%5B2%5D.jpg?imgmax=800" width="262" height="193" /&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://uktechdays.cloudapp.net/techdays-live/windows-phone-1-state-of-the-nation.aspx"&gt;Today’s track&lt;/a&gt; was all about Windows Phone 7. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Brendan Watson&lt;/strong&gt; talked about the Windows Phone &lt;strong&gt;Marketplace&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;There are currently 17000 apps registered in the market place. The average selling price of an app is $2.93.&lt;/p&gt;  &lt;p&gt;The Nokia deal will bring more carrier partnerships with countries where it’s difficult to get into (China for instance).&lt;/p&gt;  &lt;p&gt;You can currently create apps in 30 countries but sell them in only 16. This number is expected to go up to 35 by the time Mango comes out.&lt;/p&gt;  &lt;p&gt;Something clever about the market place: devs have the possibility to initiate beta testing programs. &lt;/p&gt;  &lt;p&gt;Most of the other talks centred around &lt;strong&gt;UI design&lt;/strong&gt; and &lt;strong&gt;performance&lt;/strong&gt;. We heard a good number of tips and tricks from coders who faced specific performance issues when building apps and showed how to solve them.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Gergely Orosz&lt;/strong&gt; described how his team spent a month discussing how &lt;strong&gt;Cocktail Flow&lt;/strong&gt; would look like, building photoshop prototypes.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;small team, rapid prototyping and iteration. &lt;/li&gt;    &lt;li&gt;full visual plans with Photoshop and Flash. Several iterations. &lt;/li&gt;    &lt;li&gt;found inspiration in design guidelines for Windows Phone (MSDN)… &lt;/li&gt;    &lt;li&gt;…and YouTube videos of app demos &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Some of his &lt;strong&gt;graphic design&lt;/strong&gt; tips:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;You don’t have to stick with black (even if this is the default for most apps) &lt;/li&gt;    &lt;li&gt;Use images in menu items. Square images with grey frame look good. &lt;/li&gt;    &lt;li&gt;Use non dominant background images &lt;/li&gt;    &lt;li&gt;Keep dominant images for headers &lt;/li&gt;    &lt;li&gt;Spice up the buttons with gradients or different typo &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Quotes from Gergely: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Allow your designer gene to come out”&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;&lt;!--EndFragment--&gt;&lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;“Content is king but don’t ignore the chrome”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Oren Nachman&lt;/strong&gt; gave lots of tips to optimise &lt;strong&gt;performance&lt;/strong&gt;: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Don’t use the ProgressBar control that comes out the box. It’s jerky. Instead use the &lt;strong&gt;PerformanceProgressBar&lt;/strong&gt; from the &lt;a href="http://silverlight.codeplex.com/"&gt;Silverlight Toolkit&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;Enable &lt;strong&gt;RedrawRegions&lt;/strong&gt; flag in debug mode to make it obvious when Silverlight is redrawing regions for no reason. &lt;/li&gt;    &lt;li&gt;Use the &lt;strong&gt;CacheMode&lt;/strong&gt; property (on the WrapPanel for instance) to put images on the GPU and avoid redrawing them. &lt;/li&gt;    &lt;li&gt;Alternatives to the current ListBox: LongListSelector, LowProfileImageLoader&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Also Oren mentioned that in the coming Mango release, &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;the &lt;strong&gt;ListBox&lt;/strong&gt; was completely revisited and will be faster.&lt;/li&gt;    &lt;li&gt;Networking: HttpWebRequest will take place on a &lt;strong&gt;background thread&lt;/strong&gt;.&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-5557817420130100688?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/5557817420130100688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=5557817420130100688' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5557817420130100688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5557817420130100688'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/05/windows-phone-7day-2-of-uk-techdays.html' title='Windows Phone 7–Day 2 of UK tech.days'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_QNxJ6n10eEU/TdwGCRJ6AZI/AAAAAAAAAPI/DGft4-KfZ2A/s72-c/UKTechDays%202011-05-24%20002%5B5%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-6826930245439869199</id><published>2011-05-23T18:44:00.001+01:00</published><updated>2011-05-24T18:58:07.840+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UKTechDays'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Overview of HTML5 – Day 1 of UK tech.days</title><content type='html'>&lt;p&gt;&lt;a href="http://uktechdays.cloudapp.net/techdays-live.aspx"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="UK Tech Days" border="0" alt="UK Tech Days" src="http://lh3.ggpht.com/_QNxJ6n10eEU/Tdq7xAF8RVI/AAAAAAAAAO0/-zxqkMa5EJw/UKTechDays%202011-05-23%20001%5B8%5D.jpg?imgmax=800" width="425" height="329" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;It’s day 1 of &lt;a href="http://uktechdays.cloudapp.net/techdays-live.aspx"&gt;UK Tech Days&lt;/a&gt; at the Vue cinema of Fulham Broadway where I attended the &lt;a href="http://uktechdays.cloudapp.net/techdays-live/the-web.aspx"&gt;Web track&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I heard a number of talks today, one of them about &lt;strong&gt;HTML5&lt;/strong&gt; by &lt;strong&gt;Bruce Lawson&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;HTML5 is an on-going effort and is not yet complete but lots of bits can already be used now.&lt;/p&gt;  &lt;p&gt;In 1999 the W3C decided that HTML was finished and that the future was XML with XHTML1. Then it started planning XHTML2 where a lot of importance was given to language purity. No one cared.&lt;/p&gt;  &lt;p&gt;Following work initiated by Ian Hickson with &lt;a href="http://developers.whatwg.org/"&gt;WHATWG&lt;/a&gt;, W3C decided to start working on HTML again and created HTML5. XHTML2 was eventually deprecated. So how come did HTML5 prevail on XHTML2? Bruce said:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;it’s &lt;strong&gt;backward compatible&lt;/strong&gt; with existing websites and &lt;/li&gt;    &lt;li&gt;it’s more tolerant to &lt;strong&gt;error handling&lt;/strong&gt;: the spec precisely defines what to do when markup does not validate. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The design principles that guide HTML5 are based around: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;the 80/20 rule and &lt;/li&gt;    &lt;li&gt;the belief that users are more important than authors, authors are more important than theoretical purity. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Other technologies not part of HTML5 but often used together: SVG, geolocation and CSS3. &lt;/p&gt;  &lt;p&gt;HTML5 defines markup elements but also many &lt;strong&gt;JavaScript APIs&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;HTML5 introduces the &lt;strong&gt;commonly used &amp;lt;div&amp;gt;&lt;/strong&gt; as proper elements that actually mean something (header, footer, side bar). This makes it easier to build accessible apps because the browser can immediately identify the footer, the header, the side bar…&lt;/p&gt;  &lt;p&gt;It also standardises some &lt;strong&gt;commonly used input forms&lt;/strong&gt; (such as date pickers for instance) with the &amp;lt;input type=”…”/&amp;gt; element.&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;&amp;lt;video&amp;gt;&lt;/strong&gt; element displays play/pause controls on top of the video, works with many formats and remove the need for a plugin. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Media queries&lt;/strong&gt; allow you to define several files with various resolutions depending on the capabilities of the device.&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;&amp;lt;track&amp;gt;&lt;/strong&gt; element shows subtitles over a video. The subtitles are in plain text therefore searchable and you can define several languages.&lt;/p&gt;  &lt;p&gt;Other features: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;detection of connection loss &lt;/li&gt;    &lt;li&gt;offline application cache &lt;/li&gt;    &lt;li&gt;server-sent events (to avoid polling) &lt;/li&gt;    &lt;li&gt;web sockets &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Good quotes &lt;/strong&gt;by Bruce:&lt;/p&gt;  &lt;p&gt;“HTML5 wants you to go to the pub”&lt;/p&gt;  &lt;p&gt;“Nobody likes their bits to be in a black box, everybody likes their bits to be manipulated”&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-6826930245439869199?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/6826930245439869199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=6826930245439869199' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6826930245439869199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6826930245439869199'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/05/overview-of-html5-day-1-of-uk-tech-days.html' title='Overview of HTML5 – Day 1 of UK tech.days'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_QNxJ6n10eEU/Tdq7xAF8RVI/AAAAAAAAAO0/-zxqkMa5EJw/s72-c/UKTechDays%202011-05-23%20001%5B8%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-2073278191584617154</id><published>2011-05-17T21:01:00.000+01:00</published><updated>2011-05-17T21:01:41.553+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ipad'/><title type='text'>Upgrading from iPad1 to iPad2</title><content type='html'>It’s a bit thinner and a bit lighter, the screen is a bit brighter but nothing very spectacular. &lt;br /&gt;
The most striking difference is with the &lt;b&gt;app start-up time&lt;/b&gt;. All apps that take a little while to load initially, such as BBC iPlayer, Google Earth, Friendly, Evernote, the New York Times, MobileRSS, BBC News all take less time to start-up on the iPad2.&lt;br /&gt;
&lt;br /&gt;
And it's a bit more slippery as well when handled bare.&lt;br /&gt;
&lt;br /&gt;
Facetime on a tablet is fun (although the image quality for the other party is better when using the iPhone 4, because the iPad2 camera is so poor).&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-2073278191584617154?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/2073278191584617154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=2073278191584617154' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/2073278191584617154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/2073278191584617154'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/05/upgrading-from-ipad1-to-ipad2.html' title='Upgrading from iPad1 to iPad2'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-7439261236458335774</id><published>2011-05-15T17:09:00.000+01:00</published><updated>2011-05-16T20:59:29.119+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Safari Books Online'/><category scheme='http://www.blogger.com/atom/ns#' term='Ipad'/><title type='text'>The New Safari Books Online app for iPad!</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_QNxJ6n10eEU/TdAVVvUw1RI/AAAAAAAAAN0/mFZfCPVNw4M/s1600-h/IMG_0005%5B3%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="IMG_0005" border="0" alt="IMG_0005" src="http://lh6.ggpht.com/_QNxJ6n10eEU/TdAVWPUReAI/AAAAAAAAAN4/w-24DbQmQcw/IMG_0005_thumb%5B1%5D.png?imgmax=800" width="623" height="479" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;At last!!! The reason why I bought an iPad in the first place! Being able to browse the wonderful &lt;a href="http://my.safaribooksonline.com/"&gt;Safari Books Online&lt;/a&gt; library from the iPad and download entire books for &lt;strong&gt;offline reading&lt;/strong&gt; in the tube.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.codinginlondon.com/2010/12/mistery-of-safari-to-go.html"&gt;Last year&lt;/a&gt; O’Reilly released a first version of Safari To Go that was one of the worse apps on the planet at the time. They removed it from the app store less than a month after release.&lt;/p&gt;  &lt;p&gt;So far the least worse way to browse the books from an iPad was to use the &lt;a href="http://www.codinginlondon.com/2011/04/safari-online-books-on-ipad.html"&gt;full web front-end&lt;/a&gt;, which wasn’t too bad with a browser supporting full-screen. But reading a book on the web was sluggish: you had to wait every time you clicked the next page, offline reading was not possible so no way to read in the London tube.&lt;/p&gt;  &lt;p&gt;Version 2.0.1 of &lt;strong&gt;&lt;a href="http://itunes.apple.com/us/app/safari-to-go/id385824712?mt=8"&gt;Safari To Go&lt;/a&gt;&lt;/strong&gt; is a proper native iPad app that uses the whole screen and allows you to touch swipe between pages (compare that to the wasted space and sluggish web feel of version 1.0).&lt;/p&gt;  &lt;p&gt;When flipping pages you have access to a very handy pop-up&lt;strong&gt; Table of Contents&lt;/strong&gt; (I wish iBooks had that).&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="Table Of Contents" border="0" alt="Table Of Contents" src="http://lh4.ggpht.com/_QNxJ6n10eEU/Tc_61yMxStI/AAAAAAAAANs/yvUKtvOC9rs/IMG_0008_thumb%5B1%5D.png?imgmax=800" width="354" height="478" /&gt;&lt;/p&gt;  &lt;p&gt;You can &lt;strong&gt;cache the entire book&lt;/strong&gt; you’re currently reading. This is a very useful functionality that even the web front-end did not allow: all you could do with Safari Books Online was download individual chapters as PDF. Because there was a limit on how many chapters you could download each year you always had to think twice before downloading an entire book. That made offline reading very tedious. &lt;/p&gt;  &lt;p&gt;Saving a book for offline use looks like this:&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="Offline Bookbag" border="0" alt="Offline Bookbag" src="http://lh6.ggpht.com/_QNxJ6n10eEU/TdAVXK2hFzI/AAAAAAAAAOA/DrfZBaT6cQg/IMG_0010_thumb%5B4%5D.png?imgmax=800" width="411" height="565" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="Saving Offline Bookbag" border="0" alt="Saving Offline Bookbag" src="http://lh6.ggpht.com/_QNxJ6n10eEU/TdAVYEgphJI/AAAAAAAAAOI/Eef7htIgKQ4/IMG_0011_thumb%5B5%5D.png?imgmax=800" width="414" height="562" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-7439261236458335774?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/7439261236458335774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=7439261236458335774' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7439261236458335774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7439261236458335774'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/05/new-safari-books-online-app-for-ipad.html' title='The New Safari Books Online app for iPad!'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_QNxJ6n10eEU/TdAVWPUReAI/AAAAAAAAAN4/w-24DbQmQcw/s72-c/IMG_0005_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-2083215559587836033</id><published>2011-05-07T18:41:00.000+01:00</published><updated>2011-05-07T18:41:59.735+01:00</updated><title type='text'>Conferences List</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="648"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="193"&gt;&lt;strong&gt;Conference&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="96"&gt;&lt;strong&gt;When&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="153"&gt;&lt;strong&gt;Next&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="204"&gt;&lt;strong&gt;Where&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;FOWA Miami&lt;/td&gt;        &lt;td valign="top" width="96"&gt;February&lt;/td&gt;        &lt;td valign="top" width="153"&gt;&amp;nbsp;&lt;/td&gt;        &lt;td valign="top" width="204"&gt;Miami&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;SXSW&lt;/td&gt;        &lt;td valign="top" width="96"&gt;March&lt;/td&gt;        &lt;td valign="top" width="153"&gt;&amp;nbsp;&lt;/td&gt;        &lt;td valign="top" width="204"&gt;Austin&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;DevWeek&lt;/td&gt;        &lt;td valign="top" width="96"&gt;March&lt;/td&gt;        &lt;td valign="top" width="153"&gt;&amp;nbsp;&lt;/td&gt;        &lt;td valign="top" width="204"&gt;London&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;Qcon&lt;/td&gt;        &lt;td valign="top" width="96"&gt;March&lt;/td&gt;        &lt;td valign="top" width="153"&gt;&amp;nbsp;&lt;/td&gt;        &lt;td valign="top" width="204"&gt;London&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;DevTeach&lt;/td&gt;        &lt;td valign="top" width="96"&gt;March&lt;/td&gt;        &lt;td valign="top" width="153"&gt;&amp;nbsp;&lt;/td&gt;        &lt;td valign="top" width="204"&gt;Toronto&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;&lt;a href="http://www.microsoft.com/events/mix/default.aspx" target="_blank"&gt;MIX&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="96"&gt;March&lt;/td&gt;        &lt;td valign="top" width="153"&gt;April 12-14, 2011&lt;/td&gt;        &lt;td valign="top" width="204"&gt;Las Vegas&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;VBug4Thought&lt;/td&gt;        &lt;td valign="top" width="96"&gt;April&lt;/td&gt;        &lt;td valign="top" width="153"&gt;&amp;nbsp;&lt;/td&gt;        &lt;td valign="top" width="204"&gt;Midlands, UK&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;&lt;a href="http://www.microsoft.com/uk/techdays/" target="_blank"&gt;Microsoft Tech Days UK&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="96"&gt;April&lt;/td&gt;        &lt;td valign="top" width="153"&gt;May 23-27, 2011&lt;/td&gt;        &lt;td valign="top" width="204"&gt;London&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;Future of Web Design&lt;/td&gt;        &lt;td valign="top" width="96"&gt;May&lt;/td&gt;        &lt;td valign="top" width="153"&gt;May 16-28, 2011&lt;/td&gt;        &lt;td valign="top" width="204"&gt;London&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;&lt;a href="http://futureofwebapps.com/dublin-2010/" target="_blank"&gt;FOWA Dublin&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="96"&gt;May&lt;/td&gt;        &lt;td valign="top" width="153"&gt;&amp;nbsp;&lt;/td&gt;        &lt;td valign="top" width="204"&gt;Dublin&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;DDD Southwest&lt;/td&gt;        &lt;td valign="top" width="96"&gt;June&lt;/td&gt;        &lt;td valign="top" width="153"&gt;&amp;nbsp;&lt;/td&gt;        &lt;td valign="top" width="204"&gt;Bristol&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;&lt;a href="http://www.ndc2010.no/" target="_blank"&gt;Norwegian Developers Conference&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="96"&gt;May&lt;/td&gt;        &lt;td valign="top" width="153"&gt;May 25-27, 2011&lt;/td&gt;        &lt;td valign="top" width="204"&gt;Oslo&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;&lt;a href="http://northamerica.msteched.com" target="_blank"&gt;TechEd US&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="96"&gt;May&lt;/td&gt;        &lt;td valign="top" width="153"&gt;May 16-19, 2011&lt;/td&gt;        &lt;td valign="top" width="204"&gt;Atlanta&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;&lt;a href="http://www.codegeneration.net/cg2010/index.php" target="_blank"&gt;Code Generation&lt;/a&gt; &lt;/td&gt;        &lt;td valign="top" width="96"&gt;June&lt;/td&gt;        &lt;td valign="top" width="153"&gt;&amp;nbsp;&lt;/td&gt;        &lt;td valign="top" width="204"&gt;Cambridge&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;&lt;a href="http://www.microsoft.com/europe/teched/"&gt;TechEd Europe&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="96"&gt;June&lt;/td&gt;        &lt;td valign="top" width="153"&gt;June 25-29 2012&lt;/td&gt;        &lt;td valign="top" width="204"&gt;Amsterdam&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;&lt;a href="http://futureofwebapps.com/london-2010/" target="_blank"&gt;FOWA London&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="96"&gt;October&lt;/td&gt;        &lt;td valign="top" width="153"&gt;&amp;nbsp;&lt;/td&gt;        &lt;td valign="top" width="204"&gt;London&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;&lt;a href="http://developerdeveloperdeveloper.com/ddd8a/" target="_blank"&gt;DDD&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="96"&gt;Any time of the year&lt;/td&gt;        &lt;td valign="top" width="153"&gt;&amp;nbsp;&lt;/td&gt;        &lt;td valign="top" width="204"&gt;Reading&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;&lt;a href="http://microsoftpdc.com/" target="_blank"&gt;PDC&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="96"&gt;November&lt;/td&gt;        &lt;td valign="top" width="153"&gt;&amp;nbsp;&lt;/td&gt;        &lt;td valign="top" width="204"&gt;Redmond&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="193"&gt;LeWeb&lt;/td&gt;        &lt;td valign="top" width="96"&gt;December&lt;/td&gt;        &lt;td valign="top" width="153"&gt;&amp;nbsp;&lt;/td&gt;        &lt;td valign="top" width="204"&gt;Paris&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-2083215559587836033?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/2083215559587836033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=2083215559587836033' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/2083215559587836033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/2083215559587836033'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/03/my-conferences-collection.html' title='Conferences List'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-3844713771976420569</id><published>2011-04-18T21:01:00.001+01:00</published><updated>2011-04-18T21:09:52.742+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Books'/><category scheme='http://www.blogger.com/atom/ns#' term='Safari Books Online'/><category scheme='http://www.blogger.com/atom/ns#' term='Ipad'/><title type='text'>Safari Books Online on the Ipad</title><content type='html'>&lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Text and TOC" border="0" alt="Text and TOC" src="http://lh5.ggpht.com/_QNxJ6n10eEU/TayYk09xjyI/AAAAAAAAANc/iQJvo6GG5Ds/IMG_0051%20%28800x600%29%5B7%5D.jpg?imgmax=800" width="433" height="343" /&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Full-screen text" border="0" alt="Full-screen text" src="http://lh4.ggpht.com/_QNxJ6n10eEU/TayYlDtXaII/AAAAAAAAANg/MH3MFbIxzbQ/IMG_0052%20%28800x600%29%5B7%5D.jpg?imgmax=800" width="433" height="343" /&gt; &lt;/p&gt;  &lt;p&gt;The best way I know to read Safari Books Online on the Ipad is the full web interface (not the mobile web version).&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Install an alternative to Safari called &lt;strong&gt;Perfect Browser&lt;/strong&gt; that allows full-screen browsing. &lt;/li&gt;    &lt;li&gt;Browse to a Safari &lt;a href="http://techbus.safaribooksonline.com/book/programming/microsoft-wpf/9781430272052/routed-events/routed_events"&gt;book&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;Enable &lt;strong&gt;HTML View&lt;/strong&gt; and &lt;strong&gt;Full Screen&lt;/strong&gt;. Without HTML View, the text doesn’t scale properly when you zoom. &lt;/li&gt;    &lt;li&gt;In &lt;strong&gt;Perfect Browser&lt;/strong&gt;, hide the address bar and the tab bar. &lt;/li&gt;    &lt;li&gt;Display the table of contents on the left. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You are now browsing your Safari books full screen with a table of contents in sync. Double tap on a paragraph to zoom in and hide the TOC. Double-tap again and the TOC comes back.&lt;/p&gt;  &lt;p&gt;Obviously flicking pages is not as smooth as with a PDF and you can’t read the books offline. We’ll have to wait for the next version of Safari To Go for that…&lt;/p&gt;  &lt;p&gt;By the way &lt;strong&gt;Perfect Browser&lt;/strong&gt; is not perfect: if it was it would be able to post to Twitter and Read It Later.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-3844713771976420569?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/3844713771976420569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=3844713771976420569' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3844713771976420569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3844713771976420569'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/04/safari-online-books-on-ipad.html' title='Safari Books Online on the Ipad'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_QNxJ6n10eEU/TayYk09xjyI/AAAAAAAAANc/iQJvo6GG5Ds/s72-c/IMG_0051%20%28800x600%29%5B7%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-5199459090817552800</id><published>2011-04-16T17:21:00.000+01:00</published><updated>2011-04-16T17:21:56.281+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><title type='text'>Each Technology Has Its Place</title><content type='html'>&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_QNxJ6n10eEU/Tam1Qj-TfgI/AAAAAAAAANQ/AtHGF06qhpY/s1600-h/Blog%202011-04-16%20001%20%28800x600%29%5B5%5D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="OLYMPUS DIGITAL CAMERA" border="0" alt="OLYMPUS DIGITAL CAMERA" align="left" src="http://lh4.ggpht.com/_QNxJ6n10eEU/Tam1RFKa49I/AAAAAAAAANU/iUkKCo7gmxI/Blog%202011-04-16%20001%20%28800x600%29_thumb%5B2%5D.jpg?imgmax=800" width="442" height="345" /&gt;&lt;/a&gt;You would think software engineering is an activity where the decision to use such or such tool is based on pragmatic considerations: short term development costs and long term maintenance costs. In reality there is often a mix of &lt;strong&gt;religion&lt;/strong&gt; (belief that ONE language is better than all others because it’s the language I learnt from an old bold master in a temple somewhere in Tibet) and &lt;strong&gt;fashion&lt;/strong&gt; (technology perceived as cool because its name often appears in blogs and job specs).&lt;/p&gt;  &lt;p&gt;Software libraries form a giant, ever-evolving toolset where each tool is optimal only for a narrow range of applications. This is in spite of the massive efforts by standard bodies to build all-purpose languages. No language is truly all-purpose, each one has its preferred applications.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Languages&lt;/strong&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;C++ stack:&lt;/strong&gt; native programming with Win32, STL, Boost… Best for situations where the CPU or the memory usage becomes a bottleneck: embedded systems, server apps handling large volumes of requests. The focus is on execution speed and low memory footprint.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;C# stack&lt;/strong&gt;: .NET, CLR, Linq, WCF, Windows Forms… Best for situations where the performance bottleneck is in the database or the network. Need for high level of customisation while keeping development costs down: the focus is on ease of development.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;GUI toolsets:&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;MFC&lt;/strong&gt;: extremely responsive front-end for consumer-grade applications (as opposed to Enterprise apps). Has been around for ages and is still actively maintained by Microsoft. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Windows Forms&lt;/strong&gt;: all-purpose front-end, ideal for Enterprise apps. Plenty of of 3rd party controls available. Very easy to code (when you compare to MFC for instance). Acceptably responsive. Deployment over ClickOnce easy as long as no admin rights are required and the target machines have the right .NET framework. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;WPF&lt;/strong&gt;: suitable for front-ends with relatively simple functionality, with an accent on good looks or advanced interaction. Feels a little bit overkill for Enterprise apps in terms of ratio between programming effort / result. Model apps for WPF should be those cool-looking interfaces you see in films. You can also do boring-looking Windows apps (with a menu, drop-down lists, trees and grids…, but there is no much point, you might as well use WinForms). Deployment over ClickOnce similar to Windows Forms. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Silverlight&lt;/strong&gt;: suitable for extremely simple Enterprise front-ends (think IPhone apps but on the desktop), very easy Enterprise deployment via the web browser. The architecture guarantees that the client-side set of DLLs will be lean: you can’t deploy any 3rd party DLL, only Silverlight classes. Any 3rd party functionality has to run on a server, behind a WCF endpoint. In an enterprise context this type of constraint is actually a good thing because it forces you to leave complexity on servers. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;HTML5/Javascript&lt;/strong&gt;: web apps with a large reach, required to work on any browser/platform. Would sound like a really tedious choice in a Windows-based Enterprise environment where much better tools are available. However for pure web apps HTML5/Javascript makes more sense than Flash or Silverlight. &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-5199459090817552800?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/5199459090817552800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=5199459090817552800' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5199459090817552800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5199459090817552800'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/03/each-technology-has-its-place.html' title='Each Technology Has Its Place'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_QNxJ6n10eEU/Tam1RFKa49I/AAAAAAAAANU/iUkKCo7gmxI/s72-c/Blog%202011-04-16%20001%20%28800x600%29_thumb%5B2%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-6434061083195229327</id><published>2011-03-24T07:36:00.001Z</published><updated>2011-03-24T07:36:53.285Z</updated><title type='text'>Using Mobile Broadband in Singapore with Huawey Mifi</title><content type='html'>&lt;p&gt;How to use mobile internet when visiting Singapore? &lt;/p&gt;  &lt;p&gt;I’m currently on holiday in Singapore and I carry around an Iphone, an Ipad and a Vaio (as you do when you’re on holiday). I bought a Mifi device (Huawey E585) a few weeks ago, which means I can create my little Wifi hotspot anywhere I go as long as I have a 3G SIM card.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Starhub &lt;/strong&gt;sells a pre-paid SIM card called &lt;strong&gt;MaxMobile Prepaid&lt;/strong&gt;. It contains a credit of SGD12.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;You can buy it in any Starhub outlet (they tend to run out of stock at the weekend). You will need to show your passport during registration.&lt;/li&gt;    &lt;li&gt;The SIM card goes into the Huawey (I use the E585) and connects to Starhub network immediately. &lt;/li&gt;    &lt;li&gt;However it’s not operational until you activate the credit. Because you registered using your passport, the only way you can activate the credit is by talking directly to customer care on 1633.&lt;/li&gt;    &lt;li&gt;To identify yourself you will need to quote the 8-digit number that appears on the package of the pre-paid SIM that you bought.&lt;/li&gt;    &lt;li&gt;The lady on the phone will ask how many days you want to activate using your available credit. After she activates it, you will be able to connect to the internet immediately.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;To &lt;strong&gt;top up&lt;/strong&gt; your account, &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;buy a SGD18 Happy Top-up card from Starhub or Seven-Eleven.&amp;#160; &lt;/li&gt;    &lt;li&gt;call 1633 to credit your account and activate more days. &lt;/li&gt;    &lt;li&gt;You will need to quote your 8-digit SIM identifier as well as the codes that appear on the Happy Top-up scratch card. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I used Starhub with the Huawey without any problem during my stay in Singapore and could connect the IPhone, IPad and Vaio to it.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-6434061083195229327?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/6434061083195229327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=6434061083195229327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6434061083195229327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6434061083195229327'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/03/using-mobile-broadband-in-singapore.html' title='Using Mobile Broadband in Singapore with Huawey Mifi'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-1738292386188923867</id><published>2011-03-19T09:00:00.001Z</published><updated>2011-03-19T09:35:35.459Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Vaio'/><category scheme='http://www.blogger.com/atom/ns#' term='Ipad'/><title type='text'>Self-Defense Techniques</title><content type='html'>&lt;p&gt;It took me some time before I got to a stable and convenient backup system. I think I got there now. It’s hassle-free, complete and entirely automatic. This is the setup I use now for backup and synchronisation between all my portable gizmos.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1st level&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Dropbox&lt;/strong&gt; to synchronise my essential documents between &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;home PC, &lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;2 VAIO laptops, &lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;IPhone &lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;IPad&lt;/strong&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I have less than 2 GB of essential documents so the free version of Dropbox is fine. I find the &lt;strong&gt;synchronisation very fast&lt;/strong&gt; and more reliable than using the Windows offline files feature or Live Sync. This acts as a first form of backup since all files are saved on the Dropbox server by default. Dropbox files are always available offline under Windows. On the IPad/IPhone versions of Dropbox you must manually tick the files to make them available offline. By essential files I mean&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;technical Books &lt;/li&gt;    &lt;li&gt;travel documents, flight tickets, travel insurance policy, conference tickets…. &lt;/li&gt;    &lt;li&gt;Visual Studio projects &lt;/li&gt;    &lt;li&gt;OneNote files &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;2nd level&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Daily incremental backup &lt;/strong&gt;on an external hard drive of all documents on my D drive using the backup tool that comes with Windows 7. The drive is a 1TB Western Digital. This protects &lt;strong&gt;absolutely everything&lt;/strong&gt; in case my main drives fail, which is a very likely occurrence.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3rd level&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Off-site backup &lt;/strong&gt;with &lt;strong&gt;Mozy&lt;/strong&gt;, just in case my flat burns or I get burgled. This is an industrial-scale backup: documents, video, raw sound files, VM files, everything gets saved. I currently have 130GB saved on Mozy. At the time I bought the subscription, the backup size was unlimited. No matter how big a video is it will save it, it’s just a matter of time. It took me about one week to finish the initial backup. After that it does very quick daily automatic incremental backups.&lt;/p&gt;  &lt;p&gt;I’m happy about this system so far, it’s entirely automatic and very exhaustive.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-1738292386188923867?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/1738292386188923867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=1738292386188923867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1738292386188923867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1738292386188923867'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/03/self-defense-techniques.html' title='Self-Defense Techniques'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-5079466149925313391</id><published>2011-02-26T12:51:00.000Z</published><updated>2011-02-26T12:51:38.805Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Books'/><title type='text'>Books I currently flip through #9</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;&lt;a href="http://fitnesse.s3.amazonaws.com/tdd_net_with_fitnesse.pdf"&gt;Test Driven Development with Fitness&lt;/a&gt;&lt;/strong&gt; (Gojko Adzic – free e-book) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;C# in Depth&lt;/strong&gt; (Jon Skeet) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://www.amazon.co.uk/gp/product/1935182471?ie=UTF8&amp;amp;tag=codiinlond-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=19450&amp;amp;creativeASIN=1935182471"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="41vMVJPzNBL._SL160_" border="0" alt="41vMVJPzNBL._SL160_" src="http://lh4.ggpht.com/_QNxJ6n10eEU/TWE69U3VUrI/AAAAAAAAAM8/oHJ2gVYr7TE/41vMVJPzNBL._SL160_%5B3%5D.jpg?imgmax=800" width="132" height="164" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Introducing Silverlight 4&lt;/strong&gt; (Ashish Ghoda) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://www.amazon.co.uk/gp/product/1430229918?ie=UTF8&amp;amp;tag=codiinlond-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=19450&amp;amp;creativeASIN=1430229918"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="51IvXoq4JtL._SL160_" border="0" alt="51IvXoq4JtL._SL160_" src="http://lh5.ggpht.com/_QNxJ6n10eEU/TWE698OgOAI/AAAAAAAAANA/ejwCx4TTYLc/51IvXoq4JtL._SL160_%5B3%5D.jpg?imgmax=800" width="134" height="164" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;&lt;a href="http://www.charlespetzold.com/phone/index.html"&gt;Programming Windows Phone 7&lt;/a&gt;&lt;/strong&gt; (Charles Petzold) Free e-book that now works on the IPad (the version from a few months ago had trouble being displayed on Ipad/Iphone)&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-5079466149925313391?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/5079466149925313391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=5079466149925313391' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5079466149925313391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5079466149925313391'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/02/books-i-currently-flip-through-9.html' title='Books I currently flip through #9'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_QNxJ6n10eEU/TWE69U3VUrI/AAAAAAAAAM8/oHJ2gVYr7TE/s72-c/41vMVJPzNBL._SL160_%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-3422579499082580079</id><published>2011-01-24T07:07:00.001Z</published><updated>2011-03-05T17:34:36.438Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Travel'/><title type='text'>Preparing a trip to South East Asia…</title><content type='html'>&lt;p&gt;I’m gathering some info about the countries around Singapore, with a mix of web links, books and Kindle books.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;General&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Lonely Planet: &lt;a href="http://www.amazon.co.uk/Lonely-Planet-Southeast-Asia-Shoestring/dp/B003RCJGRG/ref=dp_kinw_strp_1?ie=UTF8&amp;amp;m=A3TVV12T0I6NSM"&gt;South East Asia on a Shoestring&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.co.uk/gp/product/B003RCJGRG?ie=UTF8&amp;amp;tag=codiinlond-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=19450&amp;amp;creativeASIN=B003RCJGRG"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="41up4BBrZUL._SL160_" border="0" alt="41up4BBrZUL._SL160_" src="http://lh5.ggpht.com/_QNxJ6n10eEU/TUXYhhjlpLI/AAAAAAAAAMk/4v-3mbzjZBA/41up4BBrZUL._SL160_%5B3%5D.jpg?imgmax=800" width="124" height="164" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.southeastasia.org/index.php/articles/detail/if-i-had-2-weeks-in-southeast-asia-id2/"&gt;southeastasia.org&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Singapore&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Singapore &lt;a href="http://journeyplanner.smrt.com.sg/System/Default.aspx"&gt;Journey Planner&lt;/a&gt; (SMRT)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Taiwan&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Lonely Planet: &lt;a href="http://www.amazon.co.uk/Lonely-Planet-Taiwan-Country-Guide/dp/B00439GMTW/ref=sr_1_1?ie=UTF8&amp;amp;qid=1295817882&amp;amp;sr=1-1"&gt;Taiwan, ebook Edition&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.co.uk/gp/product/B00439GMTW?ie=UTF8&amp;amp;tag=codiinlond-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=19450&amp;amp;creativeASIN=B00439GMTW"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="31HuVLbb7VL._SL160_" border="0" alt="31HuVLbb7VL._SL160_" src="http://lh5.ggpht.com/_QNxJ6n10eEU/TUXYh_sEpJI/AAAAAAAAAMo/Q6SUwfYg8BE/31HuVLbb7VL._SL160_%5B3%5D.jpg?imgmax=800" width="108" height="164" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.co.uk/gp/product/9812822658/ref=ord_cart_shr?ie=UTF8&amp;amp;m=A3P5ROKL5A1OLE"&gt;Taipei Insight City Guide&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.co.uk/gp/product/9812822658?ie=UTF8&amp;amp;tag=codiinlond-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=19450&amp;amp;creativeASIN=9812822658"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="51CMb6F2X1L._SL160_" border="0" alt="51CMb6F2X1L._SL160_" src="http://lh6.ggpht.com/_QNxJ6n10eEU/TUXWr73ByVI/AAAAAAAAAMs/4tOnnF4v-6I/51CMb6F2X1L._SL160_%5B3%5D.jpg?imgmax=800" width="112" height="164" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Malaysia&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Timeout &lt;a href="http://www.timeoutkl.com/"&gt;Kuala Lumpur&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Diving Spots&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Sipadan: &lt;a href="http://www.dive-the-world.com/diving-sites-malaysia-sipadan-island.php?gclid=CIKg_smH0aYCFYMTfAod81fvMw"&gt;Dive the World.com&lt;/a&gt;, &lt;a href="http://www.sipadandivingvacation.com/scuba-diving-sipadan-island.aspx?gclid=CPu615GF0aYCFYVjfAoduQj1Mw"&gt;sipadanvacations.com&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-3422579499082580079?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/3422579499082580079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=3422579499082580079' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3422579499082580079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3422579499082580079'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/01/preparing-trip-to-south-east-asia.html' title='Preparing a trip to South East Asia…'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_QNxJ6n10eEU/TUXYhhjlpLI/AAAAAAAAAMk/4v-3mbzjZBA/s72-c/41up4BBrZUL._SL160_%5B3%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-4602445648391348204</id><published>2011-01-18T21:31:00.001Z</published><updated>2011-01-23T21:14:42.379Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Listening To...'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Currently Listening to…</title><content type='html'>&lt;ul&gt;   &lt;li&gt;C9 Going Deep: &lt;a href="http://channel9.msdn.com/Shows/Going+Deep/E2E-Herb-Sutter-and-Erik-Meijer-Perspectives-on-C"&gt;Herb Sutter and Erik Meijer - Perspectives on C++&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;C9 Lectures: &lt;a href="http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-10-of-10"&gt;Stephan T. Lavavej - Type Traits in STL&lt;/a&gt;&amp;#160; &lt;/li&gt;    &lt;li&gt;C9 Lectures: &lt;a href="http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-9-of-n"&gt;Stephan T. Lavavej – RValue References in STL&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;.NET Rocks: &lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=630"&gt;DotNetRocks and JavaPosse Together at CodeMash&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Hanselminutes: &lt;a href="http://www.hanselminutes.com/default.aspx?showID=267"&gt;Executable Specifications with Gojko Adzic, Jonas Bandi and Aslak Hellesoy&lt;/a&gt;.&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-4602445648391348204?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/4602445648391348204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=4602445648391348204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/4602445648391348204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/4602445648391348204'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/01/currently-listening-to.html' title='Currently Listening to…'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-5120388473298061716</id><published>2011-01-10T07:17:00.001Z</published><updated>2011-01-10T07:17:35.992Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7'/><title type='text'>How to re-build your PC in less than 2 hours</title><content type='html'>&lt;h5&gt;&amp;#160;&lt;/h5&gt;  &lt;p&gt;&lt;b&gt;Pre-requisites:&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Your data is on D:, the OS on C: &lt;/li&gt;    &lt;li&gt;Your backup is done (nothing to do because you have an automatic full C+D-drive incremental back-up scheduled to run every day ) &lt;/li&gt;    &lt;li&gt;Your CD case with all legally acquired original CDs for software and drivers &lt;/li&gt;    &lt;li&gt;Access to the spreadsheet where you carefully store all serials for the above. &lt;/li&gt; &lt;/ul&gt; &lt;b&gt;Go: &lt;/b&gt;  &lt;ol&gt;   &lt;li&gt;Boot from DVD &lt;/li&gt;    &lt;li&gt;Format C:. &lt;/li&gt;    &lt;li&gt;Click Next, OK, next, Ok, I agree, OK, Next, London GMT &lt;/li&gt;    &lt;li&gt;Install your favourite software. For me it is: &lt;/li&gt;    &lt;ol&gt;     &lt;li&gt;Microsoft Security Essentials&lt;/li&gt;      &lt;li&gt;Slysoft Virtual Clone Drive&lt;/li&gt;      &lt;li&gt;Office &lt;/li&gt;      &lt;li&gt;Chrome, Firefox &lt;/li&gt;      &lt;li&gt;Set-up backup with Mozy&lt;/li&gt;   &lt;/ol&gt;    &lt;li&gt;Check the time: if it took you more than 2 hours, start all over again. &lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-5120388473298061716?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/5120388473298061716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=5120388473298061716' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5120388473298061716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5120388473298061716'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2011/01/how-to-re-build-your-pc-in-less-than-2.html' title='How to re-build your PC in less than 2 hours'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-7845839173052168784</id><published>2010-12-31T12:04:00.001Z</published><updated>2011-02-13T20:46:00.542Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ipad'/><title type='text'>The Mystery of Safari To Go: why is it so bad?</title><content type='html'>&lt;p&gt;A lot of &lt;a href="http://www.codinginlondon.com/2010/08/best-iphone-apps.html" target="_blank"&gt;applications&lt;/a&gt; make the IPad shine: they’re fast, responsive, elegant and take full advantage of the touch screen: &lt;strong&gt;Flipboard&lt;/strong&gt;, &lt;strong&gt;Ocado, Twitter &lt;/strong&gt;and most magazines (&lt;strong&gt;Wired&lt;/strong&gt;, &lt;strong&gt;Economist&lt;/strong&gt;, &lt;strong&gt;New York Times&lt;/strong&gt;, …). Swiping is smooth, the whole screen is used. &lt;/p&gt;  &lt;p&gt;And then you have things like &lt;strong&gt;BBC IPlayer&lt;/strong&gt;, &lt;strong&gt;Amazon Touch Shopping&lt;/strong&gt; or &lt;strong&gt;Safari To Go&lt;/strong&gt; that in terms of user interface are plain rubbish.&lt;/p&gt;  &lt;p&gt;Take &lt;strong&gt;Safari To Go&lt;/strong&gt;: I was expecting to be able to easily flick through my collection of Safari books stored offline, it was the reason why I bought the IPad in the first place. Well it turns out &lt;strong&gt;you can’t even swipe the pages!!!&lt;/strong&gt; You have to press left/right arrow buttons to navigate. It’s full of strange rounded dialogs that waste space. It’s very buggy. The table of contents appears in an &lt;strong&gt;annoying modal dialog&lt;/strong&gt; right in the middle of the screen, the table hierarchy is &lt;strong&gt;flatten&lt;/strong&gt; and &lt;strong&gt;slow&lt;/strong&gt; to scroll down… I actually find the web version of Safari Online Books to be much more usable than the IPad app, even if the web version does not support offline storage.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_QNxJ6n10eEU/TSG3U2HDKCI/AAAAAAAAAL0/RZeF9sh3bhM/s1600-h/SafariToGo2%5B5%5D.jpg" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Flat modal table of content that&amp;#39;s slow to scroll" border="0" alt="Flat modal table of content that&amp;#39;s slow to scroll" src="http://lh6.ggpht.com/_QNxJ6n10eEU/TSG3DKbcNLI/AAAAAAAAAL8/kKP23aXIa7Q/SafariToGo2_thumb%5B1%5D.jpg?imgmax=800" width="309" height="414" /&gt;&lt;/a&gt;&lt;a href="http://lh6.ggpht.com/_QNxJ6n10eEU/TSG3WMqsZsI/AAAAAAAAAMA/oJUPoPQAfR4/s1600-h/SafariToGo%5B6%5D.jpg" target="_blank"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Safari To Go... What&amp;#39;s going on here???" border="0" alt="WTF???" src="http://lh3.ggpht.com/_QNxJ6n10eEU/TSGtUkyPvEI/AAAAAAAAAMI/Gqin99yUeTk/SafariToGo_thumb%5B2%5D.jpg?imgmax=800" width="310" height="415" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Amazon Touch Shopping&lt;/strong&gt; is not as buggy but you will find similar clunky rounded dialogs, wasted space, slow scrolling plus some very annoying sounds that acknowledge every user action.&lt;/p&gt;  &lt;p&gt;Although it’s fantastic to be able to watch BBC programs on the IPad for the price of a TV license, the &lt;strong&gt;BBC IPlayer&lt;/strong&gt; app suffers from the same sort of web-like sluggishness. &lt;/p&gt;  &lt;p&gt;What’s frustrating is that we’re not talking about cheap farting apps here: Safari Books Online, BBC IPlayer and Amazon are all &lt;strong&gt;extremely useful&lt;/strong&gt; platforms supported by companies that have a habit of being innovative. I guess it’s just poor technological choices. I don’t know how they’re designed but I suspect that all 3 apps are actually web browsers running javascript… At least that’s what they feel like.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: (13/02/2011)&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;I read that OReilly &lt;a href="http://blog.safaribooksonline.com/2010/11/24/ipad-app-safari-to-go-update-november-24-2010/"&gt;removed Safari To Go from the app store&lt;/a&gt; on 24/11/2011, 3 weeks after it introduced it. They’re currently working on a new version (yeah!).&lt;/li&gt;    &lt;li&gt;There is now a proper &lt;strong&gt;BBC IPlayer&lt;/strong&gt; (released 10/02/2011) designed for the IPad from the ground up. It’s much much much nicer than the previous one.&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-7845839173052168784?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/7845839173052168784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=7845839173052168784' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7845839173052168784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7845839173052168784'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/12/mistery-of-safari-to-go.html' title='The Mystery of Safari To Go: why is it so bad?'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_QNxJ6n10eEU/TSG3DKbcNLI/AAAAAAAAAL8/kKP23aXIa7Q/s72-c/SafariToGo2_thumb%5B1%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-1238790699530381355</id><published>2010-11-02T21:48:00.000Z</published><updated>2010-11-16T22:26:08.632Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Listening To...'/><title type='text'>Currently Listening to…</title><content type='html'>&lt;ul&gt;   &lt;li&gt;Mark Russinovich: &lt;a href="http://videoaz.microsoftpdc.com/vod/downloads/CD01_High.wmv" target="_blank"&gt;Mysteries of Windows Memory Management Revealed&lt;/a&gt; (PDC10) &lt;/li&gt;    &lt;li&gt;Mads Torgersen: &lt;a href="http://channel9.msdn.com/Shows/Going+Deep/Mads-Torgersen-Inside-C-Async" target="_blank"&gt;Inside C# Async&lt;/a&gt; (Channel 9 Going Deep) &lt;/li&gt;    &lt;li&gt;Anders Hejlsberg: &lt;a href="http://player.microsoftpdc.com/session" target="_blank"&gt;The Future of C# and Visual Basic&lt;/a&gt; (PDC10) &lt;/li&gt;    &lt;li&gt;IPad Today 17: &lt;a href="http://www.twit.tv/ipt17" target="_blank"&gt;Radioliffic Apps, Mute Button Woes, iPad Cat Stands, Fruit Ninjas!&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Net@Night 174: &lt;a href="http://www.twit.tv/natn174" target="_blank"&gt;Instagram&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Roy Osherove: &lt;a href="http://www.typemock.com/webinar" target="_blank"&gt;Unit-Testing C++ with Isolator++ Webinar&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-1238790699530381355?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/1238790699530381355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=1238790699530381355' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1238790699530381355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1238790699530381355'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/11/currently-listening-to.html' title='Currently Listening to…'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-668812905520047798</id><published>2010-10-28T21:46:00.001+01:00</published><updated>2010-10-29T07:58:26.611+01:00</updated><title type='text'>Watching PDC10…</title><content type='html'>&lt;a href="http://lh6.ggpht.com/_QNxJ6n10eEU/TMnhCu9ysII/AAAAAAAAAK0/gBhQEH8t-Hk/s1600-h/Untitled%5B5%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="PDC10 Player" border="0" alt="PDC10 Player" src="http://lh5.ggpht.com/_QNxJ6n10eEU/TMnhDPZTIUI/AAAAAAAAAK4/VSYhTINRJzo/Untitled_thumb%5B1%5D.jpg?imgmax=800" width="465" height="317" /&gt;&lt;/a&gt;   &lt;p&gt;I’m&amp;#160; impressed with the live &lt;a href="http://player.microsoftpdc.com/session" target="_blank"&gt;streaming video&lt;/a&gt; system that Microsoft set-up for the PDC. &lt;/p&gt;  &lt;p&gt;You can watch live or past sessions. I’m watching the keynote right now that took place just a few hours ago.&lt;/p&gt;  &lt;p&gt;The player lets you switch between slide view and stage view. &lt;/p&gt;  &lt;p&gt;I wish they did that for the previous TechEd events… Too bad the Ipad doesn’t do Silverlight.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: when the US sleeps (now 07:54 BST), quality switches to HD, see below:&lt;/p&gt; &lt;a href="http://lh3.ggpht.com/_QNxJ6n10eEU/TMpwj-QJKII/AAAAAAAAALA/uAR7c3ogW7E/s1600-h/HD%5B5%5D.jpg" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="HD" border="0" alt="HD" src="http://lh6.ggpht.com/_QNxJ6n10eEU/TMpwkaJKdtI/AAAAAAAAALE/VuUjuKcvTHE/HD_thumb%5B1%5D.jpg?imgmax=800" width="476" height="323" /&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-668812905520047798?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/668812905520047798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=668812905520047798' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/668812905520047798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/668812905520047798'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/10/watching-pdc10.html' title='Watching PDC10…'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_QNxJ6n10eEU/TMnhDPZTIUI/AAAAAAAAAK4/VSYhTINRJzo/s72-c/Untitled_thumb%5B1%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-7133933536310733382</id><published>2010-10-24T21:58:00.000+01:00</published><updated>2010-10-25T12:51:47.481+01:00</updated><title type='text'>Notes from DDD8a</title><content type='html'>&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Microsoft Campus in Reading" border="0" alt="Microsoft Campus in Reading" src="http://lh3.ggpht.com/_QNxJ6n10eEU/TMSUkcElEZI/AAAAAAAAAKs/pkoJd9qSmLA/Microsoft%20Campus%20in%20Reading%5B2%5D.jpg?imgmax=800" width="604" height="398" /&gt;   &lt;p&gt;The &lt;a href="http://developerdeveloperdeveloper.com/ddd8a/" target="_blank"&gt;DeveloperDeveloperDeveloper&lt;/a&gt; event at the Microsoft offices in Reading was split in two tracks of simultaneous &lt;a href="http://developerdeveloperdeveloper.com/ddd8a/Schedule.aspx" target="_blank"&gt;sessions&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Notes from some of the sessions:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;It’s Time to Look at Entity Framework&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Speaker: &lt;strong&gt;Julie Lerman&lt;/strong&gt; (twitter &lt;a href="http://twitter.com/#!/julielerman" target="_blank"&gt;@julielerman&lt;/a&gt;) &lt;a href="http://www.thedatafarm.com"&gt;thedatafarm.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The Entity Framework was initially designed to reverse engineer existing databases but you can now also create them from scratch.&lt;/p&gt;  &lt;p&gt;The designer generates a DDL. It doesn’t actually create the DB, it creates a script. Then you give the script to a DBA (Not sure how you specify paths for database and log files ?).&lt;/p&gt;  &lt;p&gt;Support for POCO classes: your classes don’t have to inherit from Entity Framework classes, you can keep your model totally separate from EF and still work with the designer. The way you do this is through &lt;strong&gt;T4 templates&lt;/strong&gt;, some of them you can download from Visual Studio Gallery.&lt;/p&gt;  &lt;p&gt;If you tweak the T4 template you can totally abstract the EF layer (ObjectSet, etc…). In other words your code can interact with EF only through interfaces, which makes &lt;strong&gt;unit-testing&lt;/strong&gt; possible.&lt;/p&gt;  &lt;p&gt;TODO:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;check out T4, CodeFirst &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Packaging in the .NET World&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Speaker: &lt;strong&gt;Seb Lambla&lt;/strong&gt; (twitter &lt;a href="http://twitter.com/#!/serialseb" target="_blank"&gt;@serialseb&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;Seb demoed&lt;strong&gt; OpenWrap&lt;/strong&gt; &lt;a href="http://www.openwrap.org"&gt;www.openwrap.org&lt;/a&gt; (the site is going live live in a few days), a packaging tool that you use to inject dependencies into your build. The dependencies must be available as “wraps” for this to be possible. You inject the dependencies with a simple command-line tool.&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;The openwrap commands can also be used from within an msbuild file.&lt;/p&gt;  &lt;p&gt;There is another open source tool called Nupack (maintained by Microsoft) released on codeplex. &lt;/p&gt;  &lt;p&gt;TODO:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Check out Scott Hanselman’s blog about Nupack &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Is NoSQL the Future of Data Storage?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Speaker: &lt;strong&gt;Gary Short&lt;/strong&gt; (twitter&lt;strong&gt;&amp;#160;&lt;/strong&gt;&lt;a href="http://twitter.com/#!/garyshort" target="_blank"&gt;@garyshort&lt;/a&gt;)&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Term introduced by a programmer from LastFM. &lt;/li&gt;    &lt;li&gt;NoSQL      &lt;ul&gt;       &lt;li&gt;often does not implement ACID &lt;/li&gt;        &lt;li&gt;avoids joins &lt;/li&gt;        &lt;li&gt;no fixed schema &lt;/li&gt;        &lt;li&gt;scales horizontally (adding more machines) &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Types of NoSQL DBs      &lt;ul&gt;       &lt;li&gt;document Store &lt;/li&gt;        &lt;li&gt;graph storage: nodes and edges &lt;/li&gt;        &lt;li&gt;key/value stores: on disk/on RAM &lt;/li&gt;        &lt;li&gt;“eventually consistent” &lt;/li&gt;        &lt;li&gt;object DBs. You provide your own indexing rules. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Good for:      &lt;ul&gt;       &lt;li&gt;geographic regions, large quantities of data, game server sharding (what’s sharding?) &lt;/li&gt;        &lt;li&gt;often written, rarely read &amp;gt; Key/Value &lt;/li&gt;        &lt;li&gt;binary data &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Example: Twitter      &lt;ul&gt;       &lt;li&gt;they tried RDB &amp;gt; didn’t scale. &lt;/li&gt;        &lt;li&gt;built FlockDB          &lt;ul&gt;           &lt;li&gt;not optimized for transversal, because not needed. &lt;/li&gt;            &lt;li&gt;optimized for adjacency lists: graph stored as set of edges &lt;/li&gt;            &lt;li&gt;idempotency: useful for computing set &lt;strong&gt;unions&lt;/strong&gt; and &lt;strong&gt;intersections&lt;/strong&gt;. &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Lessons learned: use aggressive timeouts &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;TODO:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;check story of Twitter (DB angle) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Modern C#: this is not your grand-daddy’s language&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Speaker: &lt;strong&gt;Jon Skeet&lt;/strong&gt; and his pony. (twitter: &lt;a href="http://twitter.com/#!/jonskeet" target="_blank"&gt;@jonskeet&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;Inspiring talk about the evolution of the language features of C#.&lt;/p&gt;  &lt;p&gt;Jon illustrated how powerful C# has got by writing a MaxBy() implementation in various versions of C#. MaxBy() should return the element of a collection containing the maximum value of a specified field. It should work with any field and any collection.&lt;/p&gt;  &lt;p&gt;He wrote the solution in C# 4 use generics, lambdas, method extensions and inferred types.&lt;/p&gt;  &lt;p&gt;In C# 1.0, he started with a simple for loop: this lead to code specific to the class being compared. To make the code a bit more generic he used a delegate and some downcasting from System.Object to the type compared: it worked but was somewhat verbose and not as type safe as the C# 4 version.&lt;/p&gt;  &lt;p&gt;Jon’s quotes:&lt;/p&gt;  &lt;p&gt;“Knowing how things work under the hood is important. However you need to be able to shift gears so that you think at a higher level when you need to”&lt;/p&gt;  &lt;p&gt;“We need to be jolted out of the idea of what a language should look like.”&lt;/p&gt;  &lt;p&gt;“You can express yourself more clearly without having to write things you don’t need. What needs to be expressed is expressed only once.”&lt;/p&gt;  &lt;p&gt;“Learning F# helps you understand the new features of C# 4.” &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Things you should know about SQL as a developer&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Speaker:&lt;strong&gt; Simon Sabin &lt;/strong&gt;(twitter:&lt;strong&gt;&amp;#160;&lt;/strong&gt;&lt;a href="http://twitter.com/#!/simon_sabin" target="_blank"&gt;@simon_sabin&lt;/a&gt;)&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Do not truncate the transaction log &amp;gt; you loose point-in-time recovery &lt;/li&gt;    &lt;li&gt;Re-indexing      &lt;ul&gt;       &lt;li&gt;You may just need to update the statistics. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Shrinking      &lt;ul&gt;       &lt;li&gt;usually bad, files grow for a reason &lt;/li&gt;        &lt;li&gt;shrinking makes sense after a big import job only &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Clustered indexes on dates      &lt;ul&gt;       &lt;li&gt;make them small and unique &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Types of joins      &lt;ul&gt;       &lt;li&gt;Loop: for small datasets &lt;/li&gt;        &lt;li&gt;Hash: large datasets &lt;/li&gt;        &lt;li&gt;Merge: requires sets to be ordered &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;user-defined functions      &lt;ul&gt;       &lt;li&gt;bad performance!          &lt;ul&gt;           &lt;li&gt;interpreted &lt;/li&gt;            &lt;li&gt;can’t use parallelism &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;demoed a padding operation done with UDF vs one done with a CLR function. The CLR one significantly faster. &lt;/li&gt;        &lt;li&gt;Prefer CLR functions over UDF. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;TODO:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Look into taking snapshots vs restoring from backup. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;More blog posts about the event:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://danny-t.co.uk/index.php/2010/10/24/ddd8a-review/" target="_blank"&gt;Danny-T.co.uk&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://ninjaferret.co.uk/blog/?p=204" target="_blank"&gt;The Ninja Ferret&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Slides&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/chrishardy/archive/2010/10/24/slides-from-my-wp7-iphone-and-android-talk-at-ddd8a.aspx" target="_blank"&gt;Chris Hardy’s WP7 talk&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-7133933536310733382?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/7133933536310733382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=7133933536310733382' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7133933536310733382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7133933536310733382'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/10/ddd8a-notes.html' title='Notes from DDD8a'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_QNxJ6n10eEU/TMSUkcElEZI/AAAAAAAAAKs/pkoJd9qSmLA/s72-c/Microsoft%20Campus%20in%20Reading%5B2%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-1553930874018253711</id><published>2010-10-20T21:56:00.000+01:00</published><updated>2010-10-20T21:57:11.568+01:00</updated><title type='text'>Ipad/Iphone Apps List</title><content type='html'>&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;IPad&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Ocado&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt; &lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="IPad 003" border="0" alt="IPad 003" src="http://lh3.ggpht.com/_QNxJ6n10eEU/TJkcn6XiwEI/AAAAAAAAAJ4/UMXE-Nkuwvk/IPad%20003_thumb%5B1%5D.png?imgmax=800" width="536" height="710" /&gt;&amp;#160; &lt;p&gt;Very well suited to the Ipad, here is a typical use case:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Book your delivery slot (slots for the following evening are usually free). &lt;/li&gt;    &lt;li&gt;Add all items from the previous order &lt;/li&gt;    &lt;li&gt;Display basket and go to your kitchen &lt;/li&gt;    &lt;li&gt;Remove unwanted items (check your fridge and cupboards) &lt;/li&gt;    &lt;li&gt;Add items you know are missing &lt;/li&gt;    &lt;li&gt;Go back to your sofa and browse your favourites for things you might have forgotten &lt;/li&gt;    &lt;li&gt;Checkout: type in the voucher (Ocado often emails 15% or 20% reduction vouchers) &lt;/li&gt;    &lt;li&gt;Type in the 4-digit pin to authorise the transaction, and that’s it. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Reeder&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Could do with some photos really" border="0" alt="Could do with some photos really" src="http://lh6.ggpht.com/_QNxJ6n10eEU/TI_QAEIe7OI/AAAAAAAAAJo/5O5Ton-LvAU/IPad%20004_thumb%5B1%5D.png?imgmax=800" width="571" height="431" /&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Quickly syncs with &lt;strong&gt;Google Reader&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Elegantly displays groups of feeds &lt;/li&gt;    &lt;li&gt;How I use it: I star articles I want to read during the week and take the time to read them at the week-end. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;No pictures&lt;/strong&gt;, no colors :-( &lt;/li&gt;    &lt;li&gt;Too bad you &lt;strong&gt;can’t subscribe to a new RSS feed&lt;/strong&gt; from within Reeder. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&amp;#160;&lt;strong&gt;Pulse&lt;/strong&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_QNxJ6n10eEU/TL9Xo4XcmwI/AAAAAAAAAKg/PqYZqfYm0k4/s1600-h/IPad%20008%5B10%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="IPad 008" border="0" alt="IPad 008" src="http://lh6.ggpht.com/_QNxJ6n10eEU/TL9XplyYNRI/AAAAAAAAAKk/f8rts_gjfzU/IPad%20008_thumb%5B3%5D.png?imgmax=800" width="587" height="459" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Unlike Reeder, this one will show the pictures included in the RSS feeds. &lt;/p&gt;  &lt;p&gt;You can create tabs to arrange your feeds. Inside each tab you can add feeds imported from Google Reader. Note you can only &lt;strong&gt;import&lt;/strong&gt; from Google Reader, it does not &lt;strong&gt;sync&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Pleasant to look at but from a functional point of view, Reeder is still better because it syncs with any change you make to your subscriptions in Google Reader.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;DropBox&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There is a small set of files I always want to have with me. I use DropBox to keep them in sync. I installed it on my PC, 2 laptops, an Iphone and an Ipad. Changes made on any device are immediately propagated to the others if they’re on. &lt;/p&gt;  &lt;p&gt;The Windows version gives a &lt;strong&gt;version history&lt;/strong&gt; of each file.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;IPhone&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;2Do Lite&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Clever little app for TODOs. You can associate a TODO with a geographical location. Click the &lt;strong&gt;nearby&lt;/strong&gt; button to filter TODOs by current location. This is good for the situations where you say “Next time I go to Boots, I should get some shampoo”. Elegant, fast, good-looking.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;TimeOut London&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Iphone 056" border="0" alt="Iphone 056" src="http://lh5.ggpht.com/_QNxJ6n10eEU/TI_QBurr5-I/AAAAAAAAAJs/vPksk5Nt0tI/Iphone%20056%5B4%5D.png?imgmax=800" width="324" height="484" /&gt; Search films by location, by date, by cinema. &lt;/p&gt;  &lt;p&gt;I use it to look-up the films available in a short list of of favorite cinemas.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;FourSquare&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="IPhone 061" border="0" alt="IPhone 061" src="http://lh6.ggpht.com/_QNxJ6n10eEU/TJuzNB6KkEI/AAAAAAAAAKA/qBEC_7T1GdQ/IPhone%20061%5B2%5D.png?imgmax=800" width="324" height="484" /&gt; This is what Google Latitude should have been. Check-in to pre-defined places (restaurants, bars, companies, hotels, train station platforms, forests…) to tell where you are or add tips about a particular place. This app would be great if only more people used it: the nearby tips tend to age a bit.&lt;/p&gt;  &lt;p&gt;It’s all I wanted to do with Google maps: see a place I like, make a note of it to come back later or go to a place and leave a note about it. I used to do it with Google maps, it’s much more clever with FourSquare.&lt;/p&gt;  &lt;p&gt;A friend talks to you about this new restaurant he tried: look-up the name, add it as todo and attach a tip “Remi recommended the Savoy bar because it was recently refurbished and just re-opened”&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="IPhone 062" border="0" alt="IPhone 062" src="http://lh5.ggpht.com/_QNxJ6n10eEU/TJuzOyiy5zI/AAAAAAAAAKE/21cgbSKy674/IPhone%20062%5B2%5D.png?imgmax=800" width="324" height="484" /&gt; &lt;/p&gt;  &lt;p&gt;A number of little apps are available to make it easier to use FourSquare, in particular to automate the check-ins: &lt;strong&gt;CheckMate&lt;/strong&gt; and &lt;strong&gt;FourMinder&lt;/strong&gt;.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;TimeOut London&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Iphone 056" border="0" alt="Iphone 056" src="http://lh5.ggpht.com/_QNxJ6n10eEU/TI_QBurr5-I/AAAAAAAAAJs/vPksk5Nt0tI/Iphone%20056%5B4%5D.png?imgmax=800" width="324" height="484" /&gt; Search films by location, by date, by cinema. &lt;/p&gt;  &lt;p&gt;I use it to look-up the films available within my short list of favorite London cinemas.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;DropBox&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The Iphone version allows you to cache some of the files for offline view (by making them favorites). You can’t view the version history though.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-1553930874018253711?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/1553930874018253711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=1553930874018253711' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1553930874018253711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1553930874018253711'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/08/best-iphone-apps.html' title='Ipad/Iphone Apps List'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_QNxJ6n10eEU/TJkcn6XiwEI/AAAAAAAAAJ4/UMXE-Nkuwvk/s72-c/IPad%20003_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-5190687624507049080</id><published>2010-10-01T21:57:00.001+01:00</published><updated>2010-10-01T22:01:08.494+01:00</updated><title type='text'>UK TechDays Special Event with Steve Ballmer</title><content type='html'>&lt;p&gt;I’ll go hear about Windows Phone 7 and Azure on Tuesday. It will happen at the ICC in the Docklands (Royal Victoria Dock). &lt;/p&gt;  &lt;p&gt;It seems it’s still possible to &lt;a href="http://blogs.msdn.com/b/ukmsdn/archive/2010/09/06/uk-techdays-special-event-keynote-speech-by-steve-ballmer.aspx" target="_blank"&gt;register&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/b/ukmsdn/archive/2010/09/06/uk-techdays-special-event-keynote-speech-by-steve-ballmer.aspx" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_QNxJ6n10eEU/TKZLS_frWwI/AAAAAAAAAKY/008OGW5qxvk/image%5B3%5D.png?imgmax=800" width="631" height="432" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-5190687624507049080?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/5190687624507049080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=5190687624507049080' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5190687624507049080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5190687624507049080'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/10/techdays-uk-special-event-with-steve.html' title='UK TechDays Special Event with Steve Ballmer'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_QNxJ6n10eEU/TKZLS_frWwI/AAAAAAAAAKY/008OGW5qxvk/s72-c/image%5B3%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-5478035577999196717</id><published>2010-07-03T15:02:00.001+01:00</published><updated>2010-08-17T21:12:52.380+01:00</updated><title type='text'>Notes about Snapshot Isolation</title><content type='html'>&lt;p&gt;MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/tcbchxcb(VS.80).aspx" target="_blank"&gt;Using Snapshot Isolation&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The SQL92 standard defines four isolation levels, two of them being READ_COMMITTED and REPEATABLE_READ.&lt;/p&gt;  &lt;p&gt;READ_COMMITTED prevents the current transaction from seeing data changed by &lt;strong&gt;uncommitted&lt;/strong&gt; transactions.&lt;/p&gt;  &lt;p&gt;REPEATABLE_READ guarantees that the &lt;strong&gt;data read&lt;/strong&gt; since the start of the current transaction &lt;strong&gt;will not be changed&lt;/strong&gt; by other transactions. This way the state of the database remains the same from the point of view of the current transaction. &lt;/p&gt;  &lt;p&gt;By default, SQL Server uses &lt;strong&gt;locks&lt;/strong&gt; to implement READ_COMMITTED. That means any query attempting to read a row that is being changed by a transaction &lt;strong&gt;will block&lt;/strong&gt;. Not great really. Oracle uses rollback segments to achieve the same thing and queries are never blocked by writes!&lt;/p&gt;  &lt;p&gt;Snapshot Isolation (from SQL Server 2005 onwards) is another way to implement REPEATABLE_READ and READ_COMMITTED without using locks. Instead row versions are saved in tempdb every time an insert or update takes place.&lt;/p&gt;  &lt;p&gt;To allow all future sessions to use snapshot isolation:&lt;/p&gt;  &lt;pre&gt;ALTER DATABASE MyDatabase&lt;br /&gt;SET ALLOW_SNAPSHOT_ISOLATION ON&lt;br /&gt;&lt;/pre&gt;

&lt;pre&gt;ALTER DATABASE MyDatabase&lt;br /&gt;SET READ_COMMITTED_SNAPSHOT ON&lt;/pre&gt;

&lt;br /&gt;

&lt;p&gt;To enable REPEATABLE_READ in snapshot mode for the current connection: 
  &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;font face="Courier New"&gt;SET TRANSACTION ISOLATION LEVEL SNAPSHOT&lt;/font&gt; 

  &lt;br /&gt;&lt;strong&gt;Articles&lt;/strong&gt; 

  &lt;br /&gt;

  &lt;br /&gt;MSDN: 

  &lt;br /&gt;&lt;a href="http://www.sql-server-performance.com/articles/dba/isolation_levels_2005_p3.aspx" target="_blank"&gt;Isolation levels in SQL Server 2005&lt;/a&gt; 

  &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms189050.aspx" target="_blank"&gt;Understanding Row Versioning-Based Isolation Levels&lt;/a&gt; 

  &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms188277.aspx" target="_blank"&gt;Cost of Row Versioning&lt;/a&gt; 

  &lt;br /&gt;Stack Overflow: 

  &lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/1363444/why-is-readcommittedsnapshot-not-on-by-default" target="_blank"&gt;Why is READ_COMMITTED_SNAPSHOT not on by default?&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-5478035577999196717?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/5478035577999196717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=5478035577999196717' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5478035577999196717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5478035577999196717'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/07/notes-about-snapshot-isolation.html' title='Notes about Snapshot Isolation'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-3528746838278004170</id><published>2010-06-28T08:46:00.001+01:00</published><updated>2010-09-12T11:30:04.590+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ipad'/><title type='text'>A week-end in the South of France using the Ipad</title><content type='html'>&lt;img style="border-right-width: 0px; margin: 0px auto; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" class="wlDisabledImage" title="Borrie" border="0" alt="Borrie" src="http://lh4.ggpht.com/_QNxJ6n10eEU/TDJKc-EqEvI/AAAAAAAAAJU/I3lcbLNDf_8/Gordes%20007%5B12%5D.jpg?imgmax=800" width="644" height="484" /&gt;   &lt;p&gt;I enjoyed a long and sunny week-end in the south of France at a friend’s place (Gordes, Provence). I spent many hours near the swimming pool toying with the Ipad (the first Apple device I’ve ever bought).&lt;/p&gt;  &lt;p&gt;I like the sexiness of the hardware but plenty of little things keep annoying me.&lt;/p&gt;  &lt;p&gt;Intended home usage:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;read my RSS feeds &lt;/li&gt;    &lt;li&gt;browse Oreilly Safari &lt;/li&gt;    &lt;li&gt;read kindle books &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I’m still looking for:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A better browser, because Safari lacks some really obvious features such as tabs or page text search.      &lt;ul&gt;       &lt;li&gt;&lt;strong&gt;A1 Perfect browser&lt;/strong&gt;: would be great if it didn’t reload the last page every time you switch back to it. &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;ICab Mobile&lt;/strong&gt;           &lt;ul&gt;           &lt;li&gt;To be tried &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;a RSS Feed reader that compares to Feedly. I use Feedly on the desktop but it does not exist on the Ipad yet so I looked for alternatives:      &lt;ul&gt;       &lt;li&gt;&lt;strong&gt;Feedler: &lt;/strong&gt;          &lt;ul&gt;           &lt;li&gt;the experience is similar to Google Reader, hence functional but a bit boring. &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Reeder&lt;/strong&gt;: could not install &lt;/li&gt;        &lt;li&gt;&lt;strong&gt;Early Edition&lt;/strong&gt;:           &lt;ul&gt;           &lt;li&gt;Visually pleasant although not as much as feedly &lt;/li&gt;            &lt;li&gt;Very slow to refresh &lt;/li&gt;            &lt;li&gt;imports feeds from Google Reader but does not sync automatically. &lt;/li&gt;            &lt;li&gt;No mark for later function &lt;/li&gt;            &lt;li&gt;Doesn’t remember what you read. &lt;/li&gt;            &lt;li&gt;Displays original posts with embedded browser instead of opening Safari (which a &lt;strong&gt;good &lt;/strong&gt;thing). &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Some random observations:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;You can’t see anything on the screen if you wear polarising sunglasses. :D Not a problem but it’s the first time I notice something like this on any device…. &lt;strong&gt;Update:&lt;/strong&gt; (12/09/2010) When using polarised RayBan sunglasses, the IPad screen becomes invisible if you hold it in portrait mode. In landscape mode it’s fine.&lt;/li&gt;    &lt;li&gt;The absence of notice means you have to play around to discover some features of the hardware/OS/virtual keyboard, that’s actually quite fun. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;The WIFI issue&lt;/strong&gt;       &lt;ul&gt;       &lt;li&gt;I observed that my Ipad loses the Wifi connection if the &lt;strong&gt;connection&lt;/strong&gt; is unused for more than 5 minutes (does not occur at 4 minutes). &lt;/li&gt;        &lt;li&gt;Router tweaks I tried with &lt;strong&gt;no success&lt;/strong&gt;:           &lt;ul&gt;           &lt;li&gt;Disabled security &lt;/li&gt;            &lt;li&gt;Changed the wireless channel &lt;/li&gt;            &lt;li&gt;Switched down to 802.11b. &lt;/li&gt;            &lt;li&gt;Used a static IP address &lt;/li&gt;            &lt;li&gt;Updated the firmware of my Belkin F5D8635v1 from 1.00.17 to 1.00.23 &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Apps reviews&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.wired.com/gadgetlab/2010/06/gallery-10-stellar-ipad-apps/all/1" target="_blank"&gt;Wired&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://www.padgadget.com/ipad-apps-tracker/?o=1&amp;amp;t=1&amp;amp;f=9" target="_blank"&gt;PadGadget&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: (07/08/2010)     &lt;br /&gt;Safari Books Online plans on releasing an &lt;a href="http://safaribooksonline.wordpress.com/?s=ipad" target="_blank"&gt;app&lt;/a&gt; for the Ipad this summer. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-3528746838278004170?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/3528746838278004170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=3528746838278004170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3528746838278004170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3528746838278004170'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/06/week-end-in-south-of-france-using-ipad.html' title='A week-end in the South of France using the Ipad'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_QNxJ6n10eEU/TDJKc-EqEvI/AAAAAAAAAJU/I3lcbLNDf_8/s72-c/Gordes%20007%5B12%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-332990775108541737</id><published>2010-06-20T10:09:00.000+01:00</published><updated>2010-06-22T20:48:09.664+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQL Server and Notifications</title><content type='html'>&lt;p&gt;Chaps from Microsoft gave us a presentation of &lt;a href="http://msdn.microsoft.com/en-us/library/ee391536.aspx" target="_blank"&gt;StreamInsight&lt;/a&gt; at work the other day.&lt;/p&gt;  &lt;p&gt;Following this I started digging around the whole SQL Server notification/event thing: how can an application be &lt;strong&gt;notified &lt;/strong&gt;of a data change instead of polling the database like a drowsy lobotomised lemming?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Service Broker&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Messaging infrastructure for SQL Server. To enable it on a database, right-click the database in SSMS, click &lt;strong&gt;Properties &amp;gt; Options &amp;gt; Broker Enabled&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms166043(v=SQL.90).aspx" target="_blank"&gt;Service Broker&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms171578(v=SQL.90).aspx" target="_blank"&gt;Servicer Broker Programming&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;T-SQL has a few &lt;a href="http://msdn.microsoft.com/en-us/library/ms171620(v=SQL.90).aspx" target="_blank"&gt;constructs&lt;/a&gt; dedicated to using the service broker.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Query Notifications&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Requires Service Broker to be installed on the current SQL Server instance and enabled for the current database.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms175110.aspx" target="_blank"&gt;Using query notifications&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/t9x04ed2.aspx" target="_blank"&gt;Query Notifications in SQL Server (ADO.NET)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;SqlDependency&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This is the class you use to implement Query Notifications in a .NET app. It is supposed to be used by server apps (ASP.NET for instance). The documentation warns it is not designed for client apps. It probably doesn’t scale too well.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldependency.aspx" target="_blank"&gt;SqlDependency class&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/62xk7953.aspx" target="_blank"&gt;Detecting Changes with SqlDependency (ADO.NET)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_QNxJ6n10eEU/TB3Tob380FI/AAAAAAAAAJI/SXs4FsAYe40/s1600-h/Initialising%20SqlDependency%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="SqlDependency wraps a lot of Service Broker-specific T-SQL code " border="0" alt="SqlDependency wraps a lot of Service Broker-specific T-SQL code " src="http://lh4.ggpht.com/_QNxJ6n10eEU/TB3TpJZKt2I/AAAAAAAAAJM/kbh4O5PdahI/Initialising%20SqlDependency_thumb%5B2%5D.jpg?imgmax=800" width="937" height="165" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Notification Services &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;SQL Server 2005 only, not 2008. This is a publish/subscribe messaging service.    &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms170337(SQL.90).aspx" target="_blank"&gt;Notification Services Tutorial&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms171332(v=SQL.90).aspx" target="_blank"&gt;What does Notification Services do?&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;StreamInsight&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-gb/library/ee391536.aspx" target="_blank"&gt;Big Diagram&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee378749.aspx" target="_blank"&gt;StreamInsight Installation&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/R2-complex-event.aspx#download" target="_blank"&gt;Download&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee362351.aspx" target="_blank"&gt;Deployment model&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee391434.aspx" target="_blank"&gt;Concepts&lt;/a&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Other Stuff…&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Change Data Capture / Change Tracking&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This is more for auditing purposes: allows you to easily query historical changes made to the data without having to write tons of error-prone code in triggers (as I saw being done on an Oracle database by a client I used to work for…)&lt;/p&gt;  &lt;p&gt;Data Capture and Change Tracking &lt;a href="http://msdn.microsoft.com/en-us/library/cc280519.aspx" target="_blank"&gt;compared&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;WAITFOR&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Can be used to delay a statement: block for 2 minutes before running a statement for instance or can be used to schedule a statement to run at a specified time.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms188253(v=SQL.90).aspx" target="_blank"&gt;Using WAITFOR&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms187331(SQL.90).aspx" target="_blank"&gt;WAITFOR (Transact-SQL)&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-332990775108541737?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/332990775108541737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=332990775108541737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/332990775108541737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/332990775108541737'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/06/sql-server-and-notifications.html' title='SQL Server and Notifications'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_QNxJ6n10eEU/TB3TpJZKt2I/AAAAAAAAAJM/kbh4O5PdahI/s72-c/Initialising%20SqlDependency_thumb%5B2%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-6365452352517308230</id><published>2010-05-16T09:09:00.001+01:00</published><updated>2010-05-26T20:16:05.306+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FOWADUBLIN10'/><category scheme='http://www.blogger.com/atom/ns#' term='fowa'/><title type='text'>FOWA Dublin 2010 – Notes</title><content type='html'>&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_QNxJ6n10eEU/S_l5Lst1kjI/AAAAAAAAAIw/aZuLIKytya8/s1600-h/Phone%20124%20%28640x480%29%20%28400x300%29%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="FOWA Dublin" border="0" alt="FOWA Dublin" align="right" src="http://lh5.ggpht.com/_QNxJ6n10eEU/S_l5Mf4S_zI/AAAAAAAAAI0/VEICnOv3cWA/Phone%20124%20%28640x480%29%20%28400x300%29_thumb%5B2%5D.jpg?imgmax=800" width="404" height="304" /&gt;&lt;/a&gt;Some notes scribbled down during the &lt;a href="http://futureofwebapps.com/dublin-2010/schedule/" target="_blank"&gt;talks&lt;/a&gt;. &lt;/p&gt;  &lt;h3&gt;Twitter and Geolocation &lt;/h3&gt;  &lt;p&gt;Raffi Krikorian (&lt;a href="http://twitter.com/raffi" target="_blank"&gt;twitter&lt;/a&gt;, &lt;a href="http://mehack.com/" target="_blank"&gt;blog&lt;/a&gt;)&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.yaketee.com/" target="_blank"&gt;Yaketee&lt;/a&gt;: very simple web app that automatically detects your location and allows you to create chat groups with people in the same location. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;What makes a place? &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;longitude, latitude. Sometimes this is a bit too precise. &lt;/li&gt;    &lt;li&gt;A polygon (area rather than exact location). According to Raffi defining locations with polygons is currently what Twitter does for named areas. &lt;/li&gt;    &lt;li&gt;Area name / town / country &lt;/li&gt;    &lt;li&gt;WOEID: Where on Earth Identifier, defined by &lt;a href="http://developer.yahoo.com/geo/geoplanet/guide/concepts.html" target="_blank"&gt;Yahoo&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;TwID (?) &lt;/li&gt;    &lt;li&gt;IP-based location &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.slideshare.net/rsarver/w3c-geolocation-api-making-websites-locationaware" target="_blank"&gt;w3c location&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;brokered location: redistributes location info to other apps. Example: Yahoo’s &lt;a href="http://fireeagle.yahoo.net/" target="_blank"&gt;fire eagle&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;location databases      &lt;ul&gt;       &lt;li&gt;Yahoo (WOE db) &lt;/li&gt;        &lt;li&gt;Twitter &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Cloud Computing: Innovation vs Commodity&lt;/h3&gt;  &lt;p&gt;Simon Wardley (&lt;a href="http://twitter.com/swardley" target="_blank"&gt;twitter&lt;/a&gt;, &lt;a href="http://blog.gardeviance.org/" target="_blank"&gt;blog&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;Simon based his talk on a graph showing the relationship between ubiquity and certainty (&lt;a href="http://www.slideshare.net/swardley/situation-normal-fowa-dublin" target="_blank"&gt;slides&lt;/a&gt;). It’s an asymptotic curve. On one end of the curve &lt;strong&gt;innovative&lt;/strong&gt; technologies have low ubiquity and low certainty. At the other end of the graph, &lt;strong&gt;commoditized&lt;/strong&gt; technologies have infinite certainty (no more change) and a capped ubiquity. &lt;/p&gt;  &lt;p&gt;How can a technology move from the innovation stage to the commodity stage and become a service? Four requirements: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;concept &lt;/li&gt;    &lt;li&gt;attitude (willingness to see IT as a commodity) &lt;/li&gt;    &lt;li&gt;suitability &lt;/li&gt;    &lt;li&gt;technology &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Hierarchy and componentisation: stable components act as building blocks and accelerate innovation.&lt;/p&gt;  &lt;p&gt;Any technical progress that makes something more efficient increases the demand for its use. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Risks associated with move from innovation to service&lt;/strong&gt;: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;highly disruptive transition, how do you manage the new supplier? &lt;/li&gt;    &lt;li&gt;outsourcing risks: lock-in, second sourcing… &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Myths around cloud computing&lt;/strong&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;You have a choice (actually you don’t). &lt;/li&gt;    &lt;li&gt;It will reduce IT spending. It doesn’t because you’ll end-up spending the same amount of money, you’ll simply do more stuff with it. &lt;/li&gt;    &lt;li&gt;Cloud is an innovation. It’s not, it’s a commodity. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Accessibility &lt;/h3&gt;  &lt;p&gt;Robin Christopherson (&lt;a href="http://twitter.com/USA2DAY" target="_blank"&gt;twitter&lt;/a&gt;, &lt;a href="http://www.abilitynet.org.uk/webteam#robin" target="_blank"&gt;blog&lt;/a&gt;)&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Flash is really bad for accessibility: nothing can be done with the keyboard. &lt;/li&gt;    &lt;li&gt;Internet Explorer has a function to bring up all links of a page inside a dialog. Not all browsers support that. &lt;/li&gt;    &lt;li&gt;Chrome not accessible. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Robin did his talk and demos without being able to see the screen. He used keyboard shortcuts and text-to-speech. When he scrolls a list of items the system enunciates the links at very high speed (much too fast for me to understand, but I guess if it’s the only way you can use a PC you must end up getting pretty good at it).&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Automated caption and automated timing&lt;/strong&gt;. Youtube makes it easier to produce videos with captions: you upload the video and the transcript. Youtube uses voice recognition to associate time markers with captions (so you don’t have to do it yourself). It &lt;a href="http://www.youtube.com/watch?v=3lMUIUgRD-A" target="_blank"&gt;sort of works&lt;/a&gt;, enough to be useful. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Internet TV&lt;/strong&gt;: &lt;a href="http://www.projectcanvas.info/index.cfm/accessibility/" target="_blank"&gt;projectcanvas.info&lt;/a&gt;: joint venture between the BBC, ITV, C4 and Five to build an internet TV platform with accessibility as a prime requirement. &lt;/li&gt;    &lt;li&gt;Avoid horizontal scrolling: &lt;strong&gt;Opera mini&lt;/strong&gt; can force single column browsing. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.siruna.com/our-technology-platform" target="_blank"&gt;Siruna&lt;/a&gt;: can crunch down a website for any mobile platform. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://textcaptcha.com/demo" target="_blank"&gt;Textcaptcha.com&lt;/a&gt;. Accessible &lt;strong&gt;CAPTCHAs&lt;/strong&gt;. The distorted pictures of random words are not usable by blind people! This site suggests an alternative using logic questions. They even provide a REST web service. &lt;/li&gt;    &lt;li&gt;Accessibility &lt;strong&gt;testing budget&lt;/strong&gt; encompasses usability testing. i.e. if you test an app for accessibility for the blind you will spot usability issues affecting everyone else. &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-6365452352517308230?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/6365452352517308230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=6365452352517308230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6365452352517308230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6365452352517308230'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/05/fowa-dublin-2010-notes.html' title='FOWA Dublin 2010 – Notes'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_QNxJ6n10eEU/S_l5Mf4S_zI/AAAAAAAAAI0/VEICnOv3cWA/s72-c/Phone%20124%20%28640x480%29%20%28400x300%29_thumb%5B2%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-7649921866494807911</id><published>2010-05-14T21:10:00.001+01:00</published><updated>2010-05-26T20:21:00.972+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FOWADUBLIN10'/><category scheme='http://www.blogger.com/atom/ns#' term='fowa'/><title type='text'>FOWA Dublin 2010 – Overall Impressions</title><content type='html'>&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_QNxJ6n10eEU/S_lrOSc9NzI/AAAAAAAAAIk/Z8Kf4e3SkHE/s1600-h/Dublin035800x600Copy4.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Guinness Storehouse" border="0" alt="Guinness Storehouse" src="http://lh4.ggpht.com/_QNxJ6n10eEU/S_lrPEgq-lI/AAAAAAAAAIo/geVnogka2fE/Dublin035800x600Copy_thumb2.jpg?imgmax=800" width="618" height="469" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The Irish edition of FOWA in Dublin lasts only one day. But because the presentations are short (about 20 minutes) you end-up seeing a lot of talks. And as usual what makes FOWA different is the opportunities you get for casual conversations with the speakers. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://futureofwebapps.com/dublin-2010/" target="_blank"&gt;FOWA Dublin&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://futureofwebapps.com/dublin-2010/schedule/" target="_blank"&gt;Full list of speakers&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The venue was a building in the grassy campus of University College Dublin. Everyone could sit outside in the sun for lunch.&lt;/p&gt;  &lt;p&gt;The talks that stood out for me were those by Raffi Krikorian (Twitter) and Christian Heilmann (Yahoo), both dealing with &lt;strong&gt;geolocation.&lt;/strong&gt; When it’s about geo I always think of Google Latitude and Bing Maps but &lt;a href="http://developer.yahoo.com/geo/geoplanet/guide/index.html" target="_blank"&gt;Yahoo&lt;/a&gt; actually does a lot too, especially in the area of APIs and web services.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;IPv6&lt;/strong&gt;: we’ve been hearing about the exhaustion of IPv4 addresses for a long time. I remember my teachers talking about this at school back in 1996. Well Owen Delong explained that this is now less than two years away. More info on the &lt;a href="https://www.arin.net/knowledge/v4-v6.html" target="_blank"&gt;ARIN&lt;/a&gt; site. You can even get counter badges that give the current &lt;a href="http://www.inetcore.com/project/ipv4ec/index_en.html" target="_blank"&gt;estimate&lt;/a&gt; for the exhaustion date.&lt;/p&gt;  &lt;p&gt;I was sitting next to the CEO of &lt;a href="http://www.tictacdo.com" target="_blank"&gt;TicTacDo&lt;/a&gt;, a collaborative how-to site that looks very useful. You could think of it as a &lt;a href="http://stackoverflow.com/" target="_blank"&gt;Stack Overflow&lt;/a&gt; where each question would get a single answer in the form of an actionable TODO list. The app has been live for a while and the enterprise version will launch soon.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Databases&lt;/strong&gt;: there are many alternatives to the classic relational database. Chris Lea described the &lt;strong&gt;NoSQL&lt;/strong&gt; approach (&lt;a href="http://www.slideshare.net/carsonified/fowa-dublin-2010nosql" target="_blank"&gt;slides&lt;/a&gt;): a range of tools (CouchDB, &lt;a href="http://www.mongodb.org/" target="_blank"&gt;MongoDB&lt;/a&gt;, JackRabbit) should be considered before jumping on MySQL, SQL Server or Oracle. &lt;/p&gt;  &lt;p&gt;Some excellent non technical talks by professional speakers: Alex Hunter about taking care of your brand and the lovely Relly Annett-Baker about content creation. &lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;after conference party &lt;/strong&gt;at &lt;a href="http://solasbars.com/www.solasbars.com/WELCOME.html" target="_blank"&gt;Solas&lt;/a&gt; was great: free bar from 7.30pm to midnight (you can never go wrong with that), very good atmosphere and good crowd.&lt;/p&gt;  &lt;p&gt;One thing I noticed: during &lt;a href="http://www.codinginlondon.com/search/label/FOWALONDON07" target="_blank"&gt;the last FOWA I attended&lt;/a&gt; there was an army of bloggers taking notes live on their laptops and posting as the conference was progressing (I could find the posts in Google 30 min after a presentation was finished). Not this time! I think I know why: three years ago people were using blogs to post live information, now they use Twitter, which is better suited for this kind of thing. Somehow Twitter has made blogs more quiet.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-7649921866494807911?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/7649921866494807911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=7649921866494807911' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7649921866494807911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7649921866494807911'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/05/fowa-dublin-2010-overall-impressions.html' title='FOWA Dublin 2010 – Overall Impressions'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_QNxJ6n10eEU/S_lrPEgq-lI/AAAAAAAAAIo/geVnogka2fE/s72-c/Dublin035800x600Copy_thumb2.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-5689327610761477865</id><published>2010-05-09T09:39:00.001+01:00</published><updated>2010-05-09T09:43:56.562+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Maps'/><title type='text'>Maps at the British Library</title><content type='html'>&lt;p&gt;The Jubilee line is working this Sunday. I’ll make the most of this exceptional event by going to the new maps expo at the &lt;a href="http://www.bl.uk/magnificentmaps/" target="_blank"&gt;British Library&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;In September there will be a &lt;a href="http://www.bl.uk/whatson/events/event109524.html" target="_blank"&gt;talk&lt;/a&gt; by &lt;a href="http://www.edparsons.com/" target="_blank"&gt;Ed Parsons&lt;/a&gt; geospatial technologist at Google Maps and Steve Chilton from OpenStreetMap.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-5689327610761477865?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/5689327610761477865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=5689327610761477865' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5689327610761477865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5689327610761477865'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/05/maps-at-british-library.html' title='Maps at the British Library'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-1505703167864218110</id><published>2010-04-18T17:34:00.001+01:00</published><updated>2010-09-23T21:19:36.167+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Methods'/><title type='text'>Insight Into an Agile Team</title><content type='html'>&lt;p&gt;&amp;#160;&lt;a href="http://lh6.ggpht.com/_QNxJ6n10eEU/TJu2Ur40MwI/AAAAAAAAAKM/7xXT6ZJMUr8/s1600-h/on_white_0712.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="What have crayons to do with agile???" border="0" alt="What have crayons to do with agile???" src="http://lh6.ggpht.com/_QNxJ6n10eEU/TJu2Vvh4EJI/AAAAAAAAAKQ/UsyESmPAsFE/on_white_07_thumb10.jpg?imgmax=800" width="414" height="257" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;It’s one thing to read about agile in books. It’s another to see it working in practice. And it’s impressive!&lt;/p&gt;  &lt;p&gt;I had the opportunity to take part in meetings with a team that applies agile methods: they’ve been doing this for years and their process is very mature. I was impressed with the discipline. The methods the team uses are agile in spirit and re-use some elements from &lt;a href="http://techbus.safaribooksonline.com/9780735619937" target="_blank"&gt;scrum&lt;/a&gt;, &lt;a href="http://techbus.safaribooksonline.com/0321278658" target="_blank"&gt;extreme programming&lt;/a&gt; and &lt;a href="http://techbus.safaribooksonline.com/0321437381" target="_blank"&gt;lean&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;They hold at least three types of meetings:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;stand-up&lt;/strong&gt; (daily):       &lt;ul&gt;       &lt;li&gt;quick status update by each pair &lt;/li&gt;        &lt;li&gt;decide the new pairs for the day &lt;/li&gt;        &lt;li&gt;quickly go over yesterday’s annoyances (written on a board) &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;planning&lt;/strong&gt; (every iteration): give a time estimate to each piece of work in the next iteration. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;retrospective&lt;/strong&gt; (every two iterations): list what went well, what didn’t and what needs to change. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Six programmers work in pairs and interact with two business analysts. &lt;strong&gt;The pairs change every day&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;The business analysts identify early little chunks of functionality called stories. Stories are small enough to be designed/coded/tested in less than two days and still provide business value. The BAs prepare a list of the stories that will make it into the next iteration. After discussion with the developers they assign a rough weight to each story. A story is weighted in relation to a “standard” story, which takes about 1.5 day for a pair to complete. A story with weight 1/3 takes a third of the time of a standard story. Later the devs will give a more precise estimate to the story during the planning meeting.&lt;/p&gt;  &lt;p&gt;The most striking aspect of the approach is that the BAs write and complete the FIT tests &lt;strong&gt;before&lt;/strong&gt; each iteration. That means even &lt;strong&gt;before the dev pair starts coding&lt;/strong&gt; a story, there is already a FIT test for that story. Obviously at this stage the test fails because the solution does not yet exist. Then the job of the devs is to get the FIT tests to pass by actually coding the functionality (writing the unit-tests first and using TDD’s Fail&amp;gt;Pass&amp;gt;Refactor cycle). If the devs feel a need to change something to the FIT test itself, they discuss it with the BAs.&lt;/p&gt;  &lt;p&gt;The dev pairs change &lt;strong&gt;every day&lt;/strong&gt; and the new pairs are decided during the stand-up.&lt;/p&gt;  &lt;p&gt;More about the &lt;strong&gt;planning meeting&lt;/strong&gt;: before each new iteration the team meets to discuss the stories going into the next iteration. They sit around a table and go through the stack of stories one by one. It’s literally a stack of cards with a brief description of the story on it. Because the stories are very lightweight both in terms of functionality and coding complexity, you can get away with a very short description on the card. A few lines of handwritten text are enough to express what the story is about. No heavy specs documents: &lt;strong&gt;fine level story granularity&lt;/strong&gt; + &lt;strong&gt;lots of team communication&lt;/strong&gt; replace the need for detailed specs. The FIT tests and unit-tests capture the detailed specifications.&lt;/p&gt;  &lt;p&gt;The process they use is self-evolving: once a month they hold a formal meeting called a &lt;strong&gt;retrospective&lt;/strong&gt;.&lt;strong&gt; &lt;/strong&gt;They discuss what went well, what didn’t and then fine-tune their methods.&lt;/p&gt;  &lt;p&gt;The structure of the retrospective is straightforward: they write three lists of items on a board:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;GOOD &lt;/li&gt;    &lt;li&gt;BAD &lt;/li&gt;    &lt;li&gt;TODO &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;They also bring the board with last month’s TODOs to tick off those that were actually done and carry over the rest. Everyone sits around a table with tea, coffee and biscuits. Not surprisingly that meeting can get quite animated, especially given that those guys are not exactly the shy type. You can tell they’re used to doing that by the way they structure the discussions: list the items first on the board, close the list and &lt;strong&gt;then&lt;/strong&gt; discuss the items one by one rather than dwell on the first items and run out of time.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-1505703167864218110?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/1505703167864218110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=1505703167864218110' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1505703167864218110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1505703167864218110'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/04/insight-into-agile-team-part-1.html' title='Insight Into an Agile Team'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_QNxJ6n10eEU/TJu2Vvh4EJI/AAAAAAAAAKQ/UsyESmPAsFE/s72-c/on_white_07_thumb10.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-3099773311926016864</id><published>2010-04-10T15:33:00.001+01:00</published><updated>2010-04-11T20:57:00.561+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Maps'/><title type='text'>Feedly, Google Map Layers and Bing Maps</title><content type='html'>&lt;p&gt;I’m an avid user of Google Reader because it’s fast and straightforward. Unfortunately the layout is a bit boring. The problem with a boring layout is that you can end up missing posts either because there is no pic to catch your attention or you fell asleep.&lt;/p&gt;  &lt;p&gt;While I was in Istanbul I tried &lt;a href="http://www.feedly.com" target="_blank"&gt;&lt;strong&gt;feedly&lt;/strong&gt;&lt;/a&gt;. It works as a Chrome extension and uses your Google Reader feeds (so no need to import the feeds, they’re all there). It lays out RSS posts with a picture, a title and a preview text. Several layouts are available, &lt;em&gt;digest&lt;/em&gt;, &lt;em&gt;cover&lt;/em&gt;, &lt;em&gt;popular&lt;/em&gt; and &lt;em&gt;latest, &lt;/em&gt;all using some obscure algorithm to display a subset of the posts available in your RSS feeds. The result is visually appealing and the keyboard shortcuts are similar to those in Google Reader. &lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;digest layout &lt;/strong&gt;(notice how you get some Kandinsky-like abstract painting when a picture is not available from the post):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.golios.com/programming/FeedlyGoogleMapLayersandBingMaps_A121/Feedly2.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Feedly2" border="0" alt="Feedly2" src="http://www.golios.com/programming/FeedlyGoogleMapLayersandBingMaps_A121/Feedly2_thumb.jpg" width="680" height="460" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;cover layout:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.golios.com/programming/FeedlyGoogleMapLayersandBingMaps_A121/Feedly1.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Feedly1" border="0" alt="Feedly1" src="http://www.golios.com/programming/FeedlyGoogleMapLayersandBingMaps_A121/Feedly1_thumb.jpg" width="695" height="392" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Compare that with the equivalent Google Reader layout:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.golios.com/Code/FeedlyGoogleMapLayersandBingMaps_11531/Reader.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Reader" border="0" alt="Reader" src="http://www.golios.com/Code/FeedlyGoogleMapLayersandBingMaps_11531/Reader_thumb.jpg" width="705" height="328" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Google maps for mobile&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;At last, the latest version of Google maps for Windows mobile is what it should have been at the beginning: &lt;strong&gt;the places you save in &lt;em&gt;My Maps&lt;/em&gt; on the desktop appear on your mobile&lt;/strong&gt;. The places you create as &lt;em&gt;starred items&lt;/em&gt; on the phone appear on the desktop. It’s good because I create &lt;em&gt;starred items&lt;/em&gt; on my phone whenever I walk past a restaurant I want to remember. But until this new version of Google Maps I couldn’t save them in the cloud, which was a bit daft.&lt;/p&gt;  &lt;p&gt;So on the mobile Google maps you can now display &lt;strong&gt;layers&lt;/strong&gt;. A layer can be anything: your saved maps, saved searches, maps of favorites places by famous people, your friends on &lt;strong&gt;latitude&lt;/strong&gt;, tube lines… There is a &lt;strong&gt;Wikipedia layer&lt;/strong&gt; that displays an icon on places related to a geolocated article and a &lt;strong&gt;Buzz&lt;/strong&gt; layer that displays icons where people left a buzz message…&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;New Bing maps&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The new bing maps available at &lt;a href="http://www.bing.com/maps/explore"&gt;www.bing.com/maps/explore&lt;/a&gt; work with Silverlight and are clearly faster than Google maps. Try bringing up London in two chrome sessions side by side, one with Google and one with Bing. It’s pretty obvious: panning, zooming in and zooming out feels faster and more fluid with Bing.&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;map apps&lt;/strong&gt; are pretty good: there is a &lt;strong&gt;Restaurants finder&lt;/strong&gt; that works really well (at least for London that is) and a &lt;strong&gt;Twitter Map&lt;/strong&gt; to display geolocated tweets on the current map in real time. &lt;strong&gt;Today’s front pages&lt;/strong&gt; is exciting if you’re into worldwide news.&lt;/p&gt;  &lt;p&gt;Currently the data in the new Bing lags behind… For instance the Restaurant Finder didn’t have anything to show for Dublin or Istanbul. But in terms of functionality, it’s very promising.&lt;/p&gt;  &lt;p&gt;This is some of the available &lt;strong&gt;Map apps&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.golios.com/Code/FeedlyGoogleMapLayersandBingMaps_11531/image.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.golios.com/Code/FeedlyGoogleMapLayersandBingMaps_11531/image_thumb.png" width="687" height="417" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;Restaurants finder&lt;/strong&gt; with category filtering: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.golios.com/Code/FeedlyGoogleMapLayersandBingMaps_11531/image_3.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.golios.com/Code/FeedlyGoogleMapLayersandBingMaps_11531/image_thumb_3.png" width="686" height="451" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;Ordnance Survey maps&lt;/strong&gt; are not displayed in the new Bing maps apparently. However they still are in the normal bing maps &lt;a href="http://maps.bing.com" target="_blank"&gt;maps.bing.com&lt;/a&gt;. It still blows my mind that the raster version of those 1/25000 maps (those that cost you an arm and two legs at the bookshop) are up there for free.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-3099773311926016864?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/3099773311926016864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=3099773311926016864' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3099773311926016864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3099773311926016864'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/04/feedly-google-map-layers-and-bing-maps.html' title='Feedly, Google Map Layers and Bing Maps'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-1699468753897728236</id><published>2010-03-29T21:59:00.000+01:00</published><updated>2010-03-30T21:07:48.765+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linq'/><title type='text'>Comparing Result Sets with Linq</title><content type='html'>&lt;p&gt;Linq is really handy. Once you’re familiar with the syntax and the way it works, it becomes very useful.&lt;/p&gt;  &lt;p&gt;Recently I had to write a front-end to compare lists of financial instruments coming from two different sources. One source was a SQL Server database, the other source was an in-house market data system. &lt;/p&gt;  &lt;p&gt;The result set from the database was extracted by a stored procedure into a collection. The collection’s type is &lt;font face="Courier New"&gt;IEnumerable&amp;lt;Result1&amp;gt;&lt;/font&gt; where Result1 is a type automatically generated by the Linq designer using the stored procedure definition.&lt;/p&gt;  &lt;p&gt;The other result set comes from the in-house market data system. It is extracted with an API that constructs Result2 objects and accumulates them into a collection &lt;font face="Courier New"&gt;List&amp;lt;Result2&amp;gt;&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;The purpose of the little app is to show the instruments present in the first result set and not the other one. The types &lt;font face="Courier New"&gt;Result1&lt;/font&gt; and &lt;font face="Courier New"&gt;Result2&lt;/font&gt; are defined as follows:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8dcdba03-5ced-4ecf-b81f-e86c4ef3687c" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background-color: #000000; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#707070"&gt;///&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt; &lt;/span&gt;&lt;span style="color:#707070"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br&gt; &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#707070"&gt;///&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt; In my real project this class was generated by the Linq designer&lt;/span&gt;&lt;br&gt; &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#707070"&gt;///&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt; &lt;/span&gt;&lt;span style="color:#707070"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br&gt; &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;class&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#c44040"&gt;Result1&lt;/span&gt;&lt;br&gt; &lt;span style="color:#eeeeee"&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;public&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;string&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;Isin&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; { &lt;/span&gt;&lt;span style="color:#90ee90"&gt;get&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;set&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;; }&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;public&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;string&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;Sedol&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; { &lt;/span&gt;&lt;span style="color:#90ee90"&gt;set&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;get&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;; }&lt;/span&gt;&lt;br&gt; &lt;span style="color:#eeeeee"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#707070"&gt;///&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt; &lt;/span&gt;&lt;span style="color:#707070"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br&gt; &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#707070"&gt;///&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt; Manually created class to store objects from the in-house market data system&lt;/span&gt;&lt;br&gt; &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#707070"&gt;///&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt; &lt;/span&gt;&lt;span style="color:#707070"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br&gt; &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;class&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#c44040"&gt;Result2&lt;/span&gt;&lt;br&gt; &lt;span style="color:#eeeeee"&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;public&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;string&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;Isin&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; { &lt;/span&gt;&lt;span style="color:#90ee90"&gt;get&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;set&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;; }&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;public&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;string&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;Sedol&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; { &lt;/span&gt;&lt;span style="color:#90ee90"&gt;set&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;get&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;; }&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;public&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;string&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;Location&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; { &lt;/span&gt;&lt;span style="color:#90ee90"&gt;set&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;get&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;; }&lt;/span&gt;&lt;br&gt; &lt;span style="color:#eeeeee"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Fill both collections with some dummy data:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:28f4883e-e38b-4d02-8f1e-f3450aa52a16" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background-color: #000000; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#c44040"&gt;List&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#c44040"&gt;Result1&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;coll1&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;=&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;new&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#c44040"&gt;List&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#c44040"&gt;Result1&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;();&lt;/span&gt;&lt;br&gt; &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#c44040"&gt;List&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#c44040"&gt;Result2&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;coll2&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;=&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;new&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#c44040"&gt;List&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#c44040"&gt;Result2&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;();&lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#dcb574"&gt;coll1&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Add&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;(&lt;/span&gt;&lt;span style="color:#90ee90"&gt;new&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#c44040"&gt;Result1&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; { &lt;/span&gt;&lt;span style="color:#dcb574"&gt;Isin&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;=&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#00a6a6"&gt;&amp;quot;ABCD&amp;quot;&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;, &lt;/span&gt;&lt;span style="color:#dcb574"&gt;Sedol&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;=&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#00a6a6"&gt;&amp;quot;123&amp;quot;&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; });&lt;/span&gt;&lt;br&gt; &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#dcb574"&gt;coll1&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Add&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;(&lt;/span&gt;&lt;span style="color:#90ee90"&gt;new&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#c44040"&gt;Result1&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; { &lt;/span&gt;&lt;span style="color:#dcb574"&gt;Isin&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;=&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#00a6a6"&gt;&amp;quot;EDFG&amp;quot;&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;, &lt;/span&gt;&lt;span style="color:#dcb574"&gt;Sedol&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;=&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#00a6a6"&gt;&amp;quot;234&amp;quot;&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; });&lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#dcb574"&gt;coll2&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Add&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;(&lt;/span&gt;&lt;span style="color:#90ee90"&gt;new&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#c44040"&gt;Result2&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; { &lt;/span&gt;&lt;span style="color:#dcb574"&gt;Isin&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;=&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#00a6a6"&gt;&amp;quot;EDFG&amp;quot;&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;, &lt;/span&gt;&lt;span style="color:#dcb574"&gt;Sedol&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;=&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#00a6a6"&gt;&amp;quot;234&amp;quot;&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;, &lt;/span&gt;&lt;span style="color:#dcb574"&gt;Location&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;=&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#00a6a6"&gt;&amp;quot;Set2&amp;quot;&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; });&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;I want to compute result1 MINUS result2. In Linq this is done with &lt;strong&gt;Except&lt;/strong&gt;. So I’d like to write something like this:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:54fd3105-4b67-4e03-b7b9-1808830830a2" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background-color: #000000; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;var&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;diff&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;=&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;(&lt;/span&gt;&lt;span style="color:#90ee90"&gt;from&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;c&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;in&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;result1&lt;/span&gt;&lt;br&gt;      &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;select&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;c&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;)&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Except&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;(&lt;/span&gt;&lt;span style="color:#90ee90"&gt;from&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;c&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;in&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;result2&lt;/span&gt;&lt;br&gt;      &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;select&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;c&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;);&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;…but that does not compile because result1 and result2 have two different types. Therefore I need to do a projection, like this:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:14fb31d5-dbb4-45a3-a3c9-fb9ddb41a17a" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background-color: #000000; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;var&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;diff&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;=&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;(&lt;/span&gt;&lt;span style="color:#90ee90"&gt;from&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;c&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;in&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;result1&lt;/span&gt;&lt;br&gt;      &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;select&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;c&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;)&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Except&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;(&lt;/span&gt;&lt;span style="color:#90ee90"&gt;from&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;c&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;in&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;result2&lt;/span&gt;&lt;br&gt;      &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;select&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;new&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#c44040"&gt;Result1&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; { &lt;/span&gt;&lt;span style="color:#dcb574"&gt;Isin&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;=&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;c&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Isin&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;, &lt;/span&gt;&lt;span style="color:#dcb574"&gt;Sedol&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;=&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;c&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Sedol&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; });&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The above compiles fine, but there is a problem: the result of the diff is the original result1 collection. It doesn’t remove the elements present also present in result2! This is because at this stage Except does not know how to test &lt;font face="Courier New"&gt;Result1&lt;/font&gt; objects for equality. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Except&lt;/strong&gt; takes an &lt;font face="Courier New"&gt;IEqualityComparer&amp;lt;T&amp;gt;&lt;/font&gt; as second argument. Let’s define one:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:d2f0b202-e3da-49e4-bf83-13b1ff11ee0b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background-color: #000000; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;class&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#c44040"&gt;Result1Comparer&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; : &lt;/span&gt;&lt;span style="color:#c44040"&gt;EqualityComparer&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#c44040"&gt;Result1&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt; &lt;span style="color:#eeeeee"&gt;{&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#707070"&gt;///&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt; &lt;/span&gt;&lt;span style="color:#707070"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#707070"&gt;///&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt; Two elements are considered equal if they match on at least one identifier&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#707070"&gt;///&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt; &lt;/span&gt;&lt;span style="color:#707070"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#707070"&gt;///&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt; &lt;/span&gt;&lt;span style="color:#707070"&gt;&amp;lt;param name=&lt;/span&gt;&lt;span style="color:#90d290"&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&lt;span style="color:#707070"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#707070"&gt;///&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt; &lt;/span&gt;&lt;span style="color:#707070"&gt;&amp;lt;param name=&lt;/span&gt;&lt;span style="color:#90d290"&gt;&amp;quot;y&amp;quot;&lt;/span&gt;&lt;span style="color:#707070"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#707070"&gt;///&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt; &lt;/span&gt;&lt;span style="color:#707070"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;public&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;override&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;bool&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;Equals&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;(&lt;/span&gt;&lt;span style="color:#c44040"&gt;Result1&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;x&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;, &lt;/span&gt;&lt;span style="color:#c44040"&gt;Result1&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;y&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;)&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;return&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; ((&lt;/span&gt;&lt;span style="color:#dcb574"&gt;x&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Isin&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;==&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;y&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Isin&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;) &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;||&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; (&lt;/span&gt;&lt;span style="color:#dcb574"&gt;x&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Sedol&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;==&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;y&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Sedol&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;) );&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;public&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;override&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;int&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;GetHashCode&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;(&lt;/span&gt;&lt;span style="color:#c44040"&gt;Result1&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;obj&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;)&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt;// Just re-use Object&amp;#39;s default GetHashCode&lt;/span&gt;&lt;br&gt;         &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;return&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;obj&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;span style="color:#dcb574"&gt;GetHashCode&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;();&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;}&lt;/span&gt;&lt;br&gt; &lt;span style="color:#eeeeee"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The diff now looks like this:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:bf062212-d1df-41da-8203-cc2c7f945813" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background-color: #000000; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;var&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;diff&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;=&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;(&lt;/span&gt;&lt;span style="color:#90ee90"&gt;from&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;c&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;in&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;result1&lt;/span&gt;&lt;br&gt;      &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;select&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;c&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;)&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Except&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;(&lt;/span&gt;&lt;span style="color:#90ee90"&gt;from&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;c&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;in&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;result2&lt;/span&gt;&lt;br&gt;      &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;select&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;new&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#c44040"&gt;Result1&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; { &lt;/span&gt;&lt;span style="color:#dcb574"&gt;Isin&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;=&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;c&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Isin&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;, &lt;/span&gt;&lt;span style="color:#dcb574"&gt;Sedol&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;=&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;c&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Sedol&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; },&lt;/span&gt;&lt;br&gt;      &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;new&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#c44040"&gt;Type1Comparer&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;());&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;It’s still not working! Why? When &lt;strong&gt;Except&lt;/strong&gt; compares the result sets, it uses the comparer’s &lt;strong&gt;GetHashCode&lt;/strong&gt; first. If two objects have two different hashcodes then it doesn’t bother calling Equals(). &lt;/p&gt;  &lt;p&gt;In the code above the &lt;font face="Courier New"&gt;GetHashCode()&lt;/font&gt; override calls the default &lt;font face="Courier New"&gt;Object.GetHashCode()&lt;/font&gt;. &lt;font face="Courier New"&gt;Object.GetHashCode()&lt;/font&gt; is useless: it generates an index as a function of the object reference. Even if two objects have the same value &lt;font face="Courier New"&gt;Object.GetHashCode()&lt;/font&gt;returns two different hashes. And &lt;strong&gt;Except&lt;/strong&gt; thinks the objects are different!&lt;/p&gt;  &lt;p&gt;No need to burn too much brainpower on writing the hash function as long as: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;it’s fast &lt;/li&gt;    &lt;li&gt;two objects with the same value return the same hashcode. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The following should do:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:559a5ec1-9ad2-4a7b-84bc-c380c6bc5e33" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background-color: #000000; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;class&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#c44040"&gt;Result1Comparer&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; : &lt;/span&gt;&lt;span style="color:#c44040"&gt;EqualityComparer&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#c44040"&gt;Result1&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt; &lt;span style="color:#eeeeee"&gt;{&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#707070"&gt;///&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt; &lt;/span&gt;&lt;span style="color:#707070"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#707070"&gt;///&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt; Two elements are considered equal if they match on at least one identifier&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#707070"&gt;///&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt; &lt;/span&gt;&lt;span style="color:#707070"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#707070"&gt;///&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt; &lt;/span&gt;&lt;span style="color:#707070"&gt;&amp;lt;param name=&lt;/span&gt;&lt;span style="color:#90d290"&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&lt;span style="color:#707070"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#707070"&gt;///&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt; &lt;/span&gt;&lt;span style="color:#707070"&gt;&amp;lt;param name=&lt;/span&gt;&lt;span style="color:#90d290"&gt;&amp;quot;y&amp;quot;&lt;/span&gt;&lt;span style="color:#707070"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#707070"&gt;///&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt; &lt;/span&gt;&lt;span style="color:#707070"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;public&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;override&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;bool&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;Equals&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;(&lt;/span&gt;&lt;span style="color:#c44040"&gt;Result1&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;x&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;, &lt;/span&gt;&lt;span style="color:#c44040"&gt;Result1&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;y&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;)&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;return&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; ((&lt;/span&gt;&lt;span style="color:#dcb574"&gt;x&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Isin&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;==&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;y&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Isin&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;) &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;||&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; (&lt;/span&gt;&lt;span style="color:#dcb574"&gt;x&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Sedol&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;==&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;y&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Sedol&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;) );&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;public&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;override&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#90ee90"&gt;int&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;GetHashCode&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;(&lt;/span&gt;&lt;span style="color:#c44040"&gt;Result1&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;obj&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;)&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt;// Objects with different Isins will be considered as different&lt;/span&gt;&lt;br&gt;         &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#a4a4a4"&gt;// If 2 objects have same Isin then Equals is used&lt;/span&gt;&lt;br&gt;         &lt;span style="color:#eeeeee"&gt;&lt;/span&gt;&lt;span style="color:#90ee90"&gt;return&lt;/span&gt;&lt;span style="color:#eeeeee"&gt; &lt;/span&gt;&lt;span style="color:#dcb574"&gt;obj&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;span style="color:#dcb574"&gt;Isin&lt;/span&gt;&lt;span style="color:#b0b0ff"&gt;.&lt;/span&gt;&lt;span style="color:#dcb574"&gt;GetHashCode&lt;/span&gt;&lt;span style="color:#eeeeee"&gt;();&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#eeeeee"&gt;}&lt;/span&gt;&lt;br&gt; &lt;span style="color:#eeeeee"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;No the MINUS operation with Except works.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Limits of Linq:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The SQL-like way of comparing collections is elegant but it’s nothing more than a nice way of writing for loops. Don’t expect miracles on the performance side…&lt;/p&gt;  &lt;p&gt;The best place to perform queries is still in the database. &lt;/p&gt;  &lt;p&gt;In the case of the app described above performing queries on the client is just fine. However there are situations where importing into the database and having all the queries take place in SQL Server would be faster.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-1699468753897728236?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/1699468753897728236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=1699468753897728236' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1699468753897728236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1699468753897728236'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/03/comparing-result-sets-with-linq.html' title='Comparing Result Sets with Linq'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-2824945028300713177</id><published>2010-03-07T21:42:00.000Z</published><updated>2010-05-20T19:20:12.740+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Books'/><title type='text'>Books I currently Flip through #8</title><content type='html'>&lt;p&gt;&lt;strong&gt;Tech&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://techbus.safaribooksonline.com/9780321637208"&gt;LINQ to Objects Using C# 4.0: Using and Extending LINQ to Objects and Parallel LINQ (PLINQ)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Others&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The Cul-de-Sac Syndrome: Turning Around the Unsustainable American Dream (Bloomberg)&lt;img style="border-bottom-style: none !important; border-right-style: none !important; margin: 0px; border-top-style: none !important; border-left-style: none !important" border="0" alt="" src="http://www.assoc-amazon.com/e/ir?t=codiinlond-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1576603202" width="1" height="1" /&gt; (John F. Wasik) &lt;img style="border-bottom-style: none !important; border-right-style: none !important; margin: 0px; border-top-style: none !important; border-left-style: none !important" border="0" alt="" src="http://www.assoc-amazon.com/e/ir?t=codiinlond-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1576603202" width="1" height="1" /&gt;&amp;#160;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://www.amazon.co.uk/gp/product/1576603202?ie=UTF8&amp;amp;tag=codiinlond-21&amp;amp;link_code=as3&amp;amp;camp=2506&amp;amp;creative=9298&amp;amp;creativeASIN=1576603202" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="51mWGBwpq L._SL160_" border="0" alt="51mWGBwpq L._SL160_" src="http://lh4.ggpht.com/_QNxJ6n10eEU/S_V0CBdGKfI/AAAAAAAAAHc/JOQI1SPYezA/51mWGBwpq%2BL._SL160_%5B10%5D.jpg?imgmax=800" width="117" height="164" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Outliers (Malcolm Gladwell)      &lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.co.uk/gp/product/0141036257?ie=UTF8&amp;amp;tag=codiinlond-21&amp;amp;link_code=as3&amp;amp;camp=2506&amp;amp;creative=9298&amp;amp;creativeASIN=0141036257" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_QNxJ6n10eEU/S_V0ptDK3KI/AAAAAAAAAHg/vlWhcm3wJek/image%5B6%5D.png?imgmax=800" width="110" height="164" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-2824945028300713177?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/2824945028300713177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=2824945028300713177' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/2824945028300713177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/2824945028300713177'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/02/books-i-currently-flip-through-8.html' title='Books I currently Flip through #8'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_QNxJ6n10eEU/S_V0CBdGKfI/AAAAAAAAAHc/JOQI1SPYezA/s72-c/51mWGBwpq%2BL._SL160_%5B10%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-6977282747515175460</id><published>2010-02-15T20:12:00.001Z</published><updated>2010-02-20T22:31:28.307Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Udi Dahan'/><category scheme='http://www.blogger.com/atom/ns#' term='Skills Matter'/><title type='text'>Udi Dahan about Simplifying Multi-Tier Architecture</title><content type='html'>&lt;p&gt;I listened to Udi Dahan talk about an alternative pattern to the classic multi-tier architecture during a &lt;a href="http://skillsmatter.com/location-details/open-source-dot-net/606/96" target="_blank"&gt;Skills Matter event&lt;/a&gt; in London.&lt;/p&gt;  &lt;p&gt;I knew the name was familiar but I couldn’t put my finger on it until I entered the room: he was at TechEd Barcelona in November 2008! Back then he gave &lt;a href="http://golios.blogspot.com/2008/11/friday-test-driven-designdevelopment.html" target="_blank"&gt;a very sarcastic (and enjoyable) talk&lt;/a&gt; about interface-based programming, dependency injection and the abuses of the strategy pattern.&lt;/p&gt;  &lt;p&gt;Udi is a good speaker. That’s quite a treat to have a TechEd-level presentation for free at Skills Matter.&lt;/p&gt;  &lt;p&gt;The pattern is called CQRS. Despite the boring 4-letter acronym it is based on a few very simple ideas: take out from the standard UI/Services/Business logic/DAL everything that is related to &lt;strong&gt;queries&lt;/strong&gt; (= pull data off the database to show it to the user) and leave only the &lt;strong&gt;commands &lt;/strong&gt;(= use business rules to change data). Queries can simply use a &lt;strong&gt;2-tier model with persistent views&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://skillsmatter.com/podcast/soa-rest/udi-dahan-command-query-responsibility-segregation"&gt;video of the talk&lt;/a&gt; is available on Skills Matter website.&lt;/p&gt; &lt;img style="width: 0px; height: 0px; visibility: hidden" border="0" src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyNjY*NDMyNjcwMzEmcHQ9MTI2NjQ*MzI4NjE2NyZwPTEwMTkxJmQ9c3NfZW1iZWQmZz*yJm89ZGMzZThlOTM*NjY1/NGUzOGJlNDgyMjI3YWEzZTQ2OTYmb2Y9MA==.gif" width="0" height="0" /&gt;   &lt;div style="text-align: left; width: 425px" id="__ss_3206740"&gt;&lt;a style="margin: 12px 0px 3px; display: block; font: 14px helvetica,arial,sans-serif; text-decoration: underline" title="Command Query Responsibility Segregation" href="http://www.slideshare.net/skillsmatter/command-query-responsibility-segregation"&gt;Command Query Responsibility Segregation&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=cqrs15-02-10-100217071214-phpapp02&amp;amp;stripped_title=command-query-responsibility-segregation" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=cqrs15-02-10-100217071214-phpapp02&amp;amp;stripped_title=command-query-responsibility-segregation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="font-family: tahoma,arial; height: 26px; font-size: 11px; padding-top: 2px"&gt;View more &lt;a style="text-decoration: underline" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline" href="http://www.slideshare.net/skillsmatter"&gt;Skills Matter&lt;/a&gt;.&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;Presentation notes: &lt;/strong&gt;(those are Udi’s ideas rephrased with my own words…)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Queries&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Data is always stale, but why not show how stale it is with a timestamp? Doesn’t cost anything. &lt;/li&gt;    &lt;li&gt;Representing data with objects is a bit of a waste because as far as queries go, &lt;strong&gt;data is not an object&lt;/strong&gt;, it has no behaviour, it’s just data! &lt;/li&gt;    &lt;li&gt;Consequence: go back to the simplest thing that works, the 2-tier architecture.&amp;#160; &lt;/li&gt;    &lt;li&gt;The UI can talk directly to the DB since layers don’t add any value to queries. For &lt;strong&gt;each view&lt;/strong&gt; &lt;strong&gt;in the UI&lt;/strong&gt; there is &lt;strong&gt;one persistent view in the DB&lt;/strong&gt;. The UI does a simple select *, no calculation. The persistent views have a column for every piece of data to be shown in the UI view. &lt;/li&gt;    &lt;li&gt;Data duplication between persistent views is fine. Entities are covered separately by an OLTP model. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Search&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Avoid generic search screens that allow users to compose an ad-hoc query with plenty of fields. Focus on the user’s intent only: design the most likely queries to be used and make them available by default with very limited amount of parameters. &lt;/li&gt;    &lt;li&gt;For anything that’s not covered by a pre-designed query, use a very simple google-style 1-field full text search. You’d need a data model dedicated to this kind of search (SQL Server full-text search service for instance). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Persistent view model&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The views don’t need foreign keys, but they do need indexes. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Use the database for role-based access: user, superviser, each one has its own view with its own set of columns. Data is duplicated but that’s ok. &lt;/li&gt;    &lt;li&gt;That’s actually more secure than a memory-based web cache. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Validation&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Use the persistent view model to do &lt;strong&gt;preliminary validation&lt;/strong&gt; (as the user types his name for instance). No need to wait until submission. &lt;/li&gt;    &lt;li&gt;Validation is done within components identical on the client and the server. &lt;/li&gt;    &lt;li&gt;Examples of things that can be checked early: uniqueness, related entity existence… &lt;/li&gt;    &lt;li&gt;Validation result in correct in 99% of cases, which is good enough for preliminary validation. The purpose is to answer the question: does the data have chances to be good? &lt;/li&gt;    &lt;li&gt;Validation does not have to be mixed with business rules: ranges, lengths, etc… &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Commands&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Commands encapsulate the business rules. &lt;/li&gt;    &lt;li&gt;Rules answer the question: should we do this based on what’s currently &lt;strong&gt;in the DB&lt;/strong&gt;? &lt;/li&gt;    &lt;li&gt;Commands can use the usual UI/Services/Business Logic/DAL layers. &lt;/li&gt;    &lt;li&gt;Because commands are successful most of the time you can get away with giving an immediate positive answer to the user. Notify him asynchronously if something goes wrong (per email for instance). “Thank you, we’ll let you know if there is a problem”. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;User interface design&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Tips to capture the user’s intent in the UI while taking advantage of the preliminary validation on the client:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;a &lt;strong&gt;grid&lt;/strong&gt; should be able to accept a column and reject another. There is not necessarily a transaction at the row level. Changing a user’s status is a different task from changing a shipping address and can be done separately. &lt;/li&gt;    &lt;li&gt;a &lt;strong&gt;reservation system&lt;/strong&gt; should allow people to book blocks of seats rather than forcing the user to tick seats individually until the finds an available block. The system could even look for an available block and notify the user when one is found. A good command ends with: “Thanks, you’ll get a confirmation soon”. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;posting a comment&lt;/strong&gt; to blog. The best way to confirm is to display the user’s comment in the page. You can do that on the client directly, no need to wait until the server updated the page. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;cash machine&lt;/strong&gt;: you can do a preliminary validation too (credit card valid, user authenticated, yesterday’s balance good…). If the balance was not good and the user is overdrawn, no big deal, it makes money to the bank anyway (just make sure there is a clause in the credit card’s small print). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Domain Models&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;They are &lt;strong&gt;not for validation&lt;/strong&gt; (use components instead), &lt;strong&gt;not for queries&lt;/strong&gt; (remove all objects used only to pull data and use a persistent view model instead). &lt;/li&gt;    &lt;li&gt;Keep the domain model for the interesting stuff: the business logic. Remove from the domain model everything (tables or columns) that’s not directly used by business rules. &lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-6977282747515175460?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/6977282747515175460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=6977282747515175460' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6977282747515175460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6977282747515175460'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/02/udi-dahan-about-simplifying-multi-tier.html' title='Udi Dahan about Simplifying Multi-Tier Architecture'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-7473590769652862984</id><published>2010-02-06T18:02:00.001Z</published><updated>2010-03-01T21:42:08.760Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Istanbul'/><title type='text'>Coding in Istanbul 3: Pair Coding with a Friend is Fun</title><content type='html'>&lt;p&gt;Helping Jeff with his PHP work was a chance to practice some pair coding. I don’t get to do this at work!&lt;/p&gt;  &lt;p&gt;I know Jeff since the engineering school. We graduated from the same place in Paris. At the time (about 14 years ago) we were always coding in pairs: nothing to do with agile, we simply had to! The school labs were equipped with one PC/Solaris station for two people at best. We often had to finish projects late at night. Eating pizza at someone’s place, three or four people on the same computer. Of course we couldn’t afford laptops. I even remember having to carry around my tower PC to a mate’s flat in order to finish a late project! Those were tough times… and pairing with people was natural: it didn’t look like an exotic feature from a new methodology. It was just what all students did.&amp;#160; &lt;/p&gt;  &lt;p&gt;During our excursions in the coffee-shops and restaurants of Istanbul we both have our netbook. We tried phases where we worked separately, Jeff coding and me looking up some info. But what turns out to work best is to code on the same netbook taking turns at the keyboard. Less chances to get distracted this way. If one loses focus, the other puts him back on track. If one does a typo the other spots it immediately. If we both loose focus we just order another Latte. &lt;/p&gt;  &lt;p&gt;We can sustain the pace for about two hours before we become useless. &lt;/p&gt;  &lt;p&gt;Quite a good laugh actually…&amp;#160; Just like good old times! Too bad we don’t do that at work…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-7473590769652862984?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/7473590769652862984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=7473590769652862984' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7473590769652862984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7473590769652862984'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/02/coding-in-istanbul-3-pair-coding-with.html' title='Coding in Istanbul 3: Pair Coding with a Friend is Fun'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-6380180806779798221</id><published>2010-02-01T17:21:00.000Z</published><updated>2010-03-01T21:43:45.413Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Istanbul'/><title type='text'>Coding in Istanbul 2: Reverse Engineering a LAMP Project</title><content type='html'>&lt;p&gt;&lt;a href="http://www.golios.com/programming/CodinginIstanbul2_AC58/DSC_9879640x426.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="DSC_9879 (640x426)" border="0" alt="DSC_9879 (640x426)" align="right" src="http://www.golios.com/programming/CodinginIstanbul2_AC58/DSC_9879640x426_thumb.jpg" width="402" height="276" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;We had a salad at Belvu restaurant, Fenerbahçe then carried on coding in True Blue, a cafe overlooking the Sea of Marmara with a nice view to the Princes Islands.&lt;/p&gt;  &lt;p&gt;The stack of Jeff’s site is based on PHP/MySql/Apache. I’m more used to the world of C#/ADO.NET/Linq/T-SQL/SQL Server. &lt;/p&gt;  &lt;p&gt;It’s funny how web development differs from enterprise apps!&lt;/p&gt;  &lt;p&gt;I got into the habit of encapsulating everything and separating layers but the approach used by some PHP devs is more pragmatic. Business logic, data retrieval, building SQL queries and presentation: everything is done in the same .PHP file! &lt;/p&gt;  &lt;p&gt;In Windows client development you typically let a data layer retrieve some data objects (via ADO.NET, Linq or something else) then you assign the data object to a grid control. The control takes care of displaying the content of the object, dynamically creating columns and adding rows… In the PHP files I saw the data layer bit (building the SQL, performing the query, retrieving data) appears just a few lines before a while loop that echoes&amp;#160; &amp;lt;td&amp;gt; tags to generate a table for each row of the result set. All layers in the same place.&lt;/p&gt;  &lt;p&gt;Also in the code I saw SQL queries were always built on the fly. The first downside of building SQL queries with string concatenation is vulnerability to SQL injection (followed by performance loss due to always rebuilding the query plan and no transactional integrity)… The devs protected the code from injections by using specific PHP functions that parse all user inputs. Why not use stored procedures? Apparently stored procedures are a new thing in MySql: they arrived only in version 5. So I guess they got into the habit of doing away without them.&lt;/p&gt;  &lt;p&gt;Regarding the development tools, when working with PHP in Dreamweaver -apart from a bit of color coding- you get absolutely ZERO compiler support. Indentation is manual and there is no intellisense. Comes pretty close to handcarving on stone tablets.&lt;/p&gt;  &lt;p&gt;Another funny thing with MySQL: it comes with a large choice of database engines, each one having its pros and cons. It turns out that the default db engine in MySQL is optimised for speed and &lt;strong&gt;does not support foreign keys&lt;/strong&gt;. So by default you work in a system where you can delete parents without deleting childrens and where children can contain a reference to a non existing parent. You’d better be sure that’s what you want, most of the time it’s not…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-6380180806779798221?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/6380180806779798221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=6380180806779798221' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6380180806779798221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6380180806779798221'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/02/coding-in-istanbul-2-reverse.html' title='Coding in Istanbul 2: Reverse Engineering a LAMP Project'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-2669657243673783654</id><published>2010-01-30T10:32:00.000Z</published><updated>2010-03-01T21:43:45.414Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Istanbul'/><title type='text'>Coding in Istanbul 1: PHP in Turkey</title><content type='html'>&lt;p&gt;&lt;a href="http://www.golios.com/programming/PHPinTurkey_E338/DSC_9868640x426.jpg"&gt;&lt;img style="border-right-width: 0px; margin: 0px 10px 10px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="DSC_9868 (640x426)" border="0" alt="DSC_9868 (640x426)" align="left" src="http://www.golios.com/programming/PHPinTurkey_E338/DSC_9868640x426_thumb.jpg" width="391" height="266" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I’m having a çoban kavurma in a restaurant with my old mate Jeff who lives in Istanbul. We stopped for lunch in one of the busy pedestrian streets of Kadiköy on the Asian side of the city. &lt;/p&gt;  &lt;p&gt;We spent most of yesterday coding on Jeff’s doctors appointment website. We added a small admin functionality that will save him time when mailing doctors. He’s currently working on getting more doctors registered: it involves finding their details and emailing them one by one. Obviously spamming them all in one go is out of the question so each email is slightly personalised (quoting the doctor’s own website). Yet they all follow the same template so there is some room for automation. &lt;/p&gt;  &lt;p&gt;Jeff also needs to track how doctors open and view the campaign emails. Each email contains a number of links: to the appointment’s website, press articles, facebook and to twitter. Pretty clever: each link calls a php on his website that logs the doctor’s identifier along with the identifier of the link. Then he can run a report that shows various stats about who clicked what link… &lt;/p&gt;  &lt;p&gt;Good places to take the netbooks out in Turkey include a growing number of restaurants, Starbucks, Gloria Jeans… and Wifi is almost always &lt;strong&gt;free!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.gloriajeans.com.tr/" target="_blank"&gt;Gloria Jeans&lt;/a&gt;&lt;/strong&gt; is a great place to sit down with the laptop: more comfortable than Starbucks and less crowded. The one in Ortaköy is perfect: beautiful view to the Bosphorus, 3 levels, smoothies, cheesecakes, tosts (paninis) and free wifi.&lt;/p&gt; &lt;iframe height="350" marginheight="0" src="http://maps.google.com/maps/ms?ie=UTF8&amp;amp;hl=en&amp;amp;msa=0&amp;amp;msid=103046147676206170426.00045ab6bee31a5ac57ed&amp;amp;ll=41.048029,29.031372&amp;amp;spn=0.045311,0.072956&amp;amp;z=13&amp;amp;output=embed" frameborder="0" width="425" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;  &lt;br /&gt;&lt;small&gt;View &lt;a style="text-align: left; color: #0000ff" href="http://maps.google.com/maps/ms?ie=UTF8&amp;amp;hl=en&amp;amp;msa=0&amp;amp;msid=103046147676206170426.00045ab6bee31a5ac57ed&amp;amp;ll=41.048029,29.031372&amp;amp;spn=0.045311,0.072956&amp;amp;z=13&amp;amp;source=embed"&gt;Istanbul&lt;/a&gt; in a larger map&lt;/small&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-2669657243673783654?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/2669657243673783654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=2669657243673783654' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/2669657243673783654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/2669657243673783654'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/01/php-in-turkey.html' title='Coding in Istanbul 1: PHP in Turkey'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-4859604829572192791</id><published>2010-01-12T09:49:00.001Z</published><updated>2010-01-17T12:44:01.039Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit-testing'/><title type='text'>Setup, TearDown, When to Mock?</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I’m writing this while eating at the &lt;a href="http://www.launcestonplace-restaurant.co.uk/"&gt;Launceston Place&lt;/a&gt;, a very comfy restaurant near Gloucester Road. Warm decor, soft lighting and excellent service.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Setup&lt;/strong&gt; &lt;strong&gt;and TearDown&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Only use those to respectively initialise then destroy mock objects. Methods with [Setup] and [TearDown] attributes are called before and after each test so they’re the only methods that guaranty that things get cleaned up. &lt;/p&gt;  &lt;p&gt;Best to avoid the [SetupFixture] attribute (to mark a class that contains Setup and Teardown methods called just once before ALL tests), as well as [TestFixtureSetup]/[TestFixtureTeardown] (called once only before all tests in a fixture). I tried to be clever and used them and ended up having to debug nasty side effects. Unit tests are supposed to run in isolation, so just one [Setup] before and one [TearDown] after each of them, that’s it.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;What should be mocked?&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Yesterday while writing a UT I bumped into this question: should I bother writing a mock for that object or can’t I just use the real thing?&lt;/p&gt;  &lt;p&gt;One answer: objects that access external systems (DB, hard-drive, client API to some server-based system, …) should always be mocked (for unit-tests that is, not integration tests), otherwise the test is not repeatable, and it’s slow…&lt;/p&gt;  &lt;p&gt;If a method under test accesses an injected object and this object does only in-memory stuff, then no need to mock it. It would make sense to mock it because after all this injected object is not actually the thing you want to test… Still, the more &lt;strong&gt;real &lt;/strong&gt;objects are covered by the test, the better. As long as they all run in-memory and do not prevent the test from being repeatable, all is well. So no need to waste time writing a mock in that case.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-4859604829572192791?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/4859604829572192791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=4859604829572192791' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/4859604829572192791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/4859604829572192791'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/01/setup-teardown-when-to-mock.html' title='Setup, TearDown, When to Mock?'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-8584150079023515995</id><published>2010-01-09T21:32:00.002Z</published><updated>2010-01-10T21:41:57.542Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vaio'/><title type='text'>Got to Treat Yourself</title><content type='html'>&lt;p&gt;I bought myself a Christmas present. Next week I’ll receive this neat little thing:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.golios.com/Code/YouveGottoTreatYourself_12EEA/4AC9FC19E4EE012DE10080002BC29BDF.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="4AC9FC19E4EE012DE10080002BC29BDF" border="0" alt="4AC9FC19E4EE012DE10080002BC29BDF" align="left" src="http://www.golios.com/Code/YouveGottoTreatYourself_12EEA/4AC9FC19E4EE012DE10080002BC29BDF_thumb.jpg" width="240" height="224" /&gt;&lt;/a&gt; &lt;a href="http://www.golios.com/Code/YouveGottoTreatYourself_12EEA/4AC9FC55E4EE012DE10080002BC29BDF.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="4AC9FC55E4EE012DE10080002BC29BDF" border="0" alt="4AC9FC55E4EE012DE10080002BC29BDF" src="http://www.golios.com/Code/YouveGottoTreatYourself_12EEA/4AC9FC55E4EE012DE10080002BC29BDF_thumb.jpg" width="240" height="224" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;It’s a VAIO &lt;a href="http://www.sony.co.uk/product/vnp-x-series/tab/overview"&gt;X-Series&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;This is a replacement for the VGN-SZ5 that I carried around every day in a rucksack for more than two years. Now the rucksack will disappear to be replaced by a tiny messenger bag. &lt;/p&gt;&lt;p&gt;Premium carbon finish, SSD drive, embedded 3G. Extremely thin and less than 900g. This is going to be pure pleasure.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;In 2007 netbooks were not around yet and I needed something to &lt;a href="http://www.golios.com/Code/YouveGottoTreatYourself_12EEA/SwissGear.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="SwissGear" border="0" alt="SwissGear" align="right" src="http://www.golios.com/Code/YouveGottoTreatYourself_12EEA/SwissGear_thumb.jpg" width="244" height="184" /&gt;&lt;/a&gt;write code on the go, not just in my lounge. I got the VGN-SZ5 and a Wenger SwissGear rucksack, both of which I’m still using today. I went everywhere with them: Hertfordshire, TechEd Barcelona, Egypt, the French Pyrenees (picture), Paris, Istanbul… In London I use the Vaio in the tube, in Starbucks, Costa, in pubs, in restaurants (which is extremely annoying to people I go out with).&lt;/p&gt;&lt;p&gt;Last year the rucksack felt a bit heavy on my shoulders so I started looking around for a netbook. I read reviews and benchmarks in magasines, tried out all sorts of models in the shop… Samsung, Asus Eee, Acer, Lenovo, MSI Wind… It wasn’t quite that. Either the 3G card was not embedded, or the thing was too bulky… Not sexy enough.&lt;/p&gt;&lt;p&gt;The first time I saw the X-Series in a Sony shop (in October last year two days before the official UK launch), I immediately thought “I want that”. I gave myself some time to think it over (it’s a bit of an investment). In its October 2009 &lt;a href="http://www.pcpro.co.uk/reviews/laptops/352255/sony-vaio-x-series"&gt;review&lt;/a&gt;, PC Pro said:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;But the real problem for the X-Series is its price. (…) Who, though, can lavish £1,130 exc VAT on a vanity laptop such as this?&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;I just ordered one.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.golios.com/Code/YouveGottoTreatYourself_12EEA/1237476547103.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="1237476547103" border="0" alt="1237476547103" align="right" src="http://www.golios.com/Code/YouveGottoTreatYourself_12EEA/1237476547103_thumb.jpg" width="240" height="277" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-8584150079023515995?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/8584150079023515995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=8584150079023515995' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/8584150079023515995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/8584150079023515995'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2010/01/youve-got-to-treat-yourself.html' title='Got to Treat Yourself'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-1687702068862265279</id><published>2010-01-03T21:50:00.000Z</published><updated>2010-01-03T21:49:28.919Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit-testing'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Cheap IoC in native C++</title><content type='html'>In a &lt;a href="http://www.dnrtv.com/default.aspx?showID=126"&gt;2008 episode of dnrTV&lt;/a&gt; James Kovac describes how to create a very simple IoC container. All the container does is mapping the name of an interface to an instance of this interface.&lt;br /&gt;
&lt;br /&gt;
Easy to do in .NET with a generic &lt;span style="font-family: courier new;"&gt;Dictionary&lt;/span&gt;&lt;t,u&gt;&lt;span style="font-family: courier new;"&gt;&lt;t&gt;&lt;/t&gt;&lt;/span&gt;, but what about native C++? It turns out it's not that much more difficult: all you need is a STL map and C++'s &lt;span style="font-family: courier new;"&gt;typeid.&lt;/span&gt;&amp;nbsp;&lt;/t,u&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;t,u&gt;What is an IoC container?&lt;/t,u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;t,u&gt;A class that given an interface &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ISomething &lt;/span&gt;returns the concrete object implementing &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ISomething&lt;/span&gt;.&lt;br /&gt;
&lt;/t,u&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;t,u&gt;&lt;b&gt;Why do you need an IoC container ? &lt;/b&gt;&lt;br /&gt;
&lt;/t,u&gt;&lt;br /&gt;
&lt;t,u&gt;It's one way to do dependency injection. &lt;br /&gt;
&lt;/t,u&gt;&lt;br /&gt;
&lt;t,u&gt;Let's say you want to unit-test some business layer that relies on a data layer. The business layer sees the data layer through an interface (let's call it &lt;span style="font-family: courier new;"&gt;IDataLayer&lt;/span&gt;). The actual instance of &lt;span style="font-family: courier new;"&gt;IDataLayer &lt;/span&gt;is created by either:&lt;br /&gt;
&lt;/t,u&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;the &lt;b&gt;entry point&lt;/b&gt; of the code that uses the business layer (an executable for instance). This is production code and it has to create the object connecting to the real database.&lt;/li&gt;
&lt;/ul&gt;&amp;nbsp; &lt;br /&gt;
&lt;div style="border: 1px solid rgb(0, 0, 128); color: black; font-family: 'Courier New',Courier,Monospace; font-size: 10pt;"&gt;&lt;div style="background-color: white; max-height: 300px; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="color: blue;"&gt;int&lt;/span&gt; &lt;span style="color: #010001;"&gt;_tmain&lt;/span&gt;(&lt;span style="color: blue;"&gt;int&lt;/span&gt; &lt;span style="color: #010001;"&gt;argc&lt;/span&gt;, &lt;span style="color: #010001;"&gt;_TCHAR&lt;/span&gt;* &lt;span style="color: #010001;"&gt;argv&lt;/span&gt;[])&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;// Create the concrete DataLayer object&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #010001;"&gt;DataLayer&lt;/span&gt; &lt;span style="color: #010001;"&gt;dataLayer&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;// Register it with the resolver&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #010001;"&gt;Resolver&lt;/span&gt;::&lt;span style="color: #010001;"&gt;Register&lt;/span&gt;&amp;lt;&lt;span style="color: #010001;"&gt;IDataLayer&lt;/span&gt;&amp;gt;(&lt;span style="color: #010001;"&gt;dataLayer&lt;/span&gt;);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #010001;"&gt;BusinessStuff&lt;/span&gt; &lt;span style="color: #010001;"&gt;businessStuff&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #010001;"&gt;businessStuff&lt;/span&gt;.&lt;span style="color: #010001;"&gt;DoStuff&lt;/span&gt;();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;the &lt;b&gt;unit-test code&lt;/b&gt;. The &lt;span style="font-family: courier new;"&gt;IDataLayer &lt;/span&gt;object in that case is a fake object that doesn't connect to the real database and therefore makes unit-tests easily reproducible and fast.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;div style="border: 1px solid rgb(0, 0, 128); color: black; font-family: 'Courier New',Courier,Monospace; font-size: 10pt;"&gt;&lt;div style="background-color: white; max-height: 300px; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="color: blue;"&gt;void&lt;/span&gt; &lt;span style="color: #010001;"&gt;BusinessStuffTest&lt;/span&gt;::&lt;span style="color: #010001;"&gt;DoStuff_Nominal_DoesNotRaiseException&lt;/span&gt;()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;// Arrange&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;// Create the concrete DataLayer object&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #010001;"&gt;FakeDataLayer&lt;/span&gt; &lt;span style="color: #010001;"&gt;dataLayer&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;// Register it with the resolver&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #010001;"&gt;Resolver&lt;/span&gt;::&lt;span style="color: #010001;"&gt;Register&lt;/span&gt;&amp;lt;&lt;span style="color: #010001;"&gt;IDataLayer&lt;/span&gt;&amp;gt;(&lt;span style="color: #010001;"&gt;dataLayer&lt;/span&gt;);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #010001;"&gt;BusinessStuff&lt;/span&gt; &lt;span style="color: #010001;"&gt;businessStuff&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;// Act&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #010001;"&gt;businessStuff&lt;/span&gt;.&lt;span style="color: #010001;"&gt;DoStuff&lt;/span&gt;();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;// Assert&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #010001;"&gt;dataLayer&lt;/span&gt;.&lt;span style="color: #010001;"&gt;AssertStuffWasDone&lt;/span&gt;();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
&lt;ul&gt;&lt;/ul&gt;&lt;b&gt;Implementation of the Resolver class &lt;/b&gt;&lt;br /&gt;
The &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Resolver &lt;/span&gt;class has two methods &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Register &lt;/span&gt;and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Resolve&lt;/span&gt;. Here is the code for the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Resolver&lt;/span&gt; class (very straightforward):&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;/ul&gt;&lt;br /&gt;
&lt;div style="border: 1px solid rgb(0, 0, 128); color: black; font-family: 'Courier New',Courier,Monospace; font-size: 10pt;"&gt;&lt;div style="background-color: white; max-height: 300px; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="color: blue;"&gt;#pragma&lt;/span&gt; &lt;span style="color: blue;"&gt;once&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: blue;"&gt;#include&lt;/span&gt; &lt;span style="color: #a31515;"&gt;&lt;map&gt;&lt;/map&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;#include&lt;/span&gt; &lt;span style="color: #a31515;"&gt;&lt;string&gt;&lt;/string&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: blue;"&gt;using&lt;/span&gt; &lt;span style="color: blue;"&gt;namespace&lt;/span&gt; &lt;span style="color: #010001;"&gt;std&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: green;"&gt;///&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: green;"&gt;/// Allows you to Register and Resolve global objects&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: green;"&gt;///&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #010001;"&gt;Resolver&lt;/span&gt;&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #010001;"&gt;map&lt;/span&gt;&amp;lt;&lt;span style="color: #010001;"&gt;string&lt;/span&gt;, &lt;span style="color: blue;"&gt;void&lt;/span&gt;* &amp;gt; &lt;span style="color: #010001;"&gt;typeInstanceMap&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: blue;"&gt;public&lt;/span&gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;template&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #010001;"&gt;T&lt;/span&gt;&amp;gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; &lt;span style="color: #010001;"&gt;Register&lt;/span&gt;(&lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: #010001;"&gt;T&lt;/span&gt;&amp;amp; &lt;span style="color: #010001;"&gt;object&lt;/span&gt;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #010001;"&gt;typeInstanceMap&lt;/span&gt;[&lt;span style="color: blue;"&gt;typeid&lt;/span&gt;(&lt;span style="color: #010001;"&gt;T&lt;/span&gt;).&lt;span style="color: #010001;"&gt;name&lt;/span&gt;()] = (&lt;span style="color: blue;"&gt;void&lt;/span&gt;*)&amp;amp;&lt;span style="color: #010001;"&gt;object&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;template&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: #010001;"&gt;T&lt;/span&gt;&amp;gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #010001;"&gt;T&lt;/span&gt;&amp;amp; &lt;span style="color: #010001;"&gt;Resolve&lt;/span&gt;()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt; *((&lt;span style="color: #010001;"&gt;T&lt;/span&gt;*)&lt;span style="color: #010001;"&gt;typeInstanceMap&lt;/span&gt;[&lt;span style="color: blue;"&gt;typeid&lt;/span&gt;(&lt;span style="color: #010001;"&gt;T&lt;/span&gt;).&lt;span style="color: #010001;"&gt;name&lt;/span&gt;()]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
};&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
This is a just a starting point. In production &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Resolver&lt;/span&gt; could do with methods such as &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Unregister()&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;IsRegistered()&lt;/span&gt;, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;UnregisterAll()&lt;/span&gt;...&lt;b&gt; &lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
An IoC container is one way to do dependency injection. Other ways include:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;pass the injected object using the constructor&lt;/li&gt;
&lt;li&gt;pass the injected object using a setter method&lt;/li&gt;
&lt;/ul&gt;Both methods above can become tedious very quickly in a big project. &lt;br /&gt;
I tried all 3 methods and I find the IoC approach scales rather well. I've used it for 10 months in a production project and it works nicely with unit tests.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Resources:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.dnrtv.com/default.aspx?showNum=68"&gt;Jean-Paul Boodhoo on the gateway pattern&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.dnrtv.com/default.aspx?showNum=126"&gt;Roll your own IoC container (dnrTV)&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://techbus.safaribooksonline.com/9781933988276"&gt;The Art of Unit-Testing&lt;/a&gt; where Roy Osherove tells everything about dependency injection and fake objects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-1687702068862265279?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/1687702068862265279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=1687702068862265279' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1687702068862265279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1687702068862265279'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2009/05/cheap-ioc-in-native-c.html' title='Cheap IoC in native C++'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-8906823438527163681</id><published>2009-11-08T21:49:00.001Z</published><updated>2009-11-08T21:58:23.426Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7'/><category scheme='http://www.blogger.com/atom/ns#' term='Vista'/><title type='text'>Windows 7 and the Press</title><content type='html'>I was replacing Windows 7 beta with Windows 7 Release Candidate on my laptop a few months ago... And I was joking with colleagues about the future success of this new version. Having used Vista for two years&lt;br /&gt;
&lt;a href="http://2.bp.blogspot.com/_QNxJ6n10eEU/Svc75vAS5RI/AAAAAAAAAEk/2UQG0SaR-8o/s1600-h/IWantItCauseItLooksBetterButIllWaitForThePressToSayItsBetter.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_QNxJ6n10eEU/Svc75vAS5RI/AAAAAAAAAEk/2UQG0SaR-8o/s400/IWantItCauseItLooksBetterButIllWaitForThePressToSayItsBetter.JPG" /&gt;&lt;/a&gt;Windows 7 didn't strike me as an earth-shattering evolution. Yet we predicted that people would rush on Windows 7 like bees on cupcakes for two main reasons:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;the press was very positive about Windows 7 after it slaughtered Vista&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;the Release Candidate was as good as the final thing and free to use until March 2010. In other words people could use a fully working OS for free for 10 months.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;I don't think Vista deserved the bad press it received. I used it for two years: RC1 and RC2 on an old PC then the RTM 32-bit and eventually 64-bit on my main machine.&lt;br /&gt;
Driver issues? A bit at the &lt;a href="http://golios.blogspot.com/search/label/Vista"&gt;beginning&lt;/a&gt; but nothing that couldn't be overcome.&lt;br /&gt;
Speed issues? &lt;b&gt;Desktop&lt;/b&gt;: nothing that I could notice on a 4GB dual-processor Dell with raid-striped 15000rpm SAS drives. &lt;b&gt;Laptop&lt;/b&gt;: browsing the web was fine, Visual studio was slow. After I moved to Windows 7 browsing the web was still fine and Visual Studio still slow.&lt;br /&gt;
&lt;br /&gt;
When I removed Vista 32-bit from my Vaio and installed Windows 7 RC, it indeed felt a bit snappier. But again, &lt;b&gt;ANY &lt;/b&gt;version of Windows feels snappier after a fresh install.&lt;br /&gt;
&lt;br /&gt;
Whether you run XP, Vista or Windows 7 the OS you're running on a machine does not matter as much as the following factors:&lt;br /&gt;
- how fresh the install is: &lt;b&gt;re-install your OS often&lt;/b&gt;, with a bit of &lt;a href="http://golios.blogspot.com/2009/10/how-to-re-build-your-pc-in-less-than-2.html"&gt;organisation &lt;/a&gt;it can be quick. &lt;br /&gt;
- the amount of RAM: &lt;b&gt;install more than you think you'll need&lt;/b&gt;.&lt;br /&gt;
- the hard drive speed: &lt;b&gt;one 15000rpm&lt;/b&gt; &lt;b&gt;drive&lt;/b&gt; &lt;b&gt;is good&lt;/b&gt;, &lt;b&gt;two are better&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I might oversimplify a bit, still I think there are mostly two reasons why you want to upgrade to a new OS:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;the untold one&lt;/b&gt;: it looks better than the previous version. &lt;/li&gt;
&lt;li&gt;&lt;b&gt;the one you tell people to look clever&lt;/b&gt;: the OS is faster, contains bug fixes and new useful features.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;Thanks to unbalanced press opinions Windows 7 at last gives people an excuse to cave in to the first reason while being covered by the second.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-8906823438527163681?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/8906823438527163681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=8906823438527163681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/8906823438527163681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/8906823438527163681'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2009/11/windows-7-and-press.html' title='Windows 7 and the Press'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_QNxJ6n10eEU/Svc75vAS5RI/AAAAAAAAAEk/2UQG0SaR-8o/s72-c/IWantItCauseItLooksBetterButIllWaitForThePressToSayItsBetter.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-6594496495966311380</id><published>2009-11-01T21:10:00.002Z</published><updated>2010-05-20T19:39:32.583+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Books'/><title type='text'>Books I currently flip through #7</title><content type='html'>&lt;span style="font-weight: bold"&gt;Technology&lt;/span&gt;   &lt;br /&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://techbus.safaribooksonline.com/9780321612366"&gt;Effective REST Services via .NET: For .NET Framework 3.5&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://techbus.safaribooksonline.com/9780596157210"&gt;Programming WCF Services, 2nd Edition &lt;/a&gt;&lt;span style="font-weight: bold"&gt;&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;span style="font-weight: bold"&gt;Methods&lt;/span&gt;   &lt;br /&gt;  &lt;ul&gt;   &lt;li&gt;Apprenticeship Patterns, 1st Edition      &lt;br /&gt;&lt;a href="http://www.amazon.co.uk/gp/product/0596518382?ie=UTF8&amp;amp;tag=codiinlond-21&amp;amp;link_code=as3&amp;amp;camp=2506&amp;amp;creative=9298&amp;amp;creativeASIN=0596518382" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_QNxJ6n10eEU/S_WAbyxBZaI/AAAAAAAAAHs/js2H6GYGJxk/image%5B24%5D.png?imgmax=800" width="126" height="164" /&gt;&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;span style="font-weight: bold"&gt;Finance&lt;span id="goog_1257110163478"&gt;&lt;/span&gt;&lt;span id="goog_1257110163479"&gt;&lt;/span&gt;&lt;a href="http://www.blogger.com/"&gt;&lt;/a&gt;&lt;/span&gt;   &lt;br /&gt;  &lt;ul&gt;   &lt;li&gt;The (Mis)behaviour of Markets (Benoit Mandelbrot)      &lt;br /&gt;&lt;a href="http://www.amazon.co.uk/gp/product/1846682622?ie=UTF8&amp;amp;tag=codiinlond-21&amp;amp;link_code=as3&amp;amp;camp=2506&amp;amp;creative=9298&amp;amp;creativeASIN=1846682622" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_QNxJ6n10eEU/S_WAcmnvTsI/AAAAAAAAAHw/4sQFm9BYVoM/image%5B25%5D.png?imgmax=800" width="110" height="164" /&gt;&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div style="text-align: center; clear: both" class="separator"&gt;&amp;#160; &lt;br /&gt;&lt;/div&gt; &lt;b&gt;Others&lt;/b&gt;   &lt;br /&gt;  &lt;ul&gt;   &lt;li&gt;Blink (Malcolm Gladwell)      &lt;br /&gt;&lt;a href="http://www.amazon.co.uk/gp/product/0141014598?ie=UTF8&amp;amp;tag=codiinlond-21&amp;amp;link_code=as3&amp;amp;camp=2506&amp;amp;creative=9298&amp;amp;creativeASIN=0141014598" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_QNxJ6n10eEU/S_WAddTAEMI/AAAAAAAAAH0/A4B1s4KAd10/image%5B26%5D.png?imgmax=800" width="106" height="164" /&gt;&lt;/a&gt; &lt;b&gt;&lt;/b&gt;&lt;/li&gt;    &lt;li&gt;The Black Swan (Nassim Nicholas Thaleb)      &lt;br /&gt;&lt;a href="http://www.amazon.co.uk/gp/product/0141034599?ie=UTF8&amp;amp;tag=codiinlond-21&amp;amp;link_code=as3&amp;amp;camp=2506&amp;amp;creative=9298&amp;amp;creativeASIN=0141034599" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_QNxJ6n10eEU/S_WAevk9BNI/AAAAAAAAAH4/b0RiJgoN4i0/image%5B27%5D.png?imgmax=800" width="108" height="164" /&gt;&lt;/a&gt;       &lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-6594496495966311380?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/6594496495966311380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=6594496495966311380' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6594496495966311380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6594496495966311380'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2009/11/books-i-currently-flip-through-7.html' title='Books I currently flip through #7'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_QNxJ6n10eEU/S_WAbyxBZaI/AAAAAAAAAHs/js2H6GYGJxk/s72-c/image%5B24%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-4883271953392046358</id><published>2009-11-01T13:12:00.000Z</published><updated>2009-11-01T13:12:35.556Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Build'/><title type='text'>Trying out TeamCity and CruiseControl</title><content type='html'>A few teams use Cruise Control at work. It seems to be a fairly standard choice when it comes to continuous integration. Roy Osherove recommends &lt;a href="http://5whys.com/blog/be-productive-and-stop-using-xml.html"&gt;TeamCity&lt;/a&gt; over CruiseControl because he doesn't like getting his hands dirty with XML configuration (can't blame him).&lt;br /&gt;
&lt;br /&gt;
I tried both to get a feel of what you can do with them. I ran TeamCity of my main machine and CruiseControl on a VM to avoid clashes.&lt;br /&gt;
&lt;br /&gt;
I managed to get a build running in TeamCity without too much difficulty. I installed the tray notifier.&lt;br /&gt;
&lt;br /&gt;
CruiseControl is a bit more tricky. After I edited the config files I kept getting exceptions when trying to startup ccnet.exe. Had to go through several install iterations before getting something running.&lt;br /&gt;
&lt;br /&gt;
Installing TeamCity: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Install Tortoise SVN&lt;/li&gt;
&lt;li&gt;Install VisualSVN Server&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Run the TeamCity installer&lt;/li&gt;
&lt;li&gt;Start the build agent manually (rather than through a Windows service).&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Install the TeamCity Windows tray notifier&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
Installing Cruise Control inside a virtual machine.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/windows/virtual-pc/download.aspx"&gt;Windows Virtual PC RC&lt;/a&gt;, wich is a new version of Virtual PC for Windows 7. &lt;/li&gt;
&lt;li&gt;Install Virtual Server 2008&lt;/li&gt;
&lt;li&gt;Install &lt;a href="http://www.sliksvn.com/en/download"&gt;SVN command line&lt;/a&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Edit the &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Project+Configuration+Block"&gt;ccnet.config&lt;/a&gt; file&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Added a &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Project+Configuration+Block"&gt;project block&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Added a &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Subversion+Source+Control+Block"&gt;source control block&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Added a &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Visual+Studio+Task"&gt;tasks block&lt;/a&gt;. &lt;b&gt;Good news&lt;/b&gt;: you can add &lt;devenv&gt; task where you simply run devenv.exe against the solution file.&amp;nbsp;&lt;/devenv&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Get the Web Dashboard working: &lt;br /&gt;
&lt;/li&gt;

&lt;ul&gt;&lt;li&gt;Install IIS: under Windows Server 2008, it's not a Windows feature any more, it's a server role. You have to go to &lt;b&gt;Server Manager &amp;gt; Roles &amp;gt; Add Roles&lt;/b&gt; and follow the wizard to &lt;a href="http://learn.iis.net/page.aspx/29/installing-iis-70-on-windows-server-2008/"&gt;add IIS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Run the CruiseControl.Net installer &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Create a new application in IIS for the ccnet webdashboard. In &lt;b&gt;Server Manager&lt;/b&gt;, go &lt;b&gt;Roles &amp;gt; Web Server (IIS) &amp;gt; Internet Information Services&lt;/b&gt;, open &lt;b&gt;Sites &amp;gt; Default Web Site&lt;/b&gt;. Right-click &lt;b&gt;Default Web Site&lt;/b&gt; and choose &lt;b&gt;Add Application&lt;/b&gt;. Set &lt;b&gt;Application Pool&lt;/b&gt; to Classic .NET AppPool.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;&lt;span id="goog_1255379086458"&gt;&lt;/span&gt;&lt;span id="goog_1255379086459"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.microsoft.com/windows/virtual-pc/download.aspx"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-4883271953392046358?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/4883271953392046358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=4883271953392046358' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/4883271953392046358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/4883271953392046358'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2009/11/trying-out-teamcity-and-cruisecontrol.html' title='Trying out TeamCity and CruiseControl'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-2293910667333003098</id><published>2009-10-30T23:52:00.001Z</published><updated>2009-10-30T23:53:18.270Z</updated><title type='text'>How to re-build your PC in less than 2 hours</title><content type='html'>&lt;b&gt;Pre-requisites:&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Your data on D:, the OS on C: &lt;/li&gt;
&lt;li&gt;Your backup ready (nothing to do because you have an automatic full D-drive incremental back-up scheduled to run every day )&lt;/li&gt;
&lt;li&gt;Your CD case with all legally acquired original CDs for software and drivers&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Access to the spreadsheet where you carefully store all serials for the above.&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;Go: &lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Boot from DVD&lt;/li&gt;
&lt;li&gt;Format C:.&lt;/li&gt;
&lt;li&gt;Click Next, OK, next, Ok, I agree, OK, Next, London GMT&lt;/li&gt;
&lt;li&gt;Install your favorite software. For me it is: &lt;br /&gt;
&lt;/li&gt;

&lt;ol&gt;&lt;li&gt;Kaspersky&lt;/li&gt;
&lt;li&gt;Office&lt;/li&gt;
&lt;li&gt;Chrome, Firefox&lt;/li&gt;
&lt;li&gt;Skype, Live Messenger&lt;/li&gt;
&lt;li&gt;Visual Studio&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;Check the time: if it took you more than 2 hours, start all over again. &lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-2293910667333003098?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/2293910667333003098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=2293910667333003098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/2293910667333003098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/2293910667333003098'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2009/10/how-to-re-build-your-pc-in-less-than-2.html' title='How to re-build your PC in less than 2 hours'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-6134405612940662491</id><published>2009-09-27T16:28:00.104+01:00</published><updated>2009-10-01T21:29:26.756+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Reading the SQL Server Execution Plan</title><content type='html'>We're having a pretty good weather in London: still sunny and about 18C. I took the bicycle to Hampstead Heath with the VAIO in the rucksack and started looking into SQL performance tuning, as you do.&lt;br /&gt;
&lt;br /&gt;
Went through &lt;a href="http://techbus.safaribooksonline.com/9781430219026%20"&gt;&lt;span style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span style="font-family: verdana,sans-serif; font-size: 11px; font-weight: bold;"&gt;SQL Server 2008 Query Performance Tuning Distilled&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; in Safari.&lt;br /&gt;
&lt;br /&gt;
Here are a few reading notes...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;b&gt;What are the different &lt;a href="http://techbus.safaribooksonline.com/9781430219026/sql_query_performance_analysis#X2ludGVybmFsX1NlY3Rpb25Db250ZW50P3htbGlkPTk3ODE0MzAyMTkwMjYvZXhlY3V0aW9uX3BsYW5z"&gt;types of joins&lt;/a&gt;?&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;nested loop join: &lt;/b&gt;the most intuitive one.&lt;b&gt; &lt;/b&gt;This is the sort of join you would write if you were to code it in C++: iterate over the smallest table first and for each row, look for a match in the other table. Efficient only if the first input is small, and the second is large and indexed.&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;hash join: &lt;/b&gt;used if the largest input is &lt;b&gt;not &lt;/b&gt;indexed. This is done in two steps:&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;step 1: &lt;/b&gt;builds a hash table with the smallest of both inputs. This hash table uses a hash function to associate a value in the joined column with an index to a bucket. Go through the whole input row by row and add each row to its appropriate bucket using the hash function.&lt;br /&gt;
&lt;b&gt;step 2&lt;/b&gt;: go through the second input row by row. For each value in the joined column, work out the index to the bucket in the hash table using the hash function. If a row is present, then there is a match and the row is kept in the result set.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;merge join: &lt;/b&gt;used if an index exists&lt;b&gt; &lt;/b&gt;on the join columns of both tables. The join columns are sorted in both tables using the indexes. Then comparing columns is relatively fast because it takes advantage of the ordering.&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;What is a &lt;a href="http://techbus.safaribooksonline.com/9781430219026/nonclustered_indexes#snippet"&gt;RID Lookup&lt;/a&gt;?&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;If a table does not have a clustered index, data pages are on the heap.&lt;/li&gt;
&lt;li&gt;If a table has a clustered index, they are inside the clustered index.&lt;/li&gt;
&lt;/ul&gt;Non clustered indexes contain pointers to table rows: this pointer is either &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;a &lt;b&gt;RID&lt;/b&gt; (Row ID) if the table is on the heap &lt;/li&gt;
&lt;li&gt;or a &lt;b&gt;clustered index key&lt;/b&gt; if the table has a clustered index.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
A RID lookup takes place on a heap table (table without clustered index). In order to locate data using a non clustered index SQL Server uses the RID to locate the data row in the heap. A RID lookup is costly because it involves an extra page read (on top of the page read needed for the non clustered index). You wouldn't get this extra page read with a clustered index.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;How to see the execution plan directly from the SQL profiler?&lt;/b&gt;&lt;br /&gt;
This is very handy! No need to try and re-run a slow query in SSMS. Simply track the event &lt;i&gt;ShowPlan XML&lt;/i&gt; in SQL Profiler under the &lt;b&gt;Performance&lt;/b&gt; group. When you run the trace you can see the &lt;b&gt;actual&lt;/b&gt; execution plan of any statement. The plan is displayed in a graphical way as in SSMS.&lt;br /&gt;
Warning, &lt;b&gt;not to be used in production&lt;/b&gt;! It slows down the performance of the database quite a lot.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;More about indexes:&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://www.blogger.com/goog_1254343463380"&gt;Index A&lt;span id="goog_1254343463375"&gt;&lt;/span&gt;&lt;span id="goog_1254343463376"&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href="http://techbus.safaribooksonline.com/9781430219026/index_analysis"&gt;nalysis&lt;/a&gt; &lt;br /&gt;
&lt;a href="http://techbus.safaribooksonline.com/9781430219026/index_analysis#X2ludGVybmFsX1NlY3Rpb25Db250ZW50P3htbGlkPTk3ODE0MzAyMTkwMjYvaW5kZXhfZGVzaWduX3JlY29tbWVuZGF0aW9ucw=="&gt;Index Design Recommendations&amp;nbsp;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Other resources:&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/ms177500.aspx"&gt; Checklist for analysing slow-running queries&lt;/a&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://www.blogger.com/goog_1254343463380"&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.blogger.com/goog_1254343463380"&gt;&lt;br /&gt;
&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-6134405612940662491?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/6134405612940662491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=6134405612940662491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6134405612940662491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6134405612940662491'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2009/09/sql-server-performance.html' title='Reading the SQL Server Execution Plan'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-5194425787081835843</id><published>2009-09-06T20:12:00.027+01:00</published><updated>2009-09-08T20:50:36.236+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XPath'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>Using XML in SQL Server</title><content type='html'>&lt;span style="font-size: small;"&gt;&lt;span style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span style="font-family: Arial; font-size: 21px; font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
Investigating the possibilities around storing and retrieving native XML data in SQL Server... &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms345117%28SQL.90%29.aspx"&gt;XML Support in SQL Server 2005&lt;/a&gt; &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/library/ms345115%28SQL.90%29.aspx#sql25xmlbp_topic5"&gt;XML Best Practices for Microsoft SQL Server 2005&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms189075%28SQL.90%29.aspx"&gt; XQuery Against the xml Data Type&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms190262%28SQL.90%29.aspx"&gt;XQuery Basics&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms345118%28SQL.90%29.aspx"&gt;Performance Optimizations for the XML Data Type in SQL Server 2005&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;... and looking into table partitioning&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms345146%28SQL.90%29.aspx"&gt;Partitioned Tables and Indexes in SQL Server 2005&lt;/a&gt; &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms180767%28SQL.90%29.aspx"&gt;Planning Guidelines for Partitioned Tables and Indexes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms191174%28SQL.90%29.aspx"&gt;Designing Partitions to Manage Subsets of Data&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-5194425787081835843?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/5194425787081835843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=5194425787081835843' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5194425787081835843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5194425787081835843'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2009/09/using-xml-in-sql-server.html' title='Using XML in SQL Server'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-1878623709366013918</id><published>2009-06-20T11:38:00.010+01:00</published><updated>2009-08-23T22:13:37.532+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Books'/><title type='text'>Books I currently flip through #6</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Methods&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://my.safaribooksonline.com/0321437381"&gt;Implementing Lean Software Development&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://techbus.safaribooksonline.com/0321150783?tocview=true"&gt;Lean Software Development: An Agile Toolkit&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href="http://my.safaribooksonline.com/9780735626096"&gt;Microsoft .NET - Architecting Applications for the Enterprise&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://techbus.safaribooksonline.com/0131016490?tocview=true"&gt;Test Driven Development: A Practical Guide&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://techbus.safaribooksonline.com/0321269349"&gt;Fit for developing Software: Framework for Integrated Tests&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://techbus.safaribooksonline.com/9780596527679"&gt;The Art of Agile Development&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Finance&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.word-power.co.uk/books/the-mis-behaviour-of-markets-I9781846682629/"&gt;The (Mis)behaviour of Markets (Benoit Mandelbrot)
&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.co.uk/dp/014103548X/?tag=googhydr-21&amp;amp;hvadid=4233279789&amp;amp;ref=pd_sl_jgrz9dkww_e"&gt;The Ascent of Money&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-1878623709366013918?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/1878623709366013918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=1878623709366013918' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1878623709366013918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1878623709366013918'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2009/06/books-i-currently-flip-through-5.html' title='Books I currently flip through #6'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-8297679207363504215</id><published>2009-06-17T23:22:00.000+01:00</published><updated>2010-05-20T15:16:20.870+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XPath'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><title type='text'>XPath</title><content type='html'>XPath came handy lately as I needed to look-up an in-memory XML document.   &lt;br /&gt;I know it's probably smoother with Linq to Xml but my project had to compile under VS2005 so I used the .NET 2.0 library which does not contain Linq but contains XPath.   &lt;br /&gt;  &lt;br /&gt;Starting from the following xml file:   &lt;br /&gt;  &lt;br /&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:56722a48-7b65-4f75-b0dd-3ddc4a405352" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px; white-space: nowrap"&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515"&gt;xml&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;version&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;encoding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;?&amp;gt;&lt;/span&gt;&lt;br&gt; &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;pigs&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;   &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;piggy&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;infected&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;false&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;bob&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;   &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;piggy&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;infected&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;false&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;alfred&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;   &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;piggy&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;infected&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;true&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt; =&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;rodrigo&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;disease&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;swine flu&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;disease&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;boredom&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;disease&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;pig blues&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;confidential&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;phonenumber&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;01234546576&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;phonenumber&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;   &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;piggy&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt; &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;pigs&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;br /&gt;  &lt;br /&gt;&lt;span style="font-weight: bold"&gt;To load the XML in memory:&lt;/span&gt;   &lt;br /&gt;  &lt;br /&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: rgb(43,145,175)"&gt;XmlDocument&lt;/span&gt; doc = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43,145,175)"&gt;XmlDocument&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;try&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;doc.Load(&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;piggy.xml&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;catch&lt;/span&gt; (&lt;span style="color: rgb(43,145,175)"&gt;XmlException&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: rgb(43,145,175)"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;Could not load the file. Detail: &amp;quot;&lt;/span&gt; + e.Message);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;br /&gt;  &lt;br /&gt;&lt;span style="font-weight: bold"&gt;To query elements based on their name:&lt;/span&gt;   &lt;br /&gt;  &lt;br /&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: rgb(43,145,175)"&gt;XmlNodeList&lt;/span&gt; allPigs = doc.SelectNodes(&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;/pigs/piggy&amp;quot;&lt;/span&gt;); &lt;span style="color: green"&gt;// Returns all nodes called 'piggy' located inside the root-level node called 'pigs'.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: rgb(43,145,175)"&gt;XmlNode&lt;/span&gt; node &lt;span style="color: blue"&gt;in&lt;/span&gt; allPigs)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: rgb(43,145,175)"&gt;Console&lt;/span&gt;.WriteLine(node.Name + &lt;span style="color: rgb(163,21,21)"&gt;&amp;quot; &amp;quot;&lt;/span&gt; + node.Attributes[&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;].Value);&lt;/p&gt; &lt;/div&gt;  &lt;br /&gt;  &lt;br /&gt;&lt;span style="font-weight: bold"&gt;To query elements based on their attribute name:&lt;/span&gt;   &lt;br /&gt;&lt;span style="font-family: courier new"&gt;   &lt;br /&gt;    &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;     &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;// Returns only infected pigs&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: rgb(43,145,175)"&gt;XmlNodeList&lt;/span&gt; infectedPigs = doc.SelectNodes(&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;/pigs/piggy[@infected='true']&amp;quot;&lt;/span&gt;); &lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: rgb(43,145,175)"&gt;XmlNode&lt;/span&gt; node &lt;span style="color: blue"&gt;in&lt;/span&gt; infectedPigs)&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: rgb(43,145,175)"&gt;Console&lt;/span&gt;.WriteLine(node.Name + &lt;span style="color: rgb(163,21,21)"&gt;&amp;quot; &amp;quot;&lt;/span&gt; + node.Attributes[&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;].Value);&lt;/p&gt;   &lt;/div&gt;    &lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold"&gt;To return a single node (same query as above but only one node is expected):    &lt;br /&gt;&lt;/span&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;// Returns the single infected pig&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: rgb(43,145,175)"&gt;XmlNode&lt;/span&gt; infectedPig = doc.SelectSingleNode(&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;/pigs/piggy[@infected='true']&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (infectedPig != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: rgb(43,145,175)"&gt;Console&lt;/span&gt;.WriteLine(infectedPig.Name + &lt;span style="color: rgb(163,21,21)"&gt;&amp;quot; &amp;quot;&lt;/span&gt; + infectedPig.Attributes[&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;].Value);&lt;/p&gt; &lt;/div&gt;  &lt;br /&gt;&lt;span style="font-weight: bold"&gt;To do a query relative to the current node:&lt;/span&gt;   &lt;br /&gt;All queries above were made relative to the top of the document. But it you call SelectNodes against an XmlNode, you can do a query relative to that node. Just ommit the '/':   &lt;br /&gt;  &lt;br /&gt;  &lt;div style="background: white; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial" color="black" size="10pt" face="Courier New"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: green"&gt;// Query relative to the current node. Returns all diseases for the infected pig&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: rgb(43,145,175)"&gt;XmlNodeList&lt;/span&gt; diseases = infectedPig.SelectNodes(&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;disease&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;foreach&lt;/span&gt; (&lt;span style="color: rgb(43,145,175)"&gt;XmlNode&lt;/span&gt; node &lt;span style="color: blue"&gt;in&lt;/span&gt; diseases)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: rgb(43,145,175)"&gt;Console&lt;/span&gt;.WriteLine(node.Name + &lt;span style="color: rgb(163,21,21)"&gt;&amp;quot; &amp;quot;&lt;/span&gt; + node.Attributes[&lt;span style="color: rgb(163,21,21)"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;].Value);&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;   &lt;br /&gt;&lt;guineapig&gt;    &lt;br /&gt;&lt;span style="font-weight: bold"&gt;Resources:&lt;/span&gt;     &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa926473.aspx"&gt;MSDN: XPath Syntax&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb943906.aspx"&gt;LINQ to XML queries&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms345117(SQL.90).aspx" target="_blank"&gt;XML Support in SQL Server 2005&lt;/a&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt; &lt;/guineapig&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-8297679207363504215?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/8297679207363504215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=8297679207363504215' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/8297679207363504215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/8297679207363504215'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2009/05/xpath.html' title='XPath'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-5994516483742090265</id><published>2009-05-31T22:01:00.005+01:00</published><updated>2009-06-06T22:15:06.071+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Webforms vs MVC (London .NET User Group)</title><content type='html'>100 people listened to &lt;a href="http://serialseb.blogspot.com/"&gt;Sebastien Lambla&lt;/a&gt; and &lt;a href="http://weblogs.asp.net/Plip/"&gt;Phil Wistanley&lt;/a&gt; at the Microsoft customer centre in Victoria.

They talked for 2 hours without a break. Two hours is a long time but the formula they adopted was entertaining and fun.
Seb was supporting MVC, Phil Webforms. They kept rotating at the mike, going through humorous slides, throwing jokes at each other and interacting with the audience.

Seb:
&lt;ul&gt;&lt;li&gt;Webforms has a tendency to hide HTML and actually generates a lot of goo. &lt;/li&gt;&lt;li&gt;MVC relies on you knowing HTML but once you learn it, things get pretty easy.&lt;/li&gt;&lt;li&gt;Webform's page lifecycle is complex&lt;/li&gt;&lt;li&gt;Webforms is for morons.
&lt;/li&gt;&lt;/ul&gt; Phil:
&lt;ul&gt;&lt;li&gt;MVC is too complicated,&lt;/li&gt;&lt;li&gt;Webforms has a lot of ready-made controls, lots of 3rd party vendors&lt;/li&gt;&lt;li&gt;Uses a familiar event model&lt;/li&gt;&lt;li&gt;MVC is for hippies.
&lt;/li&gt;&lt;/ul&gt;To sum it up, Webforms is for building apps quickly (better suited for the financial world), MVC is good if you need a high level of quality and testability.

&lt;span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;font-family:'Times New Roman';font-size:16;"  &gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: rgb(80, 0, 80);font-family:arial;font-size:13;"  &gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-5994516483742090265?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/5994516483742090265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=5994516483742090265' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5994516483742090265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5994516483742090265'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2009/05/webforms-vs-mvc-london-net-user-group.html' title='Webforms vs MVC (London .NET User Group)'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-3415216204089074921</id><published>2009-05-14T21:22:00.011+01:00</published><updated>2009-05-29T21:49:20.383+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++/CLI'/><title type='text'>C++/CLI Cheat Sheet</title><content type='html'>My C++/CLI pocket reference...
&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Declare a string&lt;/span&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:courier new;"&gt;&lt;div    style="background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;p style="margin: 0px;"&gt;    System::String^ myString = &lt;span style="color: rgb(163, 21, 21);"&gt;""&lt;/span&gt;;&lt;/p&gt;&lt;/div&gt;&lt;/span&gt;&lt;ul style="font-weight: bold;"&gt;&lt;li&gt;Declare a null reference&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:courier new;"&gt;&lt;div    style="background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;p style="margin: 0px;"&gt;    System::String^ myString = &lt;span style="color:blue;"&gt;nullptr&lt;/span&gt;;&lt;/p&gt;
&lt;/div&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Pass a string by reference&lt;/span&gt; to a method (the reference to the string will be modified, not the string itself since strings are immutable). Use %:
&lt;/li&gt;&lt;/ul&gt;
&lt;div    style="background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;void&lt;/span&gt; MyMethod(System::String^% myString)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;{&lt;/p&gt;&lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;ul style="font-weight: bold;"&gt;&lt;li&gt;Declare an array of strings&lt;/li&gt;&lt;/ul&gt;
&lt;div    style="background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;pre style="margin: 0px;"&gt;    cli::&lt;span style="color:blue;"&gt;array&lt;/span&gt;&amp;lt;System::String^&amp;gt;^ stringArray = &lt;span style="color:blue;"&gt;gcnew&lt;/span&gt; cli::&lt;span style="color:blue;"&gt;array&lt;/span&gt;&amp;lt;System::String^&amp;gt;{&lt;span style="color: rgb(163, 21, 21);"&gt;"Skype"&lt;/span&gt;,&lt;span style="color: rgb(163, 21, 21);"&gt;"Blogger"&lt;/span&gt;};&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Declare a managed member&lt;/span&gt; inside a native class&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:courier new;"&gt;&lt;div    style="background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;div    style="background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;class&lt;/span&gt; IAmNative&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;    gcroot&amp;lt;IAmManaged^ &amp;gt; managedMember;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt;:&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;    IAmNative():managedMember(&lt;span style="color:blue;"&gt;gcnew&lt;/span&gt; IAmManaged())&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;    {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;    }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;};&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Declare a managed member that will self destroy&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;div    style="background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;#include&lt;/span&gt; &lt;span style="color: rgb(163, 21, 21);"&gt;&amp;lt;msclr\auto_gcroot.h&amp;gt;&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;class&lt;/span&gt; IAmStillNative&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;    msclr::auto_gcroot&amp;lt;IAmStillManaged^&amp;gt; managedMember; &lt;span style="color:green;"&gt;// Will be disposed when IAmStillNative is destroyed&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt;:&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;    IAmStillNative():managedMember(&lt;span style="color:blue;"&gt;gcnew&lt;/span&gt; IAmStillManaged())&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;    {&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;    }&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;};&lt;/pre&gt;&lt;/div&gt;
&lt;ul style="font-weight: bold;"&gt;&lt;li&gt;Convert a native STL string to a managed string&lt;/li&gt;&lt;/ul&gt;
&lt;div    style="background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;pre style="margin: 0px;"&gt;System::String^ ToManaged(&lt;span style="color:blue;"&gt;const&lt;/span&gt; std::string&amp;amp; nativeString)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;    &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;gcnew&lt;/span&gt; System::String(nativeString.c_str());&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;  &lt;ul style="font-weight: bold;"&gt;&lt;li&gt;The same backwards:&lt;/li&gt;&lt;/ul&gt;&lt;div style="background: white none repeat scroll 0% 0%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;p style="margin: 0px;"&gt;
&lt;/p&gt;&lt;div style="background: white none repeat scroll 0% 0%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;pre style="margin: 0px;"&gt;std::string ToNative(System::String^ managedString)&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;   &lt;span style="color:blue;"&gt;char&lt;/span&gt;* str = (&lt;span style="color:blue;"&gt;char&lt;/span&gt;*)(&lt;span style="color:blue;"&gt;void&lt;/span&gt;*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(managedString).ToPointer();&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;   std::string result(str);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt; &lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;   System::Runtime::InteropServices::Marshal::FreeHGlobal((System::IntPtr)str);&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;   &lt;span style="color:blue;"&gt;return&lt;/span&gt; result;&lt;/pre&gt;&lt;pre style="margin: 0px;"&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;Things you can do
&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Instantiate managed types, call managed methods from native code provided it compiles with /CLR.
&lt;/li&gt;&lt;li&gt;Instantiate native types, call native methods from managed code
&lt;/li&gt;&lt;li&gt;Link to the native types of a mixed static lib (/clr)&lt;/li&gt;&lt;li&gt;Declare managed methods that have native types in their signature&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Things you can't do
&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Link to the managed types of a mixed static lib
&lt;/li&gt;&lt;li&gt;Link to managed types in a DLL if those managed types have methods with native types in their signature.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-3415216204089074921?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/3415216204089074921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=3415216204089074921' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3415216204089074921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3415216204089074921'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2009/05/ccli-cheat-sheet.html' title='C++/CLI Cheat Sheet'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-1228723448734345537</id><published>2009-04-28T22:04:00.010+01:00</published><updated>2009-05-25T14:04:06.550+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>First Contact with DevExpress</title><content type='html'>Recently I had the opportunity to use DevExpress controls for WinForms.

Overall I wouldn't say those controls save you time if you compare with regular Windows Forms controls. The time you save in coding you spend it reading documentation and experimenting with the controls. However the results are definitely superior to WinForms: better looking and with plenty of niceties that come for free (grouping, sorting, customizing, dragging and dropping, advanced tooltips, etc...)

The controls I used to far:
&lt;ul&gt;&lt;li style="font-weight: bold;"&gt;GridControl&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;VGridControl&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;PropertyGridControl&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;TreeList&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;GridControl&lt;/span&gt;
Comes with plenty of default features such as very powerful grouping and filtering options accessible to users at runtime. To populate it, simply set its DataSource to a DataTable or an IList&lt;t&gt;&lt;t&gt;&lt;t&gt;.
&lt;ul&gt;&lt;li&gt;If all you do is setting the DataSource then the control doesn't know anything about the data layer, which is good.&lt;/li&gt;&lt;li&gt;However if you add columns from the designer (either manually or from a datasource) then you create a tight coupling with the data layer, which might be ok depending in the type of app you're creating. I find the designer is great for discovering functionality but when given a choice, it is better to write code: this avoids having the UI know too much about the data.
&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;VGridControl&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;and &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;PropertyGridControl&lt;/span&gt;
&lt;/t&gt;From a distance &lt;t&gt;VGridControl looks like a Property grid control. The main difference is you can display many records at a time while a property grid control displays a single record.
&lt;ul&gt;&lt;li&gt;Both theVGridControl and PropertyGridControl use reflection to display the properties of an object. &lt;/li&gt;&lt;li&gt;For some reason PropertyGridControl works fine for public properties with exotic types (such as collections) while VerticalGridControl simply doesn't display collection properties -unless there is something I missed...&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;TreeList&lt;/span&gt;
The first column contains the tree, the other columns display data in a grid. Handy when each node of the tree contains usefull info and you don't want users to click each node to see the info. Instead you display the info directly in the grid and users can sort and filter as they see fit.


&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_QNxJ6n10eEU/ShqXFFSr7nI/AAAAAAAAAEE/sbVhUf8kQW0/s1600-h/DevExpress.JPG"&gt;&lt;img style="cursor: pointer; width: 400px; height: 164px;" src="http://4.bp.blogspot.com/_QNxJ6n10eEU/ShqXFFSr7nI/AAAAAAAAAEE/sbVhUf8kQW0/s400/DevExpress.JPG" alt="" id="BLOGGER_PHOTO_ID_5339746421776838258" border="0" /&gt;&lt;/a&gt;
&lt;t&gt;&lt;t&gt;&lt;t&gt;
Most of the effort with the DevExpress controls is working out what they do. Two main sources:
&lt;ul&gt;&lt;li&gt;The DemoCenter that comes with the DevExpress install
&lt;/li&gt;&lt;li&gt;The blonde and brunette from &lt;a href="http://tv.devexpress.com/"&gt;DevExpress TV&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-1228723448734345537?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/1228723448734345537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=1228723448734345537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1228723448734345537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1228723448734345537'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2009/04/my-favorite-devexpress-controls.html' title='First Contact with DevExpress'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_QNxJ6n10eEU/ShqXFFSr7nI/AAAAAAAAAEE/sbVhUf8kQW0/s72-c/DevExpress.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-6666971323678734871</id><published>2008-12-30T12:14:00.000Z</published><updated>2010-01-21T20:52:02.978Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>T-SQL vs PL-SQL</title><content type='html'>&lt;div&gt;&amp;quot;Oracle PL-SQL is the same as Microsoft T-SQL. If you know one, you know the other&amp;quot;   &lt;br /&gt;&lt;/div&gt;  &lt;div&gt;&lt;/div&gt;  &lt;br /&gt;  &lt;div&gt;Not really.&lt;/div&gt;  &lt;div&gt;&lt;/div&gt; Here are a few differences, some of them can have a serious impact of the way you write sproc code.  &lt;br /&gt;  &lt;br /&gt;  &lt;div&gt;&lt;/div&gt; Good:  &lt;br /&gt;  &lt;ul&gt;   &lt;li&gt;T-SQL: &lt;span style="font-weight: bold"&gt;stored procedures return result sets&lt;/span&gt; very easily: all you have to do is write a select statement without any 'INTO'. PL-SQL: you have to select into a ref cursor and define this ref cursor as output parameter.&lt;/li&gt; &lt;/ul&gt; Bad:  &lt;br /&gt;  &lt;ul&gt;   &lt;li&gt;T-SQL: &lt;span style="font-weight: bold"&gt;stored procedures do not rollback&lt;/span&gt; automatically if something fails. Until SQL Server 2005 you had to test @@ERROR after each and every statement and goto a handler to rollback. Ugly, tedious and error-prone. In 2005 you can use a TRY CATCH, which is much more elegant. However you still have to rollback explicitly      &lt;br /&gt;PL-SQL: sprocs are atomic. Any error inside a sproc rolls everything back up to the point where the sproc was called.&lt;/li&gt;    &lt;li&gt;T-SQL: &lt;span style="font-weight: bold"&gt;no %TYPE&lt;/span&gt;! You can't refer to the type of a column without repeating it.&lt;/li&gt;    &lt;li&gt;T-SQL: &lt;span style="font-weight: bold"&gt;RAISERROR does not break the flow&lt;/span&gt;. It simply returns an error string or message but the sproc still returns normally. Unless you use it within a TRY block, in which case the flow is diverted to the CATCH block (for SQL 2005 and beyond). Depending on the severity level you specify, RAISERROR within a TRY block either&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;returns an error number without breaking the flow&lt;/li&gt;      &lt;li&gt;jumps to the CATCH block&lt;/li&gt;      &lt;li&gt;breaks the current database connection (wow!) (provided you have sysadmin role)&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;PL-SQL: raise_application_error throws an exception, exits the current sproc, rolls back till implicit savepoint at the beginning of the sproc...&lt;/li&gt; &lt;/ul&gt; Other differences:  &lt;br /&gt;  &lt;ul&gt;   &lt;li&gt;Oracle does not have a &lt;span style="font-weight: bold"&gt;BOOLEAN &lt;/span&gt;column type, although you can define a BOOLEAN variable in PL/SQL. SQL Server has a &lt;span style="font-weight: bold"&gt;BIT &lt;/span&gt;column type where values can be only 0 or 1.      &lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-6666971323678734871?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/6666971323678734871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=6666971323678734871' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6666971323678734871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6666971323678734871'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/03/t-sql-vs-pl-sql.html' title='T-SQL vs PL-SQL'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-1834988679775114573</id><published>2008-12-27T19:00:00.005Z</published><updated>2009-02-14T15:50:31.082Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++/CLI'/><category scheme='http://www.blogger.com/atom/ns#' term='unit-testing'/><title type='text'>Using NUnit with C++ - Part 2</title><content type='html'>Follow up from &lt;a href="http://golios.blogspot.com/2008/11/using-nunit-with-native-c.html"&gt;part 1&lt;/a&gt;

We've been experimenting at work with writing unit-tests against native code for 2 months now. We're using NUnit together with CruiseControl and it works fine.
&lt;ul&gt;&lt;li&gt;the test project is a C++/CLI DLL compiled with /CLR option.&lt;/li&gt;&lt;li&gt;the project containing the code under test has an additional project configuration that generates a static LIB instead of an executable.&lt;/li&gt;&lt;li&gt;the test project links to the native LIB above.
&lt;/li&gt;&lt;/ul&gt;What if the code under test is C++ compiled with /CLR?

For some reason I thought it wasn't possible to create a static LIB when the /CLR option was active.  C++/CLI is very flexible and you can generate a static library containing a mix of managed and unmanaged code.

The purpose of building a mixed static lib is to easily import native code into a test project.

We keep the test project and the code under test in separate solutions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-1834988679775114573?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/1834988679775114573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=1834988679775114573' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1834988679775114573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1834988679775114573'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/12/using-nunit-with-c-part-2.html' title='Using NUnit with C++ - Part 2'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-4924753836809367475</id><published>2008-11-30T17:55:00.003Z</published><updated>2008-12-23T21:33:50.309Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='time'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Get time in HH:mm format regardless of the local culture</title><content type='html'>&lt;a href="http://msdn.microsoft.com/en-us/library/system.datetime.toshorttimestring.aspx"&gt;DateTime.Now.ToShortTimeString()&lt;/a&gt; returns a string that depends on the culture.

DateTime.Now.ToString("HH:mm") is deterministic.

Use DateTime.Now.&lt;a href="http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime.aspx"&gt;ToUniversalTime&lt;/a&gt;.ToString("HH:mm") to get the current HH:mm time in UTC.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-4924753836809367475?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/4924753836809367475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=4924753836809367475' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/4924753836809367475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/4924753836809367475'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/11/get-time-in-hhmm-format-regardless-of.html' title='Get time in HH:mm format regardless of the local culture'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-6888107278632795818</id><published>2008-11-16T21:19:00.004Z</published><updated>2011-10-01T20:37:00.793+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Using NUnit with native C++</title><content type='html'>&lt;p&gt;NUnit was designed to be used with managed apps. So what? &lt;/p&gt;  &lt;p&gt;All you need to do in order to test native code is &lt;strong&gt;create a C++/CLI project&lt;/strong&gt; to host the test files. To link the test project to the native C++ project, simply &lt;strong&gt;add a configuration to the solution&lt;/strong&gt; and call it ReleaseUnitTests for instance. This configuration will build the native C++ project as a &lt;strong&gt;static library&lt;/strong&gt; as opposed to an executable. The C++/CLI test project links to this library and can call into any public method of the native project. &lt;/p&gt;  &lt;p&gt;Job done! Who needs cppunit?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Detailed steps:&lt;/strong&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Install NUnit. &lt;/li&gt;    &lt;li&gt;In Visual Studio Pro, create a native C++ project and call it &lt;em&gt;CatHouse &lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Add a class called &lt;em&gt;Cat &lt;/em&gt;with a public method void &lt;em&gt;Feed()&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Add another project to the solution: choose &lt;strong&gt;Visual C++ &amp;gt; CLR &amp;gt; Class Library&lt;/strong&gt; and call it &lt;em&gt;CatHouseTests&lt;/em&gt;. This will create a mixed assembly containing both native and managed code.       &lt;br /&gt;Add a C++ managed class called &lt;em&gt;CatTest&lt;/em&gt;. Declare it public because we want it to be a managed type that can be seen by Nunit. Add a public method called &lt;em&gt;TestFeed()&lt;/em&gt;. &lt;/li&gt;    &lt;li&gt;Open &lt;em&gt;CatHouseTests &lt;/em&gt;project properties, go to &lt;strong&gt;Common Properties &amp;gt; References&lt;/strong&gt; and add the &lt;em&gt;nunit.framework.dl&lt;/em&gt; assembly. &lt;/li&gt;    &lt;li&gt;In &lt;em&gt;CatTests.h&lt;/em&gt;, add the line &lt;em&gt;using namespace NUnit::Framework&lt;/em&gt;. &lt;/li&gt;    &lt;li&gt;Now you can add the &lt;em&gt;[TestFixture]&lt;/em&gt; and &lt;em&gt;[Test]&lt;/em&gt; attributes to the class and test method declarations respectively. &lt;/li&gt;    &lt;li&gt;By default the &lt;em&gt;CatHouse &lt;/em&gt;project has a &lt;em&gt;Debug &lt;/em&gt;and &lt;em&gt;Release &lt;/em&gt;configurations. Add a new one called &lt;em&gt;ReleaseUnitTests&lt;/em&gt;: in &lt;strong&gt;Build &amp;gt; Configuration Manager&lt;/strong&gt; in the &lt;strong&gt;Active Solution Configuration &lt;/strong&gt;drop-down, select &lt;strong&gt;New&lt;/strong&gt;. In the dialog, type &lt;em&gt;ReleaseUnitTests &lt;/em&gt;and in &lt;strong&gt;Copy settings from &lt;/strong&gt;choose &lt;em&gt;Release&lt;/em&gt;. Click &lt;strong&gt;OK&lt;/strong&gt;. Now all projects have a configuration called &lt;em&gt;ReleaseUnitTests&lt;/em&gt;.       &lt;br /&gt;Using Configuration Manager, ensure that the &lt;em&gt;Debug &lt;/em&gt;and &lt;em&gt;Release &lt;/em&gt;solution configurations build &lt;em&gt;CatHouse&lt;/em&gt; only and not &lt;em&gt;CatHouseTests&lt;/em&gt;. Ensure that &lt;em&gt;ReleaseUnitTests &lt;/em&gt;builds both &lt;em&gt;CatHouse &lt;/em&gt;and &lt;em&gt;CatHouseTests&lt;/em&gt;, both having project configuration &lt;em&gt;ReleaseUnitTests&lt;/em&gt;. &lt;/li&gt;    &lt;li&gt;Open the properties of project &lt;em&gt;CatHouse &lt;/em&gt;and in &lt;strong&gt;Configuration Properties &amp;gt; General&lt;/strong&gt;, select Configuration &lt;em&gt;ReleaseUnitTests&lt;/em&gt;. Change configuration type to &lt;em&gt;Static Lib&lt;/em&gt; (that will make it possible to link all the content with the test program). &lt;/li&gt;    &lt;li&gt;Make &lt;em&gt;CatHouseTests&lt;/em&gt; link to the .lib generated by &lt;em&gt;CatHouse&lt;/em&gt;. In Project Properties of &lt;em&gt;CatHouseTests&lt;/em&gt;, go to &lt;strong&gt;Common Properties &amp;gt; Add New Reference &amp;gt; Projects &amp;gt; CatHouse&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Add a #include &amp;quot;Cat.h&amp;quot; in &lt;em&gt;CatTest.cpp &lt;/em&gt;and change the project properties so that it knows where to find the include. &lt;/li&gt;    &lt;li&gt;In the &lt;em&gt;TestFeed()&lt;/em&gt; method, instantiate a &lt;em&gt;Cat &lt;/em&gt;object on the native stack and call its &lt;em&gt;Feed()&lt;/em&gt; method. &lt;/li&gt;    &lt;li&gt;Build the solution in &lt;em&gt;Release &lt;/em&gt;mode then in &lt;em&gt;ReleaseUnitTests &lt;/em&gt;mode. &lt;/li&gt;    &lt;li&gt;In the NUnit GUI type &lt;strong&gt;Ctrl O&lt;/strong&gt;, select the &lt;em&gt;CatHouseTests.dll&lt;/em&gt;. The &lt;em&gt;TestFeed &lt;/em&gt;test should appear in the tree view. &lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-6888107278632795818?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/6888107278632795818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=6888107278632795818' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6888107278632795818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6888107278632795818'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/11/using-nunit-with-native-c.html' title='Using NUnit with native C++'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-6809898559331293874</id><published>2008-11-14T17:56:00.001Z</published><updated>2008-11-15T09:54:08.095Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='TechEd EMEA 2008'/><title type='text'>TechEd EMEA 2008 Developers Wrap</title><content type='html'>&lt;span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;What I got out of this TechEd&lt;/span&gt;

Saw a total of 15 sessions and did 4 labs.

If I had to pick just one thing, that would be &lt;span style="font-weight: bold;"&gt;VC9 DBPro (VSTS2008 Database Edition)&lt;/span&gt; with its &lt;span style="font-weight: bold;"&gt;database deployment&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;sproc unit-testing features&lt;/span&gt;. I saw a &lt;a href="http://golios.blogspot.com/2008/11/tuesday-versioned-schemas.html"&gt;talk &lt;/a&gt;about it then played with it at the &lt;a href="http://golios.blogspot.com/2008/11/friday-database-deployment-with-dbpro.html"&gt;lab&lt;/a&gt;. It has the potential to remove a &lt;span style="font-weight: bold;"&gt;LOT&lt;/span&gt; of pain from schema upgrades.

&lt;span&gt;Because most sessions I picked were centered around &lt;span style="font-weight: bold;"&gt;unit-testing&lt;/span&gt; I'm a bit less ignorant about the subject&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;now I know there is a descent framework for &lt;span style="font-weight: bold;"&gt;unit-testing native C++&lt;/span&gt; code in &lt;a href="http://golios.blogspot.com/2008/11/tuesday-unit-testing-in-visual-studio.html"&gt;VSTS2008 Dev&lt;/a&gt;. Ok you have to write C++/CLI but the next best thing is cppunit so... VSTS2008 Dev is apparently the best tool around for the moment. &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;database unit-testing in &lt;a href="http://golios.blogspot.com/2008/11/friday-database-deployment-with-dbpro.html"&gt;VC9 DBPro&lt;/a&gt;&lt;/span&gt; where it creates a C# class for you that automatically calls a T-SQL sproc where you write your test.&lt;/li&gt;&lt;li&gt;other tools: I had an &lt;a href="http://golios.blogspot.com/2008/11/wednesday-more-unit-testing-and-more-c.html"&gt;overview&lt;/a&gt; of the tools available for managing unit-tests and IOC containers: &lt;span style="font-weight: bold;"&gt;Pex&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;TypeMock&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;TestDriven&lt;/span&gt;.&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;They're on my list of things to try out next. &lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Integration Testing&lt;/span&gt;:
&lt;ul&gt;&lt;li&gt;It's worth digging into &lt;a href="http://golios.blogspot.com/2008/11/thursday-test-creation-automation.html"&gt;&lt;span style="font-weight: bold;"&gt;SpecExplorer 2007&lt;/span&gt;&lt;/a&gt; and see what can be done with it. The idea of creating a simplified state model of your system and having the tool generate all possible paths for you is very interesting.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Methodologies&lt;/span&gt;
&lt;ul&gt;&lt;li&gt; I am now a bit more familiar with &lt;a href="http://golios.blogspot.com/2008/11/tuesday-unit-testing.html"&gt;IOC frameworks&lt;/a&gt;, &lt;a href="http://golios.blogspot.com/2008/11/friday-test-driven-designdevelopment.html"&gt;interface-based coding&lt;/a&gt; and &lt;a href="http://golios.blogspot.com/2008/11/friday-test-driven-designdevelopment.html"&gt;TDD &lt;/a&gt;so I feel more confident to start writing my first unit-tests. One day maybe I'll write tests before the code...
&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-6809898559331293874?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/6809898559331293874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=6809898559331293874' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6809898559331293874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6809898559331293874'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/11/teched-emea-2008-developers-wrap.html' title='TechEd EMEA 2008 Developers Wrap'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-9130551362093586111</id><published>2008-11-14T15:45:00.001Z</published><updated>2010-02-17T21:57:55.632Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='TechEd EMEA 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Udi Dahan'/><title type='text'>Friday - TDD and Interface-based Programming</title><content type='html'>&lt;span style="font-weight: bold;"&gt;DVM303 - Understanding Test Driven Development     &lt;/span&gt;

&lt;span style="font-weight: bold;"&gt;Speaker&lt;/span&gt;: Roy Osherove

This is my 3rd session with Roy following from &lt;a href="http://golios.blogspot.com/2008/11/tuesday-unit-testing.html"&gt;Designing for Testability&lt;/a&gt; and &lt;a href="http://golios.blogspot.com/2008/11/wednesday-more-unit-testing-and-more-c.html"&gt;Future of Unit-Testing&lt;/a&gt;.

&lt;span style="font-weight: bold;"&gt;TDD helps with&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;trusting your tests&lt;/li&gt;&lt;li&gt;designing the app (because it forces you to take the point of view of the client)&lt;/li&gt;&lt;li&gt;implementing stuff that works partially as opposed to not at all&lt;/li&gt;&lt;li&gt;code quality&lt;/li&gt;&lt;li&gt;documenting the code&lt;/li&gt;&lt;li&gt;reducing integration testing time, reducing number of bugs in production
&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;How to write a unit test with TDD&lt;/span&gt;?
&lt;ul&gt;&lt;li&gt;add attribute [Test] to methods, [TestFixture] to classs&lt;/li&gt;&lt;li&gt;naming: tests must have a good name to document their intention: method + scenario + expected behaviour. &lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Content of the test&lt;/span&gt;:
&lt;ol&gt;&lt;li&gt;arrange (instatiate objects) &lt;/li&gt;&lt;li&gt;act (call the method under test) ,&lt;/li&gt;&lt;li&gt;assert (check the expected result)
&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Writing process&lt;/span&gt;
That's the interesting bit, the part that's totally couter-intuitive and requires a good dose of self-discipline.
&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Make it Fail&lt;/span&gt;: write a test that fails because the method is not doing what's expected. Purpose: test your test&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Make it work&lt;/span&gt;: with minimum code, make the test pass by writing anything even if it's stupid as long as it doesn't break any other test.
&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Make it better&lt;/span&gt;:  refactor but do not add functionality and make sure the test still passes.
&lt;/li&gt;&lt;li&gt;Want to add more functionality? Ok but &lt;span style="font-weight: bold;"&gt;write another test first&lt;/span&gt;.
&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Tools&lt;/span&gt;:
&lt;ul&gt;&lt;li&gt;use &lt;span style="font-weight: bold;"&gt;Testdriven &lt;/span&gt;to run test by right-clicking method in the middle of the method. Apparently TestDriven allows you to run a test even if you don't have a fully working executable.&lt;/li&gt;&lt;li&gt;If you use VSTS, use the built-in &lt;span style="font-weight: bold;"&gt;MSTest &lt;/span&gt;because it brings a lot of integration benefits. It runs slower though. Usually unit-tests are kept in a separate VS project.&lt;/li&gt;&lt;/ul&gt; &lt;span style="font-weight: bold;"&gt;Tip&lt;/span&gt; from Roy: it's a bit of a culture change so implement it incrementally and don't mention it by name to avoid scaring people off!

&lt;span style="font-weight: bold;"&gt;ARC213 Intentions &amp;amp; Interfaces - Making Patterns Concrete&lt;/span&gt;

&lt;span style="font-weight: bold;"&gt;Speaker&lt;/span&gt;: Udi Dahan

Very sarcastic talk by Udi, making fun of the abuses of the visitor and strategy patterns.

"Make your roles explicit" Instead of overriding virtual methods, use generic interfaces. You then retrieve concrete objects for those interfaces from service locators. In the end he was recommending Inversion of Control containers as Roy did in his &lt;a href="http://golios.blogspot.com/2008/11/tuesday-unit-testing.html"&gt;testability&lt;/a&gt; session but with a different approach. Roy's emphasis was on writing code so that unit-tests stick to PC-COF while Udi's angle was on making it easy to change code in large projects.

&lt;a href="https://downloads.eventpoint.com/teched2008-emea/presentations1/ARC213_Dahan.pptx?ticket=611aa911-56a9-44c6-b337-eafe7ffb2c23&amp;amp;id=d57984e4-3897-44a6-a97b-70d48caa4a24"&gt;Slides&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-9130551362093586111?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/9130551362093586111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=9130551362093586111' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/9130551362093586111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/9130551362093586111'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/11/friday-test-driven-designdevelopment.html' title='Friday - TDD and Interface-based Programming'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-943639444266067772</id><published>2008-11-14T15:40:00.005Z</published><updated>2008-11-21T22:24:52.876Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='TechEd EMEA 2008'/><title type='text'>Friday - DB Deployment and Unit-Testing with DBPro</title><content type='html'>&lt;span style="font-weight: bold;"&gt;TLA03-HOL - Introduction to Visual Studio Team System 2008 Database Edition&lt;/span&gt;

I took this lab as a follow-up to &lt;a href="http://golios.blogspot.com/2008/11/tuesday-versioned-schemas.html"&gt;Brian Randell's talk&lt;/a&gt; on Tuesday.

This is by far the most useful tool I learned about at this TechEd.

You start by creating an empty database project.
&lt;ul&gt;&lt;li&gt; Then you &lt;span style="font-weight: bold;"&gt;import&lt;/span&gt; the schema from an existing database. VSTS automatically creates a folder struture for schema objects in the solution folder. &lt;span style="font-weight: bold;"&gt;Each db object has got its own script&lt;/span&gt; therefore you can commit them all into CVS if you need to (you don't have to use Foundation Server).&lt;/li&gt;&lt;li&gt; To add an object, right-click Add Table in the Schema View. This generates a script skeleton that you edit as you see fit (add columns, add options, etc...). Save the file and the Schema View is updated automatically. Change an object in the Schema View and the script is updated automatically.
&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Schema compare
&lt;/span&gt;That's where it gets interesting:&lt;span style="font-weight: bold;"&gt;
&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Choose a target database to compare the offline schema to the target schema.&lt;/li&gt;&lt;li&gt;A view appears that shows &lt;span style="font-weight: bold;"&gt;all changed, new or missing objects&lt;/span&gt;. &lt;/li&gt;&lt;li&gt;Select one of the changed object in the lists and &lt;span style="font-weight: bold;"&gt;view the difference &lt;/span&gt; (new column, changed line in sproc, etc..)&lt;/li&gt;&lt;li&gt;You can also &lt;span style="font-weight: bold;"&gt;preview the DDL script&lt;/span&gt; that VSTS is about to generate&lt;/li&gt;&lt;li&gt;You can &lt;span style="font-weight: bold;"&gt;enable/disable individual differences&lt;/span&gt; from the list if you don't want them to be part of the script or force some to be in the scripts if you really want them to be there.  &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Export the DDL script&lt;/span&gt; to a .sql file then edit if you need to tweak it before testing it against a pre-prod database.
&lt;/li&gt;&lt;/ul&gt;So the tool is nice because it does the dirty work for you, leaves you a high degree of control and makes the schema differences absolutely crystal clear.

&lt;span style="font-weight: bold;"&gt; Database unit-testing&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;You can create a unit-test for a sproc.&lt;/li&gt;&lt;li&gt;VSTS automatically creates a test class that calls the sproc that contains the unit test. All you have to do is write the T-SQL for the sproc that does the unit-test. DB Sprocs tests are therefore perfectly integrated to all other tests.&lt;/li&gt;&lt;li&gt;You can attach a Pre-Test and Post-Test to a sproc test in order to put the db into an known state.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-943639444266067772?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/943639444266067772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=943639444266067772' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/943639444266067772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/943639444266067772'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/11/friday-database-deployment-with-dbpro.html' title='Friday - DB Deployment and Unit-Testing with DBPro'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-7239513324092722943</id><published>2008-11-13T18:46:00.006Z</published><updated>2008-11-14T15:40:27.027Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='TechEd EMEA 2008'/><title type='text'>Thursday - Testing in Team System</title><content type='html'>&lt;span style="font-weight: bold;"&gt;TLA13-HOL - Visual Studio Team System code name "Rosario": Team Development&lt;/span&gt;

&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Unit Test management&lt;/span&gt;
Everytime you run tests it automatically creates a new test run with a default name and records all the test results. So you keep a history of what tests were run and when and which ones passed or failed.

&lt;span style="font-weight: bold;"&gt;Types of tests you can create&lt;/span&gt;
VS is used to managed both &lt;span style="font-weight: bold;"&gt;unit-tests&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;integration tests&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;. &lt;/span&gt;You can create:
&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;coded UI tests&lt;/span&gt; (where you write UI tests using automation as opposed to record/replay)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Database unit-tests&lt;/span&gt; to test T-SQL stored procedures.
&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Generic tests&lt;/span&gt;. This is actually an external program that will look like an ordinary test from within visual studio. You specify the command line arguments to call the external program. You have the option to redirect the standard output / error to the test results or not.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Load tests.&lt;/span&gt;  That's quite fun: you can simulate heavy load conditions with many users. Among other things you can define a &lt;span style="font-weight: bold;"&gt;load pattern&lt;/span&gt; (constant load or increasing load) and the &lt;span style="font-weight: bold;"&gt;distribution&lt;/span&gt; (percentage of appareance for each test).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Manual tests&lt;/span&gt;: simple text file describing a manual test procedure. This is there for auditing purposes only obviously.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Ordered test&lt;/span&gt;: specify a list of tests to be run in a specific sequence in the situation where order counts (that's for integration tests only, unit-tests should not be order dependent)&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Impact analysis&lt;/span&gt;: as you change code, VS gives you the list of recommended tests (tests that should be re-run as a result of your changes)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-7239513324092722943?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/7239513324092722943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=7239513324092722943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7239513324092722943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7239513324092722943'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/11/thursday-testing-in-team-system.html' title='Thursday - Testing in Team System'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-6152061854468708045</id><published>2008-11-13T14:29:00.003Z</published><updated>2008-11-13T16:35:08.170Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='TechEd EMEA 2008'/><title type='text'>Thursday - SQL Tips and Tricks</title><content type='html'>Before he ran to the post office to mail stuff that Carl Franklin had left behind, Stephen Forte demonstrated a few tips:
&lt;ul&gt;&lt;li&gt;To write a fancy UPDATE statement that needs a complex subquery, use WITH (common table expression)&lt;/li&gt;&lt;li&gt;To keep 2 tables in sync with one single statement, use the new MERGE syntax (new in 2008).&lt;/li&gt;&lt;li&gt;To filter out the results of a ranking query without affecting the rank values, use WITH again.
&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-6152061854468708045?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/6152061854468708045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=6152061854468708045' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6152061854468708045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6152061854468708045'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/11/thursday-sql-tips-and-tricks.html' title='Thursday - SQL Tips and Tricks'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-3056102586760030780</id><published>2008-11-13T09:28:00.006Z</published><updated>2008-11-13T18:37:01.744Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='TechEd EMEA 2008'/><title type='text'>Thursday - Test Creation Automation with SpecExplorer 2007</title><content type='html'>&lt;span style="font-weight: bold;"&gt;DVP302 - Automating Test Creation&lt;/span&gt;

Something clever to automate creation of integration tests: &lt;span style="font-weight: bold;"&gt;SpecExplorer 2007&lt;/span&gt;

Keith Stobie demonstrated a tool that automatically generates tests based on a simple model of a system. You start by defining &lt;span style="font-weight: bold;"&gt;states&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;actions&lt;/span&gt;. Actions have an effect on the System Under Test and cause a transition to another state. You also define &lt;span style="font-weight: bold;"&gt;expectations&lt;/span&gt; (the expected results of those actions). The evaluation of those expectations either causes an error (and the test fails) or results in a transition to another state.

In other words you model your system with a state machine.

The whole point of the tool is to generate all possible ways of navigating through the state transition graph. You end up with non deterministic tests that go through scenarios you didn't necessarily think of.

This makes the tool relevant to &lt;span style="font-weight: bold;"&gt;integration testing, not unit-testing&lt;/span&gt;.

Last night's UK Country drinks at BroadBar badly affected my attention span so all I remembered right after Keith's talk was:&lt;blockquote&gt;Lots of little tests is better than a single big one

There are no perfect models, only useful ones

Start small: even very small models can find bugs
&lt;/blockquote&gt;

&lt;span style="font-weight: bold;"&gt;DVP01-IS Model Based Testing with Spec Explore&lt;/span&gt;

In the afternoon Keith did another demo of SpecExplorer 2007 followed by Q&amp;amp;A session.
&lt;ul&gt;&lt;li&gt;How does SpecExplorer interact with the System Under Test ?&lt;/li&gt;&lt;/ul&gt;You use adapters that hide the concrete implementation of the actions (such as calling an executable, sending a message, calling a sproc, clicking a button, etc...)
&lt;ul&gt;&lt;li&gt;SpecExplorer is a free add-in to Visual Studio that will be available as a powertoy in the beta of VS2010.
&lt;/li&gt;&lt;/ul&gt;There is a video about SpecExplorer &lt;a href="http://mfile.akamai.com/14853/wmv/microsofttec.download.akamai.com/14853/TechEdOnline/Videos/442_low.asx"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-3056102586760030780?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/3056102586760030780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=3056102586760030780' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3056102586760030780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3056102586760030780'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/11/thursday-test-creation-automation.html' title='Thursday - Test Creation Automation with SpecExplorer 2007'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-6545128172075972310</id><published>2008-11-12T14:04:00.005Z</published><updated>2008-11-12T16:12:36.760Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='TechEd EMEA 2008'/><title type='text'>Wednesday - More Unit Testing and more C++</title><content type='html'>&lt;span style="font-weight: bold;"&gt;ARC308 - The future of unit testing

&lt;/span&gt;Following up &lt;a href="http://golios.blogspot.com/2008/11/tuesday-unit-testing.html"&gt;yesterday's session&lt;/a&gt; about designing for testability,&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;Roy gave an opinionated overview of the existing unit-testing tools/frameworks (there are &lt;span style="font-weight: bold;"&gt;lots&lt;/span&gt; of them), comparing those he thinks will stick around against those that might fade away.

His final advice:
&lt;blockquote&gt;if you're new to unit-testing, don't get into TDD immediately, start with writing a few unit-tests incrementally to get the hang of it. &lt;/blockquote&gt;His powerpoint is &lt;a href="https://emea1.msteched.com/resources/presentations1/ARC308_Osherove.pptx"&gt;here&lt;/a&gt;.
&lt;span style="font-weight: bold;"&gt;
TLA401 - Microsoft Visual C++ 2008 for Unrepentant C++ Developers

&lt;/span&gt;&lt;span&gt;The last time I saw Kate Gregory&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span&gt;was at TechEd 2007 in Orlando&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;. &lt;/span&gt;&lt;span&gt;She hasn't changed: her demos go really fast :-).

VS2008 SP1 comes with TR1 which is a set of proposed additions to the next C++ standard C++0x. It includes stuff that is currently in the boost library. Kate explained and demoed each of the following language additions:
&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;shared_ptr&lt;/span&gt;: safer, more intuitive, more powerful than auto_ptr.
&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;lambda&lt;/span&gt; expressions: [] or [&amp;amp;] or [=] equivalent of =&gt; in C#. Allows you to define short functions inline. She showed how elegantly they integrate with STL.
&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;auto&lt;/span&gt;: equivalent of C# &lt;span style="font-family: courier new;"&gt;var&lt;/span&gt; so you don't have to spell out a type when the compiler can work it out by itself.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;Kate's question to the audience: "who in this room learned C++ in this century?" Just one person raised his hand (that wasn't me).

Kate's final message: "C++ is not dead!". Indeed, new versions of Visual Studio keep adding new things for C++:
&lt;/span&gt;&lt;ul&gt;&lt;li&gt;TR1 additions&lt;/li&gt;&lt;li&gt;New MFC classes, ribbon toolbar&lt;/li&gt;&lt;li&gt;New libraries for parallel development&lt;/li&gt;&lt;li&gt;Some Vista features are only available to C++&lt;/li&gt;&lt;li&gt;C++ is the most practical language to do interop
&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-6545128172075972310?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/6545128172075972310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=6545128172075972310' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6545128172075972310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6545128172075972310'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/11/wednesday-more-unit-testing-and-more-c.html' title='Wednesday - More Unit Testing and more C++'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-3098656013916859993</id><published>2008-11-12T12:50:00.005Z</published><updated>2008-11-15T09:45:54.928Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='TechEd EMEA 2008'/><title type='text'>Tuesday - Unit Testing in Visual Studio</title><content type='html'>&lt;span style="font-weight: bold;"&gt;DVP304 - Building fast and secure native applications with VSTS 2008&lt;/span&gt;

The good news from this session by Lin Xu: yes, &lt;span style="font-weight: bold;"&gt;you can run unit-tests against native C++ from VSTS!&lt;/span&gt;
The catch is you have to write them in C++/CLI and compile the test project with the /clr option.

VSTS 2008 also comes with the sort of features that tools like DevPartner offer:

&lt;span style="font-weight: bold;"&gt;Profiling&lt;/span&gt;:
&lt;ul&gt;&lt;li&gt;choose between &lt;span style="font-weight: bold;"&gt;sampling&lt;/span&gt; (takes snapshots at intervals) and &lt;span style="font-weight: bold;"&gt;instrumentation&lt;/span&gt; (records all function calls). &lt;/li&gt;&lt;li&gt;instrumentation generates a call tree view &lt;/li&gt;&lt;li&gt;performance reports show how much time was spent in each function.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Static analysis&lt;/span&gt;: &lt;ul&gt;&lt;li&gt;compile with the &lt;span style="font-family:courier new;"&gt;/analyse&lt;/span&gt; option to raise warnings highlighting potential coding mistakes. This tool is based on another one called Prefast.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Coverage&lt;/span&gt;:
&lt;ul&gt;&lt;li&gt;display the portions of code that were executed by the unit-tests.&lt;/li&gt;&lt;/ul&gt;Lin Xu's powerpoint presentation: &lt;a href="https://emea1.msteched.com/resources/presentations1/DVP304_Xu.pptx"&gt;https://emea1.msteched.com/resources/presentations1/DVP304_Xu.pptx&lt;/a&gt;

It turns out that the unit-testing feature alone is &lt;a href="http://blogs.msdn.com/buckh/archive/2007/03/27/orcas-unit-testing-to-be-available-in-visual-studio-professional.aspx"&gt;&lt;span style="font-weight: bold;"&gt;also available in the Pro version&lt;/span&gt;&lt;/a&gt;.
&lt;a href="http://channel9.msdn.com/forums/Coffeehouse/254153-VS2008-Pro-will-have-unit-testing/"&gt;&lt;/a&gt;
Visual Studio Pro Academic on &lt;a href="http://www.amazon.co.uk/Visual-Studio-Pro-2008-Academic/dp/B000WLY9WW/ref=pd_cp_sw_h__1?pf_rd_p=153116491&amp;amp;pf_rd_s=center-41&amp;amp;pf_rd_t=201&amp;amp;pf_rd_i=B000WM1Z46&amp;amp;pf_rd_m=A3P5ROKL5A1OLE&amp;amp;pf_rd_r=189KDKQWZS7TMNWN23FV"&gt;Amazon&lt;/a&gt; costs less than £120.
&lt;a href="http://www.amazon.co.uk/Visual-Studio-Pro-2008-Academic/dp/B000WLY9WW/ref=pd_cp_sw_h__1?pf_rd_p=153116491&amp;amp;pf_rd_s=center-41&amp;amp;pf_rd_t=201&amp;amp;pf_rd_i=B000WM1Z46&amp;amp;pf_rd_m=A3P5ROKL5A1OLE&amp;amp;pf_rd_r=189KDKQWZS7TMNWN23FV"&gt;
&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-3098656013916859993?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/3098656013916859993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=3098656013916859993' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3098656013916859993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3098656013916859993'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/11/tuesday-unit-testing-in-visual-studio.html' title='Tuesday - Unit Testing in Visual Studio'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-7067652774092729928</id><published>2008-11-12T07:17:00.007Z</published><updated>2008-11-15T09:41:19.970Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='TechEd EMEA 2008'/><title type='text'>Tuesday - Designing for Testability</title><content type='html'>&lt;span style="font-weight: bold;"&gt;ARC307 - Designing for Testability: Bridging the Gap between Design and Testing in Object-Oriented Software&lt;/span&gt;

&lt;span style="font-weight: bold;"&gt;Speaker&lt;/span&gt;: Roy Osherove

Probably the most inspiring session so far. It struck a chord because I recently gave some serious thought to coding unit-tests and using TDD. What has been holding me back so far is that most unit-testing frameworks seem to be targeting the .NET framework as opposed to native C++.

For each piece of coded logic says Roy Osherove you should follow the PC-COF rules:
&lt;ul&gt;&lt;li&gt; &lt;span style="font-weight: bold;"&gt;P&lt;/span&gt;artial runs possible&lt;/li&gt;&lt;li&gt; No need for &lt;span style="font-weight: bold;"&gt;C&lt;/span&gt;onfiguration&lt;/li&gt;&lt;li&gt; &lt;span style="font-weight: bold;"&gt;C&lt;/span&gt;onsistent pass/fail&lt;/li&gt;&lt;li&gt; &lt;span style="font-weight: bold;"&gt;O&lt;/span&gt;rder does not matter&lt;/li&gt;&lt;li&gt; Tests must be &lt;span style="font-weight: bold;"&gt;F&lt;/span&gt;ast&lt;/li&gt;&lt;/ul&gt;Dependencies between objects should be based on interfaces (to enable creation of mock objects), which then raises the problem of dependency injection:  how and when do you pass a concrete object A to an object B that expects interface A?

You can do injection in various ways:
&lt;ul&gt;&lt;li&gt;Constructor (forces you to pass a concrete object)&lt;/li&gt;&lt;li&gt;Property (passing the concrete object is optional)&lt;/li&gt;&lt;li&gt;Factory (passing the concreate object is done as part of a factory method)&lt;/li&gt;&lt;/ul&gt;It can become very clunky to do code injections for all objects unless you use inversion of control containers. Those containers hold associations between abstract interfaces and concrete objects.

Inversion of control frameworks:
&lt;ul&gt;&lt;li&gt;Spring.net (I met one of the authors of Spring.net at TechEd Orlando)&lt;/li&gt;&lt;li&gt;Castle.Windsor&lt;/li&gt;&lt;li&gt;StructureMap&lt;/li&gt;&lt;/ul&gt;Unit-testing tools:
&lt;ul&gt;&lt;li&gt;MSTest (the one integrated in Visual Studio Team System)&lt;/li&gt;&lt;li&gt;Nunit&lt;/li&gt;&lt;li&gt;TestDriven.NET&lt;/li&gt;&lt;li&gt;Typemock isolator&lt;/li&gt;&lt;/ul&gt;&lt;a href="https://downloads.eventpoint.com/teched2008-emea/presentations1/ARC307_Osherove.pptx?ticket=d5b6ec3f-1020-47dc-8681-820369362909&amp;amp;id=6dde1b8b-9457-45ae-b018-45510fda55da"&gt;Slides
&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-7067652774092729928?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/7067652774092729928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=7067652774092729928' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7067652774092729928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7067652774092729928'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/11/tuesday-unit-testing.html' title='Tuesday - Designing for Testability'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-5312272476377766513</id><published>2008-11-11T11:07:00.007Z</published><updated>2008-11-15T09:36:24.911Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='TechEd EMEA 2008'/><title type='text'>Tuesday - Schema Compare in VSTS2008</title><content type='html'>&lt;span style="font-weight: bold;"&gt;TLA313&lt;/span&gt; - &lt;span style="font-weight: bold;"&gt;End-to-End Database Development Using Microsoft Visual Studio Team System 2008 Database Edition&lt;/span&gt;

&lt;a href="http://mcwtech.com/CS/blogs/brianr/Default.aspx"&gt;Brian Randell&lt;/a&gt; talked about how to manage change with SQL Server.

That was a useful session! I've been struggling with this problem for years with Oracle and SQL Server: you have to manually write DDL scripts when doing database upgrades. Those scripts make visualising changes difficult and reversing changes impossible unless you write undo scripts.

DBPro (VSTS 2008 Database edition) generates those DDL scripts automatically: you edit your schema offline within your solution (all under source control) then when you need to deploy the schema, DBPro &lt;span style="font-weight: bold;"&gt;compares the target DB model to the offline model and generates the scripts automatically&lt;/span&gt;.

So no need to store the DDL scripts in source control any more (ALTER statements to add a column for instance). What you store in source control is the declarative model (i.e. the CREATE statements for the successive versions of the table).

If a DBA makes a change in production, you can have DBPro compare the schemas and highlight the differences. You can then select an individual difference and bring it back into the offline model to keep it in sync.

Sounds brilliant.

By the way, this is &lt;span style="font-weight: bold;"&gt;available in VSTS2008 but works against SQL Server 2005&lt;/span&gt;. Brian did the whole demo against 2005 to make a point that there is nothing specific to SQL Server 2008.

&lt;span style="font-weight: bold;"&gt;Resources&lt;/span&gt;:
&lt;ul&gt;&lt;li&gt;Gert Drapers blog (Data Dude): &lt;a href="http://blogs.msdn.com/gertd/"&gt;http://blogs.msdn.com/gertd/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Will take ages to download the trial version of DBPro from &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c7a809d8-8c9f-439f-8147-948bc6957812&amp;amp;displaylang=en"&gt;here&lt;/a&gt;&lt;/li&gt;&lt;li&gt;The list of &lt;a href="http://msdn.microsoft.com/en-us/vsts2008/aa718807.aspx"&gt;features&lt;/a&gt; in VSTS2008&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=DA3F11AD-BD54-4EDA-B08C-4DF84DF0D641&amp;amp;displaylang=en"&gt;Power Tools&lt;/a&gt; for DBPro
&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-5312272476377766513?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/5312272476377766513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=5312272476377766513' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5312272476377766513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5312272476377766513'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/11/tuesday-versioned-schemas.html' title='Tuesday - Schema Compare in VSTS2008'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-841188105936888189</id><published>2008-11-11T07:21:00.005Z</published><updated>2008-11-15T09:29:11.895Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='TechEd EMEA 2008'/><title type='text'>Monday - Agile Development in VS2008 and VS2010</title><content type='html'>&lt;span style="font-weight: bold;"&gt;DVP03-IS - Agile development with Visual Studio&lt;/span&gt;

Interactive session with &lt;a href="http://blogs.msdn.com/stephaniesaad/"&gt;Stephanie Saad&lt;/a&gt; who demonstrated some features of VS2008/2010.

There are very interesting things for database development in the DB edition of Visual Studio Team System:
&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;DB refactoring&lt;/span&gt;: changing a table name automatically updates all dependencies&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;DB deployment&lt;/span&gt;: you can generate a script that contains all differences between the current schema and the production schema.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;DB testing&lt;/span&gt;:
C# Unit-tests for T-SQL stored procedures where you define setup, test and teardown
Test data generation (that's really handy for the setup part of the unit tests)
&lt;/li&gt;&lt;/ul&gt;  Apparently the dev and db versions of Visual Studio Team System have been merged into one license for 2008 so if you buy one, you get the other one for free.

Other notes:

&lt;span style="font-weight: bold;"&gt;VSTS 2008&lt;/span&gt;&lt;ul&gt;&lt;li&gt;   see author/changes directly in code&lt;/li&gt;&lt;li&gt;   define check-in policies (to force you to pass unit-tests for instance)&lt;/li&gt;&lt;li&gt;   define triggers such as &lt;span style="font-style: italic;"&gt;on check-in build&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;   &lt;/span&gt;setup build notifications popups (through powertools)&lt;/li&gt;&lt;li&gt;   code metrics: show the number of lines, cyclomatic complexity     &lt;/li&gt;&lt;li&gt;   all of the above present in VSTS for DB, Team System Server is not required&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Coming up in VSTS 2010&lt;/span&gt;
&lt;ul&gt;&lt;li&gt;   &lt;span style="font-weight: bold;"&gt;Planning, task management&lt;/span&gt;: creation of user stories / tasks hierarchy, capacity planning, reports to show test results per user story / task.&lt;/li&gt;&lt;li&gt;   &lt;span style="font-weight: bold;"&gt;Gated check-in&lt;/span&gt;: define check-in conditions, for instance you can't check-in if it doesn't build or if the unit-tests don't pass&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-841188105936888189?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='' href='https://downloads.eventpoint.com/teched2008-emea/presentations1/DVP03-IS%20(R)_Saad.pptx?ticket=d5b6ec3f-1020-47dc-8681-820369362909&amp;id=6dde1b8b-9457-45ae-b018-45510fda55da' length='0'/><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/841188105936888189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=841188105936888189' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/841188105936888189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/841188105936888189'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/11/monday-agile-development-in-vs2008-and.html' title='Monday - Agile Development in VS2008 and VS2010'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-4643025266201417206</id><published>2008-11-11T07:04:00.004Z</published><updated>2008-11-15T09:10:55.476Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='TechEd EMEA 2008'/><title type='text'>Monday - Keynote</title><content type='html'>The CCIB got much busier after lunch, delegates with orange badges running everywhere, and the auditorium was packed for the keynote.

&lt;span style="font-weight: bold;"&gt;The Keynote Session&lt;/span&gt;

Although Christopher Lloyd didn't appear on stage in a De Lorean as happened in TechEd 2007 in Orlando, this keynote was a pretty good one. Nothing about adding-business-value-by-leveraging-customer-statisfaction bs: &lt;a href="http://blogs.msdn.com/jasonz/archive/2008/11/10/teched-emea-2008-keynote-including-sharepoint-tools-for-vs.aspx"&gt;Jason Zander&lt;/a&gt; knew his audience so he did a demo-based presentation, going through some of the new features of Visual Studio 2010, changing, building and running code.

To show that VS still provides support for unmanaged C++ he imported a VC6 implementation of Pong into VS2010 then
&lt;ul&gt;&lt;li&gt;sexed-it up with the MFC C++ ribbon classes, &lt;/li&gt;&lt;li&gt;parallelised a lengthy &lt;span style="font-family:courier new;"&gt;for &lt;/span&gt;loop across 8 cores with &lt;span style="font-family:courier new;"&gt;parallel_for&lt;/span&gt;
&lt;/li&gt;&lt;li&gt;and eventually showed off the multi-touch capabilities of Windows 7 by moving both pong racquets with his fingers simultaneously, under a round of applause.&lt;/li&gt;&lt;/ul&gt;&lt;a href="mms://wm.microsoft.com/ms/emea/TechEd2008/KEY01_Dev.wmv"&gt;video&lt;/a&gt; of the keynote&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-4643025266201417206?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/4643025266201417206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=4643025266201417206' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/4643025266201417206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/4643025266201417206'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/11/monday-keynote.html' title='Monday - Keynote'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-8470078454085235439</id><published>2008-11-10T09:48:00.004Z</published><updated>2008-11-15T08:56:34.201Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='TechEd EMEA 2008'/><title type='text'>Monday - Silverlight 2.0</title><content type='html'>I am in Barcelona for TechEd. The keynote is planned for the afternoon, no sessions until after the keynote so my morning will be spent at the self-paced labs.

I had planned to do some labs about multithreading in Visual Studio but it looks like they've gone from the schedule!

Nevermind,  I just did a lab on &lt;span style="font-style: italic;"&gt;Silverlight Foundations&lt;/span&gt; lab (&lt;span style="font-weight: bold;"&gt;WUX11-HOL&lt;/span&gt;)

Notes from the lab:

• Silverlight projects produce xap files, wich are just zip files that contain dlls and a manifest.
• When you create a Silverlight project in Visual Studio, it generates a new ASP.NET project by default to host the silverlight control.
• Layout: VS contains some sort of read-only designer to preview the results of changes to the XAML file. Editing the layout WYSIWYG-style is done in Expression Blend.
• Blend much more powerful than Winforms editor: add rectangles, ellipses, bezier curves, clever resize/skew commands... Apparently you can switch back and forth from Blend to Visual Studio using the same solution/project files.
• Expression Design is used to build vector graphics that produce a XAML file.

I'm considering Silverlight to build business apps so I also started the Communications &lt;span style="font-style: italic;"&gt;and Data with Microsoft Silverlight 2.0 &lt;/span&gt;&lt;span&gt;(&lt;span style="font-weight: bold;"&gt;WUX14-HOL&lt;/span&gt;)&lt;/span&gt;&lt;span style="font-style: italic;"&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-8470078454085235439?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/8470078454085235439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=8470078454085235439' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/8470078454085235439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/8470078454085235439'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/11/silverlight-20.html' title='Monday - Silverlight 2.0'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-4861659432692678180</id><published>2008-11-04T09:07:00.003Z</published><updated>2008-11-07T10:55:52.331Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='wifi'/><title type='text'>Free Wifi in Istanbul</title><content type='html'>&lt;div&gt;It seems that in Istanbul, many coffee/restaurant chains provide free Wifi access.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Palladium shopping center:
&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Cafe Nero&lt;/div&gt;&lt;div&gt;Midpoint restaurant&lt;/div&gt;&lt;div&gt;SushiCo restaurant&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Capitol shopping center:
&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Kitchenette&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-4861659432692678180?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/4861659432692678180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=4861659432692678180' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/4861659432692678180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/4861659432692678180'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/11/free-wifi.html' title='Free Wifi in Istanbul'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-6300565387964844314</id><published>2008-11-02T17:05:00.005Z</published><updated>2008-11-02T17:19:20.520Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Sugar Sync</title><content type='html'>Currently visiting a friend in Istanbul who showed me a useful on-line storage tool: for $50 a year you can store 26GB of data online.&lt;div&gt;&lt;ul&gt;&lt;li&gt;your data is &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;encrypted&lt;/span&gt; with AES, which is the least you should ask for, really.&lt;/li&gt;&lt;li&gt;the really nice thing: it comes with a client that &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;automatically syncs&lt;/span&gt; your PC folders with the remote storage.&lt;/li&gt;&lt;li&gt;the sync works accross many PCs, which is cool as well.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;That means you don't need to schedule back-ups of your important files, this is an automatic instant &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;off-site backup&lt;/span&gt; (much more useful than my daily incremental Vista-based on-site backup).&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;An there's more:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;you can access your files online over the web.&lt;/li&gt;&lt;li&gt;you can, and that's really convenient, &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;send links to large files per email to other people&lt;/span&gt;. The recipient doesn't need to login to retrieve the file, he just clicks it. You get notified when he receives it.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-6300565387964844314?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='' href='http://www.sugarsync.com/' length='0'/><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/6300565387964844314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=6300565387964844314' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6300565387964844314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/6300565387964844314'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/11/sugar-sync.html' title='Sugar Sync'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-7348848686543231948</id><published>2008-10-12T17:30:00.004+01:00</published><updated>2009-01-02T20:59:08.400Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='time'/><title type='text'>Timezone conversion</title><content type='html'>&lt;div&gt;How to convert a local time from a given time zone into UTC?
&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;For instance how to convert the time in New York (Time zone: Eastern Standard Time) into UTC time, taking into account the fact that daylight saving is currently active in New York (until November 2)?

Sounds trivial? Well it's not, at least not until .NET Framework 3.5.
&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;The standard time zones are listed in the Windows registry: each time zone string is a key. The values under that key describe the timezone. For instance the "Eastern Standard Time" key contains info such as UTC offset and daylight saving start/end dates. Unless you use 3.5, you have to write code yourself to retrieve that info from the registry.

It looks like the simplest way to do it is to use &lt;a href="http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx"&gt;System.TimeZoneInfo&lt;/a&gt; in .NET 3.5.

Example:

&lt;span style="font-family:courier new;"&gt;            &lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;DateTime time = new DateTime(2008, 11, 7, 11, 46, 0, 0);&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;
TimeZoneInfo info = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;
DateTime utcTime = TimeZoneInfo.ConvertTimeFromUtc(time, info);&lt;/span&gt;  &lt;span style="font-family:courier new;"&gt;         

Console.WriteLine("New york time: " + time.ToString());&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;
Console.WriteLine("UTC time     : " + utcTime.ToString());&lt;/span&gt; &lt;/blockquote&gt;Some resources:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;General info about time zones: &lt;a href="http://www.timeanddate.com/"&gt;http://www.timeanddate.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Upcoming daylight saving changes: &lt;a href="http://www.timeanddate.com/time/dst2008b.html"&gt;http://www.timeanddate.com/time/dst2008b.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-7348848686543231948?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/7348848686543231948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=7348848686543231948' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7348848686543231948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7348848686543231948'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/10/timezone-conversion.html' title='Timezone conversion'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-8891101941679120692</id><published>2008-09-28T12:19:00.000+01:00</published><updated>2008-09-28T12:20:27.798+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><title type='text'>Curly Braces</title><content type='html'>&lt;div&gt;Visual Studio Add-in to highlight curly braces:&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;a href="http://www.codeproject.com/KB/macros/matchingbraces.aspx"&gt;http://www.codeproject.com/KB/macros/matchingbraces.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-8891101941679120692?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/8891101941679120692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=8891101941679120692' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/8891101941679120692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/8891101941679120692'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/09/curly-braces.html' title='Curly Braces'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-3589174474683693526</id><published>2008-09-02T21:19:00.004+01:00</published><updated>2008-09-14T20:48:02.276+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Listening To...'/><title type='text'>Currently Listening To...</title><content type='html'>&lt;ul&gt;&lt;li&gt;Hanselminutes: &lt;a class="__feedview__feedItemUnreadTitleLink" href="http://feeds.feedburner.com/~r/HanselminutesWMA/~3/375946676/default.aspx"&gt;.NET 3.5 SP1 is out...what's inside&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Mark Russinovitch, the Case of the Unexplained &lt;a href="http://www.microsoft.com/emea/spotlight/sessionh.aspx?videoid=722"&gt;http://www.microsoft.com/emea/spotlight/sessionh.aspx?videoid=722&lt;/a&gt; (TechEd Barcelona)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-3589174474683693526?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/3589174474683693526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=3589174474683693526' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3589174474683693526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3589174474683693526'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/09/currently-listening-to.html' title='Currently Listening To...'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-5888116506506435213</id><published>2008-06-16T16:35:00.003+01:00</published><updated>2008-07-17T20:04:23.371+01:00</updated><title type='text'>Code-Tourism</title><content type='html'>Code-tourism in London...

After a few hours of coding at home, I usually get bored and feel like I'm missing out.

So here is a new concept: coding while visiting London. I take my laptop with me and start wandering around. You need a 3G connection for this, Wifi is not enough.
Visit a museum, have a bicycle ride, then sit down somewhere in a park, a library or a coffee-shop to do some coding for an hour.

Good places to tourist-code:
&lt;ul&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Waterstones Picadilly&lt;/span&gt;: huge book-shop with comfy sofas.
&lt;/li&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Starbucks, Holland Park avenue&lt;/span&gt;. Comfortable seats and relaxing music. Bicycle racks outside. Crap 3G signal though.
&lt;/li&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Foyles, Charing Cross Road&lt;/span&gt;: the most complete bookshop for computing I know in London. No sofas though. You cannot take books to the coffee area.
&lt;/li&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Pret-a-Manger, Kensington&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold"&gt;High Street&lt;/span&gt;. Good seats. Bicycle racks outside.&lt;/li&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Bincho, OXO Tower&lt;/span&gt;. Japanese Grill Restaurant. Cool view to the Thames, very quiet during the week.&lt;/li&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;British Library&lt;/span&gt;: the cafe inside has plenty of tables next to a huge books tower.
&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-5888116506506435213?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/5888116506506435213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=5888116506506435213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5888116506506435213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5888116506506435213'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/06/code-tourism.html' title='Code-Tourism'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-7216822421024504645</id><published>2008-05-28T23:04:00.004+01:00</published><updated>2008-06-03T22:49:30.665+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Listening To...'/><title type='text'>Currently listening to...</title><content type='html'>&lt;p&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a class="__feedview__feedItemUnreadTitleLink" href="http://feeds.feedburner.com/~r/HanselminutesWMA/~3/301031795/default.aspx"&gt;Finding Passion for Software *or* The Return of the "Franklinator"&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;2 new episodes of Mondays....&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a class="__feedview__feedItemUnreadTitleLink" href="http://perseus.franklins.net/mondays_0074.wma"&gt;The Man-Boy Show&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="__feedview__feedItemUnreadTitleLink" href="http://perseus.franklins.net/mondays_0075_the_hehole_show.wma"&gt;The He Hole Show&lt;/a&gt;&lt;a href="http://perseus.franklins.net/mondays_0074.wma"&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-7216822421024504645?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/7216822421024504645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=7216822421024504645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7216822421024504645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7216822421024504645'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/05/currently-listening-to.html' title='Currently listening to...'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-1920257148021920642</id><published>2008-05-27T22:55:00.002+01:00</published><updated>2008-05-27T23:03:33.696+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Books'/><title type='text'>Books I currently flip through #5</title><content type='html'>&lt;ul&gt;&lt;li&gt;A colleague recently recommended &lt;a href="http://www.amazon.co.uk/Windows-via-C%2B%2B-Fifth-PRO-Developer/dp/0735624240/ref=sr_1_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1211925432&amp;amp;sr=8-2"&gt;Windows via C/C++&lt;/a&gt; (Jeffrey Richter)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.co.uk/Derivatives-Demystified-Step-Step-Forwards/dp/047009382X/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1211925746&amp;amp;sr=8-1"&gt;Derivatives demystified&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-1920257148021920642?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/1920257148021920642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=1920257148021920642' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1920257148021920642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1920257148021920642'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/05/books-i-currently-flip-through-5.html' title='Books I currently flip through #5'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-2634070843107204807</id><published>2008-05-10T17:06:00.005+01:00</published><updated>2008-05-27T23:00:59.470+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Things missing from C++</title><content type='html'>I'm using unmanaged C++ for a new project at work. For a while we hesitated between C++ and C# and eventually went for unmanaged C++ because of legacy libraries.

I miss some of the C# features such as:
&lt;ul&gt;&lt;li&gt;No cpp/h separation&lt;/li&gt;&lt;li&gt;Automatic creation of properties from a member field with snippets&lt;/li&gt;&lt;li&gt;Automatic implementation of interface methods in concrete classes.&lt;/li&gt;&lt;li&gt;The .NET collections (I am currently using the STL collections, they're a real pain in the bum)&lt;/li&gt;&lt;li&gt;Interfaces: although you can simulate interfaces in C++ by creating a class only just virtual pure methods and no field, there is still a risk it turns into a base class if someone adds some code to a method...
&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-2634070843107204807?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/2634070843107204807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=2634070843107204807' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/2634070843107204807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/2634070843107204807'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/05/things-missing-from-c.html' title='Things missing from C++'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-1019243425454248659</id><published>2008-05-10T07:27:00.002+01:00</published><updated>2008-05-28T22:53:01.772+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><title type='text'>.NET Framework 3.5</title><content type='html'>The .NET Framework 3.5 complete install package:

&lt;a href="http://download.microsoft.com/download/6/0/f/60fc5854-3cb8-4892-b6db-bd4f42510f28/dotnetfx35.exe"&gt;http://download.microsoft.com/download/6/0/f/60fc5854-3cb8-4892-b6db-bd4f42510f28/dotnetfx35.exe&lt;/a&gt;

The install DVD download for Visual C# Express 2008
&lt;a href="http://www.microsoft.com/express/download/"&gt;http://www.microsoft.com/express/download/&lt;/a&gt; at the bottom of the page&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-1019243425454248659?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/1019243425454248659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=1019243425454248659' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1019243425454248659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1019243425454248659'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/05/blog-post.html' title='.NET Framework 3.5'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-843384492099761876</id><published>2008-03-23T13:25:00.004Z</published><updated>2008-03-23T22:20:00.578Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vista'/><title type='text'>Installing Windows Vista 64</title><content type='html'>&lt;div&gt; &lt;/div&gt;&lt;ul&gt;&lt;li&gt;13:30 Started install, booted from DVD.&lt;/li&gt;&lt;li&gt;14:26 OS Installed ok. Had a crash during install after creation of the admin user but carried on with install. My NVIDIA Quadro FX3500 is recognised immediately and works in 2500x1600. Did not have to install the NVIDIA driver yet, using the driver provided by Microsoft. Now running Windows update. &lt;/li&gt;&lt;li&gt;15:32 Windows updated completed. Rebooting OS.&lt;/li&gt;&lt;li&gt;16:00 Ran Windows update again. &lt;span style="font-weight: bold;"&gt;Service Pack 1 does not appear in Windows Update&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;yet&lt;/span&gt;. Installed Kaspersky 7.0.1.325.
&lt;/li&gt;&lt;li&gt;16:40 Installed Office Ultimate and ran Windows update. Office Service Pack 1 appears in the list of updates. Started installing it.&lt;/li&gt;&lt;li&gt;17:26. Office Service Pack 1 installed ok.&lt;/li&gt;&lt;li&gt;18:15. Finished configuring Outlook email.
I have a Hauppage WinTV-HVR. Does it support Vista 64? Apparently yes according to this page:
&lt;a href="http://www.hauppauge.co.uk/pages/whatsnew/vista.html"&gt;http://www.hauppauge.co.uk/pages/whatsnew/vista.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;18:45 Downloaded the software and Vista 64 drivers for WinTV-HVR 1100 from the Hauppage support website. &lt;span style="font-weight: bold;"&gt;Driver install failed&lt;/span&gt;: it could not find the hardware.
Interestingly, Windows Media Center can use the card: though downloading TV guide failed, scanning of freeview channels worked perfectly.
&lt;/li&gt;&lt;li&gt;19:00 Understood why downloading the TV guides with Windows Media Center failed: Kaspersky antivirus was being to keen. Disabled it and it worked fine.&lt;/li&gt;&lt;li&gt;Installed the logitech drivers of my S510 keyboard to be able to control Media Center from the Logitech remote. It works brilliantly.
&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Summary&lt;/span&gt;: I installed the 64 bit version of Windows Vista today and everything seems to be working fine. My Nvidia card hasn't crashed yet. So far the only driver that caused me grief was the Hauppage card when using it with WinTV software. The WinTV software is a big pile of poo anyway, who wants to use that when you have something like Windows Media Center?

I might discover more hardware problems this week.



&lt;div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-843384492099761876?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/843384492099761876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=843384492099761876' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/843384492099761876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/843384492099761876'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/03/installing-windows-vista-64.html' title='Installing Windows Vista 64'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-8392423129655286014</id><published>2008-02-06T22:24:00.000Z</published><updated>2008-02-06T22:30:55.963Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Listening To...'/><title type='text'>Currently Listening To</title><content type='html'>&lt;ul&gt;&lt;li&gt;Dot Net Rocks:&lt;a href="http://feeds.feedburner.com/%7Er/netRocksWmadirect/%7E5/226311227/dotnetrocks_0312_andy_leonard.wma"&gt; Andy Leonard on Unit Testing your Database&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-8392423129655286014?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/8392423129655286014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=8392423129655286014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/8392423129655286014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/8392423129655286014'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/02/currently-listening-to.html' title='Currently Listening To'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-1737732212921890149</id><published>2008-02-03T14:12:00.000Z</published><updated>2008-02-03T14:16:10.934Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Links'/><title type='text'>Usefull Links</title><content type='html'>List of Visual Studio shortcut keys: 

&lt;a href="http://www.dofactory.com/ShortCutKeys/ShortCutKeys.aspx#textsel"&gt;http://www.dofactory.com/ShortCutKeys/ShortCutKeys.aspx#textsel&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-1737732212921890149?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/1737732212921890149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=1737732212921890149' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1737732212921890149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/1737732212921890149'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/02/usefull-links.html' title='Usefull Links'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-7982865059344953916</id><published>2008-01-12T12:45:00.001Z</published><updated>2008-01-12T13:10:03.809Z</updated><title type='text'>Pandora not available in the UK</title><content type='html'>I started using Pandora in April 2006 and it quickly became the only way I listened to music at home. It simply matches my approach music: I tend to get bored of tracks fairly quickly and need to renew my list of favorites very often. Also my tastes are not too mainstream. The &lt;em&gt;Find similar &lt;/em&gt;&lt;em&gt;or bin it &lt;/em&gt;model of Pandora is perfect for me: I built a collection of genres (electronic, heavy metal, dark ages...) and keep switching from one to the other depending on the mental state I want to be in. I discovered artists I never heard of before: KMFDM, Pro-Pain, Darkwell, Leave's Eyes, Kill Hannah, Nightwish, Theatre of Tragedy, Elis, Lacuna Coil...

I even ended up buying the CDs of those I wanted to listen in loop.

Unfortunately, because of licensing issues the service will very soon stop in the UK...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-7982865059344953916?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/7982865059344953916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=7982865059344953916' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7982865059344953916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/7982865059344953916'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2008/01/pandora-not-available-in-uk.html' title='Pandora not available in the UK'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-5435638047435844027</id><published>2007-11-30T10:35:00.001Z</published><updated>2008-12-27T08:52:04.293Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>Usefull Tools</title><content type='html'>&lt;ul&gt;&lt;li&gt;editor: &lt;a href="http://www.notepad2.com/"&gt;&lt;strong&gt;Notepad2&lt;/strong&gt; &lt;/a&gt;(free)&lt;/li&gt;&lt;li&gt;screen capture: &lt;strong&gt;&lt;a href="http://www.download.com/ScreenHunter/3000-2192_4-10732691.html?tag=lst-1"&gt;Screen Hunter 5&lt;/a&gt;&lt;/strong&gt; (free for business use)&lt;/li&gt;&lt;li&gt;secure FTP client: &lt;strong&gt;&lt;a href="http://www.coreftp.com/"&gt;Core FTP LE&lt;/a&gt;&lt;/strong&gt; (free for business use)&lt;/li&gt;&lt;li&gt;refactoring for C++: &lt;a href="http://www.devexpress.com/Products/NET/IDETools/RefactorCPP/"&gt;&lt;strong&gt;Refactor!&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;(free for business use)&lt;/li&gt;&lt;li&gt;cheap Photoshop-like: &lt;a href="http://www.getpaint.net/"&gt;&lt;strong&gt;Paint.NET&lt;/strong&gt;&lt;/a&gt; (free)&lt;/li&gt;&lt;li&gt;browse .NET assemblies: &lt;a href="http://www.aisto.com/roeder/dotnet/"&gt;&lt;strong&gt;Reflector&lt;/strong&gt;&lt;/a&gt; (free)&lt;/li&gt;&lt;li&gt;Web Apps: &lt;a href="http://www.dumblittleman.com/2008/12/21-excellent-web-apps-for-college.html"&gt;http://www.dumblittleman.com/2008/12/21-excellent-web-apps-for-college.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-5435638047435844027?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/5435638047435844027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=5435638047435844027' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5435638047435844027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5435638047435844027'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2007/11/usefull-tools.html' title='Usefull Tools'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-8608446227729858864</id><published>2007-11-23T22:08:00.000Z</published><updated>2007-12-05T21:21:52.812Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Listening To...'/><title type='text'>Currently listening to...</title><content type='html'>&lt;ul&gt;&lt;li&gt;Martin Wolf - FT.com - &lt;a href="http://podcast.ft.com/media/424.mp3"&gt;Welcome to a world of runaway energy demand&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Channel 9 - MFC is back! - &lt;a href="http://mschnlnine.vo.llnwd.net/d1/ch9/0/NextGenMFC.wmv"&gt;Pat Brenner: New Updates to MFC in Visual Studio 2008&lt;/a&gt;. This is quite an event. Nothing happened in MFC since Visual Studio 6 in 1998. I'm really surprised since I talked with a Visual Studio developer at TechEd who told me there would be nothing new for unmanaged C++ in Visual Studio 2008.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-8608446227729858864?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/8608446227729858864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=8608446227729858864' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/8608446227729858864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/8608446227729858864'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2007/11/currently-listening-to.html' title='Currently listening to...'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-4940764133886590069</id><published>2007-10-28T21:37:00.000Z</published><updated>2007-10-28T21:42:10.631Z</updated><title type='text'>There's Perception and There's Reality</title><content type='html'>Joe Wilcox on Apple and Microsoft:

&lt;a href="http://www.microsoft-watch.com/content/operating_systems/the_great_double_standard.html?kc=MWRSS02129TX1K0000535"&gt;http://www.microsoft-watch.com/content/operating_systems/the_great_double_standard.html?kc=MWRSS02129TX1K0000535&lt;/a&gt;

&lt;blockquote&gt;The blogosphere will praise Leopard as the next best thing ever and use it
as more proof why Vista sucks (It doesn't). Meanwhile, there will be little good
said about Microsoft's colossal 2008 fiscal first quarter results. Those people
acknowledging the earnings results will blame Microsoft for trying to kill Linux
and babies in Africa as reasons for its success. The perception: When Microsoft
competes, it cheats.
There is a double standard.
&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-4940764133886590069?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/4940764133886590069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=4940764133886590069' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/4940764133886590069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/4940764133886590069'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2007/10/theres-perception-and-theres-reality.html' title='There&apos;s Perception and There&apos;s Reality'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-8290999006294747429</id><published>2007-10-07T14:49:00.000+01:00</published><updated>2007-10-08T10:27:24.623+01:00</updated><title type='text'>Performance Measurement for Financial Systems - Messaging</title><content type='html'>&lt;ul&gt;
&lt;/ul&gt;&lt;p&gt;Performance Measurement for Financial Systems&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Seanet: &lt;a href="http://www.seanet-tech.com/products.html"&gt;http://www.seanet-tech.com/products.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Wombat: &lt;a href="http://www.wombatfs.com/"&gt;http://www.wombatfs.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Endace: &lt;a href="http://www.endace.com/"&gt;http://www.endace.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Messaging Systems&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Martin Fowler: &lt;a class="tenpxBold" title="Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions" href="http://safari.oreilly.com/0321200683"&gt;Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-8290999006294747429?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/8290999006294747429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=8290999006294747429' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/8290999006294747429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/8290999006294747429'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2007/10/performance-measurement-for-financial.html' title='Performance Measurement for Financial Systems - Messaging'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-3758997331394939497</id><published>2007-09-23T21:09:00.000+01:00</published><updated>2007-09-26T21:11:35.977+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TechEd2007'/><title type='text'>Got my TechEd DVD</title><content type='html'>Received the 6DVDs per post. Will never run out of stuff to listen to...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-3758997331394939497?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/3758997331394939497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=3758997331394939497' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3758997331394939497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/3758997331394939497'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2007/09/got-my-teched-dvd.html' title='Got my TechEd DVD'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-4048124686791918264</id><published>2007-09-13T21:35:00.000+01:00</published><updated>2007-09-13T21:37:13.444+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TechEd2007'/><title type='text'>TechEd DVD</title><content type='html'>The TechEd DVD is on its way!

&lt;blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;p&gt;Dear Tech.Ed 2007 Attendee, This e-mail serves as confirmation that
your Tech.Ed 2007 DVD set has been shipped and you should be receiving it within
1-2 weeks (International locations may take longer).  The DVD set has been
sent via the U.S. Postal Service to the address included with your registration
information. 
&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-4048124686791918264?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/4048124686791918264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=4048124686791918264' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/4048124686791918264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/4048124686791918264'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2007/09/teched-dvd.html' title='TechEd DVD'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-629569137727862167</id><published>2007-07-21T21:44:00.000+01:00</published><updated>2007-07-31T22:23:54.606+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Listening To...'/><title type='text'>Currently listening to...</title><content type='html'>&lt;ul&gt;&lt;li&gt;Hanselminutes: &lt;a class="__feedview__feedItemUnreadTitleLink" href="http://feeds.feedburner.com/~r/HanselminutesWMA/~3/137931730/hanselminutes_0074.wma"&gt;Jeff Atwood overclocks the Ultimate PC&lt;/a&gt;&lt;/li&gt;&lt;li&gt;.NET Rocks: &lt;a class="__feedview__feedItemUnreadTitleLink" href="http://feeds.feedburner.com/~r/netRocksWmadirect/~3/139104615/dotnetrocks_0259_dan_ciruli.wma"&gt;Dan Ciruli's Grid Computing Redux&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-629569137727862167?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/629569137727862167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=629569137727862167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/629569137727862167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/629569137727862167'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2007/07/currently-listening-to.html' title='Currently listening to...'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6591634966281957831.post-5928914508979698967</id><published>2007-07-14T08:01:00.000+01:00</published><updated>2007-08-10T09:48:56.175+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ToRead'/><title type='text'>Currently Reading...</title><content type='html'>&lt;ul&gt;&lt;li&gt;Dr Dobb's: &lt;a href="http://www.ddj.com/dept/cpp/200001985;jsessionid=OKIQ3V2IYT2NIQSNDLRSKH0CJUNN2JVN?pgno=2"&gt;The Pillars of Concurrency&lt;/a&gt;&lt;/li&gt;&lt;li&gt;ft.com: &lt;a href="http://www.ft.com/cms/s/7886e2a8-b967-11da-9d02-0000779e2340.html"&gt;The dream machine: invention of credit derivatives&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591634966281957831-5928914508979698967?l=www.codinginlondon.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.codinginlondon.com/feeds/5928914508979698967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591634966281957831&amp;postID=5928914508979698967' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5928914508979698967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591634966281957831/posts/default/5928914508979698967'/><link rel='alternate' type='text/html' href='http://www.codinginlondon.com/2007/07/to-read.html' title='Currently Reading...'/><author><name>Matt</name><uri>http://www.blogger.com/profile/16209439145792060431</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_QNxJ6n10eEU/S_WYBDwzcLI/AAAAAAAAAIE/5cK7cXfi4jw/S220/DesertMatt2+(640x640).jpg'/></author><thr:total>0</thr:total></entry></feed>
