<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Techie</title>
        <link>http://blogs.interakting.co.uk/danmatthews/category/22.aspx</link>
        <description>Collection of techie stuff</description>
        <language>en-GB</language>
        <copyright>Dan Matthews</copyright>
        <managingEditor>dmatthews@businessdecision.co.uk</managingEditor>
        <generator>Subtext Version 1.9.5.177</generator>
        <item>
            <title>Property Data Injection in EPiServer</title>
            <link>http://blogs.interakting.co.uk/danmatthews/archive/2008/12/09/property-data-injection-in-episerver.aspx</link>
            <description>&lt;p&gt;I am currently working on a project where it was necessary to conditionally inject some content into certain properties on some pages. Dynamic Content didn't really help me because what I wanted to do was replace entire properties with content from a property on another page and do it in a nice way for the editor. Linking the page with a shortcut to another page didn't help me because it needed to be only a partial replace and also conditional.&lt;/p&gt;
&lt;p&gt;Here's an example - and I know there are better ways to do this but I want an example that won't compromise the Intellectual Property of what I am actually doing :)&lt;/p&gt;
&lt;p&gt;Lets say you have a news article at &lt;a href="http://myepisite/News/SomeArticle"&gt;http://myepisite/News/SomeArticle&lt;/a&gt;. The article has a nice big image on it and you want to be able to swap the image out with a different one (lets forget the fact that you'd probably just do this with two properties). You have a sub-page storing the smaller image in a property at &lt;a href="http://myepisite/News/SomeArticle/LowImagery"&gt;http://myepisite/News/SomeArticle/LowImagery&lt;/a&gt;, which is hidden from the site. The way that you trigger the load of the low image is by URL QueryString, e.g. &lt;a href="http://myepisite/News/SomeArticle?bandwidth=lo"&gt;http://myepisite/News/SomeArticle?bandwidth=lo&lt;/a&gt;. (If you want some more tips on achieving this URL neatly, see my posts or other posts on URL rewriting.) Anyway, you could write a custom property type etc. to do this, but that's a fair whack of work and you'll need to create a new custom property for every content type that you might want to replace.&lt;/p&gt;
&lt;p&gt;So how do I achieve this in a neat, generic way? EPiServer provides a nice way, but it's not the most well documented route and neither do they really recommend it. Still, I think it can work well if properly implemented. The way I implemented to achieve this was using a custom Property Get Handler.&lt;/p&gt;
&lt;p&gt;When EPiServer asks for a page, it builds a PropertyDataCollection of all the properties on that page, along with their values. This PropertyDataCollection contains all the user-defined properties along with some that EPiServer add in as well such as PageLink, PageLanguageBranch and others. These are absolute lifesavers, although they are not well documented. The PropertyDataCollection has a default indexer which, when called, calls to a helper method to get the actual PropertyData for a property. The default helper method is a static method called 'DefaultPropertyHandler' on EPiServer.Core.PropertyGetHandler. This helper method looks for the the actual property data in four stages:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;It looks at the property on the current page and the current language &lt;/li&gt;
    &lt;li&gt;If that is empty, it checks to see whether the property is language specific and, if it is, whether the current language is the master language. If not, then it grabs the master language page and returns the value from that property. &lt;/li&gt;
    &lt;li&gt;If language isn't an issue, then it tries to get the property value from the linked page, if any. &lt;/li&gt;
    &lt;li&gt;If there is not data on a linked page, then it tries to return a dynamic property value with that property name. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This works well and is the default that probably fits 99% of EPiServer installations. However, EPiServer kindly allow us to replace this default Property Get Handler. All you need to do is write your own method that matches the delegate for the handler, and then set an EPiServer property like so:&lt;/p&gt;
