<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://ljusberg.se/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"><channel><title>ljusberg.se</title><link>http://ljusberg.se/blogs/</link><description /><dc:language>en-US</dc:language><generator>CommunityServer 2008 SP1 (Build: 30619.63)</generator><item><title>Blog moving</title><link>http://ljusberg.se/blogs/smorakning/archive/2010/08/11/blog-moving.aspx</link><pubDate>Wed, 11 Aug 2010 20:23:24 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:6282</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I’m moving and renaming this blog to &lt;a href="http://coding-insomnia.com"&gt;http://coding-insomnia.com&lt;/a&gt;. Will try to do some redirects eventually – but for now, please update any RSS-feeds and bookmarks to the new site!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=6282" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Blogging/default.aspx">Blogging</category></item><item><title>Intressant på DevSum 2010</title><link>http://ljusberg.se/blogs/smorakning/archive/2010/04/19/intressant-pa-devsum-2010.aspx</link><pubDate>Mon, 19 Apr 2010 18:42:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:6274</guid><dc:creator>anders</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Cornerstone har en konferens p&amp;aring; g&amp;aring;ng i sommar; &lt;a href="http://www.devsum.se/2010/Hem.html"&gt;Developer Summit 2010&lt;/a&gt; p&amp;aring; Nalen i Stockholm. Jag &amp;auml;r inbokad sedan ungef&amp;auml;r en vecka tillbaka!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.cornerstone.se/sv/Event/DevSum/2010/Seminarier/"&gt;M&amp;aring;nga seminarier&lt;/a&gt; blir det och jag har r&amp;auml;tt sv&amp;aring;rt att v&amp;auml;lja.. De k&amp;ouml;r ett antal olika teman (.Net/VS/TFS, Security, Metod, Webb, Mobile, Cloud och ett eget &amp;ldquo;sp&amp;aring;r&amp;rdquo; f&amp;ouml;r Patterns &amp;amp; Practices). T&amp;auml;nkte planera min personliga agenda h&amp;auml;r:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;a href="http://www.cornerstone.se/sv/Event/DevSum/2010/Seminarier/Alla-sessioner/Agenda-dag-1/"&gt;Dag 1.&lt;/a&gt;&lt;/h4&gt;
&lt;table cellpadding="2" cellspacing="0"&gt;

