<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Stephen Gream&#39;s Site</title>
    <link>/</link>
    <description>Recent content on Stephen Gream&#39;s Site</description>
    <generator>Hugo</generator>
    <language>en-au</language>
    <lastBuildDate>Tue, 14 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Rebuilding the homelab</title>
      <link>/blog/rebuilding-homelab/</link>
      <pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate>
      <guid>/blog/rebuilding-homelab/</guid>
      <description>Again we move forward the ratchet of mediocrity</description>
    </item>
    <item>
      <title>About Me</title>
      <link>/static/about-me/</link>
      <pubDate>Mon, 19 Jan 2026 00:00:00 +0000</pubDate>
      <guid>/static/about-me/</guid>
      <description>&lt;p&gt;G&amp;rsquo;day. My name&amp;rsquo;s Stephen and I&amp;rsquo;m here to convince you I know things.&#xA;I work as a software engineer in Melbourne, Australia and mostly specialise&#xA;in AWS native applications and deployments.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s a summary of my previous professional experience:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;ANZ Bank, 2021-2025:&lt;/strong&gt; Tech lead for the Gearbox team. We worked on orchestrator&#xA;loan applications, importing account performance data from the ANZ data lake,&#xA;and providing a integration gateway for bureau calls. Core technologies were&#xA;Kubernetes, GCP, Temporal and Golang.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;TSA Group, 2019-2021:&lt;/strong&gt; Working within the TSA contact centre business,&#xA;I was part of the team that first brought their new AWS Connect based solution to market.&#xA;My role at TSA spanned across the whole stack. As such I had exposure to everything from&#xA;the React frontend, to the Go backend, to the deployment and configuration pipelines.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Versent, 2017-2019:&lt;/strong&gt;&amp;gt; Working as a backend engineer,&#xA;I helped build out toll processing software with Transurban. This&#xA;was my first exposure to golang and AWS&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Hitwise, 2016-2017:&lt;/strong&gt; I was a Java developer with&#xA;the data development team, working with data pipeline applications&#xA;and ETL processes.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;LexisNexis, 2012-2016:&lt;/strong&gt; My first &amp;ldquo;real&amp;rdquo; programming job&#xA;after graduating uni, I worked with a number of senior engineers to&#xA;build modelling software using C# and bespoke, proprietary data formats&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;4D Canberra, 2009-2011:&lt;/strong&gt; I worked as a sysadmin and IT&#xA;technician to get myself through university. I assisted in administering&#xA;a mixed Windows domain and Linux infrastructure within the office, as&#xA;well as providing general office IT support to external clients.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Recruiters please note, if I receive an email from you without having given you my&#xA;address before, you&amp;rsquo;re either not going to hear from me or receive a hostile or sarcastic&#xA;response.&lt;/p&gt;</description>
    </item>
    <item>
      <title>No, Satya, I will not stop calling it slop</title>
      <link>/blog/the-ai-post/</link>
      <pubDate>Mon, 19 Jan 2026 00:00:00 +0000</pubDate>
      <guid>/blog/the-ai-post/</guid>
      <description>I don&amp;rsquo;t care what a suit says, I&amp;rsquo;m not consuming low effort nonsense</description>
    </item>
    <item>
      <title>Winter downtime</title>
      <link>/blog/winter-downtime/</link>
      <pubDate>Tue, 29 Oct 2024 00:00:00 +0000</pubDate>
      <guid>/blog/winter-downtime/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been putting off writing anything here for since April. Not because I don&amp;rsquo;t have&#xA;anything to say, but I&amp;rsquo;ve been seriously lacking motivation to do much more than go to work,&#xA;go to the gym and sleep.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve always had a bit of a seasonal depression, though for the most part I&amp;rsquo;ve been able&#xA;to manage it with proper diet and exercise. This year, however, it&amp;rsquo;s just hit me hard and&#xA;I&amp;rsquo;ve not really wanted to do anything productive.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Trying to go back to Linux Daily Driving</title>
      <link>/blog/daily-linux/</link>
      <pubDate>Thu, 25 Apr 2024 00:00:00 +0000</pubDate>
      <guid>/blog/daily-linux/</guid>
      <description>&lt;p&gt;As I&amp;rsquo;ve mentioned a few times in the past,&#xA;I&amp;rsquo;m quite an avid Linux user and have been for a long time. All my rack machines&#xA;run Ubuntu Jammy, and I&amp;rsquo;ve been running Arch on my laptop ever since I got it.&lt;/p&gt;&#xA;&lt;p&gt;However, I haven&amp;rsquo;t used Linux on my desktop machine since&#xA;about 2 years ago when my budget SSDs shat themselves. I quickly bought a 4TB Samsung&#xA;NVME replacement and decided to go the Windows route because of games and music software.&#xA;I&amp;rsquo;ve been using Windows 10 since then, and I think it affected me in odd ways.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Migrating from Codepipeline to Gitea Actions</title>
      <link>/blog/gitea-migration/</link>
      <pubDate>Sat, 27 Jan 2024 00:00:00 +0000</pubDate>
      <guid>/blog/gitea-migration/</guid>
      <description>&lt;p&gt;I recently slapped a new box in my rack and installed some general purpose services on it, one of which was Gitea,&#xA;which is a self hosted git service.&lt;/p&gt;&#xA;&lt;p&gt;One of my ongoing efforts is to move as much as possible off the cloud and into my rack. While this is not necessarily&#xA;the most economical decision, I have the peace of mind that I&amp;rsquo;m keeping my data in my own space rather than&#xA;shipping it off to a third party. It also has the added benefit of not needing to wait until Amazon gets their shit&#xA;together and updates the node build images.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Reflecting on 2023</title>
      <link>/blog/2023/</link>
      <pubDate>Thu, 04 Jan 2024 00:00:00 +0000</pubDate>
      <guid>/blog/2023/</guid>
      <description>&lt;p&gt;Thought I&amp;rsquo;d post a stream of consciousness type post on my year, might help me piece together some disparate thoughts.&lt;/p&gt;&#xA;&lt;h2 id=&#34;others-posting&#34;&gt;Others posting&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve seen a lot of negativity from others this year. I get that things are tough, but there seems to be an active&#xA;push against acknowledging the great things in your life. I&amp;rsquo;ve personally taken to being more positive about things,&#xA;even if I do crack dark jokes at times.&lt;/p&gt;</description>
    </item>
    <item>
      <title>TIL in GCP</title>
      <link>/blog/til-gcp/</link>
      <pubDate>Tue, 28 Nov 2023 00:00:00 +0000</pubDate>
      <guid>/blog/til-gcp/</guid>
      <description>&lt;p&gt;So today I learned that by default GCP service accounts can&amp;rsquo;t impersonate themselves. I was trying to run a Github action at work, and one&#xA;of the things in the script was a call to the credentials service to generate the correct token. I passed the bound github runner service&#xA;account as the account to impersonate, and got back a 403 error. I ended up forking the action and just pulling it into our repo to short&#xA;circuit the impersonation function.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux Things I&#39;ve Learned This Week</title>
      <link>/blog/til-linux/</link>
      <pubDate>Fri, 17 Nov 2023 00:00:00 +0000</pubDate>
      <guid>/blog/til-linux/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been a Linux enthusiast since I first started uni. I still have my first Kubuntu&#xA;CD somewhere, and while I mostly work off the Macbook work has supplied me now, my own&#xA;personal Thinkpad is running Arch.&lt;/p&gt;&#xA;&lt;p&gt;However, one thing I never bothered diving into too deeply was systemd. This came&#xA;back to bite me a bit with my openstack install, as Zun containers were hanging on&#xA;boot.&lt;/p&gt;&#xA;&lt;p&gt;This led me down the rabbit hole, and I&amp;rsquo;ve spent about 3 weeks trying to figure&#xA;it out. Originally, I thought it was a Zun problem, since it just looked like it&#xA;was never starting the container. After trawling through logs, I eventually&#xA;tracked it down to the time when Kuryr was trying to attach the interfaces to the&#xA;bridge.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Annoying OpenStack Quirks</title>
      <link>/blog/openstack-quirks/</link>
      <pubDate>Fri, 20 Oct 2023 00:00:00 +0000</pubDate>
      <guid>/blog/openstack-quirks/</guid>
      <description>&lt;p&gt;So I&amp;rsquo;ve spent a bit of time with OpenStack now, debugging issues and getting my setup tuned&#xA;and ready to go.&lt;/p&gt;&#xA;&lt;p&gt;For the most part, Neutron and Nova work great. No complaints. Haven&amp;rsquo;t used much of Keystone&#xA;directly but I&amp;rsquo;m sure it works fine. Bit of configuration and debugging to do on Magnum (I think),&#xA;but again I&amp;rsquo;m pretty sure it&amp;rsquo;s a &amp;ldquo;I configured this incorrectly&amp;rdquo; problem and not a &amp;ldquo;this is a&#xA;piece of shit&amp;rdquo; problem.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Running OpenStack at home</title>
      <link>/blog/running-openstack/</link>
      <pubDate>Tue, 08 Aug 2023 00:00:00 +0000</pubDate>
      <guid>/blog/running-openstack/</guid>
      <description>&lt;p&gt;I recently found a 50% off deal on rack servers at Lenovo, and picked one up&#xA;for a pretty good price. It&amp;rsquo;s 100% overkill, but I&amp;rsquo;ve always wanted my own&#xA;server just because.&lt;/p&gt;&#xA;&lt;p&gt;Since it&amp;rsquo;s complete overkill, I decided I needed to keep that train rolling&#xA;and set it up as an Openstack all in one.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-strategy&#34;&gt;The Strategy&lt;/h2&gt;&#xA;&lt;p&gt;In the lead up to the server&amp;rsquo;s delivery, I looked into the different ways to set&#xA;up the cloud. The first stop was &lt;a href=&#34;https://microstack.run/&#34;&gt;microstack&lt;/a&gt;, which&#xA;is a Canonical supported effort. Configuration was trivial, and I was able to&#xA;quickly get it up and running in an Ubuntu server VM. After exploring a little&#xA;bit, I decided that I wanted to experiment with Trove, Swift and Magnum, which&#xA;aren&amp;rsquo;t offered in the package.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A little Sunday afternoon project</title>
      <link>/blog/sunday-afternoon-project/</link>
      <pubDate>Sun, 09 Jul 2023 00:00:00 +0000</pubDate>
      <guid>/blog/sunday-afternoon-project/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s raining here today, so my plans to go outside and weed everything after our holiday have&#xA;been scuttled. Looking for something to do, I decided to see if I still remembered how to do React,&#xA;turns out I do and I made a little &lt;a href=&#34;/amortizer&#34;&gt;amortization calculator&lt;/a&gt;. I&amp;rsquo;ve also bumped up&#xA;Gatsby to v5 because codebuild supports node 18 now.&lt;/p&gt;&#xA;&lt;p&gt;I did cheat and pull in a few more libraries that&amp;rsquo;ll likely blow out my build time, but eh, maybe&#xA;I&amp;rsquo;ll do some more stuff with them later because I like making charts.&lt;/p&gt;</description>
    </item>
    <item>
      <title>On Burnout</title>
      <link>/blog/on-burnout/</link>
      <pubDate>Tue, 27 Jun 2023 00:00:00 +0000</pubDate>
      <guid>/blog/on-burnout/</guid>
      <description>&lt;p&gt;I got back from a month long holiday to Europe on Monday, and was struck by how different I felt&#xA;after landing. For about 18 months now, I&amp;rsquo;ve just been completely rundown. I have had no original&#xA;ideas of my own, I haven&amp;rsquo;t written any music and I haven&amp;rsquo;t had any remotely inspiring moments despite&#xA;my frequent jaunts into the reserves around my home.&lt;/p&gt;&#xA;&lt;h2 id=&#34;it-starts-small&#34;&gt;It starts small&lt;/h2&gt;&#xA;&lt;p&gt;A little while ago, I started feeling sick most of the time. It wasn&amp;rsquo;t a major thing, maybe a sniffling&#xA;nose or a small headache that I could take a Panadol and power through. I was constantly tired from&#xA;this and its impact on my sleep. It would bubble underneath the surface for a few months and then spill&#xA;over all at once, leading me to take more than a couple of sick days here and there.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Writing a VM Part Four - The Assembler</title>
      <link>/blog/writing-a-vm-part-four/</link>
      <pubDate>Wed, 11 Jan 2023 00:00:00 +0000</pubDate>
      <guid>/blog/writing-a-vm-part-four/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m not 100% proud of this assembler, but here we go. I&amp;rsquo;ve hacked one together that works well enough, but I don&amp;rsquo;t&#xA;think I&amp;rsquo;ll show much code here. Code is &lt;a href=&#34;https://github.com/ThreeToes/blogvm/tree/ad5c88bb1af250e28e59c7ac59276471a154c579&#34;&gt;here&lt;/a&gt;&#xA;for the curious.&lt;/p&gt;&#xA;&lt;h2 id=&#34;source-material&#34;&gt;Source Material&lt;/h2&gt;&#xA;&lt;p&gt;Originally I was completely lost and thought I might need to write a full tokeniser and lexer, but I found an easier way&#xA;after skimming through &lt;a href=&#34;http://www.davidsalomon.name/assem.advertis/asl.pdf&#34;&gt;Assemblers and Loaders&lt;/a&gt; by David Saloman.&lt;/p&gt;&#xA;&lt;h2 id=&#34;my-assembly-language&#34;&gt;My Assembly Language&lt;/h2&gt;&#xA;&lt;p&gt;My assembly language is as simple as I could make it. I&amp;rsquo;d like to add macros at some point, but it&amp;rsquo;s not really&#xA;up the top of my priority list right now, so can wait.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Writing a VM - Learnings So Far</title>
      <link>/blog/writing-a-vm-early-learnings/</link>
      <pubDate>Thu, 29 Dec 2022 00:00:00 +0000</pubDate>
      <guid>/blog/writing-a-vm-early-learnings/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been working on this VM on and off for a month or so now, and I&amp;rsquo;ve definitely had some ideas of what I could have&#xA;done better. I&amp;rsquo;ve learned from this, and I&amp;rsquo;ll certainly be putting this into practice should I ever try to do something&#xA;like this again.&lt;/p&gt;&#xA;&lt;h2 id=&#34;planning-out-my-entire-instruction-set-before-coding&#34;&gt;Planning out my entire instruction set before coding&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;m in a bit of an awkward spot at the moment with my instruction set, and it&amp;rsquo;s likely to get a little messy as I go&#xA;ahead. I&amp;rsquo;ve been adding instructions piecemeal as I&amp;rsquo;ve written each blog, and as a result I&amp;rsquo;m going to end up with&#xA;bitwise actions and interrupt handling in strange spots in the table.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Writing a VM Part Three</title>
      <link>/blog/writing-a-vm-part-three/</link>
      <pubDate>Tue, 20 Dec 2022 00:00:00 +0000</pubDate>
      <guid>/blog/writing-a-vm-part-three/</guid>
      <description>&lt;p&gt;Welcome to part 3 of this blog series. We&amp;rsquo;ll be adding instructions to allow us to better control the flow of our code,&#xA;as well as adding in comparison instructions. Code for this blog entry will be available &lt;a href=&#34;https://github.com/ThreeToes/blogvm/releases/tag/v0.3&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;d recommend reading &lt;a href=&#34;https://stephengream.com/writing-a-vm-part-one&#34;&gt;part one&lt;/a&gt; and &lt;a href=&#34;https://stephengream.com/writing-a-vm-part-two&#34;&gt;part two&lt;/a&gt; before reading this part.&lt;/p&gt;&#xA;&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;&#xA;&lt;p&gt;We&amp;rsquo;re going add new instructions to control the flow of our executing code:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Hex Value&lt;/th&gt;&#xA;          &lt;th&gt;Mnemonic&lt;/th&gt;&#xA;          &lt;th&gt;Description&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;0x0A&lt;/td&gt;&#xA;          &lt;td&gt;PUSH&lt;/td&gt;&#xA;          &lt;td&gt;Push the value of I1 onto the stack&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;0x0B&lt;/td&gt;&#xA;          &lt;td&gt;POP&lt;/td&gt;&#xA;          &lt;td&gt;Pop a value off the stack and into I2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;0x0C&lt;/td&gt;&#xA;          &lt;td&gt;JMP&lt;/td&gt;&#xA;          &lt;td&gt;Set PC to the address in I1&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;0x0D&lt;/td&gt;&#xA;          &lt;td&gt;LESS&lt;/td&gt;&#xA;          &lt;td&gt;Run the next instruction only if I1 &amp;lt; I2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;0x0E&lt;/td&gt;&#xA;          &lt;td&gt;LTE&lt;/td&gt;&#xA;          &lt;td&gt;Run the next instruction only if I1 &amp;lt;= I2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;0x0F&lt;/td&gt;&#xA;          &lt;td&gt;GT&lt;/td&gt;&#xA;          &lt;td&gt;Run the next instruction only if I1 &amp;gt; I2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;0x10&lt;/td&gt;&#xA;          &lt;td&gt;GTE&lt;/td&gt;&#xA;          &lt;td&gt;Run the next instruction only if I1 &amp;gt;= I2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;0x11&lt;/td&gt;&#xA;          &lt;td&gt;EQ&lt;/td&gt;&#xA;          &lt;td&gt;Run the next instruction only if I1 = I2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;0x12&lt;/td&gt;&#xA;          &lt;td&gt;CALL&lt;/td&gt;&#xA;          &lt;td&gt;Set the PC to the address in I1&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;0x13&lt;/td&gt;&#xA;          &lt;td&gt;RETURN&lt;/td&gt;&#xA;          &lt;td&gt;Return to the last &lt;code&gt;CALL&lt;/code&gt; location&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;To facilitate these changes, we&amp;rsquo;ll be adding a new register to the machine.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Writing a VM Part Two</title>
      <link>/blog/writing-a-vm-part-two/</link>
      <pubDate>Tue, 06 Dec 2022 00:00:00 +0000</pubDate>
      <guid>/blog/writing-a-vm-part-two/</guid>
      <description>&lt;p&gt;When we &lt;a href=&#34;./writing-a-vm-part-one&#34;&gt;last left off&lt;/a&gt;, we had a basic machine that could add two&#xA;numbers. This time, we&amp;rsquo;ll add a new register to act as a set of flags to convey the machine status, instructions to&#xA;allow us to set and reset these flags and a few other useful arithmetic instructions.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-new-architecture&#34;&gt;The New Architecture&lt;/h2&gt;&#xA;&lt;p&gt;We&amp;rsquo;re going to add a new register, which isn&amp;rsquo;t a large change&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./CPU_v0.2.png&#34; alt=&#34;The new SR register&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This will act not as register that holds a number, like the other registers in the CPU, but as a set of 32 binary flags&#xA;we can use as indicators for things like errors and interrupts. Each bit in the register will be one flag, meaning we&#xA;can mask the register with the flag value in order to get the value.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Documentation Trap</title>
      <link>/blog/the-documentation-trap/</link>
      <pubDate>Wed, 23 Nov 2022 00:00:00 +0000</pubDate>
      <guid>/blog/the-documentation-trap/</guid>
      <description>&lt;p&gt;In the beginning, there was READMEs and code comments, and the great architect in the sky saw that it was good.&lt;/p&gt;&#xA;&lt;p&gt;As software grew, so too did the tomes accompanying it, and tools were developed to help manage it. Sharepoint, wikis,&#xA;and automated documentation build processes. But they were all deceived, in the darkness of Sydney, a tool was forged&#xA;by the dark master Atlassian, and thus unleashed on the world was Confluence.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Writing a VM Part One</title>
      <link>/blog/writing-a-vm-part-one/</link>
      <pubDate>Tue, 15 Nov 2022 00:00:00 +0000</pubDate>
      <guid>/blog/writing-a-vm-part-one/</guid>
      <description>&lt;p&gt;When I was a student, I did an intro to computer architecture course that was instructed by&#xA;&lt;a href=&#34;https://cecs.anu.edu.au/people/peter-strazdins&#34;&gt;Peter Strazdins&lt;/a&gt;. I was struck by his&#xA;enthusiasm and his apparent thirst to pass along everything he knew, and while I would never&#xA;have called us friends I certainly was on very good terms with him and had more than a few&#xA;very geeky chats with him after lectures and tutorials. My time learning under him certainly&#xA;shaped a lot of current software engineering interests, particularly around VMs and low level&#xA;coding.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Update to my last post</title>
      <link>/blog/big4-update/</link>
      <pubDate>Thu, 01 Sep 2022 00:00:00 +0000</pubDate>
      <guid>/blog/big4-update/</guid>
      <description>&lt;p&gt;An update to my &lt;a href=&#34;./what-is-normal&#34;&gt;last post&lt;/a&gt;. My wife&#xA;sent me &lt;a href=&#34;https://www.news.com.au/finance/work/auditors-from-big-4-financial-services-firms-lash-working-conditions-at-deloitte-pwc-and-ey/news-story/88e1c1e3f95e16d42729416d7b599092&#34;&gt;this article&lt;/a&gt;&#xA;where multiple former employees have come out and talked about conditions at the&#xA;big 4 consultancies. It&amp;rsquo;s heartening to know that there&amp;rsquo;s light being shone on&#xA;their awful treatment of workers, and hopefully they do better in future.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What is normal in the software industry</title>
      <link>/blog/what-is-normal/</link>
      <pubDate>Wed, 24 Aug 2022 00:00:00 +0000</pubDate>
      <guid>/blog/what-is-normal/</guid>
      <description>&lt;p&gt;What is normal in the software industry?&lt;/p&gt;&#xA;&lt;p&gt;Maybe a couple of years ago, I had an interesting encounter with a soon-to-be graduate software&#xA;engineer who asked me a few questions about what the industry was actually like.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Is being held back until 3am normal?&amp;rdquo;&#xA;&amp;ldquo;How much code are you expected to produce every day?&amp;rdquo;&#xA;&amp;ldquo;What things should I learn in order to keep myself in a job?&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;I had an extended time with this young man, just chatting. It struck me how much he seemed worried&#xA;that he&amp;rsquo;d chosen the wrong career path. I did a little further probing, and it turned out he&amp;rsquo;d&#xA;done an internship with a certain big 4 consultancy (which shall remain nameless) who had clearly&#xA;mistreated their interns.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Peeper</title>
      <link>/blog/peeper/</link>
      <pubDate>Thu, 30 Jun 2022 00:00:00 +0000</pubDate>
      <guid>/blog/peeper/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve recently started having more to do with Kubernetes lately, and have as a result&#xA;have learned about the&#xA;&lt;a href=&#34;https://docs.microsoft.com/en-us/azure/architecture/patterns/sidecar&#34;&gt;Sidecar Pattern&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I thought that maybe I should see if I can do something that might be useful for that,&#xA;and one of the stinging points I&amp;rsquo;ve had is authentication.&lt;/p&gt;&#xA;&lt;h2 id=&#34;enter-peeper&#34;&gt;Enter Peeper&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/threetoes/peeper&#34;&gt;Peeper&lt;/a&gt; was written to abstract away authentication&#xA;from REST clients and presenting an interface that makes it look like they&amp;rsquo;re being presented&#xA;with an unauthenticated interface. This may save some work if you&amp;rsquo;re writing services in&#xA;multiple languages and don&amp;rsquo;t want to rewrite the authentication logic every time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What Go Taught Me</title>
      <link>/blog/what-golang-taught/</link>
      <pubDate>Mon, 16 May 2022 00:00:00 +0000</pubDate>
      <guid>/blog/what-golang-taught/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been using Golang professionally for a number of years now,&#xA;having had my first exposure in 2017 or maybe 2018. It was sold&#xA;to our team as a faster version of Java, with a lot of cleaner&#xA;libraries that would help us write, build and deploy much faster&#xA;than our existing Java application.&lt;/p&gt;&#xA;&lt;p&gt;For the most part, I&amp;rsquo;ve not only found that to be true but to have&#xA;completely altered some of my existing ideas on software engineering.&lt;/p&gt;</description>
    </item>
    <item>
      <title>NES Emulators and Such</title>
      <link>/blog/nes-emulator/</link>
      <pubDate>Sat, 30 Apr 2022 00:00:00 +0000</pubDate>
      <guid>/blog/nes-emulator/</guid>
      <description>&lt;p&gt;I got it in my head the other day to start writing a NES emulator, as I didn&amp;rsquo;t&#xA;really have a current home project on my plate. I&amp;rsquo;ve dabbled in virtual machines&#xA;before, having tried to build an implementation of the DCPU computer, but I only&#xA;got so far with that one since there wasn&amp;rsquo;t really anything to run. The NES,&#xA;though, has no end of documentation and people still releasing code for it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Important Things</title>
      <link>/blog/important-things/</link>
      <pubDate>Thu, 31 Mar 2022 00:00:00 +0000</pubDate>
      <guid>/blog/important-things/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been feeling a little down and snowed under&#xA;emotionally lately, and as a result haven&amp;rsquo;t really&#xA;had the drive to blog about anything. Today, though,&#xA;things happened which cut through the fog I tend to&#xA;get when I&amp;rsquo;m struggling a little.&lt;/p&gt;&#xA;&lt;p&gt;My morning started at 6:30, when I jumped out of bed&#xA;and started getting ready. After showering, I noticed&#xA;that my jeans had blown themselves apart at the seams.&lt;/p&gt;</description>
    </item>
    <item>
      <title>More Fun With Rust</title>
      <link>/blog/more-fun-with-rust/</link>
      <pubDate>Fri, 28 Jan 2022 00:00:00 +0000</pubDate>
      <guid>/blog/more-fun-with-rust/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been playing with Rust some more lately, and I&amp;rsquo;m starting to really appreciate a few things about the language.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been going through &lt;a href=&#34;https://hands-on-rust.com/&#34;&gt;Hands on Rust&lt;/a&gt;, and building the little Roguelike game the book&#xA;lays out. I&amp;rsquo;ve learned how to use Cargo, how modules work and how to stop worrying about macros. It&amp;rsquo;s been a very&#xA;enlightening experience, and I&amp;rsquo;ve enjoyed it immensely. I have also been working on an implementation of the DCPU-16&#xA;computer using Rust, though I&amp;rsquo;m not quite done and still need to implement interrupts.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Warning on Hardware</title>
      <link>/blog/crappy-gear/</link>
      <pubDate>Sun, 16 Jan 2022 00:00:00 +0000</pubDate>
      <guid>/blog/crappy-gear/</guid>
      <description>&lt;p&gt;Around October last year, I built myself a high end PC. Mostly because I could, and my existing rig was starting to&#xA;age a little. And when I say high end, I mean it. AMD 5950x, RTX 3090, 128GB of RAM and 8TB of NVMe storage.&lt;/p&gt;&#xA;&lt;p&gt;I also bought a case and AIO CPU cooler combo, since I&amp;rsquo;m not really patient enough to build a custom water setup.&lt;/p&gt;&#xA;&lt;h2 id=&#34;cracks-form&#34;&gt;Cracks Form&lt;/h2&gt;&#xA;&lt;p&gt;Around November, I started getting a ton of disk write errors on my storage drive. This first manifested as unloaded&#xA;textures, music and SFX in some games I was playing with some of my friends. After a reboot it came good, but I kept&#xA;having similar issues sporadically. Get to early December, and I&amp;rsquo;m trying to do some pretty heavy I/O processing&#xA;of some files I got off the internet somewhere, and the hard drive would just completely disappear. I downloaded&#xA;CrystalDiskInfo, and it&amp;rsquo;s reporting 0s for every S.M.A.R.T statistic.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Some Productivity Experiments</title>
      <link>/blog/productivity-experiments/</link>
      <pubDate>Mon, 06 Dec 2021 00:00:00 +0000</pubDate>
      <guid>/blog/productivity-experiments/</guid>
      <description>&lt;p&gt;This past fortnight, I&amp;rsquo;ve been trying something to maybe see if I can actually finish another home project. Like I&#xA;mentioned in &lt;a href=&#34;./how-dnd-helped-me-organise-knowledge&#34;&gt;a previous blog&lt;/a&gt;, I adopted the Zettelkasten&#xA;method for notetaking, which requires that you break everything down into small, bitesized cards and file them away&#xA;somewhere sensible. It&amp;rsquo;s made me more focussed, and quickly able to find information that I know I&amp;rsquo;ve seen around&#xA;before.&lt;/p&gt;&#xA;&lt;p&gt;One problem I&amp;rsquo;ve continued to have, though, is being able to see my home projects through to the end. One would think&#xA;that this would be as simple as setting up a kanban board with some cards, but I&amp;rsquo;ve found I still lose steam after an&#xA;initial burst of motivation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>CodeCommit SSH Issues</title>
      <link>/blog/codecommit-ssh-issues/</link>
      <pubDate>Tue, 30 Nov 2021 00:00:00 +0000</pubDate>
      <guid>/blog/codecommit-ssh-issues/</guid>
      <description>&lt;p&gt;Just a short one, went to pull some changes from CodeCommit and got the follow error&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Unable to negotiate with 103.8.174.37 port 22: no matching host key type found. Their offer: ssh-rsa&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fatal: Could not read from remote repository.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Looks like OpenSSH has changed around some defaults and won&amp;rsquo;t automatically accept SSH offers, no big deal. Add&#xA;the following to your CodeCommit section in &lt;code&gt;~/.ssh/config&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Host git-codecommit.*.amazonaws.com&#xA;   User AAAAAAAAAAAAAAAAAAAA&#xA;   IdentityFile ~/.ssh/id_codecommit&#xA;   # Add these to let the SSH client accept RSA keys&#xA;   PubkeyAcceptedAlgorithms +ssh-rsa&#xA;   HostkeyAlgorithms +ssh-rsa&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Maybe eventually AWS will accept ed25519 keys and give us a longer term fix, but for now this will have to do.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Playing with Go Generics</title>
      <link>/blog/go-generics/</link>
      <pubDate>Sat, 13 Nov 2021 00:00:00 +0000</pubDate>
      <guid>/blog/go-generics/</guid>
      <description>&lt;p&gt;Go 1.17 dropped a while ago, and a workmate at the time was quick to notice that with it had dropped&#xA;the long awaited generics. Generics were something I used a lot of in the Java and .NET worlds, but being&#xA;in the Go world for the last 5 or so years has taught me that they&amp;rsquo;re not entirely necessary.&lt;/p&gt;&#xA;&lt;p&gt;However, if this is to become a staple feature in my language of choice in 1.18, then I should probably learn&#xA;to use it. I may run across that 0.01% of problems that require it one day.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Some minor changes</title>
      <link>/blog/adding_dates_back/</link>
      <pubDate>Thu, 21 Oct 2021 00:00:00 +0000</pubDate>
      <guid>/blog/adding_dates_back/</guid>
      <description>&lt;p&gt;As I&amp;rsquo;ve been at this for a little while now, my blog post folder was starting to get a little difficult to navigate&#xA;&lt;img src=&#34;./old.png&#34; alt=&#34;Old and Busted&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve added some stuff in Gatsby node to make this a little easier to sort through&#xA;&lt;img src=&#34;./new.png&#34; alt=&#34;New hotness&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I think this is how it was laid out when I used heroblog, but I&amp;rsquo;ve only just got around to adding it back in now.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s what I added&lt;/p&gt;</description>
    </item>
    <item>
      <title>How Dungeons and Dragons Helped me Organise My Notes and Become a Better Engineer</title>
      <link>/blog/how-dnd-helped-me-organise-knowledge/</link>
      <pubDate>Wed, 22 Sep 2021 00:00:00 +0000</pubDate>
      <guid>/blog/how-dnd-helped-me-organise-knowledge/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been an avid tabletop gamer since I met my now wife in late 2013. I&amp;rsquo;d played D&amp;amp;D once or&#xA;twice in uni, but didn&amp;rsquo;t really get into it. That was, until Jocelyn saw me get excited over&#xA;a copy of Edge of the Empire in my FLGS and encouraged me to give it a go.&lt;/p&gt;&#xA;&lt;p&gt;I fell in love with it all pretty quickly, eventually falling into the perma GM role in my&#xA;group. Of course, with the GM chair came campaign notes that needed to be organised. Characters,&#xA;stats, planning, and plot notes eventually got out of hand. I started with a small folder, eventually&#xA;growing into a thick folder.&lt;/p&gt;</description>
    </item>
    <item>
      <title>CodePipeline Notifications</title>
      <link>/blog/codepipeline-notifications/</link>
      <pubDate>Wed, 04 Aug 2021 00:00:00 +0000</pubDate>
      <guid>/blog/codepipeline-notifications/</guid>
      <description>&lt;p&gt;So with the last blog I published, my build failed and I didn&amp;rsquo;t realise for a day or two. Not being happy with that&#xA;situation, I turned to one of the things I learned in my preparation for the devops pro certification.&lt;/p&gt;&#xA;&lt;h2 id=&#34;how-this-blog-works&#34;&gt;How this Blog Works&lt;/h2&gt;&#xA;&lt;p&gt;For some extra context, this whole site uses &lt;a href=&#34;https://www.gatsbyjs.com/&#34;&gt;Gatsby&lt;/a&gt; to build static HTML. On the AWS side,&#xA;it&amp;rsquo;s served off a private S3 bucket with a CloudFront distribution in front of it, and I use CodePipeline to build and&#xA;deploy it out when I commit and push a new markdown blog post.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Four Personalities of the Creative Process</title>
      <link>/blog/the-four-creative-personalities/</link>
      <pubDate>Sun, 18 Jul 2021 00:00:00 +0000</pubDate>
      <guid>/blog/the-four-creative-personalities/</guid>
      <description>&lt;p&gt;A few years ago, I decided to do something completely unnecessary and travel to&#xA;Chicago for a series of guitar workshops. It was 7 days of just hanging out with&#xA;other guitarists jamming and learning from other very talented musicians. Probably&#xA;not the most amazing use of my savings, but I enjoyed myself nonetheless and learned&#xA;a lot about writing music and playing with other people.&lt;/p&gt;&#xA;&lt;p&gt;Of the things I learned in that week, the most useful has been something the instructor&#xA;called the &amp;ldquo;Four Personalities&amp;rdquo;, a way of breaking down the creative process and trying to get&#xA;through blocks in your songwriting. I&amp;rsquo;ve found that it matches some of the things we do in&#xA;software engineering, and have since adapted the way I work to somewhat mirror this process.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Adding Pagination to the Blog Listing</title>
      <link>/blog/gatsby_pagination/</link>
      <pubDate>Mon, 28 Jun 2021 00:00:00 +0000</pubDate>
      <guid>/blog/gatsby_pagination/</guid>
      <description>&lt;p&gt;I added some pagination to the blog listing page, took maybe an hour or so. Kinda surprised I manged that.&lt;/p&gt;&#xA;&lt;p&gt;Basically, I edited my &lt;code&gt;gatsby-node&lt;/code&gt; to generate a new set of nodes depending on the posts it finds. I&#xA;also removed my &lt;code&gt;index.js&lt;/code&gt; page so I could use the same code everywhere. My node generation now looks&#xA;like this&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;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;blogPagesTemplate&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;resolve&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./src/templates/blog-page.js&amp;#39;&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;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;paginateLimit&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;siteMetadata&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;paginateLimit&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:#a6e22e&#34;&gt;createPage&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:#a6e22e&#34;&gt;slug&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#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:#a6e22e&#34;&gt;aliases&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:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;/`/&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  component: blogPagesTemplate,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  context: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    skip: 0,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    limit: paginateLimit,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    pageNumber: 1,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;})&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;for (let i = 1; i*paginateLimit &amp;lt; posts.length; i ++) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  createPage({&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    slug: `&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;blogs&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;}&lt;span style=&#34;color:#e6db74&#34;&gt;`,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;aliases:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; - /`&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;blogs&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;$&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;}&lt;span style=&#34;color:#e6db74&#34;&gt;`,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    component: blogPagesTemplate,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    context: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      skip: i * paginateLimit,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      limit: paginateLimit,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;      pageNumber: i+1,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  })&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;While my updated GraphQL query looks like this&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rust as a Go Programmer</title>
      <link>/blog/rust-as-a-go-programmer/</link>
      <pubDate>Mon, 14 Jun 2021 00:00:00 +0000</pubDate>
      <guid>/blog/rust-as-a-go-programmer/</guid>
      <description>&lt;p&gt;So I decided to finally sit down and check out Rust, as it&amp;rsquo;s a language that&amp;rsquo;s&#xA;gaining a large amount of traction and generating buzz for its various features.&lt;/p&gt;&#xA;&lt;p&gt;The things that got me curious were:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Memory ownership, go garbage collection can be brutal&lt;/li&gt;&#xA;&lt;li&gt;Functional features&lt;/li&gt;&#xA;&lt;li&gt;Generics&lt;/li&gt;&#xA;&lt;li&gt;Potentially never having to deal with C again&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;It took me a little bit to start getting my head around how it was all put together, but&#xA;things eventually started to fall into place as I started to map over my existing knowledge.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Finding Errors</title>
      <link>/blog/finding-errors/</link>
      <pubDate>Thu, 20 May 2021 00:00:00 +0000</pubDate>
      <guid>/blog/finding-errors/</guid>
      <description>&lt;p&gt;My day to day grind at the moment has been configuring new environments as we have new work coming&#xA;in. I&amp;rsquo;ve done it enough at this point that I know exactly where the pain points are and what&amp;rsquo;s next&#xA;in line to automate, so I think by the end of next month I&amp;rsquo;ll be able to spin up a whole new environment&#xA;in under 20 minutes before customisations.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-fun-begins&#34;&gt;The fun begins&lt;/h2&gt;&#xA;&lt;p&gt;I spun up a new environment and got all the Amazon configuration sorted. Connect was happy, I could&#xA;make phone calls and I could see everything streaming out to the database properly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Things I learned coding a chess game</title>
      <link>/blog/things-i-learned-coding-a-chess-game/</link>
      <pubDate>Sun, 02 May 2021 00:00:00 +0000</pubDate>
      <guid>/blog/things-i-learned-coding-a-chess-game/</guid>
      <description>&lt;p&gt;As I alluded to in my &lt;a href=&#34;/bitboards&#34;&gt;bitboard rant&lt;/a&gt; a little while ago,&#xA;I&amp;rsquo;ve been working on a chess game in my own time. I&amp;rsquo;ve had a few realisations while&#xA;I&amp;rsquo;ve been building it, which I thought I&amp;rsquo;d share.&lt;/p&gt;&#xA;&lt;h2 id=&#34;realisation-1-you-dont-always-need-objects&#34;&gt;Realisation 1: You don&amp;rsquo;t always need objects&lt;/h2&gt;&#xA;&lt;p&gt;Coming up through uni in Java and spending a large chunk of my professional life&#xA;using OOP languages, I often found myself reaching for a struct in golang. On&#xA;noticing how great the bitboard solution was, I started rethinking how I define my types.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Opting out of FLoC in CloudFront</title>
      <link>/blog/disabling-floc-in-cloudfront/</link>
      <pubDate>Sat, 17 Apr 2021 00:00:00 +0000</pubDate>
      <guid>/blog/disabling-floc-in-cloudfront/</guid>
      <description>&lt;p&gt;The current quiet tech battle being fought is against Google&amp;rsquo;s Federated Learning of Cohorts,&#xA;or FLoC, which Google is pushing as its alternative to third party cookies.&#xA;&lt;a href=&#34;https://www.theverge.com/2021/3/30/22358287/privacy-ads-google-chrome-floc-cookies-cookiepocalypse-finger-printing&#34;&gt;The Verge&lt;/a&gt;&#xA;explains it better than I could, so I&amp;rsquo;ll link it and call it day on that part.&lt;/p&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t use tracking or invasive analytics on my site and never will, so let&amp;rsquo;s make sure it&amp;rsquo;s&#xA;difficult for Google as well.&lt;/p&gt;&#xA;&lt;h2 id=&#34;how-do-we-stop-it-if-its-browser-based&#34;&gt;How do we stop it, if it&amp;rsquo;s browser based?&lt;/h2&gt;&#xA;&lt;p&gt;There&amp;rsquo;s a new HTTP header we can use, &lt;code&gt;Permissions-Policy&lt;/code&gt;. We can set this&#xA;on our Cloudfront origin easily enough to disable (we hope) FLoC in the browser&#xA;on our site. &lt;a href=&#34;https://www.w3.org/TR/permissions-policy-1/&#34;&gt;W3C&lt;/a&gt; has a full spec&#xA;available with examples if you&amp;rsquo;re interested in reading more&lt;/p&gt;</description>
    </item>
    <item>
      <title>Making and deploying AMIs with Gitlab CI</title>
      <link>/blog/gitlab-make-ami/</link>
      <pubDate>Thu, 04 Mar 2021 00:00:00 +0000</pubDate>
      <guid>/blog/gitlab-make-ami/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve had three weeks off from work for a little break after a particularly tough&#xA;job, so I decided to start sharpening some of my AWS knowledge and actually get&#xA;that DevOps Pro certification sometime soon.&lt;/p&gt;&#xA;&lt;p&gt;One of the practice questions I was looking at dealt with quickly spinning up&#xA;EC2 instances in an autoscaling group, the answer to which was to bake an AMI&#xA;using a script. I realised I&amp;rsquo;d never actually done that before, so thought I&amp;rsquo;d&#xA;give it a go.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Salesforce Endgame Tool</title>
      <link>/blog/endgame/</link>
      <pubDate>Sat, 20 Feb 2021 00:00:00 +0000</pubDate>
      <guid>/blog/endgame/</guid>
      <description>&lt;p&gt;So something interesting I spotted this week was &lt;a href=&#34;https://github.com/ThreeToes/endgame&#34;&gt;a tool called Endgame&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Originally announced by Salesforce, the tool was pulled by the time I found it, though by that point it was&#xA;trivial to dig up a fork. The purpose of the tool is to be able to see whether an IAM principal can&#xA;smash open an account&amp;rsquo;s resources, and to be honest it&amp;rsquo;ll be very useful to me in the future while testing&#xA;attack surfaces.&lt;/p&gt;</description>
    </item>
    <item>
      <title>FullCalendar with Gatsby</title>
      <link>/blog/full-calendar-with-gatsby/</link>
      <pubDate>Wed, 27 Jan 2021 00:00:00 +0000</pubDate>
      <guid>/blog/full-calendar-with-gatsby/</guid>
      <description>&lt;p&gt;Ran into a situation a little while ago where I needed a calendar page for&#xA;something I was working on, eventually settled on &lt;a href=&#34;https://fullcalendar.io/docs&#34;&gt;FullCalendar&lt;/a&gt;&#xA;with its React docs.&lt;/p&gt;&#xA;&lt;p&gt;I wrote up my page and got it working with the development server, only to have the&#xA;following issue when I went to build my production bundle&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#34;window&amp;#34; is not available during server side rendering.&#xA;&#xA;See our docs page for more info on this error: https://gatsby.dev/debug-html&#xA;&#xA;&#xA;  1 | import * as react from &amp;#39;react&amp;#39;;&#xA;  2 | import * as reactDom from &amp;#39;react-dom&amp;#39;;&#xA;&amp;gt; 3 | (typeof globalThis !== &amp;#39;undefined&amp;#39; ? globalThis : window).FullCalendarVDom = {&#xA;    | ^&#xA;  4 |     Component: react.Component,&#xA;  5 |     createElement: react.createElement,&#xA;  6 |     render: reactDom.render,&#xA;&#xA;&#xA;  WebpackError: ReferenceError: window is not defined&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Not being a JS developer normally, this led me down a bit of a rabbit hole and it took&#xA;me a couple of hours to find a solution, which is&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bitboards, or how I learned something that should have been completely obvious</title>
      <link>/blog/bitboards/</link>
      <pubDate>Tue, 24 Nov 2020 00:00:00 +0000</pubDate>
      <guid>/blog/bitboards/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve always had a fascination with chess, and indeed I played and won trophies for it in school. Long gone are&#xA;my glory days, however, and I haven&amp;rsquo;t played regularly for going on 12 years now.&lt;/p&gt;&#xA;&lt;p&gt;I grew up playing Chessmaster, and always wondered how it worked. When I did my AI course at uni, the curtain&#xA;was pulled back a little as I learned about search algorithms, but I put this particular problem&#xA;to the back of my head until I was bored after work last week.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fargate Task Recycling</title>
      <link>/blog/fargate-task-recycling/</link>
      <pubDate>Tue, 27 Oct 2020 00:00:00 +0000</pubDate>
      <guid>/blog/fargate-task-recycling/</guid>
      <description>&lt;h3 id=&#34;update-1182023&#34;&gt;UPDATE 11/8/2023&lt;/h3&gt;&#xA;&lt;p&gt;I got a message on LinkedIn asking for an update as one of the links had gone stale. I&amp;rsquo;ve&#xA;replaced it with an archive link, no idea if this is still how Fargate operates under the hood.&#xA;There is also the new &lt;a href=&#34;https://docs.aws.amazon.com/AmazonECS/latest/userguide/task-maintenance.html&#34;&gt;task maintenance page&lt;/a&gt;&#xA;that seems to offer a similar explanation.&lt;/p&gt;&#xA;&lt;h3 id=&#34;original-post&#34;&gt;Original post&lt;/h3&gt;&#xA;&lt;p&gt;Came across something curious in my investigation&#xA;into why I had a couple of Cloudwatch alarms going&#xA;off.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Federating Amazon Connect with Azure AD</title>
      <link>/blog/federating-amazon-connect-with-azure/</link>
      <pubDate>Tue, 13 Oct 2020 21:22:00 +0000</pubDate>
      <guid>/blog/federating-amazon-connect-with-azure/</guid>
      <description>&lt;p&gt;Naturally with any large organisation, they&amp;rsquo;re only going to be interested&#xA;in your software if you make it easy for them to integrate it into their&#xA;workflows. To that end, let&amp;rsquo;s have a look at how we get an Amazon Connect&#xA;CCP working with Azure as an IdP.&lt;/p&gt;&#xA;&lt;h2 id=&#34;set-up-your-amazon-connect-instance&#34;&gt;Set Up your Amazon Connect Instance&lt;/h2&gt;&#xA;&lt;p&gt;The first step is to set up your Connect instance to use SAML. This is&#xA;set when creating a new instance and cannot be changed later, so make&#xA;sure you do this correctly first go&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tweaking the blog again</title>
      <link>/blog/blog_tweaks/</link>
      <pubDate>Mon, 05 Oct 2020 00:00:00 +0000</pubDate>
      <guid>/blog/blog_tweaks/</guid>
      <description>&lt;p&gt;As should be obvious if you&amp;rsquo;ve come here before, I&amp;rsquo;ve redone the place. This time, I went straight off&#xA;the Gatsby blog starter and tweaked a few things here and there.&lt;/p&gt;&#xA;&lt;h2 id=&#34;new-features&#34;&gt;New Features&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Full tagging. Before I only had broad categories and it was becoming difficult to find certain posts. Give it&#xA;a go by clicking the hashtags under the title.&lt;/li&gt;&#xA;&lt;li&gt;Simpler styling. I really hate cluttered, noisy UIs. Being able to reduce the amount of things going on&#xA;on the screen makes me happy.&lt;/li&gt;&#xA;&lt;li&gt;Shorter build times. It was taking me a long time to build and bring up the development server. Paring it all&#xA;back means I can be stupid faster.&lt;/li&gt;&#xA;&lt;li&gt;More frontmatter metadata. I have the option of either letting Gatsby generate an excerpt or specifying a short&#xA;description for each post.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;lessons-learned&#34;&gt;Lessons Learned&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;GraphQL is something that I&amp;rsquo;ve been curious about for a while now, it was good to get my hands dirty with it to&#xA;figure out whether it&amp;rsquo;s actually something worth using. While I like it here, I&amp;rsquo;m still not convinced whether&#xA;it&amp;rsquo;ll always be the right tool. Seems like a lot of overkill for most applications, maybe if I had a huge search&#xA;space that needed some level of arbitary-ness to it, but I think I&amp;rsquo;d just prefer query parameters most of the time&lt;/li&gt;&#xA;&lt;li&gt;React. I know I&amp;rsquo;m using it in the context of Gatsby right now, but I think I could actually grow to enjoy using&#xA;this. The component based development style means I&amp;rsquo;ve been able to identify a couple of common components that&#xA;I&amp;rsquo;ve been able to pull out, and in the process I&amp;rsquo;ve been able to better figure out how my own site works under&#xA;the hood.&lt;/li&gt;&#xA;&lt;li&gt;Gatsby in general. Previously, I was able to make small changes, now I&amp;rsquo;m feeling way more comfortable modifying&#xA;the little parts that annoy me&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Hopefully, I&amp;rsquo;ll be able to continue tweaking this incarnation of the blog to something I can really be proud of. It&amp;rsquo;s&#xA;already lasted longer than my last few attempts, so I&amp;rsquo;ll take that as a good sign&lt;/p&gt;</description>
    </item>
    <item>
      <title>IAM Authentication with Postgres</title>
      <link>/blog/postgres-iam-auth/</link>
      <pubDate>Tue, 15 Sep 2020 00:00:00 +0000</pubDate>
      <guid>/blog/postgres-iam-auth/</guid>
      <description>&lt;p&gt;Getting IAM auth in Postgres is a pretty easy process. The first thing we&amp;rsquo;ll need to do is to&#xA;enable it in our RDS instance&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./enable_iam_auth.png&#34; alt=&#34;Enable RDS&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;We also need to create ourselves a user within Postgres and grant it the &lt;code&gt;rds_iam&lt;/code&gt; role.&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-postgresql&#34; data-lang=&#34;postgresql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;USER&lt;/span&gt; iam_authed_user LOGIN;&#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;GRANT&lt;/span&gt; rds_iam &lt;span style=&#34;color:#66d9ef&#34;&gt;TO&lt;/span&gt; iam_authed_user;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We&amp;rsquo;re ready to get ourselves a temporary auth token. In golang, use &lt;code&gt;rdsutils.BuilAuthToken&lt;/code&gt;&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-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;endpoint&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Sprintf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%s:%d&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;DatabaseHost&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;DatabasePort&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:#a6e22e&#34;&gt;tok&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;rdsutils&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;BuildAuthToken&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;endpoint&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:#a6e22e&#34;&gt;region&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;DatabaseUser&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;credentials&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Where &lt;code&gt;region&lt;/code&gt; is the AWS region and &lt;code&gt;credentials&lt;/code&gt; is an AWS credentials provider. Important to note&#xA;that the endpoint parameter contains both the host and the port.&#xA;We then use this token to connect to our database&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cloudformation API Gateway with Cognito Authorizer</title>
      <link>/blog/http-gateway-with-cognito/</link>
      <pubDate>Mon, 24 Aug 2020 00:00:00 +0000</pubDate>
      <guid>/blog/http-gateway-with-cognito/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been back at the Cloudformation in the last little while as we&amp;rsquo;ve been provisioning&#xA;some new clients at work and I wanted to speed things up substantially. This led me down a&#xA;bit of a rabbit hole experimenting with various parts that we&amp;rsquo;ve previously done using ad-hoc&#xA;clickops, including Cognito user pools. I found there wasn&amp;rsquo;t really any complete examples out&#xA;there for me to rip off, so I&amp;rsquo;ll dump what I came up with here.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tunneller</title>
      <link>/blog/tunneller/</link>
      <pubDate>Wed, 13 May 2020 00:00:00 +0000</pubDate>
      <guid>/blog/tunneller/</guid>
      <description>&lt;p&gt;Been a bit slack on updating this blog, so to&#xA;make up for it I slapped together a quick and&#xA;dirty application to tunnel through EC2 instances&#xA;and into RDS services sitting off the public web.&lt;/p&gt;&#xA;&lt;p&gt;You can find the source code on&#xA;&lt;a href=&#34;https://github.com/ThreeToes/tunneller&#34;&gt;my github page&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Frustrations with Fargate and ECS</title>
      <link>/blog/frustrations-with-ecs/</link>
      <pubDate>Thu, 30 Apr 2020 00:00:00 +0000</pubDate>
      <guid>/blog/frustrations-with-ecs/</guid>
      <description>&lt;p&gt;I just spent a good month wrangling ECS Fargate&#xA;deployments with a ton of cloudformation to boot.&#xA;I&amp;rsquo;m going to outline the stupid things I&amp;rsquo;ve had to&#xA;deal with and some errors I&amp;rsquo;ve found&lt;/p&gt;&#xA;&lt;h2 id=&#34;fargate&#34;&gt;Fargate&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://aws.amazon.com/fargate/&#34;&gt;Fargate&lt;/a&gt; is an&#xA;AWS offering that allows you to bring up docker&#xA;containers without needing to provision servers to&#xA;run them on. Aside from that, it&amp;rsquo;s much the same as&#xA;a normal ECS cluster from a developer perspective as&#xA;far as I can tell.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Breadth vs Depth of knowledge</title>
      <link>/blog/breadth-vs-depth-of-knowledge/</link>
      <pubDate>Sat, 04 Apr 2020 00:00:00 +0000</pubDate>
      <guid>/blog/breadth-vs-depth-of-knowledge/</guid>
      <description>&lt;p&gt;Forgive the rambly nature of this blog entry, just trying to&#xA;set my own thoughts straight a little bit. This isn&amp;rsquo;t intended&#xA;for anyone else, really, but I think I need to put it down&#xA;so I can track how my opinion on it has changed later on.&lt;/p&gt;&#xA;&lt;p&gt;A long time ago, I thought art was a bit of a waste of time.&#xA;Time we could be putting into solving real problems in the&#xA;world was being sunk into creating entertainment and &amp;ldquo;expressing&#xA;yourself&amp;rdquo;. At some point, my thoughts changed on this somewhat,&#xA;and I started reading more about art and music I started to&#xA;appreciate it a lot more and eventually picked up a guitar&#xA;with a tax refund one year. Nearly ten years later, I&amp;rsquo;m a&#xA;competent guitarist and have released a single EP with a band&#xA;on top of regularly writing my own music for the DnD campaigns&#xA;I run (most of which I&amp;rsquo;m not really proud enough of to release&#xA;publicly, sorry).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go&#39;s net/http package vs gin</title>
      <link>/blog/go-nethttp-vs-gin/</link>
      <pubDate>Tue, 24 Mar 2020 00:00:00 +0000</pubDate>
      <guid>/blog/go-nethttp-vs-gin/</guid>
      <description>&lt;h2 id=&#34;update-feb-20-2021&#34;&gt;UPDATE Feb 20, 2021&lt;/h2&gt;&#xA;&lt;p&gt;I checked my Google search console and realised that most of my traffic comes in through here.&#xA;Here&amp;rsquo;s the summary for you:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Golang&amp;rsquo;s &lt;code&gt;net/http&lt;/code&gt; and Gin follow much the same philosophy&lt;/li&gt;&#xA;&lt;li&gt;Gin has wrappers around route registration, which means less boilerplate&lt;/li&gt;&#xA;&lt;li&gt;Gin offers a few more convenience wrappers around deserialisation that&amp;rsquo;ll mean you&#xA;don&amp;rsquo;t have to worry about the boilerplate around the &lt;code&gt;json.Unmarshal&lt;/code&gt; function&lt;/li&gt;&#xA;&lt;li&gt;Gin uses &lt;a href=&#34;https://github.com/julienschmidt/httprouter&#34;&gt;httprouter&lt;/a&gt;, which is apparently faster&lt;/li&gt;&#xA;&lt;li&gt;Middleware works in much the same way as vanilla go&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Personally, I still prefer Goa or using OpenAPI to generate my plumbing for me, but if you&amp;rsquo;re&#xA;deadset on using a code first approach, Gin is a decent enough choice. Just be aware of the&#xA;dependencies you&amp;rsquo;re pulling in.&lt;/p&gt;</description>
    </item>
    <item>
      <title>On working from home</title>
      <link>/blog/on-home-offices/</link>
      <pubDate>Mon, 23 Mar 2020 00:00:00 +0000</pubDate>
      <guid>/blog/on-home-offices/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve long been in favour of flexible work policies that allow&#xA;remote work where possible. While there are many benefits in&#xA;face to face contact, I personally believe that having a home&#xA;office helps productivity and quality of life.&lt;/p&gt;&#xA;&lt;p&gt;With the current pandemic, I&amp;rsquo;ve spent the last sprint working&#xA;from home, and we managed to blaze through enough work to&#xA;convince the executives somewhat that a remote first policy&#xA;is certainly viable. I think this is being bolstered by the&#xA;numbers from many other offices around the world, showing&#xA;nervous middle management that their reluctance was more about&#xA;the inability to move beyond their comfort zone than it was&#xA;about productivity.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Writing testable Go code</title>
      <link>/blog/testable-code-in-go/</link>
      <pubDate>Wed, 11 Mar 2020 00:00:00 +0000</pubDate>
      <guid>/blog/testable-code-in-go/</guid>
      <description>&lt;p&gt;Testing in golang is much like any other language, and Go even&#xA;comes with some of its own tools to write your tests with.&lt;/p&gt;&#xA;&lt;p&gt;Today I&amp;rsquo;m going to share a couple of the tricks I&amp;rsquo;ve learned&#xA;to make sure the code comes out smelling like a patch of roses&#xA;with a sensible amount of code coverage&lt;/p&gt;&#xA;&lt;h2 id=&#34;build-tools&#34;&gt;Build Tools&lt;/h2&gt;&#xA;&lt;p&gt;I always have some makefile targets to run my tests and build&#xA;tags in my code to run all my tests.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Black Hat Go first impressions</title>
      <link>/blog/black-hat-go-first-impressions/</link>
      <pubDate>Tue, 03 Mar 2020 00:00:00 +0000</pubDate>
      <guid>/blog/black-hat-go-first-impressions/</guid>
      <description>&lt;p&gt;I picked up my order of Black Hat Go last week, and after flicking&#xA;through and reading (not necessarily doing), I have a few things to&#xA;say based on my skim through.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.bookdepository.com/Black-Hat-Go/9781593278656&#34;&gt;&lt;img src=&#34;./bhg.png&#34; alt=&#34;Cover Art&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;presentation&#34;&gt;Presentation&lt;/h2&gt;&#xA;&lt;p&gt;The layout is logical, and it steps through each technique quite&#xA;thoroughly in a similar way to black hat python. It&amp;rsquo;s quite&#xA;an easy read if you know what you&amp;rsquo;re looking at&lt;/p&gt;&#xA;&lt;h2 id=&#34;modern-solutions-to-modern-problems&#34;&gt;Modern Solutions to Modern Problems&lt;/h2&gt;&#xA;&lt;p&gt;There&amp;rsquo;s a heavy emphasis on not reinventing the wheel, which&#xA;I can appreciate. One section is dedicated to interfacing with&#xA;Shodan, and there&amp;rsquo;s quite a few examples that use Metasploit&#xA;quite prominently.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Concurrency in Go</title>
      <link>/blog/concurrency-in-go/</link>
      <pubDate>Wed, 26 Feb 2020 00:00:00 +0000</pubDate>
      <guid>/blog/concurrency-in-go/</guid>
      <description>&lt;p&gt;Something I&amp;rsquo;ve really come to appreciate over the last 2 years or so I&amp;rsquo;ve been using Go is its&#xA;concurrency constructs. It&amp;rsquo;s trivial to push something out into another goroutine, and it takes&#xA;virtually no effort to synchronise your workers.&lt;/p&gt;&#xA;&lt;p&gt;The most obvious place to start is with the &lt;code&gt;go&lt;/code&gt; keyword&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-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&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:#f92672&#34;&gt;import&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:#e6db74&#34;&gt;&amp;#34;log&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;&#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;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;worker&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&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:#a6e22e&#34;&gt;log&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hello from worker %d&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;id&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&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;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt; &amp;lt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&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;go&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;worker&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;i&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:#a6e22e&#34;&gt;log&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Goodbye from main&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Simply prepend it to a function call and it will push it off to the background for you. Much easier&#xA;than trying to spin off a bunch of pthreads or writing a large amount of boilerplate to set up a&#xA;worker pool.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting Started with Asterisk</title>
      <link>/blog/dockerising-asterisk/</link>
      <pubDate>Wed, 19 Feb 2020 00:00:00 +0000</pubDate>
      <guid>/blog/dockerising-asterisk/</guid>
      <description>&lt;p&gt;I currently work for a company that deals in call centre software,&#xA;and until this point I hadn&amp;rsquo;t really started looking into the VOIP&#xA;side of everything. I decided I should probably change that&lt;/p&gt;&#xA;&lt;h2 id=&#34;first-order-of-business-set-up-sip&#34;&gt;First Order of Business: Set up SIP&lt;/h2&gt;&#xA;&lt;p&gt;The first thing I wanted to do was set up Asterisk, and I thought&#xA;the best way of doing this would be to set up the basic hello world&#xA;server from the docs. You can find it on my &lt;a href=&#34;https://gitlab.com/threetoes/asterisk-container/&#34;&gt;Gitlab&lt;/a&gt;&#xA;or you can just pull down and run the container using&#xA;&lt;code&gt;docker run -p5060:5060 -p5060:5060/udp registry.gitlab.com/threetoes/asterisk-container&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Making Cloudformation Generic</title>
      <link>/blog/making-cloudformation-generic/</link>
      <pubDate>Thu, 13 Feb 2020 00:00:00 +0000</pubDate>
      <guid>/blog/making-cloudformation-generic/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve spent the better part of the week pulling apart one of my&#xA;own Cloudformation stacks trying to make it suitable to take with&#xA;us between clients, and as such I&amp;rsquo;ve picked up some ideas on&#xA;how to make it more portable between environments. I&amp;rsquo;ll probably&#xA;read some more blogs on this stuff in the coming weeks, but&#xA;here&amp;rsquo;s the small collection of tips I&amp;rsquo;ve come away with&#xA;trying to get this stack into our new account.&lt;/p&gt;</description>
    </item>
    <item>
      <title>API first web services</title>
      <link>/blog/specification_first_apis/</link>
      <pubDate>Wed, 05 Feb 2020 00:00:00 +0000</pubDate>
      <guid>/blog/specification_first_apis/</guid>
      <description>&lt;p&gt;Recently, it&amp;rsquo;s become apparent at work that we should probably&#xA;have skeletons in place to make it easier to get a new AWS service&#xA;up and running. At the moment, the HTTP framework of choice is&#xA;&lt;a href=&#34;https://github.com/gin-gonic/gin&#34;&gt;Gin&lt;/a&gt;, which is a nice enough&#xA;framework that provides a familiar workflow:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Write your tests&lt;/li&gt;&#xA;&lt;li&gt;Write your logic&lt;/li&gt;&#xA;&lt;li&gt;Wire up your endpoints&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;design-first&#34;&gt;Design First&lt;/h1&gt;&#xA;&lt;p&gt;However, while working elsewhere I was won around to the idea&#xA;of Swagger first implementation of web services. At first I was&#xA;skeptical, having come from the Spring boot world where you&#xA;just slap a &lt;code&gt;@Controller&lt;/code&gt; annotation on a class to make a new&#xA;endpoint, and the spec first tools I&amp;rsquo;d used in the past in my&#xA;own tinkering were a little meh to say the least.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Assumed Roles with the AWS SDK</title>
      <link>/blog/aws_sdk_with_assumed_roles/</link>
      <pubDate>Wed, 22 Jan 2020 00:00:00 +0000</pubDate>
      <guid>/blog/aws_sdk_with_assumed_roles/</guid>
      <description>&lt;p&gt;Something I haven&amp;rsquo;t noticed before, mostly because I haven&amp;rsquo;t needed it&#xA;until recently, is using assumed roles to authorise applications&#xA;with the Amazon SDK. I was met with the following error when&#xA;I tried to use a profile defined with a &lt;code&gt;role_arn&lt;/code&gt; and &lt;code&gt;source_profile&lt;/code&gt;&#xA;instead of an access ID and secret&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;encountered error: NoCredentialProviders: no valid providers in chain. Deprecated.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; For verbose messaging see aws.Config.CredentialsChainVerboseErrors&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Took me a little bit to find the solution via Duck duck go, but it&#xA;turns out you can&amp;rsquo;t use the &lt;code&gt;AWS_PROFILE&lt;/code&gt; environment variable here.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting started with Cloudformation</title>
      <link>/blog/getting_started_with_cloudformation/</link>
      <pubDate>Mon, 13 Jan 2020 00:00:00 +0000</pubDate>
      <guid>/blog/getting_started_with_cloudformation/</guid>
      <description>&lt;p&gt;About 2 and a half years ago, I set upon what would be the first step&#xA;of my career in cloud computing. While skeptical at the time, I very&#xA;quickly adapted and realised the immediate benefits I was getting&#xA;from AWS, and especially how I, as a developer, was going to benefit.&lt;/p&gt;&#xA;&lt;p&gt;I first came into contact with cloudformation when our platform team&#xA;told us about our base infrastructure repo, where I was to spin&#xA;up the s3 buckets I needed for something I was working on. No problem,&#xA;I thought, it&amp;rsquo;s just YAML.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Minds.com Profile</title>
      <link>/blog/minds_profile/</link>
      <pubDate>Sat, 11 Jan 2020 00:00:00 +0000</pubDate>
      <guid>/blog/minds_profile/</guid>
      <description>&lt;p&gt;I created a minds.com profile, because I hate Twitter and refuse to&#xA;use it. You can find me on there as &lt;a href=&#34;https://www.minds.com/threetoes/&#34;&gt;@threetoes&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Git Driven Command and Control Part 1</title>
      <link>/blog/python_command_and_control/</link>
      <pubDate>Sat, 04 Jan 2020 00:00:00 +0000</pubDate>
      <guid>/blog/python_command_and_control/</guid>
      <description>&lt;p&gt;Happy new year! I&amp;rsquo;ve been busy visiting family for the last little bit, so&#xA;haven&amp;rsquo;t had a lot of time to write blogs. Today I&amp;rsquo;m going to show the basics&#xA;of a command and control server, which I&amp;rsquo;ve loosely based of Black Hat Python&#xA;but decided to write from scratch just for the fun of it. &lt;a href=&#34;https://github.com/ThreeToes/python-command-and-control&#34;&gt;Code is available&#xA;on my github&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-point&#34;&gt;The point&lt;/h2&gt;&#xA;&lt;p&gt;This is a thing I&amp;rsquo;ve used in the past to control some raspberry pis I kept&#xA;under my living room coffee table for a while. I had a github repo&#xA;set up similarly to the one I&amp;rsquo;ll detail in this post, and they would&#xA;bot around and scrape websites based on what I&amp;rsquo;d put in my config repo.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fyne GUIs</title>
      <link>/blog/fyne_guis/</link>
      <pubDate>Sat, 21 Dec 2019 00:00:00 +0000</pubDate>
      <guid>/blog/fyne_guis/</guid>
      <description>&lt;p&gt;Something that took my interest at GopherConAU this year was Steve O&amp;rsquo;Connor&amp;rsquo;s talk&#xA;&lt;a href=&#34;https://www.youtube.com/watch?v=_U_RlFoSuxc&amp;amp;t=30s&#34;&gt;The Fyne GUI Toolkit&lt;/a&gt;, where he&#xA;showcased what Fyne was capable of.&lt;/p&gt;&#xA;&lt;p&gt;Anyone that&amp;rsquo;s worked with me knows I have WinForms induced PTSD when it comes to GUI&#xA;toolkits, long ago coming to the conclusion that anything I wrote will just be a console&#xA;app or web API. While in the past, I&amp;rsquo;ve found WPF quite comfortable and had minimal&#xA;amounts of success using the Angular framework with Material, it&amp;rsquo;s just too fiddly and&#xA;annoying for a colourblind person like me to care that much about GUI programming.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spamming the Spammers</title>
      <link>/blog/spamming_the_spammers/</link>
      <pubDate>Thu, 12 Dec 2019 00:00:00 +0000</pubDate>
      <guid>/blog/spamming_the_spammers/</guid>
      <description>&lt;p&gt;So I&amp;rsquo;ve been getting some intriguing emails lately, featuring auto replies from contact&#xA;us forms saying thank you for your message.&lt;/p&gt;&#xA;&lt;p&gt;Finally got one that included the body that was sent and sure enough it had a link&#xA;to a &amp;ldquo;German&amp;rdquo; SEO company. Digging further, I found their contact form submitted to a&#xA;3rd party site, an &amp;ldquo;American&amp;rdquo; ad agency which doesn&amp;rsquo;t seem to exist at all.&lt;/p&gt;&#xA;&lt;p&gt;I dug through the site a bit more, just to confirm that they were definitely fake.&#xA;Just a hint, if you want to sell yourself as tech savvy make sure your website&#xA;isn&amp;rsquo;t a hot mess like mine. What intrigued me, though, is how their webform didn&amp;rsquo;t&#xA;seem to require any sort of CSRF token, nor did it seem to demand any additional state&#xA;beyond the form data.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Black Hat Python - ARP Cache Poisoner</title>
      <link>/blog/black_hat_python_arp_poisoner/</link>
      <pubDate>Wed, 04 Dec 2019 00:00:00 +0000</pubDate>
      <guid>/blog/black_hat_python_arp_poisoner/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/ThreeToes/bhp-arp-poisoner&#34;&gt;Code is on my gihub&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;December is upon us, so my wife and I have started our annual Christmas movie&#xA;binge. I finished this script up while we had Die Hard on, and kept wandering&#xA;back into the study to check my desktop&amp;rsquo;s ARP cache as the book suggested.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve done my usual thing of adding an argument parser to it, and I&amp;rsquo;ve made&#xA;a couple of hacks to try and make everything shutdown a little more cleanly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Black Hat Python - Network Scanner</title>
      <link>/blog/black_hat_python_network_scanner/</link>
      <pubDate>Wed, 27 Nov 2019 00:00:00 +0000</pubDate>
      <guid>/blog/black_hat_python_network_scanner/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/ThreeToes/bhp-network-scanner&#34;&gt;Code is on my gihub&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Another one where the script was more or less perfect as it was, minus the&#xA;usual socket read/writes and print statements. One really odd thing is&#xA;I guess there was a print error in the book.&lt;/p&gt;&#xA;&lt;p&gt;The IP header structure was defined as&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-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;_fields_ &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:#e6db74&#34;&gt;&amp;#34;ihl&amp;#34;&lt;/span&gt;,  c_ubyte, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&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:#e6db74&#34;&gt;&amp;#34;version&amp;#34;&lt;/span&gt;,  c_ubyte, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&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:#e6db74&#34;&gt;&amp;#34;tos&amp;#34;&lt;/span&gt;,  c_ubyte),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;len&amp;#34;&lt;/span&gt;,  c_ushort),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;,  c_ushort),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;offset&amp;#34;&lt;/span&gt;, c_ushort),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ttl&amp;#34;&lt;/span&gt;,  c_ubyte),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;protocol_num&amp;#34;&lt;/span&gt;,  c_ubyte),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;sum&amp;#34;&lt;/span&gt;,  c_ushort),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;src&amp;#34;&lt;/span&gt;,  c_ulong),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dst&amp;#34;&lt;/span&gt;,  c_ulong)&#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;Which I needed to change to&lt;/p&gt;</description>
    </item>
    <item>
      <title>Black Hat Python - SSH Proxy</title>
      <link>/blog/black_hat_python_ssh_proxy/</link>
      <pubDate>Mon, 18 Nov 2019 00:00:00 +0000</pubDate>
      <guid>/blog/black_hat_python_ssh_proxy/</guid>
      <description>&lt;p&gt;This one actually ended up being pretty much a straight port over. I decided&#xA;to keep with the quick and dirty approach here because I&amp;rsquo;ve been procrastinating&#xA;about doing it for the last week, so just getting it over and done with for now.&#xA;The code is available &lt;a href=&#34;https://github.com/ThreeToes/bhp-ssh-proxy&#34;&gt;here&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;core-lesson&#34;&gt;Core lesson&lt;/h2&gt;&#xA;&lt;p&gt;This script shows off the transport mode of Paramiko, and since we don&amp;rsquo;t really&#xA;do anything with the data we read off the sockets there really wasn&amp;rsquo;t a lot&#xA;to do around the socket reads and writes. In theory we could intercept these&#xA;messages and munge them as we wanted.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Black Hat Python - SSH with Paramiko</title>
      <link>/blog/black_hat_python_ssh/</link>
      <pubDate>Sun, 03 Nov 2019 00:00:00 +0000</pubDate>
      <guid>/blog/black_hat_python_ssh/</guid>
      <description>&lt;p&gt;I finished this one up in Sydney airport this afternoon, though I think I went a&#xA;little overboard while working on it. I gave a go of keying a dictionary&#xA;with SSH channel objects and it seems to work, so I improved on my message reading&#xA;loop from last time a little bit.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-premise&#34;&gt;The Premise&lt;/h2&gt;&#xA;&lt;p&gt;This chapter presented us with a single server/single client to execute commands&#xA;on a connecting client. I&amp;rsquo;ve changed that a little to be a more persistent&#xA;connection to multiple clients, though you could probably just pump a shell&#xA;script down the pipe and close the connection.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Black Hat Python TCP Proxy Rewrite</title>
      <link>/blog/black_hat_python_tcp_proxy/</link>
      <pubDate>Thu, 24 Oct 2019 00:00:00 +0000</pubDate>
      <guid>/blog/black_hat_python_tcp_proxy/</guid>
      <description>&lt;p&gt;This next section was pretty easy to port. My implementation&#xA;isn&amp;rsquo;t as clean as it could be, but for an implementation that took&#xA;me an hour or so to get working then another hour or so to&#xA;clean up a little. The repo is &lt;a href=&#34;https://github.com/ThreeToes/bhp-tcp-proxy&#34;&gt;here&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-main-problem&#34;&gt;The Main Problem&lt;/h2&gt;&#xA;&lt;p&gt;Exactly the same as the netcat script. The socket methods don&amp;rsquo;t return&#xA;strings any more, so let&amp;rsquo;s see what we can do about that&lt;/p&gt;</description>
    </item>
    <item>
      <title>Updating Black Hat Python: Netcat Replacement</title>
      <link>/blog/blackhat-python-netcat-replacement/</link>
      <pubDate>Wed, 16 Oct 2019 00:00:00 +0000</pubDate>
      <guid>/blog/blackhat-python-netcat-replacement/</guid>
      <description>&lt;p&gt;First order of business is updating the netcat replacement Seitz&#xA;has written so it works again. My code is&#xA;&lt;a href=&#34;http://www.github.com/threetoes/bhpnettool&#34;&gt;here&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;the-issues&#34;&gt;The issues&lt;/h3&gt;&#xA;&lt;p&gt;Simply put our biggest problem here is types.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;socket.recv&lt;/code&gt; and &lt;code&gt;socket.send&lt;/code&gt; no longer deal with strings and&#xA;expect a &lt;code&gt;bytes&lt;/code&gt; type, so our updated script will need to be aware&#xA;of and work with those, meaning we can&amp;rsquo;t really rely on newline&#xA;characters to denote the end of a message. Our new implementation&#xA;will need to change this up to utilise those new types&lt;/p&gt;</description>
    </item>
    <item>
      <title>Updating Black Hat Python Scripts for Python 3</title>
      <link>/blog/black-hat-python3/</link>
      <pubDate>Mon, 14 Oct 2019 00:00:00 +0000</pubDate>
      <guid>/blog/black-hat-python3/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been working through the book &lt;em&gt;Black Hat Python&lt;/em&gt;, and it&amp;rsquo;s&#xA;got some good code recipes, but the code doesn&amp;rsquo;t really work as is.&#xA;&lt;img src=&#34;/blog/black-hat-python3/black_hat_python_cover.png&#34; alt=&#34;Black Hat Python Cover&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m thinking I could do a blog series where I update each script&#xA;to work with Python 3, then I might port it all to golang for&#xA;laughs. I&amp;rsquo;ll start with the &lt;code&gt;Replacing Netcat&lt;/code&gt; chapter over the&#xA;course of this week, and we&amp;rsquo;ll see how that goes, then take it from&#xA;there. I hope to not only rewrite the scripts, but go into depth&#xA;about why they broke, if only to get my own thoughts straight on it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Interviews from the other side of the table</title>
      <link>/blog/interviews-from-the-other-side/</link>
      <pubDate>Sun, 13 Oct 2019 00:00:00 +0000</pubDate>
      <guid>/blog/interviews-from-the-other-side/</guid>
      <description>&lt;p&gt;Have you been stuck for tech interview ideas?&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve had a lot of chats with people about this as of late (don&amp;rsquo;t really&#xA;know why, I&amp;rsquo;ve never run an interview before), but it seems to be&#xA;something that comes up a lot because there&amp;rsquo;s no manual on&#xA;how to do it.&lt;/p&gt;&#xA;&lt;p&gt;Having spent the last couple of weeks looking for work, I&amp;rsquo;ve had&#xA;a few interviews now, and I&amp;rsquo;m here to give you some general&#xA;feedback on my experiences and what I think worked really well and why,&#xA;and the inverse where I just felt like I wasted my time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Time to try again</title>
      <link>/blog/blog-mk3/</link>
      <pubDate>Fri, 04 Oct 2019 00:00:00 +0000</pubDate>
      <guid>/blog/blog-mk3/</guid>
      <description>&lt;p&gt;Having issues with Tumblr, time to move again. Luckily I learned about Gatsby and markdown&#xA;driven static sites, so I&amp;rsquo;m going to give this a go using S3 and a codepipeline job to&#xA;push it out to the live site.&lt;/p&gt;&#xA;&lt;p&gt;Going to have to change a few things in this app, it seems to insist on a cover image for&#xA;each blog post when it&amp;rsquo;s only really a nice to have for me. I just want something I can&#xA;edit in vim and push out with git.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
