<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description></description><title>Tony Edgecombe</title><generator>Tumblr (3.0; @tonyedgecombe)</generator><link>http://www.tonyedgecombe.com/</link><item><title>My Latest Project</title><description>&lt;p&gt;This week I released my latest project, &lt;a href="http://www.folderagent.com/"&gt;Folder Agent.&lt;/a&gt; It is a Windows application that monitors a folder or directory for new and modified files. It then lets you run actions against that modified file such as copying, moving, emailing or deleting the file. You can also run an external program or script against the file.&lt;/p&gt;

&lt;p&gt;There is a template system that lets you build paths and properties dynamically, so you could move files to a folder structure based on the date for instance.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve been thinking about writing something along these lines for a long time, in fact I first registered the domain in 2005 but was never really satisified with my first few attempts. This time I started by focussing on the core functionality rather than the user interface and the whole thing has come together quickly, in fact from start to finish was only three months.&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/22834628296</link><guid>http://www.tonyedgecombe.com/post/22834628296</guid><pubDate>Fri, 11 May 2012 11:07:04 +0100</pubDate></item><item><title>Deinterleave XPS files</title><description>&lt;p&gt;XPS files have a nice feature called interleaving.&lt;/p&gt;

&lt;p&gt;When a printer receives an XPS file it needs to receive any resources such as fonts or images before those resources are used on a page. The way this is handled is items are split into parts, so the first part of the page is spooled then it may be followed by a font then more of the page followed by an image and so on.&lt;/p&gt;

&lt;p&gt;This is effective for the creator and consumer software but it does make the files difficult to navigate manually.&lt;/p&gt;

&lt;p&gt;To work around this I wrote a small &lt;a href="https://github.com/tonyedgecombe/Deinterleave"&gt;utility to deinterleave an XPS file.&lt;/a&gt;&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/16631658074</link><guid>http://www.tonyedgecombe.com/post/16631658074</guid><pubDate>Sat, 28 Jan 2012 12:39:29 +0000</pubDate></item><item><title>Car servicing costs</title><description>&lt;p&gt;Debra&amp;#8217;s car failed it&amp;#8217;s MOT last week, this wasn&amp;#8217;t unexpected, the garage told us to expect some problems the last time it was serviced. The main points of failure were the exhaust and catalytic converter, headlights and brake pads. There were a couple of warnings as well.&lt;/p&gt;

&lt;p&gt;The main Skoda dealer we have been using since we bought the car ten years ago quoted us £2,500 for all the work and a service. Although it is in great condition this is way more than the car is worth. I was a little suspicious of the dealers motives. They told us the car is worth £80 which makes me wonder if they were hoping to get a bargain and sell a new car at the same time.&lt;/p&gt;

&lt;p&gt;I had been hoping to keep the car for another couple of years, at least until the boys are at Uni, so I decided to shop around for the parts and see what I could do myself. In the end I got our local garage to fit an exhaust and catalyst for £300 and spent another £150 on parts. I still have the service and advisories to do but will probably end up saving £1800.&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/3922472581</link><guid>http://www.tonyedgecombe.com/post/3922472581</guid><pubDate>Thu, 17 Mar 2011 16:50:38 +0000</pubDate></item><item><title>Xcode: Linking to different libraries depending on configuration</title><description>&lt;p&gt;I&amp;#8217;ve just started a cross platform project in Xcode and one of the problems I came across is it doesn&amp;#8217;t seem possible to link to different libraries depending on whether you are building the Debug or Release configuration.&lt;/p&gt;

&lt;p&gt;I did find an &lt;a href="http://lists.apple.com/archives/xcode-users/2005/Jul/msg00439.html"&gt;old message&lt;/a&gt; on the Apple developer forums that indicates you can do this with dependent projects, the trouble with this is when you clean your target all the dependent projects will clean as well.&lt;/p&gt;

