<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Christopher Law</title><link>https://chrislaw.dev/posts/</link><description>Recent content in Posts on Christopher Law</description><generator>Hugo</generator><language>en-gb</language><lastBuildDate>Fri, 13 Mar 2026 12:00:00 +0000</lastBuildDate><atom:link href="https://chrislaw.dev/posts/index.xml" rel="self" type="application/rss+xml"/><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>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</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></channel></rss>