<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-19906305</id><updated>2012-01-24T15:17:26.640+01:00</updated><category term='VBScript'/><category term='Architecture'/><category term='javascript'/><category term='SQL'/><category term='PnP'/><category term='BDC'/><category term='Outlook'/><category term='Sandcastle'/><category term='Windows7'/><category term='Security'/><category term='Tridion'/><category term='ASP.NET'/><category term='OSS'/><category term='Testing'/><category term='PowerShell'/><category term='Taxonomy'/><category term='Backup'/><category term='COM+'/><category term='Software'/><category term='Windows 2008'/><category term='Aspose'/><category term='Webrichtlijnen'/><category term='LINQ'/><category term='DevDays'/><category term='XSLT'/><category term='MySQL'/><category term='CSS'/><category term='Certification'/><category term='PDF'/><category term='OpenXML'/><category term='ajax'/><category term='Software Development'/><category term='Hippo'/><category term='SharePoint'/><category term='XML'/><category term='Generics'/><category term='MSBuild'/><category term='Latex'/><category term='C#'/><category term='Interop'/><category term='CruiseControl.NET'/><category term='VPC'/><category term='Reflection'/><category term='Firefox'/><category term='AntiXSS'/><category term='NuGet'/><category term='VS2010'/><category term='design'/><category term='RTF'/><category term='iText'/><category term='VS2005'/><category term='.NET'/><title type='text'>Oh freddled gruntbuggly</title><subtitle type='html'>... about software development and other things</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>89</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-19906305.post-428174719110905246</id><published>2011-12-04T21:07:00.001+01:00</published><updated>2011-12-04T21:09:56.572+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='BDC'/><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><title type='text'>Remove BDC Models in PowerShell</title><content type='html'>I needed a PowerShell script to enumerate over all the installed BDC Models (and delete them), but couldn't find the example on TechNet or MSDN. After trying some things, I found the following script:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$context = "http://sharepoint.local"&lt;br /&gt;$bdc = Get-SPBusinessDataCatalogMetadataObject -BdcObjectType Catalog -ServiceContext $context&lt;br /&gt;foreach ($model in $bdc.GetModels("*") ) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Remove-SPBusinessDataCatalogModel –Identity $model&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-428174719110905246?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/428174719110905246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=428174719110905246' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/428174719110905246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/428174719110905246'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2011/12/remove-bdc-models-in-powershell.html' title='Remove BDC Models in PowerShell'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-2555264898535004010</id><published>2011-08-05T10:44:00.000+02:00</published><updated>2011-08-05T10:44:29.228+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='VS2010'/><title type='text'>Tips while working with SharePoint projects in VS2010</title><content type='html'>&lt;ul&gt;&lt;li&gt;Install the &lt;a href="http://cksdev.codeplex.com/"&gt;CSKDev tools&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Use quick deploy on the project to test small changes in markup and code&lt;/li&gt;&lt;li&gt;Page layouts don't support Intellisense when double clicking the aspx (VS2010 opens the file in textmode). Right-click and use 'View Code' or 'View Markup' will open the file as a webpage, with fill Intellisense support.&lt;/li&gt;&lt;li&gt;To start with already filled page layouts based on the content type, use the CSKDev 'Create page layout' on the content type in the Server Explorer. &lt;img border="0" height="96" width="200" src="http://2.bp.blogspot.com/-QB2ufvOmksM/TjutGEkADKI/AAAAAAAAC8w/wNSUK8ZRktQ/s200/Create-page-layout.png" /&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/19906305-2555264898535004010?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/2555264898535004010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=2555264898535004010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/2555264898535004010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/2555264898535004010'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2011/08/tips-while-working-with-sharepoint.html' title='Tips while working with SharePoint projects in VS2010'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-QB2ufvOmksM/TjutGEkADKI/AAAAAAAAC8w/wNSUK8ZRktQ/s72-c/Create-page-layout.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-8556579851756273133</id><published>2011-08-04T22:22:00.003+02:00</published><updated>2011-08-05T08:53:00.027+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Taxonomy'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Get Taxonomy terms from the user while configuring a WebPart</title><content type='html'>&lt;!-- code formatted by http://manoli.net/csharpformat/ --&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;p&gt;In my current SharePoint 2010 project we make use of Managed Metadata terms a lot. We want to be able to select taxonomy terms while configuring WebParts, but the setup of the taxonomy field isn't quite straightforward.For the configuration of WebParts with exotic controls, you need to implement a custom ToolPart and link it to your WebPart. Because I think we will create a lot of custom ToolParts, I created a base class for displaying these taxonomy fields.&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="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="rem"&gt;/// This class makes it easier to work with Taxonomy data in a &amp;lt;see cref="Microsoft.SharePoint.WebPartPages.ToolPart"&amp;gt;ToolPart&amp;lt;/see&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="rem"&gt;/// &amp;lt;/summary&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;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TaxonomyToolPart : ToolPart&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&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="rem"&gt;/// Gets or sets the name of the term store.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&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="rem"&gt;/// &amp;lt;value&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="rem"&gt;/// The name of the term store.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/value&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;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; TermStoreName { get; &lt;span class="kwrd"&gt;protected&lt;/span&gt; set; }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Gets or sets the name of the term group.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;value&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="rem"&gt;/// The name of the term group.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/value&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;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; TermGroupName { get; &lt;span class="kwrd"&gt;protected&lt;/span&gt; set; }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&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="rem"&gt;/// Gets or sets the name of the term set.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&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="rem"&gt;/// &amp;lt;value&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;    &lt;span class="rem"&gt;/// The name of the term set.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/value&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;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; TermSetName { get; &lt;span class="kwrd"&gt;protected&lt;/span&gt; set; }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Gets or sets a value indicating whether multiple terms can be selected.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;value&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;    &lt;span class="rem"&gt;///   &amp;lt;c&amp;gt;true&amp;lt;/c&amp;gt; if multiple terms can be selected; otherwise, &amp;lt;c&amp;gt;false&amp;lt;/c&amp;gt;.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; MultiSelect { get; &lt;span class="kwrd"&gt;protected&lt;/span&gt; set; }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; TaxonomyWebTaggingControl TaxonomyControl { get; set; }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Called by the ASP.NET page framework to notify server controls that use composition-based &lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;    &lt;span class="rem"&gt;/// implementation to create any child controls they contain in preparation for posting back or rendering.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; CreateChildControls()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;        &lt;span class="rem"&gt;// create a panel that will hold all of our controls &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;        Panel toolPartPanel = &lt;span class="kwrd"&gt;new&lt;/span&gt; Panel();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;        &lt;span class="rem"&gt;// create the actual control &lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;        SPContext context = SPContext.Current;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;        SPSite site = context.Site;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;        TaxonomySession session = &lt;span class="kwrd"&gt;new&lt;/span&gt; TaxonomySession(site);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;        TermStore termStore = session.TermStores[TermStoreName];&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;        Group group = termStore.Groups[TermGroupName];&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;        TermSet productsTermSet = group.TermSets[TermSetName];&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;        TaxonomyControl = &lt;span class="kwrd"&gt;new&lt;/span&gt; TaxonomyWebTaggingControl();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  56:  &lt;/span&gt;        TaxonomyControl.ID = &lt;span class="str"&gt;"taxonomyControl"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  57:  &lt;/span&gt;        TaxonomyControl.SspId.Add(termStore.Id);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  58:  &lt;/span&gt;        TaxonomyControl.TermSetId.Add(productsTermSet.Id);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  59:  &lt;/span&gt;        TaxonomyControl.IsAddTerms = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  60:  &lt;/span&gt;        TaxonomyControl.AllowFillIn = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  61:  &lt;/span&gt;        TaxonomyControl.IsMulti = MultiSelect;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  62:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  63:  &lt;/span&gt;        TaxonomyControl.Text = GetTextFromWebPart(&lt;span class="kwrd"&gt;this&lt;/span&gt;.ParentToolPane.SelectedWebPart);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  64:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  65:  &lt;/span&gt;        toolPartPanel.Controls.Add(TaxonomyControl);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  66:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  67:  &lt;/span&gt;        &lt;span class="rem"&gt;// finally add the panel to the controls collection of the tool part &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  68:  &lt;/span&gt;        Controls.Add(toolPartPanel);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  69:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  70:  &lt;/span&gt;        &lt;span class="kwrd"&gt;base&lt;/span&gt;.CreateChildControls();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  71:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  72:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  73:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  74:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Gets the textual representation of the selected terms from the WebPart and sets it on the Taxonomy control.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  75:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  76:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="webPart"&amp;gt;The web part.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  77:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;a value from the webpart to select in the TaxonomywebTaggingControl&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  78:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;remarks&amp;gt;Override this method in your child class to link the webpart property with the taxonomy field.&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  79:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;example&amp;gt;the term string has a value like 'Term 1|db61b704-cf1d-490d-bfc3-4cbcd8d2f453;Term 2|66b5696d-94a2-4299-ae34-63d3072ca357&amp;lt;/example&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  80:  &lt;/span&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetTextFromWebPart(WebPart webPart) { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty; }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  81:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  82:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  83:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Sets the textual representation of the selected terms from the Taxonomy control to the WebPart.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  84:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  85:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="webPart"&amp;gt;The parent web part.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  86:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="selectedTerms"&amp;gt;The selected terms.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  87:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;remarks&amp;gt;Override this method in yout child class to link the taxonomy filed with the webpart property&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  88:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;example&amp;gt;the term string has a value like 'Term 1|db61b704-cf1d-490d-bfc3-4cbcd8d2f453;Term 2|66b5696d-94a2-4299-ae34-63d3072ca357&amp;lt;/example&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  89:  &lt;/span&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SetTextToWebPart(WebPart webPart, &lt;span class="kwrd"&gt;string&lt;/span&gt; selectedTerms) { }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  90:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  91:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  92:  &lt;/span&gt;    &lt;span class="rem"&gt;/// Called when the user clicks the OK or the Apply button in the tool pane.&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  93:  &lt;/span&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  94:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ApplyChanges()&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  95:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  96:  &lt;/span&gt;        WebPart webPart = &lt;span class="kwrd"&gt;this&lt;/span&gt;.ParentToolPane.SelectedWebPart;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  97:  &lt;/span&gt;        SetTextToWebPart(webPart, TaxonomyControl.Text);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  98:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  99:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This base class can now be used in a new class, where the configuration of the ToolPart and the linking with the WebPart needs to be implemented:&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;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TestToolPart : TaxonomyToolPart&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &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;public&lt;/span&gt; TestToolPart()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &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;this&lt;/span&gt;.TermStoreName = &lt;span class="str"&gt;"Managed Metadata"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.TermGroupName = &lt;span class="str"&gt;"NL"&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;this&lt;/span&gt;.TermSetName = &lt;span class="str"&gt;"Brand"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;this&lt;/span&gt;.MultiSelect = &lt;span class="kwrd"&gt;true&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;this&lt;/span&gt;.Title = &lt;span class="str"&gt;"Taxonomy Example"&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;   &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetTextFromWebPart(Microsoft.SharePoint.WebPartPages.WebPart webPart)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; ((TestWebPart)webPart).Text;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SetTextToWebPart(Microsoft.SharePoint.WebPartPages.WebPart webPart, &lt;span class="kwrd"&gt;string&lt;/span&gt; selectedTerms)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        ((TestWebPart)webPart).Text = selectedTerms;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;}        &lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The only thing you need to do is override the &lt;code&gt;GetToolParts()&lt;/code&gt; in your WebPart to inject your custom ToolPart in the ToolPart array, and your ToolPart should work. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-8556579851756273133?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/8556579851756273133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=8556579851756273133' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/8556579851756273133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/8556579851756273133'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2011/08/get-taxonomy-terms-from-user-while.html' title='Get Taxonomy terms from the user while configuring a WebPart'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-9057796680676901596</id><published>2011-01-23T16:04:00.010+01:00</published><updated>2011-04-01T12:42:58.574+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='AntiXSS'/><category scheme='http://www.blogger.com/atom/ns#' term='NuGet'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Enhanced ASP.NET input sanitation with AntiXSS</title><content type='html'>&lt;h4&gt;Need for input sanitation&lt;/h4&gt; &lt;p&gt;The applications you build for the internet can have quite a big audience. It is possible for the whole connected world to visit your website and use the app you built on it. But with these visitors, you will attract dark forces who can misuse your application for their own agenda. It is therefore needed to harden your application, and be sure no-one can send email, inject custom HTML and javascript and hijack user information. It is needed you built secure code and protect yourself.&lt;/p&gt;&lt;p&gt;The main characteristic of an application is that it needs input data from the end user. With this input data, something is done. If this data is sent back to the user, is can be displayed on the screen. In it most simple form, this looks like:&lt;/p&gt; &lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:TextBox&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;inputBox&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;TextMode&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;MultiLine&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Button&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;submitButton&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Submit&amp;quot;&lt;/span&gt; &lt;br /&gt;        &lt;span class="attr"&gt;onclick&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;submitButton_Click&amp;quot;&lt;/span&gt;  &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;EnableViewState&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;AssociatedControlID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;resultLiteral&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Html output:&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Literal&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;resultLiteral&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:Literal&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;With the following button_click code:&lt;/p&gt;&lt;br /&gt;&lt;code class="csharp"&gt;protected void submitButton_Click(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    string input = inputBox.Text;&lt;br /&gt;    string output = input;&lt;br /&gt;    resultLiteral.Text = output;&lt;br /&gt;} &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;With this example code, it is possible to inject javascript into the response. Try pasting &amp;lt;script language=&amp;quot;javascript&amp;quot;&amp;gt;alert('Hello World!');&amp;lt;/script&amp;gt; in the input box and see.&lt;/p&gt;&lt;h4&gt;Out of the box ASP.NET functionality&lt;/h4&gt;&lt;p&gt;With the standard ASP.NET setup, the last script example didn’t worked, but threw an exception with the message ‘A potentially dangerous Request.Form value was detected from the client (inputBox=&amp;quot;&amp;lt;script language=&amp;quot;ja...&amp;quot;).’. This is because out of the box, ASP.NET will scan each input parameter to dangerous characters. But don’t let this filter mislead you. The default characters will be the less than character (&amp;lt;) and some ampersand-hash encoded characters. There are also scenario’s you will be switching off the request validation. Simply because some business scenario (maybe you want some html from your user). &lt;/p&gt;&lt;p&gt;You can switch your validation off for all your pages in ASP.NET in the web.config, or specify ValidateRequest=&amp;quot;false&amp;quot; in the page directive for the specific page you want to disable this check (note that in ASP.NET 4, there are some additional steps needed). But don’t rely on request validation to heavily, because there are situations in can’t detect malicious input.&lt;/p&gt;&lt;h4&gt;Shortcomings of Request Validation&lt;/h4&gt;&lt;p&gt;Think about the following situation. You want the user of your site to specify the background color of an element on your page, and you use the following submit event:&lt;/p&gt;&lt;code class="csharp"&gt;protected void submitButton_Click(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    string color = inputBox.Text;&lt;br /&gt;    string output = &amp;quot;&amp;lt;div style=\&amp;quot;width:200px;height:200px;background-color:&amp;quot; + color + &amp;quot;;\&amp;quot;&amp;gt;Colored Box&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;    resultLiteral.Text = output; &lt;br /&gt;} &lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Because the input is directly pasted into an attribute of the div tag, you don’t need HTML directly to inject javascript. The following line will pass through input validation, and inject the page with some potentially evil javascript:&lt;em&gt;&lt;br /&gt;red;&amp;quot; onclick=&amp;quot;alert('Hello World!');&amp;quot; &amp;quot;&lt;/em&gt;/&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Filtering input&lt;/h4&gt;&lt;p&gt;The first thing to prevent the injection of those unwanted code, is to filter the user input if used for generating output. Standard built-in in ASP.NET is the HttpUtility class with some Encoding methods. They can help with the above two attacks, but it is still possible to inject URL backgrounds in the second example. Because these filters are limited in usage, Microsoft started a new library quite some time ago.&lt;/p&gt;&lt;h4&gt;AntiXSS library&lt;/h4&gt;&lt;p&gt;The two main features in the AntiXSS library are the Encoder and Sanitizer classes. Like the HttpUtility, the encoder class has several specific Encoding methods. These methods are a lot more specific than HttpUtility though. In the second example, it is possible filter the color input with a call to Encoder.CssEncode. The output will be CSS encoded into ‘red\00003B\000022\000020onclick\00003D\000022alert\000028\000027Hello\000020World\000021\000027\000029\00003B\000022\000020\000022’. &lt;/p&gt;&lt;p&gt;The Sanitizer class is even more powerful. It can strip certain HTML tags out of the input. It can transform &lt;em&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot;&amp;gt;alert('Hello World!');&amp;lt;/script&amp;gt;&amp;lt;strong&amp;gt;bla&amp;lt;/strong&amp;gt;&amp;lt;img src=&amp;quot;bla.gif&amp;quot; /&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;one&amp;lt;li&amp;gt;Two&amp;lt;li&amp;gt;Three&amp;lt;/ul&amp;gt;&lt;/em&gt; into &lt;em&gt;&amp;lt;strong&amp;gt;bla&amp;lt;/strong&amp;gt;&amp;lt;img src=&amp;quot;bla.gif&amp;quot;&amp;gt; &amp;lt;ul&amp;gt; &amp;lt;li&amp;gt;one&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Two&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Three&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt; &lt;/em&gt;&lt;/p&gt;&lt;br /&gt;&lt;h4&gt;Install AntiXSS with NuGet&lt;/h4&gt;&lt;p&gt;AntiXSS used to be a very hidden gem somewhere deep on Microsoft Download or CodePlex. But with the new NuGet, it is on page one of packages. First you need to install NuGet into your Visual Studio. After that, right click your project and choose ‘Add Library Package Reference’. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_ZWHxGFTVlMU/TTxDZxKaAJI/AAAAAAAAC3A/H8I-yHrnbKE/s1600-h/image%5B4%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_ZWHxGFTVlMU/TTxDaTkl0BI/AAAAAAAAC3E/yqQ_UbhAyEY/image_thumb%5B2%5D.png?imgmax=800" width="238" height="383" /&gt;&lt;/a&gt;&lt;a href="http://lh4.ggpht.com/_ZWHxGFTVlMU/TTxDa3nEvQI/AAAAAAAAC3I/yP7-9rstWxQ/s1600-h/image%5B8%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_ZWHxGFTVlMU/TTxDbTVJJpI/AAAAAAAAC3M/r-g_79px7mo/image_thumb%5B4%5D.png?imgmax=800" width="566" height="379" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;As of today, AntiXSS is the eighth package in the list. If you click install, all assemblies for AntiXSS will be automatically downloaded and added to your solution. So it won’t be very hard anymore to write really secure code! &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-9057796680676901596?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/9057796680676901596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=9057796680676901596' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/9057796680676901596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/9057796680676901596'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2011/01/enhanced-aspnet-input-sanitation-with.html' title='Enhanced ASP.NET input sanitation with AntiXSS'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_ZWHxGFTVlMU/TTxDaTkl0BI/AAAAAAAAC3E/yqQ_UbhAyEY/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-1641692043496224690</id><published>2010-12-15T22:19:00.002+01:00</published><updated>2010-12-15T22:33:11.222+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PDF'/><category scheme='http://www.blogger.com/atom/ns#' term='iText'/><category scheme='http://www.blogger.com/atom/ns#' term='RTF'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Aspose'/><title type='text'>Conversion of a RTF document to PDF with C#</title><content type='html'>In my current project, I need to convert in an easy way RTF documents to PDF from managed code. I don't want to rebuild these documents in PDF, because the RTF's still have some need in the application.&lt;br /&gt;&lt;br /&gt;After google-ing around for possible solutions, I tried two components: the last version of &lt;a href="http://sourceforge.net/projects/itextsharp/"&gt;iTextSharp&lt;/a&gt; with RTF support (from version five on, the RTF support is split into a new project and removed from iTextSharp) and &lt;a href="http://www.aspose.com/categories/.net-components/aspose.words-for-.net/default.aspx"&gt;Aspose.Words&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;After a quick conversion with iTextSharp, I understand why RTF support was dropped. The produced PDF was one piece of garbage. The code I used was:&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;using (FileStream outstream = File.Create(outFile))&lt;br /&gt;{&lt;br /&gt;    Document docText = new Document();&lt;br /&gt;    PdfWriter writer = PdfWriter.GetInstance(docText, outstream);&lt;br /&gt;    docText.Open();&lt;br /&gt;    RtfParser rtf = new RtfParser(null);&lt;br /&gt;    using (FileStream rtfStream = File.OpenRead(inFile))&lt;br /&gt;    {&lt;br /&gt;         rtf.ConvertRtfDocument(rtfStream, docText);&lt;br /&gt;    }&lt;br /&gt;    docText.Close();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Aspose.Words worked like a charm, while using only two lines of code:&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;    Aspose.Words.Document doc = new Aspose.Words.Document(inFile);&lt;br /&gt;    doc.Save(outFile, SaveFormat.Pdf);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;The only drawback is iTextSharp is OpenSource and Aspose.Words isn't. But I guess there isn't another reliable OS alternative.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-1641692043496224690?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/1641692043496224690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=1641692043496224690' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/1641692043496224690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/1641692043496224690'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2010/12/conversion-of-rtf-document-to-pdf-with.html' title='Conversion of a RTF document to PDF with C#'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-1787403065819251548</id><published>2010-08-19T15:39:00.005+02:00</published><updated>2010-08-19T15:48:05.810+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='COM+'/><category scheme='http://www.blogger.com/atom/ns#' term='Tridion'/><category scheme='http://www.blogger.com/atom/ns#' term='VBScript'/><title type='text'>VBScript to detect if there is a COM+ application instance running</title><content type='html'>I had to figure out how to query the COM Administration catalog to detect if there is a specified COM+ application running.&lt;br /&gt;Here is the quickly written vbscript:&lt;br /&gt;&lt;code class="vbscript"&gt;&lt;br /&gt;running = False&lt;br /&gt;Dim oCatalog&lt;br /&gt;Set oCatalog = CreateObject("COMAdmin.COMAdminCatalog")&lt;br /&gt;sName = "Tridion Content Manager"&lt;br /&gt;Dim result&lt;br /&gt;set apps = oCatalog.GetCollection("Applications")&lt;br /&gt;apps.Populate&lt;br /&gt;&lt;br /&gt;For Each app In apps&lt;br /&gt;&amp;nbsp;&amp;nbsp;If app.Name = sName Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set objAppInst = apps.GetCollection("ApplicationInstances",app.Key)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;objAppInst.Populate&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for each inst in objAppInst&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pId = inst.Value("ProcessID")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;running = not ( inst.Value("IsPaused") or inst.Value("HasRecycled"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if running then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Exit For&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end if&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set objAppInst = nothing&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Exit For&lt;br /&gt;&amp;nbsp;&amp;nbsp;End If&lt;br /&gt;Next &lt;br /&gt;set apps = Nothing&lt;br /&gt;set oCatalog = nothing&lt;br /&gt;MsgBox pid &amp; " " &amp; running&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-1787403065819251548?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/1787403065819251548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=1787403065819251548' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/1787403065819251548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/1787403065819251548'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2010/08/vbscript-to-detect-if-there-is-com.html' title='VBScript to detect if there is a COM+ application instance running'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-6400902711722665631</id><published>2010-07-05T22:54:00.004+02:00</published><updated>2010-07-05T23:00:32.970+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Certification'/><title type='text'>Upgraded Certification</title><content type='html'>&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 236px; height: 80px;" src="http://3.bp.blogspot.com/_ZWHxGFTVlMU/TDJHi9BTFJI/AAAAAAAAC0w/NAlT_X8gjpI/s320/MCPD(rgb)_1372.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5490529561539187858" /&gt; &lt;br /&gt;With the new version of the .NET Framework, I needed to upgrade my .NET Certifications to this new version. A couple of months ago, I did the beta versions of these exams, and last week I got the results. I passed all the exams I did. They were not easy, so I was quite surprised to receive all the results positively back.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-6400902711722665631?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/6400902711722665631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=6400902711722665631' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/6400902711722665631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/6400902711722665631'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2010/07/upgraded-certification.html' title='Upgraded Certification'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZWHxGFTVlMU/TDJHi9BTFJI/AAAAAAAAC0w/NAlT_X8gjpI/s72-c/MCPD(rgb)_1372.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-8601525319381760869</id><published>2010-01-18T13:57:00.005+01:00</published><updated>2011-08-04T22:29:06.052+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CruiseControl.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='XSLT'/><title type='text'>Updated XSLT for CC.NET in SharePoint</title><content type='html'>Just modded my &lt;a href="http://gruntbuggly.blogspot.com/2008/04/show-your-ccnet-dashboard-in-sharepoint.html"&gt;XSLT for viewing the CC.NET status&lt;/a&gt; of the buildserver in the XML Webpart of Sharepoint 2007:&lt;br /&gt;&lt;br /&gt;&lt;code class="xslt" style="color: black; background: white; font-family: Consolas; font-size: 10pt;"&gt;&lt;br /&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: blue;"&gt; &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: blue;"&gt; &lt;/span&gt;&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;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:stylesheet&lt;/span&gt;&lt;span style="color: blue;"&gt; &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: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;xmlns:xsl&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;http://www.w3.org/1999/XSL/Transform&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:output&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;method&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;xml&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&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; &lt;/span&gt;&lt;span style="color: red;"&gt;indent&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;yes&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;omit-xml-declaration&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;yes&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;match&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;/&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;table&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;border&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;cellpadding&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;cellspacing&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;0&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;thead&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;ms-viewheadertr&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;style&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;text-align:left;&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;scope&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;col&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;ms-vh2-nograd&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;nowrap&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;nowrap&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Project&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;ms-vh2-nograd&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;#160;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;style&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;text-align:left;&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;scope&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;col&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;ms-vh2-nograd&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;nowrap&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;nowrap&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Status&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;ms-vh2-nograd&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;#160;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;style&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;text-align:left;&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;scope&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;col&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;ms-vh2-nograd&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;nowrap&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;nowrap&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Last buildtime&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;ms-vh2-nograd&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;#160;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;style&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;text-align:left;&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;scope&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;col&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;ms-vh2-nograd&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;nowrap&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;nowrap&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Buildlabel&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;ms-vh2-nograd&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;#160;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;style&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;text-align:left;&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;scope&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;col&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;ms-vh2-nograd&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;nowrap&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;nowrap&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Activity&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;thead&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;tbody&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:apply-templates&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;/CruiseControl/Projects/Project&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:sort&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;@name&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:apply-templates&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;tbody&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;table&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;match&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;Project&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;tr&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:if&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;test&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;position() mod 2 != 1&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &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;class&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;ms-alternating&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:if&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;ms-vb2&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;align&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;top&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;nowrap&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;nowrap&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;a&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;onfocus&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;OnLink(this)&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;href&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;@webUrl&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;onclick&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;GoToLink(this);return false;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;target&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;_self&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;@name&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;#160;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;td&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;ms-vb2&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;align&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;top&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;style&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;padding-bottom: 3px;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:choose&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;test&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;@lastBuildStatus='Failed'&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; color:red;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;test&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;@lastBuildStatus='Exception'&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; color:red;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;test&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;@lastBuildStatus='Unknown'&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; color:yellow;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;test&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;@lastBuildStatus='Failure'&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; color:red;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:otherwise&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; color:green;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:otherwise&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:choose&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;@lastBuildStatus&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;#160;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;ms-vb2&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;style&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;padding-bottom: 3px;&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;align&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;top&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;substring-before(@lastBuildTime,'T')&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;#160;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;substring-before(substring-after(@lastBuildTime,'T'),'.')&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;#160;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;ms-vb2&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;style&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;padding-bottom: 3px;text-align:right;&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;align&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;top&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;@lastBuildLabel&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;#160;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;td&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;class&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;ms-vb2&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;align&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;top&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;style&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; padding-bottom: 3px;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:choose&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;test&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;@activity='Building'&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; color:red;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;test&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;@activity='CheckingModifications'&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; color:yellow;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:otherwise&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:otherwise&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:choose&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;@activity&lt;/span&gt;&amp;quot;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;tr&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #2b91af;"&gt;xsl:stylesheet&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-8601525319381760869?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/8601525319381760869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=8601525319381760869' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/8601525319381760869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/8601525319381760869'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2010/01/uodate-xslt-for-ccnet-in-sharepoint.html' title='Updated XSLT for CC.NET in SharePoint'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-9162246857017087645</id><published>2009-10-24T12:00:00.004+02:00</published><updated>2009-10-24T12:10:33.992+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSS'/><category scheme='http://www.blogger.com/atom/ns#' term='Hippo'/><title type='text'>Getting Hippo Site Toolkit demo to work</title><content type='html'>While figuring out Hippo and its architecture, I found some annoying errors in the documentation. While the documentation at http://www.onehippo.org/site-toolkit/home reads: &lt;br /&gt;&lt;quote&gt;1. Download the wars, drop them in your Tomcat servlet container and start Tomcat (see in_servlet_container, but with different wars).&lt;br /&gt;2. Checkout the HST2 project, start the cms and the site of the demosuite in the buildin Jetty servlet container.&lt;br /&gt;&lt;/quote&gt;&lt;br /&gt;So I use Tomcat, and its saying in another page to rename the cms war to cms.war, there is no mention of renaming the site war to site.war. But in the rest of the documentation the assumption is made to use the /site URL. I'm no Tomcat guru, so how should I know that the webapp wars are used as URI shortcuts ;).&lt;br /&gt;&lt;br /&gt;But that's the main pain in the ass with OSS documentation, it's mostly incomplete. How hard should it be to test your HOWTO for a plain and simple demo. Adding a simple step 1.5: "rename the cms war to cms.war and the site war to site.war" isn't a big deal, but makes a difference of about 1 hour  for a Hippo n00b figuring out what's going on!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-9162246857017087645?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/9162246857017087645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=9162246857017087645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/9162246857017087645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/9162246857017087645'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2009/10/getting-hippo-site-toolkit-demo-to-work.html' title='Getting Hippo Site Toolkit demo to work'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-126640634196995946</id><published>2009-09-30T10:41:00.005+02:00</published><updated>2009-09-30T10:58:12.090+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VS2010'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Demo Parallel Extensions .NET 4.0</title><content type='html'>Yesterday I a gave a &lt;a href="http://cid-3ac7786dfaaf4364.skydrive.live.com/self.aspx/Public/VS2010-demo.pptx"&gt;presentation/demonstration&lt;/a&gt; about the upcoming .NET 4.0 framework release. Unfortunately, there wasn't enough time to show the complete parallel demo. Here I show a couple of ways to display all integers between 0 and 100 that are dividable by 10.&lt;br /&gt;&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;class Program&lt;br /&gt;{&lt;br /&gt;    // objects for classic parallel code&lt;br /&gt;    static object locker = new object();&lt;br /&gt;    static Queue&amp;lt;int&gt; integers;&lt;br /&gt;    //with concurrent Queue, we don't need a locker&lt;br /&gt;    static ConcurrentQueue&amp;lt;int&gt; concurrentIntegers;&lt;br /&gt;&lt;br /&gt;    static void Main(string[] args)&lt;br /&gt;    {&lt;br /&gt;        int steps = 100;&lt;br /&gt;        steps.WriteOnConsole(); //extension method to display an integer on the console&lt;br /&gt;        Classic(); //classic for loop, no parallel code&lt;br /&gt;        ClassicParallel(); //classic parallel invocation&lt;br /&gt;&lt;br /&gt;        New(steps); //parallel for loop&lt;br /&gt;        NewMoreLikeClassic(steps); //parallel the new way, but looks like classic parallel&lt;br /&gt;&lt;br /&gt;        Linq(steps); //old LINQ way&lt;br /&gt;        PLinq(steps); //new Parallel LINQ &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static void Classic(int steps = 100)&lt;br /&gt;    {&lt;br /&gt;        for (int i = 0; i &amp;lt; steps; i++)&lt;br /&gt;        {&lt;br /&gt;            if (i % 10 == 0)&lt;br /&gt;            {&lt;br /&gt;                i.WriteOnConsole();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static void ClassicParallel(int steps = 100)&lt;br /&gt;    {&lt;br /&gt;        integers = new Queue&amp;lt;int&gt;(steps);&lt;br /&gt;        // fill the queue with all integers&lt;br /&gt;        for (int i = 0; i &amp;lt; steps; i++)&lt;br /&gt;        {&lt;br /&gt;            integers.Enqueue(i);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        int workerCount = 5; //arbitrary number for workercount. &lt;br /&gt;        Thread[] workers = new Thread[workerCount];&lt;br /&gt;        // Create and start a separate thread for each worker&lt;br /&gt;        for (int i = 0; i &amp;lt; workerCount; i++)&lt;br /&gt;        {&lt;br /&gt;            workers[i] = new Thread(Consume);//.Start();&lt;br /&gt;        }&lt;br /&gt;        foreach (Thread worker in workers)&lt;br /&gt;        {&lt;br /&gt;            worker.Start();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static void Consume()&lt;br /&gt;    {&lt;br /&gt;        while (true)&lt;br /&gt;        {&lt;br /&gt;            int i;&lt;br /&gt;            lock (locker)&lt;br /&gt;            {&lt;br /&gt;                if (integers.Count == 0) return; // run until the queue is empty&lt;br /&gt;                i = integers.Dequeue();&lt;br /&gt;            }&lt;br /&gt;            if (i % 10 == 0)&lt;br /&gt;            {&lt;br /&gt;                i.WriteOnConsole();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static void New(int steps)&lt;br /&gt;    {&lt;br /&gt;         ParallelLoopResult result = Parallel.For(0, steps, (i, loop) =&gt;&lt;br /&gt;         {&lt;br /&gt;             if (i % 10 == 0)&lt;br /&gt;             {&lt;br /&gt;                 i.WriteOnConsole();&lt;br /&gt;             }&lt;br /&gt;             //With the LoopState, we can break and terminate the processing of the loop&lt;br /&gt;             if (i == 50)&lt;br /&gt;             {&lt;br /&gt;                     loop.Break();&lt;br /&gt;             }&lt;br /&gt;         }&lt;br /&gt;         );&lt;br /&gt;        Console.WriteLine("Completed: {0}, Breaked at iteration {1}",&lt;br /&gt;        result.IsCompleted,&lt;br /&gt;        result.LowestBreakIteration);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static void NewMoreLikeClassic(int steps = 100)&lt;br /&gt;    {&lt;br /&gt;        concurrentIntegers = new ConcurrentQueue&amp;lt;int&gt;(Enumerable.Range(0, steps));&lt;br /&gt;        Parallel.Invoke(() =&gt;&lt;br /&gt;            {&lt;br /&gt;                ConsumeQueue();&lt;br /&gt;            }&lt;br /&gt;        );&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static void ConsumeQueue()&lt;br /&gt;    {&lt;br /&gt;        // note: there is no locking used here, because we use a ConcurrentQueue&lt;br /&gt;        int i;&lt;br /&gt;        bool success = concurrentIntegers.TryDequeue(out i);&lt;br /&gt;        if (success &amp;&amp; (i % 10 == 0))&lt;br /&gt;        {&lt;br /&gt;            i.WriteOnConsole();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static void Linq(int steps)&lt;br /&gt;    {&lt;br /&gt;        Enumerable.Range(0,steps).Where(i =&gt; i % 10 == 0)&lt;br /&gt;            .ToList&amp;lt;int&gt;().ForEach(i=&gt;i.WriteOnConsole());&lt;br /&gt;    }&lt;br /&gt;        &lt;br /&gt;    private static void PLinq(int steps)&lt;br /&gt;    {&lt;br /&gt;        Enumerable.Range(0, steps).Where(i =&gt; i % 10 == 0).AsParallel()&lt;br /&gt;            .ToList&amp;lt;int&gt;().ForEach(i =&gt; i.WriteOnConsole());&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-126640634196995946?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/126640634196995946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=126640634196995946' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/126640634196995946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/126640634196995946'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2009/09/demo-parallel-extensions-net-40.html' title='Demo Parallel Extensions .NET 4.0'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-3285018141888612953</id><published>2009-09-16T16:36:00.005+02:00</published><updated>2009-09-16T16:50:23.324+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>ASP.NET favicon.ico routing to deep link</title><content type='html'>After seeing some errors in my application log complaining about a non existing business object with id favicon.ico, and being sure that I had a &amp;lt;link href="/resources/images/favicon.ico" rel="shortcut icon" /&amp;gt;  tag in my header section, I realized that old non-standard-compliant browsers do a request for the hard-coded /favicon.ico url. So I wanted to add a route in my route table to redirect these requests to the proper icon location. Unfortunately, there is no public StaticFileHandler available with a virtual path in its constructor, so I had to built them myself. The following couple of lines do the trick:&lt;br /&gt;&lt;br /&gt;Registering the routes in the application startup:&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;routes.Add(new Route("favicon.ico", new StaticFileRouteHandler("~/Resources/images/favicon.ico")));&lt;br /&gt;// generic, catch-all rule, caused the error for favicon.ico&lt;br /&gt;routes.Add(Routes.BusinessObject, new Route(&lt;br /&gt;        string.Format("{{{0}}}", RouteParameters.BusinessObjectIdentifier), &lt;br /&gt;        new CustomRouteHandler("~/Pages/BusinessObjectDetails.aspx")));&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The StaticFileRouteHandler to serve the the static file from the request.&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;public class StaticFileRouteHandler : IRouteHandler&lt;br /&gt;{&lt;br /&gt;    public string VirtualPath { get; set; }&lt;br /&gt;    public StaticFileRouteHandler(string virtualPath)&lt;br /&gt;    {&lt;br /&gt;        VirtualPath = virtualPath;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    #region IRouteHandler Members&lt;br /&gt;    public System.Web.IHttpHandler GetHttpHandler(RequestContext requestContext)&lt;br /&gt;    {&lt;br /&gt;        HttpContext.Current.RewritePath(VirtualPath);&lt;br /&gt;        return new DefaultHttpHandler();&lt;br /&gt;    }&lt;br /&gt;    #endregion&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-3285018141888612953?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/3285018141888612953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=3285018141888612953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/3285018141888612953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/3285018141888612953'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2009/09/aspnet-faviconico-routing-to-deep-link.html' title='ASP.NET favicon.ico routing to deep link'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-5166603386583899572</id><published>2009-09-02T22:57:00.000+02:00</published><updated>2009-09-02T23:01:26.769+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Interop'/><category scheme='http://www.blogger.com/atom/ns#' term='Tridion'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='VS2010'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>New VS2010 / .NET 4.0 features</title><content type='html'>I already love the new &lt;a href="http://msdn.microsoft.com/en-us/library/dd264741%28VS.100%29.aspx"&gt;dynamic&lt;/a&gt; keyword in VS2010, and missing it in my day to day work with Tridion COM objects. Although the drawback is no IntelliSense in VS on the object, see the following code to get the item title from a Tridion TOM item:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Old code&lt;/strong&gt;&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;object obj = tdse.GetObject(tcmUri, EnumOpenMode.OpenModeView, null, XMLReadFilter.XMLReadAll );&lt;br /&gt;string title = null;&lt;br /&gt;if (obj is Component)&lt;br /&gt;{&lt;br /&gt;    Component component = (Component) obj; &lt;br /&gt;    title = component.Title;&lt;br /&gt;}&lt;br /&gt;if (obj is Folder)&lt;br /&gt;{&lt;br /&gt;    Folder folder = (Folder) obj; &lt;br /&gt;    title = folder.Title;&lt;br /&gt;}  &lt;br /&gt;if (obj is Page)&lt;br /&gt;{&lt;br /&gt;    Page page = (Page) obj; &lt;br /&gt;    title = page.Title;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;New code&lt;/strong&gt;&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;dynamic tridionItem = tdse.GetObject(tcmUri, EnumOpenMode.OpenModeView);&lt;br /&gt;string title = tridionItem.Title;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Another long-missing-but-finally-added feature is the support of optional COM Interop parameters in C#. Before 4.0, you needed to specify all optional parameters in Interop method calls, even if you wanted to use the default values, leading to extremely long method calls (maybe not in Tridion, but infamous in Office Interop with Type.Missing). These method parameters do now have the block parentheses around them in IntelliSense:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZWHxGFTVlMU/Sp7XdW10TDI/AAAAAAAACxM/J7LIDPKwbXw/s1600-h/VS2010-is.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 676x; height: 24px;" src="http://2.bp.blogspot.com/_ZWHxGFTVlMU/Sp7XdW10TDI/AAAAAAAACxM/J7LIDPKwbXw/s800/VS2010-is.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5376971904474434610" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-5166603386583899572?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/5166603386583899572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=5166603386583899572' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/5166603386583899572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/5166603386583899572'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2009/09/new-vs2010-net-40-features.html' title='New VS2010 / .NET 4.0 features'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZWHxGFTVlMU/Sp7XdW10TDI/AAAAAAAACxM/J7LIDPKwbXw/s72-c/VS2010-is.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-332551072030770715</id><published>2009-07-15T22:26:00.004+02:00</published><updated>2009-07-16T00:02:47.019+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Using MySQL Providers with ASP.NET</title><content type='html'>&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 114px; height: 68px;" src="http://dev.mysql.com/common/logos/logo_mysql_sun_a.gif" border="0" alt="MySQL Logo" /&gt;&lt;br /&gt;I'm figuring out how to use MySQL with Visual Studio and ASP.NET. The first thing to install (besides MySQL Server) is the &lt;a href="http://dev.mysql.com/downloads/connector/net/6.0.html"&gt;MySQL Connector for .NET&lt;/a&gt;, currently at version 6.0.4.&lt;br /&gt;After installing this connector, you've all the .NET providers and entity framework stuff to go. One thing I should mention is that the .NET Connectors will install MySql providers which you can use in your website, MySql won't popup in the Express editions of Visual Studio. So you can't connect to a MySQL database with your server explorer with these versions.&lt;br /&gt;&lt;br /&gt;So installing the MySQL connector on your server will modify the server's machine.config and add the provider config in it. Not installing the connector on your server means you need to configure the providers in the system.web section of the web.config of the site (and bin deploying the MySql dll's of course):&lt;br /&gt;&lt;code class="xml"&gt;&lt;br /&gt;    &amp;lt;membership defaultProvider="MySQLMembershipProvider"&amp;gt;&lt;br /&gt;       &amp;lt;providers&amp;gt;&lt;br /&gt;          &amp;lt;remove name="MySQLMembershipProvider" /&amp;gt;&lt;br /&gt;          &amp;lt;add connectionStringName="MySqlServer" enablePasswordRetrieval="false"&lt;br /&gt;             enablePasswordReset="true" requiresQuestionAndAnswer="true"&lt;br /&gt;             applicationName="/" requiresUniqueEmail="false" passwordFormat="Clear"&lt;br /&gt;             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7"&lt;br /&gt;             minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10"&lt;br /&gt;             passwordStrengthRegularExpression="" name="MySQLMembershipProvider"&lt;br /&gt;             type="MySql.Web.Security.MySQLMembershipProvider, MySql.Web, Version=6.0.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /&amp;gt;&lt;br /&gt;       &amp;lt;/providers&amp;gt;&lt;br /&gt;    &amp;lt;/membership&amp;gt;&lt;br /&gt;    &amp;lt;profile&amp;gt;&lt;br /&gt;      &amp;lt;providers&amp;gt;&lt;br /&gt;        &amp;lt;remove name="MySQLProfileProvider"/&amp;gt;&lt;br /&gt;        &amp;lt;add name="MySQLProfileProvider" type="MySql.Web.Profile.MySQLProfileProvider, MySql.Web, Version=6.0.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionStringName="MySqlServer" applicationName="/" /&amp;gt;&lt;br /&gt;      &amp;lt;/providers&amp;gt;&lt;br /&gt;    &amp;lt;/profile&amp;gt;&lt;br /&gt;    &amp;lt;roleManager defaultProvider="MySQLRoleProvider"&amp;gt;&lt;br /&gt;       &amp;lt;providers&amp;gt;&lt;br /&gt;          &amp;lt;remove name="MySQLRoleProvider" /&amp;gt;&lt;br /&gt;          &amp;lt;add connectionStringName="MySqlServer" applicationName="/" name="MySQLRoleProvider"&lt;br /&gt;             type="MySql.Web.Security.MySQLRoleProvider, MySql.Web, Version=6.0.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /&amp;gt;&lt;br /&gt;       &amp;lt;/providers&amp;gt;&lt;br /&gt;    &amp;lt;/roleManager&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;These new providers need a connection string, so add to your connectionString section:&lt;br /&gt;&lt;code class="xml"&gt;&lt;br /&gt;&amp;lt;connectionStrings&amp;gt;&lt;br /&gt;    &amp;lt;add name="MySqlServer" providerName="MySql.Data.MySqlClient" connectionString="server=mysql1;user id=webuser;password=xxxxxx;persist security info=True;database=website" /&amp;gt;&lt;br /&gt;  &amp;lt;/connectionStrings&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Next you need the schema. The docs will say they will be created automatically, but I didn't saw a single table created. By looking at the connector source code, I distilled the following script to create the schema in your database:&lt;br /&gt;&lt;code class="mysql"&gt;&lt;br /&gt;CREATE TABLE  `my_aspnet_applications` (&lt;br /&gt;  `id` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;  `name` varchar(256) DEFAULT NULL,&lt;br /&gt;  `description` varchar(256) DEFAULT NULL,&lt;br /&gt;  PRIMARY KEY (`id`)&lt;br /&gt;) ;&lt;br /&gt;&lt;br /&gt;CREATE TABLE  `my_aspnet_membership` (&lt;br /&gt;  `userId` int(11) NOT NULL DEFAULT '0',&lt;br /&gt;  `Email` varchar(128) DEFAULT NULL,&lt;br /&gt;  `Comment` varchar(255) DEFAULT NULL,&lt;br /&gt;  `Password` varchar(128) NOT NULL,&lt;br /&gt;  `PasswordKey` char(32) DEFAULT NULL,&lt;br /&gt;  `PasswordFormat` tinyint(4) DEFAULT NULL,&lt;br /&gt;  `PasswordQuestion` varchar(255) DEFAULT NULL,&lt;br /&gt;  `PasswordAnswer` varchar(255) DEFAULT NULL,&lt;br /&gt;  `IsApproved` tinyint(1) DEFAULT NULL,&lt;br /&gt;  `LastActivityDate` datetime DEFAULT NULL,&lt;br /&gt;  `LastLoginDate` datetime DEFAULT NULL,&lt;br /&gt;  `LastPasswordChangedDate` datetime DEFAULT NULL,&lt;br /&gt;  `CreationDate` datetime DEFAULT NULL,&lt;br /&gt;  `IsLockedOut` tinyint(1) DEFAULT NULL,&lt;br /&gt;  `LastLockedOutDate` datetime DEFAULT NULL,&lt;br /&gt;  `FailedPasswordAttemptCount` int(10) unsigned DEFAULT NULL,&lt;br /&gt;  `FailedPasswordAttemptWindowStart` datetime DEFAULT NULL,&lt;br /&gt;  `FailedPasswordAnswerAttemptCount` int(10) unsigned DEFAULT NULL,&lt;br /&gt;  `FailedPasswordAnswerAttemptWindowStart` datetime DEFAULT NULL,&lt;br /&gt;  PRIMARY KEY (`userId`)&lt;br /&gt;)  COMMENT='2';&lt;br /&gt;&lt;br /&gt;CREATE TABLE  `my_aspnet_profiles` (&lt;br /&gt;  `userId` int(11) NOT NULL,&lt;br /&gt;  `valueindex` longtext,&lt;br /&gt;  `stringdata` longtext,&lt;br /&gt;  `binarydata` longblob,&lt;br /&gt;  `lastUpdatedDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,&lt;br /&gt;  PRIMARY KEY (`userId`)&lt;br /&gt;) ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CREATE TABLE  `my_aspnet_roles` (&lt;br /&gt;  `id` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;  `applicationId` int(11) NOT NULL,&lt;br /&gt;  `name` varchar(255) NOT NULL,&lt;br /&gt;  PRIMARY KEY (`id`)&lt;br /&gt;) ROW_FORMAT=DYNAMIC;&lt;br /&gt;&lt;br /&gt;CREATE TABLE  `my_aspnet_schemaversion` (&lt;br /&gt;  `version` int(11) DEFAULT NULL&lt;br /&gt;) ;&lt;br /&gt;&lt;br /&gt;CREATE TABLE  `my_aspnet_users` (&lt;br /&gt;  `id` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;  `applicationId` int(11) NOT NULL,&lt;br /&gt;  `name` varchar(256) NOT NULL,&lt;br /&gt;  `isAnonymous` tinyint(1) NOT NULL DEFAULT '1',&lt;br /&gt;  `lastActivityDate` datetime DEFAULT NULL,&lt;br /&gt;  PRIMARY KEY (`id`)&lt;br /&gt;) ;&lt;br /&gt;&lt;br /&gt;CREATE TABLE  `my_aspnet_usersinroles` (&lt;br /&gt;  `userId` int(11) NOT NULL DEFAULT '0',&lt;br /&gt;  `roleId` int(11) NOT NULL DEFAULT '0',&lt;br /&gt;  PRIMARY KEY (`userId`,`roleId`)&lt;br /&gt;)  ROW_FORMAT=DYNAMIC;&lt;br /&gt;&lt;br /&gt;INSERT my_aspnet_SchemaVersion (version) VALUES (4);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Finally, you can use the ASP.NET Configuration website to configure users. To get only the providers working, it took a whole blog post. The .NET connector for MySQL is still a little bit rough on the edges, but after figuring the above things out, it will work!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-332551072030770715?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/332551072030770715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=332551072030770715' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/332551072030770715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/332551072030770715'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2009/07/using-mysql-providers-with-aspnet.html' title='Using MySQL Providers with ASP.NET'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-2059546570652734683</id><published>2009-07-10T17:03:00.004+02:00</published><updated>2009-07-10T17:33:09.753+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>Combining XML documents into one big one with XInclude</title><content type='html'>I needed to figure out how to include transparently some xml documents into another xml last week. We store our site navigation in one XML, but due to a decentralized management of this file, I need to cut this navigation into different file parts.&lt;br /&gt;&lt;br /&gt;For this, the &lt;a href="http://www.w3.org/TR/xinclude/"&gt;W3C XInlude standard&lt;/a&gt; was developed. Unfortunately, there is still no support for this in the .NET Framework. The solution is the use the &lt;a href="http://www.codeplex.com/MVPXML"&gt;Mvp.Xml library&lt;/a&gt; from codeplex, which includes XInclude support. A strong point of XInclude is the fallback possibilities of this standard, so when the included file isn't present, the output is predictable.&lt;br /&gt;&lt;br /&gt;With XInclude, a XML fragment can be included from the original document:&lt;br /&gt;&lt;code class="xml"&gt;&lt;br /&gt;&amp;lt;topic name="External Topic" path="/external-topic" id="18442"&amp;gt;&lt;br /&gt;  &amp;lt;xi:include href="../../external-topic/navigation.xml"&lt;br /&gt;      xmlns:xi="http://www.w3.org/2003/XInclude"  &lt;br /&gt;      xpointer="xpointer(/navigation/*)"&amp;gt;&lt;br /&gt;    &amp;lt;xi:fallback&amp;gt;&lt;br /&gt;      &amp;lt;subject name="Fallback Subject" pad="/external-topic/FB" &lt;br /&gt;        id="19672" /&amp;gt;&lt;br /&gt;    &amp;lt;/xi:fallback&amp;gt;&lt;br /&gt;  &amp;lt;/xi:include&amp;gt;&lt;br /&gt;&amp;lt;/topic&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Where the included XML fragment will be:&lt;br /&gt;&lt;code class="xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;navigation name="External Topic" path="/external-topic" &lt;br /&gt;      id="18442" xmlns:xi="http://www.w3.org/2001/XInclude"&amp;gt;&lt;br /&gt;  &amp;lt;subject name="Poll" path="/external-topic/poll" id="19670" /&amp;gt;&lt;br /&gt;  &amp;lt;subject name="Text" path="/external-topic/text" id="19671" /&amp;gt;&lt;br /&gt;  &amp;lt;subject name="Links" path="/external-topic/links id="19672" /&amp;gt;&lt;br /&gt;&amp;lt;/navigation&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;While XInclude describes the format of the XML document, we still need a XInclude aware XmlReader. There is one within the Mvp.Xml package. The old XML reading code:&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;    mXmlDoc = new XmlDocument();&lt;br /&gt;    mXmlDoc.Load(mXmlFile.FullName);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;should be changed to:&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;    mXmlDoc = new XmlDocument();&lt;br /&gt;    using (XmlReader reader = new XmlIncludingReader(mXmlFile.FullName))&lt;br /&gt;    {&lt;br /&gt;        mXmlDoc.Load(reader);&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;The resulting mXmlDoc document representations are equal in both situations. Only the XInclude result includes extra xml:base attributes.&lt;br /&gt;&lt;br /&gt;The resulting XML is:&lt;br /&gt;&lt;code class="xml"&gt;&lt;br /&gt;&amp;lt;code style="xml"&amp;gt;&lt;br /&gt;&amp;lt;topic name="External Topic" path="/external-topic" id="18442"&amp;gt;&lt;br /&gt;  &amp;lt;subject name="Poll" path="/external-topic/poll" id="19670" xml:base="../../external-topic/navigation.xml" /&amp;gt;&lt;br /&gt;  &amp;lt;subject name="Text" path="/external-topic/text" id="19671" xml:base="../../external-topic/navigation.xml" /&amp;gt;&lt;br /&gt;  &amp;lt;subject name="Links" path="/external-topic/links id="19672" xml:base="../../external-topic/navigation.xml" /&amp;gt;&lt;br /&gt;&amp;lt;/topic&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;These xml:base attributes can be used to add extra CacheDependencies for the storage of the resulting XML document to the application cache, so the cache will be invalidated as one of the included XML documents change. &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-2059546570652734683?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/2059546570652734683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=2059546570652734683' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/2059546570652734683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/2059546570652734683'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2009/07/combining-xml-documents-into-one-big.html' title='Combining XML documents into one big one with XInclude'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-7754203093690511998</id><published>2009-05-04T14:19:00.003+02:00</published><updated>2009-05-04T14:23:24.813+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='CruiseControl.NET'/><title type='text'>Cleanup artifacts in CC.Net with artifactcleanup</title><content type='html'>I got an email from the system admin that the CC.Net buildserver used a lot of diskspace. It turned out that I got 1000 buildlogs for one project on the server...&lt;br /&gt;&lt;br /&gt;The solution was to configure a artifactcleanup in the cc.config. See the &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Artifact+Cleanup+Publisher"&gt;CC.Net documentation&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-7754203093690511998?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/7754203093690511998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=7754203093690511998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/7754203093690511998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/7754203093690511998'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2009/05/cleanup-artifacts-in-ccnet-with.html' title='Cleanup artifacts in CC.Net with artifactcleanup'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-4040210941828173284</id><published>2009-05-02T21:00:00.006+02:00</published><updated>2009-05-04T10:20:44.257+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tridion'/><category scheme='http://www.blogger.com/atom/ns#' term='Reflection'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Code generation for a COM wrapper assembly</title><content type='html'>For my last post, I needed some quick and dirty code generator. Basically, I've a COM Iterop assembly full with interfaces I need to wrap with a specified template.&lt;br /&gt;&lt;br /&gt;The following code works, but still needed some handwork (like hand coding the ref parameters). Use it on your own risk ;)&lt;br /&gt;&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Reflection;&lt;br /&gt;using System.IO;&lt;br /&gt;&lt;br /&gt;namespace CodeGeneration&lt;br /&gt;{&lt;br /&gt;    class Program&lt;br /&gt;    {&lt;br /&gt;        static Dictionary&amp;lt;string, string&amp;gt; keywordType;&lt;br /&gt; &lt;br /&gt;        static void Main(string[] args)&lt;br /&gt;        {&lt;br /&gt;            FillKeywordType();&lt;br /&gt;&lt;br /&gt;            Assembly interop = Assembly.Load(@"Tridion.ContentManager.Interop.cm_tom");&lt;br /&gt;            foreach (Type t in interop.GetTypes())&lt;br /&gt;            {&lt;br /&gt;                //Console.WriteLine(t.Name);&lt;br /&gt;                if (t.Name.StartsWith("_"))&lt;br /&gt;                {&lt;br /&gt;                    WriteOut(t, t.Name.Replace("_",string.Empty));&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            Console.ReadLine();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static void FillKeywordType()&lt;br /&gt;        {&lt;br /&gt;         &lt;br /&gt;            keywordType = new Dictionary&amp;lt;string, string&amp;gt;();&lt;br /&gt;            keywordType.Add("System.String", "string");&lt;br /&gt;            keywordType.Add("System.Void", "void");&lt;br /&gt;            keywordType.Add("System.Int32", "int");&lt;br /&gt;            keywordType.Add("System.DateTime", "DateTime");&lt;br /&gt;            keywordType.Add("System.Boolean", "bool");&lt;br /&gt;            keywordType.Add("System.Object", "object");&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static void WriteOut(Type t, string className)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine("Info of {0}", t.Name);&lt;br /&gt;&lt;br /&gt;            using (StreamWriter writer = new StreamWriter(string.Format("D:\\Work\\DisposableOut\\{0}.cs", className) ))&lt;br /&gt;            {&lt;br /&gt;&lt;br /&gt;                WriteHeader(writer, className);&lt;br /&gt;&lt;br /&gt;                &lt;br /&gt;                foreach (MethodInfo mi in t.GetMethods())&lt;br /&gt;                {&lt;br /&gt;                    if (!(mi.Name.StartsWith("get_") || mi.Name.StartsWith("set_") || mi.Name.StartsWith("let_")))&lt;br /&gt;                    {&lt;br /&gt;                        string methodSig = string.Format("{1} {0}", mi.Name, GetTypeName(mi.ReturnType.Name, mi.ReturnType.Namespace));&lt;br /&gt;                        bool isVoid = (GetTypeName(mi.ReturnType.Name, mi.ReturnType.Namespace)=="void");&lt;br /&gt;                        List&amp;lt;string&amp;gt; parameters = new List&amp;lt;string&amp;gt;();&lt;br /&gt;                        List&amp;lt;string&amp;gt; parameterNames = new List&amp;lt;string&amp;gt;();&lt;br /&gt;                        foreach (ParameterInfo pi in mi.GetParameters())&lt;br /&gt;                        {&lt;br /&gt;                            parameters.Add(string.Format("{1} {0}", pi.Name, GetTypeName(pi.ParameterType.Name, pi.ParameterType.Namespace)));&lt;br /&gt;                            parameterNames.Add(pi.Name);&lt;br /&gt;                        }&lt;br /&gt;                        string parameter = string.Join(", ", parameters.ToArray());&lt;br /&gt;&lt;br /&gt;                        writer.Write(@"public {0} ({2})" + Environment.NewLine +&lt;br /&gt;                            @"        {{" + Environment.NewLine +&lt;br /&gt;                            @"            checkNotDisposed();" + Environment.NewLine +&lt;br /&gt;                            @"            {5}com{1}.{3}({4});" + Environment.NewLine +&lt;br /&gt;                            @"        }}" + Environment.NewLine + Environment.NewLine,&lt;br /&gt;                            methodSig, className, string.Join(", ", parameters.ToArray()), mi.Name, string.Join(", ", parameterNames.ToArray()),&lt;br /&gt;                            isVoid?string.Empty:"return ");&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                foreach (PropertyInfo pi in t.GetProperties())&lt;br /&gt;                {&lt;br /&gt;                    writer.Write(@"public {0} {1} {{" + Environment.NewLine, GetTypeName(pi.PropertyType.Name, pi.PropertyType.Namespace), pi.Name);&lt;br /&gt;                    if (pi.CanRead)&lt;br /&gt;                    {&lt;br /&gt;                        //get&lt;br /&gt;                        writer.Write(@"        get {{" + Environment.NewLine +&lt;br /&gt;                            @"            checkNotDisposed();" + Environment.NewLine +&lt;br /&gt;                            @"            return com{1}.{0};" + Environment.NewLine +&lt;br /&gt;                            @"        }}" + Environment.NewLine ,&lt;br /&gt;                            pi.Name, className);&lt;br /&gt;                    }&lt;br /&gt;                    if (pi.CanWrite)&lt;br /&gt;                    {&lt;br /&gt;                        //set&lt;br /&gt;                        writer.Write(@"        set {{" + Environment.NewLine +&lt;br /&gt;                            @"            checkNotDisposed();" + Environment.NewLine +&lt;br /&gt;                            @"            com{1}.{0} = value;" + Environment.NewLine +&lt;br /&gt;                            @"        }}" + Environment.NewLine,&lt;br /&gt;                            pi.Name, className);&lt;br /&gt;                    }&lt;br /&gt;                    writer.Write("}" + Environment.NewLine + Environment.NewLine);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                WriteFooter(writer);&lt;br /&gt;                writer.Flush();&lt;br /&gt;                writer.Close();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static string GetTypeName(string name, string nameSpace)&lt;br /&gt;        {&lt;br /&gt;            string typeName = string.Format("{0}.{1}", nameSpace, name);&lt;br /&gt;            if (keywordType.ContainsKey(typeName))&lt;br /&gt;            {&lt;br /&gt;                return keywordType[typeName];&lt;br /&gt;            }&lt;br /&gt;            return typeName;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static void WriteFooter(StreamWriter writer)&lt;br /&gt;        {&lt;br /&gt;            writer.Write(@" #endregion" + Environment.NewLine +&lt;br /&gt;                @"    }" + Environment.NewLine +&lt;br /&gt;                @"}" + Environment.NewLine);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static void WriteHeader(StreamWriter writer, string className)&lt;br /&gt;        {&lt;br /&gt;            StringBuilder fileHeader = new StringBuilder();&lt;br /&gt;            fileHeader.AppendFormat(@"using System;{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"using System.Collections.Generic;{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"using System.Text;{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"using System.Runtime.InteropServices;{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"using Tridion.ContentManager.Interop.TDS;{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"namespace DisposableTridion{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"{{{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"    public class {1} : DisposableBase {0}", Environment.NewLine, className);&lt;br /&gt;            fileHeader.AppendFormat(@"    {{{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"        private Tridion.ContentManager.Interop.TDS.{1} com{1};{0}", Environment.NewLine, className);&lt;br /&gt;            fileHeader.AppendFormat(@"{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"        public {1}(Tridion.ContentManager.Interop.TDS.{1} {2}){0}", Environment.NewLine, className, className.ToLower());&lt;br /&gt;            fileHeader.AppendFormat(@"        {{{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"            com{1} = {2};{0}", Environment.NewLine, className, className.ToLower());&lt;br /&gt;            fileHeader.AppendFormat(@"        }}{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"        ~{1}(){0}", Environment.NewLine, className);&lt;br /&gt;            fileHeader.AppendFormat(@"        {{{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"            Dispose(false);{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"        }}{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"        protected override void DisposeMembers(){0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"        {{{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"            DisposableBase.ReleaseComObject(com{1});{0}", Environment.NewLine, className);&lt;br /&gt;            fileHeader.AppendFormat(@"        }}{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"{0}", Environment.NewLine);&lt;br /&gt;            fileHeader.AppendFormat(@"        #region _{1} Members{0}", Environment.NewLine, className);&lt;br /&gt;&lt;br /&gt;            writer.Write(fileHeader.ToString());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-4040210941828173284?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/4040210941828173284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=4040210941828173284' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/4040210941828173284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/4040210941828173284'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2009/05/code-generation-for-com-wrapper.html' title='Code generation for a COM wrapper assembly'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-4988400325334662646</id><published>2009-05-01T16:23:00.004+02:00</published><updated>2009-05-01T16:41:28.219+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Interop'/><category scheme='http://www.blogger.com/atom/ns#' term='Tridion'/><category scheme='http://www.blogger.com/atom/ns#' term='PnP'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Disposing COM objects</title><content type='html'>The Tridion solutions at my current assignment are working great, but now and then the CM website freezes. After investigating the issue with Tridion customer support, there is a suspicion the Tridion COM objects freeze under memory load.&lt;br /&gt;This load is generated because our custom solutions do not release the COM objects they use. So now the codebase should be recoded with this cleanup operation.&lt;br /&gt;&lt;br /&gt;When you don't cleanup this code, the cleanup will be initiated by the .NET Garbage Collector (GC). But the GC isn't working continually, but will only be called under memory pressure.&lt;br /&gt;Because COM objects aren't run under as managed code, the GC doesn't know how much memory is used by them. Therefore, waiting until the GC will cleanup your code can take a long time, especially because COM objects are small objects on the managed memory.&lt;br /&gt;&lt;br /&gt;The pattern to use for cleaning up unmanaged resources is the &lt;a href="http://msdn.microsoft.com/en-us/library/system.idisposable.aspx"&gt;IDisposable interface&lt;/a&gt;. So with this pattern, we can release a COM object after you're done with it by calling the &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject.aspx"&gt;Marshal.ReleaseComObject&lt;/a&gt; method.&lt;br /&gt;&lt;br /&gt;Because the Tridion Object Model (TOM) has a lot of objects, I'm creating a managed wrapper assembly, where on each object I can implement the IDisposable interface. Besides the interface, I need some more plumbing, so the first class to create is an abstract DisposableBase class:&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;public abstract class DisposableBase : IDisposable&lt;br /&gt;{&lt;br /&gt;    private bool disposed = false;&lt;br /&gt;    &lt;br /&gt;    protected void checkNotDisposed()&lt;br /&gt;    {&lt;br /&gt;        if (this.disposed)&lt;br /&gt;        {&lt;br /&gt;            string message = "Object of type " + base.GetType().Name + " cannot be accessed because it was disposed.";&lt;br /&gt;            throw new ObjectDisposedException(base.GetType().Name, message);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void Dispose()&lt;br /&gt;    {&lt;br /&gt;        if (!this.disposed)&lt;br /&gt;        {&lt;br /&gt;            this.Dispose(true);&lt;br /&gt;        }&lt;br /&gt;        GC.SuppressFinalize(this);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected virtual void Dispose(bool disposing)&lt;br /&gt;    {&lt;br /&gt;        if (!this.disposed)&lt;br /&gt;        {&lt;br /&gt;            this.DisposeMembers();&lt;br /&gt;        }&lt;br /&gt;        this.disposed = true;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected abstract void DisposeMembers();&lt;br /&gt;&lt;br /&gt;    public static void ReleaseComObject(object interopObject)&lt;br /&gt;    {&lt;br /&gt;        if (interopObject != null)&lt;br /&gt;        {&lt;br /&gt;            Marshal.ReleaseComObject(interopObject);&lt;br /&gt;        }&lt;br /&gt;        interopObject = null;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;So I can use this base class in each wrapper class for TOM classes, like the Component class:&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;public class Component : DisposableBase &lt;br /&gt;{&lt;br /&gt;    private Tridion.ContentManager.Interop.TDS.Component comComponent;&lt;br /&gt;&lt;br /&gt;    public Component(Tridion.ContentManager.Interop.TDS.Component component)&lt;br /&gt;    {&lt;br /&gt;        comComponent = component;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    ~Component()&lt;br /&gt;    {&lt;br /&gt;        Dispose(false);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    protected override void DisposeMembers()&lt;br /&gt;    {&lt;br /&gt;        DisposableBase.ReleaseComObject(comComponent);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void CheckIn(bool permanentLock)&lt;br /&gt;    {&lt;br /&gt;        checkNotDisposed();&lt;br /&gt;        comComponent.CheckIn(permanentLock);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    _Component Members&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;So now it's perfectly safe to use the TOM to check in a component with the following code:&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;using (Component component = tdse.GetObject("tcm:8-123", EnumOpenMode.OpenModeView))&lt;br /&gt;{&lt;br /&gt;    component.CheckIn(true);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-4988400325334662646?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/4988400325334662646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=4988400325334662646' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/4988400325334662646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/4988400325334662646'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2009/05/disposing-com-objects.html' title='Disposing COM objects'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-398475564745481552</id><published>2009-01-31T18:41:00.003+01:00</published><updated>2009-01-31T18:46:13.689+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VPC'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 2008'/><title type='text'>RTFM!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tbn3.google.com/images?q=tbn:JXEf61ODVsI-2M:http://www.thinkgeek.com/images/products/front/lg-rtfm-mug.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 107px; height: 92px;" src="http://tbn3.google.com/images?q=tbn:JXEf61ODVsI-2M:http://www.thinkgeek.com/images/products/front/lg-rtfm-mug.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm going to be short on this. Microsoft 2008 Server R2 is 64-bit only. So there is no chance installing the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=85CFE4C9-34DE-477C-B5CA-75EDAE3D57C5&amp;displaylang=en"&gt;beta&lt;/a&gt; will work on your 32-bit-guest-pc-only VPC. A pity for the wasted bandwidth...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-398475564745481552?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/398475564745481552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=398475564745481552' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/398475564745481552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/398475564745481552'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2009/01/rtfm.html' title='RTFM!'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-7222352927233416999</id><published>2009-01-30T08:52:00.000+01:00</published><updated>2009-01-30T08:53:51.153+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Certification'/><title type='text'>MCTS WinForms 3.5</title><content type='html'>Just got the email:&lt;br /&gt;&lt;blockquote&gt;Congratulations on earning your Microsoft Certified Technology Specialist: .NET Framework 3.5, Windows Forms Applications certification! We hope you enjoy the benefits of your certification and of membership in the Microsoft Certified Professional community.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-7222352927233416999?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/7222352927233416999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=7222352927233416999' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/7222352927233416999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/7222352927233416999'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2009/01/mcts-winforms-35.html' title='MCTS WinForms 3.5'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-9150533894269497570</id><published>2009-01-24T18:39:00.001+01:00</published><updated>2009-01-26T11:08:27.523+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Certification'/><title type='text'>MCPD ASP.NET 3.5</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZWHxGFTVlMU/SX2LlJmK5cI/AAAAAAAACto/Owrsz3ouX4c/s1600-h/MCPD(rgb)_1259.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 267px; height: 80px;" src="http://2.bp.blogspot.com/_ZWHxGFTVlMU/SX2LlJmK5cI/AAAAAAAACto/Owrsz3ouX4c/s320/MCPD(rgb)_1259.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5295542207205008834" /&gt;&lt;/a&gt;&lt;br /&gt;After two months, I finally got the result of the beta exam for my MCPD ASP.NET 3.5 certification. I passed!&lt;br /&gt;I am still waiting for two more exams from the beginning of December, but hopefully they will follow shortly!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-9150533894269497570?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/9150533894269497570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=9150533894269497570' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/9150533894269497570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/9150533894269497570'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2009/01/mcpd-aspnet-35.html' title='MCPD ASP.NET 3.5'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZWHxGFTVlMU/SX2LlJmK5cI/AAAAAAAACto/Owrsz3ouX4c/s72-c/MCPD(rgb)_1259.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-935586358590946394</id><published>2009-01-16T23:28:00.001+01:00</published><updated>2009-01-16T23:28:33.172+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VPC'/><category scheme='http://www.blogger.com/atom/ns#' term='Tridion'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows7'/><title type='text'>Installing Windows 7</title><content type='html'>&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_ZWHxGFTVlMU/SXEKCOmQ5II/AAAAAAAACtY/aE4YWwRcIs8/s1600-h/StartingW7%5B4%5D.png"&gt;&lt;img title="StartingW7" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 5px 5px 0px; border-right-width: 0px" height="272" alt="StartingW7" src="http://lh5.ggpht.com/_ZWHxGFTVlMU/SXEKC3jo8pI/AAAAAAAACtc/wyP5SkKsZsE/StartingW7_thumb%5B2%5D.png?imgmax=800" width="240" align="left" border="0" /&gt;&lt;/a&gt;I’ve installed Windows 7 last week. Unfortunately I hadn’t much time to play with it because we had a serious escalation on my work. The intranet server was performing badly, so I did a crash course performance counters for ASP.NET and now know that the caching service is an essential component for the Tridion Content Management system. &lt;/p&gt;  &lt;p&gt;For improving ASP.NET Performance, the following articles helped:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms998549.aspx"&gt;Improving ASP.NET Performance (for .NET 1.1, but concepts are version independant)&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/fxk122b4.aspx"&gt;Performance Counters for ASP.NET&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt; &lt;a href="http://lh5.ggpht.com/_ZWHxGFTVlMU/SXEKDkOdxCI/AAAAAAAACtg/Z-H4Wfb5udo/s1600-h/InstallingW7%5B6%5D.png"&gt;&lt;img title="InstallingW7" style="display: inline; margin: 0px 0px 5px 5px" height="335" alt="InstallingW7" src="http://lh5.ggpht.com/_ZWHxGFTVlMU/SXEKEDcHCsI/AAAAAAAACtk/TP9DND2zkI4/InstallingW7_thumb%5B4%5D.png?imgmax=800" width="400" align="right" /&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-935586358590946394?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/935586358590946394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=935586358590946394' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/935586358590946394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/935586358590946394'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2009/01/installing-windows-7.html' title='Installing Windows 7'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_ZWHxGFTVlMU/SXEKC3jo8pI/AAAAAAAACtc/wyP5SkKsZsE/s72-c/StartingW7_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-1683769697312589740</id><published>2008-12-22T09:03:00.002+01:00</published><updated>2008-12-22T09:42:17.083+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><title type='text'>Analyzing Risk</title><content type='html'>Just read &lt;a href="http://msdn.microsoft.com/magazine/2009.01.testrun(en-us).aspx"&gt;a great article about risk&lt;/a&gt; on MSDN. While evaluating risks in my daily job, it puts some things in context (like the top 10 project risks) .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-1683769697312589740?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/1683769697312589740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=1683769697312589740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/1683769697312589740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/1683769697312589740'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/12/analyzing-risk.html' title='Analyzing Risk'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-6674239581193189225</id><published>2008-12-16T08:26:00.002+01:00</published><updated>2008-12-16T08:53:34.251+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Creating a configuration section</title><content type='html'>In general, a lot of application are using the appSettings section of a config file for storing application parameters. A major drawback of this practice, is the lack of prior knowledge about the format and default value of these parameters, so you need to program all this functionality yourself.&lt;br /&gt;A better way to provide your application with configuration values, is the use of a configuration section. Instead of using the appSettings node, you can specify your own.&lt;br /&gt;The key to your own configuration section is the &lt;a href="http://msdn.microsoft.com/en-us/library/system.configuration.aspx"&gt;System.Configuration&lt;/a&gt; namespace.&lt;br /&gt;You write your own class, but should inherit &lt;a href="http://msdn.microsoft.com/en-us/library/system.configuration.configurationsection.aspx"&gt;ConfigurationSection&lt;/a&gt;.&lt;br /&gt;Now you can spice up your properties in this class with the &lt;a href="http://msdn.microsoft.com/en-us/library/system.configuration.configurationpropertyattribute.aspx"&gt;ConfigurationProperty attribute&lt;/a&gt;. Validation can be programmed with the attributes &lt;ul&gt;&lt;li&gt;IntegerValidatorAttribute&lt;/li&gt;&lt;li&gt;LongValidatorAttribute&lt;/li&gt;&lt;li&gt;RegexStringValidatorAttribute&lt;/li&gt;&lt;li&gt;StringValidatorAttribute&lt;/li&gt;&lt;li&gt;TimeSpanValidatorAttribute&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;public class TestConfigurationSection : ConfigurationSection&lt;br /&gt;{&lt;br /&gt;        // Empty Construct&lt;br /&gt;        public TestConfigurationSection() { }&lt;br /&gt;&lt;br /&gt;  // default string property&lt;br /&gt;        [ConfigurationProperty("deliveryStore", IsRequired = true)]&lt;br /&gt;        public string DeliveryStore&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                return (string)this["deliveryStore"];&lt;br /&gt;            }&lt;br /&gt;            set&lt;br /&gt;            {&lt;br /&gt;                this["deliveryStore"] = value;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;  //uri types will work too&lt;br /&gt;        [ConfigurationProperty("serviceUrl", DefaultValue = "http://192.168.1.10/MessageService", IsRequired = false)]&lt;br /&gt;        public Uri ServiceUrl&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                return (Uri)this["serviceUrl"];&lt;br /&gt;            }&lt;br /&gt;            set&lt;br /&gt;            {&lt;br /&gt;                this["serviceUrl"] = value;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [ConfigurationProperty("timeOut", DefaultValue = "0:00:20")]&lt;br /&gt;        [TimeSpanValidator(MinValueString = "0:00:05", MaxValueString = "0:05:00", ExcludeRange = false)]&lt;br /&gt;        public TimeSpan TimeOut&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                return (TimeSpan)this["timeOut"];&lt;br /&gt;            }&lt;br /&gt;            set&lt;br /&gt;            {&lt;br /&gt;                this["timeOut"] = value;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;To use this configuration section in your config, you need to add it to the configsections node, for instance:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;configSections&amp;gt;&lt;br /&gt; &amp;lt;section name="testConfig" type="NJV.Utils.TestConfigurationSection, NJV.Utils"/&amp;gt;&lt;br /&gt;&amp;lt;/configSections&amp;gt;&lt;br /&gt;&amp;lt;testConfig &lt;br /&gt;    deliveryStore="D:\Test" &lt;br /&gt;    serviceUrl="http://10.0.0.9/MessageService" &lt;br /&gt;    timeOut="0:00:20"&lt;br /&gt;  /&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now you've the settings defined and validation setup. To read these values, you can use the following code:&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;TestConfigSection config = (TestConfigSection)System.Configuration.ConfigurationManager.GetSection("testConfig");&lt;br /&gt;TimeSpan timeout = config.TimeOut;&lt;br /&gt;string deliveryLocation = config.DeliveryStore;&lt;br /&gt;Uri serviceLocation = config.ServiceUrl;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The only drawback here is, you should be sure to have a testConfig section defined in your config, and it should be of the correct type. So maybe there could be some type and null reference checking on line 1:&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;TestConfigSection config = System.Configuration.ConfigurationManager.GetSection("testConfig") as TestConfigSection;&lt;br /&gt;if (config==null)&lt;br /&gt;{&lt;br /&gt;    throw new ApplicationException("No configuration available");&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-6674239581193189225?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/6674239581193189225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=6674239581193189225' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/6674239581193189225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/6674239581193189225'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/12/creating-configuration-section.html' title='Creating a configuration section'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-8300931734896887008</id><published>2008-12-14T22:32:00.000+01:00</published><updated>2008-12-15T22:35:04.179+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Certification'/><title type='text'>Certified SQL Server Developer</title><content type='html'>With the wave of beta exams the last month, I've earned three new certifications:&lt;br /&gt;MCTS: SQL Server 2008, Database Development, MCTS: SQL Server 2008, Business Intelligence Development and Maintenance and MCITP: Database Developer 2008.&lt;br /&gt;&lt;br /&gt;Quite funny the SQL Developer is under the MCITP certification brand, instead of the MCPD.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-8300931734896887008?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/8300931734896887008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=8300931734896887008' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/8300931734896887008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/8300931734896887008'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/12/certified-sql-server-developer.html' title='Certified SQL Server Developer'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-3752061187275713557</id><published>2008-10-16T15:37:00.002+02:00</published><updated>2008-11-04T20:42:46.733+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>Presentation on .NET 3.5</title><content type='html'>I did a presentation on .NET 3.5 last evening for my company. The presentation with demo code is posted on my SkyDrive. The presentation went well... I was a little bit nervous, but it went away quickly after I'd started.&lt;br /&gt;&lt;br /&gt;I've made use of the demo pptPlex functionality from Office Labs. The version posted here, doesn't have these nice little extra's, but see the &lt;a href="http://www.officelabs.com/projects/pptPlex"&gt;pptPlex website&lt;/a&gt; for more info about this tool. I didn't used pptPlex during the presentation the whole time... during the presentation I noticed I was presenting the wrong sheets, with old content on it. I changed back to normal presentation mode. Afterwards, I found the 'clear cache' under 'Learn more' to tidy up the cache and got the latest version of the sheets (but such a strange place for such an option).&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Downloads&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://cid-3ac7786dfaaf4364.skydrive.live.com/self.aspx/Public/TechSessionDotNet35.ppsx"&gt;Presentation: What's useful in .NET 3.5?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://cid-3ac7786dfaaf4364.skydrive.live.com/self.aspx/Public/DemoVakgroep.zip"&gt;DemoCode for the presentation&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/19906305-3752061187275713557?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/3752061187275713557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=3752061187275713557' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/3752061187275713557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/3752061187275713557'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/10/presentation-on-net-35.html' title='Presentation on .NET 3.5'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-6928486206848883126</id><published>2008-10-09T08:47:00.004+02:00</published><updated>2008-10-09T09:14:42.828+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PnP'/><category scheme='http://www.blogger.com/atom/ns#' term='Architecture'/><title type='text'>PandP Cheat Sheet</title><content type='html'>A &lt;a href="http://www.codeplex.com/AppArch/Wiki/View.aspx?title=Cheat%20Sheet:%20patterns%20%26%20practices%20Catalog%20at%20a%20Glance&amp;referringTitle=Cheat%20Sheets"&gt;cheat sheet with all available patterns &amp; practices&lt;/a&gt; has just been made available on Codeplex. It gives a grouped overview of all available p&amp;p products.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-6928486206848883126?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/6928486206848883126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=6928486206848883126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/6928486206848883126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/6928486206848883126'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/10/pandp-cheat-sheet.html' title='PandP Cheat Sheet'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-5029572745409753008</id><published>2008-10-08T21:42:00.004+02:00</published><updated>2008-10-08T21:46:47.940+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VPC'/><title type='text'>Mount VHD in host OS</title><content type='html'>Just discovered... &lt;a href="http://blogs.msdn.com/virtual_pc_guy/archive/2006/09/01/734435.aspx"&gt;mounting a VHD is possible&lt;/a&gt;!&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Download the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=bc49c7c8-4840-4e67-8dc4-1e6e218acce4&amp;displaylang=en"&gt;Virtual Server 2005 R2 SP1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Install, uncheck all boxes except VHD Mount&lt;/li&gt;&lt;li&gt;Edit registry&lt;/li&gt;&lt;li&gt;Right click VHD&lt;/li&gt;&lt;li&gt;???&lt;/li&gt;&lt;li&gt;Profit ;)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The registry should be edited with:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Windows Registry Editor Version 5.00&lt;br /&gt;&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Virtual.Machine.HD]&lt;br /&gt;&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Virtual.Machine.HD\shell]&lt;br /&gt;@="Mount"&lt;br /&gt;&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Virtual.Machine.HD\shell\Dismount]&lt;br /&gt;&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Virtual.Machine.HD\shell\Dismount\command]&lt;br /&gt;@="\"C:\\Program Files\\Microsoft Virtual Server\\Vhdmount\\vhdmount.exe\" /u \"%1\""&lt;br /&gt;&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Virtual.Machine.HD\shell\Mount]&lt;br /&gt;&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Virtual.Machine.HD\shell\Mount\command]&lt;br /&gt;@="\"C:\\Program Files\\Microsoft Virtual Server\\Vhdmount\\vhdmount.exe\" /p \"%1\""&lt;br /&gt;&lt;br /&gt;[HKEY_CLASSES_ROOT\.vhd]&lt;br /&gt;@="Virtual.Machine.HD"&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-5029572745409753008?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/5029572745409753008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=5029572745409753008' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/5029572745409753008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/5029572745409753008'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/10/mount-vhd-in-host-os.html' title='Mount VHD in host OS'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-4481306808748087156</id><published>2008-10-06T07:10:00.000+02:00</published><updated>2008-10-06T07:07:11.507+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Code Review Checklist for ASP.NET</title><content type='html'>I'm supposed to do a code review for an externally developed ASP.NET application on my job this week. I'm posting here some guidance to perform this review.&lt;br /&gt;The goal of the review should be&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The code satisfies the requirements&lt;/li&gt;&lt;li&gt;The code is robust (ie stable and should be descriptive in case of error)&lt;/li&gt;&lt;li&gt;The code handles wrong inputs (SQL/XSS Injection!)&lt;/li&gt;&lt;li&gt;The code is scalable&lt;/li&gt;&lt;li&gt;The code is extensible and maintainable&lt;/li&gt;&lt;/ul&gt;(free to &lt;a href="http://weblogs.asp.net/zroiy/archive/2008/01/09/code-review-check-list.aspx"&gt;Zysman&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Microsoft has a couple of checklists about these topics (unfortunately for .NET 1.1). Useful are: &lt;a href="http://msdn.microsoft.com/en-us/library/aa302341.aspx"&gt;Securing ASP.NET&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/aa302339.aspx"&gt;Security Review for Managed Code&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/ms998574.aspx"&gt;Code Review for .NET Application Performance&lt;/a&gt;. And just found the guide for the .NET 2.0 version: &lt;a href="http://msdn.microsoft.com/en-us/library/ms998364.aspx"&gt;How To: Perform a Security Code Review&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-4481306808748087156?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/4481306808748087156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=4481306808748087156' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/4481306808748087156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/4481306808748087156'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/10/code-review-checklist-for-aspnet.html' title='Code Review Checklist for ASP.NET'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-3607533579256237497</id><published>2008-08-18T20:49:00.004+02:00</published><updated>2009-12-22T22:49:37.882+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Outlook'/><title type='text'>Filter tripple Gmail Starred items from Outlook 2007 To-Do List</title><content type='html'>I love Outlook 2007 and the integration of flagged mail, tasks and other items. I read my Gmail with the IMAP connector. One drawback is that Starred items will show up in your T-Do list as Flagged items. Well, I can live with that, but actually they show up three times. One time as a mail item in my Inbox, one time in the Starred folder, and one time in the All Mail folder.&lt;br /&gt;Hey, I know I've got a lot to do, but this view isn't workable.&lt;br /&gt;&lt;br /&gt;The solution is to right click the list, and choose 'Customize Current View...', there you can change the filter for the view, and in the Advanced tab you say, don't show items where the In Folder contains Starred or All Items.&lt;br /&gt;The stupidity of the standard filter is that the two statements two aren't combined with the OR specifier... hey, that's first grade logica. So switch to SQL tab, ignore the message about not being able to use the other three tabs anymore, and change the OR in an AND...&lt;br /&gt;&lt;br /&gt;Problem solved.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-3607533579256237497?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/3607533579256237497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=3607533579256237497' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/3607533579256237497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/3607533579256237497'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/08/filter-tripple-gmail-starred-items-from.html' title='Filter tripple Gmail Starred items from Outlook 2007 To-Do List'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-8630384940460522041</id><published>2008-07-19T11:23:00.005+02:00</published><updated>2008-08-04T23:06:17.123+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Certification'/><title type='text'>First 3.5 Certifications</title><content type='html'>&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_ZWHxGFTVlMU/SIG0g5w_LAI/AAAAAAAABrA/BNTWfRMO4sc/s320/MCTS(rgb)_1102.png" border="0" alt="MCTS: Framework 3.5, ASP.NET Development Logo " id="BLOGGER_PHOTO_ID_5224655520081587202" /&gt;&lt;br /&gt;Last week I had finaly the results of my beta &lt;a href="http://www.microsoft.com/learning/en/us/exams/70-562.mspx"&gt;exam 70-562&lt;/a&gt; for the MCTS ASP.NET 3.5 certificiation. Microsoft let me know that I have passed the exam! So it is my first &lt;a href="http://www.microsoft.com/learning/mcp/mcts/vstudio/2008/default.mspx"&gt;VS2008 certificate&lt;/a&gt;.&lt;br /&gt;&lt;strong&gt;Update:&lt;/strong&gt;I also had a mail two days later I succeeded in the beta &lt;a href="http://www.microsoft.com/learning/en/us/exams/70-561.msp"&gt;ADO.NET 3.5 exam&lt;/a&gt;. That's two down, still four to go ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-8630384940460522041?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/8630384940460522041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=8630384940460522041' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/8630384940460522041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/8630384940460522041'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/07/first-35-certification.html' title='First 3.5 Certifications'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_ZWHxGFTVlMU/SIG0g5w_LAI/AAAAAAAABrA/BNTWfRMO4sc/s72-c/MCTS(rgb)_1102.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-349642599094358688</id><published>2008-07-11T22:39:00.001+02:00</published><updated>2008-07-11T22:40:59.946+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Backup'/><title type='text'>Backup your files with WinRar</title><content type='html'>&lt;p&gt;A while ago (actualy, three and a half years), I've made a backupscript with &lt;a href="http://www.rarlabs.com"&gt;winrar&lt;/a&gt;.&amp;#160; With these four files and your windows task scheduler, you've a full featured backup system, producing rar-files per run. The incremental version makes use of the archive flag of the filesystem. The full backup justs proces all the files. Backuplist.txt contains a list of all the folders to include. Exludefile.txt contains all the folders inside the included folders to exclude.&lt;/p&gt;  &lt;h5&gt;Incremental.cmd&lt;/h5&gt;  &lt;p&gt;&lt;code&gt;&amp;quot;c:\program files\winrar\winrar.exe&amp;quot; a -ac -ao -ep2 -os -ow -IBCK -inul -r -agYY-MM-DD -x@B:\backup\excludefile.txt B:\backup\incremental- @B:\backup\backuplist.txt      &lt;br /&gt;&lt;/code&gt;&lt;code&gt;REM -ac clear archive flag on files      &lt;br /&gt;REM -ao for archive flag only files       &lt;br /&gt;REM -ag[format] to include date in filename       &lt;br /&gt;REM -ep2 Store full file paths       &lt;br /&gt;REM -OS - save NTFS streams       &lt;br /&gt;REM -OW - process file security information &lt;/code&gt;&lt;/p&gt;  &lt;h5&gt;Full.cmd&lt;/h5&gt;  &lt;p&gt;&lt;code&gt;&amp;quot;c:\program files\winrar\winrar.exe&amp;quot; a -ac -ep2 -os -ow -r -IBCK -inul -agYY-MM-DD -x@B:\backup\excludefile.txt B:\backup\full- @B:\backup\backuplist.txt      &lt;br /&gt;REM -ac clear archive flag on files       &lt;br /&gt;REM -ag[format] to include date in filename       &lt;br /&gt;REM -ep2 Store full file paths       &lt;br /&gt;REM -OS - save NTFS streams       &lt;br /&gt;REM -OW - process file security information &lt;/code&gt;&lt;/p&gt;  &lt;h5&gt;backuplist.txt&lt;/h5&gt;  &lt;p&gt;&lt;code&gt;D:\Data      &lt;br /&gt;D:\My Documents       &lt;br /&gt;C:\Documents and Settings\User\StartMenu       &lt;br /&gt;C:\Documents and Settings\User\Desktop       &lt;br /&gt;C:\Documents and Settings\User\Application Data\Mozilla &lt;/code&gt;&lt;/p&gt;  &lt;h5&gt;excludefile.txt&lt;/h5&gt;  &lt;p&gt;&lt;code&gt;C:\Documents and Settings\User\Application Data\Mozilla\Firefox\Profiles\default.xyz\Cache &lt;/code&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-349642599094358688?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/349642599094358688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=349642599094358688' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/349642599094358688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/349642599094358688'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/07/backup-scripts-met-winrar.html' title='Backup your files with WinRar'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-7989430024173013828</id><published>2008-07-02T20:15:00.006+02:00</published><updated>2008-07-03T12:25:29.350+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenXML'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Compiling documents the OpenXML way</title><content type='html'>Today, I've got a RFC about the automatically generation of a document. De document should be a write-out of a thesaurus, which is contained in a SQL database. It should run server-sided, and should produce the document with the ease of a push of the button.&lt;br /&gt;Besides the standard list of words, the document should contain page-numbers. In the past, this was done by writing out html, saving the document with the .doc extension and pushing the file with the right MIME headers. But with this approach, insertion of page numbers on each page is quite a burden (if possible at all)... so enter OpenXML.&lt;br /&gt;&lt;br /&gt;The other scenario, using mail-merge functionality, isn't used. I want the merge takes place on the server, not on the client.&lt;br /&gt;&lt;br /&gt;The code here is just programming with XML and the System.IO.Packaging namespace, introduced in .NET 3.0. I still haven't tried the OpenXML SDK, so you should know what you're doing with adding XML fragments and their relations into the package.&lt;br /&gt;The solution is quite straightforward, and it won't be difficult to expand this to your own needs.&lt;br /&gt;&lt;br /&gt;We start by referencing the System.IO.Packaging namespace. It is delivered in the WindowsBase GAC dll. Add a reference to the WindowsBase and you can build your own Package from scratch:&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;private void Load(string documentPath)&lt;br /&gt;{&lt;br /&gt;    Package pkgOutputDoc = null;&lt;br /&gt;    pkgOutputDoc = Package.Open(@"c:\work\test.docx", FileMode.Create, FileAccess.ReadWrite);&lt;br /&gt;    Uri uri = new Uri("/word/document.xml", UriKind.Relative);&lt;br /&gt;    PackagePart partDocumentXML = pkgOutputDoc.CreatePart(uri,&lt;br /&gt;      "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml");&lt;br /&gt;&lt;br /&gt;    StreamWriter streamStartPart = new StreamWriter(partDocumentXML.GetStream(FileMode.Create, FileAccess.Write));&lt;br /&gt;    XmlDocument xdoc = new XmlDocument();&lt;br /&gt;    xdoc.Load(@"C:\work\document.xml");&lt;br /&gt;    FillDocument(xdoc);&lt;br /&gt;    xdoc.Save(streamStartPart);&lt;br /&gt;    streamStartPart.Close();&lt;br /&gt;    pkgOutputDoc.Flush();&lt;br /&gt;&lt;br /&gt;    pkgOutputDoc.CreateRelationship(uri, TargetMode.Internal, &lt;br /&gt;      "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",&lt;br /&gt;      "rId1");&lt;br /&gt;    pkgOutputDoc.Flush();&lt;br /&gt;    pkgOutputDoc.Close();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I've added all the xml fragments I've used as embedded resources to my dll, so it is quite easy for me to version and deploy this solution. The added document.xml, the main content of my docx file, is expanded by generating custom xml, based on the database content.&lt;br /&gt;I've read my database content into a dictionary, and I'm generating the xml based on each keyword in my database. &lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;&amp;lt;w:p&gt;&lt;br /&gt;  &amp;lt;w:r&gt;&lt;br /&gt;    &amp;lt;w:t&gt;Term&amp;lt;/w:t&gt; &lt;br /&gt;  &amp;lt;/w:r&gt;&lt;br /&gt;  &amp;lt;w:r&gt;&lt;br /&gt;    &amp;lt;w:br /&gt; &lt;br /&gt;  &amp;lt;/w:r&gt;&lt;br /&gt;  &amp;lt;w:r&gt;&lt;br /&gt;    &amp;lt;w:tab /&gt; &lt;br /&gt;    &amp;lt;w:t&gt;SN&amp;lt;/w:t&gt; &lt;br /&gt;  &amp;lt;/w:r&gt;&lt;br /&gt;  &amp;lt;w:r&gt;&lt;br /&gt;    &amp;lt;w:tab /&gt; &lt;br /&gt;    &amp;lt;w:t&gt;scope note for Term&amp;lt;/w:t&gt; &lt;br /&gt;  &amp;lt;/w:r&gt;&lt;br /&gt;  &amp;lt;w:r&gt;&lt;br /&gt;    &amp;lt;w:br /&gt; &lt;br /&gt;  &amp;lt;/w:r&gt;&lt;br /&gt;  &amp;lt;w:r&gt;&lt;br /&gt;    &amp;lt;w:tab /&gt; &lt;br /&gt;    &amp;lt;w:t&gt;UF&amp;lt;/w:t&gt; &lt;br /&gt;  &amp;lt;/w:r&gt;&lt;br /&gt;  &amp;lt;w:r&gt;&lt;br /&gt;    &amp;lt;w:tab /&gt; &lt;br /&gt;    &amp;lt;w:t&gt;Term B&amp;lt;/w:t&gt; &lt;br /&gt;  &amp;lt;/w:r&gt;&lt;br /&gt;  &amp;lt;w:r&gt;&lt;br /&gt;    &amp;lt;w:br /&gt; &lt;br /&gt;  &amp;lt;/w:r&gt;&lt;br /&gt;  &amp;lt;w:r&gt;&lt;br /&gt;    &amp;lt;w:tab /&gt; &lt;br /&gt;    &amp;lt;w:t&gt;RT&amp;lt;/w:t&gt; &lt;br /&gt;  &amp;lt;/w:r&gt;&lt;br /&gt;  &amp;lt;w:r&gt;&lt;br /&gt;    &amp;lt;w:tab /&gt; &lt;br /&gt;    &amp;lt;w:t&gt;Term C&amp;lt;/w:t&gt; &lt;br /&gt;  &amp;lt;/w:r&gt;&lt;br /&gt;  &amp;lt;w:r&gt;&lt;br /&gt;    &amp;lt;w:br /&gt; &lt;br /&gt;  &amp;lt;/w:r&gt;&lt;br /&gt;&amp;lt;/w:p&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;This xml fragment is built by the following code&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;private void FillDocument(XmlDocument xdoc)&lt;br /&gt;{&lt;br /&gt;            XmlNamespaceManager nsMgr = new XmlNamespaceManager(new NameTable());&lt;br /&gt;&lt;br /&gt;            string wNamespace = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";&lt;br /&gt;            nsMgr.AddNamespace("w", wNamespace);&lt;br /&gt;&lt;br /&gt;            XmlNode wBody = xdoc.SelectSingleNode("/w:document/w:body", nsMgr);&lt;br /&gt;            //begin inserting at the last defined paragraph            &lt;br /&gt;            XmlNode lastParagraph = xdoc.SelectSingleNode("/w:document/w:body/w:p[last()]", nsMgr);&lt;br /&gt;&lt;br /&gt;            Dictionary&amp;lt;string, List&amp;lt;RelatedKeyword&gt;&gt; thesaurus = ThesaurusList.GetThesaurus();&lt;br /&gt;            &lt;br /&gt;            foreach (string keyword in thesaurus.Keys)&lt;br /&gt;            {&lt;br /&gt;                XmlElement thesaurusTerm = xdoc.CreateElement("w", "p", wNamespace);&lt;br /&gt;                wBody.InsertAfter(thesaurusTerm, lastParagraph);&lt;br /&gt;                lastParagraph = thesaurusTerm;&lt;br /&gt;&lt;br /&gt;                XmlElement thesaurusRterm = xdoc.CreateElement("w", "r", wNamespace);&lt;br /&gt;                XmlElement thesaurusText = xdoc.CreateElement("w", "t", wNamespace);&lt;br /&gt;                XmlElement thesaurusRbreak = xdoc.CreateElement("w", "r", wNamespace);&lt;br /&gt;                XmlElement thesaurusBreak = xdoc.CreateElement("w", "br", wNamespace);&lt;br /&gt;                &lt;br /&gt;                thesaurusText.InnerText = keyword;&lt;br /&gt;&lt;br /&gt;                thesaurusTerm.AppendChild(thesaurusRterm);&lt;br /&gt;                thesaurusRterm.AppendChild(thesaurusText);&lt;br /&gt;                &lt;br /&gt;                thesaurusTerm.AppendChild(thesaurusRbreak);&lt;br /&gt;                thesaurusRbreak.AppendChild(thesaurusBreak);&lt;br /&gt;&lt;br /&gt;                foreach (RelatedKeyword relatedKeyword in thesaurus[keyword])&lt;br /&gt;                {&lt;br /&gt;                    XmlElement termTypeR = xdoc.CreateElement("w", "r", wNamespace);&lt;br /&gt;                    XmlElement termDescriptionR = xdoc.CreateElement("w", "r", wNamespace);&lt;br /&gt;                    XmlElement termBreakR = xdoc.CreateElement("w", "r", wNamespace);&lt;br /&gt;                    XmlElement termTypeT = xdoc.CreateElement("w", "t", wNamespace);&lt;br /&gt;                    XmlElement termTypeTab = xdoc.CreateElement("w", "tab", wNamespace);&lt;br /&gt;                    XmlElement termDescriptionT = xdoc.CreateElement("w", "t", wNamespace);&lt;br /&gt;                    XmlElement termDescriptionTab = xdoc.CreateElement("w", "tab", wNamespace);&lt;br /&gt;                    XmlElement termBreak = xdoc.CreateElement("w", "br", wNamespace);&lt;br /&gt;                    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                    termTypeT.InnerText = relatedKeyword.Relation;&lt;br /&gt;                    termDescriptionT.InnerText = relatedKeyword.Keyword;&lt;br /&gt;&lt;br /&gt;                    thesaurusTerm.AppendChild(termTypeR);&lt;br /&gt;                    termTypeR.AppendChild(termTypeTab);&lt;br /&gt;                    termTypeR.AppendChild(termTypeT);&lt;br /&gt;                    &lt;br /&gt;                    thesaurusTerm.AppendChild(termDescriptionR);&lt;br /&gt;                    termDescriptionR.AppendChild(termDescriptionTab);&lt;br /&gt;                    termDescriptionR.AppendChild(termDescriptionT);&lt;br /&gt;&lt;br /&gt;                    thesaurusTerm.AppendChild(termBreakR);&lt;br /&gt;                    termBreakR.AppendChild(termBreak);&lt;br /&gt;                    &lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now I need to add different xml fragments to the package. The XML fragments for settings, footer and styles are added with this generic function.&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;AddPart(pkgOutputDoc, uri, partDocumentXML, &lt;br /&gt;    "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml", &lt;br /&gt;    "http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings", &lt;br /&gt;    "rId2", &lt;br /&gt;    "/word/settings.xml", &lt;br /&gt;    "settings.xml");&lt;br /&gt;&lt;br /&gt;        /// &amp;lt;summary&gt;&lt;br /&gt;        /// Adds the part from an embedded XML to the Package.&lt;br /&gt;        /// &amp;lt;/summary&gt;&lt;br /&gt;        /// &amp;lt;param name="package"&gt;The package.&amp;lt;/param&gt;&lt;br /&gt;        /// &amp;lt;param name="documentUri"&gt;The document URI.&amp;lt;/param&gt;&lt;br /&gt;        /// &amp;lt;param name="partDocumentXML"&gt;The part document XML.&amp;lt;/param&gt;&lt;br /&gt;        /// &amp;lt;param name="contentType"&gt;Type of the content.&amp;lt;/param&gt;&lt;br /&gt;        /// &amp;lt;param name="relationshipType"&gt;Type of the relationship.&amp;lt;/param&gt;&lt;br /&gt;        /// &amp;lt;param name="relationId"&gt;The relation id.&amp;lt;/param&gt;&lt;br /&gt;        /// &amp;lt;param name="partPath"&gt;The part path.&amp;lt;/param&gt;&lt;br /&gt;        /// &amp;lt;param name="embeddedFile"&gt;The embedded file.&amp;lt;/param&gt;&lt;br /&gt;        private void AddPart(Package package, Uri documentUri, PackagePart partDocumentXML, &lt;br /&gt;           string contentType, string relationshipType, string relationId, string partPath, &lt;br /&gt;           string embeddedFile)&lt;br /&gt;        {&lt;br /&gt;            XmlDocument xdoc = new XmlDocument();&lt;br /&gt;            Uri uriPart = new Uri(partPath, UriKind.Relative);&lt;br /&gt;            PackagePart part = package.CreatePart(uriPart, contentType);&lt;br /&gt;            Uri relativePartUri =&lt;br /&gt;            PackUriHelper.GetRelativeUri(documentUri, uriPart);&lt;br /&gt;            Stream contentStream = GetEmbeddedXml(embeddedFile);&lt;br /&gt;            xdoc.Load(contentStream);&lt;br /&gt;            contentStream.Close();&lt;br /&gt;            xdoc.Save(part.GetStream());&lt;br /&gt;            partDocumentXML.CreateRelationship(relativePartUri, TargetMode.Internal, relationshipType, relationId);&lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The footer can contain the page number by using this xml:&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;&lt;br /&gt;&amp;lt;w:ftr xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"&gt;&lt;br /&gt;  &amp;lt;w:p&gt;&lt;br /&gt;    &amp;lt;w:pPr&gt;&lt;br /&gt;      &amp;lt;w:jc w:val="right"/&gt;&lt;br /&gt;    &amp;lt;/w:pPr&gt;&lt;br /&gt;    &amp;lt;w:fldSimple w:instr=" PAGE   \* MERGEFORMAT "&gt;&lt;br /&gt;      &amp;lt;w:r&gt;&lt;br /&gt;        &amp;lt;w:t&gt;1&amp;lt;/w:t&gt;&lt;br /&gt;      &amp;lt;/w:r&gt;&lt;br /&gt;    &amp;lt;/w:fldSimple&gt;&lt;br /&gt;  &amp;lt;/w:p&gt;&lt;br /&gt;&amp;lt;/w:ftr&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- The source code (as VS2005 solution) is available on my SkyDrive: &lt;a href="#"&gt;Compiling OpenXML document Solution&lt;/a&gt;. --&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-7989430024173013828?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/7989430024173013828/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=7989430024173013828' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/7989430024173013828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/7989430024173013828'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/07/compiling-documents-openxml-way.html' title='Compiling documents the OpenXML way'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-791101442225487453</id><published>2008-06-24T15:50:00.002+02:00</published><updated>2011-08-04T22:28:43.582+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Certification'/><title type='text'>MOSS 2007 Certification (70-542)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_ZWHxGFTVlMU/SGD9_a7y9lI/AAAAAAAABpo/1-Mwld6ItGE/s1600-h/mail.google.com.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_ZWHxGFTVlMU/SGD9_a7y9lI/AAAAAAAABpo/1-Mwld6ItGE/s320/mail.google.com.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5215447634498745938" /&gt;&lt;/a&gt;&lt;br /&gt;After my WSS Certificate yesterday, I passed the MOSS Developer exam (&lt;a href="http://www.microsoft.com/learning/en/us/exams/70-542.mspx"&gt;70-542&lt;/a&gt;) today with 969 points.&lt;br /&gt;So now "I know everything" of InfoPath WebForms, the Business Data Catalog, Sharepoint Search, Audiences, Excel Web Access &amp; Report Services, SharePoint Portals, Policies &amp; Record Repositories, etc. etc... and have the &lt;span style="font-style:italic;"&gt;MCTS: Microsoft Office SharePoint Server 2007 – Application Development&lt;/span&gt; certification.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-791101442225487453?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/791101442225487453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=791101442225487453' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/791101442225487453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/791101442225487453'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/06/moss-2007-certification-70-542.html' title='MOSS 2007 Certification (70-542)'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_ZWHxGFTVlMU/SGD9_a7y9lI/AAAAAAAABpo/1-Mwld6ItGE/s72-c/mail.google.com.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-6986561946742470912</id><published>2008-06-23T20:00:00.000+02:00</published><updated>2011-08-04T22:28:43.583+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Certification'/><title type='text'>WSS3.0 Certification (70-541)</title><content type='html'>&lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; margin: 0px 5px 0px 0px; border-left: 0px; border-bottom: 0px" height="150" alt="WSS thumbnail" src="http://lh5.ggpht.com/niiiels/SF_neb5sxZI/AAAAAAAABpk/-C7yvHUnCRo/WSS_thumb%5B6%5D.jpg?imgmax=800" width="170" align="left" border="0" /&gt; I did my &lt;a href="http://www.microsoft.com/learning/en/us/exams/70-541.mspx" target="_blank"&gt;70-541&lt;/a&gt; certification exam today, and passed with a score of 972! Altough the exam was tough, I'm again in the books for the 70-542 (MOSS2007) exam, tomorrow mornig.&lt;/p&gt;  &lt;p&gt;So what I've learned? Building webparts, features, site templates, workflows, custom fields, events, etc., etc.... &lt;/p&gt;  &lt;p&gt;What I've earned? Another MCTS on my CV ;)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-6986561946742470912?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/6986561946742470912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=6986561946742470912' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/6986561946742470912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/6986561946742470912'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/06/wss30-certification-70-541.html' title='WSS3.0 Certification (70-541)'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/niiiels/SF_neb5sxZI/AAAAAAAABpk/-C7yvHUnCRo/s72-c/WSS_thumb%5B6%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-1678518799431031253</id><published>2008-06-17T18:00:00.000+02:00</published><updated>2008-06-17T18:46:44.325+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Generics'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Generics with Actions</title><content type='html'>An action is pointer to a function with no return value which you can use for working with generic lists. It looks like the Predicate functions, but the referenced method won't return a boolean value.&lt;br /&gt;&lt;br /&gt;Still, the only parameter in the function is of the type of the generic. In this example, I extend the DateRange class with an Action.&lt;br /&gt;&lt;br /&gt;An example of such an implementation:&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;        /// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// DateRange is a helper class to work with dates&lt;br /&gt;        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;        public class DateRange&lt;br /&gt;        {&lt;br /&gt;            private DateTime _startDate = DateTime.MinValue;&lt;br /&gt;            private DateTime _endDate = DateTime.MaxValue;&lt;br /&gt;&lt;br /&gt;            public DateTime StartDate&lt;br /&gt;            {&lt;br /&gt;                get { return _startDate; }&lt;br /&gt;            }&lt;br /&gt;            public DateTime EndDate&lt;br /&gt;            {&lt;br /&gt;                get { return _endDate; }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            public DateRange(DateTime startDate, DateTime endDate)&lt;br /&gt;            {&lt;br /&gt;                _startDate = startDate;&lt;br /&gt;                _endDate = endDate;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            /// &amp;lt;summary&amp;gt;&lt;br /&gt;            /// Gets the IsInPeriod method.&lt;br /&gt;            /// &amp;lt;/summary&amp;gt;&lt;br /&gt;            /// &amp;lt;value&amp;gt;The in period.&amp;lt;/value&amp;gt;&lt;br /&gt;            public Predicate&amp;lt;DateTime&amp;gt; InPeriod&lt;br /&gt;            {&lt;br /&gt;                get { return IsInPeriod; }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            /// &amp;lt;summary&amp;gt;&lt;br /&gt;            /// Determines whether the specified date is in the period set by startdate and enddate.&lt;br /&gt;            /// &amp;lt;/summary&amp;gt;&lt;br /&gt;            /// &amp;lt;param name="date"&amp;gt;The date.&amp;lt;/param&amp;gt;&lt;br /&gt;            /// &amp;lt;returns&amp;gt;&lt;br /&gt;            ///  &amp;lt;c&amp;gt;true&amp;lt;/c&amp;gt; if the specified date is in the period; otherwise, &amp;lt;c&amp;gt;false&amp;lt;/c&amp;gt;.&lt;br /&gt;            /// &amp;lt;/returns&amp;gt;&lt;br /&gt;            private bool IsInPeriod(DateTime date)&lt;br /&gt;            {&lt;br /&gt;                if ((date &amp;gt;= StartDate) &amp;&amp; (date &amp;lt; EndDate))&lt;br /&gt;                {&lt;br /&gt;                    return true;&lt;br /&gt;                } &lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    return false;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;            /// &amp;lt;summary&amp;gt;&lt;br /&gt;            /// Gets the WriteNumberOfDaysFromStartDate method.&lt;br /&gt;            /// &amp;lt;/summary&amp;gt;&lt;br /&gt;            /// &amp;lt;value&amp;gt;The write number of days till end.&amp;lt;/value&amp;gt;&lt;br /&gt;            public Action&amp;lt;DateTime&amp;gt; WriteNumberOfDaysFromStart&lt;br /&gt;            {&lt;br /&gt;                get { return WriteNumberOfDaysFromStartDate; }&lt;br /&gt;            }&lt;br /&gt;            /// &amp;lt;summary&amp;gt;&lt;br /&gt;            /// Writes the number of days from the start date of the period.&lt;br /&gt;            /// &amp;lt;/summary&amp;gt;&lt;br /&gt;            /// &amp;lt;param name="date"&amp;gt;The date.&amp;lt;/param&amp;gt;&lt;br /&gt;            private void WriteNumberOfDaysFromStartDate(DateTime date)&lt;br /&gt;            {&lt;br /&gt;                Console.WriteLine("{0} days to go", ((TimeSpan)(date - StartDate)).Days);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You can now use this conditional predicate with different Generic methods.&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;        public class ActionExamples&lt;br /&gt;        {&lt;br /&gt;            public static void Main()&lt;br /&gt;            {&lt;br /&gt;                // fill an example list&lt;br /&gt;                List&lt;DateTime&gt; events = new List&lt;DateTime&gt;();&lt;br /&gt;                events.Add(DateTime.Now.AddDays(-1));&lt;br /&gt;                events.Add(DateTime.Now.AddDays(-2));&lt;br /&gt;                events.Add(DateTime.Now);&lt;br /&gt;                events.Add(DateTime.Now.AddDays(1));&lt;br /&gt;                events.Add(DateTime.Now.AddDays(2));&lt;br /&gt;                events.Add(DateTime.Now.AddDays(3));&lt;br /&gt;                events.Add(DateTime.Now.AddDays(4));&lt;br /&gt;&lt;br /&gt;                //create a DateRange object for tomorrow&lt;br /&gt;                DateRange nextMonth = new DateRange (new DateTime(2008,7,1), new DateTime(2008,7,31) )&lt;br /&gt;&lt;br /&gt;                //get events for next month&lt;br /&gt;                List&lt;DateTime&gt; nextMonthEvents = events.FindAll(nextMonth.InPeriod);&lt;br /&gt;&lt;br /&gt;                //write days from start of nextMonth to console&lt;br /&gt;                events.ForEach(nextMonth.WriteNumberOfDaysFromStart);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-1678518799431031253?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/1678518799431031253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=1678518799431031253' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/1678518799431031253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/1678518799431031253'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/06/generics-with-actions.html' title='Generics with Actions'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-7682893446130529987</id><published>2008-06-16T18:00:00.002+02:00</published><updated>2008-06-16T18:00:02.675+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Generics'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Generics with Predicates</title><content type='html'>A predicate is pointer to a boolean function which you can use for querying generic lists.&lt;br /&gt;With these methods, coding against generic lists will be much easier. But one problem with these predicates is that the only parameter in the function is of the type of the generic. A solution for this is refactoring the predicate to a class, where you can provide these parameters to properties or the constructor.&lt;br /&gt;&lt;br /&gt;An example of such an implementation:&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;        /// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// DateRange is a helper class to work with dates&lt;br /&gt;        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;        public class DateRange&lt;br /&gt;        {&lt;br /&gt;            private DateTime _startDate = DateTime.MinValue;&lt;br /&gt;            private DateTime _endDate = DateTime.MaxValue;&lt;br /&gt;&lt;br /&gt;            public DateTime StartDate&lt;br /&gt;            {&lt;br /&gt;                get { return _startDate; }&lt;br /&gt;            }&lt;br /&gt;            public DateTime EndDate&lt;br /&gt;            {&lt;br /&gt;                get { return _endDate; }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            public DateRange(DateTime startDate, DateTime endDate)&lt;br /&gt;            {&lt;br /&gt;                _startDate = startDate;&lt;br /&gt;                _endDate = endDate;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            /// &amp;lt;summary&amp;gt;&lt;br /&gt;            /// Gets the IsInPeriod method.&lt;br /&gt;            /// &amp;lt;/summary&amp;gt;&lt;br /&gt;            /// &amp;lt;value&amp;gt;The in period.&amp;lt;/value&amp;gt;&lt;br /&gt;            public Predicate&amp;lt;DateTime&amp;gt; InPeriod&lt;br /&gt;            {&lt;br /&gt;                get { return IsInPeriod; }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            /// &amp;lt;summary&amp;gt;&lt;br /&gt;            /// Determines whether the specified date is in the period set by startdate and enddate.&lt;br /&gt;            /// &amp;lt;/summary&amp;gt;&lt;br /&gt;            /// &amp;lt;param name="date"&amp;gt;The date.&amp;lt;/param&amp;gt;&lt;br /&gt;            /// &amp;lt;returns&amp;gt;&lt;br /&gt;            ///  &amp;lt;c&amp;gt;true&amp;lt;/c&amp;gt; if the specified date is in the period; otherwise, &amp;lt;c&amp;gt;false&amp;lt;/c&amp;gt;.&lt;br /&gt;            /// &amp;lt;/returns&amp;gt;&lt;br /&gt;            private bool IsInPeriod(DateTime date)&lt;br /&gt;            {&lt;br /&gt;                if ((date &amp;gt;= StartDate) &amp;&amp; (date &amp;lt; EndDate))&lt;br /&gt;                {&lt;br /&gt;                    return true;&lt;br /&gt;                } &lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    return false;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You can now use this conditional predicate with different Generic methods.&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;        public class PredicateExamples&lt;br /&gt;        {&lt;br /&gt;            public static void Main()&lt;br /&gt;            {&lt;br /&gt;                // fill an example list&lt;br /&gt;                List&lt;DateTime&gt; events = new List&lt;DateTime&gt;();&lt;br /&gt;                events.Add(DateTime.Now.AddDays(-1));&lt;br /&gt;                events.Add(DateTime.Now.AddDays(-2));&lt;br /&gt;                events.Add(DateTime.Now);&lt;br /&gt;                events.Add(DateTime.Now.AddDays(1));&lt;br /&gt;                events.Add(DateTime.Now.AddDays(2));&lt;br /&gt;                events.Add(DateTime.Now.AddDays(3));&lt;br /&gt;                events.Add(DateTime.Now.AddDays(4));&lt;br /&gt;&lt;br /&gt;                //create a DateRange object for tomorrow&lt;br /&gt;                DateRange tomorrow = new DateRange (DateTime.Today.AddDays(1), DateTime.Today.AddDays(2))&lt;br /&gt;&lt;br /&gt;                //get a boolean if there is an event tomorrow&lt;br /&gt;                bool tomorrowHasEvents = events.Exists(tomorrow.InPeriod);&lt;br /&gt;&lt;br /&gt;                //get events for tomorrow&lt;br /&gt;                List&lt;DateTime&gt; tomorrowEvents = events.FindAll(tomorrow.InPeriod);&lt;br /&gt;&lt;br /&gt;                //get first event for tomorrow (first item in list!)&lt;br /&gt;                DateTime tomorrowFirstEvent = events.Find(tomorrow.InPeriod);&lt;br /&gt;                //get last event for tomorrow&lt;br /&gt;                DateTime tomorrowLastEvent = events.FindLast(tomorrow.InPeriod);&lt;br /&gt;&lt;br /&gt;                //get the index of the first event for tomorrow&lt;br /&gt;                int tomorrowFirstEventIndex = events.FindIndex(tomorrow.InPeriod);&lt;br /&gt;                //get the index of the last event for tomorrow&lt;br /&gt;                int tomorrowLastEventIndex = events.FindLastIndex(tomorrow.InPeriod);&lt;br /&gt;&lt;br /&gt;                //remove all events for tomorrow&lt;br /&gt;                int removedItems = events.RemoveAll(tomorrow.InPeriod);&lt;br /&gt;&lt;br /&gt;                //are all events in the list tomorrow&lt;br /&gt;                bool allEventsTomorrow = events.TrueForAll(tomorrow.InPeriod);&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-7682893446130529987?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/7682893446130529987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=7682893446130529987' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/7682893446130529987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/7682893446130529987'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/06/generics-with-predicates.html' title='Generics with Predicates'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-3794945554269450746</id><published>2008-06-13T20:00:00.000+02:00</published><updated>2008-06-13T14:55:42.526+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>.NET 2.0 = .NET 3.0 = .NET 3.5</title><content type='html'>Yesterday I had a discussion on an internal Microsoft Developers meeting about the status of .NET 3.5. We had presented that .NET 3.0 is an extension of .NET 2.0, and not a new version. My statement that the status of .NET 3.5 is the same, it is basically .NET 2.0 with extra features, was received sceptically.&lt;br /&gt;Just to prove I'm right, here my observations.&lt;br /&gt;&lt;br /&gt;Build a very simple .NET Console application, using two lines of code:&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;    Console.WriteLine("Hello World");&lt;br /&gt;    Console.WriteLine("using version: {0}", System.Environment.Version.ToString());&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;With Visual Studio 2008, you can build this with all three version of the framework. And all three executables yields the same results: using version: 2.0.50727.1433.&lt;br /&gt;&lt;br /&gt;ILDASM one of these assemblies gives the same assembly header:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;// Metadata version: v2.0.50727&lt;br /&gt;.assembly extern mscorlib&lt;br /&gt;{&lt;br /&gt;  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )&lt;br /&gt;  .ver 2:0:0:0&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Proving all three versions are based on the .NET core version 2.0 (and this is the same version you should configure in ASP.NET. There is no v3 there).&lt;br /&gt;Just to be sure if you want to upgrade to 3.5 at your customer to mention that version 3.5 also is basically .NET 2.0, with some extra features added. I won't say that the libraries of .NET 2.0 are the same with 3.5, but runtime versions are equal.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://west-wind.com/weblog/posts/289139.aspx"&gt;Rick Strahl&lt;/a&gt; blogged about this a while ago.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-3794945554269450746?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/3794945554269450746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=3794945554269450746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/3794945554269450746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/3794945554269450746'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/06/net-20-net-30-net-35.html' title='.NET 2.0 = .NET 3.0 = .NET 3.5'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-2749030787036068315</id><published>2008-05-02T15:03:00.005+02:00</published><updated>2008-06-16T14:30:23.612+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Unexpected SqlException...</title><content type='html'>On the production servers at the customer I'm currently working for, we had a strange error regarding a new feature in our reporting tools. A strange error, because during the development and test cycle of our release, we hadn't found any issues regarding SQL errors.&lt;br /&gt;&lt;br /&gt;The error firing was &lt;cite&gt;'The count aggregate operation cannot take a uniqueidentifier data type as an argument'&lt;/cite&gt;, during the execution of &lt;code&gt;SELECT COUNT(Item.Id) AS ItemCount ...&lt;/code&gt; while the datatype of Item.Id was uniqueidentifier.&lt;br /&gt;&lt;br /&gt;The only difference between our development, test and production servers is the version of MS SQL Server. While we migrated our dev and test servers to 2005, production was still behind on version 2000. And version 2000 can't run an aggregate operation on a uniqueidentifier, you need to run it with the asterisk instead (like COUNT(*) ).&lt;br /&gt;&lt;br /&gt;Fortunately, migration to MS-SQL 2005 is already scheduled to happen soon :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-2749030787036068315?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/2749030787036068315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=2749030787036068315' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/2749030787036068315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/2749030787036068315'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/05/unexpected-sqlexception.html' title='Unexpected SqlException...'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-1410292260023076224</id><published>2008-04-03T12:09:00.008+02:00</published><updated>2011-08-04T22:28:43.585+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CruiseControl.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><title type='text'>Show your CC.NET dashboard in Sharepoint</title><content type='html'>I was wondering today if it's possible to get the webdashboard for &lt;a href="http://ccnet.thoughtworks.com/"&gt;CruiseControl.NET&lt;/a&gt; in Sharepoint. I didn't want to use an html scrapper, so I thought the XML webpart should be a good start. I needed the server status as XML, but found no reference in the helpfiles of CC.Net. On the other hand, Thoughtworks does have a page with information about &lt;a href="http://confluence.public.thoughtworks.org/display/CI/Multiple+Project+Summary+Reporting+Standard"&gt;a xml format for CI build status&lt;/a&gt;.&lt;br /&gt;After inspecting the CCTray application and the logfiles on my server, I finally found the undocumented URL for this XML document with the status: http://buildserver.local/XmlServerReport.aspx.&lt;br /&gt;After this quest for XML, I only needed an XSLT to get the results. So here it is:&lt;br /&gt;&lt;code class="xslt" style="font-family: Consolas; font-size: 10pt; color: black; background: white;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color: maroon;"&gt;xml&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;version&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;encoding&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;utf-8&lt;/span&gt;"&lt;span style="color: blue;"&gt;?&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:stylesheet&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;version&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;xmlns:xsl&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;http://www.w3.org/1999/XSL/Transform&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:output&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;method&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;xml&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;encoding&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;utf-8&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;indent&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;yes&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;omit-xml-declaration&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;yes&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;match&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;table&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;border&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;0&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;cellpadding&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;0&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;cellspacing&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;0&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;thead&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;style&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;text-align:left;&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Project&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;#160;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;style&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;text-align:left;&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Status&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;#160;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;style&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;text-align:left;&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Last buildtime&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;#160;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;style&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;text-align:left;&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Buildlabel&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;#160;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;style&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;text-align:left;&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;Activity&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;th&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;thead&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;tbody&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:apply-templates&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;/CruiseControl/Projects/Project&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;tbody&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;table&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;match&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;Project&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;tr&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;ms-vb&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;align&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;top&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;nowrap&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;nowrap&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;a&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;onfocus&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;OnLink(this)&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;href&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;@webUrl&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;onclick&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;GoToLink(this);return false;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;target&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;_self&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;@name&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;#160;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;td&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;class&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;ms-vb&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;align&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;top&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;style&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; padding-bottom: 3px;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:choose&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;test&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;@lastBuildStatus='Failed'&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; color:red;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;test&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;@lastBuildStatus='Exception'&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; color:red;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;test&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;@lastBuildStatus='Unknown'&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; color:yellow;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;test&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;@lastBuildStatus='Failed'&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; color:red;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:otherwise&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; color:green;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:otherwise&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:choose&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;@lastBuildStatus&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;#160;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;ms-vb&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;style&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;padding-bottom: 3px;&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;align&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;top&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;substring-before(@lastBuildTime,'T')&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;#160;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;substring-before(substring-after(@lastBuildTime,'T'),'.')&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;#160;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;class&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;ms-vb&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;style&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;padding-bottom: 3px;text-align:right;&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;align&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;top&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;@lastBuildLabel&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: red;"&gt;&amp;amp;#160;&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;td&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;td&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;class&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;ms-vb&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;align&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;top&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;style&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; padding-bottom: 3px;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:choose&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;test&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;@activity='Building'&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; color:red;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;test&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;@activity='CheckingModifications'&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; color:yellow;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:when&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:otherwise&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:otherwise&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:choose&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:attribute&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:value-of&lt;/span&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;select&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;@activity&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:element&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;tr&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:template&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: teal;"&gt;xsl:stylesheet&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;/code&gt; &lt;br /&gt;&lt;br /&gt;Now you need only to configure a custom XML Webpart to load the xml from your buildserver, set the XSLT and the title of the webpart.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-1410292260023076224?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/1410292260023076224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=1410292260023076224' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/1410292260023076224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/1410292260023076224'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/04/show-your-ccnet-dashboard-in-sharepoint.html' title='Show your CC.NET dashboard in Sharepoint'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-5360699315375814147</id><published>2008-03-26T22:48:00.006+01:00</published><updated>2008-03-31T22:30:59.692+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>C# test automation with Internet Explorer</title><content type='html'>As a follow up on my previous post, I had the idea you can do the same in managed code (in your test library, for instance). Although this won't exactly be a unit test (especialy with the example search form, it's more integration testing), it can be usefull in some scenarios.&lt;br /&gt;&lt;br /&gt;You need a reference to two COM dll's, &lt;br /&gt;&lt;dl&gt;&lt;dt&gt;MSHTML&lt;/dt&gt;&lt;dd&gt;Microsoft HTML Object Library&lt;/dd&gt;&lt;dt&gt;SHDocVw&lt;/dt&gt;&lt;dd&gt;Microsoft Internet Controls&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;&lt;br /&gt;After that, you can use the following example code inside your test (I present it here as one block. Some things can be put in test setup and teardown):&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorerClass();&lt;br /&gt;object missing = new object();&lt;br /&gt;ie.Navigate("http://localhost/Default.aspx", ref missing, ref missing, ref missing, ref missing);&lt;br /&gt;ie.Visible = true;&lt;br /&gt;while (ie.Busy)&lt;br /&gt;{&lt;br /&gt;    System.Threading.Thread.Sleep(500);&lt;br /&gt;}&lt;br /&gt;mshtml.HTMLDocumentClass doc = ie.Document as mshtml.HTMLDocumentClass;&lt;br /&gt;doc.getElementById("searchbox").setAttribute("value", "test", 0);&lt;br /&gt;doc.getElementById("searchsubmit").click();&lt;br /&gt;while (ie.Busy)&lt;br /&gt;{&lt;br /&gt;    System.Threading.Thread.Sleep(500);&lt;br /&gt;}&lt;br /&gt;string bodytext = doc.body.innerHTML;&lt;br /&gt;Debug.Assert( bodytext.IndexOf("documents found")&gt;0);   &lt;br /&gt;&lt;br /&gt;ie.Quit();&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-5360699315375814147?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/5360699315375814147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=5360699315375814147' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/5360699315375814147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/5360699315375814147'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/03/c-test-automation-with-internet.html' title='C# test automation with Internet Explorer'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-7821374501231785942</id><published>2008-03-26T11:53:00.002+01:00</published><updated>2008-03-26T12:02:46.217+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><title type='text'>PowerShell Web UI test automation</title><content type='html'>Just read an article in MSDN magazine about &lt;a href="http://msdn2.microsoft.com/en-us/magazine/cc337896.aspx"&gt;test automation for Internet Explorer&lt;/a&gt; so you can test your web user interface. There are other tools for this (like &lt;a href="http://selenium.thoughtworks.com/"&gt;Selenium&lt;/a&gt;), but those need quite a setup.&lt;br /&gt;&lt;br /&gt;Execute a search-box test in PowerShell:&lt;br /&gt;&lt;code class="powershell"&gt;&lt;br /&gt;$ie = new-object -com "InternetExplorer.Application"&lt;br /&gt;$ie.navigate("http://localhost/Default.aspx")&lt;br /&gt;$ie.visible = $true&lt;br /&gt;$doc = $ie.document&lt;br /&gt;$doc.getElementByID("searchbox").value = "test"&lt;br /&gt;$doc.getElementByID("searchsubmit").click()&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-7821374501231785942?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/7821374501231785942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=7821374501231785942' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/7821374501231785942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/7821374501231785942'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/03/powershell-web-ui-test-automation.html' title='PowerShell Web UI test automation'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-689333643656464833</id><published>2008-03-17T00:16:00.007+01:00</published><updated>2008-06-16T13:34:11.679+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Webrichtlijnen'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>Dutch 'Webrichtlijnen' and binary downloads</title><content type='html'>The Dutch &lt;a href="http://www.webrichtlijnen.nl/english/"&gt;Web Guidelines&lt;/a&gt; (a quality model for sustainable and accessible websites) describe what to do with downloads on your page. This isn't meant for HTML and images, but when you place Adobes Protable Document Format (pdf) or Rich Text Documents (rtf), those documents can be opened in your current window. It is possible to open those files in new windows (although the target="_blank" solution doesn't conform to XHTML validation, some solutions do exist , like rel="external" and JavaScript replacement). But this can be a browser window. Although you can configure your browser, the majority of users don't have the knowledge to tweak their browser to do what they want with these files.&lt;br /&gt;The solution from the Webrichtlijnen:&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;Do not automatically open links to downloadable files in a new window.&lt;/p&gt;&lt;br /&gt;&lt;p class="relref"&gt;Guideline &lt;a href="http://www.webrichtlijnen.nl/english/guidelines/#r-pd-8-22" title="Guideline R-pd.8.22 in the summary of guidelines"&gt;R-pd.8.22&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;One way of getting this done is setting the &lt;abbr&gt;HTTP&lt;/abbr&gt; &lt;em&gt;Content-disposition header&lt;/em&gt;&lt;br /&gt;&lt;blockquote&gt;By having the web server send an extra &lt;abbr&gt;HTTP&lt;/abbr&gt; header for the downloadable file to the browser, the browser can decide whether to download this file untouched as an attachment to the visitor's hard disk.&lt;/blockquote&gt;&lt;br /&gt;The best way to do this is writing a custom HTTP Module which can check on served file extensions or MIME Types and add the content disposition header for configured downloads.&lt;br /&gt;In this example implementation, I configure the file extensions in code, but you can always configure this in your config, database or any file.&lt;br /&gt;&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;public class ContentDispositionModule : IHttpModule&lt;br /&gt;    {&lt;br /&gt;        #region IHttpModule Members&lt;br /&gt;&lt;br /&gt;        ///&amp;lt;summary&amp;gt;&lt;br /&gt;        ///Initializes the module and prepares it to handle requests.&lt;br /&gt;        ///&amp;lt;/summary&amp;gt;&lt;br /&gt;        ///&amp;lt;param name="context"&amp;gt;An &amp;lt;see cref="T:System.Web.HttpApplication"&amp;gt;&amp;lt;/see&amp;gt; &lt;br /&gt;        ///that provides access to the methods, properties, and events common &lt;br /&gt;        ///to all application objects within an ASP.NET application &amp;lt;/param&amp;gt;&lt;br /&gt;        public virtual void Init(HttpApplication context)&lt;br /&gt;        {&lt;br /&gt;            context.PreSendRequestHeaders += new EventHandler(SetContentDispositionHeader);  &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private static void SetContentDispositionHeader(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            string url = ((HttpApplication)sender).Context.Request.Path;&lt;br /&gt;            if (IsUrlPatternMatch(url))&lt;br /&gt;            {&lt;br /&gt;                ((HttpApplication)sender).Context.Response.AppendHeader("Content-Disposition", "attachment");&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        ///&amp;lt;summary&amp;gt;&lt;br /&gt;        ///Disposes of the resources (other than memory) used by the module that implements &lt;br /&gt;        ///&amp;lt;see cref="T:System.Web.IHttpModule"&amp;gt;&amp;lt;/see&amp;gt;.&lt;br /&gt;        ///&amp;lt;/summary&amp;gt;&lt;br /&gt;        public virtual void Dispose()&lt;br /&gt;        {&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// Check the url against the binaryExtension patterns&lt;br /&gt;        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;        /// &amp;lt;param name="strUrl"&amp;gt;url to check&amp;lt;/param&amp;gt;&lt;br /&gt;        /// &amp;lt;returns&amp;gt;true if it matches the binaryExtension pattern&amp;lt;/returns&amp;gt;&lt;br /&gt;        private static bool IsUrlPatternMatch(string strUrl)&lt;br /&gt;        {&lt;br /&gt;            // get this string from a more configurable place.&lt;br /&gt;            string binaryExtensions = "*.pdf,*.rtf";&lt;br /&gt;            if (!string.IsNullOrEmpty(binaryExtensions))&lt;br /&gt;            {&lt;br /&gt;                foreach (string extension in binaryExtensions.Split(','))&lt;br /&gt;                {&lt;br /&gt;                    if (!string.IsNullOrEmpty(extension))&lt;br /&gt;                    {&lt;br /&gt;                        if (Regex.IsMatch(strUrl, extension.Trim()))&lt;br /&gt;                        {&lt;br /&gt;                            // the url path contains the specified regex string, so return true and break out of loop&lt;br /&gt;                            return true;&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        #endregion&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;After coding this module, you'll need to change the .config so the module will be activated for usage. Add it to the httpModules of the system.web section. You'll also need to configure IIS that all needed extensions are routed through your ASP.NET ISAPI dll.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-689333643656464833?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/689333643656464833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=689333643656464833' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/689333643656464833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/689333643656464833'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/03/dutch-webrichtlijnen-and-binary.html' title='Dutch &apos;Webrichtlijnen&apos; and binary downloads'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-8001676910589734529</id><published>2008-03-14T10:06:00.004+01:00</published><updated>2008-03-14T10:14:00.451+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Certification'/><title type='text'>MCPD - EAD</title><content type='html'>Yesterday I had my 70-554 exam, and fortunately I passed with 880! It was a hard and difficult exam, so I was really glad to see this number on my screen.&lt;br /&gt;I'm now certified for:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Microsoft Certified Technology Specialist: .NET Framework 2.0 Distributed Applications&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Microsoft Certified Professional Developer: Enterprise Application Developer&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_ZWHxGFTVlMU/R9pBTNKc3VI/AAAAAAAABes/drLkbdSquOg/s400/MCPD(rgb)_506.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5177522519822622034" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-8001676910589734529?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/8001676910589734529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=8001676910589734529' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/8001676910589734529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/8001676910589734529'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/03/mcpd-ead.html' title='MCPD - EAD'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_ZWHxGFTVlMU/R9pBTNKc3VI/AAAAAAAABes/drLkbdSquOg/s72-c/MCPD(rgb)_506.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-3342935585206643113</id><published>2008-03-13T23:19:00.004+01:00</published><updated>2008-03-14T10:05:29.941+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>LINQ Design Guidelines</title><content type='html'>Mircea Trofin is writing on his blog some &lt;a href="http://blogs.msdn.com/mirceat/archive/2008/03/13/linq-framework-design-guidelines.aspx"&gt;design guideline&lt;/a&gt;s for writing .NET LINQ code. It gives you a quick start to design qualitatively LINQ code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-3342935585206643113?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/3342935585206643113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=3342935585206643113' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/3342935585206643113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/3342935585206643113'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/03/mircea-trofin-is-writing-on-his-blog.html' title='LINQ Design Guidelines'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-3969175964439999879</id><published>2008-02-28T14:43:00.005+01:00</published><updated>2008-02-28T14:49:46.268+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Sandcastle'/><title type='text'>Sandcastle Themes</title><content type='html'>&lt;a href="http://www.codeplex.com/Sandcastle"&gt;Sandcastle&lt;/a&gt; is documentation tool for building MSDN-like help documents. Although it's still in progress, it is already working great. Unfortunately, the documentation is very sparse.&lt;br /&gt;&lt;br /&gt;One of the options you can give is the style of the documentation. But I found no description of the styles. &lt;br /&gt;This are screenshots of the 3 different styles:&lt;br /&gt;&lt;h4&gt;Hana&lt;/h4&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_ZWHxGFTVlMU/R8a7g_o8GQI/AAAAAAAABd8/G4jcH5KaILQ/s1600-h/hana.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_ZWHxGFTVlMU/R8a7g_o8GQI/AAAAAAAABd8/G4jcH5KaILQ/s400/hana.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5172027397594945794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;VS2005&lt;/h4&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_ZWHxGFTVlMU/R8a7xvo8GRI/AAAAAAAABeE/yEzXGJTqC68/s1600-h/vs2005.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_ZWHxGFTVlMU/R8a7xvo8GRI/AAAAAAAABeE/yEzXGJTqC68/s400/vs2005.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5172027685357754642" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;Prototype&lt;/h4&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_ZWHxGFTVlMU/R8a75vo8GSI/AAAAAAAABeM/qEenWzZELWA/s1600-h/prototype.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_ZWHxGFTVlMU/R8a75vo8GSI/AAAAAAAABeM/qEenWzZELWA/s400/prototype.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5172027822796708130" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-3969175964439999879?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/3969175964439999879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=3969175964439999879' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/3969175964439999879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/3969175964439999879'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/02/sandcastle-themes.html' title='Sandcastle Themes'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_ZWHxGFTVlMU/R8a7g_o8GQI/AAAAAAAABd8/G4jcH5KaILQ/s72-c/hana.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-5825284141123084660</id><published>2008-02-19T09:16:00.008+01:00</published><updated>2008-02-19T09:55:48.395+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CruiseControl.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='MSBuild'/><title type='text'>CC.Net project unexpected build failure</title><content type='html'>The last couple of weeks (after migrating to a new build server) I had strange behavior with two web projects building on &lt;a href="http://ccnet.thoughtworks.com/"&gt;CruiseControl.NET&lt;/a&gt;.&lt;br /&gt;The build project is configured to build after a code check in on subversion. But after the check in, the build fails. A manual 'force build' successfully builds the project.&lt;br /&gt;The build log only said there was an error durring the build, but without a clue what went wrong (and especially when you want to blame project members for checking in bad code ;).&lt;br /&gt;&lt;br /&gt;Digging in the ccnet.log I finally found the the cause; &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[project-x development:WARN] Process timed out:&lt;br /&gt;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe&lt;br /&gt;Process id: 3380.  This process will now be killed.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The question is, why can't there be a descriptive error in the build log of the project? &lt;br /&gt;After increasing the seconds in the &amp;lt;tastk&amp;gt;&amp;lt;MSBuild&amp;gt;&amp;lt;Timeout&amp;gt; element, everything indeeds goes fine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-5825284141123084660?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/5825284141123084660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=5825284141123084660' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/5825284141123084660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/5825284141123084660'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/02/ccnet-project-unexpected-build-failure.html' title='CC.Net project unexpected build failure'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-5785697367971284263</id><published>2008-02-06T21:12:00.000+01:00</published><updated>2008-02-07T15:18:04.197+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.Net 3.5 namespace poster</title><content type='html'>&lt;a href="http://download.microsoft.com/download/4/a/3/4a3c7c55-84ab-4588-84a4-f96424a7d82d/NET_35_Namespaces_Poster_JAN08.pdf"&gt;Microsoft's updated .NET Framework Namespace poster&lt;/a&gt; for version 3.5.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-5785697367971284263?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/5785697367971284263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=5785697367971284263' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/5785697367971284263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/5785697367971284263'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/02/net-35-namespace-poster.html' title='.Net 3.5 namespace poster'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-2243768720727390124</id><published>2008-02-01T11:53:00.001+01:00</published><updated>2008-03-14T10:06:31.895+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Certification'/><title type='text'>070-553 down, 070-554 to go</title><content type='html'>I just passed my 70-553 exam for the upgrade to MCPD:Enterprise Application Developer. So I will need an other exam, but following the &lt;a href="http://www.microsoft.com/learning/exams/70-553.mspx"&gt;553 exam guide&lt;/a&gt;, I now earned two MCTS certification credits:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Microsoft Certified Technology Specialist: .NET Framework 2.0 Web Applications&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Microsoft Certified Technology Specialist: .NET Framework 2.0 Windows Applications&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_ZWHxGFTVlMU/R6sPq20l98I/AAAAAAAABds/3XE85hP_rsA/s400/MCTS(rgb)_513_512.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5164238626655434690" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-2243768720727390124?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/2243768720727390124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=2243768720727390124' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/2243768720727390124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/2243768720727390124'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/02/070-553-down-070-554-to-go.html' title='070-553 down, 070-554 to go'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_ZWHxGFTVlMU/R6sPq20l98I/AAAAAAAABds/3XE85hP_rsA/s72-c/MCTS(rgb)_513_512.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-4529560662575525095</id><published>2008-01-31T08:54:00.001+01:00</published><updated>2008-03-13T23:19:37.056+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>Lutz Roeder's Reflector</title><content type='html'>I just stumbled upon a nice &lt;a href="http://www.aisto.com/roeder/dotnet/"&gt;Reflector&lt;/a&gt; tool for .NET after a tip of a colleague. It already helped with finding a bug in some Tridion .NET dll's...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-4529560662575525095?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/4529560662575525095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=4529560662575525095' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/4529560662575525095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/4529560662575525095'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2008/01/lutz-roeders-reflector.html' title='Lutz Roeder&apos;s Reflector'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-8694222132296108401</id><published>2007-12-11T13:17:00.000+01:00</published><updated>2007-12-22T12:30:26.473+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>OnInit not firing on controls with default property</title><content type='html'>Just build some nested controls to run on the web site, but there was some strange stuff going on.&lt;br /&gt;The render method worked fine, but there weren't some values on those controls. The cause of this was that the OnInit, and the OnLoad event's weren't firing.&lt;br /&gt;After some debugging and analyzing the control tree in /trace.axd, I saw there were no controls in the main control. &lt;br /&gt;The reason? I'd put a &lt;code class="csharp"&gt;[ParseChildren(ChildrenAsProperties = true,&lt;br /&gt; DefaultProperty = "Groups")]&lt;/code&gt; attibute on the main control, and all those controls were added to a List&lt;Step&gt; collection, but not to the Control collection. So ASP.net didn't took up those child controls for inclusion in the control tree.&lt;br /&gt;&lt;br /&gt;A dirty line in the main control OnInit fixed this:&lt;br /&gt;&lt;code class="csharp"&gt;foreach (Group group in Groups) { Controls.Add(group); }&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-8694222132296108401?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/8694222132296108401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=8694222132296108401' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/8694222132296108401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/8694222132296108401'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2007/12/oninit-not-firing-on-controls-with.html' title='OnInit not firing on controls with default property'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-1266397973391288273</id><published>2007-11-28T13:15:00.000+01:00</published><updated>2007-11-28T13:25:22.889+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>.Net documentation missing</title><content type='html'>Just figured out that the HtmlWriter.AddAttribute() does an encoding based on the HtmlTextWriterAttribute enum you give as the first parameter. How? By inspecting the &lt;a href="http://dsrg.mff.cuni.cz/projects/mono/diffs/showdiff.php?old=2004-11-05&amp;new=2004-11-30&amp;fileIndex=5240&amp;bench="&gt;source code&lt;/a&gt; of Mono. With this knowledge I searched MSDN, but couldn't find a thing. &lt;br/&gt;&lt;br /&gt;The bottomline: don't use a &lt;code class="csharp"&gt;writer.AddAttribute(HtmlTextWriterAttribute.Href,&lt;br /&gt;   HttpUtility.HtmlAttributeEncode(url));&lt;/code&gt; because then you're encoding twice.&lt;br /&gt;&lt;br /&gt;The list of attributes which enode is:&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;HtmlTextWriterAttribute.Accesskey;&lt;br /&gt;HtmlTextWriterAttribute.Alt;&lt;br /&gt;HtmlTextWriterAttribute.Background;&lt;br /&gt;HtmlTextWriterAttribute.Class;&lt;br /&gt;HtmlTextWriterAttribute.Href;&lt;br /&gt;HtmlTextWriterAttribute.Onchange;&lt;br /&gt;HtmlTextWriterAttribute.Onclick;&lt;br /&gt;HtmlTextWriterAttribute.Src;&lt;br /&gt;HtmlTextWriterAttribute.Title;&lt;br /&gt;HtmlTextWriterAttribute.Value;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-1266397973391288273?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/1266397973391288273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=1266397973391288273' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/1266397973391288273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/1266397973391288273'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2007/11/net-documentation-missing.html' title='.Net documentation missing'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-682318274637830277</id><published>2007-11-12T08:34:00.000+01:00</published><updated>2007-11-12T08:40:03.571+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tridion'/><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><title type='text'>PowerShell Shutdown COM+</title><content type='html'>To shutdown a COM+ object, so you can redeploy the binaries it uses, I had a VBS script to do it. I wondered how I could do it in PowerShell, but lacked time to do so. I just stumbled upon some code to do it, though.&lt;br /&gt;&lt;br /&gt;The old script was:&lt;br /&gt;&lt;code class="vbs"&gt;&lt;br /&gt;Dim oCatalog ' As COMAdmin.COMAdminCatalog&lt;br /&gt;Dim sName 'As String&lt;br /&gt;Dim sMachine 'As String&lt;br /&gt;Set oCatalog = CreateObject("COMAdmin.COMAdminCatalog") &lt;br /&gt;sName = "Tridion Content Manager"&lt;br /&gt;sMachine = "tridionserver"&lt;br /&gt;&lt;br /&gt;oCatalog.Connect sMachine    &lt;br /&gt;oCatalog.ShutdownApplication sName&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And this became:&lt;br /&gt;&lt;br /&gt;&lt;code class="powershell"&gt;&lt;br /&gt;$TridionAppName = "Tridion Content Manager"&lt;br /&gt;$TridionMachine = "tridionserver"&lt;br /&gt;&lt;br /&gt;$comAdmin = New-Object -comobject COMAdmin.COMAdminCatalog&lt;br /&gt;$comAdmin.Connect($TridionMachine)&lt;br /&gt;$comAdmin.ShutdownApplication($TridionAppName)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;(Just leave the line with the call to connect out to run this on your local machine).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-682318274637830277?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/682318274637830277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/682318274637830277'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2007/11/powershell-shutdown-com.html' title='PowerShell Shutdown COM+'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-9222251533795841010</id><published>2007-11-03T22:06:00.000+01:00</published><updated>2008-06-16T14:29:25.783+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Take screenshots of web pages with FireShot!</title><content type='html'>&lt;a href="http://screenshot-program.com/fireshot/"&gt;Take screenshots of web pages with FireShot!&lt;/a&gt;&lt;br /&gt;Works with Firefox, and can grab a bitmap of the whole page (and not only from the visible area).&lt;br /&gt;Very handy while debugging the design for your website (and since I'm currently implementing a css design while communicating the bugs back to the CSS designer), this tool can save some time annotating and merging bitmaps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-9222251533795841010?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://screenshot-program.com/fireshot/' title='Take screenshots of web pages with FireShot!'/><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/9222251533795841010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=9222251533795841010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/9222251533795841010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/9222251533795841010'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2007/11/take-screenshots-of-web-pages-with.html' title='Take screenshots of web pages with FireShot!'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-5446497831577819904</id><published>2007-11-02T08:59:00.000+01:00</published><updated>2007-11-02T09:01:42.032+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VS2005'/><title type='text'>VS: Copy Sourcecode as Html</title><content type='html'>Although I've a javascript on this blog running to highlight code, &lt;a href="http://www.jtleigh.com/people/colin/software/CopySourceAsHtml/"&gt;this solution&lt;/a&gt; might be a lot easier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-5446497831577819904?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/5446497831577819904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=5446497831577819904' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/5446497831577819904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/5446497831577819904'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2007/11/vs-copy-sourcecode-as-html.html' title='VS: Copy Sourcecode as Html'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-2318115753574077127</id><published>2007-10-29T07:37:00.000+01:00</published><updated>2007-10-29T07:40:59.809+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='VS2005'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>XSS detection tool for VS2005</title><content type='html'>&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=19A9E348-BDB9-45B3-A1B7-44CCDCB7CFBE&amp;displaylang=en"&gt;Microsoft download&lt;/a&gt; has now a tool to detect XSS leaks in ASP.NET code.&lt;br /&gt;&lt;br /&gt;&lt;quote&gt;XSSDetect is a static code analysis tool that helps identify Cross-Site Scripting security flaws found within Web applications. It is able to scan compiled managed assemblies (C#, Visual Basic .NET, J#) and analyze dataflow paths from sources of user-controlled input to vulnerable outputs. It also detects whether proper encoding or filtering has been applied to the data and will ignore such "sanitized" paths.&lt;br /&gt;&lt;/quote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-2318115753574077127?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/2318115753574077127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=2318115753574077127' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/2318115753574077127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/2318115753574077127'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2007/10/xss-detection-tool-for-vs2005.html' title='XSS detection tool for VS2005'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-5596039206010979448</id><published>2007-10-26T10:09:00.000+02:00</published><updated>2008-06-16T14:30:00.646+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VS2005'/><title type='text'>VS 2005 Tortoise Integration</title><content type='html'>For Visual Studio 2005, settings to work with TortoiseSVN within the GUI:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://garrys-brain.blogspot.com/2006/11/visual-studio-2005-and-tortoisesvn.html"&gt;VS 2005 Tortoise Integration&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-5596039206010979448?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/5596039206010979448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=5596039206010979448' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/5596039206010979448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/5596039206010979448'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2007/10/vs-2005-tortoise-integration.html' title='VS 2005 Tortoise Integration'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-5868029301039536616</id><published>2007-08-02T19:15:00.000+02:00</published><updated>2007-08-02T22:57:02.309+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>Into .Net 3.5</title><content type='html'>Last week, Microsoft released Beta 2 of VS 2008 (Orcas) with the .NET framework version 3.5. It is released with a go live license, so you can assume it's feature complete now.&lt;br /&gt;There are some small bugs though, but nevertheless it is a good piece of software to work with.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Linq and Lambda functions&lt;/span&gt;&lt;br /&gt;A great new feature is linq, and playing with some thoughts and digging up the old &lt;a href="http://w3.win.tue.nl/nl/onderzoek/onderzoek_informatica/visualization/sequoiaview//"&gt;Sequoia View&lt;/a&gt; I decided to build a proof of concept of this program in .NET 3.5.&lt;br /&gt;&lt;br /&gt;The first step is to assemble a collection of files and directories from a drive.  Linq and Lambda queries works quite straightforward here; after filling a large list with a custom FileSystemEntry class, it's quite easy to get data from this list.&lt;br /&gt;In the old days, getting a List entry with a specific property value needed a lot of coding. With the net .NET it's like this:&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;List&amp;lt;FileSystemEntry&amp;gt; list = GetList();&lt;br /&gt;FileSystemEntry testId = &lt;br /&gt;    list.First(listEntry =&amp;gt; listEntry.Id == "test");&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Or just some plain linq to retrieve some entries form the list in a new smaller list:&lt;br /&gt;&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;List&amp;lt;FileSystemEntry&amp;gt; list = GetList();&lt;br /&gt;var entries = from entry &lt;br /&gt;    in list &lt;br /&gt;    where entry.ParentId == "test" &lt;br /&gt;    select entry;&lt;br /&gt;List&amp;lt;FileSystemEntry&amp;gt; childEntries = entries.ToList();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;So basically, you can build with this two code blocks a Parent and a Children property on your class, given a List of objects where you can save your object Id and ParentId. Quite easy and straightforward to use.&lt;br /&gt;&lt;br /&gt;In a next post, I will cover building a TreeMap of your disc with XAML and WPF.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-5868029301039536616?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/5868029301039536616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=5868029301039536616' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/5868029301039536616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/5868029301039536616'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2007/08/into-net-35.html' title='Into .Net 3.5'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-6175171721181110428</id><published>2007-07-19T21:05:00.000+02:00</published><updated>2007-08-02T22:57:40.797+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Firefox extensions</title><content type='html'>Maybe is &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/2497"&gt;CookieSafe&lt;/a&gt; the perfect solution for cookie management?&lt;br /&gt;And &lt;a href="https://addons.mozilla.org/firefox/addon/1843"&gt;Firebug &lt;/a&gt;is far better then the webdev toolbar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-6175171721181110428?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/6175171721181110428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=6175171721181110428' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/6175171721181110428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/6175171721181110428'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2007/07/firefox-cookie-manager.html' title='Firefox extensions'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-6458720901503767292</id><published>2007-07-11T12:00:00.000+02:00</published><updated>2008-06-16T14:30:51.037+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Certification'/><title type='text'>MCSD!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_ZWHxGFTVlMU/RrJEFtmO63I/AAAAAAAAAFY/L2mEpNyNH-o/s1600-h/MCSD(rgb).png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_ZWHxGFTVlMU/RrJEFtmO63I/AAAAAAAAAFY/L2mEpNyNH-o/s200/MCSD(rgb).png" border="0" alt=""id="BLOGGER_PHOTO_ID_5094208993439443826" /&gt;&lt;/a&gt;&lt;br /&gt;Got my MCSD today!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-6458720901503767292?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/6458720901503767292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/6458720901503767292'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2007/07/mcsd.html' title='MCSD!'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_ZWHxGFTVlMU/RrJEFtmO63I/AAAAAAAAAFY/L2mEpNyNH-o/s72-c/MCSD(rgb).png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-1644701755296940905</id><published>2007-06-16T15:43:00.000+02:00</published><updated>2007-06-16T15:45:41.326+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Syntax Highlighting on blog</title><content type='html'>I'm currently working on client side syntax highlighting on this blog. It's possible some code is collored in a strange way... but that's because this is work in progress.&lt;br /&gt;&lt;br /&gt;It's basically done with css and javascript regular expressions. Take a look at the source code to see how.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-1644701755296940905?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/1644701755296940905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=1644701755296940905' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/1644701755296940905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/1644701755296940905'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2007/06/syntax-highlighting-on-blog.html' title='Syntax Highlighting on blog'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-2322710165557567980</id><published>2007-06-16T14:43:00.004+02:00</published><updated>2011-07-31T23:00:12.888+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Interop'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Threading, Word Interop and processes</title><content type='html'>A not so nice thing with threading is you can't kill threads running unmanaged (and so Office Interop) code.&lt;br /&gt;&lt;br /&gt;A quick and dirty way to handle those things is use the diagnostic library to kill the process with the unmanaged code name. An example with word gives:&lt;br /&gt;&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;using System.Threading;&lt;br /&gt;using Microsoft.Office.Interop.Word;&lt;br /&gt;&lt;br /&gt;namespace WordThreadingTest&lt;br /&gt;{&lt;br /&gt;class Program&lt;br /&gt;{&lt;br /&gt; static void Main(string[] args)&lt;br /&gt; {&lt;br /&gt;  ApplicationClass apc = new ApplicationClass();&lt;br /&gt;  Application app = apc.Application;&lt;br /&gt;  object missingValue = Type.Missing;&lt;br /&gt; &lt;br /&gt;  Thread t = new Thread(RunWord);&lt;br /&gt;  string filename = @"D:\My Documents\Visual Studio 2005\Projects\WordThreadingTest\test.rtf";&lt;br /&gt;  Console.WriteLine("start thread");&lt;br /&gt;  t.Start(app);                          // Run WriteY on the new thread&lt;br /&gt;  Thread.Sleep(50000);&lt;br /&gt;  if (t.IsAlive)&lt;br /&gt;  {&lt;br /&gt;   object myFalse = false;&lt;br /&gt;   Console.WriteLine("quit app on main thread");&lt;br /&gt;   app.Quit(ref missingValue, ref missingValue, ref missingValue);&lt;br /&gt;   t.Abort();&lt;br /&gt;   Process[] pProcess;&lt;br /&gt;&lt;br /&gt;   pProcess = Process.GetProcessesByName("WINWORD");&lt;br /&gt;&lt;br /&gt;   pProcess[0].Kill();&lt;br /&gt;  &lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private static void RunWord(object application)&lt;br /&gt; {&lt;br /&gt;  Application app = (Application) application;&lt;br /&gt;  app.DisplayAlerts = WdAlertLevel.wdAlertsNone;&lt;br /&gt;  object filename = @"D:\My Documents\Visual Studio 2005\Projects\WordThreadingTest\test.rtf";&lt;br /&gt; &lt;br /&gt;  // Open the document to print...&lt;br /&gt;  object missingValue = Type.Missing;&lt;br /&gt;&lt;br /&gt;  // use OpenOld so as to be compatible with other versions of&lt;br /&gt;// word&lt;br /&gt;Console.WriteLine("open file");&lt;br /&gt;  Document document = app.Documents.OpenOld(ref filename,&lt;br /&gt;   ref missingValue, ref missingValue,&lt;br /&gt;   ref missingValue, ref missingValue, ref missingValue,&lt;br /&gt;   ref missingValue, ref missingValue, ref missingValue,&lt;br /&gt;   ref missingValue);&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;   object myTrue = true; // Print in background&lt;br /&gt;   object myFalse = false;&lt;br /&gt;&lt;br /&gt;   app.ActivePrinter = "Adobe PDF";&lt;br /&gt;   // Using PrintOutOld to be version independant&lt;br /&gt;   Console.WriteLine("print file");&lt;br /&gt;   app.ActiveDocument.PrintOutOld(ref myTrue,&lt;br /&gt;    ref myFalse, ref missingValue, ref missingValue,&lt;br /&gt;    ref missingValue, ref missingValue, ref missingValue,&lt;br /&gt;    ref missingValue, ref missingValue, ref missingValue,&lt;br /&gt;    ref myFalse, ref missingValue, ref missingValue,&lt;br /&gt;    ref missingValue);&lt;br /&gt;   Console.WriteLine("close file");&lt;br /&gt;   document.Close(ref missingValue, ref missingValue, ref missingValue);&lt;br /&gt;&lt;br /&gt;  // Make sure all of the documents are gone from the queue&lt;br /&gt;  while(app.BackgroundPrintingStatus &gt; 0)&lt;br /&gt;  {&lt;br /&gt;   Console.WriteLine("waiting...");&lt;br /&gt;   Thread.Sleep(250);&lt;br /&gt;  }&lt;br /&gt;  Console.WriteLine("quit app on thread");&lt;br /&gt;  app.Quit(ref missingValue, ref missingValue, ref missingValue);&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-2322710165557567980?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/2322710165557567980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=2322710165557567980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/2322710165557567980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/2322710165557567980'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2007/06/threading-word-interop-and-and.html' title='Threading, Word Interop and processes'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-160609446341093171</id><published>2007-06-16T14:43:00.001+02:00</published><updated>2007-08-02T23:12:19.697+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='DevDays'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>DevDays Amsterdam 2007</title><content type='html'>&lt;span style="font-style: italic;"&gt;This one in Dutch:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Verslag Microsoft DevDays 2007&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;13 en 14 juni 2007, Amsterdam&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;De Microsoft DevDays is een congres waar de laatste ins en outs op het gebied van software development van Microsoft behandeld worden. Aan de ene kant worden er nieuwe, aankomende producten en technieken behandeld, terwijl aan de andere kant bestaande, meestal minder bekende producten, worden gedemonstreerd.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Aankomende producten&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;De keynote van de DevDays werd gehouden door Scott Guthrie , General Manager bij de Microsoft Developer Division, waarbinnen hij onder andere verantwoordelijk is voor ASP.NET, de CLR, WFP, Silverlight en Visual Web Developer. In de keynote ging hij vooral in op Silverlight.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Silverlight&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://msguayaquil.com/blogs/julioc/Imagenes/microsoft_silverlight.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="http://msguayaquil.com/blogs/julioc/Imagenes/microsoft_silverlight.jpg" alt="" border="0" /&gt;&lt;/a&gt;Kort door de bocht is Silverlight Microsofts implementatie van flash. In de bewoording van Microsoft is Silverlight de manier om RIA’s te bouwen (Rich Internet Applications). Aangezien Microsoft met WPF een techniek heeft om visueel aantrekkelijke applicaties te bouwen voor het Windows platform, is Silverlight de manier om deze technieken naar de browser te brengen. In dat opzicht is Silverlight meer dan flash. Waar flash een binair bestandsformaat kent, is de basis van Silverlight een XAML bestand, waarnaast een code behind werkt om de code in te bewaren. Met het XAML bestand kan je fantastische dingen doen. Een ander voordeel van werken op deze manier is dat, net als bij ASP.NET, de opmaak en code gescheiden zijn zodat er makkelijker met designers samengewerkt kan worden.&lt;br /&gt;Silverlight ondersteunt AJAX-achtige technieken, en is het mogelijk om in de 1.0 versie via javascript met pagina-objecten en Silverlight component te communiceren. Verder weg in de toekomst ligt de 1.1 versie, waar Microsoft een paar andere ontwikkellijnen laat samenkomen. Die versies ondersteunen namelijk client side .Net talen met een beperkte subset van de .Net bibliotheken. Client side code kan dan met behulp van Silverlight in C# geschreven worden, waar precies dezelfde functies aangeroepen kunnen worden als in een server side script. Als bonus zal dit alles beter performen dan client side javascript.&lt;br /&gt;Een heftige claim, maar pas als microsoft een demo met een video editor in een browser te voorschijn tovert zie je pas echt hoe krachtig het concept is.  Tot slot is Silverlight browser onafhankelijk. Microsoft heeft zelf Windows versies voor IE en Firefox geschreven en een Mac versie gemaakt. De mensen van het Mono project zijn momenteel hard bezig om een Linux versie op de rails te zetten onder de naam Moonlight .&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Design wordt makkelijker&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aan het einde van komend jaar komt Microsoft met de nieuwe Visual Studio 2008 uit. Microsoft is meer bezig met designers. Nu al is de expression suite van programma’s uitgekomen waar (web)designers uitgebreide mogelijkheden hebben om schitterende creaties te maken. Deze tools werken echter met dezelfde projectformaten als Visual studio, zodat ontwikkelaars en designers niet meer bestanden over en weer hoeven te slepen, maar eigenlijk met verschillende tools op dezelfde bron werkt, inclusief source control.&lt;br /&gt;Daarnaast kent Visual Studio stukken verbeterde CSS support. Niet alleen zullen asp.net controls beter met CSS kunnen samenwerken, ook kan VS veel makkelijker met css bestanden werken en precies kunnen laten zien vanwaar een bepaalde opmaak op een element vandaan komt.&lt;br /&gt;Tot slot is de split design mode van onder andere Dreamweaver nu ook in VS beschikbaar. Dat wil dus zeggen dat je tegelijker tijd in design en code vensters kan werken. En als je dat toch niet zo prettig vind, beloofd men dat het schakelen tussen deze twee vensters stukken sneller geworden is.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Javascript support&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Een andere in het oog springende aanpassing van Visual Studio is de ondersteuning van client side javascript in web projecten. En met ondersteuning wordt dan ook volledige IntelliSense (zie afbeelding) en debug mogelijk¬heden bedoeld. In de huidige AJAX wereld is dit dan ook echt onontbeerlijk. Met deze verbeteringen worden nu dan ook het bouwen van AJAX controls volledig ondersteund. Er zullen hiervoor standaard templates aanwezig zijn, aangezien de AJAX toolkit standaard in .Net 3.5 ingebakken zit.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;.Net Framework 3.5&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Naast de genoemde AJAX toolkit (die nu nog als losse download aangeboden wordt), is de belangrijkste toevoeging aan het framework LINQ. LINQ is een querytaal waarmee een willekeurige datastore vanuit je programmacode bevraagd kan worden. Hiervoor zijn er een hoop extra uitbreidingen op het framework ook noodzakelijk geworden, zoals anonieme types (het initialiseren van een variabele met het keyword var) en delta functies. Erg ingewikkelde concepten om hier uit te leggen, maar niet nodig om te begrijpen als je met LINQ aan de slag wil. LINQ zorgt namelijk dat er automatisch objecten aangemaakt worden als je bijvoorbeeld met een database werkt. Het volgende stukje code kan echter op verschillende datastores betrekking hebben.&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;var q =&lt;br /&gt; from c in db.Customers&lt;br /&gt; where c.City == "London"&lt;br /&gt; select c;&lt;br /&gt;foreach (Customer c in q)&lt;br /&gt; Console.WriteLine(c.CompanyName);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Zo kan LINQ deze code vertalen (afhankelijk van het hier genoemde db object) naar een SQL Query, naar een XML bestand, of elke zelf geschreven LINQ translator.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Huidige producten&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Naast al dat nieuws heeft de DevDays een heleboel demonstraties te bieden van bestaande technieken. Een aantal sessies richtte zich op “Paterns &amp;amp; Practices”, en dan vooral op het gebruik van de Enterprise Library  en de Software Factories. Clemens Reijnen hield een presentatie over de WebService Software Factory (WSSF). Zoals de naam al zegt produceert een softwarefactory software (code), die voldoet aan de eisen die jij specificeert. De SF zal hierbij de ontwikkelaar leiden door het proces, rekening kunnen houden met richtlijnen ten opzichte van beveiliging en code standaarden. In het door hem gegeven voorbeeld met zowel versie 2 als versie 3 van de WSSF kan er hierdoor snel goede functionerende code geschreven worden. Daarnaast is een voordeel dat er eerst een model van de werkelijkheid gebouwd wordt, waardoor in versie 3 bijvoorbeeld pas op het laatst het gebruikte deployment model voor de webservice gekozen moet worden (in dit geval WCF of asmx). Er is hier natuurlijk een ding wat er voor de ontwikkelaar over blijft, en dat is het implementeren van de business logica.&lt;br /&gt;Francesco Balena de eerste dag een presentatie over het gebruik van custom attributes en reflectie in het .net framewerk. Dit zijn twee onderbelichte eigenschappen van het framewerk die nauw met elkaar samenhangen. Met eigen gebouwde attributen is het mogelijk om metadata aan je eigen code toe te voegen. De reflectie bibliotheek is er juist om meer te weten te komen over de gebruikte code. De IntelliSense functionaliteit in Visual Studio wordt bijvoorbeeld opgebouwd door met behulp van de reflectie functies alle types met hun members uit een assembly te laden. In zijn praatje werd na de introductie een immense hoeveelheid voorbeelden over de zaal uitgestort.&lt;br /&gt;Dino Esposito vertelde uitgebreid over de AJAX toolkit die verschenen is in januari van dit jaar. AJAX is de techniek om rijke web toepassingen te schrijven. De belangrijkste basis hiervan is het asynchroon maken van websites, waardoor op de achtergrond de communicatie plaats vind met de webserver, terwijl de gebruiker verder kan gaan op de oorspronkelijk pagina zonder op een refresh te moeten wachten. In de AJAX toolkit kan er op twee manieren hiermee omgegaan worden. De eerste is partial rendering, de andere is door te werken met remote services.&lt;br /&gt;Deze laatste methode werkt over het algemeen met veel javascript, en vereist dat er zelf webservices aangeroepen en geschreven moeten worden door de programmeur. Voor bestaande websites betekend dit dat grote stukken code herschreven moeten worden. Vandaar dat er de eerste methode is, die op basis van brokjes html werkt en past binnen het asp.net 2.0 applicatie model. Op basis van het AJAX UpdatePanel control kan je namelijk met een snel in een eerder geschreven asp.net website AJAX principes invoegen. Alles wat binnen een updatepanel staat kan bijgewerkt worden, terwijl de pagina buiten het panel blijft staan zonder last te hebben van flikkeringen of dat je zelf javascript moet schrijven. Alle benodigde javascript browser code wordt namelijk door de UpdatePanel samen met het benodigde ScriptManager Control uitgeschreven.&lt;br /&gt;Daarnaast bevat de UpdatePanel een aantal standaard functionaliteit zoals conditionele updates, standaard fout afhandeling en mogelijkheid tot het geven van voortgangsindicatoren.&lt;br /&gt;&lt;br /&gt;Door de verscheidenheid van de presentaties  is er een hoop te ontdekken op de DevDays. Het is een ideale gelegenheid om nieuwe ideeën op te doen die je in je dagelijkse werkzaamheden kunnen helpen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-160609446341093171?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/160609446341093171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=160609446341093171' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/160609446341093171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/160609446341093171'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2007/06/devdays-amsterdam-2007.html' title='DevDays Amsterdam 2007'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-8040545776030948054</id><published>2007-05-14T13:19:00.000+02:00</published><updated>2007-05-14T13:21:21.926+02:00</updated><title type='text'>Build Smarter ASP.NET File Downloading Into Your Web Applications</title><content type='html'>&lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/09/webdownloads/default.aspx"&gt;Web Downloads: Build Smarter ASP.NET File Downloading Into Your Web Applications&lt;/a&gt;: "Today many files can’t be downloaded the old fashioned way.  Instead the browser usually wants to open them in another app. Here Joe Stagner discusses a workaround in ASP.NET."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-8040545776030948054?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/8040545776030948054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=8040545776030948054' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/8040545776030948054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/8040545776030948054'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2007/05/uild-smarter-aspnet-file-downloading.html' title='Build Smarter ASP.NET File Downloading Into Your Web Applications'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-1866928053992654224</id><published>2007-04-27T13:01:00.000+02:00</published><updated>2007-05-30T10:47:09.873+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>C# Catch COM exception on HRESULT</title><content type='html'>Quite straightforward, but had to look it up today. The HRESULT of a COM call in C# can be used to catch errors. If the COM component throws an error, it can be used like:&lt;br /&gt;&lt;br /&gt;&lt;code class="csharp"&gt;&lt;br /&gt;uint const HRESULT_ERROR = 0x80000000;&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;CallCom();&lt;br /&gt;}&lt;br /&gt;catch (COMException comEx)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (comEx.ErrorCode == unchecked((int)HRESULT_ERROR))&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DoSomething();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Edit:&lt;/strong&gt; Okay, made an mistake with this. HRESULT is an unsigned integer, so comparing it with an integer is not a good idea. We need to cast it unchecked to an integer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-1866928053992654224?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/1866928053992654224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=1866928053992654224' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/1866928053992654224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/1866928053992654224'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2007/04/c-catch-com-exception-on-hresult.html' title='C# Catch COM exception on HRESULT'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-358664204329398789</id><published>2007-03-22T16:34:00.000+01:00</published><updated>2007-03-22T16:36:44.567+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><title type='text'>Page Events</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_ZWHxGFTVlMU/RgKigqbaUeI/AAAAAAAAABw/Y5Ne_9GjJGY/s1600-h/ASP.Net_Page_LifeCycle.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_ZWHxGFTVlMU/RgKigqbaUeI/AAAAAAAAABw/Y5Ne_9GjJGY/s400/ASP.Net_Page_LifeCycle.jpg" alt="" id="BLOGGER_PHOTO_ID_5044773214637150690" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-358664204329398789?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/358664204329398789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=358664204329398789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/358664204329398789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/358664204329398789'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2007/03/page-events.html' title='Page Events'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_ZWHxGFTVlMU/RgKigqbaUeI/AAAAAAAAABw/Y5Ne_9GjJGY/s72-c/ASP.Net_Page_LifeCycle.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-7812898720346967525</id><published>2007-03-16T13:56:00.000+01:00</published><updated>2007-03-16T14:00:37.553+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Database Publishing Wizard</title><content type='html'>Finally a Microsoft solution to get a dump of your database in a SQL script file: the &lt;a href="http://www.codeplex.com/sqlhost"&gt;Database Publishing Wizard&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-7812898720346967525?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/7812898720346967525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=7812898720346967525' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/7812898720346967525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/7812898720346967525'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2007/03/database-publishing-wizard.html' title='Database Publishing Wizard'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-7594440641467479227</id><published>2007-02-23T10:32:00.000+01:00</published><updated>2007-06-16T15:30:22.369+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><title type='text'>JavaScript Warning while using the backspace button to go back</title><content type='html'>With all the new AJAX stuff around, using the back button can be disadvantageous for keeping your form values. While filling in forms it is very easy to press the backspace button by mistake while not in a input field and going back to your previous page.&lt;br /&gt;So the best way is to let the user acknowledge the page transition while using the backspace button. It is possible to use an onbeforeunload event to confirm leaving the page, but this event also wants confirmation on following links and other exiting events.&lt;br /&gt;&lt;br /&gt;I solved the program with the following javascript code:&lt;br /&gt;&lt;code class="javascript"&gt;&lt;br /&gt;var bConfirmExit = false;&lt;br /&gt;function closeIt()&lt;br /&gt;{&lt;br /&gt;    if (bConfirmExit)&lt;br /&gt;    {&lt;br /&gt;        event.returnValue = "Bij het verlaten van deze pagina verliest u de ingevoerde gegevens.";&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;function resetExit()&lt;br /&gt;{&lt;br /&gt;    bConfirmExit = false;&lt;br /&gt;}&lt;br /&gt;function checkBS()&lt;br /&gt;{&lt;br /&gt;    if (event.keyCode == 8)&lt;br /&gt;    {&lt;br /&gt;        bConfirmExit = true;&lt;br /&gt;        setTimeout("resetExit()",200);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and linked the following events in the body tag:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;body onbeforeunload="closeIt()" onkeydown="checkBS()"&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-7594440641467479227?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/7594440641467479227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=7594440641467479227' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/7594440641467479227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/7594440641467479227'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2007/02/javascript-warning-while-using.html' title='JavaScript Warning while using the backspace button to go back'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-116241781445842108</id><published>2006-11-01T22:50:00.000+01:00</published><updated>2007-03-23T00:36:02.907+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Spinning the Web: Retrieving "Date Taken" EXIF Metadata From a JPG</title><content type='html'>Processing EXIF data from jpegs. A how to with the date taken.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://spinningtheweb.blogspot.com/2006/06/retrieving-date-taken-exif-metadata.html"&gt;Spinning the Web: Retrieving "Date Taken" EXIF Metadata From a JPG&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-116241781445842108?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/116241781445842108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=116241781445842108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/116241781445842108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/116241781445842108'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2006/11/spinning-web-retrieving-date-taken.html' title='Spinning the Web: Retrieving &quot;Date Taken&quot; EXIF Metadata From a JPG'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-116241770429191174</id><published>2006-11-01T22:48:00.000+01:00</published><updated>2007-03-23T00:36:31.147+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Spinning the Web: The C# Coalesce Operator</title><content type='html'>&lt;a href="http://spinningtheweb.blogspot.com/2006/09/c-coalesce-operator.html"&gt;Spinning the Web: The C# Coalesce Operator&lt;/a&gt;&lt;br /&gt;Interesting feature... The ?? mark. Dropped here to remember.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-116241770429191174?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/116241770429191174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=116241770429191174' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/116241770429191174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/116241770429191174'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2006/11/spinning-web-c-coalesce-operator.html' title='Spinning the Web: The C# Coalesce Operator'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-115158131744514093</id><published>2006-06-29T13:39:00.000+02:00</published><updated>2007-03-23T00:37:32.415+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Change searchbar width in FireFox</title><content type='html'>&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;Change the width of the Search Bar&lt;/dt&gt;&lt;br /&gt; &lt;dd&gt;&lt;p&gt;By default, the Search bar on the toolbar is relatively small. To&lt;br /&gt; specify your own width in pixels, add the following code to your userChrome.css file:&lt;/p&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;span class="comment"&gt;/* Make the Search box flex wider&lt;br /&gt;  (in this case 400 pixels wide) */&lt;/span&gt;&lt;br /&gt;#search-container, #searchbar {&lt;br /&gt;  -moz-box-flex: 400 !important;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-115158131744514093?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/115158131744514093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=115158131744514093' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/115158131744514093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/115158131744514093'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2006/06/change-searchbar-width-in-firefox.html' title='Change searchbar width in FireFox'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-115018769410487677</id><published>2006-06-13T10:34:00.000+02:00</published><updated>2007-03-23T00:37:17.097+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>WebChart Control for ASP.NET</title><content type='html'>&lt;div xmlns="http://purl.org/atom/ns#"&gt;      Finaly found a simple and easy to use charting control.      &lt;p&gt;        Read more at        &lt;a href="http://www.carlosag.net/Tools/WebChart/Default.aspx"&gt;www.carlosag.net/Tools/...&lt;/a&gt;      &lt;/p&gt;    &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-115018769410487677?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/115018769410487677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=115018769410487677' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/115018769410487677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/115018769410487677'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2006/06/webchart-control-for-aspnet.html' title='WebChart Control for ASP.NET'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-114674558319180871</id><published>2006-05-04T14:26:00.000+02:00</published><updated>2007-03-23T00:37:58.307+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Popular Firefox extensions leak memory - Lifehacker</title><content type='html'>&lt;div xmlns="http://purl.org/atom/ns#"&gt;      &lt;p&gt;        Just stumbled upon a Lifehacker post about memory leaks of Firefox. So I ditched my SessionSaver and ForecastFox and installed        &lt;a href="http://tmp.garyr.net/"&gt;Tab Mix Plus&lt;/a&gt;        .      &lt;/p&gt;      &lt;p&gt;        Read more at        &lt;a href="http://www.lifehacker.com/software/optimization/popular-firefox-extensions-leak-memory-165193.php"&gt;www.lifehacker.com/soft...&lt;/a&gt;      &lt;/p&gt;    &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-114674558319180871?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/114674558319180871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=114674558319180871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/114674558319180871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/114674558319180871'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2006/05/popular-firefox-extensions-leak-memory.html' title='Popular Firefox extensions leak memory - Lifehacker'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-114287618911371833</id><published>2006-03-20T18:34:00.000+01:00</published><updated>2007-03-23T00:38:10.280+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Latex'/><title type='text'>LaTeX label-ref confusion</title><content type='html'>In a part of my thesis, my references were mixed up... after an hour digging it is pretty simple: use the \label statement &lt;span style="font-weight: bold;"&gt;after&lt;/span&gt; your caption statement in a table, otherwise you'll reference the section instead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-114287618911371833?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/114287618911371833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=114287618911371833' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/114287618911371833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/114287618911371833'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2006/03/latex-label-ref-confusion.html' title='LaTeX label-ref confusion'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-114056044749796792</id><published>2006-02-21T23:15:00.000+01:00</published><updated>2007-03-23T00:37:44.601+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Greasemonkeyed Postbank Girotel Zakelijk</title><content type='html'>I've got fed up with the online banking client for buisiness customers of Postbank. I'm working with more persons on this account, with different bank accounts. I only use one of them, but the website always assumes an other account as default (and an error is quick made with selecting the which account to transfer from). Therefor, I builded a greasemonkey script for firefox to select my prefered account.&lt;br /&gt;&lt;br /&gt;Just edit the voorkeurNummer variable.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var selBox = document.getElementsByName('selRekNummer').item(0);&lt;br /&gt;var voorkeurNummer = '123456';&lt;br /&gt;&lt;br /&gt;if (selBox.hasChildNodes())&lt;br /&gt;// So, first we check if the object is not empty,&lt;br /&gt;//   if the object has child nodes&lt;br /&gt;{&lt;br /&gt;var children = selBox.childNodes;&lt;br /&gt;&lt;br /&gt;//run only if selBox has no onChange attribute&lt;br /&gt;if ((selBox.getAttribute('onChange') == null ))&lt;br /&gt;{&lt;br /&gt;  for (var i = 0; i &lt; chilatt =" children[i].attributes;" tagname ="=" j =" 0;" name ="=" value ="=" selectedindex =" i"&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-114056044749796792?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/114056044749796792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=114056044749796792' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/114056044749796792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/114056044749796792'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2006/02/greasemonkeyed-postbank-girotel.html' title='Greasemonkeyed Postbank Girotel Zakelijk'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-113870759855708231</id><published>2006-01-31T12:36:00.000+01:00</published><updated>2008-06-16T14:31:45.226+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><title type='text'>Monad Dir Highlighting</title><content type='html'>I'm currently experimenting with the new microsoft shell monad. I always liked the directory en executable highlighting in the linux shell, so I just build a quick script to highlight the directories in an ls query.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$colItems = dir&lt;br /&gt;foreach ($objItem in $colItems)&lt;br /&gt;{&lt;br /&gt;  if ($objItem.MshIsContainer )&lt;br /&gt;  &lt;/code&gt;&lt;code&gt;{&lt;/code&gt;&lt;code&gt; write-host $objItem.Name -foregroundcolor "Blue"}&lt;br /&gt;  elseif ( ($objItem.Extension -eq ".exe") -or ($objItem.Extension -eq ".msh") )&lt;br /&gt;  { write-host $objItem.Name -foregroundcolor "Green" }&lt;br /&gt;  else&lt;br /&gt;  {write-host $objItem.Name}&lt;br /&gt;}&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-113870759855708231?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/113870759855708231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=113870759855708231' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113870759855708231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113870759855708231'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2006/01/monad-dir-highlighting.html' title='Monad Dir Highlighting'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-113830670507904611</id><published>2006-01-26T21:17:00.000+01:00</published><updated>2006-01-26T21:18:25.090+01:00</updated><title type='text'>Update linux distro</title><content type='html'>Installed some more packages:&lt;br /&gt;* yum install yumex&lt;br /&gt;* yum install alacarte&lt;br /&gt;* yum install gstreamer-plugins-mp3&lt;br /&gt;* rpm -ihv http://newrpms.sunsite.dk/apt/redhat/en/i386/fc3/RPMS.newrpms/xmms-status-plugin-1.0-2.rhfc3.nr.i386.rpm&lt;br /&gt;* yum install mplayer mplayer-skins mplayer-fonts&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-113830670507904611?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/113830670507904611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=113830670507904611' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113830670507904611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113830670507904611'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2006/01/update-linux-distro.html' title='Update linux distro'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-113751360847916634</id><published>2006-01-17T16:41:00.000+01:00</published><updated>2008-06-16T14:32:15.846+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><title type='text'>Remove Monad for .net 2.0 beta</title><content type='html'>I installed a beta for monad, the new Microsoft Shell, that needed the asp.net 2.0 beta. But after going live for Visual Studio, I couldn't remove monad, and it didn't run either because the .net beta wasn't available.&lt;br /&gt;&lt;br /&gt;How to correct this problem? I figured this out:&lt;br /&gt;&lt;br /&gt;So I deleted the Monad folders by hand and all the registry settings, and it worked :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-113751360847916634?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/113751360847916634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=113751360847916634' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113751360847916634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113751360847916634'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2006/01/remove-monad-for-net-20-beta.html' title='Remove Monad for .net 2.0 beta'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-113733423859136278</id><published>2006-01-15T15:10:00.000+01:00</published><updated>2006-01-15T15:13:47.476+01:00</updated><title type='text'>Basic Date Picker</title><content type='html'>&lt;div xmlns="http://purl.org/atom/ns#"&gt;      &lt;p&gt;Working on a couple of different .net web applications, i needed a good date picker. But since time is more a problem, i was looking for a good pre-build one. I think i found one:&lt;/p&gt;      &lt;p&gt;        See        &lt;a href="http://www.basicdatepicker.com/"&gt;www.basicdatepicker.com...&lt;/a&gt;      &lt;/p&gt;    &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-113733423859136278?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/113733423859136278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=113733423859136278' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113733423859136278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113733423859136278'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2006/01/basic-date-picker.html' title='Basic Date Picker'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-113676072617180740</id><published>2006-01-08T23:52:00.000+01:00</published><updated>2006-01-08T23:52:06.193+01:00</updated><title type='text'>Folder Size for Windows Explorer</title><content type='html'>&lt;div xmlns="http://purl.org/atom/ns#"&gt;      &lt;p&gt;it looks like you never have to right click on a folder to learn its size. With this little explorer extension, you've directly the size of the folder.&lt;/p&gt;      &lt;p&gt;        Program at        &lt;a href="http://foldersize.sourceforge.net/"&gt;foldersize.sourceforge....&lt;/a&gt;      &lt;/p&gt;    &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-113676072617180740?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/113676072617180740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=113676072617180740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113676072617180740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113676072617180740'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2006/01/folder-size-for-windows-explorer.html' title='Folder Size for Windows Explorer'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-113517322666962118</id><published>2005-12-21T14:51:00.000+01:00</published><updated>2005-12-21T14:53:46.676+01:00</updated><title type='text'>MSN Personal Messages in MSN 7</title><content type='html'>Bart De Smet has a good story about setting the MSN Personal Messages with the current appointment in your Outlook calendar.&lt;br /&gt;It is a well documented page&lt;br /&gt;&lt;br /&gt;Read more at &lt;a href="http://community.bartdesmet.net/blogs/bart/archive/2005/06/09/979.aspx"&gt;http://community.bartdesmet.net/...&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-113517322666962118?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/113517322666962118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=113517322666962118' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113517322666962118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113517322666962118'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2005/12/msn-personal-messages-in-msn-7.html' title='MSN Personal Messages in MSN 7'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-113508201057025061</id><published>2005-12-20T13:31:00.000+01:00</published><updated>2005-12-20T13:34:05.343+01:00</updated><title type='text'>FoxPro hell</title><content type='html'>I'm looking for a friend for some FoxPro 7 books, but it looks like in Holland you can only get "What's new in FoxPro 9". For some reason (MySQL, PostgreSQL, Oracle, SQL Server, anyone...) FoxPro isn't used much.&lt;br /&gt;Somebody a clue where to lookfor some nice manuals?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-113508201057025061?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/113508201057025061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=113508201057025061' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113508201057025061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113508201057025061'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2005/12/foxpro-hell.html' title='FoxPro hell'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-113507995233955158</id><published>2005-12-20T12:59:00.000+01:00</published><updated>2005-12-20T12:59:12.353+01:00</updated><title type='text'>Flickr: The Wallpaper Exchange Pool</title><content type='html'>&lt;div xmlns="http://purl.org/atom/ns#"&gt;      &lt;p&gt;Another wallpapersite, this one is a section on flickr. There are some diamonds in here!&lt;/p&gt;      &lt;p&gt;        Read more at        &lt;a href="http://www.flickr.com/groups/wallpaperxchange/pool/"&gt;www.flickr.com/groups/w...&lt;/a&gt;      &lt;/p&gt;    &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-113507995233955158?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/113507995233955158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=113507995233955158' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113507995233955158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113507995233955158'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2005/12/flickr-wallpaper-exchange-pool.html' title='Flickr: The Wallpaper Exchange Pool'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-113470187598495317</id><published>2005-12-16T03:43:00.000+01:00</published><updated>2007-03-23T00:38:19.059+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Firefox Extensions</title><content type='html'>A short list of which FF extensions I use:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://imagezoom.yellowgorilla.net/help/?source=options&amp;amp;version=0.2"&gt;Image Zoom&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://adblock.mozdev.org/"&gt;AdBlock&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/extensions/moreinfo.php?id=436"&gt;SessionSaver&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://chrispederick.com/work/webdeveloper/"&gt;Web Developer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cusser.net/extensions/disabletarget/"&gt;Disable Targets for Downloads&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ieview.mozdev.org/"&gt;IE View&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bookmarkshome.mozdev.org/"&gt;BookMarksHome&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://cdn.mozdev.org/linkToolbar/"&gt;Link Toolbar&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/tools/firefox/webcomments/index.html"&gt;Blogger Web Comments&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Especially SessionSaver and the Link Toolbar are very handy. I can't already live without it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-113470187598495317?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/113470187598495317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=113470187598495317' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113470187598495317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113470187598495317'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2005/12/firefox-extensions.html' title='Firefox Extensions'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-113468871875338010</id><published>2005-12-16T00:18:00.000+01:00</published><updated>2005-12-16T00:18:38.756+01:00</updated><title type='text'>Desktop Wallpapers</title><content type='html'>&lt;div xmlns="http://purl.org/atom/ns#"&gt;      &lt;p&gt;A nice site with good looking wallpapers.&lt;/p&gt;      &lt;p&gt;        Read more at        &lt;a href="http://www.desktopwallpapers.co.uk/"&gt;www.desktopwallpapers.c...&lt;/a&gt;      &lt;/p&gt;    &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-113468871875338010?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/113468871875338010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=113468871875338010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113468871875338010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113468871875338010'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2005/12/desktop-wallpapers.html' title='Desktop Wallpapers'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-113468857378703661</id><published>2005-12-16T00:14:00.000+01:00</published><updated>2007-03-23T00:38:33.014+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Firefox 1.5</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6013/1979/1600/Firefox_Version.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/6013/1979/320/Firefox_Version.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Altough there is a new Firefox browser, sometimes things can go wrong. Look at the installation of a new theme:&lt;br /&gt;Some WTF moments:&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-113468857378703661?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/113468857378703661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=113468857378703661' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113468857378703661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113468857378703661'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2005/12/firefox-15.html' title='Firefox 1.5'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-113468835778590146</id><published>2005-12-16T00:12:00.000+01:00</published><updated>2007-03-23T00:38:43.308+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>CSS Frames | 456 Berea Street</title><content type='html'>&lt;div xmlns="http://purl.org/atom/ns#"&gt;      &lt;p&gt;A very nice website on how to workout static headers and footers with css. It works great, so its on the way to the DZ website soon. Keep in mind to use the standard compliance mode of your browser to let this work!.&lt;/p&gt;      &lt;p&gt;        Read more at        &lt;a href="http://www.456bereastreet.com/lab/cssframes/"&gt;www.456bereastreet.com/...&lt;/a&gt;      &lt;/p&gt;    &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-113468835778590146?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/113468835778590146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=113468835778590146' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113468835778590146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113468835778590146'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2005/12/css-frames-456-berea-street.html' title='CSS Frames | 456 Berea Street'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-113468768555804306</id><published>2005-12-16T00:00:00.000+01:00</published><updated>2005-12-16T00:01:55.143+01:00</updated><title type='text'>First Post</title><content type='html'>My First BlogPost here... 2B continued&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-113468768555804306?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/113468768555804306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=113468768555804306' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113468768555804306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/113468768555804306'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2005/12/first-post.html' title='First Post'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-7353059111205993120</id><published>2005-01-01T00:00:00.019+01:00</published><updated>2010-07-05T22:52:26.170+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Certification'/><title type='text'>Certifications</title><content type='html'>This page is an overview of my certifications:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Microsoft Certifications&lt;ul&gt;&lt;li&gt;MCPD&lt;ul&gt;&lt;li&gt;Web Developer 4&lt;/li&gt;&lt;li&gt;ASP.NET Developer 3.5&lt;/li&gt;&lt;li&gt;Enterprise Application Developer&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;MCITP&lt;ul&gt;&lt;li&gt;Database Developer 2008&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;MCTS&lt;ul&gt;&lt;li&gt;.NET Framework 4, Windows Communication Foundation Applications&lt;/li&gt;&lt;li&gt;.NET Framework 4, Data Access with ADO.NET &lt;/li&gt;&lt;li&gt;.NET Framework 4, Web Applications&lt;/li&gt;&lt;li&gt;SQL Server 2008, Database Development&lt;/li&gt;&lt;li&gt;SQL Server 2008, Business Intelligence Development and Maintenance&lt;/li&gt;&lt;li&gt;.NET Framework 3.5, Windows Forms Applications&lt;/li&gt;&lt;li&gt;.NET Framework 3.5, ADO.NET Applications&lt;/li&gt;&lt;li&gt;.NET Framework 3.5, ASP.NET Applications&lt;/li&gt;&lt;li&gt;.NET Framework 2.0: Web Applications&lt;/li&gt;&lt;li&gt;.NET Framework 2.0: Distributed Applications&lt;/li&gt;&lt;li&gt;.NET Framework 2.0: Windows Applications&lt;/li&gt;&lt;li&gt;Microsoft Windows SharePoint Services 3.0: Application Development&lt;/li&gt;&lt;li&gt;Microsoft Office SharePoint Server 2007 – Application Development&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;MCSD&lt;ul&gt;&lt;li&gt;For Microsoft.NET&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;MCAD&lt;ul&gt;&lt;li&gt;For Microsoft.NET&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;MCP&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Other Certifications&lt;ul&gt;&lt;li&gt;Prince2 Foundation&lt;/li&gt;&lt;li&gt;ASL Foundation&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_ZWHxGFTVlMU/R9pDMNKc3WI/AAAAAAAABe0/SDaWv1G4TXw/s320/MCPD(rgb)_506.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5177524598586793314" /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_ZWHxGFTVlMU/TDJFmGI-k1I/AAAAAAAAC0o/Dr4EaR2Uyjk/s320/MCTS(rgb)_1373_1374_1370.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5490527416503669586" /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_ZWHxGFTVlMU/SIG2xE-v2jI/AAAAAAAABrI/XpihTnMIla4/s320/MCTS(rgb)_526_525_1102.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5224657996993255986" /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_ZWHxGFTVlMU/R9pEKtKc3XI/AAAAAAAABe8/Xe2EoEqtSto/s320/MCTS(rgb)_513_514_512.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5177525672328617330" /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_ZWHxGFTVlMU/R9pEhdKc3YI/AAAAAAAABfE/X8USG_qhs6w/s320/MCSD(rgb).png" border="0" alt=""id="BLOGGER_PHOTO_ID_5177526063170641282" /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_ZWHxGFTVlMU/R9pICdKc3dI/AAAAAAAABfs/nmYah0txAsI/s200/MCAD(rgb).png" border="0" alt=""id="BLOGGER_PHOTO_ID_5177529928641207762" width="112" /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_ZWHxGFTVlMU/R9pIK9Kc3eI/AAAAAAAABf0/3nfg9xBhjgI/s200/MCP(rgb).png" border="0" alt=""id="BLOGGER_PHOTO_ID_5177530074670095842" width="112" /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_ZWHxGFTVlMU/R9pErdKc3ZI/AAAAAAAABfM/3FHjbyyuAuw/s320/prince2_logo_120.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5177526234969333138" /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_ZWHxGFTVlMU/R9pE1tKc3aI/AAAAAAAABfU/vJnc8Ro3gYE/s320/asl_logo_100.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5177526411062992290" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-7353059111205993120?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gruntbuggly.blogspot.com/feeds/7353059111205993120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19906305&amp;postID=7353059111205993120' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/7353059111205993120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/7353059111205993120'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2005/01/certifications.html' title='Certifications'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_ZWHxGFTVlMU/R9pDMNKc3WI/AAAAAAAABe0/SDaWv1G4TXw/s72-c/MCPD(rgb)_506.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19906305.post-4388208340562440002</id><published>2005-01-01T00:00:00.000+01:00</published><updated>2008-02-01T21:26:22.277+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Software</title><content type='html'>&lt;span style=";font-family:trebuchet ms;font-size:130%;"  &gt;Windows Explorer Extensions&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.codesector.com/teracopy.asp"&gt;TeraCopy&lt;/a&gt; to resume copy/move operations in windows&lt;br /&gt;&lt;a href="http://minimalist.com/software/ExplorerBreadcrumbs/"&gt;Explorer Breadcrumbs&lt;/a&gt; to get Vista like breadcrumbs for your folder path&lt;br /&gt;&lt;a href="http://www.foldermarker.com/"&gt;Folder Marker&lt;/a&gt; to change icon's easily in Explorer&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:130%;"  &gt;Visual Studio Add-Ons&lt;/span&gt;&lt;br /&gt;&lt;a href="http://weblogs.asp.net/alex_papadimoulis/archive/2004/05/25/Smart-Paster-1.1-Add-In---StringBuilder-and-Better-C_2300_-Handling.aspx"&gt;Smart Paster&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.jetbrains.com/resharper/"&gt;ReSharper&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:130%;"  &gt;Tools&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.aisto.com/roeder/dotnet/"&gt;Roeder's Reflector&lt;/a&gt;&lt;br /&gt;&lt;span style=";font-family:trebuchet ms;font-size:130%;"  &gt;&lt;br /&gt;Firefox Plugins&lt;/span&gt;&lt;br /&gt;DownThemAll, CookieSafe, FireBug, Google Bookmarks Buton, IETab, Web Developer Toolbar, &lt;a href="http://screenshot-program.com/fireshot/"&gt;FireShot&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19906305-4388208340562440002?l=gruntbuggly.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/4388208340562440002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19906305/posts/default/4388208340562440002'/><link rel='alternate' type='text/html' href='http://gruntbuggly.blogspot.com/2005/01/software.html' title='Software'/><author><name>Niels</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>
