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

<channel>
	<title>David Currie</title>
	<atom:link href="https://david.currie.name/feed" rel="self" type="application/rss+xml" />
	<link>https://david.currie.name</link>
	<description>on work and play</description>
	<lastBuildDate>Wed, 07 Jan 2026 11:14:15 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://i0.wp.com/david.currie.name/wp-content/uploads/2025/05/android-chrome-512x512-1.png?fit=32%2C32&#038;ssl=1</url>
	<title>David Currie</title>
	<link>https://david.currie.name</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">99453961</site>	<item>
		<title>Hampshire Cross Country Champs 2026</title>
		<link>https://david.currie.name/archives/2026/01/04/hampshire-cross-country-champs-2026?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=hampshire-cross-country-champs-2026</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Sun, 04 Jan 2026 11:13:01 +0000</pubDate>
				<category><![CDATA[Running]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3514</guid>

					<description><![CDATA[I wasn&#8217;t entirely sure whether I was going to make this year&#8217;s Hampshire Cross Country Champs. Illness had been circulating around the house over Christmas, and I woke in the middle of the night with my nose streaming. Remarkably, it had cleared by the morning. It was pretty perfect racing conditions: cold enough that the [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="alignleft size-large is-resized"><img data-recalc-dims="1" fetchpriority="high" decoding="async" width="682" height="1024" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2026/01/Dad-CC-14.jpg?resize=682%2C1024&#038;ssl=1" alt="" class="wp-image-3515" style="aspect-ratio:0.6660359508041628;width:110px;height:auto" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2026/01/Dad-CC-14-scaled.jpg?resize=682%2C1024&amp;ssl=1 682w, https://i0.wp.com/david.currie.name/wp-content/uploads/2026/01/Dad-CC-14-scaled.jpg?resize=200%2C300&amp;ssl=1 200w, https://i0.wp.com/david.currie.name/wp-content/uploads/2026/01/Dad-CC-14-scaled.jpg?resize=100%2C150&amp;ssl=1 100w, https://i0.wp.com/david.currie.name/wp-content/uploads/2026/01/Dad-CC-14-scaled.jpg?resize=768%2C1153&amp;ssl=1 768w, https://i0.wp.com/david.currie.name/wp-content/uploads/2026/01/Dad-CC-14-scaled.jpg?resize=1024%2C1536&amp;ssl=1 1024w, https://i0.wp.com/david.currie.name/wp-content/uploads/2026/01/Dad-CC-14-scaled.jpg?resize=1365%2C2048&amp;ssl=1 1365w, https://i0.wp.com/david.currie.name/wp-content/uploads/2026/01/Dad-CC-14-scaled.jpg?w=1706&amp;ssl=1 1706w" sizes="(max-width: 682px) 100vw, 682px" /></figure>
</div>


<p>I wasn&#8217;t entirely sure whether I was going to make this year&#8217;s Hampshire Cross Country Champs. Illness had been circulating around the house over Christmas, and I woke in the middle of the night with my nose streaming. Remarkably, it had cleared by the morning. It was pretty perfect racing conditions: cold enough that the ground remained firm, but not so cold that it lacked a bit of give. Duncan even warmed up our shared spikes for me in the U17 race!</p>



<p>It&#8217;s four and a bit laps of the grounds of Fairthorne Manor for the senior race. I took it fairly cautiously over the first two. The plan was to pick up the pace in the third, but I was wary of peaking too soon. It was only on the final lap that I began to overtake other runners. I should have pushed harder, as I&#8217;m no good at sprint finishes (the picture above, sadly, shows me being overtaken on the run-in).</p>



<p>I was the first Eastleigh runner home, and my <a href="https://meets.rosterathletics.com/public/competitions/details/results?id=27722&amp;meId=334527">time and position</a> were both better than last year. With a significant birthday later in 2026, I&#8217;m somewhat motivated to be just a second behind third place in what would be my new age category (though not the runner who overtook me!).</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3514</post-id>	</item>
		<item>
		<title>In Control at Alice Holt</title>
		<link>https://david.currie.name/archives/2026/01/02/in-control-at-alice-holt?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=in-control-at-alice-holt</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Fri, 02 Jan 2026 09:08:04 +0000</pubDate>
				<category><![CDATA[Orienteering]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3507</guid>

					<description><![CDATA[I qualified as a Level C orienteering controller in mid-2024, but with club Chair duties taking up much of my spare capacity, it never seemed like the right time to say yes to controlling an event. That said, Southern Navigators approached me in mid-November seeking a controller for their event at Alice Holt at the [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full is-resized"><img data-recalc-dims="1" decoding="async" width="799" height="533" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2026/01/55014142421_c51aea23ef_c.jpg?resize=799%2C533&#038;ssl=1" alt="" class="wp-image-3508" style="aspect-ratio:1.4991688076167446;width:840px;height:auto" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2026/01/55014142421_c51aea23ef_c.jpg?w=799&amp;ssl=1 799w, https://i0.wp.com/david.currie.name/wp-content/uploads/2026/01/55014142421_c51aea23ef_c.jpg?resize=300%2C200&amp;ssl=1 300w, https://i0.wp.com/david.currie.name/wp-content/uploads/2026/01/55014142421_c51aea23ef_c.jpg?resize=150%2C100&amp;ssl=1 150w, https://i0.wp.com/david.currie.name/wp-content/uploads/2026/01/55014142421_c51aea23ef_c.jpg?resize=768%2C512&amp;ssl=1 768w" sizes="(max-width: 799px) 100vw, 799px" /></figure>



<p>I qualified as a Level C orienteering controller in mid-2024, but with club Chair duties taking up much of my spare capacity, it never seemed like the right time to say yes to controlling an event. That said, Southern Navigators approached me in mid-November seeking a controller for their event at Alice Holt at the end of December. With the maps having to go to the printers before Christmas, the limited runway meant there was only so much of my time it could consume, and I eventually agreed to take it on.</p>



<span id="more-3507"></span>



<p>I had to confess to having never run at Alice Holt, not least because the map has historically been very green! The planner indicated that the forest was maturing in places and that the courses would avoid the worst of the grot. In the end, that meant we couldn&#8217;t fit a Brown course in, but SCOA was remarkably pragmatic about agreeing that we could have a Short Brown and still count it towards the league.</p>



<p>There was only time for a single site visit, which was not ideal, particularly as it rained the whole time I was there. Dave was very gracious in taking on board my feedback on the courses, though there were undoubtedly compromises given the inability to make significant changes in the time available.</p>



<p>On the day of the event, the temperature was only just above zero when I set out to check the controls that had been put out the day before. The forecast was for sunshine, and as I tailed the hangers around the remaining controls, it soon warmed up. I met one of the hangers as he was pondering the location of a control. We eventually agreed to move it ~10m to the end of another ditch. It later transpired that this was Steve, the mapper, who then showed me the LiDAR data, which indicated the tape had been in the right place, but there was an unmapped ditch the competitors would reach first. I doubt anyone noticed.</p>


<div class="wp-block-image">
<figure class="alignleft size-full is-resized"><img data-recalc-dims="1" decoding="async" width="533" height="799" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2026/01/55014452375_efc8f0a93e_c.jpg?resize=533%2C799&#038;ssl=1" alt="" class="wp-image-3509" style="width:138px;height:auto" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2026/01/55014452375_efc8f0a93e_c.jpg?w=533&amp;ssl=1 533w, https://i0.wp.com/david.currie.name/wp-content/uploads/2026/01/55014452375_efc8f0a93e_c.jpg?resize=200%2C300&amp;ssl=1 200w, https://i0.wp.com/david.currie.name/wp-content/uploads/2026/01/55014452375_efc8f0a93e_c.jpg?resize=100%2C150&amp;ssl=1 100w" sizes="(max-width: 533px) 100vw, 533px" /></figure>
</div>


<p>With all the controls checked, there was nothing for me to do but stand around in the sunshine and take <a href="https://www.flickr.com/photos/currie/albums/72177720331214324">photos</a>. With the fine weather drawing the public out en masse, the day&#8217;s biggest drama turned out to be parking. Looking at the <a href="https://www.southernnavigators.com/?p=events/alice-holt-2025-12-30">results</a>, my main regret is the number of Short Brown competitors disqualified for punching the Blue control halfway along the leg to number six. While competitors need to take responsibility for checking their descriptions (they were different features with distinct codes), the aim should not be to catch them out.</p>



<p>Thanks to Dave, Mel, and the rest of the SN volunteers for making the process so enjoyable.</p>



<p></p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3507</post-id>	</item>
		<item>
		<title>Run the Pubs (20th Anniversary Edition)</title>
		<link>https://david.currie.name/archives/2025/12/23/run-the-pubs-20th-anniversary-edition?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=run-the-pubs-20th-anniversary-edition</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Tue, 23 Dec 2025 16:40:37 +0000</pubDate>
				<category><![CDATA[Orienteering]]></category>
		<category><![CDATA[Running]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3476</guid>

					<description><![CDATA[It&#8217;s 20 years since the first Run the Pubs took place. Looking at the photo from that first run, I could have worn the same outfit if I&#8217;d realised it was a significant anniversary, as both the shorts and top are still in my running wardrobe. Congratulations to Andy H for being the only other [&#8230;]]]></description>
			

							<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="560" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/12/run-the-pubs-2025.jpg?resize=1024%2C560&#038;ssl=1" alt="" class="wp-image-3478" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/12/run-the-pubs-2025-scaled.jpg?resize=1024%2C560&amp;ssl=1 1024w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/12/run-the-pubs-2025-scaled.jpg?resize=300%2C164&amp;ssl=1 300w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/12/run-the-pubs-2025-scaled.jpg?resize=150%2C82&amp;ssl=1 150w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/12/run-the-pubs-2025-scaled.jpg?resize=768%2C420&amp;ssl=1 768w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/12/run-the-pubs-2025-scaled.jpg?resize=1536%2C840&amp;ssl=1 1536w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/12/run-the-pubs-2025-scaled.jpg?resize=2048%2C1120&amp;ssl=1 2048w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p>It&#8217;s 20 years since <a href="/archives/2005/12/18/run-the-pubs">the first</a> Run the Pubs took place. Looking at the photo from that first run, I could have worn the same outfit if I&#8217;d realised it was a significant anniversary, as both the shorts and top are still in my running wardrobe. Congratulations to Andy H for being the only other one of those original five runners to make it out again (though as a teenager, Martin was on drinks duty for that first run).</p>



<p>It was a pretty murky start as we set off from Nomansland, but thankfully, the forecast rain never arrived. There was plenty of opportunity for getting wet and muddy from underfoot, though. While visiting only two pubs, we managed nearly 20km this year and, most importantly, didn&#8217;t get lost! Thanks to Andy A for all of the cat herding!</p>




        <div id="map_ol3js_1"
       class="osm-map-container undefined"
             data-map_name="undefined"
             data-map="map_ol3js_1"
             data-autoshow="no"
             style="width:100%;
                    max-width:100%;
                    height:450px;
                    display:block;
                    overflow:hidden;
                    border:2px solid grey;">
          <div id="map_ol3js_1_popup" class="ol-popup">
            <a href="#" id="map_ol3js_1_popup-closer" class="ol-popup-closer"></a>
            <div id="map_ol3js_1_popup-content"></div>
          </div>
        </div>
    

				<script type="text/javascript">
          translations['openlayer'] = "open layer";
          translations['openlayerAtStartup'] = "open layer at startup";
          translations['generateLink'] = "link to this map with opened layers";
          translations['shortDescription'] = "short description";
          translations['generatedShortCode'] = "to get a text control link paste this code in your wordpress editor";
          translations['closeLayer'] = "close layer";
          translations['cantGenerateLink'] = "put this string in the existing map short code to control this map";
			  </script>


			  <script type="text/javascript">
			  vectorM['map_ol3js_1'] = [];
	        
        var raster = getTileLayer("osm","NoKey");			

			  var map_ol3js_1 = new ol.Map({
				interactions: ol.interaction.defaults.defaults({mouseWheelZoom:false}),
				layers: [raster],
				target: "map_ol3js_1",
				view: new ol.View({
				  center: ol.proj.transform([6.378,58.213], "EPSG:4326", "EPSG:3857"),
				  zoom: 9
				})
			  });
			  
    var style_map_ol3js_1_0 = {
      "Point": [new ol.style.Style({

          image: new ol.style.Icon({
            anchor: [0.5, 41],
            anchorXUnits: "fraction",
            anchorYUnits: "pixels",
            opacity: 0.75,
            src: "https://david.currie.name/wp-content/plugins/osm/icons/mic_blue_pinother_02.png"
          })
      })],

      "LineString": [new ol.style.Style({
        stroke: new ol.style.Stroke({
          color: "none",
          width: 8
        })
      })],
      "MultiLineString": [new ol.style.Style({
        stroke: new ol.style.Stroke({
          color: "none",
          width: 4
        })
      })]
    };
		  var vectorL0 = new ol.layer.Vector({
				source: new ol.source.Vector({
				url:"/wp-content/uploads/2025/12/Run_the_Pubs_2025.gpx",
				format: new ol.format.GPX({
					extractStyles: false
				})
			}),
			zIndex: 92,
			style: function(feature, resolution) {return style_map_ol3js_1_0[feature.getGeometry().getType()];}
		  });
		  map_ol3js_1.addLayer(vectorL0);
      var extension1 = ol.extent.createEmpty();
      var curZoom1 = map_ol3js_1.getView().getZoom();

      map_ol3js_1.getLayers().forEach(function(layer){
         if(!layer.get("id")) {     
            layer.once("change", function(e){
               ol.extent.extend(extension1, (layer.getSource().getExtent()));
               map_ol3js_1.getView().fit(extension1, {padding: [50, 50, 50, 50]});
            });
         }
      });

    
addControls2Map(map_ol3js_1,0,0,3,0,5,6,7,0,1);
osm_addPopupClickhandler(map_ol3js_1,  "map_ol3js_1"); 
osm_addMouseHover(map_ol3js_1); </script>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3476</post-id>	</item>
		<item>
		<title>Advent of Code 2025</title>
		<link>https://david.currie.name/archives/2025/12/14/advent-of-code-2025?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=advent-of-code-2025</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Sun, 14 Dec 2025 18:07:18 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3455</guid>

					<description><![CDATA[I completed Advent of Code again this year, using Kotlin once more. I’d failed to read the full details on the first day and had to have it pointed out to me that there would only be 12 days this year. There was a massive sigh of relief, not least from the rest of my [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>I completed <a href="https://adventofcode.com/2025">Advent of Code</a> again this year, using Kotlin once more. I’d failed to read the full details on the first day and had to have it pointed out to me that there would only be 12 days this year. There was a massive sigh of relief, not least from the rest of my family!</p>



<p>The first eight days all went very smoothly. I was able to get both parts completed in half an hour or less before starting work in the morning. There was even time to tidy up the code a bit so I could push it to <a href="https://github.com/davidcurrie/advent-of-code-2025">GitHub</a> on the same day.</p>



<p>Everything fell apart a bit for Part 2 on <a href="https://github.com/davidcurrie/advent-of-code-2025/blob/main/src/main/kotlin/day9/Day9.kt">Day 9</a>. I was overly concerned about the scenario where the rectangular areas ran along the edges of the larger shape. In the end, it was sufficient to check whether any edge of the shape intersected the rectangle.</p>



<p><a href="https://github.com/davidcurrie/advent-of-code-2025/blob/main/src/main/kotlin/day10/Day10.kt">Day 10</a> was the first and only day that I had to pull in another dependency. I used <a href="https://www.microsoft.com/en-us/research/project/z3-3/">Microsoft Z3</a> to determine the required button presses given the constraints in Part 2. I wish I could say I hadn’t wasted a lot of time trying alternative solutions first.</p>



<p>On <a href="https://github.com/davidcurrie/advent-of-code-2025/blob/main/src/main/kotlin/day11/Day11.kt">Day 11</a>, I cracked and resorted to using Copilot to help create the solution for Part 2. I had worked out that the minimum state I needed to track was the number of paths containing either of the special devices. It was Copilot’s idea to use a bitmask to store that information efficiently. It also provided the algorithm for the device topology sort, so they didn’t need to be revisited during the search.</p>



<p>Copilot aided again in the solution for Part 2 on the <a href="https://github.com/davidcurrie/advent-of-code-2025/blob/main/src/main/kotlin/day12/Day12.kt">final day</a>, providing most of what you see in <code>canFit</code>. When looking at the solution thread before writing this, I was somewhat dismayed to discover that it wasn’t necessary to attempt to place the presents at all &#8211; just checking whether there was enough space under the tree would have sufficed. My solution runs in around 45 seconds, but I’m now left wondering whether the heuristic used to select the type of present would hold up under a more complex topology.</p>



<p>All in all, I enjoyed this year’s challenges, but I am glad to be able to resume my morning walks before work for the remainder of December!</p>



<p></p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3455</post-id>	</item>
		<item>
		<title>Blood, blood, glorious blood</title>
		<link>https://david.currie.name/archives/2025/11/16/blood-blood-glorious-blood?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=blood-blood-glorious-blood</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Sun, 16 Nov 2025 14:47:26 +0000</pubDate>
				<category><![CDATA[People]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3402</guid>

					<description><![CDATA[I had thought the occasion had gone unmarked, but this week an envelope dropped through the letterbox containing a certificate, pin badge, and shiny new gold card, to mark my 50th blood donation. Part of me wonders why it has taken over 30 years to reach my 50th donation, but there have been plenty of [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="alignright size-medium"><img data-recalc-dims="1" loading="lazy" decoding="async" width="225" height="300" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/11/blood-50.jpg?resize=225%2C300&#038;ssl=1" alt="" class="wp-image-3403" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/11/blood-50.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/11/blood-50.jpg?resize=768%2C1024&amp;ssl=1 768w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/11/blood-50.jpg?resize=113%2C150&amp;ssl=1 113w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/11/blood-50.jpg?resize=1152%2C1536&amp;ssl=1 1152w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/11/blood-50.jpg?w=1200&amp;ssl=1 1200w" sizes="auto, (max-width: 225px) 100vw, 225px" /></figure>
</div>


<p>I had thought the occasion had gone unmarked, but this week an envelope dropped through the letterbox containing a certificate, pin badge, and shiny new gold card, to mark my 50th blood donation. Part of me wonders why it has taken over 30 years to reach my 50th donation, but there have been plenty of gaps where foreign travel, competition, illness, or in one case, a scale and polish, have intervened.</p>



<p>Will I get to 100? Maybe. You can now donate every 12 weeks, and with the Southampton donation centre having relocated to Chandler&#8217;s Ford, I don&#8217;t even have to wait for a local donation session. (I checked: you can&#8217;t donate on Christmas Day, but you can on Boxing Day!) With over twenty years of donation still left in me, that target should be doable.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3402</post-id>	</item>
		<item>
		<title>Eastleigh Remembrance Day Parade</title>
		<link>https://david.currie.name/archives/2025/11/09/eastleigh-remembrance-day-parade?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=eastleigh-remembrance-day-parade</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Sun, 09 Nov 2025 20:01:22 +0000</pubDate>
				<category><![CDATA[Family]]></category>
		<category><![CDATA[Photography]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3392</guid>

					<description><![CDATA[Duncan was once again playing with the 14th Spitfires Scout and Guide Band as part of today&#8217;s Remembrance Day parade in Eastleigh. It did rain at one point, but luckily for the musicians, they were in the bandstand at the time! I was following along, taking more pictures than were really need (now on Flickr). [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="alignleft size-medium"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="200" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/11/remembrance-2025.jpg?resize=300%2C200&#038;ssl=1" alt="" class="wp-image-3393" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/11/remembrance-2025.jpg?resize=300%2C200&amp;ssl=1 300w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/11/remembrance-2025.jpg?resize=150%2C100&amp;ssl=1 150w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/11/remembrance-2025.jpg?resize=768%2C512&amp;ssl=1 768w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/11/remembrance-2025.jpg?w=799&amp;ssl=1 799w" sizes="auto, (max-width: 300px) 100vw, 300px" /></figure>
</div>


<p>Duncan was once again playing with the <a href="https://www.facebook.com/14thSpitfires" data-type="link" data-id="https://www.facebook.com/14thSpitfires">14th Spitfires Scout and Guide Band</a> as part of today&#8217;s Remembrance Day parade in Eastleigh. It did rain at one point, but luckily for the musicians, they were in the bandstand at the time! I was following along, taking more pictures than were really need (now on <a href="https://www.flickr.com/photos/currie/albums/72177720330224719">Flickr</a>). No video this year, I&#8217;m afraid, but they were sounding good.</p>



<p></p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3392</post-id>	</item>
		<item>
		<title>Orienteering with the Martians</title>
		<link>https://david.currie.name/archives/2025/11/08/orienteering-with-the-martians?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=orienteering-with-the-martians</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Sat, 08 Nov 2025 19:32:03 +0000</pubDate>
				<category><![CDATA[Family]]></category>
		<category><![CDATA[Orienteering]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3389</guid>

					<description><![CDATA[Duncan and I went to the SN Saturday Series event at Horsell Common today where, as has now become the norm, he beat me. This was followed by some junior training which mostly involved me soaking up uncharacteristic November sunshine. I had to have the significance of the sandpit adjacent to the start pointed out [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="alignright size-medium"><img data-recalc-dims="1" loading="lazy" decoding="async" width="225" height="300" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/11/horesell-common.jpg?resize=225%2C300&#038;ssl=1" alt="" class="wp-image-3390" style="object-fit:cover" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/11/horesell-common.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/11/horesell-common.jpg?resize=768%2C1024&amp;ssl=1 768w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/11/horesell-common.jpg?resize=113%2C150&amp;ssl=1 113w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/11/horesell-common.jpg?w=1000&amp;ssl=1 1000w" sizes="auto, (max-width: 225px) 100vw, 225px" /></figure>
</div>


<p>Duncan and I went to the SN Saturday Series event at Horsell Common today where, as has now become the norm, he <a href="https://www.southernnavigators.com/results-archive/2025/2025-11-08-horsell-common/index.html">beat me</a>. This was followed by some junior training which mostly involved me soaking up uncharacteristic November sunshine.</p>



<p>I had to have the significance of the sandpit adjacent to the start pointed out to me. Despite having reread it in the past year, I&#8217;d failed to remember that Horsell Common is the setting for the start of H G Wells&#8217; War of the Worlds. The sandpit is the landing site for the first Martian&#8230;</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3389</post-id>	</item>
		<item>
		<title>XML Google Maps to OSM Plugin Migration</title>
		<link>https://david.currie.name/archives/2025/11/02/gpx-to-osm-plugin-migration?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gpx-to-osm-plugin-migration</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Sun, 02 Nov 2025 17:28:35 +0000</pubDate>
				<category><![CDATA[Orienteering]]></category>
		<category><![CDATA[Running]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3372</guid>

					<description><![CDATA[The recent spat between Garmin and Strava reminded me that there was a time when I used to post GPX files on this blog for orienteering events and my more interesting runs. I then used the XML Google Maps plugin to render those GPX files. That plugin failed to survive a PHP upgrade many years [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>The recent <a href="https://www.dcrainmaker.com/2025/10/strava-rolls-out-garmin-attribution-prior-to-deadline.html">spat between Garmin and Strava</a> reminded me that there was a time when I used to post GPX files on this blog for orienteering events and my more interesting runs. I then used the XML Google Maps plugin to render those GPX files. That plugin failed to survive a <a href="https://david.currie.name/archives/2019/09/05/update-time">PHP upgrade</a> many years ago, and the maps were gone. I sensed another opportunity for Copilot&#8230;</p>



<span id="more-3372"></span>



<p>This time, I decided to try Copilot in agent mode using GPT-5 mini. This was my initial prompt:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Create a script that uses the WordPress API to find all the posts on a given blog that contain a link to a file with .gpx suffix. It should then edit those posts to add a shortcode for the OSM plugin that uses the linked file in the file_list. The file needs to use a relative path.</p>



<p>For example, if the post on the site http://david.currie.name contained the link:</p>



<pre class="wp-block-code"><code>&lt;a href="http://david.currie.name/wp-content/uploads/2013/02/20130217-agglestone.gpx">20130217 Agglestone GPX&lt;/a></code></pre>



<p>Then before this paragraph should be added the shortcode:</p>



<pre class="wp-block-code"><code>&#91;osm_map_v3 map_center="autolat,autolon" zoom="autozoom" width="100%" height="450" file_list="../../../../wp-content/uploads/2013/02/20130217-agglestone.gpx" file_color_list="red" file_title="20130217 Agglestone GPX"]</code></pre>



<p>There should be an option to not make the updates, but instead output the updates that would be made (i.e. a dry run).</p>



<p>You may select the programming language to use for the script.</p>
</blockquote>



<p>It decided to use Python, which seemed a reasonable choice. There were only two major issues with the script it generated:</p>



<ol class="wp-block-list">
<li>It added <code>/wp</code> to the base URL twice. It then swallowed the error it got back, and just returned zero posts!</li>



<li>It was trying to update the rendered content rather than the raw content.</li>
</ol>



<p>Both of these it fixed quickly. I also got it to add a preview mode to show the content before and after changes.</p>



<p>The last problem, and the one that took me the longest to resolve, was really of my own creation. The eagle-eyed may have spotted that, in the original prompt, I used <code>http</code> in the URL. That made no difference to the generated code, but it did end up in the README. I then cut and paste that when running the script. The site is set to redirect to <code>https</code>, but everything becomes a GET on the redirect. This meant I was seeing a 200 back on the update POST, but nothing was getting updated!</p>



<p>The final script can be found <a href="https://github.com/davidcurrie/wordpress-gpx2osm">here</a>. As the README states, I&#8217;ve not attempted to tidy anything up, but it did the job for me! 82 posts were updated and their maps resurrected. For example: <a href="/archives/2017/12/17/run-some-pubs-3">Run some Pubs</a>.</p>



<p> </p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3372</post-id>	</item>
		<item>
		<title>MapRun Score Optimal Route Planning</title>
		<link>https://david.currie.name/archives/2025/10/05/maprun-score-optimal-route-planning?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=maprun-score-optimal-route-planning</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Sun, 05 Oct 2025 17:56:49 +0000</pubDate>
				<category><![CDATA[Orienteering]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3205</guid>

					<description><![CDATA[I decided to test out Copilot on another MapRun-related challenge: planning the optimal route for a score event. Our Summer League events are, more often than not, planned using OpenOrienteeringMap. This uses OpenStreetMap data for the base map. The format is usually a 45-minute urban score event, using MapRun&#8217;s ScoreNxx scoring system. The aim was [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>I decided to test out Copilot on another <a href="https://maprunners.weebly.com/">MapRun</a>-related challenge: planning the optimal route for a score event. Our Summer League events are, more often than not, planned using <a href="https://oomap.dna-software.co.uk/">OpenOrienteeringMap</a>. This uses <a href="https://www.openstreetmap.org/">OpenStreetMap</a> data for the base map. The format is usually a 45-minute urban score event, using MapRun&#8217;s ScoreNxx <a href="https://maprunners.weebly.com/scoring-schemes.html">scoring system</a>. The aim was to take the KML file that describes an event, and determine the best route to take to maximise the score. As a constraint, I would specify the maximum distance that the route should cover (i.e., how fast the competitor was expected to run).</p>



<span id="more-3205"></span>



<h3 class="wp-block-heading">Travelling Salesperson</h3>



<p>Having been given Python as the implementation language, Copilot made short work of the first task: extracting the control coordinates from the KML file and converting them into latitude and longitude. When instructed to find the shortest path that included all of the controls, it first used the <a href="https://en.wikipedia.org/wiki/Haversine_formula">Haversine formula</a> to calculate the distance between each pair of controls (taking into account the curvature of the earth). It then called the <a href="https://pypi.org/project/python_tsp/">python-tsp</a> (Travelling Salesperson Problems) package to find the shortest route. </p>



<p>With the number of controls in a typical event being around 30 or so, a dynamic programming algorithm took too long. Simulated annealing (a metaheuristic algorithm) returned in a reasonable length of time. Some judicious weighting was needed to persuade the algorithm to start and finish in the correct places. Copilot wrote more code than it needed, as this library also includes a function for calculating great circle distances.</p>



<h3 class="wp-block-heading">OpenStreetMap Routing</h3>



<p>Of course, we&#8217;re not typically interested in straight-line distance between controls. Copilot correctly identified <a href="https://osmnx.readthedocs.io/en/stable/">OSMnx</a> as the go-to library here. It will download a section of the OpenStreetMap network data. Copilot initially just wanted to base this on the midpoint of the coordinates and some arbitrary radius. It was eventually persuaded to use a bounding box containing all of the coordinates. There is then a convenient <code>nearest_nodes</code> function to find the nearest point on the network for any given coordinate. The <code>shortest_path</code> function from the <a href="https://networkx.org/documentation/stable/index.html">NetworkX</a> package was then used to calculate the shortest route between each pair of controls. As before, it used TSP to calculate the optimal route to visit all of the controls.</p>



<p>OSMnx has a convenient <code>plot_graph_routes</code> function that draws the network and one or more routes. This showed up some oddities due to the placement of the controls. The nodes in the OSM network are only where lines terminate, whereas a control might be on a bend in a path halfway between the two ends. I had Copilot switch from using <code>nearest_nodes</code>, to use <code>nearest_edges</code> instead. It would then remove the edge and replace it with two edges that joined at the location of the control. It then took me a while to work out that as edges are directional, I needed to do the same thing for the edge going in the other direction.</p>



<h3 class="wp-block-heading">The Orienteering Problem</h3>



<p>As a planner, this solution could already give some useful insight. Unlike the local night league, we try to ensure that nobody can get easily get all of the controls in the time available. This means even the faster runners have to think about what controls they might leave out. What you really want, though, is for the optimal route to change significantly depending on how far you run, forcing competitors to commit early. Rather than a travelling salesman, we needed a solution to what the academic literature unimaginatively calls &#8220;the orienteering problem&#8221;. It was at this point that Copilot decided to switch to using Google <a href="https://developers.google.com/optimization">OR-Tools</a>.</p>



<p>OR-Tools has a significantly more complicated interface. Copilot took a fair amount of prompting to come up with working code, but got there in the end. The following is an example of the output for one of this year&#8217;s events. Thankfully, the proposed route didn&#8217;t use the M3 motorway that divides the area in two!</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="969" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/10/output.png?resize=1024%2C969&#038;ssl=1" alt="" class="wp-image-3207" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/10/output.png?resize=1024%2C969&amp;ssl=1 1024w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/10/output.png?resize=300%2C284&amp;ssl=1 300w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/10/output.png?resize=150%2C142&amp;ssl=1 150w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/10/output.png?resize=768%2C727&amp;ssl=1 768w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/10/output.png?w=1222&amp;ssl=1 1222w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<h3 class="wp-block-heading">Limitations</h3>



<p>I&#8217;ve placed the final code, such as it is, on <a href="https://github.com/davidcurrie/maprun-router">GitHub</a>. As the README states, there are still some limitations. From an orienteering perspective, the most significant is that the routes always follow linear features, i.e., there are no shortcuts across open areas. In hillier locations, I&#8217;m sure the fact that it doesn&#8217;t account for climb would lead to sub-optimal routes.</p>



<p>From a technical perspective, as I discovered when trying it on another event, there are edges in the OSM network that don&#8217;t have associated lines. The current splitting logic fails when it encounters one of these. I&#8217;m sure that&#8217;s fixable.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3205</post-id>	</item>
		<item>
		<title>Summer Orienteering in Slovenia and Italy</title>
		<link>https://david.currie.name/archives/2025/08/16/summer-orienteering-in-slovenia-and-italy?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=summer-orienteering-in-slovenia-and-italy</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Sat, 16 Aug 2025 13:47:57 +0000</pubDate>
				<category><![CDATA[Family]]></category>
		<category><![CDATA[Orienteering]]></category>
		<category><![CDATA[Travel]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3194</guid>

					<description><![CDATA[We decided to spurn the Scottish 6-Days for our orienteering holiday this year, and instead went south to the OOcup. The event moves around, but this year was taking place on the Slovenia/Italy border. We flew Easyjet to Venice and then hired a car to drive the 200km to Kranjska Gora where we had rented [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="alignleft size-medium"><img data-recalc-dims="1" loading="lazy" decoding="async" width="225" height="300" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/oocup.jpg?resize=225%2C300&#038;ssl=1" alt="" class="wp-image-3195" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/oocup.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/oocup.jpg?resize=113%2C150&amp;ssl=1 113w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/oocup.jpg?w=600&amp;ssl=1 600w" sizes="auto, (max-width: 225px) 100vw, 225px" /></figure>
</div>


<p>We decided to spurn the Scottish 6-Days for our orienteering holiday this year, and instead went south to the <a href="https://oocup.com/">OOcup</a>. The event moves around, but this year was taking place on the Slovenia/Italy border. We flew Easyjet to Venice and then hired a car to drive the 200km to Kranjska Gora where we had rented an apartment. (I now know much more about cross-border hire charges than I ever wanted to. For the record, Enterprise was around £25 for the week.)</p>



<span id="more-3194"></span>



<p>We were straight into the orienteering the next day, with a 45-minute drive in the direction of Ljubljana. The area was a mixture of large karst depressions and then over a steep slope into rock-strewn terrain. I was incredibly slow in the latter, but my biggest mistake was probably missing an absolutely enormous depression! On the way back, we joined the queue of tourists for the famous Lake Bled.</p>



<p>We&#8217;d entered Emma late, and due to transport constraints on the second day (a fleet of minibuses ferrying competitors to the start in convoy), she&#8217;d been unable to get an entry. It was probably a good one to miss, as it rained the whole time I was out. A shame, as the Alpine terrain on the Italian side of the border would have been lovely in the sunshine.</p>


<div class="wp-block-image">
<figure class="alignright size-medium"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="225" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/54816009805_bdeb555713_c.jpg?resize=300%2C225&#038;ssl=1" alt="" class="wp-image-3196" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/54816009805_bdeb555713_c.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/54816009805_bdeb555713_c.jpg?resize=150%2C113&amp;ssl=1 150w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/54816009805_bdeb555713_c.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/54816009805_bdeb555713_c.jpg?w=800&amp;ssl=1 800w" sizes="auto, (max-width: 300px) 100vw, 300px" /></figure>
</div>


<p>The next two days involved getting a bus across the border. On the first, we were grateful for the large, if somewhat crowded marquee, that offered shelter from the rain when we arrived. Thankfully, when we returned the next day, the sun was out again. The area was pretty physical, and I failed to break 10 min/kms on my 6km course (as well as getting stung by a wasp!). On the way back, we stopped at Zelenci, the beauty spot that graced the cover of our Lonely Planet guide.</p>



<p>The last day was, dare I say it, more like the terrain back home. That showed in my result, which was the best of the week: 14th, pulling me up to 25th overall. We then had one more day in Slovenia. Christine and Duncan hired bikes, while I went for a walk. Emma and I then took the free bus to a nearby waterfall.</p>


<div class="wp-block-image">
<figure class="alignleft size-medium"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="225" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/venice.jpg?resize=300%2C225&#038;ssl=1" alt="" class="wp-image-3197" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/venice.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/venice.jpg?resize=150%2C113&amp;ssl=1 150w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/venice.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/venice.jpg?w=800&amp;ssl=1 800w" sizes="auto, (max-width: 300px) 100vw, 300px" /></figure>
</div>


<p>We relocated to Venice for our last day. We left our stuff at the hotel near the airport and then took the bus into the city. Unfortunately, the thunder that had been rumbling around the plain turned into a torrential downpour, and we were soaked by the time the bus arrived. Still, it meant the streets were nowhere near as busy as they might have been! We&#8217;d all dried out sufficiently to enjoy a final dinner beside one of the canals.</p>



<p>The OOCup was a great event, but I&#8217;m not sure we&#8217;ll be following it to Killarney next year, having been on holiday there in 2024. Christine has plans to make the most of Duncan finishing school early after exams to head to Swiss O Week&#8230;</p>



<p>More photos on <a href="https://www.flickr.com/photos/currie/albums/72177720329306731/">Flickr</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3194</post-id>	</item>
		<item>
		<title>MapRun League Results Generator</title>
		<link>https://david.currie.name/archives/2025/08/02/maprun-league-results-generator?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=maprun-league-results-generator</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Sat, 02 Aug 2025 15:22:16 +0000</pubDate>
				<category><![CDATA[Orienteering]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3186</guid>

					<description><![CDATA[Southampton Orienteering Club has what is now an annual MapRun league. A few years ago, I wrote a tool to scrape the results for each event, allocate points (only your first attempt counts, and it must be in a specific time window), and publish some HTML results. For example, those from this year (which I [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Southampton Orienteering Club has what is now an annual <a href="https://maprunners.weebly.com/">MapRun</a> league. A few years ago, I wrote a tool to scrape the results for each event, allocate points (only your first attempt counts, and it must be in a specific time window), and publish some HTML results. For example, those from <a href="https://socweb.org/maprun/league/results">this year</a> (which I might just happen to have won!). For some reason lost in the mists of time, it was written in Node, but I decided that I would rewrite it in Golang before sharing it with the world on <a href="https://github.com/davidcurrie/maprun-league">GitHub</a>.</p>



<span id="more-3186"></span>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="259" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/maprun-results.png?resize=1024%2C259&#038;ssl=1" alt="" class="wp-image-3187" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/maprun-results.png?resize=1024%2C259&amp;ssl=1 1024w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/maprun-results.png?resize=300%2C76&amp;ssl=1 300w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/maprun-results.png?resize=150%2C38&amp;ssl=1 150w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/maprun-results.png?resize=768%2C194&amp;ssl=1 768w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/maprun-results.png?w=1092&amp;ssl=1 1092w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p>When I say &#8220;I would rewrite it&#8221;, this is 2025, so what I really mean is that I would get some AI to rewrite it for me. In this case, Copilot. It did a pretty good job of it on the first attempt, including some new requirements I&#8217;d added about extracting configuration into a separate file. There was one logic error that I had to correct, and then for some reason, it had decided not to bother providing the code to generate the emojis for podium places. To be fair, it even told me it hadn&#8217;t done this, and offered to finish the job.</p>



<p>The only subsequent changes were to switch to Kong for CLI parsing (not that there is much) and then the addition of a GitHub workflow to publish <a href="https://github.com/davidcurrie/maprun-league/releases">release binaries</a> (although how useful they are without signing is debateable). Will anyone else use it? Who knows. Did I manage to push to GitHub the password used to publish results to the SOC website? Perhaps. Have I now changed that password? Definitely!</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3186</post-id>	</item>
		<item>
		<title>Dartmoor DofE</title>
		<link>https://david.currie.name/archives/2025/07/26/dartmoor-dofe?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=dartmoor-dofe</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Sat, 26 Jul 2025 14:49:00 +0000</pubDate>
				<category><![CDATA[Family]]></category>
		<category><![CDATA[Travel]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3183</guid>

					<description><![CDATA[Duncan&#8217;s Silver Duke of Edinburgh expedition was on Dartmoor, and I was on the hook for driving half the group down early on Saturday morning, and back on Monday. It seemed to make sense to stay down there and make a long weekend of it. The journey there was remarkably painless, and once they&#8217;d been [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image is-style-default">
<figure class="alignright size-medium"><img data-recalc-dims="1" loading="lazy" decoding="async" width="225" height="300" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/54716300965_d5ba180553_c.jpg?resize=225%2C300&#038;ssl=1" alt="" class="wp-image-3184" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/54716300965_d5ba180553_c.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/54716300965_d5ba180553_c.jpg?resize=113%2C150&amp;ssl=1 113w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/09/54716300965_d5ba180553_c.jpg?w=600&amp;ssl=1 600w" sizes="auto, (max-width: 225px) 100vw, 225px" /></figure>
</div>


<p>Duncan&#8217;s Silver Duke of Edinburgh expedition was on Dartmoor, and I was on the hook for driving half the group down early on Saturday morning, and back on Monday. It seemed to make sense to stay down there and make a long weekend of it.</p>



<p>The journey there was remarkably painless, and once they&#8217;d been briefed by the leaders, they set off north from Bennett&#8217;s Cross. I was due to meet my uncle in Bovey Tracey for lunch, but had time for a quick circular walk past Grimspound. In addition to the obligatory Dartmoor ponies, I also spotted a fox and some llamas (the latter captive!).</p>



<span id="more-3183"></span>



<p>My accommodation for the weekend was <a href="https://www.yha.org.uk/hostel/yha-okehampton">YHA Okehampton</a>. It hadn&#8217;t really dawned on me how far this was from my lunch destination, until Google decided to route me via the outskirts of Exeter.</p>



<p>On Sunday, I headed up on to Okehampton Ranges. The weather was lovely to begin with, but at my furthest point, the windblown rain arrived. The next hour was fairly unpleasant, but it eventually dried out and I was treated to sunshine again as I returned over High Willhays and Yes Tor. After a quick fish and chip supper, I went to watch Jurassic World Rebirth at Okehampton Cinema. I&#8217;m not sure that I&#8217;ve ever been to the cinema on my own before!</p>



<p>On Monday morning, I went for a run out along the Two Castles Trail, returning over the fields past Meldon Reservoir. I had time for a quick side trip to Castle Drogo, before setting off south again to meet Duncan and friends at Shipley Bridge. They were much quieter in the car on the return journey but seemed to have had a good time.</p>



<p>A few more photos over on <a href="https://flickr.com/photos/currie/albums/72177720328336304/">Flickr</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3183</post-id>	</item>
		<item>
		<title>Creating a Membership List in Drupal 11 with Aggregating Views</title>
		<link>https://david.currie.name/archives/2025/07/09/creating-a-membership-list-in-drupal-11-with-aggregating-views?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=creating-a-membership-list-in-drupal-11-with-aggregating-views</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Wed, 09 Jul 2025 12:02:00 +0000</pubDate>
				<category><![CDATA[Orienteering]]></category>
		<category><![CDATA[Web]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3122</guid>

					<description><![CDATA[I&#8217;ve written before about our use of Drupal for the Southampton Orienteering Club website. We&#8217;re now on Drupal 11, and my opinions haven&#8217;t really changed. Upgrades are still painful, particularly the community modules that we have to leave behind each time. The user experience for creating content also lags behind newer alternatives. We have a [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>I&#8217;ve written <a href="/archives/2019/01/28/drupal-8-migration">before</a> about our use of <a href="https://drupal.org/">Drupal</a> for the Southampton Orienteering Club <a href="https://socweb.org/">website</a>. We&#8217;re now on Drupal 11, and my opinions haven&#8217;t really changed. Upgrades are still painful, particularly the community modules that we have to leave behind each time. The user experience for creating content also lags behind newer alternatives. We have a significant amount of historical content on the site (not all of it publicly visible), making a move a daunting proposition. In the meantime, as this post demonstrates, we continue to utilise the powerful features that Drupal and its ecosystem offer.</p>



<span id="more-3122"></span>



<p>We had a requirement to provide a membership list for use by the club&#8217;s members, which would provide names, approximate home location (to facilitate lift sharing), and a contact mechanism. Previously, it fell to the membership secretary to create this list manually; however, given that nearly all members have an account on the website, it felt like there was a better way.</p>



<p>We already had a permission role that was granted to club members (allowing them access to the members&#8217; area), so it was trivial to create a page that listed all of the website users in that role (and limit access to the list to those in that role). Drupal lets you add custom fields to the user profile. We already have fields for forename and surname, to which I added a location field, which we populated from the old membership list.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="497" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/user-profile.png?resize=1024%2C497&#038;ssl=1" alt="User profile" class="wp-image-3126" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/user-profile.png?resize=1024%2C497&amp;ssl=1 1024w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/user-profile.png?resize=300%2C145&amp;ssl=1 300w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/user-profile.png?resize=150%2C73&amp;ssl=1 150w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/user-profile.png?resize=768%2C372&amp;ssl=1 768w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/user-profile.png?w=1126&amp;ssl=1 1126w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p>Drupal also has a built-in mechanism for users to contact one another. Users can select the user they wish to contact and provide a message, which is then emailed to the recipient with the originating user as the sender. This has the benefit that users see messages where they are most likely to notice them (in their inbox rather than in some additional system), but without having to expose everyone&#8217;s email address to everyone else, which was an area of concern. Better still, users can indicate in their profile whether or not they wish to be contactable.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="951" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/contact-form.png?resize=1024%2C951&#038;ssl=1" alt="Contact form" class="wp-image-3125" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/contact-form.png?resize=1024%2C951&amp;ssl=1 1024w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/contact-form.png?resize=300%2C279&amp;ssl=1 300w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/contact-form.png?resize=150%2C139&amp;ssl=1 150w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/contact-form.png?resize=768%2C714&amp;ssl=1 768w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/contact-form.png?resize=1536%2C1427&amp;ssl=1 1536w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/contact-form.png?w=1832&amp;ssl=1 1832w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<p>So far, so good. We had a list that showed members&#8217; names, locations, and a link to their contact form if they hadn&#8217;t disabled it. The last thing we wanted to add to the list was some additional data for each member, highlighting honorary members, any qualifications (e.g., first aider or coach), and any posts they might hold (e.g., secretary or chair).</p>



<p>We already had a Drupal node type to represent a post, which is then linked to multiple users. This was being used to generate the <a href="https://socweb.org/committee">committee page</a>. I decided to extend this to cover the other scenarios. Drupal views allow you to specify reverse relationships, so for each member, it would retrieve all of the &#8216;posts&#8217; the member held. Unfortunately, it then renders this as if it were an outer join in SQL, with multiple rows in the table for a member, one for each post.</p>



<p>This is where the <a href="https://www.drupal.org/project/views_aggregator">Views Aggregator Plus</a> module came to the rescue. Once installed, I could select the &#8220;Table with aggregation options&#8221; format for my Drupal view. Getting the correct settings was then a bit finicky. I had to add a hidden field with the user&#8217;s UUID. I then configured the view to group the post holder relationship using the &#8220;Enumerate (sort, no dupl.)&#8221; function and group the UUID using &#8220;Group and compress&#8221; as shown in the following screenshot.</p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="988" height="1006" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/aggregation-options.png?resize=988%2C1006&#038;ssl=1" alt="Table with aggregation options settings" class="wp-image-3123" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/aggregation-options.png?w=988&amp;ssl=1 988w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/aggregation-options.png?resize=295%2C300&amp;ssl=1 295w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/aggregation-options.png?resize=147%2C150&amp;ssl=1 147w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/aggregation-options.png?resize=768%2C782&amp;ssl=1 768w" sizes="auto, (max-width: 988px) 100vw, 988px" /></figure>



<p>The module is significantly more powerful than this. It will, for example, allow you to perform operations such as COUNT, MIN, and MAX on the aggregated rows. That&#8217;s maybe for another day!</p>



<p>One further tweak was then needed. The table was styled differently from all of the other tables on the site. Rather than try to replicate that styling, I changed the class in <code>modules/contrib/views_aggregator/templates/views-aggregator-results-table.html.twig</code> from <code>table</code> to <code>views-table</code>.</p>



<p>The final list (or at least the important section of it!) then looks something like the following:</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="283" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/membership-list.png?resize=1024%2C283&#038;ssl=1" alt="Membership list" class="wp-image-3124" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/membership-list.png?resize=1024%2C283&amp;ssl=1 1024w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/membership-list.png?resize=300%2C83&amp;ssl=1 300w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/membership-list.png?resize=150%2C41&amp;ssl=1 150w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/membership-list.png?resize=768%2C212&amp;ssl=1 768w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/membership-list.png?resize=1536%2C425&amp;ssl=1 1536w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/07/membership-list.png?w=1858&amp;ssl=1 1858w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3122</post-id>	</item>
		<item>
		<title>Stopping the Git CredentialHelperSelector from popping up</title>
		<link>https://david.currie.name/archives/2025/06/24/stopping-the-git-credentialhelperselector-from-popping-up?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=stopping-the-git-credentialhelperselector-from-popping-up</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Tue, 24 Jun 2025 21:25:40 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Work]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3110</guid>

					<description><![CDATA[Recently, I was plagued by the &#8220;CredentialHelperSelector&#8221; dialogue popping up multiple times when attempting to pull from a remote Git repository. This was despite repeatedly selecting the option to remember my selection to use manager and various attempts to explicitly set the config helper via the command line. In the end, the following command was [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Recently, I was plagued by the &#8220;CredentialHelperSelector&#8221; dialogue popping up multiple times when attempting to pull from a remote Git repository. This was despite repeatedly selecting the option to remember my selection to use <code>manager</code> and various attempts to explicitly set the config helper via the command line.</p>



<span id="more-3110"></span>



<p>In the end, the following command was my saviour:</p>



<pre class="wp-block-code"><code>git config -l --show-origin</code></pre>



<p>It showed that the offending <code>credential.helper=helper-selector</code> was specified in the <code>gitconfig</code> file under the Git install (this being Windows). What you then need to know is that <code>credential.helper</code> is a multi-valued list, and so any changes I was making in my user level <code>.gitconfig</code> were additive. This explains why, once an alternative was specified, I could cancel the numerous selector dialogues, and the operation would still complete successfully.</p>



<p>So, how to avoid those annoying pop-ups? Well, if you can edit that system-level <code>gitconfig</code> just remove the offending entry. Unfortunately, on my locked-down system, that wasn&#8217;t an option. The answer, then, is <a href="https://github.com/git/git/commit/24321375cda79f141be72d1a842e930df6f41725">this change</a>, available in Git 2.9 onwards. It allows you to specify an empty helper to clear any existing entries in the list. My <code>.gitconfig</code> now contains the following, and the selector is no more!</p>



<pre class="wp-block-code"><code>&#91;credential]
        helper =
        helper = manager</code></pre>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3110</post-id>	</item>
		<item>
		<title>Updating the symbol set and magentic north with OpenOrienteering Mapper</title>
		<link>https://david.currie.name/archives/2025/06/15/updating-the-symbol-set-and-magentic-north-with-openorienteering-mapper?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=updating-the-symbol-set-and-magentic-north-with-openorienteering-mapper</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Sun, 15 Jun 2025 20:19:01 +0000</pubDate>
				<category><![CDATA[Orienteering]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3105</guid>

					<description><![CDATA[I spend a couple of hours a week hanging around the leisure centre at Fleming Park while Emma swims. For the past month or so, I&#8217;ve been using that time to update the orienteering map of the area, ready for the SOC Summer Series event there in August. The fairways of the old golf course [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="alignright size-thumbnail is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="150" height="150" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/06/Mapper-256.png?resize=150%2C150&#038;ssl=1" alt="" class="wp-image-3107" style="object-fit:cover;width:128px;height:128px" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2025/06/Mapper-256.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/david.currie.name/wp-content/uploads/2025/06/Mapper-256.png?w=256&amp;ssl=1 256w" sizes="auto, (max-width: 150px) 100vw, 150px" /></figure>
</div>


<p>I spend a couple of hours a week hanging around the leisure centre at Fleming Park while Emma swims. For the past month or so, I&#8217;ve been using that time to update the orienteering map of the area, ready for the <a href="https://socweb.org/event/2025/08/02/summer-series-5-fleming-park">SOC Summer Series event</a> there in August. The fairways of the old golf course are becoming increasingly overgrown, aided by the planting of lots of new trees. I therefore wanted to update the map to the latest sprint specification, <a href="https://1drv.ms/b/c/663580750d0c0bce/Ec4LDA11gDUggGZWxAAAAAABY1kMpR0LDGlrweCRaEG3IQ">ISSprOM 2019-2</a>, so that I could make use of the &#8216;rough open with scattered bushes&#8217; symbol. Although it hasn&#8217;t shifted much since 2016, I thought it was also time to update magnetic north.</p>



<p>The following directions for <a href="https://www.openorienteering.org/apps/mapper/">OpenOrienteering Mapper</a> (OOM) are based on those I received from the club&#8217;s mapping officer, Mark Light.</p>



<span id="more-3105"></span>



<h2 class="wp-block-heading">Updating the symbol set</h2>



<ol class="wp-block-list">
<li>Download and unzip the latest symbol set from the <a href="https://www.britishorienteering.org.uk/doc/mapping/british-orienteering-symbol-sets/new/bof-symbol-sets-iofrev6-oom">British Orienteering website</a>.</li>



<li>To make your life easier in step 4, delete any unused symbols from the map.
<ol class="wp-block-list">
<li>Right-click on the symbol palette and click <em>Select Symbols &gt; Select Unused</em>. </li>



<li>Right-click on any unused symbol in the palette and select <em>Delete</em>.</li>
</ol>
</li>



<li>Select <em>Symbols &gt;</em> <em>Replace symbol set&#8230;</em> and select the<br />appropriate scale set of icons from the download in step 1. If, as in the case of this map, the scale doesn&#8217;t match, you&#8217;ll get a warning.</li>



<li>Provide a mapping for each symbol in the old set to the new.
<ol class="wp-block-list">
<li>You can use the <em>Symbol mapping</em> dropdown at the bottom of the dialogue to determine whether it matches by textual name or ID number by default.</li>



<li>Work your way down the list, checking where there is no mapping specified. If the old symbol is something custom that you want to carry across, for example, text for a legend, leave the selection as <em>-None-</em>. Similarly, if you&#8217;re not sure what it should translate to, just take a note of the number and leave it as <em>-None-</em>.</li>



<li>Click <em>OK</em>.</li>
</ol>
</li>



<li>Map any symbols you were unsure about
<ol class="wp-block-list">
<li>Right-click on each symbol in the symbol window and click <em>Select all objects with this symbol</em>.</li>



<li>If you can now work out what they should be mapped to:
<ol class="wp-block-list">
<li>Select the new symbol in the symbol window.</li>



<li>Click the <em>Switch symbol</em> icon in the toolbar.</li>



<li>Right-click on the old symbol and select <em>Delete</em>.</li>
</ol>
</li>
</ol>
</li>



<li>Particularly for any custom symbols you&#8217;ve carried across, check that they are still visible on the map. It may be that, as with this map, they have been given a colour that is now lower down the colour table than some symbol that appears above them. Either double-click on the symbol and edit it to use the correct colour from the specification, or select <em>View &gt; Color window</em> and re-order the colours so that the symbols reappear.</li>



<li>If, in step 3, you received a warning about the symbol and map scales not matching, now is the time to fix that.
<ol class="wp-block-list">
<li>Select <em>Symbols &gt; Scale all symbols&#8230;</em>.</li>



<li>Enter the scale percentage. For example, when using 1:4,000 symbols on a 1:5,000 map, enter 80%.</li>



<li>Click <em>OK</em>.</li>
</ol>
</li>
</ol>



<h2 class="wp-block-heading">Updating magnetic north</h2>



<ol class="wp-block-list">
<li>Determine the magnetic declination applicable to your map.
<ol class="wp-block-list">
<li>Open <a href="https://www.remmaps.it/mag/">this website</a> in a browser.</li>



<li>Drag the marker to the location of your map and note the current magnetic declination. OOM will only accept two decimal places, so don&#8217;t worry too much about the exact position of the marker.</li>
</ol>
</li>



<li>Ensure that the map is correctly georeferenced with the correct projection, in our case, the Ordnance Survey British Grid (EPSG 27700). These settings can be found under <em>Map &gt; Georeferencing&#8230;</em>.</li>



<li>If it doesn&#8217;t already exist, create a new &#8216;part&#8217; in OOM for the map furniture (borders, legend, north lines, and anything that shouldn&#8217;t change with magnetic north).
<ol class="wp-block-list">
<li>Select <em>Map &gt; Add new part&#8230;</em>.</li>



<li>Name the part <em>Furniture</em>.</li>



<li>Click <em>OK</em>.</li>



<li>A new dropdown appears in the toolbar showing the currently selected part. Select the <em>default part</em>.</li>



<li>Select the items that make up the furniture, either on the map or via their symbols. Select <em>Map &gt; Move selected objects to &gt; Furniture</em>. Repeat until all of the furniture is in the new part.</li>



<li>Under <em>Map &gt; Georeferencing&#8230;</em> enter the declination you retrieved in step 1 and click <em>OK</em>. This will rotate all parts of the map to account for the current position of magnetic north.</li>



<li>Now you need to rotate the furniture back.
<ol class="wp-block-list">
<li>Select the <em>Furniture</em> part.</li>



<li>If you don&#8217;t already have a grid displayed, select <em>View &gt; Show grid</em>.</li>



<li>Select <em>Tools &gt; Rotate objects</em> and rotate the furniture part to align with the grid.</li>
</ol>
</li>
</ol>
</li>
</ol>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3105</post-id>	</item>
		<item>
		<title>Helm: for better or worse?</title>
		<link>https://david.currie.name/archives/2025/06/09/helm-for-better-or-worse?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=helm-for-better-or-worse</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Mon, 09 Jun 2025 19:30:00 +0000</pubDate>
				<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Work]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3094</guid>

					<description><![CDATA[A few weeks ago, one of my colleagues at JUXT gave a presentation on Helm, and this started me thinking back over my own experiences with the tool. It appears I already had a lot to say on the subject back in 2018! Since then, I&#8217;ve made extensive use of Helm at CloudBees where we [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>A few weeks ago, one of my colleagues at JUXT gave a presentation on Helm, and this started me thinking back over my own experiences with the tool. It appears I already had a lot to say on the subject <a href="/archives/2018/10/05/helm-the-package-manager-for-kubernetes">back in 2018</a>! Since then, I&#8217;ve made extensive use of Helm at CloudBees where we had an umbrella chart to deploy the entire SaaS platform, and at R3. It&#8217;s that latter experience that I&#8217;m going to talk about in this post.</p>



<span id="more-3094"></span>



<h2 class="wp-block-heading">Helm and Corda</h2>



<p>The main Helm chart in question is the one for the R3&#8217;s Corda DLT, which you can find on <a href="https://github.com/corda/corda-runtime-os/tree/release/os/5.3/charts">GitHub</a>. The corda.net website has, unfortunately, been sunset, but my blog post describing the rationale for using Helm is still available on the <a href="https://web.archive.org/web/20230206022134/https://corda.net/blog/corda-5-cloud-native-deployment/">Internet Archive</a>. <a href="https://medium.com/corda/zero-to-corda-5-in-10-minutes-or-less-54137d1b1f14">Another article</a> explains how the chart can be used, along with those for Kafka and Postgres, to spin up a complete Corda deployment quickly.</p>



<p>As an aside, it was a conscious decision not to provide a chart that packaged Corda along with those Kafka and PostgreSQL prereqs. The concern was that customers would take this and deploy it to production without thinking about what a production deployment of Kafka or Postgres entails. Not to mention wanting to make it clear that these were not components that we, as a company, were providing support for.</p>



<p>As a cautionary tale: despite its name, the <code>corda-dev-prereqs</code> chart referenced in that last article (which creates a decidedly non-HA deployment of Kafka and PostgreSQL) found itself being deployed in places it shouldn&#8217;t have been&#8230;</p>



<h2 class="wp-block-heading">More Go than YAML</h2>



<p>Whilst the consumer experience with the Helm chart was pretty good, things weren&#8217;t so rosy on the authoring side. The combined novelty of Kubernetes configuration <strong>and</strong> Go templating was just too much for many developers. While some did engage, ownership of the chart definitely remained with the DevOps team that authored the initial version, rather than the application developers.</p>



<p>The complexity of the chart also ramped up rapidly. With multiple services requiring almost identical configuration, we soon moved from YAML with embedded Go to Go with embedded YAML! That problem is not unique to Helm; I remember having the same issue with JSPs many moons ago.</p>



<p>The lack of typing, combined with the fact that all functions return strings, started to make the chart fragile, particularly without any good testing of the output with different override values.</p>



<h2 class="wp-block-heading">Two charts are not better than one</h2>



<p>If you look at the GitHub repository, you might wonder why most of the logic for the chart sits in a separate library chart (<code>corda-lib</code>) on which the main <code>corda</code> chart depends. What you can&#8217;t see is that we had a separate Helm chart for use by paying customers. This was largely identical to the open-source chart, but included some additional configuration overrides. The library chart was an attempt to share as much logic as possible between the two.</p>



<p>What we couldn&#8217;t share was the <code>values.yaml</code> itself and the corresponding JSON schema, and as a consequence, there was always a certain amount of double fixing that went on. What we really needed was a first-class mechanism for extending a chart.</p>



<h2 class="wp-block-heading">Helm hooks</h2>



<p>Although there were other niggles, the last issue I&#8217;m going to talk about is the use of <a href="https://helm.sh/docs/topics/charts_hooks/">Helm hooks</a>. Corda has two mechanisms for bootstrapping PostgreSQL and Kafka: an administrator can use the CLI to generate the required SQL and topic definitions, or the chart can automatically perform the setup when the chart is installed. We expected customers to use the former mechanism, at least in production, but the latter was used in most of our development and testing, and by the services team in pilot projects. The automated approach used a pre-install hook to drive a containerised version of the CLI to perform the setup.</p>



<p>So far, so good. We then started to look at using ArgoCD to deploy the chart. ArgoCD doesn&#8217;t install Helm charts directly, instead, it renders the template and then applies the Kubernetes configuration. It does have some understanding of Helm hooks, converting them into ArgoCD waves, but it doesn&#8217;t distinguish between install and upgrade hooks. This would lead ArgoCD to try to rerun the setup during an upgrade.</p>



<p>Now, here some responsibility must lie with the Corda team, as those setup commands should have been idempotent, but they weren&#8217;t. The answer, for us, was to use an alternative to ArgoCD (worth a separate post), but our customers might not have the luxury of that choice.</p>



<h2 class="wp-block-heading">Summary</h2>



<p>Does all of the above mean that I think Helm is a bad choice? As always, it depends. For &#8216;packaged&#8217; Kubernetes configuration, I still believe it&#8217;s a better choice than requiring consumers to understand your YAML sufficiently to be able to apply suitable modifications with Kustomize. In particular, pushing Kustomize is opening up your support organisation to having to deal with customers basically using any arbitrary YAML to deploy your solution.</p>



<p>In the case of Corda, we underinvested in building the skills to make the best of Helm. Fundamentally, though, I&#8217;d suggest that we simply outgrew it. If I were still working on its evolution, the next step would undoubtedly have been to implement an operator and write all of that complicated logic in a language that properly supports testing and reuse.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3094</post-id>	</item>
		<item>
		<title>Lancaster and Lake District Getaway</title>
		<link>https://david.currie.name/archives/2024/08/05/lancaster-and-lake-district-getaway?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=lancaster-and-lake-district-getaway</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Mon, 05 Aug 2024 20:33:36 +0000</pubDate>
				<category><![CDATA[Family]]></category>
		<category><![CDATA[Running]]></category>
		<category><![CDATA[Travel]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3068</guid>

					<description><![CDATA[Last weekend, we took a trip to the Lake District as the children were away and Christine had a viva in Lancaster. We had two and a bit days of walking and I visited Lancaster Castle.]]></description>
										<content:encoded><![CDATA[
<p>Last weekend, the children were away on a music tour and Christine was examining a viva in Lancaster on Monday, which was the ideal excuse for a long weekend in the Lake District.</p>



<h2 class="wp-block-heading">Friday &#8211; Loughrigg Fell</h2>



<div class="wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-ad2f72ca wp-block-group-is-layout-flex">
<p>I took Friday off work and we took the train to Windermere via London, and then the bus to Rydal where we were staying in the <a href="https://www.theglenrothay.co.uk/the-badger-bar" title="">Badger Bar</a>. (Badger feeding was supposedly on offer each evening but I think we went to bed before the badgers got up!) It took about seven and a half hours door to door which, while a couple more than driving, was certainly more relaxing. We had time for a walk on Loughrigg Fell before dinner in the pub (and watching a very damp Olympic opening ceremony on TV).</p>
</div>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="768" height="1024" data-id="3072" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240726_153934.jpg?resize=768%2C1024&#038;ssl=1" alt="" class="wp-image-3072" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240726_153934.jpg?w=768&amp;ssl=1 768w, https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240726_153934.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240726_153934.jpg?resize=113%2C150&amp;ssl=1 113w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="768" data-id="3073" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240726_205442.jpg?resize=1024%2C768&#038;ssl=1" alt="" class="wp-image-3073" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240726_205442.jpg?w=1024&amp;ssl=1 1024w, https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240726_205442.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240726_205442.jpg?resize=150%2C113&amp;ssl=1 150w, https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240726_205442.jpg?resize=768%2C576&amp;ssl=1 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>
</figure>



<h2 class="wp-block-heading">Saturday &#8211; High Raise and the Langdale Pikes</h2>


<div class="wp-block-image">
<figure class="alignright size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="768" height="1024" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240727_133841.jpg?resize=768%2C1024&#038;ssl=1" alt="" class="wp-image-3074" style="width:166px;height:auto" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240727_133841.jpg?w=768&amp;ssl=1 768w, https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240727_133841.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240727_133841.jpg?resize=113%2C150&amp;ssl=1 113w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>
</div>


<p>The forecast was for rain most of Saturday morning. We eventually set out about 11, staying low and skirting the lakes to Grasmere. After tea and cake, things had started to dry out and we set off up to High Raise. Our younger selves might have continued on to Bowfell but we decided to drop down to Dungeon Ghyll via the Langdale Pikes.</p>



<p>We had a drink at the pub while waiting for the bus and chatted to a couple of guys who had been watching the Blisco Dash fell race (this year, the British Short Champs). They also mentioned it was the Lakeland 50/100 and we cheered the runners in Ambleside as we sat and ate our fish and chips.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="223" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240727_151939-1.jpg?resize=1024%2C223&#038;ssl=1" alt="" class="wp-image-3076" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240727_151939-1.jpg?resize=1024%2C223&amp;ssl=1 1024w, https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240727_151939-1.jpg?resize=300%2C65&amp;ssl=1 300w, https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240727_151939-1.jpg?resize=150%2C33&amp;ssl=1 150w, https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240727_151939-1.jpg?resize=768%2C167&amp;ssl=1 768w, https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240727_151939-1.jpg?resize=1536%2C334&amp;ssl=1 1536w, https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240727_151939-1.jpg?w=1920&amp;ssl=1 1920w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<h2 class="wp-block-heading">Sunday &#8211; Fairfield Horseshoe</h2>



<p>The weather was set fair for Sunday and we headed up Nab Scar to do the Fairfield horseshoe clockwise. I was dripping in sweat when we reached the ridge but sadly we then headed into the clouds as we approached Fairfield. The clouds did clear as we headed back towards Ambleside.</p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="768" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240728_121521.jpg?resize=1024%2C768&#038;ssl=1" alt="" class="wp-image-3077" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240728_121521.jpg?w=1024&amp;ssl=1 1024w, https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240728_121521.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240728_121521.jpg?resize=150%2C113&amp;ssl=1 150w, https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240728_121521.jpg?resize=768%2C576&amp;ssl=1 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>



<h2 class="wp-block-heading">Monday &#8211; Lancaster</h2>


<div class="wp-block-image">
<figure class="alignleft size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="768" height="1024" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240729_113030.jpg?resize=768%2C1024&#038;ssl=1" alt="" class="wp-image-3078" style="width:172px;height:auto" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240729_113030.jpg?w=768&amp;ssl=1 768w, https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240729_113030.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/david.currie.name/wp-content/uploads/2024/08/20240729_113030.jpg?resize=113%2C150&amp;ssl=1 113w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>
</div>


<p>We relocated to Lancaster University that evening and had a wander around a mostly deserted campus. On Monday I had a couple of hours to kill while Christine worked. I decided to take the guided tour of Lancaster Castle. You started in the wings that were still in use until the prison closed in 2011 and then headed back a few hundred years to the waiting cells where, if you timed your arrest badly, you might have had to wait up to 9 months for the court of assizes. The tour then moved on to the impressive courtrooms, concluding in the &#8220;drop room&#8221; (which I&#8217;ll leave you to fathom for yourselves).</p>



<p>There was just time for a quick bite to eat before it was time to meet Christine at the station for the return train home.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3068</post-id>	</item>
		<item>
		<title>WordPress is broken by PHP in Jammy update</title>
		<link>https://david.currie.name/archives/2024/08/03/wordpress-is-broken-by-php-in-jammy-update?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wordpress-is-broken-by-php-in-jammy-update</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Sat, 03 Aug 2024 17:16:50 +0000</pubDate>
				<category><![CDATA[Hosting]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3064</guid>

					<description><![CDATA[The blog was neglected for years. Upgrading Ubuntu to Jammy caused WordPress issues with PHP 8.1. To resolve this, PHP 7.4 was reinstalled.]]></description>
										<content:encoded><![CDATA[
<p>This blog has been a bit neglected for the last few years. I miss the opportunity to reflect on something I&#8217;ve done and write up those thoughts. We&#8217;ll see whether this is a one-off or the start of something new!</p>



<p>The first task was to make sure everything on the site was up-to-date. WordPress does a pretty good job of automatically applying security fixes but the Ubuntu VPS needed an upgrade. The update to Jammy went smoothly enough but attempting to access the site showed the WordPress PHP source. The enabled modules for Apache showed a couple of broken symlinks to PHP 7. After enabling those for PHP 8.1, I saw a WordPress error page: <code>There has been a critical error on this website</code>.</p>



<p>The <a href="https://make.wordpress.org/core/handbook/references/php-compatibility-and-wordpress-versions/" title="">WordPress PHP compatibility matrix</a> indicates that there are still exceptions with PHP 8 versions. Time to get PHP 7 back&#8230;</p>



<pre class="wp-block-code"><code>sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php7.4
sudo apt install php7.4-common php7.4-mysql php7.4-xml \
  php7.4-json php7.4-mbstring php7.4-gd php7.4-curl
sudo update-alternatives --config php</code></pre>



<p>Then re-enable the PHP 7 Apache modules:</p>



<pre class="wp-block-code"><code>sudo a2dismod php8.3
sudo a2enmod php7.4
sudo apachectl restart</code></pre>



<p>With the site rendering again, I thought I was done but on posting this entry the dreaded critical error reappeared. Looking again at the Apache error logs, <code>/var/log/apache2/error.log</code> revealed errors in <code>lightbox-plus</code> and <code>crayon-syntax-highlighter</code> of the form <code>Compilation failed: invalid range in character class</code>. From PHP 7.3, hyphens need to be escaped in regular expressions. I could have rolled the PHP version back further but decided to patch the offending files. (I probably need to review the plugins in use on the site and remove those that are no longer supported.)</p>



<p>And, finally, we&#8217;re back in business!</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3064</post-id>	</item>
		<item>
		<title>Lockdown 2</title>
		<link>https://david.currie.name/archives/2021/02/27/lockdown-2?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=lockdown-2</link>
					<comments>https://david.currie.name/archives/2021/02/27/lockdown-2#comments</comments>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Sat, 27 Feb 2021 21:22:19 +0000</pubDate>
				<category><![CDATA[Family]]></category>
		<category><![CDATA[Food]]></category>
		<category><![CDATA[Friends]]></category>
		<category><![CDATA[Orienteering]]></category>
		<category><![CDATA[Running]]></category>
		<category><![CDATA[Work]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3041</guid>

					<description><![CDATA[October started with Duncan&#8217;s birthday. It was a pretty quiet affair at home with Christine&#8217;s parents visiting and a film in the evening. Friday night has become film night more generally now (after a trial of Sky Cinema we signed up for a discounted subscription). Trying to select a film is always a bit of [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignleft size-thumbnail"><img data-recalc-dims="1" loading="lazy" decoding="async" width="150" height="150" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/duncan-birthday.jpg?resize=150%2C150&#038;ssl=1" alt="" class="wp-image-3039" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/duncan-birthday.jpg?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/duncan-birthday.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/duncan-birthday.jpg?w=768&amp;ssl=1 768w" sizes="auto, (max-width: 150px) 100vw, 150px" /></figure></div>



<p>October started with Duncan&#8217;s birthday. It was a pretty quiet affair at home with Christine&#8217;s parents visiting and a film in the evening. Friday night has become film night more generally now (after a trial of Sky Cinema we signed up for a discounted subscription). Trying to select a film is always a bit of a trial, particularly balancing Emma&#8217;s desire for action against age-appropriate content for Duncan! I&#8217;m usually the one who ends up making a final decision to try and satisfy everyone&#8217;s needs.</p>



<div class="wp-block-image"><figure class="alignright size-thumbnail"><img data-recalc-dims="1" loading="lazy" decoding="async" width="113" height="150" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/anderwood.jpg?resize=113%2C150&#038;ssl=1" alt="" class="wp-image-3032" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/anderwood.jpg?resize=113%2C150&amp;ssl=1 113w, https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/anderwood.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/anderwood.jpg?w=768&amp;ssl=1 768w" sizes="auto, (max-width: 113px) 100vw, 113px" /></figure></div>



<p>Swimming lessons continued, as did long walks and cycle rides at the weekend. In addition to Tuesday Night Runs (now with beer inside but with face masks and table service), I managed a couple of runs with the IBM gang. We went to another SCJS training with Duncan, this time in the New Forest. We were back in the Forest a couple of weeks later for an event I planned at Anderwood. I managed to put one control in the wrong place &#8211; the perils of doing all of my planning in one visit to the area the week before the event &#8211; but otherwise everything went well!</p>



<div class="wp-block-image"><figure class="alignleft size-thumbnail"><img data-recalc-dims="1" loading="lazy" decoding="async" width="150" height="113" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/cancmd.jpg?resize=150%2C113&#038;ssl=1" alt="" class="wp-image-3042" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/cancmd.jpg?resize=150%2C113&amp;ssl=1 150w, https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/cancmd.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/cancmd.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/cancmd.jpg?w=1024&amp;ssl=1 1024w" sizes="auto, (max-width: 150px) 100vw, 150px" /></figure></div>



<p>Still with vacation to burn, I had half term off. Much of it was taken up redecorating Emma&#8217;s room: out with the little girl pink, in with the teenage grey (there was much debate about quite how dark a grey she could have!). Duncan and I amused ourselves soldering and assembling the <a href="http://merg.org.uk/merg_resources/dcc.php">MERG DCC</a> command station and handset kits for his railway. Two pairs of hands definitely made the job easier, not to mention Duncan&#8217;s eyesight when it came to the surface-mounted components in the handset. Remarkably, it all worked once assembled but the train and track now need a bit of an upgrade to get a reliable signal.</p>



<p>Lockdown returned for four weeks in November which brought the more sociable activities to an end (at least face-to-face). You were still allowed to exercise with one other person, so Tuesday Night Runs involved Ian and I running around Chandler&#8217;s Ford, and I could still go out cycling with Alasdair. Through an article in CompassSport, we had discovered the <a href="https://turfgame.com/">Turf</a> app (think Pokémon GO but without the cute characters) which, even four months later, is still getting us out the door.</p>



<div class="wp-block-image"><figure class="alignright size-thumbnail"><img data-recalc-dims="1" loading="lazy" decoding="async" width="150" height="150" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/christine-birthday.jpg?resize=150%2C150&#038;ssl=1" alt="" class="wp-image-3040" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/christine-birthday.jpg?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/christine-birthday.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/christine-birthday.jpg?w=768&amp;ssl=1 768w" sizes="auto, (max-width: 150px) 100vw, 150px" /></figure></div>



<p>Duncan bought himself a small drone which we then promptly had to retrieve from the garden two doors down the road! He also bought himself a penknife which has, so far, only caused the loss of blood on one occasion! The month ended with Christine&#8217;s birthday. Come December, Christine was also allowed to tell the world that she had succeeded in her promotion to Professor. At least she now needn&#8217;t worry about being called upon to help in an emergency!</p>



<p>Emma&#8217;s inflatable boot had not helped her ankle but we were then left waiting for the hospital to start operating on children again. We were eventually given a date at the start of December (still over a month before the NHS would have even started to look at her ankle). Christine would go with her so both had to traipse up to Basingstoke for a Covid test three days beforehand, and then the whole family had to isolate until the day itself. Having been on the front of the list, Emma was awake again by mid-morning and home early afternoon. All seemed to go well and, rather than a plaster cast, she got to use the inflatable boot again. By Christmas, she was walking around normally again although is still a bit wary of cycling.</p>



<div class="wp-block-image"><figure class="alignleft size-thumbnail"><img data-recalc-dims="1" loading="lazy" decoding="async" width="113" height="150" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/sdm-launch.jpg?resize=113%2C150&#038;ssl=1" alt="" class="wp-image-3033" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/sdm-launch.jpg?resize=113%2C150&amp;ssl=1 113w, https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/sdm-launch.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/sdm-launch.jpg?w=768&amp;ssl=1 768w" sizes="auto, (max-width: 113px) 100vw, 113px" /></figure></div>



<p>Things opened up again for the next few weeks. Orienteering resumed with events at Bramshaw and Farley Mount. We even managed the annual Run the Pubs, albeit that the meal afterwards had to be in the pub garden as we were not all from the same household. I managed to give blood (having been turned away with a sore throat on the previous occasion).  We also had a big online launch event for the Software Delivery Management product I&#8217;m working on, for which everyone in the company received a set of glassware in the post so we could drink a toast. (You had to provide your own drink though!)</p>



<p>The dreaded R-number was on the rise again in the run-up to Christmas and there was much debate about what we might be able to do. At best, it was possible that we might be able to meet family for a few hours outside but, by the 19th, Hertfordshire (where my family is based) was put in the topmost tier, ruling even that out. By Boxing Day, we joined them in Tier 4 and we were to enter another national lockdown in the New Year. The Christmas period was therefore spent at home, enjoying the frosty conditions outside, and doing yet more decorating! </p>



<div class="wp-block-jetpack-tiled-gallery aligncenter is-style-rectangular"><div class="tiled-gallery__gallery"><div class="tiled-gallery__row"><div class="tiled-gallery__col" style="flex-basis:18.052083333333332%"><figure class="tiled-gallery__item"><img decoding="async" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/duncan-christmas.jpg?strip=info&#038;w=576&#038;ssl=1 576w" alt="" data-height="768" data-id="3037" data-link="https://david.currie.name/duncan-christmas" data-url="https://david.currie.name/wp-content/uploads/2021/02/duncan-christmas.jpg" data-width="576" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/duncan-christmas.jpg?ssl=1" layout="responsive"/></figure></div><div class="tiled-gallery__col" style="flex-basis:18.052083333333332%"><figure class="tiled-gallery__item"><img decoding="async" srcset="https://i2.wp.com/david.currie.name/wp-content/uploads/2021/02/emma-christmas.jpg?strip=info&#038;w=576&#038;ssl=1 576w" alt="" data-height="768" data-id="3038" data-link="https://david.currie.name/emma-christmas" data-url="https://david.currie.name/wp-content/uploads/2021/02/emma-christmas.jpg" data-width="576" src="https://i2.wp.com/david.currie.name/wp-content/uploads/2021/02/emma-christmas.jpg?ssl=1" layout="responsive"/></figure></div><div class="tiled-gallery__col" style="flex-basis:31.947916666666664%"><figure class="tiled-gallery__item"><img decoding="async" srcset="https://i1.wp.com/david.currie.name/wp-content/uploads/2021/02/duncan-snow.jpg?strip=info&#038;w=600&#038;ssl=1 600w,https://i1.wp.com/david.currie.name/wp-content/uploads/2021/02/duncan-snow.jpg?strip=info&#038;w=900&#038;ssl=1 900w,https://i1.wp.com/david.currie.name/wp-content/uploads/2021/02/duncan-snow.jpg?strip=info&#038;w=1024&#038;ssl=1 1024w" alt="" data-height="768" data-id="3036" data-link="https://david.currie.name/duncan-snow" data-url="https://david.currie.name/wp-content/uploads/2021/02/duncan-snow.jpg" data-width="1024" src="https://i1.wp.com/david.currie.name/wp-content/uploads/2021/02/duncan-snow.jpg?ssl=1" layout="responsive"/></figure></div><div class="tiled-gallery__col" style="flex-basis:31.947916666666664%"><figure class="tiled-gallery__item"><img decoding="async" srcset="https://i1.wp.com/david.currie.name/wp-content/uploads/2021/02/emma-duncan-snow.jpg?strip=info&#038;w=600&#038;ssl=1 600w,https://i1.wp.com/david.currie.name/wp-content/uploads/2021/02/emma-duncan-snow.jpg?strip=info&#038;w=900&#038;ssl=1 900w,https://i1.wp.com/david.currie.name/wp-content/uploads/2021/02/emma-duncan-snow.jpg?strip=info&#038;w=1024&#038;ssl=1 1024w" alt="" data-height="768" data-id="3035" data-link="https://david.currie.name/emma-duncan-snow" data-url="https://david.currie.name/wp-content/uploads/2021/02/emma-duncan-snow.jpg" data-width="1024" src="https://i1.wp.com/david.currie.name/wp-content/uploads/2021/02/emma-duncan-snow.jpg?ssl=1" layout="responsive"/></figure></div></div></div></div>



<p>New Year&#8217;s Eve was made a bit special as we cashed in the money that CloudBees was contributing to a festive meal and had a nice takeaway. Emma was then determined to stay up until midnight and we thought we should probably keep her company! As the year came to an end, I&#8217;m sure everyone had the same wish: that 2021 should be a better one.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://david.currie.name/archives/2021/02/27/lockdown-2/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3041</post-id>	</item>
		<item>
		<title>Socially Distanced Summer</title>
		<link>https://david.currie.name/archives/2021/02/21/socially-distanced-summer?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=socially-distanced-summer</link>
		
		<dc:creator><![CDATA[Dave]]></dc:creator>
		<pubDate>Sun, 21 Feb 2021 22:27:10 +0000</pubDate>
				<category><![CDATA[Family]]></category>
		<category><![CDATA[Friends]]></category>
		<category><![CDATA[Orienteering]]></category>
		<category><![CDATA[Travel]]></category>
		<guid isPermaLink="false">https://david.currie.name/?p=3030</guid>

					<description><![CDATA[July continued in much the same theme as June with a mixture of online and socially-distanced face-to-face activity. The children continued to be schooled at home until the end of the summer term. Duncan even got to meet his teacher for next year (who is new to the school) online. The orienteering club continued to [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>July continued in much the same theme as June with a mixture of online and socially-distanced face-to-face activity. The children continued to be schooled at home until the end of the summer term. Duncan even got to meet his teacher for next year (who is new to the school) online. The orienteering club continued to have online sessions on Zoom, including the AGM at which I was delighted to receive the &#8220;outstanding contribution award&#8221;! Duncan and I continued with PE with Joe until it stopped at the end of the term.</p>



<p>In the real world, Tuesday Night runs continued in the New Forest. It was pleasant enough sat in the garden at the Sir Walter Tyrell but the beer options were limited and served in plastic glasses. There were also regular visits to friend&#8217;s gardens for socially distanced beverages. Long walks at the weekends were another continuing theme.</p>



<p>In other news, when the dentist re-opened for business, Emma had her last child&#8217;s tooth removed at the request of the orthodontist. Sadly the orthodontist is not permitted to start any new work though so no further progress there. We also participated in a Covid-19 saliva test trial run by the University of Southampton. Over six months later, there are now plans to use the test at Emma&#8217;s school.</p>



<p>August brought the summer holidays. We were immensely thankful that travel to France was possible. Not because we had any intention of going, but Christine&#8217;s brother did, which meant we could make use of their newly renovated home in Cornwall for a week. (Just to be clear, it&#8217;s their only home!) They live away from the tourist hotspots which meant we could do some local walks away from the masses but, to be honest, even when we did go to the beach, there was generally plenty of space for all, although the lifeguarded area in the water was sometimes a little cramped.</p>



<div class="wp-block-jetpack-tiled-gallery aligncenter is-style-rectangular"><div class="tiled-gallery__gallery"><div class="tiled-gallery__row"><div class="tiled-gallery__col" style="flex-basis:20.9562742248062%"><figure class="tiled-gallery__item"><img decoding="async" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/duncan-kite.jpg?strip=info&#038;w=576&#038;ssl=1 576w" alt="" data-height="768" data-id="3028" data-link="https://david.currie.name/duncan-kite" data-url="https://david.currie.name/wp-content/uploads/2021/02/duncan-kite.jpg" data-width="576" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/duncan-kite.jpg?ssl=1" layout="responsive"/></figure></div><div class="tiled-gallery__col" style="flex-basis:20.9562742248062%"><figure class="tiled-gallery__item"><img decoding="async" srcset="https://i2.wp.com/david.currie.name/wp-content/uploads/2021/02/emma-jumping.jpg?strip=info&#038;w=576&#038;ssl=1 576w" alt="" data-height="768" data-id="3027" data-link="https://david.currie.name/emma-jumping" data-url="https://david.currie.name/wp-content/uploads/2021/02/emma-jumping.jpg" data-width="576" src="https://i2.wp.com/david.currie.name/wp-content/uploads/2021/02/emma-jumping.jpg?ssl=1" layout="responsive"/></figure></div><div class="tiled-gallery__col" style="flex-basis:37.13117732558139%"><figure class="tiled-gallery__item"><img decoding="async" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/porthtowan.jpg?strip=info&#038;w=600&#038;ssl=1 600w,https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/porthtowan.jpg?strip=info&#038;w=900&#038;ssl=1 900w,https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/porthtowan.jpg?strip=info&#038;w=1024&#038;ssl=1 1024w" alt="" data-height="768" data-id="3026" data-link="https://david.currie.name/porthtowan" data-url="https://david.currie.name/wp-content/uploads/2021/02/porthtowan.jpg" data-width="1024" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/porthtowan.jpg?ssl=1" layout="responsive"/></figure></div><div class="tiled-gallery__col" style="flex-basis:20.9562742248062%"><figure class="tiled-gallery__item"><img decoding="async" srcset="https://i1.wp.com/david.currie.name/wp-content/uploads/2021/02/duncan-surfboard.jpg?strip=info&#038;w=576&#038;ssl=1 576w" alt="" data-height="768" data-id="3023" data-link="https://david.currie.name/duncan-surfboard" data-url="https://david.currie.name/wp-content/uploads/2021/02/duncan-surfboard.jpg" data-width="576" src="https://i1.wp.com/david.currie.name/wp-content/uploads/2021/02/duncan-surfboard.jpg?ssl=1" layout="responsive"/></figure></div></div></div></div>



<p>We had one trip out booked which was the gardens at St Michael&#8217;s Mount. The gardens were lovely but it was not a day for lounging around on the terrace afterwards. We left the day Christine&#8217;s brother and family returned but we did spend a lovely morning messing around on the river with the paddleboards. We also took the opportunity to call in on my uncle in Devon on our journey home.</p>



<div class="wp-block-jetpack-tiled-gallery aligncenter is-style-rectangular"><div class="tiled-gallery__gallery"><div class="tiled-gallery__row"><div class="tiled-gallery__col" style="flex-basis:25%"><figure class="tiled-gallery__item"><img decoding="async" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/st-michaels-mount-garden.jpg?strip=info&#038;w=576&#038;ssl=1 576w" alt="" data-height="768" data-id="3025" data-link="https://david.currie.name/st-michaels-mount-garden" data-url="https://david.currie.name/wp-content/uploads/2021/02/st-michaels-mount-garden.jpg" data-width="576" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/st-michaels-mount-garden.jpg?ssl=1" layout="responsive"/></figure></div><div class="tiled-gallery__col" style="flex-basis:25%"><figure class="tiled-gallery__item"><img decoding="async" srcset="https://i2.wp.com/david.currie.name/wp-content/uploads/2021/02/emma-ice-cream.jpg?strip=info&#038;w=576&#038;ssl=1 576w" alt="" data-height="768" data-id="3024" data-link="https://david.currie.name/emma-ice-cream" data-url="https://david.currie.name/wp-content/uploads/2021/02/emma-ice-cream.jpg" data-width="576" src="https://i2.wp.com/david.currie.name/wp-content/uploads/2021/02/emma-ice-cream.jpg?ssl=1" layout="responsive"/></figure></div><div class="tiled-gallery__col" style="flex-basis:25%"><figure class="tiled-gallery__item"><img decoding="async" srcset="https://i1.wp.com/david.currie.name/wp-content/uploads/2021/02/duncan-surfboard.jpg?strip=info&#038;w=576&#038;ssl=1 576w" alt="" data-height="768" data-id="3023" data-link="https://david.currie.name/duncan-surfboard" data-url="https://david.currie.name/wp-content/uploads/2021/02/duncan-surfboard.jpg" data-width="576" src="https://i1.wp.com/david.currie.name/wp-content/uploads/2021/02/duncan-surfboard.jpg?ssl=1" layout="responsive"/></figure></div><div class="tiled-gallery__col" style="flex-basis:25%"><figure class="tiled-gallery__item"><img decoding="async" srcset="https://i1.wp.com/david.currie.name/wp-content/uploads/2021/02/fish-and-chips.jpg?strip=info&#038;w=576&#038;ssl=1 576w" alt="" data-height="768" data-id="3022" data-link="https://david.currie.name/fish-and-chips" data-url="https://david.currie.name/wp-content/uploads/2021/02/fish-and-chips.jpg" data-width="576" src="https://i1.wp.com/david.currie.name/wp-content/uploads/2021/02/fish-and-chips.jpg?ssl=1" layout="responsive"/></figure></div></div></div></div>



<p>Having not been away at Easter, I could afford to take to the following week off although the excitement was fairly limited. The swimming pool re-opened but you had to book so I think Christine and Emma only went the once. It did mean that the children&#8217;s lessons resumed though.</p>



<div class="wp-block-image"><figure class="alignleft size-thumbnail"><img data-recalc-dims="1" loading="lazy" decoding="async" width="113" height="150" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/fan-y-big.jpg?resize=113%2C150&#038;ssl=1" alt="" class="wp-image-3021" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/fan-y-big.jpg?resize=113%2C150&amp;ssl=1 113w, https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/fan-y-big.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/fan-y-big.jpg?w=576&amp;ssl=1 576w" sizes="auto, (max-width: 113px) 100vw, 113px" /></figure></div>



<p>The last week of August we de-camped to Monmouth although Christine and I continued to work during most of the week. We did a lovely (if wet at times) walk in the Brecons with Duncan that took in the horseshoe including Corn Du, Pen Y Fan, and Cribyn.</p>



<p>Back home, we booked the children into Clarks in preparation for the return to school only to discover they had no shoes that would fit Emma! They could, however, suggest what size and style we should buy online. Duncan had a day of outdoor activities at Woodmill which he enjoyed. Emma, meanwhile, went to Basingstoke to get an x-ray of her ankle. We&#8217;d given up on the NHS who offered Emma a first consultation in February and found a private consultant covered by our medical insurance. Sadly, he&#8217;s not currently operating out of Winchester, hence the trip up to Basingstoke.</p>



<div class="wp-block-image"><figure class="alignleft size-thumbnail"><img data-recalc-dims="1" loading="lazy" decoding="async" width="150" height="100" src="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/lepe.jpg?resize=150%2C100&#038;ssl=1" alt="" class="wp-image-3020" srcset="https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/lepe.jpg?resize=150%2C100&amp;ssl=1 150w, https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/lepe.jpg?resize=300%2C200&amp;ssl=1 300w, https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/lepe.jpg?resize=768%2C512&amp;ssl=1 768w, https://i0.wp.com/david.currie.name/wp-content/uploads/2021/02/lepe.jpg?w=1024&amp;ssl=1 1024w" sizes="auto, (max-width: 150px) 100vw, 150px" /></figure></div>



<p>Christine and I celebrated our 20th wedding anniversary although it wasn&#8217;t exactly the big family get together that we had originally planned. We did see Christine&#8217;s parents the following day as they passed through having finally picked up their electric car. A friend&#8217;s 50th birthday and a walk at Lepe took us to the end of the holidays.</p>



<p>September saw the children both return back to school and it was suddenly very quiet during the day with just Christine and myself ensconced at opposite ends of the house. It was great to see them fall straight back in with their friends though. They&#8217;d only been back a week when Emma went back to Basingstoke for an MRI scan and came away with an inflatable boot that meant she needed ferrying to and fro from school. The staggered start to the school day meant the traffic wasn&#8217;t too much of a trial.</p>



<p>I took Duncan along to a SCJS training session at Ash Ranges which was a welcome diversion. A mix up over dates did mean that we ended up going two weeks in a row though! Orienteering events also resumed with a SOC event held at Hincheslea. Forestry England constraints meant that we were limited to thirty competitors which was a shame.</p>



<p>One upside to the pandemic has been the rise of the virtual conference. I was given a free ticket to a GOTO conference which had some great content.  CloudBees also had its annual DevOps World conference and saw a massive increase in participation over the usual in-person event. It was, however, also very nice to meet up face-to-face with the CloudBees Whitely crew for a sociable pub lunch.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3030</post-id>	</item>
	</channel>
</rss>
