Category: B2C

  • Nutbourne Place

    Nutbourne Place

    , ,

    Adrian is fortunate to live at Nutbourne Place, a fine country house in West Sussex with a great pub, The Rising Sun, down the road.

    The Annexe at Nutbourne Place is available for holiday rentals through Airbnb.

    The nutbourneplace.com website was put together to highlight useful links to walks and attractions for visitors to the annexe. Several of Adrian’s pages, e.g., the Walks page, feature a series of customised Google Maps within the WordPress site.

    The process of creating this geographical content was reasonably straightforward, if slightly demanding:

    • Walks were undertaken, enjoyably, with a smart watch recording the route using Google Fit.
    • The smart watch recorded direction, elevation and pace in GPS Exchange Format (GPX) files.
    • These files could be downloaded by visiting the Google Takeout site, selecting Google Fit data.
    • Each GPX file was converted to Keyhole Markup Language (KML) using an online converter for use in Google Maps.

    Finally, the resulting KML files could be uploaded to the webserver hosting the nutbourneplace.com website.

    Coding required one large JavaScript block specifying all of the maps used on the site.

    <script>
      // Initialize and add the map
      function initMap() {
    	
    	// The location of NP
    	const NP = { lat: 50.960043, lng: -0.470723 };
    	
    	// Map #1, centered at NP
    	const map_1 = new google.maps.Map(document.getElementById("map_1"), {
    	  mapTypeId: 'satellite',
    	  center: NP,
    	});
    	// NP marker on this map
    	const marker_1 = new google.maps.Marker({
    	  position: NP,
    	  title: 'Nutbourne Place', 
    	  label: 'NP', 
    	  map: map_1,
    	}); 
    
    	// Map #2, centered at NP
    	const map_2 = new google.maps.Map(document.getElementById("map_2"), {
    	  mapTypeId: 'satellite',
    	  center: NP,
    	});
    	// NP marker on this map
    	const marker_2 = new google.maps.Marker({
    	  position: NP,
    	  title: 'Nutbourne Place', 
    	  label: 'NP', 
    	  map: map_2,
    	}); 
    
    	// Map #3, centered at NP
    	const map_3 = new google.maps.Map(document.getElementById("map_3"), {
    	  mapTypeId: 'satellite',
    	  center: NP,
    	});
    	// NP marker on this map
    	const marker_3 = new google.maps.Marker({
    	  position: NP,
    	  title: 'Nutbourne Place', 
    	  label: 'NP', 
    	  map: map_3,
    	}); 
    
    	// Map #4, centered at NP
    	const map_4 = new google.maps.Map(document.getElementById("map_4"), {
    	  mapTypeId: 'satellite',
    	  center: NP,
    	});
    	// NP marker on this map
    	const marker_4 = new google.maps.Marker({
    	  position: NP,
    	  title: 'Nutbourne Place', 
    	  label: 'NP', 
    	  map: map_4,
    	}); 
    
    	// KML - long_sheep_loop
    	const long_sheep_loop_Layer = new google.maps.KmlLayer({
          url: "https://www.nutbourneplace.com/wp-content/uploads/2021/06/2021-05-10_long_sheep_loop.kml",
          map: map_1,
    	});
    
    	// KML - gunnera_nyetimber_woods
    	const gunnera_nyetimber_woods_Layer = new google.maps.KmlLayer({
          url: "https://www.nutbourneplace.com/wp-content/uploads/2021/06/2021-05-13_gunnera_nyetimber_woods.kml",
          map: map_2,
    	});
    
    	// KML - local_llama_loop
    	const local_llama_loop_Layer = new google.maps.KmlLayer({
          url: "https://www.nutbourneplace.com/wp-content/uploads/2021/06/2021-05-19_local_llama_loop.kml",
          map: map_3,
    	});
    
    	// KML - long sheep loop
    	const woodland_lake_millpond_Layer = new google.maps.KmlLayer({
          url: "https://www.nutbourneplace.com/wp-content/uploads/2021/06/2021-05-25_woodland_lake_millpond.kml",
          map: map_4,
    	});
    
      }
    </script>

    Each map was named so that individual maps could be pulled into pages through DIVs, e.g., map_1.

    <!-- The div element for the map -->
    <div id="map_1" style="height: 400px; width: 100%;"></div>

    This sort of process illustrates what can be achieved with modern technology. Additional setup was required to enable the Google Maps API within the Google Cloud Platform, and more coding was required to initialise the Maps clients through JavaScript calls with API keys. Try it and you may well get there eventually…

    Sadly, of course, it can all sometimes go a bit pear! Similar data collection and mapping of US Army personnel’s exercise routines on Strava has created perfect maps of overseas bases.

    No wonder it is sometimes advisable to turn our smart devices off!

  • Allt Beag

    Allt Beag

    , ,

    Allt Beag is a stone-built, Victorian house in the beautiful coastal village of Tighnabruaich, Argyll & Bute.

    The house was purchased by Adrian and his family in late 2005 and substantially renovated in the months that followed. The website itself dates from around 2009, when attempts were made to rent out Allt Beag for holiday lets, following the purchase of Ascog Farm on the Isle of Bute the previous year.

    Adrian was always particularly pleased with the image shuffling array on the Allt Beag website, enabled with the following code.

    <!--- serve the right image for the section --->
    <cfif listcontains("house,interior,garden,sea,surround", section, ",") is 0>
    	<!--- choose a section at random --->
    	<cfset section_number = randrange(1,4)>
    	<cfset section = listgetat("house,interior,garden,sea,surround", section_number, ",")>
    <cfelse>
    	<!--- we are fine --->
    </cfif>
    
    <!--- shuffle the order of the images --->
    <!--- FROM http://www.bennadel.com/blog/280-Randomly-Sort-A-ColdFusion-Array-Updated-Thanks-Mark-Mandel.htm --->
    <cfset arrayImageNumbers = ListToArray(
    	"001,002,003,004,005,006,007,008"
    	) />
     
    <!--- Shuffle it (ie. randomly sort it). --->
    <cfset CreateObject(
    	"java", 
    	"java.util.Collections"
    	).Shuffle(
    		arrayImageNumbers
    	) />
    
    <!--- <cfoutput>#arraytolist(arrayImageNumbers)#</cfoutput><br /><br /> --->
    
    <!--- output the images --->
    <cfoutput>
    <div id="leftcolumn">
    	<div class="innertube">
    		<!--- images in the golden rectangle configuration with mouseovers --->
    		<IMG STYLE="position:absolute; TOP:  0px; LEFT:  0px; WIDTH:450px; HEIGHT:450px" SRC="images/#section#_#arrayImageNumbers[1]#_a.jpg" NAME="image_a">
    		<IMG STYLE="position:absolute; TOP:450px; LEFT:  0px; WIDTH:278px; HEIGHT:278px" SRC="images/#section#_#arrayImageNumbers[2]#_a.jpg" NAME="image_b" onMouseOver="document.image_a.src='images/#section#_#arrayImageNumbers[2]#_a.jpg';document.image_b.src='images/#section#_#arrayImageNumbers[1]#_b.jpg';" onMouseOut="document.image_a.src='images/#section#_#arrayImageNumbers[1]#_a.jpg';document.image_b.src='images/#section#_#arrayImageNumbers[2]#_b.jpg';">
    		<IMG STYLE="position:absolute; TOP:556px; LEFT:278px; WIDTH:172px; HEIGHT:172px" SRC="images/#section#_#arrayImageNumbers[3]#_a.jpg" NAME="image_c" onMouseOver="document.image_a.src='images/#section#_#arrayImageNumbers[3]#_a.jpg';document.image_c.src='images/#section#_#arrayImageNumbers[1]#_c.jpg';" onMouseOut="document.image_a.src='images/#section#_#arrayImageNumbers[1]#_a.jpg';document.image_c.src='images/#section#_#arrayImageNumbers[3]#_c.jpg';">
    		<IMG STYLE="position:absolute; TOP:450px; LEFT:344px; WIDTH:106px; HEIGHT:106px" SRC="images/#section#_#arrayImageNumbers[4]#_a.jpg" NAME="image_d" onMouseOver="document.image_a.src='images/#section#_#arrayImageNumbers[4]#_a.jpg';document.image_d.src='images/#section#_#arrayImageNumbers[1]#_d.jpg';" onMouseOut="document.image_a.src='images/#section#_#arrayImageNumbers[1]#_a.jpg';document.image_d.src='images/#section#_#arrayImageNumbers[4]#_d.jpg';">
    		<IMG STYLE="position:absolute; TOP:450px; LEFT:278px; WIDTH: 66px; HEIGHT: 66px" SRC="images/#section#_#arrayImageNumbers[5]#_a.jpg" NAME="image_e" onMouseOver="document.image_a.src='images/#section#_#arrayImageNumbers[5]#_a.jpg';document.image_e.src='images/#section#_#arrayImageNumbers[1]#_e.jpg';" onMouseOut="document.image_a.src='images/#section#_#arrayImageNumbers[1]#_a.jpg';document.image_e.src='images/#section#_#arrayImageNumbers[5]#_e.jpg';">
    		<IMG STYLE="position:absolute; TOP:516px; LEFT:278px; WIDTH: 40px; HEIGHT: 40px" SRC="images/#section#_#arrayImageNumbers[6]#_a.jpg" NAME="image_f" onMouseOver="document.image_a.src='images/#section#_#arrayImageNumbers[6]#_a.jpg';document.image_f.src='images/#section#_#arrayImageNumbers[1]#_f.jpg';" onMouseOut="document.image_a.src='images/#section#_#arrayImageNumbers[1]#_a.jpg';document.image_f.src='images/#section#_#arrayImageNumbers[6]#_f.jpg';">
    		<IMG STYLE="position:absolute; TOP:516px; LEFT:318px; WIDTH: 26px; HEIGHT: 26px" SRC="images/#section#_#arrayImageNumbers[7]#_a.jpg" NAME="image_g" onMouseOver="document.image_a.src='images/#section#_#arrayImageNumbers[7]#_a.jpg';document.image_g.src='images/#section#_#arrayImageNumbers[1]#_g.jpg';" onMouseOut="document.image_a.src='images/#section#_#arrayImageNumbers[1]#_a.jpg';document.image_g.src='images/#section#_#arrayImageNumbers[7]#_g.jpg';">
    		<IMG STYLE="position:absolute; TOP:542px; LEFT:318px; WIDTH: 14px; HEIGHT: 14px" SRC="images/#section#_#arrayImageNumbers[8]#_a.jpg" NAME="image_h" onMouseOver="document.image_a.src='images/#section#_#arrayImageNumbers[8]#_a.jpg';document.image_h.src='images/#section#_#arrayImageNumbers[1]#_h.jpg';" onMouseOut="document.image_a.src='images/#section#_#arrayImageNumbers[1]#_a.jpg';document.image_h.src='images/#section#_#arrayImageNumbers[8]#_h.jpg';">
    		<!--- tiny image in centre for contact info --->
    		<IMG STYLE="position:absolute; TOP:542px; LEFT:332px; WIDTH: 12px; HEIGHT: 14px" SRC="images/allt_beag_tiny.jpg" NAME="image_i" ALT="information" onMouseOver="document.image_a.src='images/allt_beag_main.jpg';document.image_i.src='images/allt_beag_tiny.jpg';" onMouseOut="document.image_a.src='images/#section#_#arrayImageNumbers[1]#_a.jpg';document.image_i.src='images/allt_beag_tiny.jpg';">
    	</div>
    </div>
    </cfoutput>
    

    Although written in ColdFusion this logic could easily be adapted to PHP or many other programming languages. A simple macro for Adobe Photoshop was used to resize square images into the many different pixel dimensions used to fill the image matrix.

    Allt Beag was eventually sold in late 2009 and, while the house still stands, it seems to have changed a lot recently. Another dwelling has been built in the gardens and a new conservatory put up.

    Whether the old place is available for holiday lets any more is unknown but Tighnabruaich is a beautiful place to visit.

    Get there if you can…

  • Tyres

    Tyres

    , ,

    The Tyres website is another example of a ‘what might have been‘ concept.

    The intention, never fully developed in 2008, was to build a B2C website selling car tyres. Behind the scenes, after inputting a tyre size (e.g., 1955517V) the site found prices from a number of suppliers and selected the best value products.

    The website was left unfinished but illustrates the power of the web to ‘disintermediate’ certain transactions. Theoretically, many consumers could have searched for tyres on a website back-ended to a handful of major tyre manufacturers and distributors.

    If that sounds a lot like BlackCircles, founded earlier in 2001, it was.

    And Blackcircles.com was acquired by Michelin for £50 million in 2015!

    C’est la vie!

  • Ascog Farm

    Ascog Farm

    , ,

    Adrian’s family own Ascog Farm on the Isle of Bute, Scotland. The farm is one of very few that is not owned by the Mount Stuart Trust, the ‘Bute Estate’ which describes itself as ‘the custodian of 87% of the Isle of Bute.’

    At Ascog Farm, a particularly windy spot close to the Eastern coast of the Isle of Bute, Adrian and his family attempted to develop a renewable wind energy generating scheme consisting of three Enercon E48 wind turbines.

    The project was designed to offer a much higher level of community pay-out than is normal. Adrian also told the local councillors that he welcomed community ownership of two out of the three proposed turbines if the funds could be raised (approximately £ million/turbine) to pay for their installation.

    A great deal of geographical research went into the Environmental Impact Assessment into the scheme, some conducted by Adrian and yet more by SAC Consulting, the consultancy arm of the Scottish Agricultural College, now part of Scotland’s Rural College (SRUC).

    Despite all this detailed work some predictable hostility to the scheme, whipped up locally, and a far from imaginative Landscape Wind Energy Capacity Study (LWECS) conducted by Argyll & Bute Council more or less doomed the prospect of gaining planning consent, even before the plans had been submitted.

    Sure enough, the application for wind turbines at Ascog Farm was rejected at planning and at appeal, solely on the basis of views.

    Adrian has produced a set of slides covering the whole project, these are shown below.

    Adrian presented the slides at Portsmouth’s Pint of Science festival in May 2017 and has since incorporated this knowledge into his teaching, notably on The Green Economy course he designed and delivered at the University of Portsmouth.

    Needless to say, since the planning application was refused, global CO2 emissions have continued to rise and no meaningful green energy has been developed on the Isle of Bute.

    Interestingly, other communities in Scotland that did bite the bullet and build wind turbines themselves have done rather well out of it!

    Perhaps there is hope yet…

  • HomeHunter

    HomeHunter

    , , ,

    Allegran Advertising Limited was spun out of Allegran Limited in February 2005. The new company was designed to explore non-core business and one of the first concepts to emerge from this development was HomeHunter, soon rechristened QpHomes. Adrian was always rather keep on the HomeHunter concept and created most of the database architecture and programming logic, allowing users to self-describe their property for sale, adding rooms, measurements and photographs as they went.

    QpHomes amassed over 12,000 property listings between April 2004 and March 2006, when the operating company name was changed to Vivid Medianet Limited. However, despite interest from some major companies (including Tesco) in this space, the legal position of self-listed property advertisements was always somewhat unclear. Listings sites could have been treated as estate agents, necessitating the checking of all user-generated content for accuracy.

    Clearly, this was not feasible and not until 2012 did government propose to allow private sale ads by amending the Estate Agents Act and repealing the Property Misdescriptions Act. All this, of course, came too late for QpHomes which closed its doors in 2006. Tesco abandoned its Property Market in 2008 and sold the business to Spicerhaart.

    Vivid Medianet Limited was renamed GoCarbonFree Limited in March 2007 and focused on the new GoCarbonFree website, a B2C points collection site which aimed to buy and ‘retire’ carbon credits through commissions on user’s shopping interactions.

    Unfortunately, like QpHomes, this concept would also eventually be filed under the What might have been category.

  • UK General Election – 2001

    UK General Election – 2001

    , ,

    The 2001 United Kingdom General Election was held on Thursday 7 June 2001.

    Having produced a ground-breaking website for the 1997 UK General Election, Adrian and his colleagues were keen to repeat the exercise for 2001. Some of the data from 1997 could be re-used in the 2001 website, e.g., to calculate swings, while a complete re-design featured new navigation (without frames), new maps, much more data and expanded expert commentary from Dr Robert Waller and Dr Byron Criddle, co-authors of The Almanac of British Politics.

    Work on the project was in hand before Adrian and his business partner left Business Geographics Limited in late 2000 to co-found Lead Hat Limited, a full service Internet development agency. Their departure did not go particularly smoothly and, for some time, it looked as if the possibility of publishing a 2001 Election website under the Lead Hat brand, or at all, was in doubt.

    Happily, however, several of the ‘cease and desist’ letters that were issued at the time failed to escalate, and Adrian started working alongside several former freelance programming colleagues from Albedo Systems Limited, plus new data partners CACI Limited (for geodemographics and income profiles) and the Automobile Association Limited (for base maps).

    A media partnership, following discussions with several interested parties, was again announced with Telegraph Group Limited, publishers of The Daily Telegraph newspaper. This arrangement provided some funding and, crucially, integrated the team’s maps and data with the Telegraph’s online press coverage.

    The Election 2001 website was notable for a few innovations, mostly hidden behind the scenes:

    • Database-driven pages featuring maps, data, text and graphs were published from a custom-built Content Management System (CMS), written in ColdFusion over a Microsoft SQL Server 2000 database, to static (.htm) HTML files.
    • These static HTML files, together with image files, several ColdFusion (.cfm) files required for search and all the other ephemera needed for the website, were copied by the CMS to a staging server. A full run to update and replace all files took ca. 45 minutes.
    • The CMS also offered mechanisms for Robert Waller and Byron Criddle to upload or update their constituency and candidate profiles remotely, and for Telegraph journalists to add links to constituency pages or body copy.
    • On Election night a small army of Telegraph staff watched the television and the wires and updated the results as they came in. Updated pages with results were deployed to the live webservers, once again as static HTML files.

    The site ran on a small fleet of load-balanced Windows NT webservers running Microsoft’s IIS (Internet Information Services) in a co-located Level 3 hosting centre in the old Gordon’s Gin factory on Goswell Road, London.

    The Election 2001 website still looks fresh today and compares favourably, particularly for constituency-based navigation, against the BBC’s much better funded output from the same event.

    The CMS system worked very well, and the publication to static HTML completely eliminated frustrating problems encountered earlier running a high usage site with many database queries (not enough of which were cached, probably) straight from ColdFusion, which had just been re-released as a somewhat flaky Java-based server that didn’t play all that well with Microsoft Windows NT.

    Getting this old site going again has been a journey in its own right, requiring a mix of database, computing infrastructure, coding and expert knowledge acquired back then but updated for the Cloud and open-source era.

    If you’re looking at doing something similar the advice below may be of some use, or perhaps some consultancy might help?

    How to restore a SQL Server 2000 backup to SQL Server 2025

    Fortunately, Adrian had taken a backup of the 2001 Election website. Unfortunately, this backup was made using an ancient version of the Relational Database Management Software (RDBMS) Microsoft SQL Server 2000. The backup (.bak) files would not restore on SQL Server 2025.

    Following some instructions found online, Adrian span up a copy of Windows Server 2012 R2 (still downloadable from Microsoft) as a virtual machine in VirtualBox. A search revealed a link for Microsoft SQL Server 2008 R2 Express with Service Pack 2 and this software was downloaded and installed on the VM.

    SQL Server 2008 R2 Express would restore the SQL Server 2000 database. It was then necessary to issue some Structured Query Language (SQL) and/or Transact-SQL queries:

    SELECT
      name,
      compatibility_level
    FROM sys.databases;

    This query returned the compatibility_level for the restored databases; 80 for backups created by SQL Server 2000 and restored to SQL Server 2008. The full list of compatibility levels is available on the Microsoft website.

    The following statement was used to update the compatibility_level for the old, restored, database.

    ALTER DATABASE "[DB_NAME]" SET COMPATIBILITY_LEVEL = 100;

    The first query was re-run to check this had worked, which it had, and the database was then backed up in the normal way from Microsoft SQL Server Management Studio (the version bundled in the Microsoft SQL Server 2008 R2 Express with Service Pack 2 link above).

    Having not used Microsoft SQL Server in years the next stage was the most amazing…

    How to install SQL Server 2025 on Ubuntu Linux

    Amazingly, to a veteran user of Windows NT and allied server technologies, Microsoft’s latest SQL Server 2025 runs on Ubuntu Linux.

    The installation instructions are detailed and easy enough to follow and, so long as you’re running a VM with at least 2GB RAM, Microsoft’s RDBMS software will install. Adrian created an Amazon AWS Lightsail instance running Ubuntu 22.04 but he could have used a VM on AWS, Azure or GCP as the host for his SQL Server 2025 database.

    Running the following query in SQL Server Management Studio 21 connected to the server (with appropriate firewall rules etc.):

    select @@version;

    Returned:

    Microsoft SQL Server 2025 (CTP2.1) - 17.0.800.3 (X64) 
    	Jun 12 2025 14:47:57 
    	Copyright (C) 2025 Microsoft Corporation
    	Express Edition (64-bit) on Linux (Ubuntu 22.04.5 LTS) <X64>

    The compatibility_level=100 backup file could now be SFTP’d up to the Cloud Ubuntu Linux VM (to /tmp, not forgetting to chown root:root [backupfile.bak]) having hopped from SQL Server 2000 to 2008. The backups, taken in 2001, could now be successfully restored via SQL Server Management Studio on the Ubuntu RDBMS box.

    So, a Microsoft (Windows) SQL Server database structured and populated in 2000/2001 could be used in 2025 on a Cloud-based Linux server running Microsoft SQL Server 2025. Amazing…

    How to install and run Lucee CFML server

    ColdFusion was initially released by Allaire, later taken over by Macromedia and later still subsumed by Adobe. While you can still buy a ColdFusion licence from Adobe there is a free, open source alternative: Lucee.

    The Lucee CFML server and extensions may be downloaded for Linux, Windows, as a WAR file for a Java servlet or in several other flavours. Adrian chose the Linux (x64) Installer version for use on another Ubuntu Amazon AWS Lightsail instance.

    cd
    
    wget https://cdn.lucee.org/lucee-6.2.1.122-linux-x64-installer.run
    
    sudo chmod +x lucee-6.2.1.122-linux-x64-installer.run
    
    sudo ./lucee-6.2.1.122-linux-x64-installer.run

    The installation runs smoothly enough in a text-based SSH environment and, upon visiting your installation in a browser at http://[your_public_ip_address]:8888/ you should be greeted by the words ‘You are now successfully running Lucee 6.2.1.122 on your system!’ If not:

    • Make sure you have assigned a public IP address to your Lightsail instance or EC2 VM etc.
    • Make sure you have opened port 8888 in the Lightsail (or EC2 etc.) firewall but restrict access to your own client IP.

    The package installed Tomcat Version: 11.0.6 and Java: 21.0.7+6-LTS on an Ubuntu 22.04.5 LTS VM running Apache2. Once the installation process is complete your public IP address should have a Lucee admin server at:

    http://[your_public_ip_address]:8888/lucee/admin/index.cfm

    In addition to firewall rules Adrian chose to further secure his Lucee installation by enabling Captcha but received the message ‘Fontconfig head is null, check your fonts or fonts configuration’.

    A quick search revealed a possible solution to the problem, while a second search showed that font ttf-dejavu had been renamed necessitating the following command.

    sudo apt-get install fontconfig fonts-dejavu fonts-liberation

    After a restart of the computer (sudo shutdown -r now) the Lucee admin page has Captcha and all is reasonably secure.

    How to set permissions for /var/www

    The directories and files off /var/www on a Linux webserver should have appropriate permissions for (Apache2) access and (external) security.

    Every time Adrian has looked for the answer to this question he has found competing, and sometimes incorrect, advice.

    For a machine (e.g., an EC2 or Lightsail VM) where ubuntu is the sudo user (use getent group sudo to list the sudo users) and www-data is the Apache2 webserver group his preferred solution, based on some research, is:

    sudo chown -R ubuntu:www-data /var/www
    sudo find /var/www -type d -exec chmod 2750 {} +
    sudo find /var/www -type f -exec chmod 640 {} +

    These commands can be saved in a shell script (e.g., fix_perms.sh in /var/www) containing the lines:

    #!/bin/bash
    sudo chown -R ubuntu:www-data /var/www
    sudo find /var/www -type d -exec chmod 2750 {} \+
    sudo find /var/www -type f -exec chmod 640 {} \+
    # make this file executable again!
    sudo chmod +x fix_perms.sh

    Whenever files have been uploaded to the webserver (perhaps from a machine with a different sudo account or webserver group) permissions can easily be set up correctly using the commands:

    cd /var/www
    sudo ./fix_perms.sh

    This approach has saved a lot of scrabbling around for solutions to the octal permissions problem, hardly any two of which are the same.

    How to set up Apache2 for case insensitivity

    Many of the old websites Adrian and his colleagues developed were built on Microsoft Windows NT running the IIS webserver.

    While NTFS, the file system used by Windows NT and its successors, is technically case-sensitive, Windows applications generally treat file names as case-insensitive by default. IIS would serve index.cfm, Index.cfm or INDEX.CFM regardless of the filename.

    The Linux operating system, and Apache2 webserver, are case sensitive, so the HTML <a href="myfile.htm">click here</a> would fail if the link to myfile.htm was actually MyFile.htm on the filesystem.

    Thankfully, help is at hand when migrating ancient case-insensitive websites developed under Windows to Linux…

    Carefully noticing the spelling of speling:

    sudo a2enmod speling
    sudo systemctl restart apache2

    Then, in the .conf file of the website in question (in /etc/apache2/sites-available on Ubuntu Linux) be sure to include (watching out for the spelling of mod_speling) the highlighted text.

    <VirtualHost *:80>
            DocumentRoot "/var/www/election2001/htdocs"
            ServerName election2001.adriantear.com
            DirectoryIndex index.cfm
            # Other directives here
            <IfModule mod_speling.c>
                    CheckSpelling On
                    CheckCaseOnly On
            </IfModule>
    </VirtualHost>

    All the incorrectly-cased links to files or files that were incorrectly-cased now become irrelevant and your ancient website should operate, largely, as originally intended.

    How to enable image mapping in Apache2

    The 1997 Election and 2001 Election websites made extensive use of HTML image maps to provide a reasonable interface to geographical data a long time before the invention of interactive, tile-server based systems like ArcGIS Online or GeoServer.

    Enabling image mapping in Apache2 requires a few steps:

    sudo a2enmod imagemap
    sudo systemctl restart apache2

    A website with image mapping functionality, and that also has casing problems in filenames or links as above, should therefore incorporate the AddHandler imap-file map clause as per the highlighted .conf file below:

    <VirtualHost *:80>
            DocumentRoot "/var/www/election2001/htdocs"
            ServerName election2001.adriantear.com
            DirectoryIndex index.cfm
            # Other directives here
            AddHandler imap-file map
            <IfModule mod_speling.c>
                    CheckSpelling On
                    CheckCaseOnly On
            </IfModule>
    </VirtualHost>

    All of this server setup, database and webserver configuration work can be enjoyed at the restored 2001 UK General Election website…

    Give the old site a visit and think about some of the steps involved in getting it working properly again.

    Thank goodness for Web ARChive (WARC)files that can store content from websites regardless of server set up, so long as the sites are working at the time and the crawling is thoroughly comprehensive.

    As many a search on the Wayback Machine shows that is, however, unfortunately, not always the case

  • UK General Election – 1997

    UK General Election – 1997

    , ,

    The URL election.co.uk was used for Business Geographics’ coverage of the UK General Election in 1997.

    Built by a core team of just a handful of people our coverage of events, angled substantially towards an explicitly geographical perspective, garnered millions of hits. The website featured:

    • Clickable image maps from UK to constituency levels.
    • Town to constituency search facilities.
    • Interactive zoomable maps with the MapGuide plugin.
    • Maps in Virtual Reality Markup Language format.
    • Geographical organisation of content, e.g., by counties.

    Adrian wrote about the design of the website for the Association of Geographic Information 1997 Conference, at which it won a prize for Technological Progress.

    Later, others (Mahoney & McLaren, 1999) commented on the relevance of the site as part of the use of spatial data to enhance the democratic process.

    The Election 1997 website was highly influential, effectively setting the pattern for most major online coverage of elections throughout the world!

    The contributing team had another crack of the whip for Blair’s re-election contest in the UK General Election of 2001. By this time most, including Adrian, had left Business Geographics to form Lead Hat Limited but the [geo]electoral news formula continued to carry over.

  • Ascog Farm

    Ascog Farm

    Ascog Farm on the Isle of Bute, Scotland, is run as a partnership between Adrian and his wife, Elspeth. Day to day the farm is managed by Elspeth’s father, Joe, a sturdy veteran farmer.

    A lot of effort has gone into improving the land and buildings at Ascog Farm.

    Attempting to harness the average 8m/sec windspeeds, an application for wind turbines at the farm was lodged in 2013.

    The whole process was somewhat fraught, failed at planning, and has been detailed at length on Adrian’s Ascog Farm website.

    The family now concentrate on sheep-farming operations, including the production of excellent undyed wool and woollen garments.

    Earlier, cattle and sheep farming at Ascog led to the partial development of the database-driven HerdManager website, an application that probably could have grown much bigger with more time invested in it.

    Further details of the Ascog Farm and HerdManager websites are given below.

    • Ascog Farm

      Ascog Farm

      Adrian’s family own Ascog Farm on the Isle of Bute, Scotland. The farm is one of very few that is not owned by the Mount Stuart Trust, the ‘Bute Estate’ which describes itself as ‘the custodian of 87% of the Isle of Bute.’ At Ascog Farm, a particularly windy spot close to the Eastern coast…


    • HerdManager

      HerdManager

      Not the prettiest of sites, and more of a ‘what might have been‘ than anything else, HerdManager was partially developed as a demonstration of the sort of data management that is possible with a ColdFusion-based site, a database and a whole lot of Structured Query Language (SQL) statements. The functionality to add new records to…


    Ascog Farm now uses Agriwebb for flock management, in many ways a competing product to our earlier self-built efforts.

    Agriwebb raised $14 million in Series A funding so perhaps we should have put more time in to HerdManager!

    The farm itself is unlikely ever to make millions but is a beautiful place to spend time, especially if the weather is kind…