Footprints in the snow of a warped mind

Tuesday, April 28, 2009

Where to find me

Flickr Icon  Twitter Icon  Linked In Icon  FaceBook Icon  Windows Live Alerts Butterfly  RSS 2.0 

The Site Doctor is Hiring!

Enjoy what you read here?
Think you can do better?
Join our team and get paid
up-to £35,000.
Apply now.

Tag Cloud

AJAX (4) Analysis (3) ASP (6) ASP.Net (59) Error Reporting (4) Web Service (2) WSDL (1) Atlas (2) Azure (1) Born In The Barn (1) Business (95) Business Start-up Advice (37) Client (17) Expanding Your Business (24) Recruitment (1) C# (25) Canoeing (4) Canoe Racing (5) Cheshire Ring Race (5) Racing (2) Training (4) Christmas (1) CIMA (1) Cisco (1) 7970G (1) CMS (1) Code Management (1) Cohorts (4) Commerce4Umbraco (1) Content (1) Content Management (1) Content Management System (1) CSS (4) dasBlog (5) DDD (2) DDDSW (1) Design (12) Icons (1) Development (28) Domain Names (1) eCommerce (13) Email (1) Employment (2) Festive Sparkle (1) General (39) Christmas (6) Fun and Games (11) Internet (22) Random (46) RX-8 (8) Git (2) Google (1) Google AdWords (1) Google Analytics (1) Hacking (1) Helpful Script (3) Home Cinema (2) Hosting (2) HTML (3) IIS (11) iPhone (1) JavaScript (5) jQuery (2) LINQPad (1) Marketing (6) Email (1) Multipack (1) MVC (3) Networking (3) Nintendo (1) Nuget (1) OS Commerce (1) Payment (1) Photography (1) PHP (1) Plugin (1) PowerShell (3) Presentation (1) Press Release (1) Productivity (3) Random Thought (1) Script (2) Security (2) SEO (6) Server Maintenance (7) Server Management (12) Social Media (2) Social Networking (3) Experiment (1) Software (11) Office (5) Visual Studio (14) Windows (6) Vista (1) Source Control (2) SQL (13) SQL Server (19) Starting Something New (2) Statistics (2) Stored Procedure (1) Sublime Text 2 (1) SVN (1) TeaCommerce (1) Testing (2) The Cloud (1) The Site Doctor (140) Turnover Challenge (1) Twitter (3) uCommerce (21) Umbraco (38) 2009 (1) 2011 (1) Useful Script (6) Virtual Machine (1) Web Development (72) WebDD (33) Wii (1) Windows Azure (1) XSLT (1)

Blog Archive


<April 2009>

Blog Archive

Various Links


Blogs I Read

[Feed] Google Blog
Official Google Webmaster Central Blog
[Feed] Matt Cutts
Gadgets, Google, and SEO
[Feed] Ol' Deano's Blog
My mate Dean's blog on my space, equally as random as mine but not off on as much of a tangent!
[Feed] Sam's Blog
Sam is one of my younger brothers studying Product Design and Manufacture at Loughborough, this is his blog :) Enjoy!

The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

newtelligence dasBlog 2.2.8279.16125

Send mail to the author(s) Email Me (Tim Gaunt)

© 2015 Tim Gaunt.