&lt;p&gt;In the end I did find a method that works for my project. The trick is to add a &amp;#8220;Library Search Path&amp;#8221; with the BUILD_STYLE environment variable:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
/path/to/mylibrary/build/$(BUILD_STYLE)/x86_64
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The $(BUILD_STYLE) macro gets expanded to Debug or Release depending on which configuration I am using, I just need to make sure the libraries are created in the appropriate folders.&lt;/p&gt;

&lt;p&gt;I can then add the libraries using the setting &amp;#8220;Other linker flags&amp;#8221; with the -l option:&lt;/p&gt;

&lt;p&gt;&lt;code&gt; 
-l mylibraryname
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Not as nice as the Visual Studio solution but it does seem to work.&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/2445544819</link><guid>http://www.tonyedgecombe.com/post/2445544819</guid><pubDate>Fri, 24 Dec 2010 14:12:00 +0000</pubDate></item><item><title>Implementing the Light Box effect</title><description>&lt;p&gt;I&amp;#8217;m sure you have seen the effect by now, clicking on an image thumbnail dims the page you are looking at and opens the full size version of the image in the middle of the browser window. The original implementation of this was &lt;a href="http://www.lokeshdhakar.com/projects/lightbox2/"&gt;Lightbox&lt;/a&gt;, now we seem to be overrun with &lt;a href="http://planetozh.com/projects/lightbox-clones/"&gt;clones&lt;/a&gt; doing very similar things.&lt;/p&gt;

&lt;p&gt;The trouble with including one of these clones in your site is you don&amp;#8217;t really know what the quality of code is like and most seem to be groaning under the weight of all their features. All I needed was a short script to dim the page and display an image, the rest is overkill for me.&lt;/p&gt;

&lt;p&gt;So rather than writing another clone and getting dragged down the same path I thought I&amp;#8217;d show you the steps to adding the lightbox effect to your own site.&lt;/p&gt;

&lt;p&gt;Most of the work is handled in JavaScript, there isn&amp;#8217;t anything too demanding but if you haven&amp;#8217;t used JavaScript before you are probably better off elsewhere. I will also use JQuery simply because scripting the browser is unbearable without it, if you haven&amp;#8217;t used JQuery before read the &lt;a href="http://docs.jquery.com/How_jQuery_Works"&gt;introduction&lt;/a&gt; before you continue.&lt;/p&gt;