&lt;tr&gt;
&lt;td&gt;9.00&lt;/td&gt;
&lt;td&gt;Inledning och Keynote. &lt;/td&gt;
&lt;td&gt;Keynotet &amp;auml;r ju givet, och det ska bli v&amp;auml;ldigt sp&amp;auml;nnande att h&amp;ouml;ra P&amp;amp;P-teamets framtidsplaner.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.10&lt;/td&gt;
&lt;td&gt;Application Architecture Guide - P&amp;amp;P&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11.10&lt;/td&gt;
&lt;td&gt;Distributed .NET in Action - Christian Weyer&lt;/td&gt;
&lt;td&gt;Ska bli kul att se Christian. Han dyker ju upp lite h&amp;auml;r och var (senast jag h&amp;ouml;rde honom var nog i ett &lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=536"&gt;dotnetrocks om MonoTouch&lt;/a&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13.00&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;TFS, Agile hos P&amp;amp;P eller Windows Identity Foundation. Det jag egentligen k&amp;auml;nner mest f&amp;ouml;r d&amp;auml;r &amp;auml;r nog WIF, men fr&amp;aring;gan &amp;auml;r om man inte borde g&amp;aring;tt p&amp;aring; seminariet med WIF-introduktion f&amp;ouml;rst d&amp;aring;.. &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14.00&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;Aaarrghh! H&amp;auml;r krockar det. Antingen Troubleshooting performance i VS 2010, eller P&amp;amp;P - Patterns for Cloud. Sv&amp;aring;rt..! Kunde inte P&amp;amp;P byta plats p&amp;aring; denna och Agile-seminariet kanske?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15.10&lt;/td&gt;
&lt;td&gt;Andreas &amp;Ouml;hlund - Building enterprise applications with NServiceBus&lt;/td&gt;
&lt;td&gt;Ojd&amp;aring;, tv&amp;aring; Prism-seminarier samtidigt.. Fast om jag g&amp;aring;r Silverlight-workshoppen p&amp;aring; onsdagen s&amp;aring; f&amp;aring;r jag nog tillr&amp;auml;ckligt med MVVM osv &amp;auml;nd&amp;aring;.. S&amp;aring; det blir NServiceBus!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16.10&lt;/td&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;Lite taskigt att l&amp;aring;ta stackars Patrik och Daniel konkurrera med en P&amp;amp;P-panel. Den kunde v&amp;auml;l n&amp;auml;stan ha varit sist ist&amp;auml;llet? N&amp;aring;ja, f&amp;aring;r se hur det blir h&amp;auml;r. WCF Patterns l&amp;aring;ter ju inte s&amp;aring; dumt det heller.&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;a href="http://www.cornerstone.se/sv/Event/DevSum/2010/Seminarier/Alla-sessioner/Agenda-dag-2/"&gt;Dag 2.&lt;/a&gt;&lt;/h4&gt;
&lt;table cellpadding="2" cellspacing="0"&gt;

&lt;tr&gt;
&lt;td&gt;9.00&lt;/td&gt;
&lt;td&gt;Keynote med P&amp;aring;l Ross&lt;/td&gt;
&lt;td&gt;Kul med en riktig arkitekt!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10.10&lt;/td&gt;
&lt;td&gt;Reactive, Asynchronous, och Concurrent Programming med F# - Hans Sterby&lt;/td&gt;
&lt;td&gt;F# har jag &amp;auml;gnat p&amp;aring; tok f&amp;ouml;r lite tid &amp;aring;t. Jag &amp;auml;r ju egentligen en stor fan av funktionell programmering men sen man b&amp;ouml;rjade jobba har det inte blivit s&amp;aring; mycket tr&amp;auml;ning d&amp;auml;r..&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11.10&lt;/td&gt;
&lt;td&gt;Introduktion till F# &amp;ndash; Hans Sterby&lt;/td&gt;
&lt;td&gt;Ser lite konstigt ut att ha introduktion till F# som steg tv&amp;aring; i F#-sp&amp;aring;ret..? &lt;br /&gt;&lt;br /&gt;Funderar iofs lite p&amp;aring; Pomodoro med Staffan N&amp;ouml;teberg ist&amp;auml;llet. Fast jag &amp;auml;r skeptisk.. Verkligen fokusera i 25 minuter? Jag gillar ju att avbryta mig sj&amp;auml;lv hela tiden..!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13.00&lt;/td&gt;
&lt;td&gt;Professional Source Code Management &amp;ndash; Fredrik Haglund&lt;/td&gt;
&lt;td&gt;Kan nog vara klart intressant att se hur andra jobbar med TFS:en. &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14.00&lt;/td&gt;
&lt;td&gt;Prototyping in SketchFlow - Danwei Tran&lt;/td&gt;
&lt;td&gt;Jag har redan lekt lite med RX och det verkar helt klart ganska coolt. Fr&amp;aring;gan &amp;auml;r om jag l&amp;auml;r mig s&amp;aring; mycket mer p&amp;aring; 50 minuter. Nej, jag kollar nog p&amp;aring; SketchFlow med Danwei ist&amp;auml;llet, f&amp;ouml;r Blend har jag fortfarande inte riktigt lyckats greppa hur man jobbar med.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15.10&lt;/td&gt;
&lt;td&gt;Asynchronous Pages and Parallel Extensions - Tiberiu Covaci&lt;/td&gt;
&lt;td&gt;Egentligen s&amp;aring; lockar ju ReSharper-seminariet ocks&amp;aring;, men jag har sv&amp;aring;rt nog att komma ih&amp;aring;g de mest grundl&amp;auml;ggande kortkommandona s&amp;aring;.. Parallel FX l&amp;auml;r jag dock har r&amp;auml;tt ordentlig med anv&amp;auml;ndning f&amp;ouml;r..&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16.10&lt;/td&gt;
&lt;td&gt;Windows Azure in the real world - Bj&amp;ouml;rn Eriksen&lt;/td&gt;
&lt;td&gt;Det &amp;auml;r ju iofs tyv&amp;auml;rr s&amp;auml;llan som seminarier som grundar sig i ett real-world exempel blir s&amp;aring; intressanta. Det &amp;auml;r helt enkelt v&amp;auml;ldigt sv&amp;aring;rt att sammanfatta ett stort projekt p&amp;aring; 50 minuter utan att det bara blir &amp;ouml;versiktligt och fluffigt. Men.. jag h&amp;aring;ller tummarna f&amp;ouml;r att Bj&amp;ouml;rn f&amp;ouml;rv&amp;aring;nar! &lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;a href="http://www.cornerstone.se/sv/Event/DevSum/2010/"&gt;Dag 3. Workshops&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Egentligen ingen tvekan h&amp;auml;r; det blir &lt;a href="http://www.cornerstone.se/sv/Event/DevSum/2010/Agenda/Silverlight-meets-REST-in-Azure/"&gt;Silverlight meets REST in Azure&lt;/a&gt;. Nu anv&amp;auml;nder vi f&amp;ouml;rvisso inte Silverlight (&amp;auml;nnu), men det &amp;auml;r helt klart det omr&amp;aring;de d&amp;auml;r jag har sv&amp;aring;rast att bli insatt i &amp;auml;mnet utan lite hj&amp;auml;lp, och detsamma g&amp;auml;ller Azure.&lt;/p&gt;
&lt;p&gt;Men visst.. Skulle man g&amp;aring; p&amp;aring; vad jag f&amp;ouml;rmodligen skulle f&amp;aring; mest nytta av omedelbart s&amp;aring; &amp;auml;r det ju &lt;a href="http://www.cornerstone.se/sv/Event/DevSum/2010/Agenda/Hosting-WCF-and-WF-Services-using-Windows-Server-AppFabric/"&gt;Hosting WCF and WF Services using Windows Server AppFabric&lt;/a&gt; som g&amp;auml;ller. Men det struntar jag i! S&amp;auml;g inget till chefen bara..&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Sist men inte minst. Att jag har v&amp;auml;ckt upp den h&amp;auml;r bloggen med ett inl&amp;auml;gg om DevSum 2010 har naturligtvis INGENTING att g&amp;ouml;ra med att de k&amp;ouml;r en t&amp;auml;vling d&amp;auml;r man kan vinna &amp;auml;ra (och en iPad)..&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=6274" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/.NET/default.aspx">.NET</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/DevSum/default.aspx">DevSum</category></item><item><title>Unity interception performance</title><link>http://ljusberg.se/blogs/smorakning/archive/2009/10/06/unity-interception-performance.aspx</link><pubDate>Tue, 06 Oct 2009 15:06:25 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:6230</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;The past two years or so I’ve been working with a rather large team of developers on the latest incarnation of our bespoke web site platform here at Thomas Cook NE. We decided early on to use Unity and the Interception Extension at pretty much all layers across the entire site. One page view will trigger tens or even hundreds of object buildups. I never gave the process much thought, but when the load test told us that the front page of our beta site (now live at &lt;a href="http://beta.ving.se"&gt;http://beta.ving.se&lt;/a&gt;) peaked at 4-5 requests per second with 100% CPU usage, I got worried.&lt;/p&gt;  &lt;p&gt;Looking a little bit closer at the Unity documentation, the first thing I did was to replace the TransparentProxyInterceptor with a combination of the InterfaceInterceptor and the VirtualMethodInterceptor. Unfortunately, that wasn’t such an easy task since only the TransparentProxyInterceptor handles events and delegates properly and the same goes for ref/out parameters. After a bit of refactoring though, everything was working again. But the performance was still not very satisfactory.&lt;/p&gt;  &lt;p&gt;I had to dig myself quite deep into the mysteries of Unity until I found what I was looking for. Now, Unity is designed primarily to be flexible and extensible. It turns out that this flexibility was the big problem. The interception mechanism allows you to add, remove or change policies at runtime which means that the build up phase in the interception extension needs to check all policies and matching rules each time an object is built. That means that for every object that is create, all interceptable methods needs to be checked against all matching rules. On top of that, most of the matching rules make heavy use of reflection (looking for custom attributes, method signatures, etc).&lt;/p&gt;  &lt;p&gt;Now, we use the interception mechanism quite extensively for tracing, error handling, logging and most importantly for caching but we don’t really have any use for that much flexibility. All our interception configuration happens in a config file that is read on application startup so we are quite fine with having to restart the application in order to change a matching rule or add a new call handler. Luckily, the source code for Unity and Enterprise Library is easily downloaded from CodePlex, so I decided to try to change the behavior to fit our needs.&lt;/p&gt;  &lt;p&gt;So, what did I do? Well, I simply added a Dictionary to hold a HandlerPipeline for each MethodImplementationInfo that the interceptor tries to intercept. The snippet below is from the TypeInterceptionStrategy class and should give you an idea. The InstanceInterceptionStrategy got pretty much the same treatment.&lt;/p&gt;  &lt;div style="border-bottom:silver 1px solid;text-align:left;border-left:silver 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;border-top:silver 1px solid;cursor:text;border-right:silver 1px solid;padding-top:4px;" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; TypeInterceptionStrategy : BuilderStrategy&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;     [...]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; Dictionary&amp;lt;MethodImplementationInfo, HandlerPipeline&amp;gt; _pipelineCache = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Dictionary&amp;lt;MethodImplementationInfo, HandlerPipeline&amp;gt;();&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;     [...]&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; PostBuildUp(IBuilderContext context)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;         Guard.ArgumentNotNull(context, &lt;span style="color:#006080;"&gt;&amp;quot;context&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;     &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;         IInterceptingProxy proxy = context.Existing &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; IInterceptingProxy;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(proxy == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;     &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;         ITypeInterceptionPolicy interceptionPolicy = GetInterceptionPolicy(context);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;     &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;         Type typeToIntercept = BuildKey.GetType(context.BuildKey);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;         PolicySet interceptionPolicies = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PolicySet(BuilderContext.NewBuildUp&amp;lt;InjectionPolicy[]&amp;gt;(context));&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt;         IUnityContainer currentContainer = BuilderContext.NewBuildUp&amp;lt;IUnityContainer&amp;gt;(context);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum19"&gt;  19:&lt;/span&gt;     &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum20"&gt;  20:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (MethodImplementationInfo item &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; interceptionPolicy.Interceptor.GetInterceptableMethods(typeToIntercept, typeToIntercept))&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum21"&gt;  21:&lt;/span&gt;         {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum22"&gt;  22:&lt;/span&gt;                 HandlerPipeline pipeline;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum23"&gt;  23:&lt;/span&gt;                 &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!_pipelineCache.TryGetValue(item, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; pipeline))&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum24"&gt;  24:&lt;/span&gt;                 {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum25"&gt;  25:&lt;/span&gt;                     pipeline = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HandlerPipeline(&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum26"&gt;  26:&lt;/span&gt;                 interceptionPolicies.GetHandlersFor(item, currentContainer));&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum27"&gt;  27:&lt;/span&gt;                     _pipelineCache[item] = pipeline;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum28"&gt;  28:&lt;/span&gt;                 }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum29"&gt;  29:&lt;/span&gt;             proxy.SetPipeline(interceptionPolicy.Interceptor.MethodInfoForPipeline(item), pipeline);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum30"&gt;  30:&lt;/span&gt;         }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum31"&gt;  31:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum32"&gt;  32:&lt;/span&gt;  &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum33"&gt;  33:&lt;/span&gt;     [...]   &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum34"&gt;  34:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This, of course, is only a rather ugly quick-fix. I tried to find a way to easily incorporate something similar without having to recompile Unity, but I wasn’t successful. I thought about implementing my own Interception Strategies, but the Interception Extension is pretty wired to using only the ones that are found “in the box”, and building my own Interception Extension meant also building my own configuration classes and.. well, I don’t think it would have been worth it. But I might be missing something obvious; if you have a better idea on how to make sure that Unity doesn’t go through unnecessary work on each buildup I would be very happy to see it! &lt;/p&gt;

&lt;p&gt;Anyway, what about the results? Well, with my new Unity build applied, the bandwidth of the load test rig got exhausted at 80 page views per second with the CPU at a comfortable 80%; I call that a pretty decent improvement. :-)&lt;/p&gt;

