<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Simon Morgan</title>
		<link>/</link>
		<description>Recent content on Simon Morgan</description>
		<generator>Hugo</generator>
		<language>en</language>
		
		
		
		
			<lastBuildDate>Sat, 16 May 2026 17:17:08 +0100</lastBuildDate>
		
			<atom:link href="/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>MikroTik hEX S (2025) AAISP Configuration</title>
				<link>/blog/hex-s-2025-aaisp/</link>
				<pubDate>Sat, 16 May 2026 17:17:08 +0100</pubDate>
				<guid>/blog/hex-s-2025-aaisp/</guid>
				<description>&lt;p&gt;In my never-ending quest to screw up my Internet connection, I bought a&#xA;&lt;a href=&#34;https://mikrotik.com/product/hex_s_2025&#34;&gt;MikroTik hEX S (2025)&lt;/a&gt;, otherwise&#xA;known by the slightly less catchy &amp;ldquo;E60iUGS&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;I used to have a&#xA;&lt;a href=&#34;https://mikrotik.com/product/RB2011UiAS-2HnD-IN&#34;&gt;RB2011UiAS-2HnD-IN&lt;/a&gt; which&#xA;generally served me well, except the WiFi on it was well past its prime, so I&#xA;bought some TP-Link Deco X55s. When they work, they&amp;rsquo;re alright; the trouble is&#xA;they don&amp;rsquo;t work a lot more often than I&amp;rsquo;d like. they went through a phase where&#xA;they&amp;rsquo;d constantly lose connection to each other, but that seems to have been&#xA;fixed (I assume) with a firmware upgrade. Speaking of firmware upgrades,&#xA;upgrading the firmware on them was always a nerve-racking experience as they&amp;rsquo;d&#xA;always display the red-blinking-light-of-doom for a few minutes afterwards, even&#xA;though eventually things would settle down. Combined with the fact that the&#xA;settings are also extremely limited and you have to manage them via an app, I am&#xA;not a fan of them. They&amp;rsquo;ve now been relegated to access points, and the hEX S is&#xA;doing all the good stuff.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Goodbye Aquiss</title>
				<link>/blog/goodbye-aquiss/</link>
				<pubDate>Fri, 01 May 2026 23:05:12 +0100</pubDate>
				<guid>/blog/goodbye-aquiss/</guid>
				<description>&lt;p&gt;By my reckoning I&amp;rsquo;ve been using &lt;a href=&#34;https://aquiss.net/&#34;&gt;Aquiss&lt;/a&gt; as my ISP for over&#xA;10 years. Needless to say, I&amp;rsquo;ve been pretty happy with them.&lt;/p&gt;&#xA;&lt;p&gt;I like small ISPs because I like to think they give a shit about their&#xA;customers. At the other end of the spectrum, you have Big Tech™ companies like&#xA;Google and Cloudflare whose only motivation seems to be to get as rich and&#xA;powerful as possible by exploiting their customers and users to the maximum&#xA;extent they can get away with (and sometimes beyond).&lt;/p&gt;</description>
			</item>
			<item>
				<title>Diagnosing DbContext disposed InvalidOperationException</title>
				<link>/blog/diagnosing-dbcontext-disposed/</link>
				<pubDate>Wed, 19 Feb 2025 19:37:58 +0000</pubDate>
				<guid>/blog/diagnosing-dbcontext-disposed/</guid>
				<description>&lt;p&gt;While working on a large project that uses the unit of work pattern (and other&#xA;things that generally make it harder to debug), I was getting an&#xA;InvalidOperationException with an error about the DbContext being disposed.&lt;/p&gt;&#xA;&lt;p&gt;It wasn&amp;rsquo;t obvious where this was happening, so I came up with the following:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-cs&#34; data-lang=&#34;cs&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;using&lt;/span&gt; System.Diagnostics;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;namespace&lt;/span&gt; My.Cool.Project&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;CustomDbContext&lt;/span&gt; : MyActualDbContext&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;protected&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;override&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; Dispose(&lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; disposing)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (disposing)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Debug.WriteLine(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Disposing CustomDbContext&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;base&lt;/span&gt;.Dispose(disposing);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace your DbContext with the above like this:&lt;/p&gt;</description>
			</item>
			<item>
				<title>ELEGOO UNO R3 Notes</title>
				<link>/blog/elegoo-uno-r3-notes/</link>
				<pubDate>Sun, 09 Feb 2025 18:25:29 +0000</pubDate>
				<guid>/blog/elegoo-uno-r3-notes/</guid>
				<description>&lt;p&gt;I&amp;rsquo;ve been farting around with an ELEGOO &lt;a href=&#34;https://docs.arduino.cc/hardware/uno-rev3/&#34;&gt;UNO R3&lt;/a&gt;&#xA;(that came as part of their &lt;a href=&#34;https://www.elegoo.com/en-gb/blogs/arduino-projects/elegoo-uno-project-basic-starter-kit-tutorial&#34;&gt;Basic Starter Kit&lt;/a&gt;),&#xA;today. I think it&amp;rsquo;s a pretty old-hat device at this point, but I thought I&amp;rsquo;d&#xA;put some notes here, mainly for my future self, but also in case anybody else&#xA;might find them useful.&lt;/p&gt;&#xA;&lt;h2 id=&#34;documentation&#34;&gt;Documentation&lt;/h2&gt;&#xA;&lt;p&gt;The tutorials and documentation distributed by ELEGOO is quite old at this&#xA;point, and not very well written or presented. Fortunately, there isn&amp;rsquo;t much&#xA;need to use it, as the device seems to be exactly the same as the&#xA;&lt;a href=&#34;https://www.adafruit.com/product/4806&#34;&gt;Adafruit UNO R3&lt;/a&gt;, so all of their&#xA;&lt;a href=&#34;https://learn.adafruit.com/lesson-0-getting-started&#34;&gt;UNO R3 documentation&lt;/a&gt;&#xA;should apply. No need to run any of their software either; just download the&#xA;latest version of &lt;a href=&#34;https://www.arduino.cc/en/software&#34;&gt;Arduino IDE&lt;/a&gt; and it&#xA;should work out-of-the-box. If you&amp;rsquo;re using Windows, it&amp;rsquo;s probably best to&#xA;install Arduino IDE before connecting the UNO to your PC because Arduino IDE&#xA;installs a bunch of drivers that you&amp;rsquo;ll need for it to work.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Google Play Notifications Bug</title>
				<link>/blog/google-play-notifications-bug/</link>
				<pubDate>Wed, 22 Mar 2023 20:50:24 +0000</pubDate>
				<guid>/blog/google-play-notifications-bug/</guid>
				<description>&lt;p&gt;In Google Play, the bell icon next to the search box was saying I have 1 unread&#xA;notification. However, when I tap the icon, there are no notifications listed, and&#xA;nothing in the &amp;ldquo;Offers&amp;rdquo; tab either.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;/images/google-play-notifications-bug-1.jpg&#34; alt=&#34;Google Play notifications bug&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I tried force stopping the app, clearing the cache and restarting, as well as&#xA;restarting my phone, but neither made any difference.&lt;/p&gt;&#xA;&lt;p&gt;After speaking to Google support, the &amp;ldquo;solution&amp;rdquo; turned out to be uninstalling&#xA;all Google Play app updates. This got rid of the phantom notifications, even&#xA;after Google Play was updated to the latest version.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Useful SQL Scripts</title>
				<link>/blog/useful-sql-scripts/</link>
				<pubDate>Fri, 16 Sep 2022 23:05:07 +0100</pubDate>
				<guid>/blog/useful-sql-scripts/</guid>
				<description>&lt;p&gt;I&amp;rsquo;ve had these SQL Server scripts kicking around on my hard drive for a while&#xA;now, so thought I&amp;rsquo;d post them here for posterity.&lt;/p&gt;&#xA;&lt;h3 id=&#34;find-duplicate-foreign-keys&#34;&gt;Find Duplicate Foreign-keys&lt;/h3&gt;&#xA;&lt;p&gt;For some reason SQL Server allows duplicate foreign keys. This script finds them&#xA;for you.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;WITH&lt;/span&gt; FKData&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; fk.parent_object_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ,fkc.parent_column_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ,fk.referenced_object_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ,fkc.referenced_column_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ,FKCount &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;COUNT&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; sys.foreign_keys fk&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;INNER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; sys.foreign_key_columns fkc &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; fkc.constraint_object_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fk.object_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;GROUP&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;BY&lt;/span&gt; fk.parent_object_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ,fkc.parent_column_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ,fk.referenced_object_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ,fkc.referenced_column_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;HAVING&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;COUNT&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ,DuplicateFK&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; FKName &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fk.Name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ,ParentSchema &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; s1.Name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ,ParentTable &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; t1.Name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ,ParentColumn &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; c1.Name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ,ReferencedTable &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; t2.Name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ,ReferencedColumn &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; c2.Name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; sys.foreign_keys fk&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;INNER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; sys.foreign_key_columns fkc &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; fkc.constraint_object_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fk.object_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;INNER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; FKData f &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; fk.parent_object_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; f.parent_object_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;AND&lt;/span&gt; fk.referenced_object_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; f.referenced_object_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;AND&lt;/span&gt; fkc.parent_column_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; f.parent_column_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;AND&lt;/span&gt; fkc.referenced_column_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; f.referenced_column_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;INNER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; sys.tables t1 &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; f.parent_object_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; t1.object_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;INNER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; sys.columns c1 &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; f.parent_object_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; c1.object_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;AND&lt;/span&gt; f.parent_column_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; c1.column_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;INNER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; sys.schemas s1 &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; t1.schema_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; s1.schema_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;INNER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; sys.tables t2 &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; f.referenced_object_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; t2.object_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;INNER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;JOIN&lt;/span&gt; sys.columns c2 &lt;span style=&#34;color:#66d9ef&#34;&gt;ON&lt;/span&gt; f.referenced_object_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; c2.object_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;AND&lt;/span&gt; f.referenced_column_id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; c2.column_id&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;SELECT&lt;/span&gt; FKName&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ,ParentSchema&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ,ParentTable&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ,ParentColumn&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ,ReferencedTable&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ,ReferencedColumn&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ,DropStmt &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ALTER TABLE &amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; ParentSchema &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; ParentTable &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; DROP CONSTRAINT &amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; FKName&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; DuplicateFK&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;ORDER&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;BY&lt;/span&gt; ParentTable&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ,FKName&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;find-auto-generated-key-names&#34;&gt;Find Auto-generated Key Names&lt;/h3&gt;&#xA;&lt;p&gt;When creating foreign-keys, SQL Server allows you to neglect to specify a name&#xA;for them, and instead generated a name for you. This script finds them for you&#xA;so you can give them a better one.&lt;/p&gt;</description>
			</item>
			<item>
				<title>.NET Console App User Secrets</title>
				<link>/blog/net-console-app-user-secrets/</link>
				<pubDate>Wed, 20 Apr 2022 19:35:35 +0100</pubDate>
				<guid>/blog/net-console-app-user-secrets/</guid>
				<description>&lt;p&gt;When scaffolding an EF Core .NET 6 console app recently, I discovered the it&#xA;doesn&amp;rsquo;t support sourcing connection strings from the user secrets store unless&#xA;you&amp;rsquo;re scaffolding an ASP.NET project. A lot of the documentation on the web,&#xA;both from Microsoft and third-parties, also seems to assume that you&amp;rsquo;re using&#xA;ASP.NET.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s how I got it working with the minimum of fuss.&lt;/p&gt;&#xA;&lt;p&gt;Create a user secrets store and add your secrets to it:&lt;/p&gt;</description>
			</item>
			<item>
				<title>DrayTek Vigor 130 and MikroTik RB2011UiAS-2HnD-IN</title>
				<link>/blog/vigor-130-mikrotik/</link>
				<pubDate>Sat, 05 Mar 2022 11:43:01 +0000</pubDate>
				<guid>/blog/vigor-130-mikrotik/</guid>
				<description>&lt;p&gt;If you just want to get the damn thing working as a modem (referred to as&#xA;&amp;ldquo;&lt;a href=&#34;https://www.draytek.co.uk/support/guides/kb-vigor-130-bridge&#34;&gt;bridge mode&lt;/a&gt;&amp;rdquo; in&#xA;the DrayTek documentation) with your router, but don&amp;rsquo;t want to read about the&#xA;ballache I had to go through&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Select &amp;ldquo;Enable&amp;rdquo; on the &amp;ldquo;MPoA / Static or dynamic IP&amp;rdquo; page&lt;/li&gt;&#xA;&lt;li&gt;Select &amp;ldquo;1483 Bridged IP VC-Mux&amp;rdquo; from the &amp;ldquo;Encapsulation&amp;rdquo; drop-down on the&#xA;same page&lt;/li&gt;&#xA;&lt;li&gt;Click &amp;ldquo;OK&amp;rdquo; to save and restart the &amp;ldquo;modem&amp;rdquo;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;If you want to hear me have a good moan about the device, read on.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Wayback Machine Bookmarklet</title>
				<link>/blog/wayback-machine-bookmarklet/</link>
				<pubDate>Thu, 21 Oct 2021 18:42:48 +0100</pubDate>
				<guid>/blog/wayback-machine-bookmarklet/</guid>
				<description>&lt;p&gt;I&amp;rsquo;ve come up with the following bookmarklet for searching the Internet Archive&amp;rsquo;s&#xA;fantastic Wayback Machine for the current URL and thought I&amp;rsquo;d share it.&lt;/p&gt;&#xA;&lt;p&gt;I found an existing bookmarklet that purported to do this, but it included the&#xA;protocol scheme (the e.g. &lt;code&gt;http://&lt;/code&gt; part) in the lookup string, which meant it&#xA;didn&amp;rsquo;t work. I&amp;rsquo;m not a fan of the regular expressions, but this was more&#xA;succinct than constructing the lookup string via the&#xA;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/Location&#34;&gt;Location&lt;/a&gt; object&#xA;provided by the browser.&lt;/p&gt;</description>
			</item>
			<item>
				<title>SDL2 on Windows with MSVC without Visual Studio</title>
				<link>/blog/sdl2-msvc-without-visual-studio/</link>
				<pubDate>Mon, 18 Oct 2021 18:31:45 +0100</pubDate>
				<guid>/blog/sdl2-msvc-without-visual-studio/</guid>
				<description>&lt;p&gt;I&amp;rsquo;ve been interested in learning some low-level graphics programming and so&#xA;figured a good way to do it would be via &lt;a href=&#34;https://www.libsdl.org/&#34;&gt;SDL&lt;/a&gt; and C.&lt;/p&gt;&#xA;&lt;p&gt;I already had Microsoft&amp;rsquo;s C compiler available as I had a minimal (as much as&#xA;anything to do with Microsoft or Visual Studio can be called minimal) Visual&#xA;Studio Build Tools installation for &lt;a href=&#34;https://www.rust-lang.org/&#34;&gt;Rust&lt;/a&gt;&#xA;development, but I didn&amp;rsquo;t want to have to install the bloated mess that is&#xA;Visual Studio.&lt;/p&gt;</description>
			</item>
			<item>
				<title>ASP.NET Web Forms web site assembly definition errors</title>
				<link>/blog/asp-net-refresh-assemblies/</link>
				<pubDate>Fri, 13 Nov 2020 00:00:00 +0000</pubDate>
				<guid>/blog/asp-net-refresh-assemblies/</guid>
				<description>&lt;p&gt;I have the unfortunate task of having to work with an ASP.NET Web Forms web site&#xA;and have frequently had to deal with errors like the following:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;Could not load file or assembly &#39;Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed&#39; or one of its dependencies. The located assembly&#39;s manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;This usually happens when switching from one branch to another in Git. Copying&#xA;the correct assembly into the Bin directory didn&amp;rsquo;t help because it would just&#xA;get replaced on build.&lt;/p&gt;</description>
			</item>
			<item>
				<title>sp_MSforeachtable Table Filtering</title>
				<link>/blog/sp_msforeachtable-filtering/</link>
				<pubDate>Wed, 05 Aug 2020 00:00:00 +0000</pubDate>
				<guid>/blog/sp_msforeachtable-filtering/</guid>
				<description>&lt;p&gt;SQL Server provides the handy &lt;code&gt;sp_MSforeachtable&lt;/code&gt; stored procedure for executing&#xA;the specified T-SQL for each table in a database. But what if you only want to&#xA;run it for certain tables? I found myself in this boat but a bunch of the&#xA;recommendations I came across didn&amp;rsquo;t work. The &lt;code&gt;whereand&lt;/code&gt; parameter was clearly&#xA;what I wanted. However, say we wanted to filter out all tables whos names&#xA;didn&amp;rsquo;t start with &amp;ldquo;Foo&amp;rdquo;:&lt;/p&gt;</description>
			</item>
			<item>
				<title>WiFi Calling and the Billion 8800NL R2</title>
				<link>/blog/moto-g7-power-wifi-calling/</link>
				<pubDate>Sun, 03 May 2020 00:00:00 +0000</pubDate>
				<guid>/blog/moto-g7-power-wifi-calling/</guid>
				<description>&lt;p&gt;I have a Moto G7 Power (XT1955-4) and recently switched to EE because they&#xA;support WiFi calling with that model. The trouble is, I could not for the life&#xA;of me get it working. The WiFi calling setting was enabled but whenever I&amp;rsquo;d go&#xA;to make a call, I&amp;rsquo;d get an error telling me to connect to a wireless network.&#xA;Needless to say I was connected to my WiFi and had no connectivity issues.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Verifying RSA signatures using .NET and C#</title>
				<link>/blog/rsa-file-signing/</link>
				<pubDate>Sat, 29 Feb 2020 00:00:00 +0000</pubDate>
				<guid>/blog/rsa-file-signing/</guid>
				<description>&lt;p&gt;I recently found myself wanting a system to cryptographically sign and verify&#xA;files. I came up with the following method which uses a combination of the&#xA;OpenSSL command-line utility and the .NET RSA class. I used the version that&amp;rsquo;s&#xA;part of .NET Core 3.1.&lt;/p&gt;&#xA;&lt;p&gt;This post assumes some familiarity with encryption, specifically public/private&#xA;key encryption.&lt;/p&gt;&#xA;&lt;p&gt;First we generate the public and private keys and sign the file:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# Generate the private key.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;openssl genpkey -algorithm rsa -out privkey.pem -pkeyopt rsa_keygen_bits:4096&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# Generate the corresponding public key&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;openssl rsa -in privkey.pem -outform PEM -pubout -out pubkey.pem&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# Sign important.zip, storing the signature in important.zip.sig&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;openssl dgst -sha256 -sign privkey.pem -out important.zip.sig important.zip&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The code for verifying the file signature should be fairly straightforward. By&#xA;default OpenSSL stores the keys in PEM format. The .NET cryptography library&#xA;doesn&amp;rsquo;t seem to support loading these directly and so I had to write some&#xA;supporting code for wrangling the PEM file into a format that the RSA class&#xA;would like, specifically a byte array.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Windows Services, Named Pipes and UnauthorizedAccessException</title>
				<link>/blog/named-pipe-acl/</link>
				<pubDate>Fri, 14 Feb 2020 00:00:00 +0000</pubDate>
				<guid>/blog/named-pipe-acl/</guid>
				<description>&lt;p&gt;I was working on some proof-of-concept code whereby an unpriviledged client&#xA;would communicate with a Windows service using&#xA;&lt;a href=&#34;https://github.com/protobuf-net/protobuf-net&#34;&gt;protocol buffer serialization&lt;/a&gt;&#xA;over a&#xA;&lt;a href=&#34;https://docs.microsoft.com/en-us/dotnet/standard/io/how-to-use-named-pipes-for-network-interprocess-communication&#34;&gt;named pipe&lt;/a&gt;.&#xA;I was doing this using .NET Core 3.1 and the&#xA;&lt;a href=&#34;https://www.nuget.org/packages/Microsoft.Windows.Compatibility/&#34;&gt;Microsoft.Windows.Compatibility&lt;/a&gt;&#xA;package.&lt;/p&gt;&#xA;&lt;p&gt;The transmission of the data between the processes worked great when I was just&#xA;using two unpriviledged console apps. I started running into issues when I made&#xA;the switch to a Windows service. Sending data from an unpriviledged process to&#xA;a Windows service doesn&amp;rsquo;t seem to work by default as Windows services run with&#xA;elevated priviledges. When trying to send data from the client I&amp;rsquo;d get the&#xA;following exception:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Swashbuckle generates incorrect Swagger API URL</title>
				<link>/blog/swashbuckle-uses-incorrect-api-url/</link>
				<pubDate>Thu, 16 Jan 2020 00:00:00 +0000</pubDate>
				<guid>/blog/swashbuckle-uses-incorrect-api-url/</guid>
				<description>&lt;p&gt;I recently encountered an issue while using&#xA;&lt;a href=&#34;https://github.com/domaindrivendev/Swashbuckle.AspNetCore&#34;&gt;Swashbuckle&lt;/a&gt; whereby&#xA;everything would work fine when running it locally but the deployed version&#xA;would use incorrect API URLs.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;https://server.example.net/app/foo/bar?a=123&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;would become&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;https://server.example.net/foo/bar?a=123&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;The issue seems to be caused by the fact that &lt;code&gt;server.example.net&lt;/code&gt; is an API&#xA;gateway. This seems to prevent Swashbuckle from correctly inferring the URL of&#xA;the ASP.NET Core app and so it doesn&amp;rsquo;t generate the&#xA;&lt;a href=&#34;https://swagger.io/specification/#serverObject&#34;&gt;server&lt;/a&gt; part of the schema. This&#xA;results in API requests (i.e. &lt;code&gt;/foo/bar?a=123&lt;/code&gt;) getting sent to the root of the&#xA;server.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Compound primary keys and NHibernate event listeners</title>
				<link>/blog/nhibernate-compound-key-listener/</link>
				<pubDate>Thu, 07 Nov 2019 19:44:41 +0000</pubDate>
				<guid>/blog/nhibernate-compound-key-listener/</guid>
				<description>&lt;p&gt;Recently I had to write some code to log CUD operations done via NHibernate. The&#xA;requirement was to log the following:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The type of operation (insert, update, delete)&lt;/li&gt;&#xA;&lt;li&gt;The primary key property name(s) and value(s) of the entity being operated on&lt;/li&gt;&#xA;&lt;li&gt;For updates, the property name(s) and the old and new values&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;It was pretty straightforward apart from retrieving the primary key. If the key&#xA;is a &lt;a href=&#34;http://foldoc.org/scalar&#34;&gt;scalar&lt;/a&gt; then it&amp;rsquo;s pretty straightforward:&lt;/p&gt;</description>
			</item>
			<item>
				<title>HashSet, IEquatable and Contains</title>
				<link>/blog/hashset-and-iequatable/</link>
				<pubDate>Thu, 05 Sep 2019 18:47:41 +0100</pubDate>
				<guid>/blog/hashset-and-iequatable/</guid>
				<description>&lt;p&gt;I recently came across some unintuitive and confusing (but understandable)&#xA;behaviour when dealing with &lt;code&gt;HashSet&amp;lt;T&amp;gt; where T : IEquatable&lt;/code&gt;. I&amp;rsquo;d written a&#xA;class that implemented &lt;code&gt;IEquatable&lt;/code&gt; based purely on the ID of the object. The&#xA;trouble was that &lt;code&gt;HashSet.Contains&lt;/code&gt; was saying that it didn&amp;rsquo;t contain the&#xA;object I was passing it even though it contained an object with the same ID.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s a trimmed-down example that exhibits the same behaviour:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Windows Store Error Code 0x80070005</title>
				<link>/blog/windows-store-error-code-0x80070005/</link>
				<pubDate>Sat, 13 Jul 2019 11:44:50 +0100</pubDate>
				<guid>/blog/windows-store-error-code-0x80070005/</guid>
				<description>&lt;p&gt;I recently starting an issue where none of the programs I&amp;rsquo;ve installed via the&#xA;Windows Store would update. Specifically they&amp;rsquo;d fail during the installation&#xA;with an error code of 0x80070005 with no actual description of what the problem&#xA;is (Microsoft still&#xA;&lt;a href=&#34;/images/1200px-PC_Load_Letter.jpg&#34;&gt;erroring like it&amp;rsquo;s 1989&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;I searched all over the place but either I wasn&amp;rsquo;t willing to try the solutions&#xA;because they were unreasonable, such as wiping my user profile because&#xA;it &lt;em&gt;might&lt;/em&gt; be corrupted with no way of checking whether this was actually the&#xA;case, or they simply didn&amp;rsquo;t work.&lt;/p&gt;</description>
			</item>
			<item>
				<title>ASUS RT-N66U IPv6 with Merlin</title>
				<link>/blog/rt-n66u-ipv6-merlin/</link>
				<pubDate>Sun, 09 Jun 2019 18:28:57 +0100</pubDate>
				<guid>/blog/rt-n66u-ipv6-merlin/</guid>
				<description>&lt;p&gt;In a &lt;a href=&#34;/blog/rt-n66u-ipv6/&#34;&gt;previous post&lt;/a&gt; I described how to get&#xA;IPv6 working on the ASUS RT-N66U using the stock firmware. I&amp;rsquo;ve since switched&#xA;to using the unofficial &lt;a href=&#34;https://asuswrt.lostrealm.ca/&#34;&gt;Merlin&lt;/a&gt; firmware.&lt;/p&gt;&#xA;&lt;p&gt;While the settings in the previous article still apply, Merlin has more settings&#xA;exposed and, at least in my case, failing to change the &lt;em&gt;Prefix Length&lt;/em&gt; from&#xA;the default &lt;em&gt;64&lt;/em&gt; to &lt;em&gt;56&lt;/em&gt; left IPv6 in a broken state. This led to various&#xA;network issues such as avatars in the Twitter app taking forever to load, Steam&#xA;being dog-slow on my Ubuntu 18.10 laptop etc.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Amazon Fire HD 8 System Apps on Home Screen</title>
				<link>/blog/fire-hd-8-home-shite/</link>
				<pubDate>Mon, 26 Nov 2018 18:42:53 +0000</pubDate>
				<guid>/blog/fire-hd-8-home-shite/</guid>
				<description>&lt;p&gt;I recently got an Amazon Fire HD 8 tablet and for the most part it&amp;rsquo;s been&#xA;running fine. However, I encountered a weird and annoying issue where, all of a&#xA;sudden, I had what seem to be system/hidden apps showing up on my Home screen.&lt;/p&gt;&#xA;&lt;p&gt;The apps in question were, IIRC, &lt;em&gt;Device Setup&lt;/em&gt;, &lt;em&gt;Downloads&lt;/em&gt;, &lt;em&gt;Music&lt;/em&gt;, &lt;em&gt;Kindle&#xA;Store&lt;/em&gt; and maybe one more that I can&amp;rsquo;t find/remember.&lt;/p&gt;&#xA;&lt;p&gt;The solution was to go to Settings → Apps &amp;amp; Notifications → Manage All&#xA;Application → Home Pages → Storage. When there, tap &lt;em&gt;Force Stop&lt;/em&gt; and &lt;em&gt;Clear&#xA;Data&lt;/em&gt;. That should get rid of the stray icons.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The Forgotten Ideas in Computer Science Notes</title>
				<link>/blog/forgotten-ideas-in-computer-science/</link>
				<pubDate>Tue, 20 Mar 2018 14:14:36 +0000</pubDate>
				<guid>/blog/forgotten-ideas-in-computer-science/</guid>
				<description>&lt;p&gt;I recently watched Joe Armstrong&amp;rsquo;s Code BEAM keynote talk about forgotten ideas&#xA;in computer science and thought it would be useful to make some notes. They&amp;rsquo;re&#xA;mostly in the form of links to things that he mentions in his talk.&lt;/p&gt;&#xA;&lt;h1 id=&#34;the-talk&#34;&gt;The Talk&lt;/h1&gt;&#xA;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/-I_jE0l7sYQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;&#x9;&#x9;&lt;/div&gt;&#xA;&#xA;&lt;h1 id=&#34;the-tweets&#34;&gt;The Tweets&lt;/h1&gt;&#xA;&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;I’m interested in the forgotten ideas of computer science. Needed for a talk.&lt;br&gt;&lt;br&gt;Can you post examples of great CS ideas that have been largely forgotten.&lt;br&gt;&lt;br&gt;Examples: Linda tuple spaces, Boyer-Moore algorithm&lt;/p&gt;</description>
			</item>
			<item>
				<title>ASUS RT-N66U IPv6</title>
				<link>/blog/rt-n66u-ipv6/</link>
				<pubDate>Tue, 17 Oct 2017 16:32:45 +0100</pubDate>
				<guid>/blog/rt-n66u-ipv6/</guid>
				<description>&lt;p&gt;I&amp;rsquo;m using an &lt;a href=&#34;https://www.asus.com/uk/Networking/RTN66U/&#34;&gt;ASUS RT-N66U&lt;/a&gt; and my&#xA;ISP is &lt;a href=&#34;http://aquiss.net/&#34;&gt;Aquiss&lt;/a&gt; (an &lt;a href=&#34;http://aquiss.net/&#34;&gt;Entanet&lt;/a&gt; reseller).&#xA;I wanted to get IPv6 working.&lt;/p&gt;&#xA;&lt;p&gt;After a little bit of fiddling, the following settings seem to have done the&#xA;trick:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Connection type: Native&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Interface: PPP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DHCP-PD: Enable&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Auto Configuration Setting: Stateless&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Connect to DNS Server automatically: Enable&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enable Router Advertisement: Enable&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hope this helps anybody else in the same situation.&lt;/p&gt;</description>
			</item>
			<item>
				<title>WHMCS Smarty {include} Not Working</title>
				<link>/blog/whmcs-include-not-working/</link>
				<pubDate>Mon, 11 Sep 2017 16:54:49 +0100</pubDate>
				<guid>/blog/whmcs-include-not-working/</guid>
				<description>&lt;p&gt;I&amp;rsquo;ve been using &lt;a href=&#34;https://www.smarty.net/&#34;&gt;Smarty&lt;/a&gt; templates a bit recently while&#xA;working with &lt;a href=&#34;https://www.whmcs.com/&#34;&gt;WHMCS&lt;/a&gt; and ran into an issue. When trying&#xA;to do &lt;code&gt;{include &#39;some_template.tpl&#39;}&lt;/code&gt;, I was getting no output. Smarty seemed&#xA;to just stop all processing at that point. The fix was maddeningly simple,&#xA;especially as I&amp;rsquo;d tried a bunch of different variations of absolute and&#xA;relative paths.&lt;/p&gt;&#xA;&lt;p&gt;If your template is in a file called &lt;code&gt;some_template.tpl&lt;/code&gt;, you need to use:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#66d9ef&#34;&gt;include&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./some_template.tpl&amp;#39;&lt;/span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the case of WHMCS, templates are stored in a directory called templates, but&#xA;you don&amp;rsquo;t need to specify that as part of the path.&lt;/p&gt;</description>
			</item>
			<item>
				<title>WHMCS 500 Error</title>
				<link>/blog/whmcs-500-error/</link>
				<pubDate>Fri, 01 Sep 2017 15:47:33 +0100</pubDate>
				<guid>/blog/whmcs-500-error/</guid>
				<description>&lt;p&gt;While working on an addon module for &lt;a href=&#34;https://www.whmcs.com/&#34;&gt;WHMCS&lt;/a&gt; I kept&#xA;getting a generic &lt;a href=&#34;https://httpstatuses.com/500&#34;&gt;500 error code&lt;/a&gt; and a blank&#xA;page. I was pretty sure it was a problem in my code but there was nothing in&#xA;the &lt;a href=&#34;https://www.apachefriends.org/&#34;&gt;XAMPP&lt;/a&gt; &lt;code&gt;error.log&lt;/code&gt; or the WHMCS admin&#xA;dashboards so I had no way of tracking down the cause.&lt;/p&gt;&#xA;&lt;p&gt;I managed to finally track down the cause by enabling the &lt;strong&gt;Display Errors&lt;/strong&gt;&#xA;option under &lt;strong&gt;Setup&lt;/strong&gt; → &lt;strong&gt;General Settings&lt;/strong&gt; → &lt;strong&gt;Other&lt;/strong&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>OAuth for the Confused</title>
				<link>/blog/oauth/</link>
				<pubDate>Mon, 28 Aug 2017 12:13:41 +0100</pubDate>
				<guid>/blog/oauth/</guid>
				<description>&lt;p&gt;While working on some code recently I ended up learning far more about OAuth&#xA;than I ever wanted to know and so I thought I&amp;rsquo;d share my pain with the&#xA;Internet.&lt;/p&gt;&#xA;&lt;p&gt;This guide will cover &lt;a href=&#34;https://oauth.net/core/1.0a/&#34;&gt;OAuth 1.0a&lt;/a&gt; as that&amp;rsquo;s what&#xA;I&amp;rsquo;ve been working with.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;OAuth is an open standard for access delegation, commonly used as a way for&#xA;Internet users to grant websites or applications access to their information&#xA;on other websites but without giving them the passwords.&lt;/p&gt;</description>
			</item>
			<item>
				<title>JavaScript Prototypes for the Confused</title>
				<link>/blog/javascript-prototypes/</link>
				<pubDate>Tue, 30 May 2017 12:09:04 +0100</pubDate>
				<guid>/blog/javascript-prototypes/</guid>
				<description>&lt;p&gt;Objects can have a prototype and a prototype is just another object. We can get&#xA;an object&amp;rsquo;s prototype using the &lt;code&gt;Object.getPrototypeOf&lt;/code&gt; method.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;getPrototypeOf&lt;/span&gt;({}); &lt;span style=&#34;color:#75715e&#34;&gt;// → {}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Yes, JavaScript really loves objects. It&amp;rsquo;s objects all the way down. Actually&#xA;that&amp;rsquo;s not completely true:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;getPrototypeOf&lt;/span&gt;(Object.&lt;span style=&#34;color:#a6e22e&#34;&gt;getPrototypeOf&lt;/span&gt;({})); &lt;span style=&#34;color:#75715e&#34;&gt;// → null&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The first call to &lt;code&gt;Object.getPrototypeOf&lt;/code&gt; gave us the prototypical object—the&#xA;one that acts as the prototype for practically all objects—and calling&#xA;&lt;code&gt;Object.getPrototypeOf&lt;/code&gt; on that gives us &lt;code&gt;null&lt;/code&gt;. You&amp;rsquo;ve got to stop somewhere,&#xA;right?&lt;/p&gt;</description>
			</item>
			<item>
				<title>JavaScript Properties for the Confused</title>
				<link>/blog/javascript-properties/</link>
				<pubDate>Mon, 08 May 2017 16:35:03 +0100</pubDate>
				<guid>/blog/javascript-properties/</guid>
				<description>&lt;p&gt;Like a lot of things related to JavaScript, the syntax and semantics of&#xA;properties can be a little tricky to wrap your head around. Hopefully this&#xA;article will serve to simplify and clarify things.&lt;/p&gt;&#xA;&lt;p&gt;Our first step is to do away with the idea of arrays. But wait, arrays are&#xA;important, surely? Yes, but they&amp;rsquo;re just conceptual baggage when it comes to&#xA;understanding properties because &lt;em&gt;arrays are also objects&lt;/em&gt;. And don&amp;rsquo;t call me&#xA;Shirley.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
