<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;AkEDRH8zfip7ImA9WhdUFU4.&quot;"><id>tag:blogger.com,1999:blog-3308330123380486651</id><updated>2011-10-02T08:57:55.186+02:00</updated><category term="TDD" /><category term="LEAP" /><category term="Architecture" /><category term="WCF" /><category term="CQRS" /><category term="Code analysis" /><category term="BDD" /><category term="Podcast" /><category term="CruiseControl.Net" /><category term="DDD" /><category term="SOA" /><category term="Azure" /><category term="Automation" /><category term="Silverlight" /><category term="Windows 7" /><title>Sverre's blog</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://sverrehundeide.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://sverrehundeide.blogspot.com/" /><author><name>sverrehundeide</name><uri>http://www.blogger.com/profile/08018607198830272906</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://1.bp.blogspot.com/_450l3VHhZSU/SV_v6tt1GvI/AAAAAAAAAAM/gu15cR4YG0I/S220/Sverre2.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/SverresBlog" /><feedburner:info uri="sverresblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;AkEDRH04fip7ImA9WhdUFU4.&quot;"><id>tag:blogger.com,1999:blog-3308330123380486651.post-5620438407022336235</id><published>2011-09-29T11:37:00.000+02:00</published><updated>2011-10-02T08:57:55.336+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-02T08:57:55.336+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="CruiseControl.Net" /><category scheme="http://www.blogger.com/atom/ns#" term="Automation" /><title>First experiences with using WinRM/WinRS for remote deployment</title><content type="html">&lt;h4&gt;&lt;/h4&gt;  &lt;h4&gt;What is WinRM/WinRS?&lt;/h4&gt;  &lt;p&gt;Windows Remote Management (&lt;strong&gt;WinRM&lt;/strong&gt;) is a remote management service which was first released with Windows 2003 R2. &lt;/p&gt;  &lt;p&gt;WinRM is a server component, while Windows Remote Shell (&lt;strong&gt;WinRS&lt;/strong&gt;) is a client which can be used for executing programs remotely on computers which run WinRM.&lt;/p&gt;  &lt;p&gt;The following example shows how to remotely list the contents of the C:\ folder on a computer with host name Server01:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;WinRS –r:Server01 dir c:\&lt;/p&gt; &lt;/blockquote&gt;  &lt;h4&gt;Using WinRM for remote deployment&lt;/h4&gt;  &lt;p&gt;My first encounter with WinRM/WinRS was to execute some PowerShell scripts for automatic remote deployment of a test environment. The commands were executed from an MSBuild script in a CruiseControl.Net build.&lt;/p&gt;  &lt;p&gt;The scripts would first uninstall any old versions of the components, and then renew databases and install new component versions. Finally a set of NUnit tests would be executed on the environment.&lt;/p&gt;  &lt;h4&gt;WinRS failing to execute remote commands due to limited quotas&lt;/h4&gt;  &lt;p&gt;It was very easy to get started with WinRS, and in the beginning everything seemed to work fine. But now and then the execution failed with System.OutOfMemoryException or with the message “Process is terminated due to StackOverflowException.”.&lt;/p&gt;  &lt;p&gt;The reason for these problems was not obvious since there was no mention of quotas in the error messages, but after some investigation it turned out that they were caused by a too low memory quota on the server. The default memory quota is 150 MB, and can be changed by executing the following command on the remote server (will set memory quota to 1 GB):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;WinRM set winrm/config/Winrs @{MaxMemoryPerShellMB = &amp;quot;1000&amp;quot;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;h4&gt;Multi-Hop configuration&lt;/h4&gt;  &lt;p&gt;In one of my scripts i tried use a UNC path to access a remote share from the target computer, but got “Access is denied”. It turned out that the Credential Security Service Provider (CredSSP)&amp;#160; had to be configured on the client and on the server in order to achieve this: &lt;a title="http://msdn.microsoft.com/en-us/library/windows/desktop/ee309365(v=VS.85).aspx" href="http://msdn.microsoft.com/en-us/library/windows/desktop/ee309365(v=VS.85).aspx" target="_blank"&gt;http://msdn.microsoft.com/en-us/library/windows/desktop/ee309365(v=VS.85).aspx&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;Resources&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://technet.microsoft.com/en-us/library/dd163506.aspx" target="_blank"&gt;Configuring WinRM&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee309367%28VS.85%29.aspx" target="_blank"&gt;Quota Management for Remote Shells&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/3308330123380486651-5620438407022336235?l=sverrehundeide.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SverresBlog/~4/yffcdw6O0wg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sverrehundeide.blogspot.com/feeds/5620438407022336235/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://sverrehundeide.blogspot.com/2011/09/first-experiences-with-using-winrmwinrs.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/5620438407022336235?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/5620438407022336235?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SverresBlog/~3/yffcdw6O0wg/first-experiences-with-using-winrmwinrs.html" title="First experiences with using WinRM/WinRS for remote deployment" /><author><name>sverrehundeide</name><uri>http://www.blogger.com/profile/08018607198830272906</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://1.bp.blogspot.com/_450l3VHhZSU/SV_v6tt1GvI/AAAAAAAAAAM/gu15cR4YG0I/S220/Sverre2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sverrehundeide.blogspot.com/2011/09/first-experiences-with-using-winrmwinrs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQFR3o7fyp7ImA9WhdRGE8.&quot;"><id>tag:blogger.com,1999:blog-3308330123380486651.post-6824605721051523697</id><published>2011-08-04T10:53:00.001+02:00</published><updated>2011-08-08T18:18:36.407+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-08T18:18:36.407+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="CruiseControl.Net" /><category scheme="http://www.blogger.com/atom/ns#" term="Code analysis" /><title>Using Gendarme with CruiseControl.Net for code analysis</title><content type="html">&lt;p&gt;Gendarme is being developed as a part of the Mono project and is a tool for code analysis. It comes with a wide range of predefined rules and can easily be extended with you own custom rules which you can write in C# or other .Net languages.&lt;/p&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;h4&gt;Configuring the CruiseControl.Net buidl task&lt;/h4&gt; CruiseControl.Net has been delivered with the Gendarme task since version 1.4.3. However, the Gendarme executable must be downloaded and installed separately. The binary can be downloaded from this link: &lt;a href="https://github.com/spouliot/gendarme/downloads" target="_blank"&gt;https://github.com/spouliot/gendarme/downloads&lt;/a&gt;   &lt;p&gt;   &lt;br /&gt;Gendarme is designed for processing the build output assemblies in ONE directory. I.e. it does not support recursive search for assemblies, which fits well if you have one CruiseControl.Net build project per service/application, but in my case I wanted to generate a report for an entire product branch with multiple services and applications.     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;This can be achieved by using the &amp;lt;assemblyListFile&amp;gt; configuration element, which lets you specify a file that contains the full path to each assembly which should be analysed.    &lt;br /&gt;In order to generate the file, I execute the following PowerShell command:     &lt;br /&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre class="code"&gt;&lt;span style="color: #5f9ea0"&gt;Get-ChildItem -Path &lt;/span&gt;&lt;span style="color: maroon"&gt;'D:\SomeDir\Work' &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;-Recurse -Include &lt;/span&gt;&lt;span style="color: black"&gt;MyCompany*.dll &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;-Exclude &lt;/span&gt;&lt;span style="color: black"&gt;*.Test*.dll,*&lt;/span&gt;&lt;span style="color: maroon"&gt;&lt;font color="#000000"&gt;Generated.dll&lt;/font&gt; &lt;/span&gt;&lt;span style="color: black"&gt;| &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;sort -Property &lt;/span&gt;&lt;span style="color: maroon"&gt;Name &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;-Unique &lt;/span&gt;&lt;span style="color: black"&gt;| &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;sort -Property &lt;/span&gt;&lt;span style="color: maroon"&gt;FullName &lt;/span&gt;&lt;span style="color: black"&gt;| &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;foreach &lt;/span&gt;&lt;span style="color: black"&gt;{&lt;/span&gt;&lt;span style="color: purple"&gt;$_&lt;/span&gt;&lt;span style="color: black"&gt;.FullName} | &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;Out-File -FilePath &lt;/span&gt;&lt;span style="color: maroon"&gt;'D:\SomeDir\Artifact\AssembliesForCodeAnalysis.txt' &lt;/span&gt;&lt;span style="color: #5f9ea0"&gt;-Width &lt;/span&gt;&lt;span style="color: black"&gt;255&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;pre class="code"&gt;&lt;font face="Georgia"&gt;The PowerShell command above will recursively scan through the directory “D:\SomeDir\Work” and include all DLL files starting with “MyCompany” excluding those which ends with “.Test.dll” or “Generated.dll”. Next it will select distinct files regardless of paths (in order to filter out shared assemblies which are duplicated), before it sorts by full path name and write the output to file.&lt;/font&gt;&lt;/pre&gt;

&lt;p&gt;Using the PowerShell command as an executable step, the project configuration in ccnet.config turns into this:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;msbuild&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;exec&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;executable&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;powershell&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;executable&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;buildArgs&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;-Command &amp;quot;Get-ChildItem -Path 'D:\SomeDir\Work' -Recurse -Include MyCompany*.dll -Exclude *.Test*.dll,*Generated.dll | sort -Property Name -Unique | sort -Property FullName | foreach {$_.FullName} | Out-File -FilePath 'D:\SomeDir\Artifact\AssembliesForCodeAnalysis.txt' -Width 255&amp;quot;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;buildArgs&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;exec&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;gendarme&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;executable&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;C:\Program Files (x86)\Gendarme\gendarme.exe&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;executable&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;assemblyListFile&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;D:\SomeDir\Artifact\AssembliesForCodeAnalysis.txt&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;assemblyListFile&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;baseDirectory&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;D:\SomeDir\Work&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;baseDirectory&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;limit&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;2000&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;limit&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;severity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;medium+&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;severity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;confidence&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;high&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;confidence&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;quiet&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;FALSE&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;quiet&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;verbose&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;TRUE&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;verbose&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;failBuildOnFoundDefects&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;FALSE&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;failBuildOnFoundDefects&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;verifyTimeoutSeconds&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;600&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;verifyTimeoutSeconds&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;gendarme&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;          &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tasks&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;publishers&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;merge&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;files&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;file&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;D:\SomeDir\Artifact\test-results\*.xml&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;file&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;file&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;D:\SomeDir\Artifact\gendarme-results.xml&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;file&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;files&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;merge&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;statistics&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
  &lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;h4&gt;Configuring the Dashboard&lt;/h4&gt;

&lt;p&gt;The stylesheets which are needed for showing the formatted reports in the CruiseControl.Net dasboard are included with the CruiseControl.Net installation, and just need to be referenced in dasboard.config:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;     &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;buildPlugins&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;buildReportBuildPlugin&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xslFileNames&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;          &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xslFile&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;xsl\gendarme-summary-ccnet.xsl&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xslFile&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;       &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xslFileNames&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;       &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xslReportBuildPlugin&lt;/span&gt; &lt;span class="attr"&gt;description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Gendarme Report&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;actionName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;GendarmeBuildReport&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;xslFileName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;xsl\gendarme-report-ccnet.xsl&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;buildReportBuildPlugin&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;h4&gt;Resources&lt;/h4&gt;