&lt;p&gt;For me, the big question now is whether or not there is support for my scenario in Unity 2.0 (which I believe is well under development). If anyone has information about this, please let me know!&amp;#160; &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=6230" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/.NET/default.aspx">.NET</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Enterprise+Library/default.aspx">Enterprise Library</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Unity/default.aspx">Unity</category></item><item><title>Windows Server 2008 as development platform</title><link>http://ljusberg.se/blogs/smorakning/archive/2008/06/23/windows-server-2008-as-development-platform.aspx</link><pubDate>Mon, 23 Jun 2008 15:40:30 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:6080</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p style="margin-left:19pt;"&gt;Well, this is going to be interesting. I&amp;#39;ve spent the day installing Windows Server 2008 on my brand new laptop at work. I was inspired by &lt;a href="http://blog.deurell.net/2008/04/min-nya-utvecklarplattform-eller-att.html"&gt;&lt;span style="color:blue;text-decoration:underline;"&gt;Mikael Deurell&amp;#39;s post about using Hyper-V&lt;/span&gt;&lt;/a&gt; etc. 
&lt;/p&gt;&lt;p style="margin-left:19pt;"&gt;So far it&amp;#39;s been much easier than I expected. Pretty much all device drivers for my Compaq 8510w installed without any problems even though I&amp;#39;m using a 64-bit system.
&lt;/p&gt;&lt;p style="margin-left:19pt;"&gt; 
 &lt;/p&gt;&lt;p style="margin-left:19pt;"&gt;I also found two great blog posts that describe how to make the Windows Server 2008 experience a little more &amp;quot;Desktoppy&amp;quot;. Check out:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/vijaysk/archive/2008/02/11/using-windows-server-2008-as-a-super-desktop-os.aspx"&gt;&lt;span style="color:blue;text-decoration:underline;"&gt;Using Windows Server 2008 as a super desktop OS&lt;/span&gt;&lt;/a&gt;
		&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/vijaysk/archive/2008/02/20/using-windows-server-2008-as-a-super-workstation-os-cont-d.aspx"&gt;&lt;span style="color:blue;text-decoration:underline;"&gt;Using Windows Server 2008 as a super desktop OS Continued&lt;/span&gt;&lt;/a&gt;
		&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;Also, this is an attempt at posting using Word 2007.. Let&amp;#39;s see how that works out..!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=6080" width="1" height="1"&gt;</description></item><item><title>Scrum Dashboard</title><link>http://ljusberg.se/blogs/smorakning/archive/2008/02/28/scrum-dashboard.aspx</link><pubDate>Thu, 28 Feb 2008 22:16:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:6074</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;If you&amp;#39;re a fan of Scrum and Team Foundation Server you&amp;#39;ll probably want to have a look at the &lt;a class="" href="http://www.codeplex.com/scrumdashboard"&gt;Scrum Dashboard&lt;/a&gt; recently published on CodePlex by &lt;a class="" href="http://www.episerver.com/"&gt;EPiServer&lt;/a&gt;. It looks very cool but unfortunately for us it uses the &lt;a class="" href="http://www.scrumforteamsystem.com/en/default.aspx"&gt;Scrum for Team System&lt;/a&gt; templates by Conchango instead of the &amp;quot;vanilla&amp;quot; MSF Agile templates that we&amp;#39;re using. Too bad for us, but I applaud EPiServer for making this thing available to the community. Thank&amp;#39;s guys!&lt;/p&gt;