&lt;p&gt;EPiServer.Core.PropertyDataCollection.GetHandler = new GetPropertyDelegate(Test.BandwidthPropertyGetHandler.BandwidthPropertyHandler); &lt;/p&gt;
&lt;p&gt;I'm sure you can set this in most places where you need it, but I just put it into the Application_Start of Global.asax.cs. So we can see how easy it is to override the property handling, but what does our custom method actually look like? The following code is incomplete, untested and partially commented out, but it should give the idea. The two parameters coming in are the property name being queried for data and the property data collection for the current page/language. Notice that rather than use the default indexer for properties, when asking for a property data value I am explicitly calling the 'Get' method - this prevents nasty infinite loops where my custom handler keeps calling itself.&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Test
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; BandwidthPropertyGetHandler
    {
        &lt;span class="rem"&gt;// Methods&lt;/span&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; PropertyData BandwidthPropertyHandler(&lt;span class="kwrd"&gt;string&lt;/span&gt; name, &lt;br /&gt;						PropertyDataCollection properties)
        {
            &lt;span class="rem"&gt;// check querystring to see if we need to replace property (where possible)&lt;/span&gt;

            HttpRequest Request = System.Web.HttpContext.Current.Request;

            &lt;span class="kwrd"&gt;if&lt;/span&gt; (Request.QueryString[&lt;span class="str"&gt;"bandwidth"&lt;/span&gt;] == &lt;span class="str"&gt;"lo"&lt;/span&gt;)
            {
                &lt;span class="rem"&gt;// we need to swap low bandwidth if it's the right property name&lt;/span&gt;
                &lt;span class="rem"&gt;// you could drive this any way you like - don't hardcode it in production :)&lt;/span&gt;

                &lt;span class="kwrd"&gt;if&lt;/span&gt; (name == &lt;span class="str"&gt;"ArticleImage"&lt;/span&gt;)
                {
                    &lt;span class="rem"&gt;// lets reach out and grab the data from the sub-page&lt;/span&gt;

                    PageReference ThisPageReference = (PageReference)properties.&lt;br /&gt;							Get(&lt;span class="str"&gt;"PageLink"&lt;/span&gt;).Value;

                    PageDataCollection ChildPages = EPiServer.DataFactory.Instance.&lt;br /&gt;			GetChildren(ThisPageReference, LanguageSelector.MasterLanguage());

                    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (PageData ChildPage &lt;span class="kwrd"&gt;in&lt;/span&gt; ChildPages)
                    {
                        &lt;span class="rem"&gt;// find an article subpage&lt;/span&gt;

                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (ChildPage.PageTypeName.ToLower() == &lt;span class="str"&gt;"article subpage"&lt;/span&gt;)
                        {
                            &lt;span class="rem"&gt;// grab our property and return it&lt;/span&gt;

                            &lt;span class="kwrd"&gt;return&lt;/span&gt; ChildPage.Property.Get(&lt;span class="str"&gt;"ArticleImageLow"&lt;/span&gt;);
                        }
                    }
                }
            }

            &lt;span class="rem"&gt;// just return the default handler&lt;/span&gt;
            &lt;span class="kwrd"&gt;return&lt;/span&gt; PropertyGetHandler.DefaultPropertyHandler(name, properties);
        }
    }
}&lt;/pre&gt;
&lt;/blockquote&gt;&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;
&lt;p&gt;In my actual implementation I handle languages properly, error handling, null property values and all sorts of other things, but it should be fairly obvious how that would work. In essence, this is a very simple way of customising properties to make them do fairly clever things without customising property types themselves. In fact, this would be a nice way to retro-fit a feature such as bandwidth tailoring or other targeted content to an existing type. Just remember that if it's not a special case you should be handling, call the default handler to do it's stuff with that property! Also, it might be best to try to keep your injected property types the same as the property type on the owner page. Not sure what would happen if you messed with that.&lt;/p&gt;&lt;img src="http://blogs.interakting.co.uk/danmatthews/aggbug/370.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dan Matthews</dc:creator>
            <guid>http://blogs.interakting.co.uk/danmatthews/archive/2008/12/09/property-data-injection-in-episerver.aspx</guid>
            <pubDate>Tue, 09 Dec 2008 12:42:03 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/danmatthews/comments/370.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/danmatthews/archive/2008/12/09/property-data-injection-in-episerver.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/danmatthews/comments/commentRss/370.aspx</wfw:commentRss>
        </item>
        <item>
            <title>File Extensions and URL Rewriting in EPiServer</title>
            <link>http://blogs.interakting.co.uk/danmatthews/archive/2008/12/05/file-extensions-and-url-rewriting-in-episerver.aspx</link>
            <description>&lt;p&gt;I needed to throw together a quick geolocalisation demo for EPiServer v5 R2 the other day and to do that it was necessary to override some of the default URL rewriting behaviour of EPiServer. I knew it could be done, but I'd never actually had to write a custom URL provider before, so &lt;a href="http://labs.episerver.com/en/Blogs/Ted-Nyberg/Dates/112276/7/Implementing-a-custom-URL-rewrite-provider-for-EPiServer/"&gt;Ted Nyberg's blog post&lt;/a&gt; on rewriting in EPiServer gave me a good kick-start.&lt;/p&gt;
