<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Codality</title>
	<atom:link href="http://blog.najmanowicz.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.najmanowicz.com</link>
	<description>Code and Effect - solving problem with just enough amount of code - by Adam Najmanowicz</description>
	<pubDate>Fri, 27 Jun 2008 14:47:11 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>Fix for EPiServer CMS5 interfering with your EPiServer 4</title>
		<link>http://blog.najmanowicz.com/2008/06/27/fix-for-episerver-cms5-interfering-with-your-episerver-4/</link>
		<comments>http://blog.najmanowicz.com/2008/06/27/fix-for-episerver-cms5-interfering-with-your-episerver-4/#comments</comments>
		<pubDate>Fri, 27 Jun 2008 14:47:11 +0000</pubDate>
		<dc:creator>Adam Najmanowicz</dc:creator>
		
		<category><![CDATA[.Net Framework]]></category>

		<category><![CDATA[ASP.NET]]></category>

		<category><![CDATA[EPiCode]]></category>

		<category><![CDATA[EPiServer]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[Web applications]]></category>

		<guid isPermaLink="false">http://blog.najmanowicz.com/2008/06/27/fix-for-episerver-cms5-interfering-with-your-episerver-4/</guid>
		<description><![CDATA[
The problem that can make a grown up man cry… 
You’re editing your EPiServer 4 project and suddenly the edit mode stops working. the server reports compilation errors. something along the lines:
Compiler error: CS0433: Type „EPiServer.Global” exists in „c:\WINDOWS\assembly\GAC_MSIL\EPiServer\5.1.422.122__8fe83dea738b45b7\EPiServer.dll” and „c:\WINDOWS\assembly\GAC\EPiServer\4.61.5.83__8fe83dea738b45b7\EPiServer.dll”

The solution is to go to your web.config and edit the compilation section. The section [...]]]></description>
			<content:encoded><![CDATA[</p>
<p>The problem that can make a grown up man cry… </p>
<p>You’re editing your EPiServer 4 project and suddenly the edit mode stops working. the server reports compilation errors. something along the lines:</p>
<blockquote><p>Compiler error: CS0433: Type „EPiServer.Global” exists in „c:\WINDOWS\assembly\GAC_MSIL\EPiServer\5.1.422.122__8fe83dea738b45b7\EPiServer.dll” and „c:\WINDOWS\assembly\GAC\EPiServer\4.61.5.83__8fe83dea738b45b7\EPiServer.dll”</p>
</blockquote>
<p>The solution is to go to your web.config and edit the compilation section. The section will most probably look something like this:</p>
<pre>
<div style="font-size: 8pt; background: white; color: black; font-family: courier new"><span style="color: blue">&lt;</span><span style="color: #a31515">configuration</span><span style="color: blue">&gt;</span>
<span style="color: blue">  &lt;</span><span style="color: #a31515">system.web</span><span style="color: blue">&gt;</span>
<span style="color: blue">    &lt;</span><span style="color: #a31515">compilation</span><span style="color: blue"> </span><span style="color: red">defaultLanguage</span><span style="color: blue">=</span>&quot;<span style="color: blue">c#</span>&quot;<span style="color: blue"> </span><span style="color: red">debug</span><span style="color: blue">=</span>&quot;<span style="color: blue">true</span>&quot;<span style="color: blue">&gt;</span>
<span style="color: blue">      &lt;</span><span style="color: #a31515">assemblies</span><span style="color: blue">&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">System.Web.Extensions.Design, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">EPiServer, Version=5.1.422.122, Culture=neutral, PublicKeyToken=8FE83DEA738B45B7</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">EPiServer.BaseLibrary, Version=5.1.422.122, Culture=neutral, PublicKeyToken=8FE83DEA738B45B7</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">System.Configuration.Install, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">EPiServer.Configuration, Version=5.1.422.122, Culture=neutral, PublicKeyToken=8FE83DEA738B45B7</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">EPiServer.Implementation, Version=5.1.422.122, Culture=neutral, PublicKeyToken=8FE83DEA738B45B7</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">EPiServer.XForms, Version=5.1.422.122, Culture=neutral, PublicKeyToken=8FE83DEA738B45B7</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">EPiServer.Events, Version=5.1.422.122, Culture=neutral, PublicKeyToken=8FE83DEA738B45B7</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">EPiServer.Lucene, Version=5.1.422.122, Culture=neutral, PublicKeyToken=8FE83DEA738B45B7</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">ElektroPost.Licensing, Version=5.1.422.122, Culture=neutral, PublicKeyToken=8FE83DEA738B45B7</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">EPiServer.Wsrp, Version=5.1.422.122, Culture=neutral, PublicKeyToken=8FE83DEA738B45B7</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">EPiServer.WebParts, Version=5.1.422.122, Culture=neutral, PublicKeyToken=8FE83DEA738B45B7</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">EPiServer.UI, Version=5.1.422.122, Culture=neutral, PublicKeyToken=8FE83DEA738B45B7</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">EPiServer.Web.WebControls, Version=5.1.422.122, Culture=neutral, PublicKeyToken=8FE83DEA738B45B7</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">      &lt;/</span><span style="color: #a31515">assemblies</span><span style="color: blue">&gt;</span>
<span style="color: blue">    &lt;/</span><span style="color: #a31515">compilation</span><span style="color: blue">&gt;</span>
<span style="color: blue">  &lt;/</span><span style="color: #a31515">system.web</span><span style="color: blue">&gt;                  </span>
<span style="color: blue">&lt;/</span><span style="color: #a31515">configuration</span><span style="color: blue">&gt;    </span>
</div>
</pre>
<p>in my case only the 4th line referencing the EPiServer.dll was interfering with the editing working, but this can easily be trimmed to only first 3 options, so once you&#8217;re done with removing CMS5 entries it could look something like:</p>
<pre>
<div style="font-size: 8pt; background: white; color: black; font-family: courier new"><span style="color: blue">&lt;</span><span style="color: #a31515">configuration</span><span style="color: blue">&gt;</span>
<span style="color: blue">  &lt;</span><span style="color: #a31515">system.web</span><span style="color: blue">&gt;</span>
<span style="color: blue">    &lt;</span><span style="color: #a31515">compilation</span><span style="color: blue"> </span><span style="color: red">defaultLanguage</span><span style="color: blue">=</span>&quot;<span style="color: blue">c#</span>&quot;<span style="color: blue"> </span><span style="color: red">debug</span><span style="color: blue">=</span>&quot;<span style="color: blue">true</span>&quot;<span style="color: blue">&gt;</span>
<span style="color: blue">      &lt;</span><span style="color: #a31515">assemblies</span><span style="color: blue">&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">assembly</span><span style="color: blue">=</span>&quot;<span style="color: blue">System.Web.Extensions.Design, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35</span>&quot;<span style="color: blue">/&gt;</span>
<span style="color: blue">      &lt;/</span><span style="color: #a31515">assemblies</span><span style="color: blue">&gt;</span>
<span style="color: blue">    &lt;/</span><span style="color: #a31515">compilation</span><span style="color: blue">&gt;</span>
<span style="color: blue">  &lt;/</span><span style="color: #a31515">system.web</span><span style="color: blue">&gt;                  </span>
<span style="color: blue">&lt;/</span><span style="color: #a31515">configuration</span><span style="color: blue">&gt;    </span>
</div>
</pre>
<p>The root of the problem supposedly lies in EPiServer SDK integrated with Visual Studio and it’s Visual Studio that puts those lines there once you attempt to add a new element with one of its toolbars or use the Insert-&gt;New item… from File menu or context menu in Project Explorer.</p>
<p>Thanks to the guys on <a href="http://blog.najmanowicz.com/2007/05/08/epicode-hits-irc/">#epicode IRC channel</a> for helping out quickly with the problem.</p>
<p class="akst_link"><a href="http://blog.najmanowicz.com/?p=102&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_102" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blog.najmanowicz.com/2008/06/27/fix-for-episerver-cms5-interfering-with-your-episerver-4/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Text-Image generation - VirtualPathProvider for EPiServer (and ASP.NET in general) &#8211; Part 2 (configuration)</title>
		<link>http://blog.najmanowicz.com/2008/06/24/text-image-generation-virtualpathprovider-for-episerver-and-aspnet-in-general-part-2-configuration/</link>
		<comments>http://blog.najmanowicz.com/2008/06/24/text-image-generation-virtualpathprovider-for-episerver-and-aspnet-in-general-part-2-configuration/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 18:36:00 +0000</pubDate>
		<dc:creator>Adam Najmanowicz</dc:creator>
		
		<category><![CDATA[.Net Framework]]></category>

		<category><![CDATA[ASP.NET]]></category>

		<category><![CDATA[C#]]></category>

		<category><![CDATA[Downloadable]]></category>

		<category><![CDATA[EPiCode]]></category>

		<category><![CDATA[EPiServer]]></category>

		<category><![CDATA[Internet Information Services]]></category>

		<category><![CDATA[Software]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[Web applications]]></category>

		<guid isPermaLink="false">http://blog.najmanowicz.com/2008/06/24/text-image-generation-virtualpathprovider-for-episerver-and-aspnet-in-general-part-2-configuration/</guid>
		<description><![CDATA[
The configuration of the module is a descendant of any EPiServer Virtual Path Provider configuration. This aspect is fairly well described on EPiServer pages. 
A sample configuration for the TextImageVirtualPathProvider can look as follows

&#60;configuration&#62;
  &#60;episerver&#62;
    &#60;virtualPath
      &#60;providers&#62;
        &#60;add showInFileManager=&#8220;false&#8221;
 [...]]]></description>
			<content:encoded><![CDATA[</p>
<p>The configuration of the module is a descendant of any EPiServer Virtual Path Provider configuration. This aspect is fairly well <a href="http://world.episerver.com/Documentation/Items/Tech-Notes/EPiServer-CMS-SP2/Virtual-Path-Providers-in-EPiServer-CMS-5/">described on EPiServer pages</a>. </p>
<p>A sample configuration for the TextImageVirtualPathProvider can look as follows</p>
<pre>
<div style="font-size: 8pt; background: white; color: black; font-family: courier new"><span style="color: blue">&lt;</span><span style="color: #a31515">configuration</span><span style="color: blue">&gt;</span>
<span style="color: blue">  &lt;</span><span style="color: #a31515">episerver</span><span style="color: blue">&gt;</span>
<span style="color: blue">    &lt;</span><span style="color: #a31515">virtualPath</span>
<span style="color: blue">      &lt;</span><span style="color: #a31515">providers</span><span style="color: blue">&gt;</span>
<span style="color: blue">        &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">showInFileManager</span><span style="color: blue">=</span>&#8220;<span style="color: blue">false</span>&#8221;
<span style="color: blue">             </span><span style="color: red">virtualName</span><span style="color: blue">=</span>&#8220;<span style="color: blue">Text Images</span>&#8221;
<span style="color: blue">             </span><span style="color: red">virtualPath</span><span style="color: blue">=</span>&#8220;<span style="color: blue">~/TextImages/</span>&#8221;
<span style="color: blue">             </span><span style="color: red">bypassAccessCheck</span><span style="color: blue">=</span>&#8220;<span style="color: blue">false</span>&#8221;
<span style="color: blue">             </span><span style="color: red">name</span><span style="color: blue">=</span>&#8220;<span style="color: blue">TextImages</span>&#8221;
<span style="color: blue">             </span><span style="color: red">type</span><span style="color: blue">=</span>&#8220;<span style="color: blue">Cognifide.ImageVirtualPathProvider.TextImageVirtualPathProvider,Cognifide.ImageVirtualPathProvider</span>&#8221;
<span style="color: blue">             </span><span style="color: red">physicalPath</span><span style="color: blue">=</span>&#8220;<span style="color: blue">C:\temp\TextImages</span>&#8221;
<span style="color: blue">             </span><span style="color: red">allowedReferers</span><span style="color: blue">=</span>&#8220;<span style="color: blue">(localhost)</span>&#8221;
<span style="color: blue">             </span><span style="color: red">allowNullReferrer</span><span style="color: blue">=</span>&#8220;<span style="color: blue">false</span>&#8221;
<span style="color: blue">             </span><span style="color: red">replacementStrings</span><span style="color: blue">=</span>&#8220;<span style="color: blue">$colon$,:,$gt$,&gt;,$dot$,.,$quot$,</span><span style="color: red">&amp;quot;</span><span style="color: blue">,$amp$,</span><span style="color: red">&amp;amp;</span><span style="color: blue">,$star$,*,$eol$,</span><span style="color: red">&amp;#10;</span><span style="color: blue">,</span>&#8220;<span style="color: blue">/&gt;</span>
<span style="color: blue">      &lt;/</span><span style="color: #a31515">providers</span><span style="color: blue">&gt;</span>
<span style="color: blue">    &lt;/</span><span style="color: #a31515">virtualPath</span><span style="color: blue">&gt;</span>
<span style="color: blue">  &lt;/</span><span style="color: #a31515">episerver</span><span style="color: blue">&gt;</span>
<span style="color: blue">&lt;/</span><span style="color: #a31515">configuration</span><span style="color: blue">&gt;</span>
</div>
</pre>
<p>&nbsp;</p>
<p>where:</p>
<ul>
<li>physicalPath is where the cached version of images will be stored
</li>
<li>shownInFileManager is “false” as there is nothing to present for the user in the file manager.
</li>
<li>allowedReferrers is the regular expression containing the filter for sites that are allowed to access the path provider and get images. This has been added so that your server does not turn into the internet’s text-image open service :)
</li>
<li>allowNullReferrer should be set to false in production environment but allows for testing by directly creating URL’s without using a page to fill in the referrer.
</li>
<li>replacementStrings – this one actually turned out to be very useful since some characters are invalid and not even reaching the VPP if EPiServer or ASP detects them. so to allow for characters like colon or &lt; or even a dot (which would make it hard to form regular expression if it was explicitly available) or * you need to create an escape token for them. The string is a coma separated list of token,value,token,value,…
</li>
<li>virtualPath is something you need to change if you want your VPP to serve images under a different root level folder. (e.g. if you have a page with that name already)</li>
</ul>
<p>&nbsp;</p>
<p>Additionally for IIS6 (most common scenario) you need to add &lt;location&gt; node to configuration for the VPP to work. </p>
<p><span style="color: blue">&lt;</span><span style="color: #a31515">configuration</span><span style="color: blue">&gt;</span><br /><span style="color: blue">&nbsp; &lt;</span><span style="color: #a31515">location</span><span style="color: blue"> </span><span style="color: red">path</span><span style="color: blue">=</span>&#8220;<span style="color: blue">TextImages</span>&#8220;<span style="color: blue">&gt;</span><br /><span style="color: blue">&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515">system.web</span><span style="color: blue">&gt;</span><br /><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!&#8211;</span><span style="color: green"> Setup the StaticFileHandler for the wildcard mapping to work in IIS6</span><span style="color: blue">&#8211;&gt;</span><br /><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515">httpHandlers</span><span style="color: blue">&gt;</span><br /><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515">add</span><span style="color: blue"> </span><span style="color: red">path</span><span style="color: blue">=</span>&#8220;<span style="color: blue">*</span>&#8220;<span style="color: blue"> </span><span style="color: red">verb</span><span style="color: blue">=</span>&#8220;<span style="color: blue">GET,HEAD</span>&#8220;<span style="color: blue"> </span><span style="color: red">type</span><span style="color: blue">=</span>&#8220;<span style="color: blue">System.Web.StaticFileHandler</span>&#8220;<span style="color: blue"> </span><span style="color: red">validate</span><span style="color: blue">=</span>&#8220;<span style="color: blue">true</span>&#8220;<span style="color: blue"> /&gt;</span><br /><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/</span><span style="color: #a31515">httpHandlers</span><span style="color: blue">&gt;</span><br /><span style="color: blue">&nbsp;&nbsp;&nbsp; &lt;/</span><span style="color: #a31515">system.web</span><span style="color: blue">&gt;</span><br /><span style="color: blue">&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #a31515">staticFile</span><span style="color: blue"> </span><span style="color: red">expirationTime</span><span style="color: blue">=</span>&#8220;<span style="color: blue">-1.0:0:0</span>&#8220;<span style="color: blue"> /&gt;</span><br /><span style="color: blue">&nbsp; &lt;/</span><span style="color: #a31515">location</span><span style="color: blue">&gt;</span><br /><span style="color: blue">&lt;/</span><span style="color: #a31515">configuration</span><span style="color: blue">&gt;</span></p>
<pre>
</pre>
<p>Unless you want to change the location of the virtual path provider can be found under, there is nothing you need to change here.</p>
<p>The <a href="https://www.coderesort.com/p/epicode/browser/Cognifide.ImageVirtualPathProvider/5.x">code is accessible on EPiCode</a>, but you can also <a href="http://www.najmanowicz.com/blog_bin/Cognifide.ImageVirtualPathProvider.zip">download a compiled binary here</a>. All you need to do then is to unzip the archive to the “bin” folder within your site and set the web.config values to your preference.</p>
<p class="akst_link"><a href="http://blog.najmanowicz.com/?p=101&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_101" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blog.najmanowicz.com/2008/06/24/text-image-generation-virtualpathprovider-for-episerver-and-aspnet-in-general-part-2-configuration/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Text-Image generation - VirtualPathProvider for EPiServer (and ASP.NET in general) &#8211; Part 1</title>
		<link>http://blog.najmanowicz.com/2008/06/23/text-image-generation-virtualpathprovider-for-episerver-and-aspnet-in-general-part-1/</link>
		<comments>http://blog.najmanowicz.com/2008/06/23/text-image-generation-virtualpathprovider-for-episerver-and-aspnet-in-general-part-1/#comments</comments>
		<pubDate>Mon, 23 Jun 2008 18:00:00 +0000</pubDate>
		<dc:creator>Adam Najmanowicz</dc:creator>
		
		<category><![CDATA[.Net Framework]]></category>

		<category><![CDATA[ASP.NET]]></category>

		<category><![CDATA[C#]]></category>

		<category><![CDATA[EPiCode]]></category>

		<category><![CDATA[EPiServer]]></category>

		<category><![CDATA[Internet Information Services]]></category>

		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[Software]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[Web applications]]></category>

		<guid isPermaLink="false">http://blog.najmanowicz.com/2008/06/23/text-image-generation-virtualpathprovider-for-episerver-and-aspnet-in-general-part-1/</guid>
		<description><![CDATA[The module code is already available on Epicode SVN, the relevant wiki pages will be following as soon as documentation is complete.
The use case is as follows:

The client wants the site to look exactly as in a template provided as a image, 
the text is using a non standard font that is not available on [...]]]></description>
			<content:encoded><![CDATA[<p>The module code is already available on Epicode SVN, the relevant wiki pages will be following as soon as documentation is complete.</p>
<p>The use case is as follows:</p>
<ul>
<li>The client wants the site to look exactly as in a template provided as a image, </li>
<li>the text is using a non standard font that is not available on 60% of Windows machines, </li>
<li>the site does not use flash. </li>
<li>the site needs to be equally good looking in IE6 (more about it later) </li>
</ul>
<p>The solution was to generate images, but how to do it the right way? This has presented us with a once-in-a-lifetime :) opportunity to create a virtual path provider, do something good and learn something new &amp; cool in the process.</p>
<h2>Creating a new virtual path provider.</h2>
<p>this functionality in itself is fairly well <a href="http://msdn.microsoft.com/en-us/library/system.web.hosting.virtualpathprovider.aspx">documented on MSDN</a> one thing to pay attention to is to remember to pass the control to the next provider in the provider queue if your provider does not want to serve the request, so in my case:</p>
<pre>
<div style="font-size: 8pt; background: white; color: black; font-family: courier new">        <span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: #2b91af">VirtualFile</span> GetFile(<span style="color: blue">string</span> virtualPath)
        {
            <span style="color: blue">if</span> (IsPathVirtual(virtualPath))
                <span style="color: #2b91af">VirtualFile</span> file = <span style="color: blue">new</span> <span style="color: #2b91af">TextImageVirtualFile</span>(<span style="color: blue">this</span>, virtualPath);
                <span style="color: blue">return</span> file;
            <span style="color: blue">else</span>
                <span style="color: red"><strong>return Previous.GetFile(virtualPath);</strong></span>
        }</div>
</pre>
<p>this is necessary so you don’t have to have all-or nothing solution (your provider either serving everything the user requests or not being accessible at all) and honestly I’ve spent quite a while before I found out that… I was just being silly – thinking the technology by itself will resolve that ;)</p>
<p>If your Virtual path provider does not actually implement directories you don’t have to make the very provider to do a lot of complicated things. you are perfectly fine to limit the implementation to providing a custom constructor so that EPiServer passes you the configuration data and a couple of methods to tell whether a file is what you want to handle or not</p>
<pre>
<div style="font-size: 8pt; background: white; color: black; font-family: courier new"><span style="color: green">// this one is actually really cool - whatever values you set in your web.config </span>
<span style="color: green">// will be passed to you in the collection so you can really make your VPP </span></div>
<div style="font-size: 8pt; background: white; color: black; font-family: courier new"><span style="color: green">// as configurable as necessary</span>
<span style="color: blue">public</span> TextImageVirtualPathProvider(<span style="color: blue">string</span> name, <span style="color: #2b91af">NameValueCollection</span> configAttributes)</div>
<div style="font-size: 8pt; background: white; color: black; font-family: courier new">
<div style="font-size: 8pt; background: white; color: black; font-family: courier new"><span style="color: green">// This one resolves if the file can be generated</span>
<span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">bool</span> FileExists(<span style="color: blue">string</span> virtualPath) { <span style="color: green">/* &#8230; */</span> }

<span style="color: green">// Pretty much only passes the info that directory was not found </span>
<span style="color: green">// found if the virtual path matches a path that we should handle</span>
<span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">bool</span> DirectoryExists(<span style="color: blue">string</span> virtualDir) {  <span style="color: green">/* &#8230; */</span>  }

<span style="color: green">// Retrieves the virtual file that generates the image if the</span>
<span style="color: green">// Virtual path matches our pattern or disregards the request if it doesn&#8217;t</span>
<span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: #2b91af">VirtualFile</span> GetFile(<span style="color: blue">string</span> virtualPath) {  <span style="color: green">/* &#8230; */</span>  }

<span style="color: green">// Again this is only a pass through method as we don&#8217;t support directories</span>
<span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: #2b91af">VirtualDirectory</span> GetDirectory(<span style="color: blue">string</span> virtualDir) {  <span style="color: green">/* &#8230; */</span> }</div>
</div>
</pre>
<p>Now that we have ASP passing the request to us we need to wonder how to format the request in a way that is intuitive to the user, I wanted the URL to be straightforward and follow the path of EPiServer’s friendly URL-S so that they are easily formed by editors. So how about:</p>
<p><a href="http://my.server.com/color/font-name/font-size/The%20text%20i%20want%20toprint.gif">http://my.server.com/color/font-name/font-size/The%20text%20i%20want%20to%20print.gif</a></p>
<p>Ok.. well…, that won’t fly for GIFs - the font will be plain ugly if I don’t use antialiasing and if I do I will have an ugly black background underneath it. The solution to that would be using translucent PNG (which the VPP supports) but IE6 does not support those with transparency without ugly hacks. So I need to replace the blacks with a hint so that it generates a background colour when it merges the background with the font for antialiasing. For the sake of this article let’s assume it was an easy switch (IT WASN’T!) and let’s extend the URL to:</p>
<p><a href="http://my.server.com/color/antialias-hint-color/font-name/font-size/the-text-i-want-to-print.gif">http://my.server.com/color/antialias-hint-color/font-name/font-size/The%20text%20i%20want%20to%20print.gif</a></p>
<p>But I need the font to be bold! Ok… ok…</p>
<p><a href="http://my.server.com/color/antialias-hint-color/font-name/font-size/font-formatting/The%20text%20i%20want%20to%20print.gif">http://my.server.com/color/antialias-hint-color/font-name/font-size/font-formatting/The%20text%20i%20want%20to%20print.gif</a></p>
</p>
<p>Can I have the image rotated too? Sigh….</p>
</p>
<p><a href="http://my.server.com/color/antialias-hint-color/font-name/font-size/font-formatting(optional)/transformatio(optional)/The%20text%20i%20want%20to%20print.gif">http://my.server.com/color/antialias-hint-color/font-name/font-size/font-formatting(optional)/transformatio(optional)/The%20text%20i%20want%20to%20print.gif</a></p>
<p>The image rotation follows the <a href="http://msdn.microsoft.com/en-us/library/system.drawing.rotatefliptype(VS.71).aspx">RotateFlipType enumeration</a> so you can specify any string that is defined in the <a href="http://msdn.microsoft.com/en-us/library/system.drawing.rotatefliptype(VS.71).aspx">MSDN documentation for the enumeration</a>.</p>
</p>
<p>A sample result for the URL:</p>
<p><a title="http://cms5.cognifide.com/TextImages/Blue/white/Courier%20New/40/BUI/rotate270flipnone/Hello$eol$from$eol$Cognifide!.gif" href="http://my.server.com/TextImages/Blue/white/Courier%20New/40/BUI/rotate270flipnone/Hello$eol$from$eol$Cognifide!.gif">http://my.server.com/TextImages/Blue/white/Courier%20New/40/BUI/rotate270flipnone/Hello$eol$from$eol$Cognifide!.gif</a></p>
<p>Will look as follows</p>
<p align="center"><a href="http://blog.najmanowicz.com/wp-content/uploads/2008/06/helloeolfromeolcognifide.png"><img title="Hello$eol$from$eol$Cognifide!" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="240" alt="Hello$eol$from$eol$Cognifide!" src="http://blog.najmanowicz.com/wp-content/uploads/2008/06/helloeolfromeolcognifide-thumb.png" width="124" border="0" /></a>&#160;</p>
<h2></h2>
<h2>For the curious</h2>
<p>The final string format matching regular expression looks as follows: </p>
<pre>
<div style="font-size: 8pt; background: white; color: black; font-family: courier new"><span style="color: #2b91af">Regex</span> regex = <span style="color: blue">new</span> <span style="color: #2b91af">Regex</span>(
<span style="color: #a31515">    @&quot;^(?&lt;colour&gt;                  # The first match - starting form the beginning of the string</span></div>
<div style="font-size: 8pt; background: white; color: black; font-family: courier new"><span style="color: #a31515">    ([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[a-zA-Z]*))   # match either a 6 hex digit string or a name of a known color - this is for text color</span>
<span style="color: #a31515">    /                             # now we expect the first separating slash</span>
<span style="color: #a31515">    (?&lt;hint&gt;                      # next match group is about background hint for antialiasing</span>
<span style="color: #a31515">    ([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[a-zA-Z]*))   # match either a 3 or 6 hex digit string or a name of a known color - this is for antialiasing color hint</span>
<span style="color: #a31515">    /                             # again separating slash</span>
<span style="color: #a31515">    (?&lt;font&gt;[\w\s]*)              # font family name - accept white spaces</span>
<span style="color: #a31515">    /                             # yet another separating slash</span>
<span style="color: #a31515">    (?&lt;size&gt;[\d]{0,3})            # font size </span>
<span style="color: #a31515">    /                             # oh noes! another slash!</span>
<span style="color: #a31515">    ((?&lt;style&gt;[BIUSRN\s]*)        # font style Bold, Italic, Underline, Strikethrough</span>
<span style="color: #a31515">    /){0,1}                       # this group is optional.</span>
<span style="color: #a31515">    ((?&lt;transform&gt;[\w]*)          # transformation name as specified with System.Drawing.RotateFlipType - this group is optional</span>
<span style="color: #a31515">    /){0,1}                       # this group is optional too.</span>
<span style="color: #a31515">    (?&lt;text&gt;[\s\S]*[^\.])         # the text to render - basically anything but a dot - use relacement strings for dots</span>
<span style="color: #a31515">    [\.]                          # separating dot - now that&#8217;s a nice change!</span>
<span style="color: #a31515">    (?&lt;extension&gt;(png|gif))       # the file extension - so that we know whether to generate png or gif</span>
<span style="color: #a31515">    $                             # everything comes to an end  </span>
<span style="color: #a31515">    &quot;</span>,
    <span style="color: #2b91af">RegexOptions</span>.Compiled | <span style="color: #2b91af">RegexOptions</span>.IgnoreCase | <span style="color: #2b91af">RegexOptions</span>.IgnorePatternWhitespace | <span style="color: #2b91af">RegexOptions</span>.CultureInvariant);</div>
</pre>
<p>&#160;</p>
<h2>Usability concerns</h2>
<p>The Colours can be provided as both named Colours (red, green, etc..) or html hex formatted colours (e.g. ff00bb, fob, fff, badfoo) both 6 and 3 hex digits strings are accepted.</p>
<p>The URL accepts spaces, and whatever text string that cannot be passed as a part of the url or is invalidated by EPiServer can be escaped by defining a token for it in web.config so for example as you can see in the above url the end of line “\n” character has been escaped into $eol$.</p>
<p>Obviously the font selection is limited to what is installed on your server.</p>
<h2>Performance concerns</h2>
<p>The basic concern that comes to mind is – how does this impact the server performance if the image is generated every time? Even though the performance impact seemed to be negligible I’ve decided to cache content. These things simply pile up if you have a high load site so why take the chance? Once an URL is called it is saved on first generation asserting the uniqueness of each parameter. Colours like black and 000 will be treated as same colour and cached only once. </p>
<h2>Security concerns</h2>
<p>So what was done to prevent our server to be an open server for generating images for everyone on the Internet? The VPP only allows for the images to be generated if the request referrer is in a domain or a host that is specified in the web.config. Additionally for testing you can enable the referrer to be null (direct call to images, as opposed to referring to them from a page). </p>
<p>Also as a seconds line of defence, it’s wise to define the cache folder on a share with a quota so we don’t get our server filled up with images should the referrer limiting measure fail for some reason.</p>
<p class="akst_link"><a href="http://blog.najmanowicz.com/?p=100&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_100" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blog.najmanowicz.com/2008/06/23/text-image-generation-virtualpathprovider-for-episerver-and-aspnet-in-general-part-1/feed/</wfw:commentRss>
		</item>
		<item>
		<title>CogniScale - virtual hosting made easy</title>
		<link>http://blog.najmanowicz.com/2008/06/02/cogniscale-virtual-hosting-made-easy/</link>
		<comments>http://blog.najmanowicz.com/2008/06/02/cogniscale-virtual-hosting-made-easy/#comments</comments>
		<pubDate>Mon, 02 Jun 2008 21:10:03 +0000</pubDate>
		<dc:creator>Adam Najmanowicz</dc:creator>
		
		<category><![CDATA[C#]]></category>

		<category><![CDATA[Downloadable]]></category>

		<category><![CDATA[EPiServer]]></category>

		<category><![CDATA[Internet Information Services]]></category>

		<category><![CDATA[Microsoft SqlServer]]></category>

		<category><![CDATA[Software]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[Web applications]]></category>

		<guid isPermaLink="false">http://blog.najmanowicz.com/2008/06/02/cogniscale-virtual-hosting-made-easy/</guid>
		<description><![CDATA[We&#8217;ve not been talking much about it and that&#8217;s partially my fault as well (busy with other projects), but Cognifide has a really cool initiative called Cognifide Labs that we intend to grow over time. The plan is to devote up to 10% company time into side projects that help us grow expertise and allow [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ve not been talking much about it and that&#8217;s partially my fault as well (busy with other projects), but <a href="http://www.cognifide.com/">Cognifide</a> has a really cool initiative called <a href="http://labs.cognifide.com/">Cognifide Labs</a> that we intend to grow over time. The plan is to devote up to 10% company time into side projects that help us grow expertise and allow our devs to dwell into interesting technologies, methodologies and languages and develop their skills.</p>
<p>One of the first projects (that I took part in) is <a href="http://cogniscale.cognifide.com/">CogniScale</a> - an app that allows <a href="http://www.flexiscale.com/">FlexiScale</a> users to manage their servers. Here&#8217;s the story&#8230; </p>
<p>Being the agile company taking part in many <a href="http://www.episerver.com/">EPiServer</a> projects we never seem to have enough environments to test our web-apps and software in general in various scenarios. We find ourselves constantly reinstalling and trying to keep our servers in a state that can can at least remotely be called as stable. After all how many deployments and tearing down of various <a href="http://www.episerver.com/">EPiServer</a>, <a href="http://ccnet.thoughtworks.com/">CruiseControl</a>, <a href="http://www.jetbrains.com/teamcity/">TeamCity</a>, SQL Server and other &quot;I need to have&quot; apps can a server take before slowing down to a crawl or collapsing all together (that said I bow before our faithful THOTH for taking all the abuse it does). We definitely needed more servers! And we needed them now! </p>
<p>Early this year we&#8217;ve started to talk to the guys at XCalibre that came up with a great idea. What if you could have an unlimited amount of servers available for you at any given time? I mean really what if you could have 0 servers one day and the next day have a rich farm of servers for literally no cost, paying only when you power them up and not paying a bit if you take them down.&#160; This turned out to be quite a project for them that turned to materialize as FlexiScale. (<a href="http://flexiscale.com/about_us.html">you can read more about it here</a>). Looking at all that I&#8217;ve mentioned before while eliminating the cost of maintaining the servers locally we decided to give FlexiScale a spin. </p>
<p><span id="more-97"></span></p>
<p>Early this year FlexiScale published a set of API&#8217;s that we looked at and (being the geeks we are) tried to utilize it in a desktop application with a limited success. It turned out that the initial API was perfectly accessible from dynamically typed languages while statically typed languages like C# didn&#8217;t really get their love in the initial release :) So we started opening the support tickets and shortly after that establishing a lively dialogue with the great folks there. Let me tell you, the guys in the FlexiScale support are really an amazing and responsive bunch. Not only did we get the support and the fixes we needed for the language we chose but we also pretty much got all our suggestions implemented and added to the API&#8217;s.</p>
<p>Thus <a href="http://cogniscale.cognifide.com/">CogniScale</a> was born:</p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="470" alt="cogniscale" src="http://blog.najmanowicz.com/wp-content/uploads/2008/06/cogniscale_main_form.jpg" width="644" border="0" />&#160; </p>
<p>The app allows for easy powering up and down the servers (allowing you to describe the reason for the action) from a nice and shiny GUI as well as scheduling it with windows task scheduler through its command line interface. it allows you to connect using FTP or Remote Desktop as well as any other app you can run from command line (it features a custom command editor that allows you to configure any app to work with it) with a single click. The app also allows you to quickly go through the history of servers&#8217; maintenance to determine how often and for what reason were they taken on and off-line.</p>
<p>Should you decide that FlexiScale is your thing, please give <a href="http://cogniscale.cognifide.com/">CogniScale</a> a whirl and let us know what you think.</p>
<p class="akst_link"><a href="http://blog.najmanowicz.com/?p=97&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_97" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blog.najmanowicz.com/2008/06/02/cogniscale-virtual-hosting-made-easy/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Is it Yeti? Is it a magazine? I sense disturbance in The Force</title>
		<link>http://blog.najmanowicz.com/2008/03/11/is-it-yeti-is-it-a-magazine-i-sense-disturbance-in-the-force/</link>
		<comments>http://blog.najmanowicz.com/2008/03/11/is-it-yeti-is-it-a-magazine-i-sense-disturbance-in-the-force/#comments</comments>
		<pubDate>Tue, 11 Mar 2008 18:21:42 +0000</pubDate>
		<dc:creator>Adam Najmanowicz</dc:creator>
		
		<category><![CDATA[Apple]]></category>

		<category><![CDATA[Blogging]]></category>

		<category><![CDATA[Lifestyle]]></category>

		<category><![CDATA[Mobile]]></category>

		<category><![CDATA[Rants]]></category>

		<guid isPermaLink="false">http://blog.najmanowicz.com/2008/03/11/is-it-yeti-is-it-a-magazine-i-sense-disturbance-in-the-force/</guid>
		<description><![CDATA[There&#8217;s been a great link to an article forwarded to me today to a Newsweek&#8217;s Apple PR division Technology columnist Steven Levy. Where he claimed that he has lost (although he is not sure (LOL) ) his MacBook Air. blogosphere is throwing their hands up in the Air ;), but really&#8230; it&#8217;s so funny on [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s been a great link to an article forwarded to me today to a Newsweek&#8217;s <strike>Apple PR division</strike> Technology columnist Steven Levy. Where he claimed that he has lost (although he is not sure (LOL) ) his MacBook Air. <a href="http://blogs.zdnet.com/Apple/?p=1395">blogosphere</a> is throwing their hands up in the Air ;), but really&#8230; it&#8217;s so funny on so many levels that people are all about the story (ironically so am I with this post). The article is such a great example of the Apple hype machine at its best. Let me elaborate</p>
<p>Let&#8217;s start with the heading to the article:</p>
<blockquote><p>There will be a lot of desperate searches for lost MacBook Airs. And can you really blame a guy for losing something called Air?</p>
</blockquote>
<p>Oh really? I have a newsflash for you Steven: 90% of everything is SMALLER than your Air. Over the years people have learned to get a hold of their credit cards, cell phones, money, keys. When was the last time someone made a stink about them loosing a PDA? All of them are by far smaller and lighter than the Air. </p>
<p><span id="more-95"></span></p>
<p>A tip for you Steven: just bend your papers before you throw them out. Really, if the paper stack does not bend vertically there&#8217;s usually something there that should not be discarded. A CD (another thing smaller than Air)? <a href="http://talkback.zdnet.com/5208-11408-0.html?forumID=1&amp;threadID=45370&amp;messageID=838188&amp;start=0">If that is even true</a>, god knows what else are you throwing away.</p>
<p>So what&#8217;s the point of the article? The first page is soaking with words &quot;MacBook&quot; and &quot;MacBook Air&quot;. Nice! Quite &quot;incidentally&quot; if you have your google settings set to English language you&#8217;ll see the link to the guy on the first page. Bottom of it, granted, but would you really expect him to beat Apple&#8217;s official page and Amazon?</p>
<p align="center"><a href="http://blog.najmanowicz.com/wp-content/uploads/2008/03/macbookair.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="MacBookAir" src="http://blog.najmanowicz.com/wp-content/uploads/2008/03/macbookair-thumb.png" width="147" border="0" /></a> </p>
<p align="left">Let&#8217;s get back for a minute and consider one thing What&#8217;s the ultimate internet&#8217;s currency? Links (You won&#8217;t get one here, sorry) . Newsweek decided that they will pony up the 1800 for the Air (since it was a loaner) but hey! Fear not, they are far from losing on the exchange. They appear on the first page of the search for MacBook Air.</p>
<p align="left">Honestly I wouldn&#8217;t be surprised if no money exchanged hands at all here. What could be better marketing for apple than someone singing songs in their choir about how slim the notebook is?</p>
<p align="left">Seriously&#8230; next time you stumble upon an article of that &quot;<a href="http://en.wikipedia.org/wiki/Steven_Levy">prominent and respected critic of Apple Inc</a>&quot; (he even has apple in his wikipedia profile!) pay attention! I don&#8217;t seem to be <a href="http://talkback.zdnet.com/5208-11408-0.html?forumID=1&amp;threadID=45370&amp;messageID=838188&amp;start=0">alone</a> on that <a href="http://talkback.zdnet.com/5208-11408-0.html?forumID=1&amp;threadID=45370&amp;messageID=838458&amp;start=-9990">opinion</a> as well.</p>
<p align="left">Lo and behold - this is not the last of those stunts. TSA is <a href="http://www.michaelnygard.com/blog/2008/03/steve_jobs_made_me_miss_my_fli.html">not letting a guy to enter a plane cause Air is just too small to be a computer</a> and I agree you have to be much more paranoid to think that this could be orchestrated by Apple, but they&#8217;re not crying about it either. Do I hear the echoes of Microsoft munchkins from 10-15 years ago?</p>
<p align="left">Now how&#8217;s that for a conspiracy theory? ;)</p>
<p class="akst_link"><a href="http://blog.najmanowicz.com/?p=95&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_95" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blog.najmanowicz.com/2008/03/11/is-it-yeti-is-it-a-magazine-i-sense-disturbance-in-the-force/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Episerver&#8217;s brand new blogger</title>
		<link>http://blog.najmanowicz.com/2008/03/04/episervers-brand-new-blogger/</link>
		<comments>http://blog.najmanowicz.com/2008/03/04/episervers-brand-new-blogger/#comments</comments>
		<pubDate>Tue, 04 Mar 2008 14:56:28 +0000</pubDate>
		<dc:creator>Adam Najmanowicz</dc:creator>
		
		<category><![CDATA[ASP.NET]]></category>

		<category><![CDATA[Blogging]]></category>

		<category><![CDATA[EPiCode]]></category>

		<category><![CDATA[EPiServer]]></category>

		<category><![CDATA[Faceted Navigation]]></category>

		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://blog.najmanowicz.com/2008/03/04/episervers-brand-new-blogger/</guid>
		<description><![CDATA[I&#8217;m really glad to notice that Marek is getting into blogging about EPiServer. Marek is a really bright developer and a colleague at Cognifide with a number of successful EPiServer projects in his portfolio, we&#8217;ve worked together on Faceted Navigation (he&#8217;s the brain behind all the nifty editors in it) that I&#8217;m working on open [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m really glad to notice that <a href="http://marekblotny.blogspot.com/">Marek</a> is getting into blogging about <a href="http://www.episerver.com/">EPiServer</a>. Marek is a really bright developer and a colleague at <a href="http://www.cognifide.com/">Cognifide</a> with a number of successful EPiServer projects in his portfolio, we&#8217;ve worked together on Faceted Navigation (he&#8217;s the brain behind all the nifty editors in it) that I&#8217;m working on open sourcing of currently, and on the <a href="http://www.setantasports.com/">Setanta Sports Portal</a> and the <a href="http://www.setanta.com/">Setanta corporate</a> site projects. Now he&#8217;s out in the wild writing about it. Go ahead and read his analysis on the <a href="http://marekblotny.blogspot.com/2008/03/episerver-5-vs-episerver-461-part-i.html">performance of Episerver 4.x versus CMS 5</a>. It appears that the CMS is getting&#8230; nah&#8230; I won&#8217;t spoil it for you&#8230; Read all about it on <a href="http://marekblotny.blogspot.com/">Marek&#8217;s brand new blog</a>!</p>
<p class="akst_link"><a href="http://blog.najmanowicz.com/?p=92&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_92" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blog.najmanowicz.com/2008/03/04/episervers-brand-new-blogger/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Faceted Service Structure</title>
		<link>http://blog.najmanowicz.com/2008/01/24/faceted-service-structure/</link>
		<comments>http://blog.najmanowicz.com/2008/01/24/faceted-service-structure/#comments</comments>
		<pubDate>Thu, 24 Jan 2008 16:18:33 +0000</pubDate>
		<dc:creator>Adam Najmanowicz</dc:creator>
		
		<category><![CDATA[.Net Framework]]></category>

		<category><![CDATA[ASP.NET]]></category>

		<category><![CDATA[EPiCode]]></category>

		<category><![CDATA[EPiServer]]></category>

		<category><![CDATA[Faceted Navigation]]></category>

		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[Software]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[Web applications]]></category>

		<guid isPermaLink="false">http://blog.najmanowicz.com/2008/01/24/faceted-service-structure/</guid>
		<description><![CDATA[This article is a part of the series describing the faceted navigation system for EPiServer that we have developed in Cognifide and that&#8217;s already proven to be a robust solution for delivering tagged content a heavy traffic site. The engine will be released shortly as an open source project.
So how is the faceted engine structured?

 [...]]]></description>
			<content:encoded><![CDATA[<p>This article is a part of the <a href="http://blog.najmanowicz.com/category/episerver/faceted-navigation/">series describing the faceted navigation system for EPiServer</a> that we have developed in <a href="http://www.cognifide.com/">Cognifide</a> and that&#8217;s already proven to be a robust solution for delivering tagged content a heavy traffic site. The engine will be released shortly as an open source project.<br />
<h2>So how is the faceted engine structured?</h2>
</p>
<p align="center"><a href="http://blog.najmanowicz.com/wp-content/uploads/2008/01/facetednavigationschema.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="195" alt="FacetedNavigationSchema" src="http://blog.najmanowicz.com/wp-content/uploads/2008/01/facetednavigationschema-thumb.png" width="244" border="0"/></a> </p>
<p><span id="more-91"></span></p>
<h2>Content provider</h2>
<p>As you can see the driving force behind the engine is the Facet Tagged Content Provider. If you know EPiServer, the basic functionality of the module is roughly an an equivalent of find page with criteria for categories, which allows for searching pages tagged with facets with exclusion of some other facets and tagged some optional data, the module however is paging and and allows you to plug a feedback event handler so that your controls can accept or deny a story before they are sent to is and take part in the paging. The stories are provided to you in reverse order of publishing so you always get the latest stories first, (pretty much what any blog and any news site wants).</p>
<p>Another function of the content provider is assertion of story uniqueness on the page. This is actually a pretty cool mechanism that deserves closer attention.</p>
<p>Let&#8217;s imagine a page having a control with &#8220;main story&#8221; that is pre-selected by an editor, and then some &#8220;featured stories&#8221; also pre-selected, then there is a control with &#8220;latest news concerning facet A&#8221; and a &#8220;latest news concerning facet B&#8221;. The problem with this scenario is that if a story was pre-selected for the &#8220;main story&#8221; and perhaps then someone added it to &#8220;featured stories&#8221;, and the story actually is tagged by facet A and facet B - in a traditional search you would normally get it in all of the controls&#8230; not cool! </p>
<p>The solution that we&#8217;ve come up with is based on a free market rules. And the procedure is as follows:</p>
<ol>
<li>The request starts and the engine opens a bidding for articles.  </li>
<li>All the controls request their interest in stories by either providing the engine with pre-selected stories they would like to display or asking it to provide the freshest content based on the facets the content is tagged with. They also provide it with their value (priority). And a callback for the engine to provide them with the stories.  </li>
<li>The acceptance phase ends and the engine distributes the stories looking from the highest value controls down the list in the following way
<ul>
<li>when the control provide the list of articles if so check for each article if it has not been taken yet, and otherwise feed it back to the control  </li>
<li>otherwise if the control provided it with the facets it&#8217;s &#8220;interested in&#8221; it asks the tagged content store for articles tagged with this context and feeds them to the control if they have not been otherwise provided to another control with higher priority, until it reaches the number requested by the control. (this way of providing articles also allows for paging).</li>
</ul>
</li>
<li>Upon satisfying all the controls the bidding is closed and all articles become available again.</li>
</ol>
<h2>Content Accelerator</h2>
<p>Content accelerator is a caching module that we have made mandatory that all of our EPiServer calls must pass through. The engine turns the pages into objects with a well defined and hard typed objects rather than a-bag-of-strings-and-the-likes your usual PageData is.</p>
<p>This makes it much more efficient for us to cache only the important data contained in any given page and only the data that we use frequently, e.g. page name and page URL that are used by URL provider and that are likely to be called multiple times within any given user request. This has been been implemented to compensate for the slowness of GetPage calls.</p>
<p>For that to work effectively we always tread content accelerator as a proxy for GetPage - which allows us to filter any expired or not yet published pages faster and refresh the content and accessibility for everyone, any time any given content is refreshed.</p>
<p>The For this concept to work - any page type that is going to be used in it has to have its own class added to it with the properties you will usually access (this however should be done with caution, for example you can cache article intro, but caching a potentially big article is a bad idea - also a full article text is very unlikely to be displayed on a high traffic page so caching all of your article full texts will not offset for a potential quick running out of memory).</p>
<p>Also the content cache is written using generics in a way that allows you to specify a multiple classes for any page types - the class consuming the cache defines how it wants to treat the content and access it. The different cache classes will then be chain linked and refreshed.</p>
<p>The content expires on an arbitrary set time (1 minute in our case but you can specify any other period), but we&#8217;ve also written a web service allowing for expiring a page-cache-item whenever it is changed on any of servers in a multiserver scenario. This for this to work - you have to plug into the global EPiServer event handlers. Which I&#8217;ll describe later.</p>
<p>The accelerator is used extensively by the faceted engine, but it can also be used directly and is completely independent of the rest of the faceted engine.</p>
<h2>Facet Context Provider</h2>
<p>This provides the control with ewasy facility to retrieve the facets with which the request was performed.</p>
<h2>Facet URL Provider</h2>
<p>This service allows you to construct URLs based on a facet context - with automatic determination of a preferred visualisation (hub page). Naturally you can still force the provider to format the URL for a pre-determined page. The effect will be a request that can later be succesfully parsed by the Context Provider once that URL is executed on the server.</p>
<h2>Auto Tagging Module</h2>
<p>This block which originally was a separate module is now basically shrunk to a single method that you can plug into EPiServer in the Global.asax. The routine tags a page with facets predefined in its parent, during the process of a page creation. This is useful for tagging e.g. all the &#8220;technology&#8221; stories with &#8220;technology&#8221; facet and an &#8220;News&#8221; facet once its created in the &#8220;Technology articles&#8221; branch.</p>
<h2>Furniture</h2>
<p>Part of the faceted navigation, but not directly part of the engine are editors for facet roles, the very facets and facet selectors.</p>
<p class="akst_link"><a href="http://blog.najmanowicz.com/?p=91&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_91" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blog.najmanowicz.com/2008/01/24/faceted-service-structure/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Faceted Navigation Engine Nomenclature</title>
		<link>http://blog.najmanowicz.com/2008/01/24/faceted-navigation-engine-nomenclature/</link>
		<comments>http://blog.najmanowicz.com/2008/01/24/faceted-navigation-engine-nomenclature/#comments</comments>
		<pubDate>Thu, 24 Jan 2008 15:36:35 +0000</pubDate>
		<dc:creator>Adam Najmanowicz</dc:creator>
		
		<category><![CDATA[.Net Framework]]></category>

		<category><![CDATA[ASP.NET]]></category>

		<category><![CDATA[EPiCode]]></category>

		<category><![CDATA[EPiServer]]></category>

		<category><![CDATA[Faceted Navigation]]></category>

		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[Software]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[Web applications]]></category>

		<guid isPermaLink="false">http://blog.najmanowicz.com/2008/01/24/faceted-navigation-engine-nomenclature/</guid>
		<description><![CDATA[This article is the second of a series describing the faceted navigation system for EPiServer that we have internally developed in Cognifide, that&#8217;s already proven to be a robust solution for delivering tagged content a heavy traffic site, which will be released shortly as an open source project.
First of all we have to explain the [...]]]></description>
			<content:encoded><![CDATA[<p align="left">This article is the second of a <a href="http://blog.najmanowicz.com/category/episerver/faceted-navigation/">series describing the faceted navigation system for EPiServer</a> that we have internally developed in <a href="http://www.cognifide.com/">Cognifide</a>, that&#8217;s already proven to be a robust solution for delivering tagged content a heavy traffic site, which will be released shortly as an open source project.</p>
<p align="left">First of all we have to explain the nomenclature as it is going to be used quite a bit. A few terms we use pretty extensively are:</p>
<ul>
<li>
<div align="left">Facet - this is roughly an elaborate version of an EPiServer (or Wordpress) category. One of the problem with EPiServer category is that it is just that and absolutely nothing more. There is no way for attaching metadata and conditional structuring of the category tree. There is no way to assign them roles. Facets provide you with much, MUCH more.</div>
</li>
</ul>
<p><span id="more-88"></span></p>
<li>
<div align="left">Navigation space - Facets just like categories are structured in a tree, this is good for browsing them in a back end for tagging and organizing them. However we sometimes need to have a different view at facets structure based on the place we are in on the site. a good sample of that is <a href="http://www.setantasports.com/">Setanta Sports site</a>. you want to have a different navigation in the Sports (news) section and a different navigation when you browse blogs. Facets can have a different set of children and other facets that they expose based on the navigation space you are in.</div>
</li>
<li>
<div align="left">Facet collection - a simple set of any facets.</div>
</li>
<li>
<div align="left">Facet context - this is a special collection of facets possibly of many roles, but also abiding to the rules stated by Facet roles. Most notably a &#8220;current context&#8221; is a collection of facets the request has been performed with.</div>
</li>
<li>
<div align="left">Facet role - a facet can be a tagging unit like a category, but a facet can be much more. for that we came up with a concept of facet roles which allows us to profile facets:</div>
<ul>
<li>
<div align="left">ability to use for tagging - not all facets you necessarily want to be used for tagging. Some tags are indeed used to identify a content, but some tags play more utilitatian way like &#8220;locale&#8221; that we are in - you would not necessarily tag a content as being only available within a certain locale (although you might want to do that anyway), therefore a role &#8220;locale&#8221; may be set as not taggable. </div>
</li>
<li>
<div align="left">uniqueness - You may want to limit a role to only be able to has one of its member in any facet collection (IFacetrCollection). After all a user cannot be in 2 places at once so yet another logical extension for locale. Also request can only be performed within a context of one navigation space - therefore a navigation space representing tag need to be unique.</div>
</li>
<li>
<div align="left">separating facets of different roles - once you are presented with a context of tags, you may want to categorize them. e.g. to color a header in a control you may want to know which &#8220;sport&#8221; the tag represents.</div>
</li>
<li>
<div align="left">menu visibility - you may choose to display or not some tags in your navigation- this is the simplest way to specify that a meta-facets like say.. &#8220;flash video&#8221; should not generate a menu item as this is quite irrelevant to user.</div>
</li>
<li>
<div align="left">context mandatory - this indicates that any given context has to have at least one facet of that role - if a context does not have any of the facets of this role - a default facet for this role will be used. For example - a user cannot be placed in a null locale, he has to be &#8220;somewhere on earth&#8221;, doesn&#8217;t he? ;)</div>
</li>
<li>
<div align="left">availability for selection - this allows us to tell whether a facet can be used by editors and be visible on the site or whether it&#8217;s use is of more esoteric nature and the editor should not have it visible anywhere on the site - after all why would the editor want to see the navigation space representatives.</div>
</li>
<li>
<div align="left">System Role - this indicates that a role is crucial to the operation of the faceted navigation and as such should never be deleted.</div>
</li>
</ul>
</li>
<li>
<div align="left">Facet mappings - allows us to link facets to external id&#8217;s available outside the system. for example when you import an rss feed - you want to be able to always tag the articles from it with a proper facet - so for mapping &#8220;Rss Feeds&#8221; there will be mutually unique relation between a tag and a URL of the rss feed.</div>
</li>
<li>
<div align="left">Facet Navigation Info - allows the engine to specialize the facet structure within the navigation space - the navigation is a cross-section between a facet and a navigation space.</div>
</li>
<li>
<div align="left">Preferred Facet Hub Page - all facets can carry the information on what is their preferred page to be displayed(this is defined in the navigation info) . In any given context you don&#8217;t really care what page are you on - the page is just a visualisation of content that is defined by facets. But you may want your facet to cause a switch of this visualisation once it is becoming the dominating facet in the context (a facet with highest priority in the context) - So for any given set of facets - you query the URL provider with it and it will check the context and select the dominating facet and get the hub page for displaying the context from it. For example when you&#8217;re on a sports page and you click on a football - you want a more specialized page that might have some football tables on it rather than the generic sports page.</div>
</li>
<p class="akst_link"><a href="http://blog.najmanowicz.com/?p=88&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_88" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blog.najmanowicz.com/2008/01/24/faceted-navigation-engine-nomenclature/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The challenges of a high traffic site with EPiServer</title>
		<link>http://blog.najmanowicz.com/2008/01/23/the-challenges-of-a-high-traffic-site-with-episerver/</link>
		<comments>http://blog.najmanowicz.com/2008/01/23/the-challenges-of-a-high-traffic-site-with-episerver/#comments</comments>
		<pubDate>Wed, 23 Jan 2008 14:43:38 +0000</pubDate>
		<dc:creator>Adam Najmanowicz</dc:creator>
		
		<category><![CDATA[.Net Framework]]></category>

		<category><![CDATA[ASP.NET]]></category>

		<category><![CDATA[EPiCode]]></category>

		<category><![CDATA[EPiServer]]></category>

		<category><![CDATA[Faceted Navigation]]></category>

		<category><![CDATA[Microsoft SqlServer]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[Web applications]]></category>

		<guid isPermaLink="false">http://blog.najmanowicz.com/2008/01/23/the-challenges-of-a-high-traffic-site-with-episerver/</guid>
		<description><![CDATA[&#8230;with an unconventional approach to data fetching.
This article is a first of a series describing the faceted navigation system for EPiServer that we have internally developed in Cognifide and that&#8217;s already proven to be a robust solution for delivering tagged content a heavy traffic site, which will be released shortly as an open source project. [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230;with an unconventional approach to data fetching.</p>
<p>This article is a first of a <a href="http://blog.najmanowicz.com/category/episerver/faceted-navigation/">series describing the faceted navigation system for EPiServer</a> that we have internally developed in <a href="http://www.cognifide.com/">Cognifide</a> and that&#8217;s already proven to be a robust solution for delivering tagged content a heavy traffic site, which will be released shortly as an open source project. The article outlines some pitfalls of EPiServer that we&#8217;ve run into and the nature of the <a href="http://www.setantasports.com/">project</a> in which the module was used first and which influenced a lot of our design decisions.</p>
<p>This article and the Faceted Navigtation module is developed on EPiServer 4.61 and not the latest version 5 of the CMS so far, so mind that some of my reservations may not be a problem if you&#8217;re just starting to work on a brand new project and have the luxury of using new features of it. </p>
<p>Also (which may be a good thing) our sites uses a different approach to navigation the content, we do not really care much for the tree structure, but we treat all EPiServer pages equally when looking for content because of how the site is designed from the creative point of view.</p>
<p><span id="more-87"></span>
<p>The <a href="http://www.setantasports.com/">project</a> is a vast site with:</p>
<ul>
<li>tens of editors working on it simultaneously.</li>
<li>millions of uniques per month</li>
<li>tens of thousands of articles in just about half a year</li>
<li>5 IIS servers working in tandem on a single SQL database</li>
<li>The page cannot be cached as a whole as it contains dynamic and Geo-targeted content.</li>
<li>The content on the page changes every other minute or more often</li>
<li>There is a great deal of automated content coming from various feeds.</li>
<li>A content can be both feeded automatically based on the time of publishing as well as forced in some controls and no article can appear on a page twice, yet controls have to have predefined number of links. May not seem hard to do, but believe me once controls will start stealing articles form each other you&#8217;ll see why I listed it as a main feature.</li>
</ul>
<p>First thing to give the credit where it&#8217;s due - let me enumerate the good sides of using EPiServer in the scenario (the parts that we found particularly useful):</p>
<ul>
<li>EPiServer provides a beautiful interface to the editors. Both for editing pages and organizing the content.</li>
<li>EPiServer provides a great infrastructure for us to plug into it with property types, and GUI plugins</li>
<li>EPiServer allows us to use as much or as many of its elements as we need - from our point of view we mostly use it as a repository and pretty much ignored all of its custom controls and a great deal of its APIs (which I&#8217;ll explain later why.</li>
</ul>
<p>The list does not seem like a long one - but believe me - all of the points are fundamental to the success of the site! The editors love the UI, the developers love the extensibility and &#8220;pluggability&#8221; of the APIs. And the logical structure of the database allowed us for flexibility in skipping some APIs where it proved that a direct database call was beneficial.</p>
<p>The bad part is basically that the EPiServer API is slow for what we needed it to perform (the site can easily reach a couple of thousand simultaneous connections at peak times), if we wanted to use GetPage() for every link on the site we would be in serious troubles.&nbsp; At our average of 155 links per page, this was a serious problem. </p>
<p>Also since we have a structure of the tree that is not directly reflected on the site, but rather we search by &#8220;categories&#8221;. The idea of the site is that it is a huge search engine that displays the freshest content content based on the facets it is tagged with. Using the EPiServer APIs we would have to use FindPagesWithCriteria() which in itself is probably the most disliked call speed-wise. Also categories in themselves do not support any metadata (there are no properties for categories). Needless to say - we had to implement our own code for this kind of creative approach and that&#8217;s what we did.</p>
<p>In effect, what we limited to the list of hardest abusers are:</p>
<ul>
<li>FindPagesWithCriteria()</li>
<li>Getpage()</li>
<li>GetChildren()</li>
<li>and (mostly based on <a href="http://www.episerver.com/templates/PageWithRightListing.aspx?id=8128&amp;epslanguage=EN">Mat&#8217;s article</a>) use of dynamic properties.</li>
</ul>
<p>Basically all the calls that return PageData or PageDataCollection are all potential candidates for heavy caching.</p>
<p>The main approach that we took in our solution is &#8220;cache the hell out of it, but do it smart&#8221;. Don&#8217;t cache PageData unless there is absolutely no other way. Cache links, page titles and data that&#8217;s potentially used on every page.</p>
<p>Also where needed and justified by the speed increase we reach directly to the database - skipping some EPiServer APIs (At this point this is just one call as we want the solution to be easily portable between various EPiServer versions).</p>
<p>More (and the solution) coming shortly&#8230;</p>
<p class="akst_link"><a href="http://blog.najmanowicz.com/?p=87&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_87" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blog.najmanowicz.com/2008/01/23/the-challenges-of-a-high-traffic-site-with-episerver/feed/</wfw:commentRss>
		</item>
		<item>
		<title>We are The EPiServer, you will be assimilated. Resistance is futile!</title>
		<link>http://blog.najmanowicz.com/2008/01/23/we-are-the-episerver-you-will-be-assimilated-resistance-is-futile/</link>
		<comments>http://blog.najmanowicz.com/2008/01/23/we-are-the-episerver-you-will-be-assimilated-resistance-is-futile/#comments</comments>
		<pubDate>Wed, 23 Jan 2008 12:36:21 +0000</pubDate>
		<dc:creator>Adam Najmanowicz</dc:creator>
		
		<category><![CDATA[.Net Framework]]></category>

		<category><![CDATA[EPiCode]]></category>

		<category><![CDATA[EPiServer]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[Web applications]]></category>

		<guid isPermaLink="false">http://blog.najmanowicz.com/2007/11/14/we-are-the-episerver-you-will-be-assimilated-resistance-is-futile/</guid>
		<description><![CDATA[This is a slightly dated post (written around November last year), that I forgot to post some time ago, so bare in mind, we&#8217;ve already started working on the faceted navigation getting open source status and I&#8217;ve updated the first sentece to include Adam Matusiak joining our team - Welcome Adam!
 Over the last month [...]]]></description>
			<content:encoded><![CDATA[<p><font color="#ff0000" size="1">This is a slightly dated post (written around November last year), that I forgot to post some time ago, so bare in mind, we&#8217;ve already started working on the faceted navigation getting open source status and I&#8217;ve updated the first sentece to include Adam Matusiak joining our team - Welcome Adam!</font></p>
<p><a href="http://blog.najmanowicz.com/wp-content/uploads/2008/01/locutusborgqueen.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="218" alt="LocutusBorgQueen" src="http://blog.najmanowicz.com/wp-content/uploads/2008/01/locutusborgqueen-thumb.jpg" width="244" align="left" border="0"/></a> Over the last month or two&nbsp; our hive mind has assimilated two new voices, our thoughts have become one with Greg&#8217;s, and Adam&#8217;s.</p>
<p>But seriously, the EPiServer (and consequently the .Net) part is getting really strong with <strike>eight</strike> nine(!) developers on that side currently working on a number of projects and that&#8217;s just developers!</p>
<p>What I really like is that we&#8217;re not just consuming the APIs, we already have developed some very cool technologies and the best part is that we&#8217;re starting to look seriously at open-sourcing some of our technologies to make the EPiServer community benefit from our experience. As a part of Cognifide Labs (that we hope to evolve in shape of Google&#8217;s &#8220;Pet projects&#8221;, I&#8217;m really looking forward to that). I&#8217;ll be working in my spare time on making our page commenting engine as well as our faceted navigation engine public consumption ready and ultimately add to the <a href="\&quot;https://www.coderesort.com/p/epicode\&quot;">EPiCode</a> experience. These are some modules that we&#8217;ve been working on for a long time, but just so busy with the various project development we&#8217;ve never been able to make them commented and documented enough for it to be a viable for a 3rd party developers to grasp. But already the technologies proven to be robust, scalable and extensible to support sites with over 6 million page views per month and growing and the site being fast and responsive just like you were the only person visiting it, thanks to using our data caching/fetching routines. All of that despite of a number of content pages counted in tens of thousands now.</p>
<p>It&#8217;s good to be a part of the hive mind, especially as brilliant as this one, so give in &#8230;resistance is futile, you will be assimilated!</p>
<p>Would you be interested in working with us on the technologies? How much need do you have for an elaborate <a href="\&quot;http://en.wikipedia.org/wiki/Faceted_Navigation\&quot;">faceted navigation</a> in your projects? Did you have a need to add a commenting (site wide) to a site that already works, in a way that is not intrusive and that allows you to moderate comments in with the EPiServer editing mode integration? Which one would you find more interesting for us to start working on making public?</p>
<p class="akst_link"><a href="http://blog.najmanowicz.com/?p=83&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_83" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://blog.najmanowicz.com/2008/01/23/we-are-the-episerver-you-will-be-assimilated-resistance-is-futile/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