&lt;p&gt;BTW, I actually met the guy listed as Coordinator&amp;nbsp;of the project (&lt;a class="" href="http://labs.episerver.com/en/Blogs/Per/Archive/2008/2/Scrum-Dashboard/"&gt;Per Bjurström&lt;/a&gt;) on my &lt;a class="" href="http://ljusberg.se/blogs/smorakning/archive/2007/10/17/going-to-redmond.aspx"&gt;trip to Redmond&lt;/a&gt; last October - that has to be a good sign, right?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=6074" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/TFS/default.aspx">TFS</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Scrum/default.aspx">Scrum</category></item><item><title>What's up?</title><link>http://ljusberg.se/blogs/smorakning/archive/2008/02/27/what-s-up.aspx</link><pubDate>Wed, 27 Feb 2008 16:20:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:6071</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I know, I know.. I&amp;#39;ve been extremely lazy lately, at least when it comes to sharing knowledge with you guys. I guess the main reason for that is that I&amp;#39;m currently on parental leave which means that my days are not really spent researching, architecting and developing as much as they are spent entertaining &lt;a href="http://ljusberg.se/photos/miranda"&gt;Miranda&lt;/a&gt;...&lt;/p&gt;
&lt;p&gt;Anyway, as you may have realized by my &lt;a title="Caching Dynamic Controls" href="http://ljusberg.se/blogs/smorakning/archive/2007/09/10/caching-dynamic-controls-in-asp-net.aspx"&gt;previous&lt;/a&gt; &lt;a title="Caching Dynamic Controls - Solution" href="http://ljusberg.se/blogs/smorakning/archive/2007/10/17/caching-dynamic-controls-in-asp-net-solution.aspx"&gt;posts&lt;/a&gt; on the subject, I&amp;#39;ve been diving into the big swamp of ASP.NET once again. Somtime mid-last year I was tasked with creating a new plattform for the web sites at Thomas Cook Northern Europe (like &lt;a href="http://ving.se/"&gt;ving.se&lt;/a&gt;, &lt;a href="http://spies.dk/"&gt;spies.dk&lt;/a&gt;, &lt;a href="http://tjaereborg.dk/"&gt;tjaereborg.dk&lt;/a&gt; and &lt;a href="http://ving.no/"&gt;ving.no&lt;/a&gt;). The platform that is currently running all our sites is quite powerful but was designed with .NET Framework 1.1 in mind which makes it a bit clumsier than it has to be. &lt;/p&gt;
&lt;p&gt;At the time, the only web site framework on offer from Microsoft was the &lt;a href="http://msdn.microsoft.com/webclientfactory"&gt;Web Client Software Factory&lt;/a&gt;. I really liked the ideas and patterns that drive the architecture of the WCSF (in pattern-talk I guess you would describe it as Model-View-Presenter combined with Application Controllers). However, it simply wasn&amp;#39;t enough for our needs. The major problem was that the Views/Presenters are to coarse. They are designed with entire pages in mind instead of being designed for User Controls (which is what we need). I also didn&amp;#39;t like the fact that the flow engine they used couldn&amp;#39;t handle multiple flows and states per session/user. A quite common scenario for us is that a user opens up several browser windows to compare different alternative trips - something that often leads to corrupt state.&lt;/p&gt;
&lt;p&gt;In the end I decided to create a framework from scratch with much of the ideas from the WCSF intact, but extended to fit our needs. Some notable features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Based on the Model-View-Presenter and Application Controller patterns.&lt;/li&gt;
&lt;li&gt;Independent modules for each area of the web site which makes it possible to develop and deploy parts of the web site without affecting the other parts.&lt;/li&gt;
&lt;li&gt;No .aspx files - pages are built up dynamically.&lt;/li&gt;
&lt;li&gt;Multiple flows per user&lt;/li&gt;
&lt;li&gt;Fully integrated URL Rewriting&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Well, if you&amp;#39;re interested I&amp;#39;ll blog some more about this. But at least now I&amp;#39;ve given you an update on what I&amp;#39;m doing..&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update (2008-02-28)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Funny, the day after I wrote this entry, Microsoft Sweden published a &amp;quot;&lt;a class="" title="Thomas Cook" href="http://buzzfrog.blogs.com/zabrak/2008/02/thomas-cook---i.html"&gt;success story&lt;/a&gt;&amp;quot; about the project (although the story focuses more on the way we are using TFS and VS 2008 rather than the framework itself). I had no idea this article was being written, but I guess that&amp;#39;s what happens when you&amp;#39;re on parental leave.. :-)&lt;/p&gt;
&lt;p&gt;Also, you might be asking yourself &amp;quot;How on earth do you make sure that things are going in the right direction if your not in the office?&amp;quot;. Well, luckily I&amp;#39;ve been able to hand over the framework in the very good hands of my colleague Håkan (who&amp;nbsp;also gave me a lot of great advice during the first stages of the project). If you&amp;#39;ve read this far, you&amp;#39;ll certainly find his blog even more interesting, and as a bonus it&amp;#39;s available in &lt;a class="" title="Hocke" href="http://hocke.blogspot.com/"&gt;English&lt;/a&gt;&amp;nbsp;and &lt;a class="" title="Hocke" href="http://hockeswe.blogspot.com/"&gt;Swedish&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=6071" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/.NET/default.aspx">.NET</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>How cool is this?</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/10/27/how-cool-is-this.aspx</link><pubDate>Fri, 26 Oct 2007 23:44:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5906</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>I&amp;#39;m currently writing this post on the express bus to Redmond using my iPod touch and the free WiFi provided on the bus. In my book it doesn&amp;#39;t get much cooler than that!&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5906" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Fun/default.aspx">Fun</category></item><item><title>T4 editor available</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/10/26/t4-editor-available.aspx</link><pubDate>Fri, 26 Oct 2007 18:05:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5905</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;It seems &lt;a class="" title="Clarius Consulting" href="http://www.clariusconsulting.net/"&gt;Clarius Consulting&lt;/a&gt; have released a beta version of a pretty nice addition to Visual Studio, at least if you&amp;#39;re working with the Guidance Automation Toolkit. The &lt;a class="" title="T4 Editor" href="http://www.t4editor.net/"&gt;T4 Editor&lt;/a&gt; will give you IntelliSense, nice&amp;nbsp;colorization etc when working with your T4 templates.&lt;/p&gt;
&lt;p&gt;I&amp;#39;m now just waiting for them to release a version of the &lt;a class="" title="Software Factories Toolkit" href="http://www.softwarefactoriestoolkit.net/"&gt;Software Factories Toolkit&lt;/a&gt; that works with VS2008 Beta 2..!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5905" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/GAT/default.aspx">GAT</category></item><item><title>VS2008 RTM any day now?</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/10/23/vs2008-rtm-any-day-now.aspx</link><pubDate>Tue, 23 Oct 2007 04:13:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5903</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;According to the Microsoft guys in building 20, the RTM of Visual Studio 2008 and .NET Framework 3.5 is coming &amp;quot;very, Very, VERY soon&amp;quot; - whatever that means... &lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5903" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/.NET/default.aspx">.NET</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>Going to Redmond!</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/10/17/going-to-redmond.aspx</link><pubDate>Wed, 17 Oct 2007 14:16:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5899</guid><dc:creator>anders</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Well, in a couple of days I&amp;#39;m off to the Microsoft Campus in Redmond! I&amp;#39;m attending an Orcas Adoption Workshop next week which will take me through all the new stuff in Visual Studio 2008 and .NET Framework 3.5. So far, I haven&amp;#39;t got the agenda so I have more or less no idea who
I&amp;#39;ll meet and what kind of workshops to expect but I&amp;#39;m sure it&amp;#39;ll be
great.&lt;/p&gt;&lt;p&gt;I&amp;#39;m really, really looking forward to it. Actually visiting the Campus is something I&amp;#39;ve been dreaming about for quite some time (yes, I know.. maybe I should try to reprioritize my dreams... but still!)&amp;nbsp;&lt;/p&gt;&lt;p&gt;So, is anyone else going to be in the Redmond area next week? &lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5899" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Personal/default.aspx">Personal</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/.NET/default.aspx">.NET</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>Caching dynamic controls in ASP.NET - solution</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/10/17/caching-dynamic-controls-in-asp-net-solution.aspx</link><pubDate>Wed, 17 Oct 2007 07:39:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5896</guid><dc:creator>anders</dc:creator><slash:comments>6</slash:comments><description>&lt;p&gt;In my &lt;a href="http://ljusberg.se/blogs/smorakning/archive/2007/09/10/caching-dynamic-controls-in-asp-net.aspx"&gt;last post&lt;/a&gt;, I asked for help with a problem we&amp;#39;ve been having with caching of dynamic controls - and I got some from &lt;a title="Infinites Loop" href="http://weblogs.asp.net/infinitiesloop/default.aspx" target="_blank"&gt;Dave Reed&lt;/a&gt;. Dave works for the ASP.NET team and if his blog isn&amp;#39;t on your roll yet, add it ASAP - it&amp;#39;s simply brilliant. &lt;/p&gt;  &lt;p&gt;Dave explained the problem:&lt;/p&gt;  &lt;hr /&gt;  &lt;div&gt;Apparently, the stack trace involved with loading the control is taken into account when deciding how to cache the controls output. So for example, if you load the control twice like so: &lt;/div&gt;  &lt;pre&gt;LoadControl(&amp;quot;&lt;span style="color:#8b0000;"&gt;foo.ascx&lt;/span&gt;&amp;quot;); &lt;span style="color:#008000;"&gt;// once &lt;/span&gt;
LoadControl(&amp;quot;&lt;span style="color:#8b0000;"&gt;foo.ascx&lt;/span&gt;&amp;quot;); &lt;span style="color:#008000;"&gt;// twice&lt;/span&gt;&lt;/pre&gt;

&lt;div&gt;Then they will be cached separately. But if you load them like this:&lt;/div&gt;

&lt;pre&gt;MethodThatLoadsFoo(); &lt;span style="color:#008000;"&gt;// once &lt;/span&gt;
MethodThatLoadsFoo(); &lt;span style="color:#008000;"&gt;// twice&lt;/span&gt;&lt;/pre&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;Where MethodThatLoadsFoo contains:&lt;/div&gt;

&lt;pre&gt;LoadControl(&amp;quot;&lt;span style="color:#8b0000;"&gt;foo.ascx&lt;/span&gt;&amp;quot;); &lt;/pre&gt;

&lt;div&gt;They are cached together because it will appear that they were loaded via the same code line.&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;Since you are loading them dynamically based on data you probably have a single method that loads whatever control it is to be. But depending on the details of your implementation perhaps you can find a way to have a different LoadControl reference load each one? 
  &lt;br /&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;p&gt;Ok.. So where does that leave us? Remember, the implementation that calls LoadControl in my last example looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (ControlInfo controlInfo &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; controlList)
{
   &lt;span style="color:#008000;"&gt;// Load the control and add it to the page&lt;/span&gt;
   HttpContext.Current.Items[&amp;quot;&lt;span style="color:#8b0000;"&gt;uniqueId&lt;/span&gt;&amp;quot;] = controlInfo.UniqueControlId;
   Control ctrl = LoadControl(controlInfo.ControlUrl);
   PlaceHolder1.Controls.Add(ctrl);
}&lt;/pre&gt;

&lt;p&gt;It is the same physical line of code that loads all controls, which makes the caching mechanism believe that it is the very same control that is being loaded. In order for it to cache multiple versions, I&amp;#39;d need to add a new LoadControl line for each control. So I guess I could &amp;quot;unwrap&amp;quot; the foreach-loop and do something like:&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (controlList.Count &amp;gt; 0)
{
   HttpContext.Current.Items[&amp;quot;&lt;span style="color:#8b0000;"&gt;uniqueId&lt;/span&gt;&amp;quot;] = controlList[0].UniqueControlId;
   PlaceHolder1.Controls.Add(LoadControl(controlList[0].ControlUrl));
}
&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (controlList.Count &amp;gt; 1)
{
   HttpContext.Current.Items[&amp;quot;&lt;span style="color:#8b0000;"&gt;uniqueId&lt;/span&gt;&amp;quot;] = controlList[1].UniqueControlId;
   PlaceHolder1.Controls.Add(LoadControl(controlList[1].ControlUrl));
}
&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (controlList.Count &amp;gt; 2)
{
   HttpContext.Current.Items[&amp;quot;&lt;span style="color:#8b0000;"&gt;uniqueId&lt;/span&gt;&amp;quot;] = controlList[2].UniqueControlId;
   PlaceHolder1.Controls.Add(LoadControl(controlList[2].ControlUrl));
}&lt;/pre&gt;

&lt;p&gt;Ehh.. Nope.. Not gonna happen...&lt;/p&gt;

&lt;p&gt;The only other alternative I could think of was to dynamically generate and compile the code that is used to render a page. This is (a crude version of) what I came up with:&lt;/p&gt;