&lt;p&gt;My geolocalisation changes worked a treat (maybe I'll blog about that another time) but I did come across one really nasty 'feature' in EPiServer. I did find a workaround though, so I'll share it with you. Some background first though.&lt;/p&gt;
&lt;p&gt;As you may know, EPiServer has the nice ability to add a file extension on to pages. Before you rush off and try this out on your live site, be aware that it does change the default behaviour a little, for example it stops trailing slashes from working on the URL, e.g. this works:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://myepisite/SomePage/"&gt;http://myepisite/SomePage/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;...but this does not...&lt;/p&gt;
&lt;p&gt;&lt;a href="http://myepisite/SomePage.htm/"&gt;http://myepisite/SomePage.htm/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In fact, I like this feature because when using an external cache provider (such as Akamai), page extensions are A Good Thing as it knows how to treat them, and it also reduces the number of a URL 'possibilities' for a single page, so reducing the cache usage. As a bonus, it can also help with security as it slightly abstracts the page engine from the URL. Why not use the extension 'cfm' and then watch and laugh as all the ColdFusion-specific attacks roll in :)&lt;/p&gt;
&lt;p&gt;So I set an extension on my geolocalisation demo of '.htm' (done in the urlRewriteExtension property of the site settings element in Web.Config, make sure you put the dot in the extension as well otherwise you'll get SomePagehtm). So far, so good, and the out-the-box demo templates site appeared to run fine. But then I noticed a weird quirk. On the menu across the top, the various links made sense, for the most part:&lt;/p&gt;
&lt;p&gt;News -&amp;gt; &lt;a href="http://myepisite/en/News.htm"&gt;http://myepisite/en/News.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Events -&amp;gt; &lt;a href="http://myepisite/en/Events.htm"&gt;http://myepisite/en/Events.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;and so on... but the Start link was all messed up:&lt;/p&gt;
&lt;p&gt;Start -&amp;gt; &lt;a href="http://myepisite/en.htm"&gt;http://myepisite/en.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What was strangest of all though was that this link actually worked! This made no sense on any level, and it was obvious that some internal fudge in the default URL rewriter was catching this as a special case. This was confirmed when I found &lt;a href="http://world.episerver.com/Forum/Pages/Thread.aspx?id=15768&amp;amp;epslanguage=en"&gt;this post from EPiServer support&lt;/a&gt;. They'd obviously found this 404'ing so built a special case for it.&lt;/p&gt;
&lt;p&gt;So why do I care? Because this breaks the URL model and breaks my geolocalisation scheme quite badly. That link should 404 or else I have an issue. Ideally, I want to actually write out the proper link. So I started digging. It turns out that you get a link like this when you have an EPiServer Start Page and ask for the LinkURL for it. The default URL rewriter seems to munge it up and spit out this crazy short URL rather than a nicely formatted link. This is the same for any language, for example the Swedish start page gives sv.htm. Ideally though, I would want it to write out something like this (the page is actually called Public in the English version):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://myepisite/en/Public.htm"&gt;http://myepisite/en/Public.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I mean OK, it looks like any other page rather than a start page but surely that's better than en.htm! So... how do we go about getting the right page link rendered out and bypassing EPiServer's little 'fix'? Well, we can do it with the URL rewriter. I'll let Ted's post explain how to actually create the URL rewrite provider, but once you have the rewrite provider ready, you can override the ConvertToExternalInternal method as follows:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; ConvertToExternalInternal(UrlBuilder url, &lt;span class="kwrd"&gt;object&lt;/span&gt; internalObject, Encoding toEncoding)
{
    &lt;span class="rem"&gt;// apply default rewriting first&lt;/span&gt;
    &lt;span class="kwrd"&gt;bool&lt;/span&gt; bRewriteSuccess = &lt;span class="kwrd"&gt;base&lt;/span&gt;.ConvertToExternalInternal(url, internalObject, toEncoding);

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (bRewriteSuccess)
    {
        &lt;span class="kwrd"&gt;string&lt;/span&gt;[] urlSplit = url.Path.Split(&lt;span class="str"&gt;'/'&lt;/span&gt;);
        
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (urlSplit.Length == 2)
        {
            &lt;span class="rem"&gt;// default page&lt;/span&gt;

            &lt;span class="kwrd"&gt;string&lt;/span&gt; DestinationCountryCode = urlSplit[1].Substring(0, 2);

            EPiServer.Core.PageData StartPage;

            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                StartPage = EPiServer.DataFactory.Instance.GetPage(&lt;br /&gt;&lt;span class="kwrd"&gt;	new&lt;/span&gt; EPiServer.Core.PageReference(EPiServer.Configuration.Settings.Instance.PageStartId), &lt;br /&gt;	&lt;span class="kwrd"&gt;new&lt;/span&gt; LanguageSelector(DestinationCountryCode));
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt;
            {
                &lt;span class="rem"&gt;// no page with that language, just grab the link anyway and it will&lt;br /&gt;		 still work just with the current language name&lt;/span&gt;

                StartPage = EPiServer.DataFactory.Instance.GetPage(&lt;br /&gt;	&lt;span class="kwrd"&gt;new&lt;/span&gt; EPiServer.Core.PageReference(EPiServer.Configuration.Settings.Instance.PageStartId));
            }

            url.Path = &lt;span class="str"&gt;"/"&lt;/span&gt; + DestinationCountryCode + &lt;span class="str"&gt;"/"&lt;/span&gt; + StartPage.URLSegment + &lt;br /&gt;			EPiServer.Configuration.Settings.Instance.UrlRewriteExtension;
        }
    }
    
    &lt;span class="kwrd"&gt;return&lt;/span&gt; bRewriteSuccess;
}      &lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;This is not a fully-tested solution and it might need more work, but it shows that it is possible to fix this troublesome default behaviour. My geolocalisation demo then wrote out links as I would expect, and seemed to work perfectly across languages too. Hope this is of some use to anyone with similar issues even if it only gets you started on a fix!&lt;font face="Courier New"&gt;&lt;br /&gt;
&lt;/font&gt;&lt;img src="http://blogs.interakting.co.uk/danmatthews/aggbug/369.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dan Matthews</dc:creator>
            <guid>http://blogs.interakting.co.uk/danmatthews/archive/2008/12/05/file-extensions-and-url-rewriting-in-episerver.aspx</guid>
            <pubDate>Fri, 05 Dec 2008 11:53:04 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/danmatthews/comments/369.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/danmatthews/archive/2008/12/05/file-extensions-and-url-rewriting-in-episerver.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/danmatthews/comments/commentRss/369.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Syncing Outlook with a Windows Mobile device in Vista</title>
            <link>http://blogs.interakting.co.uk/danmatthews/archive/2008/10/01/syncing-outlook-with-a-windows-mobile-device-in-vista.aspx</link>
            <description>&lt;p&gt;My XP laptop had ground to a halt - 6 months without a rebuild and it had got so clogged that it literally took 5 minutes just to boot. I needed to wipe it and start again but the head of our technical team offered me a fresh laptop with a clean Vista Business build. Deciding that being a guinea pig was a nice idea, I accepted it. The 4 gig of ram (up from 2 gig) was the sweetener that made up my mind for sure :)&lt;/p&gt;  &lt;p&gt;As I was setting it up just how I wanted it, one of the things I needed to do was sync my two mobile phones with it. I have both an HTC 4350 (Herald) from work and my own personal HTC TyTN II. On my XP laptop I used ActiveSync to sync up my calendar, tasks and contacts.&lt;/p&gt;  &lt;p&gt;Knowing that ActiveSync has been replaced on Vista, I was hoping for an easy experience. After plugging in my TyTN II, Vista offered to sync my media files. Fine, but I wanted to sync with Outlook so I cancelled the dialog and started my hunt. In Control Panel I found 'Sync Centre' which offered to sync my media files again. This was getting annoying. Contacts and/or Outlook were mentioned nowhere.&lt;/p&gt;  &lt;p&gt;Maybe the 'Windows Mobile Device Centre' in Control Panel was my best bet? Nope. That just had settings on whether I wanted to connect via USB and Bluetooth or not. Nothing about syncing. Googling didn't help me that much. There doesn't seem to be much info about this. Is it that obvious? Am I missing something?&lt;/p&gt;  &lt;p&gt;Actually, I was missing something. The latest download of &lt;a href="http://www.microsoft.com/windowsmobile/en-us/help/synchronize/device-center.mspx"&gt;Windows Mobile Device Centre&lt;/a&gt; (currently 6.1 as I write). This is basically what ActiveSync used to be, and syncs up all the bits and pieces you'd expect with Outlook. In fact, it's very smart and clean and appears to be a nice improvement on ActiveSync.&lt;/p&gt;  &lt;p&gt;I thought it worth blogging this for two reasons. Firstly, hopefully this will get indexed so that it can be a quick help to others who were in the same boat as me. Secondly, is this part of the problem with Vista? It's not exactly intuitive that you have to install an updated version of a Control Panel applet to be able to sync (although behind the scenes it's more than that, of course). It almost seems that the out-the-box install is half baked. And the help isn't much help.&lt;/p&gt;  &lt;p&gt;It's possible that I still missed a trick, of course, and if I have done then please feel free to comment here and set me straight!&lt;/p&gt;&lt;img src="http://blogs.interakting.co.uk/danmatthews/aggbug/353.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dan Matthews</dc:creator>
            <guid>http://blogs.interakting.co.uk/danmatthews/archive/2008/10/01/syncing-outlook-with-a-windows-mobile-device-in-vista.aspx</guid>
            <pubDate>Wed, 01 Oct 2008 09:37:39 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/danmatthews/comments/353.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/danmatthews/archive/2008/10/01/syncing-outlook-with-a-windows-mobile-device-in-vista.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/danmatthews/comments/commentRss/353.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Google Chrome and McAfee Anti Virus</title>
            <link>http://blogs.interakting.co.uk/danmatthews/archive/2008/09/03/google-chrome-and-mcafee-anti-virus.aspx</link>
            <description>&lt;p&gt;Chrome threw the following error when posting to a forum:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.interakting.co.uk/images/blogs_interakting_co_uk/danmatthews/WindowsLiveWriter/GoogleChromeandMcAfeeAntiVirus_BB9D/image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="288" alt="image" src="http://blogs.interakting.co.uk/images/blogs_interakting_co_uk/danmatthews/WindowsLiveWriter/GoogleChromeandMcAfeeAntiVirus_BB9D/image_thumb_1.png" width="634" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;(my login name and domain is deliberately blanked)&lt;/p&gt;  &lt;p&gt;This warning 'Exploit-ObscuredHtml' isn't thrown when doing exactly the same in Internet Explorer, so I'd be interested to know why it's throwing the virus alert. Possibly because it's running the javascript in a separate process to the HTML? Unlikely. More inclined to think it's because it's in the unsecure 'Documents and Settings' folder whereas IE uses the rather more locked-down Temporary Internet Files folder.&lt;/p&gt;  &lt;p&gt;Either way, I can imagine lots of sites would use Javascript that would trigger this and I'd imagine other AV tools would flag it too. Surely the AV vendors and/or Google need to address this somehow? Isn't it a bad place to put files that you will run script? If you have seen this behaviour as well then feel free to post the Url and the name of your AV tool.&lt;/p&gt;&lt;img src="http://blogs.interakting.co.uk/danmatthews/aggbug/343.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dan Matthews</dc:creator>
            <guid>http://blogs.interakting.co.uk/danmatthews/archive/2008/09/03/google-chrome-and-mcafee-anti-virus.aspx</guid>
            <pubDate>Wed, 03 Sep 2008 12:19:29 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/danmatthews/comments/343.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/danmatthews/archive/2008/09/03/google-chrome-and-mcafee-anti-virus.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/danmatthews/comments/commentRss/343.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Getting the NT or AD User Name from VBA</title>
            <link>http://blogs.interakting.co.uk/danmatthews/archive/2008/08/07/getting-the-nt-or-ad-user-name-from-vba.aspx</link>
            <description>&lt;p&gt;I recently needed to get the NT user name from VBA code. Not a problem, Microsoft have an advisory note that tells you how to do that and there's a good summary of it on this post:&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;a href="http://blogs.officezealot.com/charles/archive/2004/12/10/3574.aspx"&gt;http://blogs.officezealot.com/charles/archive/2004/12/10/3574.aspx&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;However, there is a ptentially serious security problem with the other method that Charles suggests on that post - using the environment variable like this:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;Environ("USERNAME")&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;If you are using the username check in VBA for security purposes (for example, matching a username against a list of known users permitted or restricted on some actions) then the method above does not guarantee that the actual username of the logged on user will be returned.&lt;/p&gt;