Sign In

    # Tuesday, April 28, 2009

    Fix missing JavaScript file when you rename the Umbraco admin directory

    Tuesday, April 28, 2009 6:49:48 PM (GMT Daylight Time, UTC+01:00)

    The Error

    For those of you who have tried to rename your Umbraco installation directory to something other than the default /umbraco/ you'll have found that TreeInit.aspx throws a JavaScript error along the lines of:

    Message: Object expected
    Line: 1
    Char: 4236
    Code: 0
    URI: http://www.yourdomain.co.uk/youradmindirector/js/xloadtree.js

    As this only really affects the refresh of the tree/close of a couple of dialogues I've not bothered fixing it but basically the issue is outlined well here: http://tinyurl.com/cx9atv

    The Fix

    If you're using extension less URLs already then it's easy as pie to sort:

    1. Open your UrlRewriting config file (/config/UrlRewriting.config)
    2. Add this above "</rewrites>":
    <add name="missingjs" 
        virtualUrl="^~/## YOUR ADMIN DIRECTORY GOES HERE ##_client/ui/(.*).js" 
        ignoreCase="true" />

    If you've not already using extension less URLs don't panic, that's easy to setup you can read all about it here. Alternatively you could just copy the js files from one folder to another ;)

    The Why

    I don't know how many people already rename their admin dir from something else but as Umbraco becomes a more popular choice of CMS you really should consider hiding the folder (the more popular it becomes, the more people will become more familiar with the default admin directory of /umbraco/).

    Although there hasn't yet been a breach (AFAIAA) if a vulnerability is found, the first step in prevention is obfuscation -hide your admin directory! A quick Google search will show you how easy some developers have made it for you to find their admin sites.


    Don't forget to follow me on Twitter.

    # Saturday, April 25, 2009

    Maplin loses it’s way with it’s GPS

    Saturday, April 25, 2009 12:17:48 PM (GMT Daylight Time, UTC+01:00)

    This came through in my email today and it made me smile:


    Don't forget to follow me on Twitter.

    Maplin loses it’s way with it’s GPS
    Useful Links:  #  digg it!  del.icio.us  Technorati  email it!  Post CommentsComments [0]  Trackback LinkTrackback
    CategoriesTags: Business | Marketing | Email
    # Friday, April 17, 2009

    Quick ASP.Net tip: Half your page size in ASP.Net instantly

    Friday, April 17, 2009 3:53:05 PM (GMT Daylight Time, UTC+01:00)

    Ok it might be a little less than half side but it's near enough. I've been sitting on this for a while and needed to reference it for someone so I thought I'd post quickly about it. One of the most common complaints about .Net is that you have a lot of hidden "content" by the way of hidden inputs and the likes throughout your site. This can easily get corrupt on postback/slowdown the page load times etc.

    Really you should be optimising each control on the page (enabling/disabling where relevant) but if you want to cheat (lets face it, we all do):

    1. Download the files: PageStateAdapterv1.0.zip (3KB)
    2. Put PageStateAdapter.browser into your /App_Browsers/ folder (or create one and add it)
    3. Put TSDPageStateAdapter.dll into your website's /bin/ folder
    4. Load up your website and checkout your ViewState :)

    Incase you're interested in the source for it:


        <browser refID="Default">
                <adapter controlType="System.Web.UI.Page" adapterType="TheSiteDoctor.PageStateAdapter.PageStateAdapter" />
                <capability name="requiresControlStateInSession" value="true" />


    using System.Web.UI;

    namespace TheSiteDoctor.PageStateAdapter
        public class PageStateAdapter : System.Web.UI.Adapters.PageAdapter
            public override PageStatePersister GetStatePersister()
                return new SessionPageStatePersister(this.Page);

    The best example of how much this reduces ViewState by is when you add a large DataGrid to your site.

    Post files: PageStateAdapterv1.0.zip (3KB)

    Update: Apologies to those of you who downloaded and found it wouldn't compile, the .browser file was a little off (missing the second "PageStateAdapter"). I've updated it and changed the zip file download. Enjoy!


    Don't forget to follow me on Twitter.

    # Wednesday, March 11, 2009

    Congratulations, you've installed dasBlog with Web Deploy!

    Wednesday, March 11, 2009 7:00:00 AM (GMT Standard Time, UTC+00:00)

    After logging in, be sure to visit all the options under Configuration in the Admin Menu Bar above. There are 26 themes to choose from, and you can also create your own.



    Don't forget to follow me on Twitter.

    # Monday, March 02, 2009

    Visual Studio Tip of the day: Open files/folders in Windows Explorer

    Monday, March 02, 2009 11:09:25 AM (GMT Standard Time, UTC+00:00)

    A little irritation/time consuming process when you're working with multiple projects on multiple drives/SVN repos/directories is to open the current file's location within Windows Explorer. If you weren't already aware, you can do this from most projects/files by right clicking on the project in the solution browser:

    Problem for me (and my mate Chris) is that not only is it just for the Project Item but more importantly it means using the mouse -which is something I'm trying to avoid as much as possible. Then I stumbled across a couple of posts which suggested opening Windows Explorer with Visual Studio's External Tools dialog.

    They're both great ideas but you still need to use the mouse so I thought I'd take the final step and wire up some keyboard shortcuts. I'll recap the process here as I've added/grouped a few of their settings.

    Creating the "External Tools"

    There's a little productivity tip here for setting the folder in question the root of Windows Explorer, this encourages you to focus on just the work in question (though it can be a little irritating sometimes so I may "undo" this change later.

    Custom #1: Open the current solution item in Windows Explorer

    Title: Windows Explorer - Item
    Command: explorer.exe
    Arguments: /select,"$(ItemPath)"

    Custom #2: Open the current Visual Studio project in Windows Explorer

    Title: Windows Explorer - Project Directory
    Command: explorer.exe
    Arguments: /root,"$(ProjectDir)"

    Custom #3: Open the current Visual Studio solution in Windows Explorer

    We've got a number of projects that have useful files/folders stored in the same folder as the solution file so this one's useful to get quick access to them, I think I'll use this one a lot when dealing with SVN.

    Title: Windows Explorer - Solution Directory
    Command: explorer.exe
    Arguments: /root,"$(SolutionDir)"

    Custom #4: Open the current solution's binary (bin) directory in Windows Explorer

    Useful when you want to get access to the dll i.e. to copy to another folder/upload just the dll to a website.

    Title: Windows Explorer - Binary Directory
    Command: explorer.exe
    Arguments: "$(TargetDir)"

    Custom #5: Open the current solution's target build directory in Windows Explorer

    This is useful when you have a project that builds to another directory (i.e. a common DLL directory, I'm not sure how many people do this but I've got a couple of projects that do this so I thought I'd share it).

    Title: Windows Explorer - Target Directory
    Command: explorer.exe
    Arguments: "$(BinDir)"

    In all instances you can leave the Initial Directory field empty.

    Note: On a couple of the directory related commands I've set the "/root" argument, this is a useful little productivity tip I learn a while ago to stop you navigating away from your work. Irritatingly I've not found a way of using the /select and /root commands together. It would also be nice to say "Open the bin folder and set the root to the project folder" but again I've not found a way.

    If you're interested in the arguments I'm using there, check out the Microsoft Support article about How To Customize the Windows Explorer Views in Windows XP (these also work in Vista). Alternatively you can read more about the Visual Studio macros for build commands here (some of which are global I believe). I'm interested to see the use of $(TargetDir) as although it'll be useful for non-web projects, however using Web Deployment Projects might make it irrelevant for you.

    You should now have 5 new items in your Tools' toolbar:

    Wire up the keyboard shortcuts

    As mentioned earlier, I want keyboard shortcuts but if you want toolbar icons, you should checkout the end of this post.

    Open up the Keyboard settings within the Visual Studio Option dialog (Tools -> Options -> Environment -> Keyboard) -you may need to select the "Show all settings" checkbox in the bottom left of the Options dialog to see the Keyboard option.

    In the Show commands containing field enter "Tools.ExternalCommand" to list the set of commands, irritatingly it just labels each command as "Tools.ExternalCommand#" for each command so this bit will require a little thinking on your behalf. My commands are #2-6 (#1 is the Dotfuscator Community Edition command).

    I would then wire up the following shortcuts (I've set them up Globally for convenience):

    Tools.ExternalCommand2 (Current Item): Ctrl+E, I
    Tools.ExternalCommand3 (Current Project): Ctrl+E, P
    Tools.ExternalCommand4 (Current Solution): Ctrl+E, S
    Tools.ExternalCommand5 (Bin dir): Ctrl+E, B
    Tools.ExternalCommand6 (Target dir): Ctrl+E, T

    To enter these shortcuts simply press the first combination (in this case Ctrl+E), then press the second key (I -item, P -project, S -solution, B -binary, T -target). I found that a couple of these were already wired up to ReSharper and Pex which is a pain but I don't tend to use those particular shortcuts so I just overrode them

    Now you should be able to press Ctrl+E followed by I and get your current item in Explorer.

    It'd be nice if I could get it to use a single instance of Explorer and just refocus the items (on another key combo as that's not always the desired action).

    Update: After using it a little, I've noticed that in my projects, I had the Bin/TargetDir the wrong way around (now corrected).

    Don't forget to follow me on Twitter.

    # Friday, February 27, 2009

    Advanced Error Reporting in Umbraco, dasBlog and other ASP.Net sites

    Friday, February 27, 2009 3:51:13 PM (GMT Standard Time, UTC+00:00)

    If you've been following my blog you'll know that I've been raving about error reporting within ASP.Net (you can see my ASP.Net Error Reporting category for a couple of them if you like) but until now it's been limited to those sites that you have access to the global.asax file.

    One of the irritations I've found with Umbraco and dasBlog is that I don't get notified of errors as they're just logged to a text file/database somewhere. This is fine if you run 2 or 3 sites but we manage too many to check them all everyday. Instead we rely on email error notifications which until today have been a PITA to integrate into Umbraco.

    Today I'd like to introduce to you Error Handling v2.0 which instead of relying on the global.asax file for the error hooks, uses a HttpModule which means you can install it into any existing/pre-built application such as Umbraco and dasBlog.

    Adding it into the site is simple, you'll need to install the module into the web.config file and add the configuration section a sample (cut down) web.config is below:

    <?xml version="1.0"?> 
            <section name="tsdErrorsConfigSection" allowExeDefinition="MachineToApplication" restartOnExternalChanges="true" type="System.Configuration.NameValueFileSectionHandler, System, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
        <tsdErrorsConfigSection file="ErrorHandling.config"/> 
                <smtp from="you@yourdomain.com"> 
                    <network host="" port="25" /> 
                <add name="ErrorModule" type="TheSiteDoctor.ErrorHandling.ErrorModule, TheSiteDoctor.ErrorHandling" /> 

    IIS 7 Settings 
            <validation validateIntegratedModeConfiguration="false" /> 
                <add name="ErrorModule" type="TheSiteDoctor.ErrorHandling.ErrorModule, TheSiteDoctor.ErrorHandling" /> 

    Then you'll need to check all the settings -I recommend storing these in another .config file for clarities sake. Make sure you've configured your SMTP settings and you should be good to go.

    If you want to test your settings, I've included a test page for you that will check your settings and show you the defaults if you've not set them. I've got this running now on a couple of Umbraco and dasBlog installs without an issue.

    There's also a useful logging system in it which I'll look to overview in a later post but if you want to see it, check out the included aspx file.

    Download ErrorHandling_v2.0.zip (25Kb)

    If you do use this code I'd be interested to hear how you get on, I think it requires a little more refinement un some areas but it's pretty robust.



    Don't forget to follow me on Twitter.

    # Wednesday, February 25, 2009

    No hidden charges

    Wednesday, February 25, 2009 6:36:42 PM (GMT Standard Time, UTC+00:00)

    I've had a couple of situations recently where clients have suggesting "tricking" the user into either remaining subscribed to a service i.e. a mailing list or rammed some sales info down their throat whereas we advise to go the oposite direction -if someone doesn't want to read your email, why pay to send it to them? Just because you send it to them, doesn't mean they're going to read it.

    Then while booking some tickets this evening I came across FlyThomson's take on it. I was going to blog how I thought their prices were reasonable, or how their checkout process upsold well etc but instead I get to the very last stage and after having "Still no change, the seats are the same price"!"/"The price you see is the price you pay" throughout I noticed that when selection any form of "grown up" payment card I get charged £10!!

    The only cards it turns out that don't charge you are Solo and Visa Electron. So much for the "Still no change."

    Why try and bamboozle your customer? Ok I had to pay it but I wouldn't now recommend you.



    Thanks. Why didn't you state that at the start?


    Don't forget to follow me on Twitter.

    No hidden charges
    Useful Links:  #  digg it!  del.icio.us  Technorati  email it!  Post CommentsComments [3]  Trackback LinkTrackback
    CategoriesTags: Business
    # Tuesday, February 17, 2009

    Recent comments macro for DasBlog

    Tuesday, February 17, 2009 9:25:05 AM (GMT Standard Time, UTC+00:00)

    One of the issues I had with John Forsythe's Recent Comments macro for DasBlog was that the dasBlog recent comments weren't ordered by date (descending). I found that as people commented on older posts they were getting buried which irritated me as many were very still valid comments.

    The fix was actually fairly simple, it was just a matter of adding  a sort and thanks to Lamba expressions, this is something we can do fairly simply. If you want to add recent comments to your dasBlog installation, use the following macro:

    Recent Comments Macro

    public virtual Control RecentComments(int count, int adminComments, int trimTitle, int trimContent, int trimAuthor, bool showTitle, bool showCommentText, bool showCommentCount)
        int commentsToShow;
        int totalComments;

        CommentCollection allComments = this.requestPage.DataService.GetAllComments();
        totalComments = allComments.Count;

        //Sort the comments in date order (descending)
        allComments.Sort((c1, c2) => c1.CreatedUtc.CompareTo(c2.CreatedUtc));

        if (!this.requestPage.HideAdminTools && SiteSecurity.IsInRole("admin"))
            commentsToShow = totalComments - adminComments;
            commentsToShow = totalComments - count;

        if (commentsToShow < 0)
            commentsToShow = 0;

        StringBuilder sb = new StringBuilder();

        sb.AppendLine("<div class=\"recentComments\">");

        if (showCommentCount)
            sb.AppendFormat("<div class=\"totalComments\">Total Comments: {0}</div>", totalComments);

        sb.AppendLine("<ul class=\"comments\">");

        #region Loop through the comments

        for (int i = totalComments - 1; i >= commentsToShow; i--)
            Comment current = allComments[i];

            bool showComment;
            if (!current.IsPublic || (current.SpamState == SpamState.Spam))
                if (!this.requestPage.HideAdminTools && SiteSecurity.IsInRole("admin"))
                    showComment = true;
                    showComment = false;
                    if (commentsToShow > 0)
                showComment = true;

            if (showComment)
                if ((current.SpamState == SpamState.Spam))
                    sb.Append("<li class=\"spam\">");
                else if (!current.IsPublic)
                    sb.Append("<li class=\"hidden\">");

                string link = String.Format("{0}{1}{2}", SiteUtilities.GetCommentViewUrl(current.TargetEntryId), "#", current.EntryId);
                string title = current.TargetTitle;
                string desc = current.Content;
                string author = current.Author;

                if (showTitle)
                    sb.AppendFormat("<div class=\"recent{0}CommentsTitle\"><a href=\"{1}\">",

                    if ((title.Length > trimTitle) && (trimTitle > 0))
                        sb.AppendFormat("RE: {0}...", title.Substring(0, trimTitle));
                        sb.AppendFormat("RE: {0}", title);


                if (showCommentText)
                    sb.AppendFormat("<div class=\"recentCommentsContent\"><a href=\"{0}\">",

                    if ((desc.Length > trimContent) && (trimContent > 0))
                        sb.Append(desc.Substring(0, trimContent));


                sb.Append("<div class=\"recentCommentsAuthor\">");

                if ((author.Length > trimAuthor) && (trimAuthor > 0))
                    int num3 = (trimAuthor > author.Length) ? author.Length : trimAuthor;
                    sb.Append("by " + author.Substring(0, num3));
                    sb.Append("by " + author);


        return new LiteralControl(sb.ToString());

    I've since been working on extending it further so you can add a "All Comments" link which I'll post up later as it needs a little more work :)

    If you want this wrapped up as a DLL let me know and I'll upload it.

    Update 26th Feb 2009: You can download the dll here (it's also got a few other things in there if you want to look around).

    Update 27th Feb 2009: I noticed that the above code was messing up everynow and again so I've updated it to use Linq instead which seems to work well. I've updated the DLL but not the source yet.


    Don't forget to follow me on Twitter.

    Recent comments macro for DasBlog
    Useful Links:  #  digg it!  del.icio.us  Technorati  email it!  Post CommentsComments [1]  Trackback LinkTrackback
    CategoriesTags: C# | dasBlog | Web Development