&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; CompileAndInitializePage(Page page, List controlList)
{
  Assembly compiledAssembly;

  &lt;span style="color:#008000;"&gt;// Has this page been built before? If so, there should already be an existing assembly&lt;/span&gt;
  &lt;span style="color:#008000;"&gt;// compiled for it.&lt;/span&gt;
  &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (compiledAssemblies.ContainsKey(page.AppRelativeVirtualPath))
  {
    compiledAssembly = compiledAssemblies[page.AppRelativeVirtualPath];
  }
  &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
  {
    &lt;span style="color:#008000;"&gt;// If not, compile a new one.&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; mainHeader =
      &amp;quot;&lt;span style="color:#8b0000;"&gt;using System.Web;\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt;using System.Web.UI;\n&lt;/span&gt;&amp;quot; +

      &amp;quot;&lt;span style="color:#8b0000;"&gt;namespace DynamicCacheTest\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt;{\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt; public class TempPageBuilder\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt; {\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt; public void BuildPage(Page page)\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt; {\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt; Control holder;\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt; holder = page.FindControl(\&amp;quot;PlaceHolder1\&amp;quot;);\n&lt;/span&gt;&amp;quot;;

    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; mainFooter =
      &amp;quot;&lt;span style="color:#8b0000;"&gt; }\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt; }\n&lt;/span&gt;&amp;quot; +
      &amp;quot;&lt;span style="color:#8b0000;"&gt;}\n&lt;/span&gt;&amp;quot;;
    StringBuilder sb = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; StringBuilder(mainHeader);
    &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (ControlInfo ctrl &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; controlList)
    {
      sb.AppendFormat(&amp;quot;&lt;span style="color:#8b0000;"&gt;HttpContext.Current.Items[\&amp;quot;uniqueId\&amp;quot;] = {0};\n&lt;/span&gt;&amp;quot;, ctrl.UniqueControlId);
      sb.AppendFormat(&amp;quot;&lt;span style="color:#8b0000;"&gt;holder.Controls.Add(page.LoadControl(\&amp;quot;{0}\&amp;quot;));\n&lt;/span&gt;&amp;quot;, ctrl.ControlUrl);
    }
    sb.Append(mainFooter);

    ICodeCompiler compiler = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CSharpCodeProvider().CreateCompiler();

    CompilerParameters parameters = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CompilerParameters(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] { &amp;quot;&lt;span style="color:#8b0000;"&gt;System.dll&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;System.Web.dll&lt;/span&gt;&amp;quot; });
    CompilerResults res = compiler.CompileAssemblyFromSource(parameters, sb.ToString());
    compiledAssembly = res.CompiledAssembly;
    compiledAssemblies[page.AppRelativeVirtualPath] = compiledAssembly;
  }

  &lt;span style="color:#008000;"&gt;// Build the page builder object&lt;/span&gt;
  &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; builder = Activator.CreateInstance(compiledAssembly.GetType(&amp;quot;&lt;span style="color:#8b0000;"&gt;DynamicCacheTest.TempPageBuilder&lt;/span&gt;&amp;quot;));

  &lt;span style="color:#008000;"&gt;// Invoke the BuildPage method&lt;/span&gt;
  builder.GetType().InvokeMember(&amp;quot;&lt;span style="color:#8b0000;"&gt;BuildPage&lt;/span&gt;&amp;quot;, BindingFlags.InvokeMethod, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, builder, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[] { &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; });
}&lt;/pre&gt;

&lt;p&gt;And it works beautifully! I&amp;#39;m not too worried about performance since I&amp;#39;m only compiling the page once, and running the compiled code shouldn&amp;#39;t be slower than the foreach-loop is today. The only thing I&amp;#39;m thinking is that with many pages on a site I&amp;#39;d have a lot of very small assemblies loaded. Probably it would be a better idea to precompile all pages on startup and put them in a single assembly.&lt;/p&gt;

&lt;p&gt;Anyway, in the end we&amp;#39;ve decided that we won&amp;#39;t actually put this in production since the problem probably is better worked around by educating our webmasters, but it was nice to finally find a solution.&lt;/p&gt;

&lt;p&gt;Update: I&amp;#39;ve attached the updated source code to this post. &lt;/p&gt;