&lt;p&gt;The user can override the default username setting by adding a new environment variable (Control Panel -&amp;gt; System -&amp;gt; Environment Variables) called USERNAME and setting it to whatever they want. Effectively, they are taking the identity of another user as far as the variable is concerned, and anything that looks it up.&lt;/p&gt;
&lt;p&gt;It is therefore safer from a security perspective to use the Win32 API call. Note that if you are doing security in VBA you have a bit of a problem anyway though because even if you password protect you code, it's easily crackable.&lt;/p&gt;&lt;img src="http://blogs.interakting.co.uk/danmatthews/aggbug/335.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dan Matthews</dc:creator>
            <guid>http://blogs.interakting.co.uk/danmatthews/archive/2008/08/07/getting-the-nt-or-ad-user-name-from-vba.aspx</guid>
            <pubDate>Thu, 07 Aug 2008 08:46:45 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/danmatthews/comments/335.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/danmatthews/archive/2008/08/07/getting-the-nt-or-ad-user-name-from-vba.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/danmatthews/comments/commentRss/335.aspx</wfw:commentRss>
        </item>
        <item>
            <title>SubText category id errors with Live Writer</title>
            <link>http://blogs.interakting.co.uk/danmatthews/archive/2008/07/29/subtext-category-id-errors-with-live-writer.aspx</link>
            <description>&lt;p&gt;On our blogs, we recently found we were getting this error when trying to edit some posts:&lt;/p&gt; &lt;a href="http://blogs.interakting.co.uk/images/blogs_interakting_co_uk/danmatthews/WindowsLiveWriter/SubTextcategoryiderrorswithLiveWriter_D5FD/image_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="272" alt="image" src="http://blogs.interakting.co.uk/images/blogs_interakting_co_uk/danmatthews/WindowsLiveWriter/SubTextcategoryiderrorswithLiveWriter_D5FD/image_thumb.png" width="535" border="0" /&gt;&lt;/a&gt;   &lt;p&gt;The id's given were occasionally different but it was always the same format... &lt;/p&gt;  &lt;p&gt;"Could not find category id &lt;em&gt;XX&lt;/em&gt; in the Checkbox list which has &lt;em&gt;XX&lt;/em&gt; items."&lt;/p&gt;  &lt;p&gt;Somehow it seems that SubText has got itself in a twist and allocated invalid category id's to the posts. I suspect that this is actually caused by a funny bug between SubText and Microsoft Live Writer. You see, when you write an article in Live Writer you can allocate the categories for it and post it up to SubText. So far, so good. However, the bug occurs when you have a Post Category and an Article Category with the same name. When the Web Service request hits SubText it might not pull out the correct category id - probably because it checks only by name and grabs the first one. The problem we were having is that some posts were getting added with a category id for an article. Changing the category name for the articles fixed the problem.&lt;/p&gt;  &lt;p&gt;You can see if any of your posts have this problem by running the following SQL against the SubText database.&lt;/p&gt;  &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;select&lt;/span&gt; * &lt;span style="color: #0000ff"&gt;from&lt;/span&gt; subtext_Content, subtext_Links, subtext_LinkCategories&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;where&lt;/span&gt; subtext_Content.ID = subtext_Links.PostID&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;and&lt;/span&gt; subtext_Links.CategoryID = subtext_LinkCategories.CategoryID&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;and&lt;/span&gt; PostType != CategoryType&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;If you get rows back, then you need to tweak your data :)&lt;/p&gt;