&lt;p&gt;Gendarme home page: &lt;a title="http://www.mono-project.com/Gendarme" href="http://www.mono-project.com/Gendarme" target="_blank"&gt;http://www.mono-project.com/Gendarme&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gendarme CCNet task configuration: &lt;a title="http://confluence.public.thoughtworks.org/display/CCNET/Gendarme+Task" href="http://confluence.public.thoughtworks.org/display/CCNET/Gendarme+Task" target="_blank"&gt;http://confluence.public.thoughtworks.org/display/CCNET/Gendarme+Task&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/3308330123380486651-6824605721051523697?l=sverrehundeide.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SverresBlog/~4/HT4kKUTGBUw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sverrehundeide.blogspot.com/feeds/6824605721051523697/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://sverrehundeide.blogspot.com/2011/08/using-gendarme-with-cruisecontrolnet.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/6824605721051523697?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/6824605721051523697?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SverresBlog/~3/HT4kKUTGBUw/using-gendarme-with-cruisecontrolnet.html" title="Using Gendarme with CruiseControl.Net for code analysis" /><author><name>sverrehundeide</name><uri>http://www.blogger.com/profile/08018607198830272906</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://1.bp.blogspot.com/_450l3VHhZSU/SV_v6tt1GvI/AAAAAAAAAAM/gu15cR4YG0I/S220/Sverre2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sverrehundeide.blogspot.com/2011/08/using-gendarme-with-cruisecontrolnet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAMQ3o6eCp7ImA9Wx9RF0o.&quot;"><id>tag:blogger.com,1999:blog-3308330123380486651.post-4663395522419222709</id><published>2010-12-19T00:09:00.000+01:00</published><updated>2010-12-19T16:49:42.410+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-19T16:49:42.410+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="CruiseControl.Net" /><title>Intellisense for CruiseControl.Net configuration files</title><content type="html">&lt;p&gt;Editing the CruiseControl .Net configuration file &lt;em&gt;ccnet.config&lt;/em&gt; may be a cumbersome process. The XML configuration elements are documented at &lt;a title="http://ccnetlive.thoughtworks.com/ccnet/doc/CCNET/Configuring%20the%20Server.html" href="http://ccnetlive.thoughtworks.com/ccnet/doc/CCNET/Configuring%20the%20Server.html"&gt;http://ccnetlive.thoughtworks.com/ccnet/doc/CCNET/Configuring%20the%20Server.html&lt;/a&gt;, but it would be more convenient to have intellisense available when editing the configuration file.&lt;/p&gt;  &lt;p&gt;Intellisense for CCNet configuration files can be added to Visual Studio by using the schema definition file ccnet.xsd. Unfortunately this file is not distributed by the CCNet installation package, but it is included in the source distribution. For the current version the file is located at “\project\ccnet.xsd” in the downloadable source distribution zip file.&lt;/p&gt;  &lt;p&gt;Your can also get it &lt;a href="http://ccnet.svn.sourceforge.net/viewvc/ccnet/branches/RB_1_5/project/ccnet.xsd?view=log&amp;amp;pathrev=7889" target="_blank"&gt;from the the source code repository at SourceForge&lt;/a&gt; (link is to version 1.5).&lt;/p&gt;  &lt;h4&gt;Adding the XSD schema to Visual Studio&lt;/h4&gt;  &lt;p&gt;Once you have gotten your hands on the ccned.xsd file, it must be copied to the schema folder of your Visual Studio installation, e.g. to&amp;#160; “C:\Program Files (x86)\Microsoft Visual Studio 10.0\Xml\Schemas\”.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Copying the file to the folder “Microsoft Visual Studio 10.0\Common7\Packages\schemas\xml” will not have any effect!&lt;/p&gt;  &lt;h4&gt;Configuring the namespace&lt;/h4&gt;  &lt;p&gt;&lt;span style="color: blue"&gt;&lt;font color="#333333"&gt;Which namespace should be used for the CCNet configuration files? A namespace must be specified in order for Visual Studio to know which schema to use for intellisense. &lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color: blue"&gt;&lt;font color="#333333"&gt;CCnet.xsd defines the target namespace &lt;font face="Courier New"&gt;&amp;quot;http://thoughtworks.org/ccnet/1/5&amp;quot;&lt;/font&gt;:&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color: blue"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: #a31515"&gt;xml &lt;/span&gt;&lt;span style="color: red"&gt;version&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;1.0&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;encoding&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;?&amp;gt;      &lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xs:schema &lt;/span&gt;&lt;font style="background-color: #ffff00"&gt;&lt;span style="color: red"&gt;targetNamespace&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://thoughtworks.org/ccnet/1/5&lt;/span&gt;&amp;quot;&lt;/font&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;elementFormDefault&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;qualified&lt;/span&gt;&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://thoughtworks.org/ccnet/1/5&lt;/span&gt;&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;xmlns:xs&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://www.w3.org/2001/XMLSchema&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;xs:element &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;cruisecontrol&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;      &lt;br /&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color: blue"&gt;&lt;font color="#000000"&gt;… which means that the following namespace must be defined in the CCNet configuration files:&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;cruisecontrol &lt;/span&gt;&lt;font style="background-color: #ffff00"&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://thoughtworks.org/ccnet/1/5&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;span style="color: blue"&gt;&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;project &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;foo&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;webURL&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;http://localhost/ccnet&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;webURL&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;modificationDelaySeconds&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;10&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;modificationDelaySeconds&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;      &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color: blue"&gt;&lt;font color="#000000"&gt;The schema file seems to favor using XML elements instead of attributes for many configuration options, which contradicts many of the example configurations which are distributed with CCNet, but I don’t consider this as being a big issue. &lt;/font&gt;&lt;/span&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3308330123380486651-4663395522419222709?l=sverrehundeide.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SverresBlog/~4/LHAsLOiG_gU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sverrehundeide.blogspot.com/feeds/4663395522419222709/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://sverrehundeide.blogspot.com/2010/12/intellisense-for-cruisecontrolnet.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/4663395522419222709?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/4663395522419222709?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SverresBlog/~3/LHAsLOiG_gU/intellisense-for-cruisecontrolnet.html" title="Intellisense for CruiseControl.Net configuration files" /><author><name>sverrehundeide</name><uri>http://www.blogger.com/profile/08018607198830272906</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://1.bp.blogspot.com/_450l3VHhZSU/SV_v6tt1GvI/AAAAAAAAAAM/gu15cR4YG0I/S220/Sverre2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sverrehundeide.blogspot.com/2010/12/intellisense-for-cruisecontrolnet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkENQHc-fCp7ImA9WxFXGEQ.&quot;"><id>tag:blogger.com,1999:blog-3308330123380486651.post-6190843922781542264</id><published>2010-05-26T20:31:00.001+02:00</published><updated>2010-05-26T20:31:31.954+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-26T20:31:31.954+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SOA" /><category scheme="http://www.blogger.com/atom/ns#" term="Architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="WCF" /><title>Presentation: “Introduksjon til NServiceBus”</title><content type="html">&lt;p&gt;On 25th of May I presented NServiceBus at NNUG Oslo. The presentation is now available at Slideshare (in Norwegian):&lt;/p&gt;  &lt;div style="width:425px" id="__ss_4319947"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/sverrehundeide/introduksjon-til-nservicebus" title="Introduksjon til NServiceBus"&gt;Introduksjon til NServiceBus&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse4319947" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=nservicebuspresentasjon-100526131359-phpapp02&amp;amp;stripped_title=introduksjon-til-nservicebus" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed name="__sse4319947" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=nservicebuspresentasjon-100526131359-phpapp02&amp;amp;stripped_title=introduksjon-til-nservicebus" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/sverrehundeide"&gt;Sverre Hundeide&lt;/a&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/3308330123380486651-6190843922781542264?l=sverrehundeide.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SverresBlog/~4/KVZOtaReLB0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sverrehundeide.blogspot.com/feeds/6190843922781542264/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://sverrehundeide.blogspot.com/2010/05/presentation-introduksjon-til.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/6190843922781542264?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/6190843922781542264?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SverresBlog/~3/KVZOtaReLB0/presentation-introduksjon-til.html" title="Presentation: “Introduksjon til NServiceBus”" /><author><name>sverrehundeide</name><uri>http://www.blogger.com/profile/08018607198830272906</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://1.bp.blogspot.com/_450l3VHhZSU/SV_v6tt1GvI/AAAAAAAAAAM/gu15cR4YG0I/S220/Sverre2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sverrehundeide.blogspot.com/2010/05/presentation-introduksjon-til.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8ERH4_eSp7ImA9WxFXGEQ.&quot;"><id>tag:blogger.com,1999:blog-3308330123380486651.post-21472209947711353</id><published>2010-05-11T23:51:00.001+02:00</published><updated>2010-05-26T20:33:25.041+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-26T20:33:25.041+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SOA" /><category scheme="http://www.blogger.com/atom/ns#" term="Architecture" /><title>EDA, messaging and NServiceBus at NNUG Oslo 25th of May</title><content type="html">&lt;p&gt;On the next Norwegian .Net User Group I will give a talk on NServiceBus. Topics which will be covered include an overview of the architecture and capabilities of NServiceBus&amp;#160; and configuration options provided by the framework. &lt;/p&gt;  &lt;p&gt;Ole-Marius Moe-Helgesen will give an introduction to Event Driven Architecture and messaging and he will also share experiences from a project at an insurance company which made use of NServiceBus.&lt;/p&gt;  &lt;p&gt;Jan Ove Skogheim Olsen will share project experiences with NServiceBus from Call Norwegian.&lt;/p&gt;  &lt;p&gt;More information available here: &lt;a title="http://www.nnug.no/Avdelinger/Oslo/Moter/Brukergruppemote-25-mai-2010/" href="http://www.nnug.no/Avdelinger/Oslo/Moter/Brukergruppemote-25-mai-2010/"&gt;http://www.nnug.no/Avdelinger/Oslo/Moter/Brukergruppemote-25-mai-2010/&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/3308330123380486651-21472209947711353?l=sverrehundeide.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SverresBlog/~4/lyzSEpPIbJU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sverrehundeide.blogspot.com/feeds/21472209947711353/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://sverrehundeide.blogspot.com/2010/05/eda-messaging-and-nservicebus-at-nnug.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/21472209947711353?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/21472209947711353?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SverresBlog/~3/lyzSEpPIbJU/eda-messaging-and-nservicebus-at-nnug.html" title="EDA, messaging and NServiceBus at NNUG Oslo 25th of May" /><author><name>sverrehundeide</name><uri>http://www.blogger.com/profile/08018607198830272906</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://1.bp.blogspot.com/_450l3VHhZSU/SV_v6tt1GvI/AAAAAAAAAAM/gu15cR4YG0I/S220/Sverre2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sverrehundeide.blogspot.com/2010/05/eda-messaging-and-nservicebus-at-nnug.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcHQ3wycCp7ImA9WxFQFkw.&quot;"><id>tag:blogger.com,1999:blog-3308330123380486651.post-1324309873691183141</id><published>2010-02-21T20:01:00.001+01:00</published><updated>2010-05-11T23:07:12.298+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-11T23:07:12.298+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SOA" /><category scheme="http://www.blogger.com/atom/ns#" term="Architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="CQRS" /><title>Persistence with Command and Query Responsibility Segregation</title><content type="html">&lt;p&gt;Command and Query Responsibility Segregation (CQRS) is a pattern where reading of data and commands for updating the domain model are separated into separate services. Architectures for distributed systems built on the CQRS pattern offers high scalability and reliability and has gained in popularity during the last couple of years.&lt;/p&gt;  &lt;p&gt;Greg Young visited this month’s javaBin meeting in Oslo for a talk on CQRS based architectures, and in this blog post I will share some of the new insight I got into CQRS.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.martinfowler.com/eaaDev/EventSourcing.html"&gt;Event sourcing&lt;/a&gt; and &lt;a href="http://www.infoq.com/news/2008/01/consistency-vs-availability"&gt;eventual consistency&lt;/a&gt; are two essential concepts which fit well together with a CQRS based architecture, and previously I considered these two concepts to be mandatory in order to make the architecture scalable and reliable. However, the complexity introduced to a system by using these two concepts may scare many brave developers away from building real production systems which makes the most out of an architecture built on the CQRS pattern. &lt;/p&gt;  &lt;p&gt;Most developers feel more comfortable with using well-known architectures built on a relational model stored in a RDBMS supporting ACID capable transactions. The mind shift required when changing to event sourcing and eventual consistency may seem too big and risky.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_450l3VHhZSU/S4GDAujLdaI/AAAAAAAAAEU/mEWkO8uo8As/s1600-h/Slide1%5B5%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Typical architecture utilizing the CQRS pattern" border="0" alt="Typical architecture utilizing the CQRS pattern" src="http://lh3.ggpht.com/_450l3VHhZSU/S4GDB3COdpI/AAAAAAAAAEY/pvopW7UAa_A/Slide1_thumb%5B3%5D.png?imgmax=800" width="504" height="472" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;em&gt;Figure 1, typical architecture utilizing the CQRS pattern &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;In the javaBin talk Greg Young actually advised against using eventual consistency when starting to implement a new system and rather gradually introduce the concept in parts of the system as it evolves and scalability issues appear. This will simplify the initial implementation and make it easier to get started with CQRS.&lt;/p&gt;  &lt;h3&gt;The simplest alternative: No event sourcing and no eventual consistency&lt;/h3&gt;  &lt;p&gt;This is the simplest option for handling consistency and concurrency because the domain model and denormalized read model can be updated in a single transaction. &lt;/p&gt;  &lt;p&gt;The domain model and the denormalized read model can either be stored in the same database server or in different servers. A distributed transaction is required if updates are made on different threads or to different database servers, which will have an impact on the performance. An ORM is typically used for persistence of the domain model.&lt;/p&gt;  &lt;p&gt;The read model can even be implemented as views on top of an existing schema modeled for OLTP.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_450l3VHhZSU/S4GDCp5IOgI/AAAAAAAAAEc/nrXYqLThIyE/s1600-h/Slide2%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Slide2" border="0" alt="Slide2" src="http://lh3.ggpht.com/_450l3VHhZSU/S4GDDb1ckDI/AAAAAAAAAEg/SlvbdXNGy0k/Slide2_thumb%5B2%5D.png?imgmax=800" width="504" height="483" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;em&gt;Figure 2, Domain model and read model updated in a single transaction&lt;/em&gt;&lt;/p&gt;  &lt;h3&gt;Solving scaling issues as they arise: Event sourcing and no/partial eventual consistency&lt;/h3&gt;  &lt;p&gt;Greg Young prefers using event sourcing rather than a relational schema when persistence of the domain model. To quote his thoughts about ORMs: “Using an ORM is like kissing your sister!”&lt;/p&gt;  &lt;p&gt;The events can for example be stored in a RDBMS, an object database, a document database or be serialize to flat files. The event store must support transactions.&lt;/p&gt;  &lt;p&gt;As the system evolves and scalability issues surface, an event queue (and hence eventual consistency) for updates to the read model can be party introduced. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_450l3VHhZSU/S4GDDi3pfQI/AAAAAAAAAEk/dJTVIpQBaTM/s1600-h/Slide3%5B5%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Slide3" border="0" alt="Slide3" src="http://lh4.ggpht.com/_450l3VHhZSU/S4GDEZb5ScI/AAAAAAAAAEo/-84S4CaaOl0/Slide3_thumb%5B3%5D.png?imgmax=800" width="504" height="492" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;em&gt;Figure 3, event store and read model is updated in a transaction.      &lt;br /&gt;An event queue and eventual consistency is introduced in areas where scaling issues arise. &lt;/em&gt;&lt;/p&gt;  &lt;h3&gt;The most complex and powerful alternative: Event sourcing and eventual consistency&lt;/h3&gt;  &lt;p&gt;In this alternative the domain events are stored in an event storage, and a queue is used to update the read model.&lt;/p&gt;  &lt;p&gt;Two different queues can be used when updating the read model. The most traditional architecture is to publish the event to a separate queue in the same transaction as updates the event store. Tools like NServiceBus are typically used when publishing to the queue.&lt;/p&gt;  &lt;p&gt;The second alternative was described &lt;a href="http://codebetter.com/blogs/gregyoung/archive/2010/02/20/why-use-event-sourcing.aspx"&gt;in a recent blog post by Greg Young&lt;/a&gt; and uses the event storage as a queue. This means that there are no requirements for distributed transactions, as the only write happening when processing a command is to the event store. The read model is updated from the events in the event store and not from a separate queue. This has the advantage that there is only one version of the truth; it’s not possible to publish events which have different content from the ones stored in the event storage. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_450l3VHhZSU/S4GDEyRyvJI/AAAAAAAAAEs/2bfCkiyQSXA/s1600-h/Slide4%5B5%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Slide4" border="0" alt="Slide4" src="http://lh3.ggpht.com/_450l3VHhZSU/S4GDFfbY5zI/AAAAAAAAAEw/mjnRtvVU40s/Slide4_thumb%5B3%5D.png?imgmax=800" width="504" height="480" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;&lt;em&gt;Figure 4, event store and event queue&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_450l3VHhZSU/S4GDF4LW2AI/AAAAAAAAAE0/ingid1x3tOA/s1600-h/Slide5%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Slide5" border="0" alt="Slide5" src="http://lh4.ggpht.com/_450l3VHhZSU/S4GDGMbGFqI/AAAAAAAAAE4/zWbCTSDhjuE/Slide5_thumb%5B2%5D.png?imgmax=800" width="504" height="441" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;&lt;em&gt;Figure 5, using the event store as a queue&lt;/em&gt;&lt;/p&gt;  &lt;h3&gt;Conclusions&lt;/h3&gt;  &lt;p&gt;There is a wide range of options available for how to design persistence in a CQRS based architecture. The most important thing to consider is that the persistence requirements for the domain model on the command service usually will not conform well to the data retrieval requirements for the read service (think OLTP vs. OLAP).&lt;/p&gt;  &lt;p&gt;Other factors which must be taken into consideration when designing the persistence models are the cost requirements, is it a greenfield or a brownfield project, the skills and competency of the developers, SLAs and enterprise architecture guidelines for the organization. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3308330123380486651-1324309873691183141?l=sverrehundeide.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SverresBlog/~4/hkVxV68K4xA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sverrehundeide.blogspot.com/feeds/1324309873691183141/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://sverrehundeide.blogspot.com/2010/02/persistence-with-command-and-query.html#comment-form" title="1 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/1324309873691183141?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/1324309873691183141?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SverresBlog/~3/hkVxV68K4xA/persistence-with-command-and-query.html" title="Persistence with Command and Query Responsibility Segregation" /><author><name>sverrehundeide</name><uri>http://www.blogger.com/profile/08018607198830272906</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://1.bp.blogspot.com/_450l3VHhZSU/SV_v6tt1GvI/AAAAAAAAAAM/gu15cR4YG0I/S220/Sverre2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_450l3VHhZSU/S4GDB3COdpI/AAAAAAAAAEY/pvopW7UAa_A/s72-c/Slide1_thumb%5B3%5D.png?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://sverrehundeide.blogspot.com/2010/02/persistence-with-command-and-query.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UNRX48eSp7ImA9WxBWEk4.&quot;"><id>tag:blogger.com,1999:blog-3308330123380486651.post-1757739616887905944</id><published>2010-01-22T19:33:00.000+01:00</published><updated>2010-02-03T23:14:54.071+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-03T23:14:54.071+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="DDD" /><title>Domain-Driven Design: Strategic design</title><content type="html">&lt;p&gt;Eric Evans visited the January meeting of Oslo XP Meetup for a talk about Domain-Driven Design, and this post is a summary of his talk.&lt;/p&gt;  &lt;h3&gt;Context mapping&lt;/h3&gt;  &lt;h4&gt;Generic subdomains&lt;/h4&gt;  &lt;p&gt;A standardized domain which can be bought off the shelf, e.g. an accounting module.&lt;/p&gt;  &lt;h4&gt;Supporting subdomains&lt;/h4&gt;  &lt;p&gt;The parts of the system which is required, but which is not important enough do make or break your business.&lt;/p&gt;  &lt;h4&gt;The core domain&lt;/h4&gt;  &lt;p&gt;The core domain is typically built by 5-10% of a software system and is the areas and features of your software which are so important that they differentiate your business from your competitors’ businesses. The business should put all efforts into getting this part of the system as good as possible. The core domain will depend on the supporting domains.&lt;/p&gt;  &lt;h5&gt;Example: &lt;/h5&gt;  &lt;p&gt;The star rating of books at Amazon helps the customer get the right book. But rating is not strictly required for customers to buy books. The rating functionality is thus a part of Amazons supporting domain.&lt;/p&gt;  &lt;p&gt;EBay also has a star rating system. This system doesn’t rate the product, but how trustworthy the seller is. Since trust is essential for a customer to buy something at EBay, their star rating system is a part of the company’s core domain. &lt;/p&gt;  &lt;h4&gt;“The hackers” and the core domain&lt;/h4&gt;  &lt;p&gt;Why do often the irresponsible, lesser skilled programmers who care nothing about good software design become the heroes in the organization?&lt;/p&gt;  &lt;p&gt;From the customers’ and the leadership’s perspective, the heroes are the people who build the most valuable and useful features, and these features are often the core domain.&lt;/p&gt;  &lt;p&gt;On the other hand, the skilled developers often focus on “platform” related architecture and features instead of the core domain. This may be fatal for the company if the “hackers” are allowed to build a badly design core domain which ends up in a Big Ball of Mud.&lt;/p&gt;  &lt;p&gt;Good design has business value! Eric suggests putting your most responsible and skilled developers on the core domain and fire the bad ones.&lt;/p&gt;  &lt;h4&gt;Bounded Context - A system will always have multiple models&lt;/h4&gt;  &lt;p&gt;The enterprise model is a bad idea. Rather each team should build their own model with a clearly defined bounded context. This will result in clean, well defined models within each context instead of Big Ball of Mud models which try to do everything.&lt;/p&gt;  &lt;h3&gt;Strategic design and legacy systems&lt;/h3&gt;  &lt;p&gt;The conical dilemma regarding old legacy software is: Keep the existing system or build a new one from scratch?&lt;/p&gt;  &lt;p&gt;Eric describes three different strategies:&lt;/p&gt;  &lt;p&gt;1. Rebuild from scratch&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;This strategy will almost always fail and will certainly take much longer time than estimated. Eric advises against this strategy, unless there are really good reasons (most classical reasons often heard are simply not good enough!).&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;2. Refactor the existing system&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Might work, but most likely the system will never reach the desired level of quality. Lesser skilled developers will continue hacking the system the same way as before, and degenerate the newly shiny refactored parts.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;3. Continue hacking on the old system&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;This is the fate of most systems.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So what to do then? Eric suggests using anticorruption layers to isolates new well-designed domain models from the old legacy system. &lt;/p&gt;  &lt;h4&gt;Questions from the audience&lt;/h4&gt;  &lt;p&gt;Two different teams work on an almost identical domain model. Should they use a shared domain model or create on domain model per team?&lt;/p&gt;  &lt;p&gt;Eric suggests that each team build their own domain model, even if they overlap and some code will be duplicated. The alternative will lead into creating a Big Ball of Mud.&lt;/p&gt;  &lt;h3&gt;My own comments to Eric’s talk&lt;/h3&gt;  &lt;p&gt;I’m currently working on a project where the goal is to replace several old mainframe systems with a new common system on a new platform. According to Eric, this project should have been doomed to fail. In it’s forth year of development and 2,5 years in production the project is still going strong, albeit it has gone through several challenging and difficult periods.&lt;/p&gt;  &lt;p&gt;So why hasn’t this project failed then? I think the reason is that the organization I work for previously has made a couple of failing attempt to replace the old legacy systems. This made them learn which costs and efforts are needed to create a new system which replaces the old ones. &lt;/p&gt;  &lt;p&gt;The new system will also give a competitive advantage with it’s flexibility in defining new product and price structures, and this added business value is also a motivation for continuing the project.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3308330123380486651-1757739616887905944?l=sverrehundeide.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SverresBlog/~4/c7EO7SC_Hko" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sverrehundeide.blogspot.com/feeds/1757739616887905944/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://sverrehundeide.blogspot.com/2010/01/domain-driven-design-strategic-design.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/1757739616887905944?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/1757739616887905944?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SverresBlog/~3/c7EO7SC_Hko/domain-driven-design-strategic-design.html" title="Domain-Driven Design: Strategic design" /><author><name>sverrehundeide</name><uri>http://www.blogger.com/profile/08018607198830272906</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://1.bp.blogspot.com/_450l3VHhZSU/SV_v6tt1GvI/AAAAAAAAAAM/gu15cR4YG0I/S220/Sverre2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sverrehundeide.blogspot.com/2010/01/domain-driven-design-strategic-design.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAMQng7eyp7ImA9WxJWFUo.&quot;"><id>tag:blogger.com,1999:blog-3308330123380486651.post-1434703870862136958</id><published>2009-06-18T01:39:00.002+02:00</published><updated>2009-06-21T12:06:23.603+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-21T12:06:23.603+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="LEAP" /><category scheme="http://www.blogger.com/atom/ns#" term="WCF" /><title>LEAP Conference – day 3</title><content type="html">&lt;p&gt;A summary of day 3 of the LEAP conference in Redmond, Seattle&lt;/p&gt;  &lt;h3&gt;Sync: Why, what and how&lt;/h3&gt;  &lt;p&gt;With Lev Novik&lt;/p&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;h5&gt;&lt;a href="http://lh4.ggpht.com/_450l3VHhZSU/Sjl-lq9AKhI/AAAAAAAAADg/9smh4ACECPk/s1600-h/IMG_1117%5B6%5D.jpg"&gt;&lt;img title="IMG_1117" style="border: 0px none ; display: inline;" alt="IMG_1117" src="http://lh4.ggpht.com/_450l3VHhZSU/Sjl-mP2WUxI/AAAAAAAAADk/5Lo5CtDcALE/IMG_1117_thumb%5B4%5D.jpg?imgmax=800" border="0" width="189" height="244" /&gt;&lt;/a&gt; &lt;/h5&gt;  &lt;h5&gt;Why Sync?&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Facilitates rich clients&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Faster response, richer UX&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Legacy applications can be migrated to use the Cloud as a data storage by using Sync&lt;/li&gt;    &lt;li&gt;… &lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;General Sync Challenges&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Granularity of changes&lt;/li&gt;    &lt;li&gt;Change (non-) Reflection&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Using a timestamp. Use locking until synchronization is finished?&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Conflicts&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Not detecting conflicts will result in data loss&lt;/li&gt;      &lt;li&gt;Complex algorithms for conflics detection exists, which don’t require storing the history of all changes&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Loops&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Multiple devices synchronizing data to multiple servers at the same time &lt;/li&gt;      &lt;li&gt;Can result in duplicated data&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Hierarchical data&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;The order of synchronization is important&lt;/li&gt;      &lt;li&gt;Eg. one endpoints adds an item to a folder, while another endpoint deletes the entire folder&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Item filtering&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Optimization by syncing parts of the data more frequently&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;“Column” filtering&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Select parts of the data&lt;/li&gt;      &lt;li&gt;Challenge: Can’t do conflicts detection, since one of the endpoints don’t have the complete version of the data&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Errors and interruptions&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Not all conflicts can be solved automatically&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Doing so will result in loss of data&lt;/li&gt;        &lt;li&gt;Must wait for a human to resolve them&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h5&gt;Microsoft Sync Framework&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;What does MS Sync Framework do?&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Makes it easy to sync participating endpoints&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Build in endpoints for&lt;/li&gt;        &lt;ul&gt;         &lt;li&gt;V1: File system, relational databases&lt;/li&gt;          &lt;li&gt;V2: SQL Data Services, Live Mesh, ++&lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;The Sync Session&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Data stores implements a Sync Provider&lt;/li&gt;      &lt;li&gt;The Sync application has a Sync Orchestrator which communicates with the endpoints’ sync providers&lt;/li&gt;      &lt;li&gt;Synch Framework Runtime&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Metadata&lt;/li&gt;        &lt;ul&gt;         &lt;li&gt;Versioning&lt;/li&gt;       &lt;/ul&gt;        &lt;li&gt;Runtime&lt;/li&gt;        &lt;ul&gt;         &lt;li&gt;Algorithms to solve sync problems&lt;/li&gt;       &lt;/ul&gt;        &lt;li&gt;Metadata Store&lt;/li&gt;        &lt;ul&gt;         &lt;li&gt;For those who can’t store the metadata themselves&lt;/li&gt;       &lt;/ul&gt;        &lt;li&gt;Simple Provider Framework&lt;/li&gt;        &lt;ul&gt;         &lt;li&gt;Makes writing providers easy&lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h5&gt;How do customers use the sync framework?&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Write sync applications&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Implement synch orchestration&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Write sync providers in order to support sync&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Declare an object identifier&lt;/li&gt;      &lt;li&gt;Declare versioning&lt;/li&gt;      &lt;li&gt;Enumerate changes&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h5&gt;Sync Participants&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Sync endpoints&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Stores metadata&lt;/li&gt;      &lt;li&gt;Can be many kinds of devices, and the sync logic should not be implemented for each of them&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Sync providers&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Does most of the sync work&lt;/li&gt;      &lt;li&gt;Operates on the endpoints’ meta data&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Sync application&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Has the Synch Orchestrator&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;The sync logic can be placed in different locations (eg. on the client or in a web service) for differenc scenarios.&lt;/p&gt;  &lt;p&gt;Sync Framework on MSDN: &lt;a href="http://msdn.microsoft.com/sync/" target="_blank"&gt;http://msdn.microsoft.com/sync/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h3&gt;Visual Studio Team System: ALM as we do it at Microsoft&lt;/h3&gt;  &lt;p&gt;With Stephanie Cuthbertson&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_450l3VHhZSU/Sjl-mU6PevI/AAAAAAAAADo/Vpbgdy2Qecw/s1600-h/IMG_1120%5B3%5D.jpg"&gt;&lt;img title="IMG_1120" style="border: 0px none ; display: inline;" alt="IMG_1120" src="http://lh6.ggpht.com/_450l3VHhZSU/Sjl-mgi-YKI/AAAAAAAAADs/blOmQiJPDQs/IMG_1120_thumb%5B1%5D.jpg?imgmax=800" border="0" width="420" height="319" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h5&gt;Some facts about Microsoft Development&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;TFS usage at MS&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;VS 2008&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;13 000 users&lt;/li&gt;        &lt;li&gt;2 570 000 work items&lt;/li&gt;        &lt;li&gt;40 100 000 source file&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h5&gt;Planning and tracking&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Feature planning and prioritizing in the development of VSTS 2010&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Value props prioritizing&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Voting and weighting/prioritizing of features in an Excel sheet&lt;/li&gt;        &lt;li&gt;Work items are then imported to TFS&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;Generate MS Project GANTT from TFS&lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;VS 2010 demo&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Simple task editing integration with Excel and MS Project&lt;/li&gt;    &lt;li&gt;Improved forecasting statistics and status reports&lt;/li&gt;    &lt;li&gt;User requirement tracking&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Can edit requirements through a web interface&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Requires a separate (new) licence &lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;Can link requirements to test cases&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;h5&gt;&lt;strong&gt;&lt;span style="font-size:85%;"&gt;Branching&lt;/span&gt;&lt;/strong&gt;&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;In the development of VSTS 2010, branching per feature is used&lt;/li&gt;    &lt;li&gt;Feature must pass “Quality Gates” before merging into active branch&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Feature complete&lt;/li&gt;      &lt;li&gt;Test complete&lt;/li&gt;      &lt;li&gt;All bugs fixed&lt;/li&gt;      &lt;li&gt;Static code analysis&lt;/li&gt;      &lt;li&gt;Localization testing&lt;/li&gt;      &lt;li&gt;etc&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h5&gt;Tracking and reporting in VSTS 2010&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Better SharePoint integration&lt;/li&gt;    &lt;li&gt;Web dashboard&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Extensive statistics and analytics possibilities&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h3&gt; &lt;/h3&gt;  &lt;h3&gt;Always Responsive Apps in a World of Public Safety&lt;/h3&gt;  &lt;p&gt;With Mario Szpuszta&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_450l3VHhZSU/Sjl-m57HyqI/AAAAAAAAADw/k90GbZfVo4I/s1600-h/IMG_1122%5B4%5D.jpg"&gt;&lt;img title="IMG_1122" style="border: 0px none ; display: inline;" alt="IMG_1122" src="http://lh3.ggpht.com/_450l3VHhZSU/Sjl-nAx50_I/AAAAAAAAAD0/O6sMPueb-gc/IMG_1122_thumb%5B2%5D.jpg?imgmax=800" border="0" width="436" height="316" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;A case study for a system for ship tracking and tracing delivered to Frequentis.&lt;/p&gt;  &lt;h5&gt;Who is Frequentis AG?&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Provides systems for &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt; Air traffic&lt;/li&gt;      &lt;li&gt;Ship tracking &amp;amp; tracing&lt;/li&gt;      &lt;li&gt;Coordination systems for police offices&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h5&gt;Terms&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;MCS- Maritime Communication System&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Ship – Ship, Ship – Land, Land – Land&lt;/li&gt;      &lt;li&gt;Usually hardware interface&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;CAD – Computer Aided Dispatching&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Collaborative Incident Management&lt;/li&gt;      &lt;li&gt;This is the kind of software made in this case study&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;TnT – Tracking and Tracing&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;CAD and MCS Solution from Frequentis&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h5&gt;Tracking &amp;amp; Tracing Architecture&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;GUI in WPF&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Several modules&lt;/li&gt;      &lt;li&gt;Complex requirements&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Lots of information and operations available for the users&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;Could not use CAB, Prism or similar frameworks since the GUI would then run in one process and one app domain. The entire system should not go down if one module crashes. &lt;/li&gt;      &lt;li&gt;Each GUI module runs in a separate process. A separate shell was created in order to achieve this.&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Communication with Maritime Communication System with .NET remoting&lt;/li&gt;    &lt;li&gt;GUI communicate with the services through a message bus&lt;/li&gt;    &lt;li&gt;Server&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;WCF service modules&lt;/li&gt;      &lt;li&gt;Windows 2008 and SQL Server 2005&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h5&gt;The Service Bus&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Complex communication&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Everyone communicate with everyone&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Failure of one system may not affect others&lt;/li&gt;    &lt;li&gt;Challenges&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Not every harbour can pay for the required infrastructure, like huge server farms&lt;/li&gt;      &lt;li&gt;Failure of single entity may not affect others&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Classic architecture&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Keep it simple&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Lightweight &lt;/li&gt;        &lt;li&gt;Reliable&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;Loosely couples&lt;/li&gt;      &lt;li&gt;Many-to-many communication&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Solution&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Created custom Message Subscription Database&lt;/li&gt;      &lt;li&gt;Use WCF Peer-to-Peer channel for communication&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Issue: Max. 700 msg/sec limitation due to slow serialization&lt;/li&gt;        &lt;li&gt;No Duplex-bindings, no MSMQ&lt;/li&gt;        &lt;ul&gt;         &lt;li&gt;Just leverage NetTcp-bindings&lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;Tech-hints for WCF&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;NetDataContractSerializer will include assembly info – serialization will fail if endpoints have different assembly versions, even though the contracts are compatible&lt;/li&gt;      &lt;li&gt;DataContractSerializer enables loosely coupling&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h5&gt;Creating a responsive user interface&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;The application may never hang at any time&lt;/li&gt;    &lt;li&gt;Encapsulate logic in “autonomous” tasks&lt;/li&gt;    &lt;li&gt;Set of jobs executed based on commands&lt;/li&gt;    &lt;li&gt;Core rule: Everything executed asynchronously&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Thread pool with queue and queue manager&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Commands, Jobs and Queues&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Business logic encapsulated into Jobs (and ONLY there)&lt;/li&gt;      &lt;li&gt;Commands executed autonomously without side effects&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Results from Async Jobs&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Modules implements INotify interface&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Passed into the constructor of a job&lt;/li&gt;        &lt;li&gt;Job calls back to module through INotify&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;Communication with other systems&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Create yet another job&lt;/li&gt;      &lt;li&gt;Job talks to IConnectionPoint&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Tasks, Jobs – Tech Hint &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;CCR (Concurrency Coordination Runtime, originally from The Robotics Studio)&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Simplified execution of concurrent tasks&lt;/li&gt;        &lt;li&gt;Has now been released as a separate toolkit separated from Robotics&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h5&gt;&lt;a href="http://lh5.ggpht.com/_450l3VHhZSU/Sjl-nW4iPSI/AAAAAAAAAD4/VSxDFiAoW48/s1600-h/IMG_1125%5B4%5D.jpg"&gt;&lt;img title="IMG_1125" style="border: 0px none ; display: inline;" alt="IMG_1125" src="http://lh4.ggpht.com/_450l3VHhZSU/Sjl-n-KfmjI/AAAAAAAAAD8/UzJVtBT68kQ/IMG_1125_thumb%5B2%5D.jpg?imgmax=800" border="0" width="572" height="414" /&gt;&lt;/a&gt; &lt;/h5&gt;  &lt;h5&gt;WPF-based client&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Why WPF?&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Huge amount of information needed to be presented&lt;/li&gt;      &lt;li&gt;Frequentis hired a separate UX-research team&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Different alternative UX-stories were investigated&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;Advanced requirements for alternative visualizations of data&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Presentation Model Pattern&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Separate UI from code&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h3&gt;Green Computing through Sharing&lt;/h3&gt;  &lt;p&gt;With Pat Helland &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_450l3VHhZSU/Sjl-oISet7I/AAAAAAAAAEA/MD2zTdtonFQ/s1600-h/IMG_1126%5B5%5D.jpg"&gt;&lt;img title="IMG_1126" style="border: 0px none ; display: inline;" alt="IMG_1126" src="http://lh4.ggpht.com/_450l3VHhZSU/Sjl-oVr5oWI/AAAAAAAAAEE/TWp2vyHgQpU/IMG_1126_thumb%5B3%5D.jpg?imgmax=800" border="0" width="182" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h5&gt;Introduction&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;In 2006, 1,5% of the electricity in US was consumed by Data Centers&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;This is more than what is consumed by TVs&lt;/li&gt;      &lt;li&gt;Projected to double every fifth year&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Sharing resources vs. dedicated resources&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Shared resources may not be available when you need them&lt;/li&gt;      &lt;li&gt;Dedicated resources are expensive and have less utilization&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Sharing through&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Virtual machines&lt;/li&gt;      &lt;li&gt;Cloud computing&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h5&gt;The evolving landscape of data centers&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Power Usage Effectiveness (PUE)&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;PUE = Total Facility Power / IT Equipment Power&lt;/li&gt;      &lt;li&gt;Typical factor is 1.7&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Power and cooling is expensive&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Infrastructure and energy cost are both more expensive than the server cost&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Redundancy&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Represents more than 20% of the data center cost&lt;/li&gt;      &lt;li&gt;All servers require &lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Dual power paths&lt;/li&gt;        &lt;li&gt;Dual network&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;“Chicago Data Center”&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Highly efficient data center with PUE = 1,2&lt;/li&gt;      &lt;li&gt;Servers are located in isolated steel containers, each containing 2 000+ servers&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Individual servers are never maintained&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h5&gt;Over-Provisioning versus Over-Booking of Power&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Power Provisioning&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Total power consumption for a server is typically 200W&lt;/li&gt;      &lt;li&gt;Power consumption typically peaks at about 90% for a data center &lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Theoretical max power consumption is seldom used, eg. because disk usage prevents 100% CPU utilization&lt;/li&gt;        &lt;li&gt;This means that it is possible to add more servers than the theoretical max limit in order to utilize the available power&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h5&gt;Services and Incentives &lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Amazon’s Server Oriented Architecture&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;One page request typically use over 150 services&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Service Level Agreements (SLAs)&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Example: 300ms response for 99.9% of requests with 500 requests per sec&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h5&gt;What does this mean for developers?&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Factories are more efficient than hand-crafted manufacturing&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/3308330123380486651-1434703870862136958?l=sverrehundeide.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SverresBlog/~4/SjLu9r8jo2M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sverrehundeide.blogspot.com/feeds/1434703870862136958/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://sverrehundeide.blogspot.com/2009/06/leap-conference-day-3.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/1434703870862136958?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/1434703870862136958?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SverresBlog/~3/SjLu9r8jo2M/leap-conference-day-3.html" title="LEAP Conference – day 3" /><author><name>sverrehundeide</name><uri>http://www.blogger.com/profile/08018607198830272906</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://1.bp.blogspot.com/_450l3VHhZSU/SV_v6tt1GvI/AAAAAAAAAAM/gu15cR4YG0I/S220/Sverre2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_450l3VHhZSU/Sjl-mP2WUxI/AAAAAAAAADk/5Lo5CtDcALE/s72-c/IMG_1117_thumb%5B4%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://sverrehundeide.blogspot.com/2009/06/leap-conference-day-3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUASXk6eyp7ImA9WxJWEUQ.&quot;"><id>tag:blogger.com,1999:blog-3308330123380486651.post-1683638204843909721</id><published>2009-06-17T01:43:00.001+02:00</published><updated>2009-06-17T01:50:48.713+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-17T01:50:48.713+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Azure" /><category scheme="http://www.blogger.com/atom/ns#" term="LEAP" /><title>LEAP Conference – day 2</title><content type="html">&lt;p&gt;A summary of day 2 of the LEAP conference in Redmond, Seattle&lt;/p&gt;  &lt;h3&gt;Pharma in the Cloud&lt;/h3&gt;  &lt;p&gt;With Eugenio Pace&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_450l3VHhZSU/SjguAMqtdUI/AAAAAAAAAC4/WCiyXnUdNJA/s1600-h/IMG_1091%5B7%5D.jpg"&gt;&lt;img title="IMG_1091" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="376" alt="IMG_1091" src="http://lh3.ggpht.com/_450l3VHhZSU/SjguAbft1VI/AAAAAAAAAC8/JnQ7WAP2PqQ/IMG_1091_thumb%5B3%5D.jpg?imgmax=800" width="508" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h5&gt;Windows Azure Primitives:&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Code host      &lt;ul&gt;       &lt;li&gt;WCF &lt;/li&gt;        &lt;li&gt;ASP.Net &lt;/li&gt;        &lt;li&gt;Worker          &lt;ul&gt;           &lt;li&gt;Similar to a windows service in an on-premises application &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Persistence      &lt;ul&gt;       &lt;li&gt;Table &lt;/li&gt;        &lt;li&gt;Blob &lt;/li&gt;        &lt;li&gt;Queue          &lt;ul&gt;           &lt;li&gt;Events can be published to the queue, and &lt;em&gt;Workers&lt;/em&gt; can handle these events &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;SQL Data Services          &lt;ul&gt;           &lt;li&gt;Supports most of the functionality of the regular SQL Servers &lt;/li&gt;            &lt;li&gt;Funtionality has been significantly extended since the PDC08 demo &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Application Services      &lt;ul&gt;       &lt;li&gt;ACS (access control) &lt;/li&gt;        &lt;li&gt;ServiceBus &lt;/li&gt;        &lt;li&gt;Workflow &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;Cloud vs. on premises and build vs. buy&lt;/h5&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_450l3VHhZSU/SjguA8YcoYI/AAAAAAAAADA/qRA5ySf0ShQ/s1600-h/IMG_1094%5B3%5D.jpg"&gt;&lt;img title="IMG_1094" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="312" alt="IMG_1094" src="http://lh5.ggpht.com/_450l3VHhZSU/SjguBQ_LsCI/AAAAAAAAADE/vyyOir9Kbnk/IMG_1094_thumb%5B1%5D.jpg?imgmax=800" width="410" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h5&gt;Building a multi-enterprise collaboration application in the cloud for “BigPharma”&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Requirements:      &lt;ul&gt;       &lt;li&gt;De-centralized management &lt;/li&gt;        &lt;li&gt;Fine grained access control          &lt;ul&gt;           &lt;li&gt;Org –&amp;gt; Row –&amp;gt; Field &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Leveraging existing Identity and AuthZ infrastructure          &lt;ul&gt;           &lt;li&gt;Using Active Directory (local users/groups used in demo) &lt;/li&gt;            &lt;li&gt;Support Single Sign On &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Demo: &lt;a href="http://pharmacloudcatalog.com/catalog/Provisioning" target="_blank"&gt;http://pharmacloudcatalog.com/catalog/Provisioning&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Identity &amp;amp; Access Control      &lt;ul&gt;       &lt;li&gt;Using claims-based identity          &lt;ul&gt;           &lt;li&gt;Both for the web service and for the web site &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Using MS Geneva Framework          &lt;ul&gt;           &lt;li&gt;Identity providers for ASP.Net exists which support this framework &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Custom Security Token Service (STS)          &lt;ul&gt;           &lt;li&gt;Inheriting from SecurityTokenService &lt;/li&gt;            &lt;li&gt;Starter kit available at: &lt;a href="http://startersts.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27842#ReleaseFiles"&gt;http://startersts.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27842#ReleaseFiles&lt;/a&gt; &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Mapping tokens to permissions can be done in the web interface of .Net Services Access Control Service &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;ServiceBus      &lt;ul&gt;       &lt;li&gt;Enables communication from the server to the client without requiring an inbound connection to the client (all connection from client/server are outbound – to the service bus) &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Download &amp;amp; study sample for Azure (note: a different samle than the one demonstrated in this session) &lt;a href="http://www.codeplex.com/azureissuetracker" target="_blank"&gt;http://www.codeplex.com/azureissuetracker&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Microsoft Dynamics CRM&lt;/h3&gt;  &lt;p&gt;With Girish Raja&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_450l3VHhZSU/SjguB5dI-4I/AAAAAAAAADI/T-LlqYBE7WU/s1600-h/IMG_1095%5B3%5D.jpg"&gt;&lt;img title="IMG_1095" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="313" alt="IMG_1095" src="http://lh6.ggpht.com/_450l3VHhZSU/SjguCMkJX_I/AAAAAAAAADM/P3NK5soXmRc/IMG_1095_thumb%5B1%5D.jpg?imgmax=800" width="411" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h5&gt;Dynamics CRM 4.0 demo&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;The Outlook CRM add-in client      &lt;ul&gt;       &lt;li&gt;Appears as a separate folder in Outlook &lt;/li&gt;        &lt;li&gt;Data available offline &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Flexibility      &lt;ul&gt;       &lt;li&gt;Accessing by browser, Otulook or mobile &lt;/li&gt;        &lt;li&gt;Hosting as software or as service &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Extensibility Toolset – customization tools for      &lt;ul&gt;       &lt;li&gt;System Administrators &lt;/li&gt;        &lt;li&gt;Developers &lt;/li&gt;        &lt;li&gt;Business Analysts &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Configurable entity model      &lt;ul&gt;       &lt;li&gt;Create entities (similar to database tables) from the Customization screen in Dynamics CRM Online &lt;/li&gt;        &lt;li&gt;The asmx web service endpoints are automatically updated with the custom entities &lt;/li&gt;        &lt;li&gt;Configurable role based access with high granularity &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Workflow editor      &lt;ul&gt;       &lt;li&gt;Uses Windows Workflow internally &lt;/li&gt;        &lt;li&gt;Activities can be created in the web interface &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;.NET Service Bus&lt;/h3&gt;  &lt;p&gt;With Clemens Vasters&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_450l3VHhZSU/SjguCVpIoTI/AAAAAAAAADQ/WhMTOOHUSqI/s1600-h/IMG_1101%5B3%5D.jpg"&gt;&lt;img title="IMG_1101" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="354" alt="IMG_1101" src="http://lh4.ggpht.com/_450l3VHhZSU/SjguC2PcH-I/AAAAAAAAADU/tC9OufN_QBM/IMG_1101_thumb%5B1%5D.jpg?imgmax=800" width="466" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Demo application where a website in the cloud communicates with an application running on premises (on Clemens’ laptop) through the .NET Service Bus      &lt;ul&gt;       &lt;li&gt;No need to configure firewalls &lt;/li&gt;        &lt;li&gt;Security kept intact &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Why .NET Service Bus?      &lt;ul&gt;       &lt;li&gt;Enable bi-directional connectivity          &lt;ul&gt;           &lt;li&gt;Not depended on the kind of device or the location of the device &lt;/li&gt;            &lt;li&gt;Without having to open inbound firewall/NAT ports &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Provide federated naming and discovery &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;The first version of the service bus (will be released with Azure in November 2009), will use Windows Workflow from .NET 3.5, with an DSL on the top for supporting migration to .NET 4.0 &lt;/li&gt;    &lt;li&gt;NetTcpBinding is the preferred one for optimal performance &lt;/li&gt;    &lt;li&gt;Service Bus Naming      &lt;ul&gt;       &lt;li&gt;Hierarchical structure, similar to DNS &lt;/li&gt;        &lt;li&gt;Updates takes effect immediately &lt;/li&gt;        &lt;li&gt;Naming scheme: scheme://&lt;em&gt;solution&lt;/em&gt;.servicebus.windows.net/name/… &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;What’s wrong with DNS?      &lt;ul&gt;       &lt;li&gt;High latency for updates &lt;/li&gt;        &lt;li&gt;Names hosts, not services &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Service Registry      &lt;ul&gt;       &lt;li&gt;A registry for service endpoints &lt;/li&gt;        &lt;li&gt;Services can be categorized (eg. printers can be organized into a separate category) &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Service Bus Messaging      &lt;ul&gt;       &lt;li&gt;Based on WCF &lt;/li&gt;        &lt;li&gt;Not supported:          &lt;ul&gt;           &lt;li&gt;Atomic transaction flow &lt;/li&gt;            &lt;li&gt;Protocol level transport authentication &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;More information about Service Bus on MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/dd582728.aspx"&gt;http://msdn.microsoft.com/en-us/library/dd582728.aspx&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;SQL Data Services – Under The Hood&lt;/h3&gt;  &lt;p&gt;With Gopal Kakivaya&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_450l3VHhZSU/SjguDJ_SBdI/AAAAAAAAADY/IGuQaZ8T0A0/s1600-h/IMG_1104%5B3%5D.jpg"&gt;&lt;img title="IMG_1104" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="338" alt="IMG_1104" src="http://lh3.ggpht.com/_450l3VHhZSU/SjguDuLw3oI/AAAAAAAAADc/rT4lb0ePpHE/IMG_1104_thumb%5B1%5D.jpg?imgmax=800" width="445" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h5&gt;Motivation&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Database as a service      &lt;ul&gt;       &lt;li&gt;Pay-as-you-go model &lt;/li&gt;        &lt;li&gt;Guaraneed SLA &lt;/li&gt;        &lt;li&gt;Familiar relational programming model &lt;/li&gt;        &lt;li&gt;Leverage existing skills and tools          &lt;ul&gt;           &lt;li&gt;This is new compared to the PDC08 version &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Full control of the logical database administration &lt;/li&gt;        &lt;li&gt;The physical aspects of the database administration is handled by the service provider &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;h5&gt;Concepts&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Database Provisioning Model      &lt;ul&gt;       &lt;li&gt;Account          &lt;ul&gt;           &lt;li&gt;Each account as one or more servers &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Server          &lt;ul&gt;           &lt;li&gt;Has one or more logins &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Database          &lt;ul&gt;           &lt;li&gt;Users &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Connection Model      &lt;ul&gt;       &lt;li&gt;Clients connect directly to a database &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Security Model      &lt;ul&gt;       &lt;li&gt;Uses regular SQL security model          &lt;ul&gt;           &lt;li&gt;Username + password &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Future: AD Federation, etc &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h5&gt;Architecture&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Components      &lt;ul&gt;       &lt;li&gt;Master node &lt;/li&gt;        &lt;li&gt;Data Nodes          &lt;ul&gt;           &lt;li&gt;SQL Server              &lt;ul&gt;               &lt;li&gt;Replication Agent &lt;/li&gt;                &lt;li&gt;Local Partition Map &lt;/li&gt;             &lt;/ul&gt;           &lt;/li&gt;            &lt;li&gt;Fabric              &lt;ul&gt;               &lt;li&gt;Reconfiguration Agent &lt;/li&gt;                &lt;li&gt;PM Location Resolution &lt;/li&gt;                &lt;li&gt;Failure detector &lt;/li&gt;                &lt;li&gt;Ring Topology &lt;/li&gt;             &lt;/ul&gt;           &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;One partition is set as partition, and one or more secondary partitions are located on other data nodes.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Partitioning      &lt;ul&gt;       &lt;li&gt;Provides better fault tolerance &lt;/li&gt;        &lt;li&gt;Failed partions can be rebuilt faster          &lt;ul&gt;           &lt;li&gt;Eg. if the database is divided into 10 partitions, it’s much faster to rebuild the failed partition than the entire database &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Fault tolerance      &lt;ul&gt;       &lt;li&gt;Security built into the software          &lt;ul&gt;           &lt;li&gt;Signed data, eg. will detect if the network card has corrupted the data &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Can be used on cheap hardware          &lt;ul&gt;           &lt;li&gt;If anything fails (eg. a disk), the faulted hardware will automatically be shut down              &lt;ul&gt;               &lt;li&gt;This is made possible by the use of &lt;em&gt;replica sets&lt;/em&gt; &lt;/li&gt;             &lt;/ul&gt;           &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Replication      &lt;ul&gt;       &lt;li&gt;Reads are completed at the primary &lt;/li&gt;        &lt;li&gt;Writes are replicated to all nodes          &lt;ul&gt;           &lt;li&gt;The primary partition will wait for acknowledges from the secondaries &lt;/li&gt;            &lt;li&gt;All writes, both to the primary and to the secondaries are part of the transaction &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;The replication factor may be configured, based on the customer’s demand          &lt;ul&gt;           &lt;li&gt;“Replication factor of 4” means that there are 1 primary and 3 secondaries &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Reconfiguration      &lt;ul&gt;       &lt;li&gt;As machines die, new machines must take their place &lt;/li&gt;        &lt;li&gt;Types of reconfiguration          &lt;ul&gt;           &lt;li&gt;Primary failover &lt;/li&gt;            &lt;li&gt;Removing a failed secondary              &lt;ul&gt;               &lt;li&gt;Might be temporary, eg. because of an update made to the machine. &lt;/li&gt;                &lt;li&gt;The secondary will not be replaced immediately, since it might be temporarly down &lt;/li&gt;             &lt;/ul&gt;           &lt;/li&gt;            &lt;li&gt;Adding recovered replica &lt;/li&gt;            &lt;li&gt;Building a new secondary &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&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/3308330123380486651-1683638204843909721?l=sverrehundeide.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SverresBlog/~4/BaZySCLGNUI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sverrehundeide.blogspot.com/feeds/1683638204843909721/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://sverrehundeide.blogspot.com/2009/06/leap-conference-day-2.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/1683638204843909721?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/1683638204843909721?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SverresBlog/~3/BaZySCLGNUI/leap-conference-day-2.html" title="LEAP Conference – day 2" /><author><name>sverrehundeide</name><uri>http://www.blogger.com/profile/08018607198830272906</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://1.bp.blogspot.com/_450l3VHhZSU/SV_v6tt1GvI/AAAAAAAAAAM/gu15cR4YG0I/S220/Sverre2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_450l3VHhZSU/SjguAbft1VI/AAAAAAAAAC8/JnQ7WAP2PqQ/s72-c/IMG_1091_thumb%5B3%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://sverrehundeide.blogspot.com/2009/06/leap-conference-day-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8NQXYzeip7ImA9WxJWEUs.&quot;"><id>tag:blogger.com,1999:blog-3308330123380486651.post-3578498956267498262</id><published>2009-06-16T01:43:00.001+02:00</published><updated>2009-06-16T17:58:10.882+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-16T17:58:10.882+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Silverlight" /><category scheme="http://www.blogger.com/atom/ns#" term="LEAP" /><title>LEAP Conference – day 1</title><content type="html">&lt;p&gt;A summary of day 1 of the LEAP conference in Redmond, Seattle&lt;/p&gt;  &lt;h3&gt;Keynote &lt;/h3&gt;  &lt;p&gt;With Scott Guthrie&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_450l3VHhZSU/SjbcpK2cn5I/AAAAAAAAACQ/9sX2VB-PXdQ/s1600-h/IMG_1062%5B3%5D.jpg"&gt;&lt;img title="IMG_1062" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="313" alt="IMG_1062" src="http://lh4.ggpht.com/_450l3VHhZSU/Sjbcph5X11I/AAAAAAAAACU/cwzBZEB0PLA/IMG_1062_thumb%5B1%5D.jpg?imgmax=800" width="411" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h5&gt;Rich web&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;AJAX &amp;amp; HTLML4/5 and Silverlight &lt;/li&gt;    &lt;li&gt;Silverlight 3      &lt;ul&gt;       &lt;li&gt;Ships in July 2009 &lt;/li&gt;        &lt;li&gt;Runs inside and outside the browser &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Demos (&lt;a href="http://www.iis.net/media/"&gt;http://www.iis.net/media/&lt;/a&gt;) &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Smooth streaming – adaptive bitrate &lt;/li&gt;      &lt;li&gt;The streaming server is free &lt;/li&gt;      &lt;li&gt;Supports pre-recorded and live content &lt;/li&gt;      &lt;li&gt;Content is cached on servers local to the user – one webserver can serve a large number of clients &lt;/li&gt;      &lt;li&gt;Demo client/server application created with Silverlight template &lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Using navigation template &lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;“Out-of-browser” settings      &lt;ul&gt;       &lt;li&gt;Can use GPU acceleration &lt;/li&gt;        &lt;li&gt;Support for context menus (right-clicking) will be added to Silverlight 4 &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Expression Blend 3      &lt;ul&gt;       &lt;li&gt;Ships in July 2009 &lt;/li&gt;        &lt;li&gt;New feature SketchFlow for sketching/prototyping UI          &lt;ul&gt;           &lt;li&gt;Use multiple sources like scanned images, pictures etc &lt;/li&gt;            &lt;li&gt;Create workflows &lt;/li&gt;            &lt;li&gt;Wiggly Styles &lt;/li&gt;            &lt;li&gt;Separate skin which looks like a hand-drawn image &lt;/li&gt;            &lt;li&gt;Without colors – focus on functionality and usability &lt;/li&gt;            &lt;li&gt;Looks similar to Balsamiq Mockups &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Photoshop import          &lt;ul&gt;           &lt;li&gt;Supports selecting layers &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Sample data          &lt;ul&gt;           &lt;li&gt;Creating, editing and styling &lt;/li&gt;            &lt;li&gt;The designer person can get the application working with testdata without being dependent on the developer &lt;/li&gt;            &lt;li&gt;Disigner import for Silverlight will be significantly improved in VS 2010 &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Web platform installer      &lt;ul&gt;       &lt;li&gt;&lt;a href="http://www.microsoft.com/web/"&gt;http://www.microsoft.com/web/&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;Supports install of IIS Media Server 2.0 &lt;/li&gt;        &lt;li&gt;Search engine optimization tool          &lt;ul&gt;           &lt;li&gt;Generate site analysis report &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;Multi-core&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;How can developers take advantage of multi-core CPUs?      &lt;ul&gt;       &lt;li&gt;Shift from &lt;i&gt;how&lt;/i&gt; to do things to &lt;i&gt;what to do&lt;/i&gt;:           &lt;ul&gt;           &lt;li&gt;Using LINQ and lambda expressions &lt;/li&gt;            &lt;li&gt;The framework can then utilize multiple CPUs by partitioning the execution into different chunks which can be run in parallel on different CPU cores &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;The ASP.Net core has been configured to support multi-core parallelism as default in .Net 4 &lt;/li&gt;    &lt;li&gt;.Net Parallel Extensions      &lt;ul&gt;       &lt;li&gt;Net parallel task debugger window in VS 2010          &lt;ul&gt;           &lt;li&gt;Easier navigation between threads and tasks &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;Automated Testing&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;VS 2010 has better support for TDD      &lt;ul&gt;       &lt;li&gt;New mode for working with classes which hasn’t yet been created (switch into this mode by pressing Ctl + Alt + Space). &lt;/li&gt;        &lt;li&gt;Automatic generation of classes and methods based on the test &lt;/li&gt;        &lt;li&gt;Demo – Scott referring to the AAA (Arrange – Act – Assert) pattern (which is good!) &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Manual test tools &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;&lt;a href="http://lh4.ggpht.com/_450l3VHhZSU/SjbcqIzNO3I/AAAAAAAAACY/iFd5cgLbP4Y/s1600-h/IMG_1063%5B4%5D.jpg"&gt;&lt;img title="IMG_1063" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="435" alt="IMG_1063" src="http://lh6.ggpht.com/_450l3VHhZSU/SjbcqnmREmI/AAAAAAAAACc/My4GpFyn8U4/IMG_1063_thumb%5B2%5D.jpg?imgmax=800" width="622" border="0" /&gt;&lt;/a&gt; &lt;/h4&gt;  &lt;h4&gt;Cloud&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;The same .Net runtime binaries are used on-premise and in cloud      &lt;ul&gt;       &lt;li&gt;ASP.Net &lt;/li&gt;        &lt;li&gt;SQL Server &lt;/li&gt;        &lt;li&gt;WCF / Workflow &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;SharePoint&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Built-in support in VS 2010 &lt;/li&gt;    &lt;li&gt;Features include:      &lt;ul&gt;       &lt;li&gt;Projects &lt;/li&gt;        &lt;li&gt;List &lt;/li&gt;        &lt;li&gt;Web-Parts &lt;/li&gt;        &lt;li&gt;Workflows &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;SharePoint Patterns and SharePoint futures&lt;/h3&gt;  &lt;p&gt;With Paul Andrew&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_450l3VHhZSU/SjbcqxwS4cI/AAAAAAAAACg/5yLqrOjxFbI/s1600-h/IMG_1065%5B3%5D.jpg"&gt;&lt;img title="IMG_1065" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="287" alt="IMG_1065" src="http://lh6.ggpht.com/_450l3VHhZSU/SjbcrS1u9FI/AAAAAAAAACk/Ezj2S5DsfRw/IMG_1065_thumb%5B1%5D.jpg?imgmax=800" width="403" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;Development patterns and practices&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.microsoft.com/spg"&gt;http://www.microsoft.com/spg&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;The SharePoint Development Lifecycle&lt;/h4&gt;  &lt;h4&gt;Memory management&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Use the SPDisposeCheck utility &lt;/li&gt;    &lt;li&gt;SharePoint APIs return IDisposable objects &lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;Deployment&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;VSeWSS 1.3      &lt;ul&gt;       &lt;li&gt;Extension to VS &lt;/li&gt;        &lt;li&gt;Simplify deployment with the “Package” feature          &lt;ul&gt;           &lt;li&gt;Creates the .wsp file in one command &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Automatic file renaming &lt;/li&gt;        &lt;li&gt;Deployment conflict resolver &lt;/li&gt;        &lt;li&gt;Deploy additional assemblies &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;Futures&lt;/h4&gt;  &lt;p&gt;This information was confidental until the Sharepoint conference in Las Vegas in October 2009, and will not be covered in this post.&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;Patterns &amp;amp; Practices roadmap&lt;/h3&gt;  &lt;p&gt;With Eugenio Pace&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_450l3VHhZSU/Sjbcr_eeEiI/AAAAAAAAACo/FwkFAquYNkA/s1600-h/IMG_1066%5B3%5D.jpg"&gt;&lt;img title="IMG_1066" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="329" alt="IMG_1066" src="http://lh3.ggpht.com/_450l3VHhZSU/SjbcsXX_AHI/AAAAAAAAACs/yuoCczcDCCg/IMG_1066_thumb%5B1%5D.jpg?imgmax=800" width="473" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;P&amp;amp;P FY09 Programs&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Client development      &lt;ul&gt;       &lt;li&gt;Prism (WPF and Silverlight) &lt;/li&gt;        &lt;li&gt;Web Client &lt;/li&gt;        &lt;li&gt;Mobile Client &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Server development      &lt;ul&gt;       &lt;li&gt;SharePoint Guidance &lt;/li&gt;        &lt;li&gt;Services Development &lt;/li&gt;        &lt;li&gt;Web Service Security Guidance &lt;/li&gt;        &lt;li&gt;Enterprise Service Bus &lt;/li&gt;        &lt;li&gt;Web Service &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Solution Development Fundamentals      &lt;ul&gt;       &lt;li&gt;Enterprise Library &lt;/li&gt;        &lt;li&gt;Application Architecture Guide &lt;/li&gt;        &lt;li&gt;Testing Patterns &amp;amp; Guidance &lt;/li&gt;        &lt;li&gt;Data Access Guidance &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;What’s coming in FY 10?&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Client      &lt;ul&gt;       &lt;li&gt;Prism 3, expected March 2010 (WPF 4.0 / SL 4.0) &lt;/li&gt;        &lt;li&gt;Web Application Guidance (ASP.Net, MVC, jQuery, Dynamic Data) &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Server      &lt;ul&gt;       &lt;li&gt;SharePoint Guidance, April 2010 ()Internet Scale, Silverlight, LOB, Office 14) &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Services      &lt;ul&gt;       &lt;li&gt;Cloud Identity Management Guidance, November 2009 (Geneva, Azure Services, LiveID) &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Fundamentals      &lt;ul&gt;       &lt;li&gt;Enterprise Library 5.0, March 2010 &lt;/li&gt;        &lt;li&gt;Data Access Guidance, March 2010 (Domain Driven Design, EF 2.0, Astoria, .Net RIA Service) &lt;/li&gt;        &lt;li&gt;Application Architecture Guide 2&lt;sup&gt;nd&lt;/sup&gt; Edition, November 2009 &lt;/li&gt;        &lt;li&gt;Acceptance Testing Guide, November 2009 &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;CloudLib&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Reuses existing blocks for      &lt;ul&gt;       &lt;li&gt;Exception handling &lt;/li&gt;        &lt;li&gt;Validation &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Extensions to existing blocks for      &lt;ul&gt;       &lt;li&gt;Security &lt;/li&gt;        &lt;li&gt;Log &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;New blocks added for the cloud      &lt;ul&gt;       &lt;li&gt;DataAccess (SDS) &lt;/li&gt;        &lt;li&gt;Tables &lt;/li&gt;        &lt;li&gt;Config &lt;/li&gt;        &lt;li&gt;Blob &lt;/li&gt;        &lt;li&gt;Queue &lt;/li&gt;        &lt;li&gt;Worker &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;How to work with the P&amp;amp;P team?&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.microsoft.com/practices/"&gt;http://www.microsoft.com/practices/&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.codeplex.com/"&gt;http://www.codeplex.com/&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Affect the P&amp;amp;P backlog by getting involved in the community &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;h3&gt;Rich Internet Applications&lt;/h3&gt;  &lt;p&gt;With Ian Ellison-Taylor&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_450l3VHhZSU/Sjbcs2BZgVI/AAAAAAAAACw/ujLtkpPOOrw/s1600-h/IMG_1074%5B3%5D.jpg"&gt;&lt;img title="IMG_1074" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="330" alt="IMG_1074" src="http://lh3.ggpht.com/_450l3VHhZSU/SjbctajfGXI/AAAAAAAAAC0/NHujGk-sPTU/IMG_1074_thumb%5B1%5D.jpg?imgmax=800" width="468" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h5&gt;Silverlight 3&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;3D support &lt;/li&gt;    &lt;li&gt;“Out of browser” demo      &lt;ul&gt;       &lt;li&gt;Select “Desktop shortcut” when installing &lt;/li&gt;        &lt;li&gt;Still hosted in the browser internally          &lt;ul&gt;           &lt;li&gt;This is not visible to the user &lt;/li&gt;            &lt;li&gt;Not possible to access the browser’s XML DOM &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;New capabilities      &lt;ul&gt;       &lt;li&gt;Media          &lt;ul&gt;           &lt;li&gt;Smooth streaming &lt;/li&gt;            &lt;li&gt;More format choices (like H.264)              &lt;ul&gt;               &lt;li&gt;More efficient decoding – uses less resources &lt;/li&gt;             &lt;/ul&gt;           &lt;/li&gt;            &lt;li&gt;Fullscreen HD playback &lt;/li&gt;            &lt;li&gt;Extensible media formats &lt;/li&gt;            &lt;li&gt;Content protection &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Graphics      &lt;ul&gt;       &lt;li&gt;Perspective 3D Graphics &lt;/li&gt;        &lt;li&gt;New Bitmap API &lt;/li&gt;        &lt;li&gt;Enhanced Control Skinning &lt;/li&gt;        &lt;li&gt;Bitmap Caching          &lt;ul&gt;           &lt;li&gt;Performance improvements &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Themed App Support          &lt;ul&gt;           &lt;li&gt;Supported in Blend 3 &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Improved Text Rendering          &lt;ul&gt;           &lt;li&gt;Crisper text &lt;/li&gt;            &lt;li&gt;Faster rendering &lt;/li&gt;            &lt;li&gt;Support for more languages (about 30 in total) &lt;/li&gt;            &lt;li&gt;Better layout algorithms &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Dev Productivity      &lt;ul&gt;       &lt;li&gt;Controls (60+)          &lt;ul&gt;           &lt;li&gt;Datagrid &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Search Discoverability          &lt;ul&gt;           &lt;li&gt;Control which information to make available for search robots &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;.Net RIA Services Framework &lt;/li&gt;        &lt;li&gt;Improved Performance          &lt;ul&gt;           &lt;li&gt;Targeted for big applications &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Advanced Accessibility &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Out of Browser      &lt;ul&gt;       &lt;li&gt;Run Apps Out of Browser &lt;/li&gt;        &lt;li&gt;Desktop &amp;amp; Start Menu &lt;/li&gt;        &lt;li&gt;Safer &amp;amp; More Secure          &lt;ul&gt;           &lt;li&gt;Still running inside a sandbox, same security access as when running in the browser &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Smooth Installation &amp;amp; Auto Update &lt;/li&gt;        &lt;li&gt;Windows Integration          &lt;ul&gt;           &lt;li&gt;Better support for Windows 7, including touch and new start menu &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Connectivity Detection          &lt;ul&gt;           &lt;li&gt;Detects network connection status &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Design Tooling      &lt;ul&gt;       &lt;li&gt;Prototyping w/ SketchFlow          &lt;ul&gt;           &lt;li&gt;Sketch out random ideas &lt;/li&gt;            &lt;li&gt;Link them together using workflows &lt;/li&gt;            &lt;li&gt;Real controls are used under the covers              &lt;ul&gt;               &lt;li&gt;The scetch skin makes the user focus on the functionality – not on visual details like colors and fonts etc &lt;/li&gt;             &lt;/ul&gt;           &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Visual Design Workflow &lt;/li&gt;        &lt;li&gt;Accessibility Interactivity &lt;/li&gt;        &lt;li&gt;Design w/data &lt;/li&gt;        &lt;li&gt;VSTF Integration &lt;/li&gt;        &lt;li&gt;Design Surface Extensibility &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h5&gt;Windows Forms&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Will still be supported for many years and will be continued to be developed &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/3308330123380486651-3578498956267498262?l=sverrehundeide.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SverresBlog/~4/GQM_ZC5EbT0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sverrehundeide.blogspot.com/feeds/3578498956267498262/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://sverrehundeide.blogspot.com/2009/06/leap-conference-day-1.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/3578498956267498262?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/3578498956267498262?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SverresBlog/~3/GQM_ZC5EbT0/leap-conference-day-1.html" title="LEAP Conference – day 1" /><author><name>sverrehundeide</name><uri>http://www.blogger.com/profile/08018607198830272906</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://1.bp.blogspot.com/_450l3VHhZSU/SV_v6tt1GvI/AAAAAAAAAAM/gu15cR4YG0I/S220/Sverre2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_450l3VHhZSU/Sjbcph5X11I/AAAAAAAAACU/cwzBZEB0PLA/s72-c/IMG_1062_thumb%5B1%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://sverrehundeide.blogspot.com/2009/06/leap-conference-day-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIMRX46eCp7ImA9WxJQGEk.&quot;"><id>tag:blogger.com,1999:blog-3308330123380486651.post-2069754544080126576</id><published>2009-06-01T10:56:00.001+02:00</published><updated>2009-06-01T10:56:24.010+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-01T10:56:24.010+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="BDD" /><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title>A simple and compact style for BDD specifications</title><content type="html">&lt;div id="codeSnippetWrapper"&gt;When appropriate I prefer to use the &lt;a href="http://xunitpatterns.com/Testcase%20Class%20per%20Fixture.html" target="_blank"&gt;testcase-class-per-fixture&lt;/a&gt; style for writing &lt;a href="http://www.code-magazine.com/article.aspx?quickid=0805061" target="_blank"&gt;BDD style&amp;#160; contexts/specifications&lt;/a&gt;. &lt;/div&gt;  &lt;p&gt;However, when testing small systems where there is only one specification per context, the testcase-class-per-fixture syntax becomes overwhelming and cumbersome to user. &lt;/p&gt;  &lt;p&gt;For this reason I’m sometimes using a more compact format for the specifications:&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; height: 34px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; $Method$_Given$Context$_Should$ExpectedBehaviour$()&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;table border="0" cellspacing="0" cellpadding="2" width="725"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" width="200"&gt;&lt;strong&gt;$MethodName$&lt;/strong&gt;&lt;/td&gt;

      &lt;td valign="top" width="523"&gt;The &lt;a href="http://xunitpatterns.com/SUT.html" target="_blank"&gt;system under test (SUT)&lt;/a&gt;, will often be a method name &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="200"&gt;&lt;strong&gt;$Context$&lt;/strong&gt;&lt;/td&gt;

      &lt;td valign="top" width="523"&gt;The situation/scenario&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="200"&gt;&lt;strong&gt;$ExpectedBehaviour$&lt;/strong&gt;&lt;/td&gt;

      &lt;td valign="top" width="523"&gt;The expected outcome of the given context&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Example specifications:&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; height: 477px; max-height: 400px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; BDDSimpleStyleExample&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     [TestClass]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DateTimeSpecifications&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;         [TestMethod]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; AddDays_GivenTodayIs1stOfJanuaryAndAddingTwoDays_ShouldReturnJanuary3rd()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;             &lt;span style="color: #008000"&gt;//Arrange (setup up context / fixture, usually multiple lines of code)&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;             var today = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DateTime(2009, 1, 1);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;             &lt;span style="color: #008000"&gt;//Act (one line of code, invoke the System Under Test)&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;             DateTime result = today.AddDays(2);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;             &lt;span style="color: #008000"&gt;//Assert (Usually ONE assert / specification)&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;             Assert.AreEqual(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DateTime(2009, 1, 3), result);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;         [TestMethod]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; AddDays_GivenDateIsLastDayOfMonthAndAddingOneDay_ShouldReturnFirstDayOfNextMonths()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;         {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;             &lt;span style="color: #008000"&gt;//Arrange &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;             var today = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DateTime(2009, 1, 31);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;             &lt;span style="color: #008000"&gt;//Act&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;             DateTime result = today.AddDays(1);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;             &lt;span style="color: #008000"&gt;//Assert&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt;             Assert.AreEqual(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DateTime(2009, 2, 1), result);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt;         }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The disadvantages of using this style is that the method names in the test class may get very long, and the test results output isn’t formatted as good as it would have been when using one test case class per fixture:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_450l3VHhZSU/SiOXtP1tNZI/AAAAAAAAACI/a7h7qX_mr6s/s1600-h/bdd_simple_stye_output%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="bdd_simple_stye_output" border="0" alt="bdd_simple_stye_output" src="http://lh3.ggpht.com/_450l3VHhZSU/SiOXtnANkLI/AAAAAAAAACM/56TK4pieRJ8/bdd_simple_stye_output_thumb%5B1%5D.png?imgmax=800" width="568" height="190" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;The following ReSharper live template can be used to quickly add new specifications/tests:&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; [TestMethod]&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; $Method$_Given$Context$_Should$ExpectedBehaviour$()&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color: #008000"&gt;//Arrange &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     $body$&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;     &lt;span style="color: #008000"&gt;//Act&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;     &lt;span style="color: #008000"&gt;//Assert&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&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/3308330123380486651-2069754544080126576?l=sverrehundeide.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SverresBlog/~4/Sz3Q5YXRM6Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sverrehundeide.blogspot.com/feeds/2069754544080126576/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://sverrehundeide.blogspot.com/2009/06/simple-and-compact-style-for-bdd.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/2069754544080126576?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/2069754544080126576?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SverresBlog/~3/Sz3Q5YXRM6Y/simple-and-compact-style-for-bdd.html" title="A simple and compact style for BDD specifications" /><author><name>sverrehundeide</name><uri>http://www.blogger.com/profile/08018607198830272906</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://1.bp.blogspot.com/_450l3VHhZSU/SV_v6tt1GvI/AAAAAAAAAAM/gu15cR4YG0I/S220/Sverre2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_450l3VHhZSU/SiOXtnANkLI/AAAAAAAAACM/56TK4pieRJ8/s72-c/bdd_simple_stye_output_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://sverrehundeide.blogspot.com/2009/06/simple-and-compact-style-for-bdd.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EDQ38-eyp7ImA9WxVbE0k.&quot;"><id>tag:blogger.com,1999:blog-3308330123380486651.post-5158650145273133542</id><published>2009-03-29T19:59:00.001+02:00</published><updated>2009-03-29T20:01:12.153+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-29T20:01:12.153+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SOA" /><category scheme="http://www.blogger.com/atom/ns#" term="LEAP" /><title>LEAP part 3 - SOA</title><content type="html">&lt;h4&gt;The third master class: Loosely Coupled Business Systems: SOA on the Microsoft platform&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://www.udidahan.com/" target="_blank"&gt;Udi Dahan - The Software Simplist&lt;/a&gt; had been hired to present the third LEAP master class in Oslo. He is an well known international expert on enterprise software architecture and design, and is the author of the open source messaging framework &lt;a href="http://www.nservicebus.com/" target="_blank"&gt;nServiceBus&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The entire class was based on discussion and interaction with the audience, and the only Power Point slide used was the one showing the agenda.&lt;/p&gt;  &lt;p&gt;He started out with sketching a naive traditional n-tier application (big ball of mud), and based on suggestions from the audience we explored different solutions which might improve the solution. Whatever suggestions we threw at him, he always had a thoroughly considered answer describing pros and cons with the suggested solution. He obviously has a lot of experience with real world enterprise SOA applications.&lt;/p&gt;  &lt;p&gt;The goal was to create &lt;a href="http://www.udidahan.com/category/autonomous-services/" target="_blank"&gt;autonomous services&lt;/a&gt; - standalone services with loose coupling to other services. The system should be scalable and reliable and use as few resources as possible. &lt;/p&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;h5&gt;Topics discussed&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;Coupling&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Avoid coupling by slicing independent logic into separate vertical autonomous boundaries / services      &lt;ul&gt;       &lt;li&gt;Example of services: Order, inventory management, billing, shipping &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;How should services communicate with each other? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Where to put the orchestration/workflow logic?&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Layer on top of the business layer components? &lt;/li&gt;    &lt;li&gt;In an Enterprise Service Bus on the side of the services? &lt;/li&gt;    &lt;li&gt;In the GUI? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;When to use...&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Fire and forget &lt;/li&gt;    &lt;li&gt;Messaging (async / synchronous) &lt;/li&gt;    &lt;li&gt;Events &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Duplicate data in order to remove dependencies and keep services autonomous?&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;How to synchronize the data?      &lt;ul&gt;       &lt;li&gt;Publish / subscribe pattern can be used. E.g. when an address is updated in the customer service, the customer service can publish the updated address. &lt;/li&gt;        &lt;li&gt;Context of the update is important. Why did the change happen? This is information which is available close to the user and the business process (i.e. NOT at the data base tier), and is usually triggered from the UI. &lt;/li&gt;        &lt;li&gt;Versioning - published events have to be backwards compatible with subscribers &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Duplication of data is usually considered a bad practice, but for SOA it may have advantages:      &lt;ul&gt;       &lt;li&gt;Avoid service calls (e.g. retrieve customer address RPC style when needed) &lt;/li&gt;        &lt;li&gt;Services become more reliable and autonomous. What if the customer service is down? The the shipment service won't be able to do it's work since the address can't be retrieved. &lt;/li&gt;        &lt;li&gt;The duplicated data can be considered a local cache for the service &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Publish/subscribe vs. request/response&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Doesn't both solutions create dependencies between services?      &lt;ul&gt;       &lt;li&gt;Request/response creates design-time dependencies &lt;/li&gt;        &lt;li&gt;Pub/sub makes it possible to create services which are both design-time and run-time autonomous          &lt;ul&gt;           &lt;li&gt;Run-time autonomous: Will continue to work even when other services goes down &lt;/li&gt;            &lt;li&gt;Design-time autonomous: Has no direct references to other services &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Pub/sub advantages:      &lt;ul&gt;       &lt;li&gt;Better performance          &lt;ul&gt;           &lt;li&gt;Local cache (duplicated data) in each service &lt;/li&gt;            &lt;li&gt;No blocking transactions across service boundaries &lt;/li&gt;            &lt;li&gt;Easier to run processes in parallel - scales better &lt;/li&gt;            &lt;li&gt;Fire and forget gives faster response in the UI &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;Better resource utilization          &lt;ul&gt;           &lt;li&gt;Messages can be queued up and processed when resources get available &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Pub/sub disadvantages:      &lt;ul&gt;       &lt;li&gt;Systems might be harder to design correctly (requires untraditional thinking) &lt;/li&gt;        &lt;li&gt;Systems get harder to understand and debug&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Request/response advantages: &lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Explicit service calls / dependencies makes the system easier to implement, understand and debug &lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Request/response disadvantages:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Synchronous blocking architecture requires more resources&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Ties up more resources over longer time periods, ie. the system will not scale well.&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;Choose the right architecture for the right place, there is no silver bullet.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Achieving autonomous services by letting each service have it's own UI&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Consider a shipment service which requires a shipment address. The traditional design would be to let the shipment service call the customer service. Another option would be to let the shipment service collect the shipment address through it's own GUI, and thus keeping the service autonomous.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3308330123380486651-5158650145273133542?l=sverrehundeide.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SverresBlog/~4/1jHYQUoqJXQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sverrehundeide.blogspot.com/feeds/5158650145273133542/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://sverrehundeide.blogspot.com/2009/03/leap-part-3-soa.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/5158650145273133542?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/5158650145273133542?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SverresBlog/~3/1jHYQUoqJXQ/leap-part-3-soa.html" title="LEAP part 3 - SOA" /><author><name>sverrehundeide</name><uri>http://www.blogger.com/profile/08018607198830272906</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://1.bp.blogspot.com/_450l3VHhZSU/SV_v6tt1GvI/AAAAAAAAAAM/gu15cR4YG0I/S220/Sverre2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sverrehundeide.blogspot.com/2009/03/leap-part-3-soa.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EBQXc5eyp7ImA9WxVVEE4.&quot;"><id>tag:blogger.com,1999:blog-3308330123380486651.post-3891915484823585494</id><published>2009-03-03T00:14:00.001+01:00</published><updated>2009-03-03T00:14:10.923+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-03T00:14:10.923+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="LEAP" /><title>LEAP part 2</title><content type="html">&lt;h4&gt;The second master class: The Microsoft Data Platform and Business Intelligence&lt;/h4&gt;  &lt;p&gt;The second master class of LEAP Norway was presented by Jon Jahren from Microsoft Consulting Services Norway. &lt;/p&gt;  &lt;p&gt;This master class gave an overview of the Microsoft products and architectures for Business Intelligence (BI).&lt;/p&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;h4&gt;Master class summary&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;BI introduction&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Competitors &lt;/li&gt;      &lt;li&gt;How to introduce BI to a company&lt;/li&gt;      &lt;li&gt;Microsoft's vision and strategy for BI&lt;/li&gt;      &lt;li&gt;Demo of current Sharepoint BI solution&lt;/li&gt;      &lt;li&gt;Demo of data mining in Excel 2008 SP2&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Retrieve data from Analysis Services&lt;/li&gt;        &lt;li&gt;Generate forecast&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;Microsoft's BI stack&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Office, Sharepoint Server and SQL Server&lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;BI technical architecture&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;&lt;a href="http://www.informit.com/guides/content.aspx?g=sqlserver&amp;amp;seqNum=182" target="_blank"&gt;ETL&lt;/a&gt; (Extract, Transform and Load)&amp;#160; -&amp;gt; Presentation Server -&amp;gt; Client&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.tdwi.org/Publications/display.aspx?Id=6991" target="_blank"&gt;Kimball&lt;/a&gt; method fundamentals for Data Warehousing&lt;/li&gt;      &lt;li&gt;The Star Model&lt;/li&gt;      &lt;li&gt;Biztalk vs. SSIS&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Biztalk is message-based&lt;/li&gt;        &lt;li&gt;Both products have very similar features, but SSIS have much better performance&lt;/li&gt;        &lt;li&gt;In the latest versions, both can share the same adapters (WCF based)&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;SSIS demo&lt;/li&gt;      &lt;li&gt;OLAP demo&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Create Data Source View&lt;/li&gt;        &lt;li&gt;Create Cube&lt;/li&gt;        &lt;li&gt;Deploy&lt;/li&gt;        &lt;li&gt;MOLAP with realtime proactive caching&lt;/li&gt;        &lt;li&gt;Microsoft's strategy is to use ONE cube for all perspectives&lt;/li&gt;        &lt;ul&gt;         &lt;li&gt;A &amp;quot;perspective&amp;quot; is a view of the cube for a specific report&lt;/li&gt;          &lt;li&gt;All fact and dimension tables in ONE cube&lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;Metadata&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Use Sharepoint for metadata&lt;/li&gt;      &lt;li&gt;MDM - Master Data Management&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Avoid duplicate entities&lt;/li&gt;        &lt;li&gt;Estimated 5 - 15% of&amp;#160; all data is duplicated in large enterprises&lt;/li&gt;        &lt;li&gt;A new MDM application platform is&amp;#160; to be released by Microsoft&lt;/li&gt;        &lt;li&gt;Business Data Hub&lt;/li&gt;        &lt;ul&gt;         &lt;li&gt;In the cloud&lt;/li&gt;       &lt;/ul&gt;        &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Paxos_algorithm" target="_blank"&gt;PAXOS&lt;/a&gt; &lt;/li&gt;        &lt;ul&gt;         &lt;li&gt;Algorithm for fault-tolerant distributed computing&lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/ul&gt;    &lt;li&gt;The future of BI&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Load -&amp;gt; View -&amp;gt; Model&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;Create model automatically based on usage, instead of creating the model first&lt;/li&gt;     &lt;/ul&gt;      &lt;li&gt;IMDB&lt;/li&gt;      &lt;ul&gt;       &lt;li&gt;In-memory storage for performance&lt;/li&gt;        &lt;li&gt;Is the underlying engine for self-service BI&lt;/li&gt;        &lt;li&gt;&lt;a href="http://www.sqlmag.com/Blog/Index.cfm?BlogDate=02/2/09&amp;amp;DepartmentID=1111&amp;amp;Action=BlogIndex" target="_blank"&gt;SQL Server Gemini&lt;/a&gt;&lt;/li&gt;        &lt;ul&gt;         &lt;li&gt;Add-in to Excel 14 for self-service BI&lt;/li&gt;          &lt;li&gt;Supporting millions of rows&lt;/li&gt;       &lt;/ul&gt;     &lt;/ul&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;Next master class: SOA on the Microsoft platform with &lt;a href="http://www.udidahan.com/" target="_blank"&gt;Udi Dahan&lt;/a&gt;&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:fbfb00a6-74e4-432e-a067-4d4d0819273b" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Koder: &lt;a href="http://technorati.com/tags/LEAP" rel="tag"&gt;LEAP&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3308330123380486651-3891915484823585494?l=sverrehundeide.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SverresBlog/~4/ZmB3h2geQvA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sverrehundeide.blogspot.com/feeds/3891915484823585494/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://sverrehundeide.blogspot.com/2009/03/leap-part-2.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/3891915484823585494?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/3891915484823585494?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SverresBlog/~3/ZmB3h2geQvA/leap-part-2.html" title="LEAP part 2" /><author><name>sverrehundeide</name><uri>http://www.blogger.com/profile/08018607198830272906</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://1.bp.blogspot.com/_450l3VHhZSU/SV_v6tt1GvI/AAAAAAAAAAM/gu15cR4YG0I/S220/Sverre2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sverrehundeide.blogspot.com/2009/03/leap-part-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYNQ3c9eCp7ImA9WxVWEkg.&quot;"><id>tag:blogger.com,1999:blog-3308330123380486651.post-7365366177319963554</id><published>2009-02-21T22:09:00.005+01:00</published><updated>2009-02-21T23:59:52.960+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-21T23:59:52.960+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title>Arrange, Act and Assert syntax for testing</title><content type="html">&lt;p&gt;This post is a summary of a lightningtalk I held for some of my colleagues at Objectware back in August 2008.&lt;/p&gt;  &lt;h4&gt;What is Arrange, Act, Assert (AAA)?&lt;/h4&gt;  &lt;p&gt;AAA is a way to organize your tests. The contents of the tests are divided in to three parts: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Arrange&lt;/strong&gt;: Do the necessary setup required for running the test. Usually multiple lines of code.   