&lt;p&gt;So the first stage is to dim the whole page, we do this by adding a &amp;lt;div&amp;gt; element to the end of the body. The div is styled with absolute positioning, fixed to the top left corner and with the width and height set to 100% so it fills the whole browser window. The opacity is set to 0.5, the background colour to black and it is hidden for now.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#bl-curtain {
    position:absolute;
    top:0;
    left:0;
    bottom: 0;
    right: 0;
    width: 100%;
    height:100%;
    background:black;
    opacity: .5;
    display:none;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In our HTML we need an image thumbnail enclosed in an anchor tag, with the class set to boxlight:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a href="image.png"&amp;gt;
    &amp;lt;img class="boxlight" src="thumb.png"
        alt="Screenshot thumbnail" border="0"&amp;gt;
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;JQuery lets us capture a click on any images marked with the boxlight class:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$(document).ready(function() {
    $('.boxlight').click(function() {
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We will drop out for IE6 or earlier, I think you can probably get this to work with IE6 but I just don&amp;#8217;t care:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if ($.browser.msie &amp;amp;&amp;amp; parseInt($.browser.version) &amp;lt;= 6) {
    return true;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It&amp;#8217;s probably a good idea to fetch the url from the parent anchor early on and drop out if we can&amp;#8217;t find it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;url = $(this).parents('a').attr('href');
if (!url) return true;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now we add our new &amp;lt;div&amp;gt; to the end of the current body:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$('body').append('&amp;lt;div id="bl-curtain"&amp;gt;&amp;lt;/div&amp;gt;');
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will pick up the style from the earlier style sheet but for IE we need to add the opacity filter after the element is in the page:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if ($.browser.msie) {
    $('#bl-curtain').css('filter', 'alpha(opacity=50)');
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If the user clicks on the background we need to clear the image and curtain:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$('#bl-curtain').click(function() {
    fadeOut();
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Finally we can get around to producing an effect, start by fading in the curtain to cover the existing page:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$('#bl-curtain').fadeIn();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With the background in place we need to start loading the main image:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var img = new Image();
$(img)
    .attr('src', url)
    .attr('id', 'bl-image')
    .click(fadeOut)
    .one('load', function() {
        onImageLoad(this);
    });
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If the image is in the browsers cache then IE doesn&amp;#8217;t fire the event so we need to do this manually, this might be the same for Opera, I haven&amp;#8217;t checked:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if ($.browser.msie &amp;amp;&amp;amp; !$(img).complete) {
    $(img).trigger('load');
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We return false so the browser doesn&amp;#8217;t try and follow the link in the anchor tag as we have done everything here:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    return false;
    });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The onLoad function has a fair amount of work to do, mostly checking if the image is too big for the browser window and if it is resizing it accordingly:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function onImageLoad(image) {
    // Once the image has loaded we can add it to the document
    $('body').append(image);

    imageWidth = $(image).width();
    imageHeight = $(image).height();

    // Resize the image if it is too big for the browser window
    viewPortWidth = $(window).width();
    viewPortHeight = $(window).height();

    if (viewPortWidth &amp;lt; imageWidth || viewPortHeight &amp;lt; imageHeight) {
        horizontalScalingFactor = imageWidth / viewPortWidth;
        verticalScalingFactor = imageHeight / viewPortHeight;

        scaling = Math.max(horizontalScalingFactor, verticalScalingFactor);

        imageHeight = imageHeight / scaling;
        imageWidth = imageWidth / scaling;

        $(image).css('height', imageHeight);
        $(image).css('width', imageWidth);

    }

    // Centre the image in the page
    $(image).css('margin-top', -imageHeight / 2);
    $(image).css('margin-left', -imageWidth / 2);

    // Finally we can fade it in
    $(image).fadeIn();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You might have noticed the negative margins applied to the image in the last piece of code, that is because the styling for the image places the top left corner in the centre of the page:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#bl-image {
    position:absolute;
    top:50%;
    left:50%;
    display:none;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The last piece of code fades out the image and background then removes them from the page:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function fadeOut() {
    $('#bl-curtain,#bl-image').fadeOut(function() {
        $(this).remove();
    });
}
&lt;/code&gt;&lt;/pre&gt;</description><link>http://www.tonyedgecombe.com/post/1407007485</link><guid>http://www.tonyedgecombe.com/post/1407007485</guid><pubDate>Tue, 26 Oct 2010 15:39:00 +0100</pubDate></item><item><title>Two weeks in Italy</title><description>&lt;p&gt;We usually spend our summer holidays camping, either in the UK or northern Europe. This is a great way to keep the costs down and the kids have always enjoyed the open space you get at a good camp site. Unfortunately our folding camper had been showing its age so we sold earlier in the year to a couple who planned to take it to Glastonbury.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve always loved Italy, the food, the cars and the people. I&amp;#8217;ve travelled there on business many times and we spent our honeymoon there twenty years ago so we decided to go back.&lt;/p&gt;

&lt;p&gt;As I stopped flying quite a few years ago we took the train, travelling from St Pancras, London to Paris on the Eurostar then Paris to Turin by SNCF. St Pancras is a splendid station completely spoilt by the shopping centre built underneath it, you are out of luck if you want to sit down before you enter the terminal. Travelling by Eurostar turned out to be much better than SNCF, the food on the SNCF train was appalling for a six hour journey.&lt;/p&gt;

&lt;p&gt;We spent a night in Turin, a rather eventful night in Verona then travelled on to Colfosco in the Dolomites. Colfosco is a quite village, mostly geared to skiing although there is plenty to do in the summer. We stayed at the &lt;a href="http://www.garnidelta.com"&gt;Garni Delta&lt;/a&gt;, a lovely warm and welcoming B&amp;amp;B at the top of the village.&lt;/p&gt;

&lt;p&gt;From there we travelled over to Venice for a couple of days. Venice is very popular and they clearly don&amp;#8217;t have to try very hard to keep their customers. It was over priced with poor food, lots of graffiti and rubbish everywhere. I don&amp;#8217;t remember it being this bad last time we visited, perhaps they are getting too many visitors.&lt;/p&gt;

&lt;p&gt;For the last few days we stayed in Bergamo, a town in Lombardy about 40&amp;#160;km from Milan. We stayed in the Cillà alta, the 17th century old town on the hill. The old town is largely pedestrianised, very quite and pleasant, a complete contrast to Venice. We stayed in &lt;a href="mailto:bbacasamia@gmail.com"&gt;A casa mia&lt;/a&gt;, a small friendly B&amp;amp;B run by ﻿Cristina Gherlinzoni.&lt;/p&gt;

&lt;p&gt;It was a lovely holiday, travelling by train was fine although I will spend a bit more for hotels closer to the station next time and take my own food onto the SNCF trains.&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/1197610915</link><guid>http://www.tonyedgecombe.com/post/1197610915</guid><pubDate>Mon, 27 Sep 2010 10:28:00 +0100</pubDate></item><item><title>New front door</title><description>&lt;p&gt;
  &lt;a title="View 'New front door' on Flickr.com" href="http://www.flickr.com/photos/73022673@N00/5020365574"&gt;
    &lt;img style="float: right;margin: 4px 4px 4px 15px;" src="http://farm5.static.flickr.com/4084/5020365574_a9d9833e25_m.jpg" border="0" alt="New front door" width="160" height="240"/&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve just about finished fitting new composite doors to the front and rear of my house. The old doors have never really fitted well, in the winter the wind blew straight through the house. We bought the doors online and I fitted them myself, this is the most difficult diy job I would tackle.&lt;/p&gt;

&lt;p&gt;I made a few mistakes on the first door but the second went in easily. We originally had a quote for £5,500 for replacement solid wood doors, by switching to composite and fitting them myself the cost came down to about £1,300. The finish is very good, you wouldn&amp;#8217;t know they aren&amp;#8217;t wood and they have the big advantage of stability when the weather changes. I&amp;#8217;m looking forward to a draft free winter.&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/1197592027</link><guid>http://www.tonyedgecombe.com/post/1197592027</guid><pubDate>Mon, 27 Sep 2010 10:20:00 +0100</pubDate></item><item><title>Which camera to take</title><description>&lt;p&gt;We just got back from our summer holidays in northern Italy, as we were travelling around quite a bit I wanted to travel as light as possible so didn&amp;#8217;t take my SLR. This time we made do with a Canon G9 and the camera in my iPhone 3GS.&lt;/p&gt;

&lt;p&gt;I have been pleasantly surprised by the camera in the phone, obviously it isn&amp;#8217;t near the G9 but it can take remarkably good photographs. It took my a little while to figure out that you can specify what part of the photograph to meter on, just touch the display on the subject of the image. There is a reasonable amount of noise in poorly lit photos but on the whole it is very good for a phone.&lt;/p&gt;

&lt;p&gt;There is an iPhone app called &lt;a href="http://itunes.apple.com/app/best-camera/id329800600?mt=8"&gt;Best Camera&lt;/a&gt; which is good at editing and uploading photos to Flickr although it does seem to loose some EXIF data.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.flickr.com/photos/edgecombe/tags/iphone/"&gt;My photos tagged with iPhone on Flickr&lt;/a&gt;&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/966918910</link><guid>http://www.tonyedgecombe.com/post/966918910</guid><pubDate>Tue, 17 Aug 2010 13:24:00 +0100</pubDate></item><item><title>Allotment strawberries</title><description>&lt;p&gt;Our allotment strawberries have been really productive this year, we have been pick ten or twelve pounds every two or three days:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.flickr.com/photos/73022673@N00/4735353542" title="View 'Allotment strawberries' on Flickr.com"&gt;&lt;img border="0" width="500" alt="Allotment strawberries" src="http://farm5.static.flickr.com/4098/4735353542_8cde6bfb12.jpg" height="312"/&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/738294812</link><guid>http://www.tonyedgecombe.com/post/738294812</guid><pubDate>Sat, 26 Jun 2010 14:28:45 +0100</pubDate></item><item><title>Creating a null printer in Windows</title><description>&lt;p&gt;I get quite a lot of requests for support on how to set-up &lt;a href="http://www.printdistributor.com"&gt;Print Distributor&lt;/a&gt; to create a null printer that discards any documents. It seems there are applications which produce regular unwanted reports that can&amp;#8217;t be turned off.&lt;/p&gt;

&lt;p&gt;Actually you don&amp;#8217;t need Print Distributor to do this, everything is already available in Windows.&lt;/p&gt;

&lt;p&gt;Start by opening the Printers folder and launch the add printer wizard.&lt;/p&gt;

&lt;p&gt;Choose a local printer and create a new port selecting local port for the type.&lt;/p&gt;

&lt;p&gt;Enter NUL: for the port name and then select a driver, any one will do although I tend to select the HP LaserJet 5.&lt;/p&gt;

&lt;p&gt;Name your printer and finish the wizard, now anything you print to this printer will just disappear.&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/520373176</link><guid>http://www.tonyedgecombe.com/post/520373176</guid><pubDate>Wed, 25 Feb 2009 03:44:19 +0000</pubDate></item><item><title>The trouble with C++</title><description>&lt;p&gt;I have been using C++ for quite a few years now, both Mail Print and Print Distributor are written in it and I consider myself reasonable competent with it.&lt;/p&gt;

&lt;p&gt;However I loathe it deeply. It really is a complete mess, there are so many gotcha&amp;#8217;s and even the simplest of tasks can run to dozens of lines of code. Take a look at &lt;a href="http://stackoverflow.com/questions/536148/c-string-parsing-python-style"&gt;stackoverflow.com/questions/536148/c-string-parsing-python-style&lt;/a&gt; for example. The C++ code presented is appropriate but virtually unreadable at a quick glance. On the other hand the Python code is simple and easily read.&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/520372051</link><guid>http://www.tonyedgecombe.com/post/520372051</guid><pubDate>Thu, 12 Feb 2009 10:09:51 +0000</pubDate></item><item><title>Product Road Maps</title><description>&lt;h3&gt;Why I don&amp;#8217;t publish product road maps&lt;/h3&gt;

&lt;p&gt;I have rough maps of where my development effort is going to go on both &lt;a href="http://www.mail-print.com"&gt;Mail Print&lt;/a&gt; and &lt;a href="http://www.printdistributor.com"&gt;Print Distributor&lt;/a&gt; so why don&amp;#8217;t I make them public? I certainly get enough requests for new features, many of the requests are followed by demands for when they will be implemented.&lt;/p&gt;

&lt;p&gt;The problem is development is pretty unpredictable, especially if you are working in area you are unfamiliar with. Setting an expectation that a new feature will be available in March then not delivering until November isn&amp;#8217;t going to win you many friends. Promising a feature then cancelling it is even worse.&lt;/p&gt;

&lt;p&gt;There is also the problem of letting your competitors know what you are planning, there are a few products which are obviously inspired by my software. The problem these people have, is they are always a step behind, this is where I want them to be.&lt;/p&gt;

&lt;p&gt;So my response to questions about future features and roadmaps is please buy the product on its current capabilities, if it doesn&amp;#8217;t do what you want then look elsewhere. If you have bought and aren&amp;#8217;t satisfied then let me know and I will refund your order.&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/520371502</link><guid>http://www.tonyedgecombe.com/post/520371502</guid><pubDate>Wed, 11 Feb 2009 09:35:47 +0000</pubDate></item><item><title>Undocumented Printing</title><description>&lt;p&gt;I just came across &lt;a href="http://www.undocprint.org/"&gt;Undocumented Printing&lt;/a&gt; by Christoph Lindemann, it looks like a really good resource if you are doing any development around the print spooler in Windows.&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/520369394</link><guid>http://www.tonyedgecombe.com/post/520369394</guid><pubDate>Wed, 07 Jan 2009 04:53:39 +0000</pubDate></item><item><title>Capturing printer data</title><description>&lt;p&gt;&lt;a href="http://www.printdistributor.com"&gt;Print Distributor&lt;/a&gt; is pretty flexible at capturing print streams, as well as handling Windows applications it&amp;#8217;s easy to setup printing from AS400, UNIX and mainframes.&lt;/p&gt;

&lt;p&gt;I do occasionally get requests to capture data from a serial or parallel port, usually from some closed or embedded application. Often these closed systems have no mechanism to export data so people want to capture reports as a export mechanism.&lt;/p&gt;

&lt;p&gt;Up till now I haven&amp;#8217;t been able to suggest a solution however I just came across &lt;a href="http://www.photologic.ca/"&gt;Photologic&lt;/a&gt; run by Rick Hoffman, Rick has some interesting hardware &amp;#8220;glue&amp;#8221; which looks like it will help these customers.&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/520368861</link><guid>http://www.tonyedgecombe.com/post/520368861</guid><pubDate>Fri, 02 Jan 2009 05:43:23 +0000</pubDate></item><item><title>VMWare Fusion - Virtual Processors</title><description>&lt;p&gt;When you configure a virtual machine in VMWare Fusion by default it runs the machine with one virtual processor.&lt;/p&gt;

&lt;p&gt;I was curious to see if running with two processors would make a difference so I ran a quick test using my software build time as a benchmark. Runing with a single processor the build time was 140 seconds, running with two it dropped to 118 seconds, a decrease of about 15%.&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/520366932</link><guid>http://www.tonyedgecombe.com/post/520366932</guid><pubDate>Wed, 19 Mar 2008 09:29:00 +0000</pubDate></item><item><title>Twitter Account</title><description>&lt;p&gt;Just set up a &lt;a href="http://twitter.com/tonyedgecombe"&gt;Twitter&lt;/a&gt; account, I&amp;#8217;m not sure what I&amp;#8217;ll put on it at this stage.&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/520364844</link><guid>http://www.tonyedgecombe.com/post/520364844</guid><pubDate>Thu, 21 Feb 2008 09:26:00 +0000</pubDate></item><item><title>Software Trial Protection</title><description>&lt;p&gt;Over the last six months I have been writing Mail Print version 2, this is a big upgrade with many changes and is now nearly complete. The last signifcant piece of work is to implement the trial protection mechanism. This is a feature in the software which lets the customer use it on a trial basis for a short period (usually 30 days) in order for them to check it satisfies their requirements before they hand over their money.&lt;/p&gt;

&lt;p&gt;In the past I have used an off the shelf commercial &amp;#8220;wrapper&amp;#8221; to handle trial protection. This had a lot of benefits at the time including cutting development time and the use of more secure encryption than I have the skills to develop. However this hasn&amp;#8217;t been without it&amp;#8217;s problems, the worst of which was the introduction of DEP (Data Execution Protection) in Windows which blocks code which changes on the fly. The vendor of this software has struggled to resolve problems in this area and offered very little constructive support.&lt;/p&gt;

&lt;p&gt;So the choice I had to make was whether to buy another product or code my own system, I decided on the later. This post is really a specification for what I need to write.&lt;/p&gt;

&lt;p&gt;I thought it might be useful for anybody else looking at developing their own scheme to see what my requirements are. As I sell mainly to businesses traditional piracy hasn&amp;#8217;t been a big issue for me, more of a problem are issues like under licensing within an organization and handling refunds.&lt;/p&gt;

&lt;p&gt;There are some basic principles I apply to all my software development which are worth listing.&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;p&gt;The software is written for my customers benefit, not mine. This means the trial mechanism should inconvenience them as little as possible. Of course there is a trade off here, if I took away any protection then it would be very convenient for the customer but my revenue would dry up so I need to strike a balance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Favor simplicity over complexity, this is often more difficult than you would think. If you watch a duck glide across water and it looks very smooth, this is how the user should see my software, under the water though there is a lot of effort being expended to achieve this smoothness.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Minimise support costs, currently a significant proportion of my support emails relate to problems with registering Mail Print. I&amp;#8217;d really like to reduce these as much as possible even if it has a small impact on revenue.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Having laid out the principles I can cover the main functionality in the trial mechanism.&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;&lt;p&gt;Trial version. The standard trial needs to work for 30 days from the point of installation, after 30 days the application can continue to work except it should stop checking messages. During the trial period Mail Print will put a banner on all the printed documents to indicate how much longer the trial period will last for. It&amp;#8217;s quite common for customers to try the software and decide not to buy only for them to come back some time later and try again, to for allow this Mail Print will reset the trial for each new version.&lt;br/&gt;
The splash screen will indicate how much longer the trial will run for and give the customer an opportunity to buy Mail Print and enter their registration key.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trial extensions. To extend the trial the user just needs to type extension into the keycode field. This lets us extend a users trial without having to issue a new keycode. The extension will last for 14 days and can only be done once.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Expiring keys. Currently when I accept a purchase order from a customer I deliver a full keycode straight away. Mostly this works OK but there are a regular stream of customers who never pay the invoice. For new purchase orders the key generator will issue a temporary key which will work for 90 days, when the customer pays their bill they will get a full keycode, this can be automated so that it is transparent to the customer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mail Print will be available in Standard and Professional editions. The mechanism which handles this can support new versions in the future.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Key Format. There is a trade off here between the security of the key and ease of entry. I have been surprised by how difficult some users find it to enter the key-code, I&amp;#8217;m pretty sure some of them don&amp;#8217;t know what copy and paste is and they certainly have problems distinguishing 0 with O and 1 with l. The key-name is a frequent problem, the current key generator will use the customers business name if it is available but users still try and enter their own name when they register. To solve both of these problems I am going to disconnect the users name from the key-code and stick with a short numeric only code something like this:
    1234-5678-9012-3456-7890
This should eliminate a lot of support issues, it remains to be seen what impact it will have on crackers. The key will be packed using modular arithmetic to make it as short as possible and have a simple checksum to make sure it is valid on entry.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Key Verification. Rather than focussing too much on strong encryption of the key I&amp;#8217;m going to rely on partial verification of the key-code, there will be a section of the key with a secret bit pattern. Each new release of the software will only check one of these bits which should frustrate anybody trying to create a key generator, as soon as one is released I can produce a new build which checks an extra bit and makes the generator useless.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Upgrading. Currently I rely on a back end system to handle upgrades, customers get a completely new key-code. This works well so I don&amp;#8217;t plan to change it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Volume licenses. The key-code will hold the quantity of licenses the customer has bought. One area I know I loose business at the moment is from customers who purchase a single license then install the software on many machines. Although I don&amp;#8217;t have an accurate figure for this I see enough support emails hinting at it that I am convinced it is costing me revenue. Although I&amp;#8217;m not going to implement it straight away at some point in the future I will write some local network checking code to identify overuse.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Online Activation. Up to now I have been quite negative about online activation schemes, the mechanisms in Windows and Office have caused me problems a number of times even though I am using fully licensed software. However there is a problem with the use of stolen credit cards which results in chargebacks and to a lesser extent people continuing to use the software after a refund has been issued.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Mail Print will use a passive activation scheme so if it can&amp;#8217;t make a connection to the server for some reason it will assume everything is OK and there is a legitimate reason for this, only if it can reach the server and the server tells it the key-code is illegitimate then it will stop working. This will provide a mechanism to deactivate the software without inconveniencing any legitimate customers.&lt;/p&gt;

&lt;p&gt;Now all I have to do is write the code!&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/520363398</link><guid>http://www.tonyedgecombe.com/post/520363398</guid><pubDate>Fri, 08 Feb 2008 09:17:19 +0000</pubDate></item><item><title>Shareware Radio Interview</title><description>&lt;p&gt;Mike Dulin interviewed me at the &lt;a href="http://www.euroconference.org"&gt;European Shareware Conference&lt;/a&gt;, you can listen to the interview &lt;a href="http://www.sharewareradio.com/week070524.htm"&gt;here&lt;/a&gt;&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/520362339</link><guid>http://www.tonyedgecombe.com/post/520362339</guid><pubDate>Thu, 24 May 2007 09:10:09 +0100</pubDate></item><item><title>64-Bit Software</title><description>&lt;p&gt;64-Bit versions of Windows have been available for some time now but it&amp;#8217;s only in the last week that I have started getting requests for a 64-bit version of Print Distributor. Microsoft announced this week the next version of Windows on the desktop will be 64-bit only.&lt;/p&gt;

&lt;p&gt;It looks like a fairly small change to the code and a recompile of the port monitor is all I need although I&amp;#8217;m going to take the opportunity to pull wxWidgets out of the port monitor at the same time.&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/520361369</link><guid>http://www.tonyedgecombe.com/post/520361369</guid><pubDate>Fri, 18 May 2007 09:08:56 +0100</pubDate></item><item><title>HelpSpot Help Desk Software</title><description>&lt;p&gt;For the last couple of years I have been using FogBugz to manage all my support emails and bug tracking. FogBugz is primarily a bug tracking application but it has a nice interface for managing support email which fits in quite well with my work patterns.&lt;/p&gt;

&lt;p&gt;There is however one large problem for me in using FogBugz and that is it isn&amp;#8217;t easy to install on most web hosts. The solution to this up until has been to setup a separate hosting account at Server Intellect. After some initial problems this has been OK but I really wanted to offer my customers the ability to track issues in our web site, this was proving to be more difficult than it should have been.&lt;/p&gt;

&lt;p&gt;I looked at a number of open and closed source solutions, installing most of them on a local test server. Sadly it seems there is a lot of software out there with reliability and security problems, a quick glance through the PHP code showed many opportunities for sql-injection type attacks.&lt;/p&gt;

&lt;p&gt;One application I looked at some time ago is HelpSpot written by Ian Landsman. I have been following Ian&amp;#8217;s blog about developing HelpSpot for some time but had initially ruled it out because one of it&amp;#8217;s requirements is the installation of the Zend Optimizer. This wasn&amp;#8217;t available on my original shared web hosting account but I have just recently upgraded to a dedicated server so I decided to take another look.&lt;/p&gt;

&lt;p&gt;Installation was very straight forward, first I needed to setup a database in the control panel on my host then upload the application. There is a configuration file to edit with the database details and an install script to run. The whole process is very simple and took less than ten minutes.&lt;/p&gt;

&lt;p&gt;Configuration is a bit more complex, a couple of options I needed to change were quite hard to find. The upside to this of course is you are likely to find just about anything you need to modify. There is quite a nice category system which lets you split different types of calls, sales vs support for instance. Each category can then have a set of tags which you tick for each call, in my case I setup tags for different products and call types. Once I have been using it for a while I should be able to gather stats on each product&amp;#8217;s support load.&lt;/p&gt;

&lt;p&gt;During normal day to day use I spend most of my time in the workspace, an in-box for support requests. The look and feel is very similar to a web based email client with a general in-box and my own queue. When a customer open&amp;#8217;s a request you can see the complete history of the request and you have the option to add both public and private notes. This can be slightly confusing as by default notes are private so if your aren&amp;#8217;t careful enough your customer might not see your replies. The next release of HelpSpot has an option to make note public by default so this should resolve this issue.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s still early days for HelpSpot but it has got off to a good start, it has a nice polished feel to it, well done Ian.&lt;/p&gt;</description><link>http://www.tonyedgecombe.com/post/520360163</link><guid>http://www.tonyedgecombe.com/post/520360163</guid><pubDate>Wed, 15 Mar 2006 09:05:23 +0000</pubDate></item></channel></rss>