&lt;p&gt;Once you've fixed your data, then the main recommendation I'd make is to use different category names for posts and articles. That way, Live Writer or other Web Service based blog tools won't confuse SubText.&lt;/p&gt;&lt;img src="http://blogs.interakting.co.uk/danmatthews/aggbug/334.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dan Matthews</dc:creator>
            <guid>http://blogs.interakting.co.uk/danmatthews/archive/2008/07/29/subtext-category-id-errors-with-live-writer.aspx</guid>
            <pubDate>Tue, 29 Jul 2008 14:11:02 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/danmatthews/comments/334.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/danmatthews/archive/2008/07/29/subtext-category-id-errors-with-live-writer.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/danmatthews/comments/commentRss/334.aspx</wfw:commentRss>
        </item>
        <item>
            <title>NickServ and HydraIRC</title>
            <link>http://blogs.interakting.co.uk/danmatthews/archive/2008/06/23/NickServ-and-HydraIRC.aspx</link>
            <description>&lt;p&gt;I've been hanging out on the &lt;a href="http://stevecelius.spaces.live.com/blog/cns!758863CB279D3EB1!299.entry" target="_blank"&gt;#epicode&lt;/a&gt; IRC channel for the past few months, and over time I've played with several IRC clients such as &lt;a href="http://www.xchat.org/" target="_blank"&gt;XChat&lt;/a&gt;, &lt;a href="http://www.mibbit.com/" target="_blank"&gt;Mibbit&lt;/a&gt; (for the Web) and &lt;a href="http://www.hydrairc.com/" target="_blank"&gt;HydraIRC&lt;/a&gt;. One of the things that you do most often on IRC is /msg people. The server that I use for #epicode is FreeNode. This server requires you to register you nick before doing a /msg. If you try to /msg without registering, you get an error message back from the server. XChat, annoyingly, didn't show me the IRC error and I spent quite some time trying to figure out what was wrong. Mibbit behaves nicely, but you have to enter your credentials every time which is a pain. (tip: on Mibbit,  click the 'Auth' link next to the server dropdown on the main page and you can enter your NickServ password straight in there!) HydraIRC behaves nicely too, but I've been having problems getting it to store my NickServ password so I don't have to enter it every time.&lt;/p&gt;  &lt;p&gt;In theory, the password is saved by HydraIRC when you create a favourite, but it doesn't seem to work for channel favourites, only server favourites. No, I've no idea why. If you look in the XML profile file in the HydraIRC installation directory all the information looks correct. Maybe they work for you but they sure are a pain for me. Thankfully, there is an easy workaround. HydraIRC has a bit of a hack called &lt;a href="http://www.hydrairc.com/wiki/wakka.php?wakka=CommandProfiles&amp;amp;v=ydf" target="_blank"&gt;Command Profiles&lt;/a&gt;. I wouldn't describe them as a well-documented feature but they do the trick. Essentially a command profile is just a set of IRC commands that can be run automatically when you connect to a particular IRC server. You can find the command profiles by going Options -&amp;gt; Prefs... -&amp;gt; Command Profiles. In there, you create a profile using a special name so that is picked up on logging in to a server. The name, in my case, is FreeNode_OnLoggedIn. Within that I simply put in my NickServ identification.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.interakting.co.uk/images/blogs_interakting_co_uk/danmatthews/WindowsLiveWriter/NickServandHydraIRC_9DBB/hydracps_2.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="375" alt="hydracps" src="http://blogs.interakting.co.uk/images/blogs_interakting_co_uk/danmatthews/WindowsLiveWriter/NickServandHydraIRC_9DBB/hydracps_thumb.jpg" width="519" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;When I go to my #epicode channel favourite now, it automatically runs my identification with NickServ so that I can /msg people without the pesky error message and having to register myself manually with NickServ every time!&lt;/p&gt;&lt;img src="http://blogs.interakting.co.uk/danmatthews/aggbug/315.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dan Matthews</dc:creator>
            <guid>http://blogs.interakting.co.uk/danmatthews/archive/2008/06/23/NickServ-and-HydraIRC.aspx</guid>
            <pubDate>Mon, 23 Jun 2008 10:11:59 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/danmatthews/comments/315.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/danmatthews/archive/2008/06/23/NickServ-and-HydraIRC.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/danmatthews/comments/commentRss/315.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Google Translate and .NET</title>
            <link>http://blogs.interakting.co.uk/danmatthews/archive/2008/05/20/Google-Translate-and-.NET.aspx</link>
            <description>&lt;p&gt;Google have released a lovely little API for their Google Translate service. It uses a &lt;a href="http://www.xfront.com/REST-Web-Services.html"&gt;RESTful&lt;/a&gt; interface and returns a &lt;a href="http://www.json.org/"&gt;JSON&lt;/a&gt; object in the HTTP Response. The usual way to use this would be AJAX-style in client side JavaScript. This might not always be what you want to do though. For example, if you have a server resource in English and you want to show it in the page as Spanish you wouldn't want to render it in English and then have some page load event client side to translate it. You really want to do it server side and render it on the page as Spanish straight away.&lt;/p&gt;  &lt;p&gt;Of course, Google know this and so they have provided a couple of snippets on their Google code site for PHP and Java. It should probably be expected, but they decided not to provide a nice .NET snippet. Looking around on the web, I can't find any .NET snippets for it and so I did some digging myself to put together a solution.&lt;/p&gt;  &lt;p&gt;Before I throw out the snippet, it's worth explaining briefly what JSON is and what libraries are available. JSON is an object definition 'language' similar conceptually to XML in that it is effectively name tags / value pairs but it has the added advantage that it is part of the JavaScript language definition and can be 'eval'ed in JavaScript to give you a client-side object. This is great for AJAX websites. Whilst you could cook your own JSON handler, there are a few JSON libraries out there for .NET. In fact, &lt;a title="Windows Communication Foundation" href="http://msdn.microsoft.com/en-us/netframework/aa663324.aspx"&gt;Windows Communication Foundation&lt;/a&gt; has some JSON support built-in. The only problem is that most of the libraries out there are to do with serializing and deserializing .NET objects as JSON objects. That's fine as far as it goes, but it relies on you already having a well-defined .NET type. With Google Translate, we are getting a JSON object as a string that has no well-known .NET type to deserialize to. It might be possibly in theory to map it to an object or even map it to XML but I explored those options and found them incredibly convoluted. &lt;/p&gt;  &lt;p&gt;Thankfully you don't need to write your own little JSON parser though because I did find &lt;strong&gt;one&lt;/strong&gt; library out there to do the job, &lt;a href="http://litjson.sourceforge.net/"&gt;LitJSON&lt;/a&gt;. It has a couple of the usual serializer/deserializer features but in addition it also has a feature to parse JSON into a simple hashtable/array. I tried to do something similar with JSON to XML with WCF but couldn't get it to work. One of my colleagues, &lt;a href="http://blogs.interakting.co.uk/steve"&gt;Stephen Horsfield&lt;/a&gt;, did - and I've included his technique after mine.&lt;/p&gt;  &lt;p&gt;And so to the code. The snippet below assumes that you are running this in a web form with the following four web controls:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;txtSource - textbox for source text &lt;/li&gt;    &lt;li&gt;txtTranslated - textbox for translated text &lt;/li&gt;    &lt;li&gt;ddlFrom - drop down list with the 2-letter language values for the source language &lt;/li&gt;    &lt;li&gt;ddlTo - drop down list with the 2-letter language values for the destination language &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Of course you could easily swap these with command line args or whatever you like. I have put the snippet in C# and the .NET 2.0 framework, but of course you could rework it for VB.NET or even for .NET 1.0.&lt;/p&gt;  &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;// do a check to make sure that we aren't making Google unhappy&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (txtSource.Text.Length &amp;gt; 500)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Exception(&lt;span style="color: #006080"&gt;"Google Translation license forbids more than 500 characters to be translated at once!"&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt; }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt; &lt;span style="color: #008000"&gt;// create the web request to the Google Translate REST interface&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt; WebRequest oRequest = WebRequest.Create(&lt;span style="color: #006080"&gt;"http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;amp;q="&lt;/span&gt; + HttpUtility.UrlEncode(txtSource.Text) + &lt;span style="color: #006080"&gt;"&amp;amp;langpair="&lt;/span&gt; + ddlFrom.SelectedValue + &lt;span style="color: #006080"&gt;"%7C"&lt;/span&gt; + ddlTo.SelectedValue);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt; &lt;span style="color: #008000"&gt;// make the web call&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt; WebResponse oResponse = oRequest.GetResponse();&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt; &lt;span style="color: #008000"&gt;// grab the response stream&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt; StreamReader oReader = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StreamReader(oResponse.GetResponseStream());&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  15:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  16:&lt;/span&gt; &lt;span style="color: #008000"&gt;// put the whole response in a string&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  17:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; sContent = oReader.ReadToEnd();&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  18:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  19:&lt;/span&gt; &lt;span style="color: #008000"&gt;// parse the string into the litJSON simple object model&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  20:&lt;/span&gt; JsonData oData = JsonMapper.ToObject(sContent);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  21:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  22:&lt;/span&gt; &lt;span style="color: #008000"&gt;// write out the translated text&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  23:&lt;/span&gt; txtTranslated.Text = oData[&lt;span style="color: #006080"&gt;"responseData"&lt;/span&gt;][&lt;span style="color: #006080"&gt;"translatedText"&lt;/span&gt;].ToString();&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;You could enhance this by using the Google Translate API call to auto-detect the source language, but for simplicity I haven't bothered with that extra step.&lt;/p&gt;