&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Act&lt;/strong&gt;: Execute the code which should be tested. Should be one line of code.   
&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Assert&lt;/strong&gt;: Verify that the code behaved as expected. Should contain only one assertion. &lt;/li&gt; &lt;/ol&gt;  &lt;h5&gt;Example of a test without AAA&lt;/h5&gt;  &lt;pre class="code"&gt;[&lt;span style="color: rgb(43, 145, 175);"&gt;TestMethod&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;GetCustomerById()
{
&lt;span style="color:green;"&gt;// Arrange
&lt;/span&gt;&lt;span style="color:blue;"&gt;const int &lt;/span&gt;CustomerId = 5;
&lt;span style="color:blue;"&gt;var &lt;/span&gt;repository = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;CustomerRepository&lt;/span&gt;();

&lt;span style="color:green;"&gt;// Act &amp;amp; Assert
&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Assert&lt;/span&gt;.AreEqual(CustomerId, repository.GetCustomerById(CustomerId));
}&lt;/pre&gt;
The same test written in AAA style:
&lt;pre class="code"&gt;[&lt;span style="color: rgb(43, 145, 175);"&gt;TestMethod&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;GetCustomerById()
{
&lt;span style="color:green;"&gt;// Arrange
&lt;/span&gt;&lt;span style="color:blue;"&gt;const int &lt;/span&gt;CustomerId = 5;
&lt;span style="color:blue;"&gt;var &lt;/span&gt;repository = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;CustomerRepository&lt;/span&gt;();

&lt;span style="color:green;"&gt;// Act
&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Customer &lt;/span&gt;customer = repository.GetCustomerById(CustomerId);

&lt;span style="color:green;"&gt;// Assert
&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Assert&lt;/span&gt;.AreEqual(CustomerId, customer);
}&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;The example above is simple, but the value of using AAA style becomes more apparent for complex tests.

&lt;h4&gt;Why using AAA syntax&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;The tests become more robust,  easier to read and to maintain &lt;/li&gt;
&lt;li&gt;Being able to use AAA syntax is essential when writing &lt;a href="http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/07/24/arrange-act-assert-and-bdd-specifications.aspx" target="_blank"&gt;Behaviour Driven Development style specifications/tests&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;h4&gt;AAA and mocking&lt;/h4&gt;&lt;p&gt;In the following example, which parts of the code are arranging, acting and asserting?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_450l3VHhZSU/SaBtjI0EMCI/AAAAAAAAABw/WHYD4bilW0s/s1600-h/ScreenShot002%5B5%5D.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="ScreenShot002" alt="ScreenShot002" src="http://lh3.ggpht.com/_450l3VHhZSU/SaBtpMey3II/AAAAAAAAAB0/sEgIj_6_TRI/ScreenShot002_thumb%5B3%5D.png?imgmax=800" border="0" width="776" height="370" /&gt;&lt;/a&gt; &lt;/p&gt;The record/playback style should not be used, since it results in tests which are very hard to read and understand.

&lt;p&gt;The same test as above written in AAA style:&lt;/p&gt;&lt;pre class="code"&gt;[&lt;span style="color: rgb(43, 145, 175);"&gt;TestMethod&lt;/span&gt;]
&lt;span style="color:blue;"&gt;public void &lt;/span&gt;ShouldGenerateCreditInvoiceDocumentWhenNegativeAmountNew()
{
&lt;span style="color:green;"&gt;// Arrange
&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;ICustomerService &lt;/span&gt;customerService = &lt;span style="color: rgb(43, 145, 175);"&gt;MockRepository&lt;/span&gt;.GenerateStub&amp;lt;&lt;span style="color: rgb(43, 145, 175);"&gt;ICustomerService&lt;/span&gt;&amp;gt;();
&lt;span style="color: rgb(43, 145, 175);"&gt;IDocumentService &lt;/span&gt;documentService = &lt;span style="color: rgb(43, 145, 175);"&gt;MockRepository&lt;/span&gt;.GenerateStub&amp;lt;&lt;span style="color: rgb(43, 145, 175);"&gt;IDocumentService&lt;/span&gt;&amp;gt;();
&lt;span style="color:blue;"&gt;double &lt;/span&gt;amount = -1000;
&lt;span style="color: rgb(43, 145, 175);"&gt;Customer &lt;/span&gt;customer = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;Customer&lt;/span&gt;() { Id = 12345, Name = &lt;span style="color: rgb(163, 21, 21);"&gt;"Name1" &lt;/span&gt;};
customerService.Stub(stub =&amp;gt; stub.GetCustomer(customer.Id)).Return(customer);
&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;InvoicingProcess &lt;/span&gt;invoicingProcess = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;InvoicingProcess&lt;/span&gt;(customerService, documentService);

&lt;span style="color:green;"&gt;// Act
&lt;/span&gt; invoicingProcess.Invoice(customer.Id, amount);

&lt;span style="color:green;"&gt;// Assert
&lt;/span&gt;documentService.AssertWasCalled(stub =&amp;gt; stub.CreateDocument(customer, &lt;span style="color: rgb(43, 145, 175);"&gt;DocumentType&lt;/span&gt;.CreditInvoice));
}&lt;/pre&gt;&lt;h5&gt;Mocking frameworks supporting AAA syntax&lt;/h5&gt;&lt;p&gt;The following mocking frameworks supports AAA:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Rhino Mocks 3.5 &lt;/li&gt;
&lt;li&gt;Moq &lt;/li&gt;
&lt;li&gt;NUnit &lt;/li&gt;
&lt;li&gt;Typemock Isolator 5.0 &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/3308330123380486651-7365366177319963554?l=sverrehundeide.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SverresBlog/~4/f7J-Fjo_1rc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sverrehundeide.blogspot.com/feeds/7365366177319963554/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://sverrehundeide.blogspot.com/2009/02/arrange-act-and-assert-syntax-for.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/7365366177319963554?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/7365366177319963554?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SverresBlog/~3/f7J-Fjo_1rc/arrange-act-and-assert-syntax-for.html" title="Arrange, Act and Assert syntax for testing" /><author><name>sverrehundeide</name><uri>http://www.blogger.com/profile/08018607198830272906</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://1.bp.blogspot.com/_450l3VHhZSU/SV_v6tt1GvI/AAAAAAAAAAM/gu15cR4YG0I/S220/Sverre2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_450l3VHhZSU/SaBtpMey3II/AAAAAAAAAB0/sEgIj_6_TRI/s72-c/ScreenShot002_thumb%5B3%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://sverrehundeide.blogspot.com/2009/02/arrange-act-and-assert-syntax-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YARHg7eSp7ImA9WxVQEEQ.&quot;"><id>tag:blogger.com,1999:blog-3308330123380486651.post-7805170984443874138</id><published>2009-01-22T22:55:00.001+01:00</published><updated>2009-01-27T22:19:05.601+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-27T22:19:05.601+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="LEAP" /><title>LEAP part 1</title><content type="html">&lt;p&gt;&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:9e15a333-0d58-4ad5-9bf7-34197b4c3dbd" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Koder: &lt;a href="http://technorati.com/tags/LEAP" rel="tag"&gt;LEAP&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h1&gt;&lt;/h1&gt;  &lt;h4&gt;About LEAP&lt;/h4&gt;  &lt;p&gt;Earlier this week I attended the first out of five classes of Microsoft's new Lead Enterprise Architecture Program (LEAP). The goal of LEAP is to educate a group of Microsoft partners and system integrators on the Microsoft platform. During the spring, 5 Master Class training sessions will be held at Microsoft's office in Oslo, and in June LEAP participants from all over the world will meet for one week in Redmond, Seattle.&lt;/p&gt;  &lt;p&gt;This is the first time LEAP is organized in Norway, and if successful, it probably will be repeated later on.&lt;/p&gt;  &lt;h4&gt;The first master class&lt;/h4&gt;  &lt;p&gt;The topic of the first master class was &lt;em&gt;N-tier and N-layer architecture&lt;/em&gt; and the class had about 40 participants.&lt;/p&gt;  &lt;p&gt;Fortunately, Microsoft did not just give a presentation in the traditional drag and drop create-an-application-in-five-minutes style. Instead, the well known software architect &lt;a href="http://jimmynilsson.com/blog/" target="_blank"&gt;Jimmy Nilsson&lt;/a&gt; had been engaged to run the show. He's best known for being the author of the excellent &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0321268202" target="_blank"&gt;Applying Domain Driven Design and Patterns&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Instead of focusing on products, he advocated Test Driven Design/Development, Domain Driven Design, code quality and object orientation. Much of the time was spent on group discussions.&lt;/p&gt;  &lt;p&gt;The following topics were covered:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Layering      &lt;ul&gt;       &lt;li&gt;Focus on the Domain Model pattern &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Data access      &lt;ul&gt;       &lt;li&gt;O/R mapping, entity framework &lt;/li&gt;        &lt;li&gt;Suggested to use &lt;a href="http://code.msdn.microsoft.com/EFPocoAdapter" target="_blank"&gt;EF POCO Adapter&lt;/a&gt; for those who would like to start using Entity Framework v1 and have a migration path to EF v2 &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;UI patterns      &lt;ul&gt;       &lt;li&gt;MCV, MVP, MVVM &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Case study      &lt;ul&gt;       &lt;li&gt;Worked together in groups to suggest the most appropriate architecture for a specific case          &lt;br /&gt;&lt;/li&gt;     &lt;/ul&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/3308330123380486651-7805170984443874138?l=sverrehundeide.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SverresBlog/~4/Z1W6xxEJokM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sverrehundeide.blogspot.com/feeds/7805170984443874138/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://sverrehundeide.blogspot.com/2009/01/leap-part-1.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/7805170984443874138?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/7805170984443874138?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SverresBlog/~3/Z1W6xxEJokM/leap-part-1.html" title="LEAP part 1" /><author><name>sverrehundeide</name><uri>http://www.blogger.com/profile/08018607198830272906</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://1.bp.blogspot.com/_450l3VHhZSU/SV_v6tt1GvI/AAAAAAAAAAM/gu15cR4YG0I/S220/Sverre2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sverrehundeide.blogspot.com/2009/01/leap-part-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04FRXw4eCp7ImA9WxNXFE4.&quot;"><id>tag:blogger.com,1999:blog-3308330123380486651.post-8502365147663077737</id><published>2009-01-17T16:36:00.005+01:00</published><updated>2009-10-01T23:18:34.230+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-01T23:18:34.230+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows 7" /><title>Mounting ISO images in Windows 7 beta 1</title><content type="html">&lt;div style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; FLOAT: none; PADDING-TOP: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:611fe848-1f2f-4be3-a82e-167760da4602" class="wlWriterEditableSmartContent"&gt;Technorati Koder: &lt;a href="http://technorati.com/tags/Windows+7" rel="tag"&gt;Windows 7&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Yesterday I installed Windows beta 1 on the laptop which I use for training. &lt;/p&gt;&lt;p&gt;My employer provides me the Visual Studio installation CD as an ISO image, but when getting to the stage of installing it, I discovered that none of my regular ISO mounting tools (like &lt;a href="http://www.daemon-tools.cc/" target="_blank"&gt;DEAMON Tools&lt;/a&gt;) worked on Windows 7.&lt;/p&gt;&lt;p&gt;Fortunately, I found this small, non-intrusive and free mounting tool called &lt;a href="http://www.pismotechnic.com/download/" target="_blank"&gt;Prismo File Mount&lt;/a&gt;. It installed in a second, and is really easy to use.&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_450l3VHhZSU/SXH7CQScFsI/AAAAAAAAABo/eWr3frhbMqc/s1600-h/ScreenShot001%5B6%5D.png"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; WIDTH: 422px; DISPLAY: inline; HEIGHT: 172px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="ScreenShot001" border="0" alt="ScreenShot001" src="http://lh6.ggpht.com/_450l3VHhZSU/SXH7DCuEcsI/AAAAAAAAABs/ymUAqltmH8Y/ScreenShot001_thumb%5B4%5D.png?imgmax=800" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Using “Quick mount” on the ISO file transformed it into a browsable directory from which I could install Visual Studio, similar to the Compressed Folders shell extension for zip files built into Windows Explorer.&lt;/p&gt;&lt;p&gt;Using the “Mount…” option, it is possible to map the image as a drive, if desired.&lt;/p&gt;&lt;p&gt;UPDATE: Prismo File Mount does not work for 64-bit editions of Windows 7. &lt;a href="http://www.magiciso.com/tutorials/miso-magicdisc-history.htm"  target="_blank"&gt;MagicDisc&lt;/a&gt; is a good free alternative in case you are running 64-bit Windows 7.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3308330123380486651-8502365147663077737?l=sverrehundeide.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SverresBlog/~4/k70ZIBQGEY8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sverrehundeide.blogspot.com/feeds/8502365147663077737/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://sverrehundeide.blogspot.com/2009/01/mounting-iso-images-in-windows-7-beta-1.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/8502365147663077737?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/8502365147663077737?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SverresBlog/~3/k70ZIBQGEY8/mounting-iso-images-in-windows-7-beta-1.html" title="Mounting ISO images in Windows 7 beta 1" /><author><name>sverrehundeide</name><uri>http://www.blogger.com/profile/08018607198830272906</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://1.bp.blogspot.com/_450l3VHhZSU/SV_v6tt1GvI/AAAAAAAAAAM/gu15cR4YG0I/S220/Sverre2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_450l3VHhZSU/SXH7DCuEcsI/AAAAAAAAABs/ymUAqltmH8Y/s72-c/ScreenShot001_thumb%5B4%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://sverrehundeide.blogspot.com/2009/01/mounting-iso-images-in-windows-7-beta-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4NQXo8cSp7ImA9WxVREk0.&quot;"><id>tag:blogger.com,1999:blog-3308330123380486651.post-5541526381086967948</id><published>2008-12-30T01:04:00.002+01:00</published><updated>2009-01-17T16:43:10.479+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-17T16:43:10.479+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Podcast" /><title>My podcast subscriptions</title><content type="html">&lt;p&gt;   &lt;/p&gt;&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1a570893-1972-405e-a75b-2756e691dd22" style="margin: 0px; padding: 0px; display: inline;"&gt;Technorati Koder: &lt;a href="http://technorati.com/tags/Podcasts" rel="tag"&gt;Podcasts&lt;/a&gt;&lt;/div&gt; &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Podcasts are a great way to keep yourself updated on topics of your interests. I usually listens to podcasts when sitting on the bus back an forth between home and work and when exercising at the fitness centre.&lt;/p&gt;  &lt;p&gt;For .Net developers, there exists several good podcast publishers. My favourites audio podcasts are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;.Net rocks: &lt;a title="http://www.pwop.com/feed.aspx?show=dotnetrocks&amp;amp;filetype=master3" href="http://www.pwop.com/feed.aspx?show=dotnetrocks&amp;amp;filetype=master3"&gt;http://www.pwop.com/feed.aspx?show=dotnetrocks&amp;amp;filetype=master3&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Hanselminutes: &lt;a title="http://feeds.feedburner.com/HanselminutesCompleteMP3" href="http://feeds.feedburner.com/HanselminutesCompleteMP3"&gt;http://feeds.feedburner.com/HanselminutesCompleteMP3&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Alt.Net Podcast: &lt;a title="http://feeds.feedburner.com/altnetpodcast" href="http://feeds.feedburner.com/altnetpodcast"&gt;http://feeds.feedburner.com/altnetpodcast&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Herding Code: &lt;a title="http://feeds.feedburner.com/HanselminutesCompleteMP3" href="http://feeds.feedburner.com/HanselminutesCompleteMP3"&gt;http://feeds.feedburner.com/HanselminutesCompleteMP3&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Polymorphic Podcast: &lt;a title="http://feeds.feedburner.com/PolymorphicPodcast" href="http://feeds.feedburner.com/PolymorphicPodcast"&gt;http://feeds.feedburner.com/PolymorphicPodcast&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I'm also subscribing to a few non- .Net podcasts. For these ones, I put some more efforts into filtering out non-relevant shows.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Agile Toolkit Podcasts: &lt;a title="http://agiletoolkit.libsyn.com/rss" href="http://agiletoolkit.libsyn.com/rss"&gt;http://agiletoolkit.libsyn.com/rss&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Software Engineering Radio: &lt;a title="http://feeds.feedburner.com/se-radio?q=rss" href="http://feeds.feedburner.com/se-radio?q=rss"&gt;http://feeds.feedburner.com/se-radio?q=rss&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Ruby on Rails Podcast: &lt;a title="http://feeds.feedburner.com/rubyonrailspodcast" href="http://feeds.feedburner.com/rubyonrailspodcast"&gt;http://feeds.feedburner.com/rubyonrailspodcast&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/3308330123380486651-5541526381086967948?l=sverrehundeide.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/SverresBlog/~4/fyNnTdk16Jw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://sverrehundeide.blogspot.com/feeds/5541526381086967948/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://sverrehundeide.blogspot.com/2008/12/my-podcast-subscriptions.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/5541526381086967948?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3308330123380486651/posts/default/5541526381086967948?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SverresBlog/~3/fyNnTdk16Jw/my-podcast-subscriptions.html" title="My podcast subscriptions" /><author><name>sverrehundeide</name><uri>http://www.blogger.com/profile/08018607198830272906</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="22" height="32" src="http://1.bp.blogspot.com/_450l3VHhZSU/SV_v6tt1GvI/AAAAAAAAAAM/gu15cR4YG0I/S220/Sverre2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://sverrehundeide.blogspot.com/2008/12/my-podcast-subscriptions.html</feedburner:origLink></entry></feed>