&lt;p&gt;Update 2: And now I&amp;#39;m trying out a Live Writer Plugin to format the source code&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5896" width="1" height="1"&gt;</description><enclosure url="http://ljusberg.se/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.58.96/DynamicCacheTest.zip" length="9377" type="application/zip" /><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/.NET/default.aspx">.NET</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Caching dynamic controls in ASP.NET</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/09/10/caching-dynamic-controls-in-asp-net.aspx</link><pubDate>Mon, 10 Sep 2007 14:05:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5891</guid><dc:creator>anders</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;Since the invention of partial caching in ASP.NET, we have been trying our best to implement it on our web pages. But without much luck. This post is a request, or I guess you could call it a &amp;quot;cry&amp;quot;, for help!&lt;/p&gt;&lt;p&gt;The problem is that we create all our controls dynamically, and each page can contain more than one instance of the same control (.ascx) but with different content.&lt;/p&gt;&lt;p&gt;Simply put, a page load is currently done like this:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Retrieve a list of which controls to put on the page and the unique id of the content each control should display.&lt;/li&gt;&lt;li&gt;For each control that should be created, call LoadControl and let the control know its unique id.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Each control retrieves its data by using the unique id&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Now, when trying to add partial caching to this control, the problem is that the controls are cached according to which page they&amp;#39;re on (or the query string used to get the page) and I just cannot figure out a way of caching two different instances of the same control. I mean, at the time of creation (LoadControl) I know which one I want, so it really should be theoretically possible, but I simply cannot find support for it in the API. &lt;/p&gt;&lt;p&gt;I&amp;#39;ve attached a simple test project that illustrates the problem. If you can find a nice solution, please, PLEASE let me know. I&amp;#39;d be in your debt!&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5891" width="1" height="1"&gt;</description><enclosure url="http://ljusberg.se/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.58.91/DynamicCacheTest.zip" length="7977" type="application/x-zip-compressed" /><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Help+needed/default.aspx">Help needed</category></item><item><title>The new SOA</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/05/30/the-new-soa.aspx</link><pubDate>Wed, 30 May 2007 08:15:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5876</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This is going to be confusing for me.. There&amp;#39;s a new SOA in town: &lt;a href="http://www.lotro.com/" title="LOTRO SoA" target="_blank"&gt;Lord of the Rings Online: Shadows of Angmar&lt;/a&gt; (or SoA). Let&amp;#39;s just hope they&amp;#39;ll continue to use the abbreviation &lt;a href="http://www.lotro.com/" title="Lord of the Rings Online" target="_blank"&gt;LOTRO&lt;/a&gt; instead..&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5876" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Fun/default.aspx">Fun</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Gaming/default.aspx">Gaming</category></item><item><title>Online course from 2xSundblad</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/05/30/online-course-from-2xsundblad.aspx</link><pubDate>Wed, 30 May 2007 07:58:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5875</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I&amp;#39;ve just looked through a part of the preview of the coming online course from &lt;a href="http://www.2xsundblad.com/" title="2xSundblad" target="_blank"&gt;2xSundblad&lt;/a&gt; called Architecting Service Oriented Systems – Overview. It&amp;#39;s Flash-based with a mix of video, audio and slides. Looks very promising and it will be available for a very reasonable $399 (if you register your interest early you&amp;#39;ll even get a 25% discount). &lt;/p&gt;&lt;p&gt;I guess you&amp;#39;ll have to get used to the Swedish accent of Sten and Per, but knowing them I can promise you it&amp;#39;ll be worth it!&lt;/p&gt;&lt;p&gt;Three other courses will be available within the next year or so:&lt;/p&gt;&lt;ul&gt;&lt;font&gt;&lt;li&gt;The Infrastructure of Shareable Information Pattern – Planning, 
Architecting, Designing, and Implementing. 
&lt;/li&gt;&lt;li&gt;The Entity Services and User Application Pattern – Planning, Architecting, 
Designing, and Implementing. 
&lt;/li&gt;&lt;li&gt;The Business Process and Use Case Services Pattern – Planning, Architecting, 
Designing, and Implementing.&lt;/li&gt;&lt;/font&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;I&amp;#39;ll post a link to the free preview once I get an OK from Sten or Per to do so!&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;i&gt;Update&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;Here&amp;#39;s the link to the &lt;a href="http://www.2xsundblad.com/archtraining/archsosystems" title="2xSundblad"&gt;preview of 2xSundblad&amp;#39;s new online course&lt;/a&gt;.&lt;/i&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5875" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/SOA/default.aspx">SOA</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>The Agile pyramid</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/05/25/the-agile-pyramid.aspx</link><pubDate>Fri, 25 May 2007 07:25:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5874</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;One of my favorite developer sites, &lt;a href="http://worsethanfailure.com" target="_blank"&gt;Worse Than Failure&lt;/a&gt; (used to be called The Daily WTF), just published an article about &lt;a href="http://worsethanfailure.com/Articles/The-Great-Pyramid-of-Agile.aspx" target="_blank"&gt;Agile methodologies&lt;/a&gt; and why they suck. While I don&amp;#39;t agree with Alex it&amp;#39;s always fun when an analogy is turned upside down... The problem here is that the Pyramid analogy is flawed in the first place since an extremely important part of agile methodologies, Refactoring, is missing. Instead, building a pyramid using agile methodologies would rather be done this way:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Get some initial input from the Pharaoh. It will be something like &amp;quot;I&amp;#39;d like it to look like all the other pyramids, only bigger and better&amp;quot;.&lt;/li&gt;&lt;li&gt;Start building something that may or may not look much like a pyramid.&lt;/li&gt;&lt;li&gt;Find some flaws in your design. Show the Pharaoh and ask him what he thinks of it so far.&lt;/li&gt;&lt;li&gt;Tear down everything you or the Pharaoh don&amp;#39;t like.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Add some more components to the pyramid.&lt;/li&gt;&lt;li&gt;Realize that the foundation of the pyramid isn&amp;#39;t solid enough.&lt;/li&gt;&lt;li&gt;Rebuild the foundation&lt;/li&gt;&lt;li&gt;Repeat steps 3, 4 and maybe 5 and 6 until you and the Pharaoh are happy with the result.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;And this is why agile methodologies are better suited for software development than for construction work...&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5874" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>Code beauty</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/05/16/code-beauty.aspx</link><pubDate>Wed, 16 May 2007 14:03:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5868</guid><dc:creator>anders</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;It&amp;#39;s pretty clear that there are two basic kinds of developers; those that write code only to get the job done, and those that write code which in addition to getting the job done also looks good. I&amp;#39;m definitely part of the latter group and I have to say that sometimes I get frustrated when working with developers of the former conviction.&lt;/p&gt;&lt;p&gt;I was just reviewing some code written in a project I haven&amp;#39;t been involved in much, and found a set of very commonly used classes that lie in a namespace that is misspelled. I realize this doesn&amp;#39;t matter. I mean, the code does exactly what it&amp;#39;s supposed to do and the misspelling is so simple that everyone understands what it was meant to be called. But c&amp;#39;mon! Correcting the mistake would take about 2 minutes thanks to the refactoring functionality in Visual Studio.&lt;/p&gt;&lt;p&gt;Now to the difficult question... Should I mention it in my review?&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5868" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>Enterprise Library 3.0 available</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/05/08/enterprise-library-3-0-available.aspx</link><pubDate>Tue, 08 May 2007 08:20:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5865</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Can&amp;#39;t believe I almost missed this completely! Turns out the P&amp;amp;P team released &lt;a href="http://msdn2.microsoft.com/en-us/library/aa480453.aspx" title="Enterprise Library" target="_blank"&gt;Enterprise Library 3.0&lt;/a&gt; the other day. For me, the two most interesting new features have to be Environmental overrides and the new Validation Application Block. I&amp;#39;m also very happy to see a rolling trace file listener included in the Logging Application Block - I checked our production servers the other day, and some of the logfiles where a couple of gigabytes each.. not good.. not good at all..&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5865" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/.NET/default.aspx">.NET</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Enterprise+Library/default.aspx">Enterprise Library</category></item><item><title>Community Server 2007</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/04/22/community-server-2007.aspx</link><pubDate>Sun, 22 Apr 2007 08:01:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:5516</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;The guys over at &lt;a class="" title="Telligent" href="http://telligent.com/" target="_blank"&gt;Telligent&lt;/a&gt; released the much longed for new version of &lt;a class="" title="Community Server 2007" href="http://communityserver.org/blogs/announcements/archive/2007/04/16/community-server-2007-released.aspx" target="_blank"&gt;Community Server&lt;/a&gt;. And they did it right on schedule! Very impressive!&lt;/p&gt;
&lt;p&gt;I spent a couple of hours yesterday upgrading my 2.1 installation and it all went pretty smoothly. Haven&amp;#39;t checked out the new theme engine yet, but maybe I&amp;#39;ll get around to that.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=5516" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Community+Server/default.aspx">Community Server</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Blogging/default.aspx">Blogging</category></item><item><title>Web Services Software Factory, the solution to all our problems?</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/03/07/web-services-software-factory-the-solution-to-all-our-problems.aspx</link><pubDate>Wed, 07 Mar 2007 16:11:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:2941</guid><dc:creator>anders</dc:creator><slash:comments>4</slash:comments><description>
&lt;p&gt;I just came back from a seminar on &lt;a href="http://www.google.com/url?sa=t&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fmsdn2.microsoft.com%2Fen-us%2Flibrary%2Faa480534.aspx&amp;amp;ei=UuPvRb71Oor80gSLzanxCA&amp;amp;usg=__K46pUzKa2AWwPTYZGp5v3QIdTh4=&amp;amp;sig2=-QQHSlWWhvaVhv6X8TjHmg" title="Web Service Software Factory" target="_blank"&gt;Web Service Software Factory&lt;/a&gt; (hereby referenced as WSSF), and I just cannot resit the urge to share my feelings on the subject.&lt;/p&gt;

&lt;p&gt;The presenter introduced WSSF as the solution to a lot of problems; Straggly Code Base since each dev/architect has his/her own way of building a service, Varying Quality Levels depending on who did what and Bad Productivity caused by lack of re-use of both code and knowledge. Let's see (from my point of view) what the current version of WSSF offers when it comes to reducing these problems. Now, this is going to look very critical and you might even think that I don't appreciate the efforts of the PAG team. I assure you that I do. I'm just saying that the Service Factory as it is today doesn't live up to the promises this particular presenter made.&lt;/p&gt;
&lt;h3&gt;Straggly Code Base*&lt;/h3&gt;
&lt;p&gt;I think this is a serious problem with very few (if any) good solutions, and the WSSF in its current state certainly isn't one of them. The underlying problem is, of course, that our development platforms constantly evolve (to the better). This means that every time we start building a new service there will be some new feature, technology, utility class library or toolkit that we really should take advantage of in order to build a better service quicker. The WSSF is simply one of these. Since its built by the PAG-team, it isn't even supported and will most likely be evolved without much compatibility. The recent release of the WCF version made this clearer than ever. I sort of expected the ASMX-&amp;gt;WCF migration to be easily integrated, but no such luck. The WCF Service Factory is clearly separated from the ASMX Service Factory. You decide which one to use and then you're stuck with it (unless you go through the gruelling 8 step process involving a lot of copy-paste and manual modifications).&lt;/p&gt;