&lt;p&gt;So lets see what it would look like with WCF. You'll need to include a using statement for System.IO, System.Xml and System.Runtime.Serialization.Json (and reference the appropriate DLLs):&lt;/p&gt;

&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; XmlDocument doc = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; XmlDocument();&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; XmlDictionaryReader xr = JsonReaderWriterFactory.CreateJsonReader(s,&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; XmlDictionaryReaderQuotas.Max);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt; doc.Load(xr);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt; xr.Close();&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt; s.Close();&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;For more details see the complete post on &lt;a href="http://blogs.interakting.co.uk/steve/archive/2008/05/22/NET-JSON-support-in-WCF.aspx"&gt;Steve's blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And that is how easy it is to call Google Translate from .NET! I'm currently thinking of some funky ways that I could integrate it with the EPiServer Edit mode. There are all sorts of possibilities. Suggestions on a postcard of how you might want it to look. Maybe a right-click option on the navigation tree? Maybe an extra button in the editor? Maybe something that catches the event when a language for a page is created?&lt;/p&gt;

&lt;p&gt;Lastly, a tip on the 2-letter languages. I used the System.Globalization feature of .NET to create the drop down lists with their names. Snippet below:&lt;/p&gt;

&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; CultureInfo [] aCultures = CultureInfo.GetCultures(CultureTypes.NeutralCultures);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (CultureInfo oCulture &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; aCultures)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (ConfigurationManager.AppSettings[&lt;span style="color: #006080"&gt;"SupportedLanguages"&lt;/span&gt;].IndexOf(oCulture.TwoLetterISOLanguageName) &amp;gt;= 0)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;         ListItem oItem = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ListItem(oCulture.EnglishName, oCulture.TwoLetterISOLanguageName);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;         ddlFrom.Items.Add(oItem);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;         ddlTo.Items.Add(oItem);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;All that is needed after that is a line in the web.config like so:&lt;/p&gt;

