<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Christopher Law</title><link>https://chrislaw.dev/</link><description>Recent content on Christopher Law</description><generator>Hugo</generator><language>en-gb</language><lastBuildDate>Mon, 01 Jun 2026 21:00:00 +0000</lastBuildDate><atom:link href="https://chrislaw.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Garage Rack Upgrade: Power, Networking and Resilience (2026)</title><link>https://chrislaw.dev/2026/06/01/garage-rack-upgrade-2026/</link><pubDate>Mon, 01 Jun 2026 21:00:00 +0000</pubDate><guid>https://chrislaw.dev/2026/06/01/garage-rack-upgrade-2026/</guid><description>&lt;p&gt;During May 2026 I made a fairly substantial round of improvements to the detached garage rack that supports the wider Promethix platform. This was not just a cosmetic tidy-up. The work was aimed at improving power resilience, separating failure domains, cleaning up management access, and making the rack a more solid foundation for future growth.&lt;/p&gt;
&lt;p&gt;The garage already benefits from a 5 kW solar installation fitted in 2024, backed by three battery storage units that provide substantial energy capacity for overnight and low-generation periods. During the solar installation a new consumer unit was also fitted, which created a sensible base for later electrical work around the rack.&lt;/p&gt;</description></item><item><title>From K3s Alpha to RKE2 Delta</title><link>https://chrislaw.dev/2026/05/18/k3s-alpha-to-rke2-delta/</link><pubDate>Mon, 18 May 2026 12:00:00 +0000</pubDate><guid>https://chrislaw.dev/2026/05/18/k3s-alpha-to-rke2-delta/</guid><description>&lt;p&gt;In my earlier post, &lt;a href="https://chrislaw.dev/2026/03/13/homelab-infrastructure-2026/"&gt;Homelab Infrastructure Overview (2026)&lt;/a&gt;, I described the broader shape of the platform and noted that K3s was still current, with RKE2 as the likely next step.&lt;/p&gt;
&lt;p&gt;That migration has now happened.&lt;/p&gt;
&lt;p&gt;This is a short engineering update on what changed moving from the old &lt;code&gt;K3s alpha&lt;/code&gt; cluster to the new &lt;code&gt;RKE2 delta&lt;/code&gt; cluster, and why the main improvement was not just the distribution itself, but the sharper separation between platform infrastructure and application workloads.&lt;/p&gt;</description></item><item><title>Homelab Infrastructure Overview (2026)</title><link>https://chrislaw.dev/2026/03/13/homelab-infrastructure-2026/</link><pubDate>Fri, 13 Mar 2026 12:00:00 +0000</pubDate><guid>https://chrislaw.dev/2026/03/13/homelab-infrastructure-2026/</guid><description>&lt;p&gt;My earlier post on the Red Hat oVirt cluster captured a specific point in time in the evolution of my home platform. Since then, the environment has changed substantially. What started as a traditional homelab has become something much closer to a small enterprise infrastructure platform: virtualisation, segmented networking, shared storage, Kubernetes, automation, GPU workloads, and a mixture of personal, development, and real hosted services.&lt;/p&gt;
&lt;p&gt;This post is a high-level overview of where the platform stands in 2026.&lt;/p&gt;</description></item><item><title>AdoScope - Scoped Unit of Work Pattern for Dapper &amp; ADO.NET</title><link>https://chrislaw.dev/2025/04/18/adoscope-scoped-unit-of-work-pattern-for-dapper-ado-net/</link><pubDate>Fri, 18 Apr 2025 19:13:03 +0000</pubDate><guid>https://chrislaw.dev/2025/04/18/adoscope-scoped-unit-of-work-pattern-for-dapper-ado-net/</guid><description>&lt;p&gt;I’ve published a small NuGet package called &lt;strong&gt;AdoScope&lt;/strong&gt; that brings a scoped Unit of Work pattern to Dapper and ADO.NET, without the need to hand-roll your own classes.&lt;/p&gt;
&lt;p&gt;It’s heavily inspired by the excellent &lt;code&gt;DbContextScope&lt;/code&gt; from the EF world (which I’ve used many times), but designed for raw ADO.NET and Dapper.&lt;/p&gt;
&lt;p&gt;AdoScope takes care of &lt;code&gt;DbConnection&lt;/code&gt; and &lt;code&gt;DbTransaction&lt;/code&gt; management behind the scenes, so there’s no need to pass transactions around or write boilerplate Unit of Work code, just clean, focused repository logic.&lt;/p&gt;</description></item><item><title>Clean Code - Something to Contemplate</title><link>https://chrislaw.dev/2023/10/22/clean-code-something-to-contemplate/</link><pubDate>Sun, 22 Oct 2023 21:19:57 +0000</pubDate><guid>https://chrislaw.dev/2023/10/22/clean-code-something-to-contemplate/</guid><description>&lt;p&gt;A former colleague of mine used to say, "&lt;em&gt;Savings will be made, whatever the cost&lt;/em&gt;"; a good quote, I thought.&lt;/p&gt;
&lt;p&gt;What I've learnt from &lt;strong&gt;Robert C. Martin AKA Uncle Bob&lt;/strong&gt;, founder of the &lt;strong&gt;agile manifesto&lt;/strong&gt;, is something to contemplate.&lt;/p&gt;
&lt;h2 class="wp-block-heading"&gt;Why are Programmers Slow?&lt;/h2&gt;
&lt;p&gt;Programmers are slow because they started fast, excited about the new project to build, and without establishing a solid design and architecture. They reach a point where they are only 1% of their productivity when they started.&lt;/p&gt;</description></item><item><title>Troubleshooting VM Launch Issues with OVN Networks in oVirt Clusters</title><link>https://chrislaw.dev/2020/11/23/ovirt-ovn-provider-and-openvswitch-networking/</link><pubDate>Mon, 23 Nov 2020 20:21:00 +0000</pubDate><guid>https://chrislaw.dev/2020/11/23/ovirt-ovn-provider-and-openvswitch-networking/</guid><description>&lt;p&gt;Adding a new node to an existing oVirt Cluster should be a seamless process, but sometimes you hit a snag. That's exactly what happened to me recently when I realized that only virtual machines (VMs) without an OVN network were launching. For those who might not be familiar, OVN (Open Virtual Network) is a system that provides network virtualization to containers and VMs, and it's a critical component for managing external VM networks within oVirt's infrastructure.&lt;/p&gt;</description></item><item><title>Solving the AMD Reset Bug in oVirt and KVM Environments</title><link>https://chrislaw.dev/2020/11/23/amd-reset-bug-gfx-passthrough-ovirt/</link><pubDate>Mon, 23 Nov 2020 20:11:09 +0000</pubDate><guid>https://chrislaw.dev/2020/11/23/amd-reset-bug-gfx-passthrough-ovirt/</guid><description>&lt;p&gt;If you're navigating the complexities of virtualization management systems, you might share my recent challenge with Red Hat's oVirt, the open-source virtualization management platform. For those unfamiliar, oVirt orchestrates virtual machines, manages resources, and provides a centralized interface for distributed computing environments. It's worth noting that while my experience is with oVirt, the insights I've gained may also benefit those working with KVM or XEN—especially KVM, since it's the underlying technology in oVirt.&lt;/p&gt;</description></item><item><title>RedHat oVirt Cluster</title><link>https://chrislaw.dev/redhat-ovirt-cluster/</link><pubDate>Mon, 20 Jul 2020 13:19:44 +0000</pubDate><guid>https://chrislaw.dev/redhat-ovirt-cluster/</guid><description>&lt;p&gt;This describes the evolution of my personal home lab.&lt;/p&gt;
&lt;p&gt;It's a Red Hat oVirt Cluster with Shared Storage…&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The garage rack consists of: -&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;x3 Compute Nodes, x2 Storage Nodes (connected via 20gbit teamed SAN)&lt;/li&gt;&lt;li&gt;1500W UPS&lt;/li&gt;&lt;li&gt;x1 Physical oVirt Engine Server, x1 Physical AD Controller, x1 Raspberry PI with PiHole. &lt;/li&gt;&lt;li&gt;x24 port gigabit switch with x2 10gbit SFP+ to network cab&lt;/li&gt;&lt;li&gt;x8 port 10gbit SFP+ switch - dedicated for the SAN&lt;/li&gt;&lt;li&gt;x4 dedicated physical gigabit or greater networks - bulk file transfer, management, extranet, SAN&lt;/li&gt;&lt;li&gt;Several VLANs / VNETs including OVN port isolated vswitches for client VM isolation&lt;/li&gt;&lt;li&gt;x4 GPU VM passthrough cards in a multi GPU chassis (the black 4u with temp gauge) two of which run via a 50m underground cable to my house which I use as desktops. The others perform CAD rendering and transcoding operations.&lt;/li&gt;&lt;li&gt;Nested Virtualisation Enabled&lt;/li&gt;&lt;li&gt;Live Migration Enabled&lt;/li&gt;&lt;li&gt;Multi-node Load Balancing (provided by OPNsense) - network cab in the house&lt;/li&gt;&lt;li&gt;TrueNAS Core SAN nodes, mixture of NVMe and Rust Z2 but hoping to switch to TrueNAS SCALE when it's officially release for GlusterFS.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;House network cabinet: -&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Cisco 8851 and FreePBX</title><link>https://chrislaw.dev/2019/12/30/cisco-8851-and-freepbx-2/</link><pubDate>Mon, 30 Dec 2019 15:51:37 +0000</pubDate><guid>https://chrislaw.dev/2019/12/30/cisco-8851-and-freepbx-2/</guid><description>&lt;p&gt;As promised:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://chrislaw.dev/cisco-8851-and-freepbx-configuration/"&gt;Cisco 8851 and FreePBX Configuration&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Cisco 8851 and FreePBX Configuration</title><link>https://chrislaw.dev/cisco-8851-and-freepbx-configuration/</link><pubDate>Mon, 30 Dec 2019 15:43:26 +0000</pubDate><guid>https://chrislaw.dev/cisco-8851-and-freepbx-configuration/</guid><description>&lt;p&gt;See below the current configuration files for Cisco 8851 and FreePBX. So far this is just a dump of the config to help someone get started. I'll be providing more detail and a break down later.&lt;/p&gt;
&lt;p&gt;It's worth noting I also had to downgrade the phone firmware to sip88xx.10-2-2-16 before this all would work.&lt;/p&gt;
&lt;p&gt;I also found the following sites helpful:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a aria-label=" (opens in a new tab)" href="http://usecallmanager.nz/sepmac-cnf-xml.html" target="_blank" rel="noreferrer noopener"&gt;usecallmanager.nz sepmac cnf guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a aria-label=" (opens in a new tab)" href="https://wiki.freepbx.org/display/FOP/Cisco#Cisco-PatchingAsterisk" target="_blank" rel="noreferrer noopener"&gt;FreePBX Cisco patching notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Key points of note:&lt;/p&gt;</description></item><item><title>Cisco 8851 and FreePBX</title><link>https://chrislaw.dev/2019/12/29/cisco-8851-and-freepbx/</link><pubDate>Sun, 29 Dec 2019 16:59:46 +0000</pubDate><guid>https://chrislaw.dev/2019/12/29/cisco-8851-and-freepbx/</guid><description>&lt;p&gt;Having just spend a few days settings up a Cisco 8851 to work with FreePBX, I'll write an article shortly posting all my configs for this, hopefully save someone time one day.&lt;/p&gt;
&lt;figure class="wp-block-gallery columns-2 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex gallery-half"&gt;&lt;ul class="blocks-gallery-grid"&gt;&lt;li class="blocks-gallery-item"&gt;&lt;figure&gt;&lt;img loading="lazy" decoding="async" src="https://chrislaw.dev/wp-content/uploads/2019/12/IMG-20191227-WA0003-scaled.jpeg" alt="" /&gt;&lt;/figure&gt;&lt;/li&gt;&lt;li class="blocks-gallery-item"&gt;&lt;figure&gt;&lt;img loading="lazy" decoding="async" src="https://chrislaw.dev/wp-content/uploads/2019/12/Snapchat-1351310140.jpg" alt="" /&gt;&lt;/figure&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/figure&gt;</description></item><item><title>Christopher Law (BSc Hons)</title><link>https://chrislaw.dev/cv/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://chrislaw.dev/cv/</guid><description/></item></channel></rss>