&lt;p&gt;Getting to the point I wanted to make. WSSF might make it easier to build the service you're building today, but I doubt you will use it five years from now. In fact, I'd bet that five years from now someone will look at your service and say "Wow, the data access component in this thing is really difficult to follow. Was there some kind of tool used to generate it?"&lt;/p&gt;
&lt;h3&gt;Varying Quality Levels&lt;/h3&gt;
&lt;p&gt;Let's not kid ourselves here. A bad developer will always create bad code, no matter what tool he/she uses. In fact, if you don't understand why services built using WSSF are layered like they are or why it is good practice to do Contract First development, then you are bound to make mistakes. So what you'll end up with is a service that &lt;i&gt;looks like&lt;/i&gt; it follows good design practices, but in fact is just as messy as anything else.&lt;/p&gt;
&lt;h3&gt;Bad Productivity&lt;/h3&gt;
&lt;p&gt;The biggest problem with the current WSSF offering (in my opinion) is that all recipes are one-time wizards without knowledge of the current code. Whenever you want to make a change to the generated code, you'll either have to do it manually or you'll have to run the recipe from scratch again. This may be fine when dealing with the simpler tasks such as adding a new property to a data type. But when you're dealing with the Data Access classes it quickly gets complicated. I really really hope that the PAG team are working on more &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/aa718368.aspx" title="DSL Tools" target="_blank"&gt;Domain Specific Language&lt;/a&gt;-like plugins instead. In fact, I think that a good DSL that could help us with mapping data types from the Business Entities to the Service Contract would increase productivity much more than the entire WSSF.&lt;/p&gt;
&lt;h3&gt;Conclusion.. or something like that..&lt;/h3&gt;
&lt;p&gt;I strongly believe that in an enterprise that wishes to keep its IT systems reasonably current and its IT department happy, you'll have to deal with the fact that your code base won't be a haven of conformity. If you have some junior developers you don't just hand them a guidance package and say "Follow this and everything will be fine", you make sure to review their code and you make sure they have a good mentor. If you suffer from bad productivity there are probably many, many things you can do to optimize the way you work (and yes, a tool or two can help - at least to a point). An example of a real productivity booster is another (much more mature) offering from the PAG-team, the &lt;a href="http://www.codeplex.com/entlib" title="Enterprise Library" target="_blank"&gt;Enterprise Library&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;When it comes to WSSF I think the PAG team have made a very good effort but I'm sure that they too realize that this technology (Software Factories) is still at a very early stage. It is absolutely a step in the right direction and I'm really looking forward to getting my hands on the next release and the ones after that. Adding some visual DSL tools and getting rid of many of the wizards would make the WSSF extremely interesting.&lt;/p&gt;&lt;p&gt;Please let me know what &lt;i&gt;You&lt;/i&gt; think! Have you successfully used the current WSSF and built a better service faster because of it (and will you use it the same way next time)? I'd love to be wrong on this one!&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;i&gt;* Straggly Code Base&lt;/i&gt;&lt;br&gt;
Is there a better word than Straggly (it's a direct translation of the Swedish word "Spretig")? What I mean is when each service is built differently from the last one; maybe it's layered differently, maybe the naming convention changes or maybe a new Visual Studio extension is used to generate the contract.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=2941" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/.NET/default.aspx">.NET</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/SOA/default.aspx">SOA</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Web+Service+Software+Factory/default.aspx">Web Service Software Factory</category></item><item><title>Documenting Web Services</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/03/02/documenting-web-services.aspx</link><pubDate>Fri, 02 Mar 2007 11:04:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:2674</guid><dc:creator>anders</dc:creator><slash:comments>6</slash:comments><description>&lt;p&gt;I'm now trying to do what really should be very core to any enterprise that is serious about using SOA and web services - making sure that there is an easy way to document your services and to keep that documentation available and updated. Well, it has turned out to be much more painful than I would have imagined. Our policy on documentation is something like "there's no point in doing it if no-one will ever read/use it". So in order for a documentation solution to be accepted all of these points must be fulfilled:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The documentation must be easy to distribute. I'm guessing the only way is to create some sort of web site with all docs.&lt;br&gt;&lt;/li&gt;&lt;li&gt;Easy to keep updated. In practice that means the documentation must be written inside the dev environment, preferably as code comments.&lt;/li&gt;&lt;li&gt;Organized/Categorized in a relevant way. You shouldn't have to know in advance which service to use. &lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;As you probably know, I've been playing around with &lt;a href="http://ljusberg.se/blogs/smorakning/archive/2007/01/04/msbuild-script-december-ctp.aspx"&gt;Sandcastle&lt;/a&gt;. But there are a couple of problems with it. First of all, there's no built-in support for generating a nice web site. It is however possible with third-party extensions such as &lt;span id="ctl00_ctl00_ctl00_Content_ProjectBaseMain_ProjectMain_licenseText"&gt;&lt;a href="http://www.codeplex.com/SHFB" target="_blank"&gt;Eric Woodruff's Sandcastle Help File Builder&lt;/a&gt; (an excellent tool by the way) so I guess that part is good enough. The biggest problem is that I don't know where to keep the documentation..! Sandcastle is mostly used for building docs for class libraries, not web sites. In fact, a Web Site project in Visual Studio 2005 doesn't even let you generate a documentation XML.. I'm considering doing it &lt;a href="http://msdn2.microsoft.com/en-us/library/aa491873.aspx" target="_blank"&gt;like the MapPoint Web Service SDK&lt;/a&gt;, i.e. generating a client proxy with wsdl.exe and documenting that. But what happens when something changes? I won't be able to regenerate the proxy since I'd loose all documentation. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;The best bet so far is probably from an article I found on Code Project about how to put your &lt;a href="http://www.codeproject.com/soap/webservicedoc.asp" target="_blank"&gt;web service documentation in an external file&lt;/a&gt; but still have it rendered by navigating to the .asmx file. Problem here is that the documentation still is in a file that isn't linked to the actual code. Maybe I could generate that XML file using Sandcastle.. &lt;br&gt; &lt;/p&gt;&lt;p&gt;Oh well... It's Friday.. I'll figure this out next week.. maybe..&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=2674" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/SOA/default.aspx">SOA</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Sandcastle/default.aspx">Sandcastle</category></item><item><title>Visual Studio 2005 SDK 4.0 Released</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/03/01/visual-studio-2005-sdk-4-0-released.aspx</link><pubDate>Thu, 01 Mar 2007 12:41:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:2640</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>Seems like there is a &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=51a5c65b-c020-4e08-8ac0-3eb9c06996f4&amp;amp;DisplayLang=en" title="Visual Studio 2005 SDK"&gt;brand new VS SDK available on MSDN&lt;/a&gt;. Not sure if I have the courage to install it considering &lt;a href="http://ljusberg.se/blogs/smorakning/archive/2006/07/05/vwd.webinfo.aspx"&gt;the trouble I had last time&lt;/a&gt;.. Oh well, I'm an optimist.. I'm sure they've ironed out all issues by now, right? :-)&lt;br&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=2640" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>Generating a cross-product with MSBuild</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/02/02/generating-a-cross-product-with-msbuild.aspx</link><pubDate>Fri, 02 Feb 2007 09:07:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:1455</guid><dc:creator>anders</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Have you ever wanted to create a cross-product of two item groups in TeamBuild? &lt;a href="http://blogs.msdn.com/aaronhallberg"&gt;Aaron Hallberg&lt;/a&gt; has &lt;a href="http://blogs.msdn.com/aaronhallberg/archive/2006/09/05/741125.aspx"&gt;a post&lt;/a&gt; in which he explains two possible ways of doing it. I struggled with the same problem a few days ago and found another solution that doesn't involve creating your own MSBuild Task but still keeps the "collection aspect of batching".&lt;/p&gt;

&lt;p&gt;Aaron has a simple lab example that I will use to explain my approach. The goal is to create a cross product of the Foo and Bar collections and then print out the result. My solution follows:&lt;/p&gt;
&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br&gt;&amp;lt;Project DefaultTargets="PrintFooAndBar"&lt;br&gt;         xmlns="http://schemas.microsoft.com/developer/msbuild/2003" &amp;gt;&lt;br&gt;&lt;br&gt;  &amp;lt;ItemGroup&amp;gt;&lt;br&gt;    &amp;lt;Foo Include="foo1"&amp;gt;&lt;br&gt;      &amp;lt;FooMetadata&amp;gt;1&amp;lt;/FooMetadata&amp;gt;&lt;br&gt;    &amp;lt;/Foo&amp;gt;&lt;br&gt;    &amp;lt;Foo Include="foo2"&amp;gt;&lt;br&gt;      &amp;lt;FooMetadata&amp;gt;2&amp;lt;/FooMetadata&amp;gt;&lt;br&gt;    &amp;lt;/Foo&amp;gt;&lt;br&gt;  &amp;lt;/ItemGroup&amp;gt;&lt;br&gt;&lt;br&gt;  &amp;lt;ItemGroup&amp;gt;&lt;br&gt;    &amp;lt;Bar Include="bar1"&amp;gt;&lt;br&gt;      &amp;lt;BarMetadata&amp;gt;a&amp;lt;/BarMetadata&amp;gt;&lt;br&gt;    &amp;lt;/Bar&amp;gt;&lt;br&gt;    &amp;lt;Bar Include="bar2"&amp;gt;&lt;br&gt;      &amp;lt;BarMetadata&amp;gt;b&amp;lt;/BarMetadata&amp;gt;&lt;br&gt;    &amp;lt;/Bar&amp;gt;&lt;br&gt;  &amp;lt;/ItemGroup&amp;gt;&lt;br&gt;&lt;br&gt;  &amp;lt;Target Name="PrintFooAndBar"&amp;gt;&lt;br&gt;    &amp;lt;!-- Create a new list of Items that contain the cross product of Bar and Foo --&amp;gt;&lt;br&gt;    &amp;lt;CreateItem Include="@(Bar)"&lt;br&gt;                AdditionalMetadata="FooMetadata=%(Foo.FooMetadata)"&amp;gt;&lt;br&gt;      &amp;lt;Output ItemName="InternalBar" TaskParameter="Include"/&amp;gt;&lt;br&gt;    &amp;lt;/CreateItem&amp;gt;&lt;br&gt;&lt;br&gt;    &amp;lt;!-- Print the contents of the new list --&amp;gt;&lt;br&gt;    &amp;lt;Message Importance="high"&lt;br&gt;             Text="FooMetadata=%(InternalBar.FooMetadata), BarMetadata=%(InternalBar.BarMetadata)" /&amp;gt;&lt;br&gt;  &amp;lt;/Target&amp;gt;&lt;br&gt;&amp;lt;/Project&amp;gt;&lt;/pre&gt;
&lt;p&gt;I simply use the CreateItem task to merge the two collections into a new collection that contains the metadata from both. I then use this new collection to print out the messages!&lt;/p&gt;

&lt;p&gt;If more information is needed from the collections (maybe you want to keep the %Identity data from Foo) you can simply add more stuff to the AdditionalMetadata attribute ("Foo=%(Foo.Identity);FooMetadata=%(Foo.FooMetadata)")&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=1455" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/MSBuild/default.aspx">MSBuild</category></item><item><title>The Venice Project changes name to Joost!</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/01/16/the-venice-project-changes-name-to-joost.aspx</link><pubDate>Tue, 16 Jan 2007 08:26:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:933</guid><dc:creator>anders</dc:creator><slash:comments>7</slash:comments><description>Last week I blogged about &lt;a href="http://ljusberg.se/blogs/smorakning/archive/2007/01/11/the-venice-project.aspx"&gt;the Venice Project&lt;/a&gt;. Well, I just got an email telling me they've changed their name to "&lt;a href="http://www.joost.com" target="_blank"&gt;Joost&lt;/a&gt;" and will soon be accepting more beta testers. Maybe I'll even get some more invitation tokens soon.. &lt;br&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=933" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/PVR/default.aspx">PVR</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/The+Venice+Project/default.aspx">The Venice Project</category><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Joost/default.aspx">Joost</category></item><item><title>Slow day today</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/01/15/slow-day-today.aspx</link><pubDate>Mon, 15 Jan 2007 10:51:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:926</guid><dc:creator>anders</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;I'm here at work trying to read up on the &lt;a href="http://msdn2.microsoft.com/en-us/library/aa480534.aspx"&gt;Service Factory guidance package&lt;/a&gt; I &lt;a href="http://ljusberg.se/blogs/smorakning/archive/2007/01/04/web-service-software-factory.aspx"&gt;blogged about&lt;/a&gt; a couple of days ago. But everything is soo slow. The &lt;a href="http://www.gotdotnet.com/codegallery/codegallery.aspx?id=6fde9247-53a8-4879-853d-500cd2d97a83"&gt;GotDotNet-site&lt;/a&gt; hardly works at all, all &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/02/ServiceStation/default.aspx" target="_blank"&gt;msdn articles&lt;/a&gt; load with like 10 bytes per minute and &lt;a href="http://www.codeplex.com" target="_blank"&gt;CodePlex&lt;/a&gt; is even more sluggish than usual. Good thing I'm only doing 4 hours today.. Can't wait to get home to Miranda..!&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=926" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Personal/default.aspx">Personal</category></item><item><title>Tagged!</title><link>http://ljusberg.se/blogs/smorakning/archive/2007/01/13/tagged.aspx</link><pubDate>Sat, 13 Jan 2007 18:04:00 GMT</pubDate><guid isPermaLink="false">d8c7d797-13b4-459d-b3ca-3ae05fd06865:891</guid><dc:creator>anders</dc:creator><slash:comments>4</slash:comments><description>Wow, that was quick! I got &lt;a href="http://blogg.joakimsunden.se/2007/01/five-things-people-don-know-about-me.html" title="Tagged" target="_blank"&gt;tagged&lt;/a&gt; by Joakim Sundén which means I'm supposed to tell you five things that you may not know about me. Well, luckily none of my friends actually read this blog so I should be able to tell you more or less anything and it'll all be news to you &lt;img src="http://ljusberg.se/emoticons/emotion-1.gif" alt="Smile" /&gt;. So here goes:&lt;br&gt;&lt;ol&gt;&lt;li&gt;I was born and raised in Göteborg on the Swedish west coast but moved to Stockholm in 1995 to start my studies at KTH (the Royal Institute of Technology). I chose &lt;a href="http://www.kth.se" title="KTH" target="_blank"&gt;KTH&lt;/a&gt; over &lt;a href="http://www.chalmers.se" title="Chalmers" target="_blank"&gt;Chalmers&lt;/a&gt; for two main reasons; first of all they (at least at the time) had a Computer Science program that suited me better, but maybe more importantly I really liked the idea of getting a fresh start in a new city!&lt;/li&gt;&lt;li&gt;My first computer was a Commodore 64, but even before that I used to play a lot with my best friend's VIC 20. I was never into computer games at all though. The only thing I was interested in was programming BASIC. Of course, that changed eventually, and now I enjoy my computer games as much as the next guy.. or probably quite a lot more than the next guy...&lt;/li&gt;&lt;li&gt;A few months ago I made a deal with my girlfriend (Elisabeth). The deal was that she would start blogging (on our common blog "&lt;a href="http://ljusberg.se/blogs/pop" title="Pop" target="_blank"&gt;Pop&lt;/a&gt;") if I gave &lt;a href="http://www.wow-europe.com" title="World of Warcraft"&gt;World of Warcraft&lt;/a&gt; a chance (she already had a couple of lvl 60 characters but to her dismay, I never wanted to play with her). Anyway, she made a couple of posts but haven't blogged since Miranda was born. I, however, got totally hooked on WoW and I even think she's starting to regret having made the deal in the first place.&lt;/li&gt;&lt;li&gt;My master's thesis had the title "Natural Language-based Query Processing in a Limited Domain". It was an attempt to implement the basis of a search engine that could interpret full scentences and then give the expected answers. It was written using a combination of Java and Prolog and was actually quite a lot of fun to do! Since then, I haven't been close to the subject...&lt;/li&gt;&lt;li&gt;Politically, I'd like to describe myself as Green Liberal. Since there is no such party here in Sweden and I'm more green than liberal, I recently joined the &lt;a href="http://www.mp.se" title="Miljöpartiet" target="_blank"&gt;Green Party&lt;/a&gt;. I don't exactly agree with everything they say, but I really think they've made quite a bit of difference (in a good way) to the Swedish environmental policies the past 10 years.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Now.. who do I tag, who do I tag.. I guess I'll go with; &lt;a href="http://merisays.blogspot.com" title="Meri Says" target="_blank"&gt;Meri Guso&lt;/a&gt;, &lt;a href="http://dotnetpret.blogspot.com/" title="Frank" target="_blank"&gt;Frank Kroondijk&lt;/a&gt;, &lt;a href="http://buzzfrog.blogs.com/" title="Dag König" target="_blank"&gt;Dag König&lt;/a&gt;, &lt;a href="http://hornbyrob.spaces.live.com/" title="Rob Hornby" target="_blank"&gt;Rob Hornby&lt;/a&gt; and finally my brother, Thomas Ljusberg (I know, he doesn't have a blog but it's only a matter of time, trust me..!)&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://ljusberg.se/aggbug.aspx?PostID=891" width="1" height="1"&gt;</description><category domain="http://ljusberg.se/blogs/smorakning/archive/tags/Personal/default.aspx">Personal</category></item></channel></rss>