&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;
  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;appSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;   &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;key&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="SupportedLanguages"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;value&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="ar,bg,zh,hr,cs,da,nl,en,fi,fr,de,el,hi,it,ja,ko,no,pl,pt,ro,ru,es,sv"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;appSettings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Hope this is useful to someone. There's a whole load more that could be done such as error checking and catching but that is for a later post once I work out how far I can take this.&lt;/p&gt;&lt;img src="http://blogs.interakting.co.uk/danmatthews/aggbug/289.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dan Matthews</dc:creator>
            <guid>http://blogs.interakting.co.uk/danmatthews/archive/2008/05/20/Google-Translate-and-.NET.aspx</guid>
            <pubDate>Tue, 20 May 2008 15:20:26 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/danmatthews/comments/289.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/danmatthews/archive/2008/05/20/Google-Translate-and-.NET.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/danmatthews/comments/commentRss/289.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Interakting blogs launched</title>
            <link>http://blogs.interakting.co.uk/danmatthews/archive/2008/04/28/Interakting-blogs-launched.aspx</link>
            <description>&lt;p&gt;As part of the launch of Interakting, the pan-european web agency brand of Business &amp;amp; Decision, the E-Business blogs have been reskinned. The blog engine we use is built on &lt;a href="http://subtextproject.com/"&gt;&lt;font color="#810081"&gt;SubText&lt;/font&gt;&lt;/a&gt;, a great little .NET blog engine. Not the easiest to skin, but manageable.&lt;/p&gt;
&lt;p&gt;Have a browse around. It's the same guys blogging the same great stuff - just a little less blue/grey and a bit more pink :)&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://blogs.interakting.co.uk/danmatthews/aggbug/262.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dan Matthews</dc:creator>
            <guid>http://blogs.interakting.co.uk/danmatthews/archive/2008/04/28/Interakting-blogs-launched.aspx</guid>
            <pubDate>Mon, 28 Apr 2008 15:02:23 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/danmatthews/comments/262.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/danmatthews/archive/2008/04/28/Interakting-blogs-launched.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/danmatthews/comments/commentRss/262.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Firebrand / Training Camp</title>
            <link>http://blogs.interakting.co.uk/danmatthews/archive/2008/02/18/205.aspx</link>
            <description>&lt;p&gt; &lt;a target="_blank" href="http://www.firebrandtraining.co.uk"&gt;&lt;img alt="Firebrand logo" border="0" src="http://www.firebrandtraining.co.uk/firebrand_images/firebrand_logos/firebrand_logo_for_iitt_win.gif" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Well I'm back from my holidays to South Africa, and trying my best to adjust to a British winter after enjoying Summer on the Indian Ocean :)&lt;/p&gt;
&lt;p&gt;As a company we've been using the Training Camp for quite a while (MOSS, .NET exams, CRM) and it recently rebranded itself as Firebrand. Well worth a look if you have any training requirements, especially if you need a real kickstart to a technology for an urgent need.&lt;/p&gt;
&lt;p&gt;And no matter how well you plan, you just know that your next project will be that new version of the server technology that you didn't expect to come just yet!&lt;/p&gt;&lt;img src="http://blogs.interakting.co.uk/danmatthews/aggbug/205.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dan Matthews</dc:creator>
            <guid>http://blogs.interakting.co.uk/danmatthews/archive/2008/02/18/205.aspx</guid>
            <pubDate>Mon, 18 Feb 2008 16:43:07 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/danmatthews/comments/205.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/danmatthews/archive/2008/02/18/205.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/danmatthews/comments/commentRss/205.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>