<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="https://sierrasoftworks.com/atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
  <id>https://sierrasoftworks.com/</id>
  <title>Sierra Softworks Blog</title>
  <subtitle>The official Sierra Softworks blog.</subtitle>
  <author>
    <name>Benjamin Pannell</name>
    <uri>https://benjamin.pannell.dev</uri>
  </author>
  <icon>https://cdn.sierrasoftworks.com/logos/icon.png</icon>
  <rights>Copyright © 2025 Sierra Softworks</rights>
  <updated>2025-11-12T22:04:50.919Z</updated>
  <generator>@vuepress/plugin-feed</generator>
  <link rel="self" href="https://sierrasoftworks.com/atom.xml"/>
  <link rel="alternate" href="https://sierrasoftworks.com/"/>
  <category term="leadership"/>
  <category term="programming"/>
  <category term="3d-printing"/>
  <category term="business"/>
  <category term="technology"/>
  <category term="operations"/>
  <category term="databases"/>
  <category term="development"/>
  <category term="advent-of-code"/>
  <category term="finance"/>
  <category term="home-automation"/>
  <category term="psychology"/>
  <category term="sre"/>
  <category term="processes"/>
  <category term="culture"/>
  <category term="theory"/>
  <category term="security"/>
  <category term="github"/>
  <category term="hashicorp"/>
  <category term="azure"/>
  <category term="planning"/>
  <category term="observability"/>
  <category term="balance"/>
  <category term="architecture"/>
  <category term="web"/>
  <category term="projects"/>
  <category term="design"/>
  <contributor>
    <name>Benjamin Pannell</name>
    <uri>https://benjamin.pannell.dev</uri>
  </contributor>
  <entry>
    <title type="text">Taking a Stance</title>
    <id>https://sierrasoftworks.com/2025/01/25/taking-a-stance/</id>
    <link href="https://sierrasoftworks.com/2025/01/25/taking-a-stance/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Multi-agent systems, in which several distinct and independent entities interact with one another,
suffer from a key challenge: the complexity of the interactions within the system grows exponentially
as the number of interacting agents increases. This same model maps to organizations and even the
lives of individuals.</p>
<p>As leaders attempting to develop and execute effective strategies, we are often faced with the
need to predict system behaviour and make decisions based on those predictions. As the number of
entities within our strategic model grows, our ability to accurately predict outcomes decreases.</p>
<p>In this post I propose a model for estimating our prediction accuracy, common pitfalls and the impact
they have, and a model which enables us to take appropriate actions regardless.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="taking-a-stance" tabindex="-1"><a class="header-anchor" href="#taking-a-stance"><span>Taking a Stance</span></a></h1>
<p>Multi-agent systems, in which several distinct and independent entities interact with one another,
suffer from a key challenge: the complexity of the interactions within the system grows exponentially
as the number of interacting agents increases. This same model maps to organizations and even the
lives of individuals.</p>
<p>As leaders attempting to develop and execute effective strategies, we are often faced with the
need to predict system behaviour and make decisions based on those predictions. As the number of
entities within our strategic model grows, our ability to accurately predict outcomes decreases.</p>
<p>In this post I propose a model for estimating our prediction accuracy, common pitfalls and the impact
they have, and a model which enables us to take appropriate actions regardless.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="leadership"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2025-01-25T23:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Creating a Task in .NET</title>
    <id>https://sierrasoftworks.com/2024/11/26/dotnet-task-new/</id>
    <link href="https://sierrasoftworks.com/2024/11/26/dotnet-task-new/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Today I found something surprising - a piece of code in C# which awaited a <code>new Task(...)</code>
and which achieved its goal, but did the opposite of what I expected. Indeed, instead
of the task running to completion, it instead never completed. In this post I'll share
some interesting empirical observations about how this works and talk about how this
differs from asynchronous execution systems in other languages.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="creating-a-task-in-net" tabindex="-1"><a class="header-anchor" href="#creating-a-task-in-net"><span>Creating a Task in .NET</span></a></h1>
<p>Today I found something surprising - a piece of code in C# which awaited a <code v-pre>new Task(...)</code>
and which achieved its goal, but did the opposite of what I expected. Indeed, instead
of the task running to completion, it instead never completed. In this post I'll share
some interesting empirical observations about how this works and talk about how this
differs from asynchronous execution systems in other languages.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="programming"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2024-11-26T20:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Prusa XL Review</title>
    <id>https://sierrasoftworks.com/2024/10/24/prusa-xl-review/</id>
    <link href="https://sierrasoftworks.com/2024/10/24/prusa-xl-review/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>The Prusa XL is a high-end Core-XY 3D printer from Prusa Research, the technical specifications of
which you can find on their <a href="https://www.prusa3d.com/original-prusa-xl/" target="_blank" rel="noopener noreferrer">product page</a>. I was recently
looking add another printer to my home lab, alongside my trusty Voron 2.4R2, and the Prusa XL was one
of several printers I considered - it is also ultimately the one I chose to purchase based on its unique
set of trade-offs.</p>
<img src="//cdn.sierrasoftworks.com/blog/2024-10-24-prusa-xl-dark.jpg" width="500" alt="An image of the Prusa XL.">
<p>The biggest challenge I faced making this decision was the lack of any deep technical reviews of the Prusa
XL, so I'm going to try and close that gap here by sharing my thoughts and experiences through the lens of
someone who has spent the last couple of years diving into the guts of what makes for a reliable 3D printer.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="prusa-xl-review" tabindex="-1"><a class="header-anchor" href="#prusa-xl-review"><span>Prusa XL Review</span></a></h1>
<p>The Prusa XL is a high-end Core-XY 3D printer from Prusa Research, the technical specifications of
which you can find on their <a href="https://www.prusa3d.com/original-prusa-xl/" target="_blank" rel="noopener noreferrer">product page</a>. I was recently
looking add another printer to my home lab, alongside my trusty Voron 2.4R2, and the Prusa XL was one
of several printers I considered - it is also ultimately the one I chose to purchase based on its unique
set of trade-offs.</p>
<img src="//cdn.sierrasoftworks.com/blog/2024-10-24-prusa-xl-dark.jpg" width="500" alt="An image of the Prusa XL." />
<p>The biggest challenge I faced making this decision was the lack of any deep technical reviews of the Prusa
XL, so I'm going to try and close that gap here by sharing my thoughts and experiences through the lens of
someone who has spent the last couple of years diving into the guts of what makes for a reliable 3D printer.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="3d-printing"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2024-10-24T12:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Illusions as a Service</title>
    <id>https://sierrasoftworks.com/2024/06/01/illusions/</id>
    <link href="https://sierrasoftworks.com/2024/06/01/illusions/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>The world today strikes a particularly jarring contrast with the one I grew up
in. Buzz-words and gimmicks have taken center stage in an environment where a
"cheap" alternative can be found for threepence on the quart (or however that
monetary system worked).</p>
<p>To compete in a sea of identical products, companies pitch differentiating
features, many of which seem to have been crafted through a haphazard "Cards
against Humanity" approach where every second card is the word "AI". Before that
it was "Blockchain", and before that "The Cloud".</p>
<p>Thing is, for all that these products will try to convince you that they have
the singular ability to magically solve whatever problem you face; the simple
reality is that the laws of physics cannot be negotiated with.</p>
<p>There is no magic, you cannot beat the Shannon compression limit, you can't
move information faster than the speed of light, and you must choose between
consistency or availability.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="illusions-as-a-service" tabindex="-1"><a class="header-anchor" href="#illusions-as-a-service"><span>Illusions as a Service</span></a></h1>
<p>The world today strikes a particularly jarring contrast with the one I grew up
in. Buzz-words and gimmicks have taken center stage in an environment where a
&quot;cheap&quot; alternative can be found for threepence on the quart (or however that
monetary system worked).</p>
<p>To compete in a sea of identical products, companies pitch differentiating
features, many of which seem to have been crafted through a haphazard &quot;Cards
against Humanity&quot; approach where every second card is the word &quot;AI&quot;. Before that
it was &quot;Blockchain&quot;, and before that &quot;The Cloud&quot;.</p>
<p>Thing is, for all that these products will try to convince you that they have
the singular ability to magically solve whatever problem you face; the simple
reality is that the laws of physics cannot be negotiated with.</p>
<p>There is no magic, you cannot beat the Shannon compression limit, you can't
move information faster than the speed of light, and you must choose between
consistency or availability.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="business"/>
    <category term="technology"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2024-06-01T03:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Fixing PostgreSQL Sequence Numbers</title>
    <id>https://sierrasoftworks.com/2024/05/28/postgres-sequence-fix/</id>
    <link href="https://sierrasoftworks.com/2024/05/28/postgres-sequence-fix/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>If you've found yourself in a situation where your PostgreSQL database
sequence numbers are out of sync with the data in your tables, you'll likely
want to get to fixing that.</p>
<p>This script is intended to automatically fix the sequence numbers for all tables in the current database.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="fixing-postgresql-sequence-numbers" tabindex="-1"><a class="header-anchor" href="#fixing-postgresql-sequence-numbers"><span>Fixing PostgreSQL Sequence Numbers</span></a></h1>
<p>If you've found yourself in a situation where your PostgreSQL database
sequence numbers are out of sync with the data in your tables, you'll likely
want to get to fixing that.</p>
<p>This script is intended to automatically fix the sequence numbers for all tables in the current database.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="operations"/>
    <category term="databases"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2024-05-28T12:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Fixing Coverage Stats</title>
    <id>https://sierrasoftworks.com/2024/04/29/coverage-stats/</id>
    <link href="https://sierrasoftworks.com/2024/04/29/coverage-stats/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Every now and then you'll find automated code coverage tooling getting in the way
of you landing changes when you're pretty certain you've written tests for the code
in question.</p>
<p>Let's take some time to dig into how code coverage works and then use that new knowledge
to find ways to unblock ourselves.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="fixing-coverage-stats" tabindex="-1"><a class="header-anchor" href="#fixing-coverage-stats"><span>Fixing Coverage Stats</span></a></h1>
<p>Every now and then you'll find automated code coverage tooling getting in the way
of you landing changes when you're pretty certain you've written tests for the code
in question.</p>
<p>Let's take some time to dig into how code coverage works and then use that new knowledge
to find ways to unblock ourselves.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2024-04-29T12:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Be Right, Nicely</title>
    <id>https://sierrasoftworks.com/2024/01/26/be-right-nicely/</id>
    <link href="https://sierrasoftworks.com/2024/01/26/be-right-nicely/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>In the software and computer industry, we have a tendency to assume that the
world, its inhabitants, and most of all ourselves are deterministically
rational beings. At the risk of inciting the ire of the orange site, this is
patently inaccurate and allows us to justify a diverse array of logical
fallacies.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="be-right-nicely" tabindex="-1"><a class="header-anchor" href="#be-right-nicely"><span>Be Right, Nicely</span></a></h1>
<p>In the software and computer industry, we have a tendency to assume that the
world, its inhabitants, and most of all ourselves are deterministically
rational beings. At the risk of inciting the ire of the orange site, this is
patently inaccurate and allows us to justify a diverse array of logical
fallacies.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <category term="leadership"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2024-01-26T00:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Optimizing Data Algorithms</title>
    <id>https://sierrasoftworks.com/2023/12/14/optimizing-data-algorithms/</id>
    <link href="https://sierrasoftworks.com/2023/12/14/optimizing-data-algorithms/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Advent of Code 2023 has just kicked off, and I'm going to try something a bit
different this year, I'm going to try and share useful concepts and patterns
that play a role in solving each day's puzzle.</p>
<p>Today, I'm going to talk about some how I go about optimizing algorithms for
practical performance on data-intensive problems in Rust. I find that knowing
how to optimize algorithms for practical performance is one of those skills that
many overlook because it's rarely talked about, and yet it can have significant
implications on performance for your applications.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="optimizing-data-algorithms" tabindex="-1"><a class="header-anchor" href="#optimizing-data-algorithms"><span>Optimizing Data Algorithms</span></a></h1>
<p>Advent of Code 2023 has just kicked off, and I'm going to try something a bit
different this year, I'm going to try and share useful concepts and patterns
that play a role in solving each day's puzzle.</p>
<p>Today, I'm going to talk about some how I go about optimizing algorithms for
practical performance on data-intensive problems in Rust. I find that knowing
how to optimize algorithms for practical performance is one of those skills that
many overlook because it's rarely talked about, and yet it can have significant
implications on performance for your applications.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <category term="advent-of-code"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2023-12-14T00:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Debugging Shapes</title>
    <id>https://sierrasoftworks.com/2023/12/10/debugging-shapes/</id>
    <link href="https://sierrasoftworks.com/2023/12/10/debugging-shapes/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Advent of Code 2023 has just kicked off, and I'm going to try something a bit
different this year, I'm going to try and share useful concepts and patterns
that play a role in solving each day's puzzle.</p>
<p>Today, I want to talk about some cool tricks for visualizing shapes in your
application's debug output by taking advantage of Unicode's Box-drawing
characters. Most humans are visual creatures and have an incredible ability to
spot patterns and interpret visual representations of data, so taking advantage
of some of the tricks I've previously shared in <a href="/posts/2023-12-03-rust-display.html" target="_blank">Displaying Objects in Rust</a>,
we can make our debugging output much more useful.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="debugging-shapes" tabindex="-1"><a class="header-anchor" href="#debugging-shapes"><span>Debugging Shapes</span></a></h1>
<p>Advent of Code 2023 has just kicked off, and I'm going to try something a bit
different this year, I'm going to try and share useful concepts and patterns
that play a role in solving each day's puzzle.</p>
<p>Today, I want to talk about some cool tricks for visualizing shapes in your
application's debug output by taking advantage of Unicode's Box-drawing
characters. Most humans are visual creatures and have an incredible ability to
spot patterns and interpret visual representations of data, so taking advantage
of some of the tricks I've previously shared in <RouteLink to="/posts/2023-12-03-rust-display.html">Displaying Objects in Rust</RouteLink>,
we can make our debugging output much more useful.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <category term="advent-of-code"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2023-12-10T00:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Sortable Objects</title>
    <id>https://sierrasoftworks.com/2023/12/07/sortable-objects/</id>
    <link href="https://sierrasoftworks.com/2023/12/07/sortable-objects/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Advent of Code 2023 has just kicked off, and I'm going to try something a bit
different this year, I'm going to try and share useful concepts and patterns
that play a role in solving each day's puzzle.</p>
<p>Today, I wanted to talk about making your objects sortable and how you can use
this to take advantage of the built-in sort functionality in your language of
choice. This is an incredibly useful pattern to know about, and one which I
found useful for Day 7 of Advent of Code 2023.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="sortable-objects" tabindex="-1"><a class="header-anchor" href="#sortable-objects"><span>Sortable Objects</span></a></h1>
<p>Advent of Code 2023 has just kicked off, and I'm going to try something a bit
different this year, I'm going to try and share useful concepts and patterns
that play a role in solving each day's puzzle.</p>
<p>Today, I wanted to talk about making your objects sortable and how you can use
this to take advantage of the built-in sort functionality in your language of
choice. This is an incredibly useful pattern to know about, and one which I
found useful for Day 7 of Advent of Code 2023.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <category term="advent-of-code"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2023-12-07T00:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Solving Hard Problems</title>
    <id>https://sierrasoftworks.com/2023/12/06/solving-hard-problems/</id>
    <link href="https://sierrasoftworks.com/2023/12/06/solving-hard-problems/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Advent of Code 2023 has just kicked off, and I'm going to try something a bit
different this year, I'm going to try and share useful concepts and patterns
that play a role in solving each day's puzzle.</p>
<p>Today, I wanted to share a little bit of how I approach solving hard problems,
and specifically how I set things up to make it easier to remain engaged in the
face of ongoing challenges.</p>
<p>I think this is particularly relevant to Advent of Code, because the puzzles
continue to get harder each day and at some point all of us will struggle with
a problem that we just can't seem to get a solution for. I find that having a
process for remaining engaged in the face of a challenge is a superpower that
will help you grow beyond what you thought you were capable of.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="solving-hard-problems" tabindex="-1"><a class="header-anchor" href="#solving-hard-problems"><span>Solving Hard Problems</span></a></h1>
<p>Advent of Code 2023 has just kicked off, and I'm going to try something a bit
different this year, I'm going to try and share useful concepts and patterns
that play a role in solving each day's puzzle.</p>
<p>Today, I wanted to share a little bit of how I approach solving hard problems,
and specifically how I set things up to make it easier to remain engaged in the
face of ongoing challenges.</p>
<p>I think this is particularly relevant to Advent of Code, because the puzzles
continue to get harder each day and at some point all of us will struggle with
a problem that we just can't seem to get a solution for. I find that having a
process for remaining engaged in the face of a challenge is a superpower that
will help you grow beyond what you thought you were capable of.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <category term="advent-of-code"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2023-12-06T00:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Dynamic Programming</title>
    <id>https://sierrasoftworks.com/2023/12/04/dynamic-programming/</id>
    <link href="https://sierrasoftworks.com/2023/12/04/dynamic-programming/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Advent of Code 2023 has just kicked off, and I'm going to try something a bit
different this year, I'm going to try and share useful concepts and patterns
that play a role in solving each day's puzzle.</p>
<p>Today, we're looking at how you can use dynamic programming to save yourself
a lot of computation, and how I spot and reason my way towards solutions in
this space.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="dynamic-programming" tabindex="-1"><a class="header-anchor" href="#dynamic-programming"><span>Dynamic Programming</span></a></h1>
<p>Advent of Code 2023 has just kicked off, and I'm going to try something a bit
different this year, I'm going to try and share useful concepts and patterns
that play a role in solving each day's puzzle.</p>
<p>Today, we're looking at how you can use dynamic programming to save yourself
a lot of computation, and how I spot and reason my way towards solutions in
this space.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <category term="advent-of-code"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2023-12-04T00:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Displaying Objects in Rust</title>
    <id>https://sierrasoftworks.com/2023/12/03/rust-display/</id>
    <link href="https://sierrasoftworks.com/2023/12/03/rust-display/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Advent of Code 2023 has just kicked off, and I'm going to try something a bit
different this year, I'm going to try and share useful concepts and patterns
that play a role in solving each day's puzzle.</p>
<p>Today, we're looking at how you can render objects to human readable representations
in Rust, and how you can use that to make debugging your code easier.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="displaying-objects-in-rust" tabindex="-1"><a class="header-anchor" href="#displaying-objects-in-rust"><span>Displaying Objects in Rust</span></a></h1>
<p>Advent of Code 2023 has just kicked off, and I'm going to try something a bit
different this year, I'm going to try and share useful concepts and patterns
that play a role in solving each day's puzzle.</p>
<p>Today, we're looking at how you can render objects to human readable representations
in Rust, and how you can use that to make debugging your code easier.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <category term="advent-of-code"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2023-12-03T00:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Type Converters in Rust</title>
    <id>https://sierrasoftworks.com/2023/12/02/from-rust/</id>
    <link href="https://sierrasoftworks.com/2023/12/02/from-rust/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Advent of Code 2023 has just kicked off, and I'm going to try something a bit
different this year, I'm going to try and share useful concepts and patterns
that play a role in solving each day's puzzle.</p>
<p>Today, we're looking at how type converters work in Rust, and how you can use
them to create intuitive interfaces for your types.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="type-converters-in-rust" tabindex="-1"><a class="header-anchor" href="#type-converters-in-rust"><span>Type Converters in Rust</span></a></h1>
<p>Advent of Code 2023 has just kicked off, and I'm going to try something a bit
different this year, I'm going to try and share useful concepts and patterns
that play a role in solving each day's puzzle.</p>
<p>Today, we're looking at how type converters work in Rust, and how you can use
them to create intuitive interfaces for your types.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <category term="advent-of-code"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2023-12-02T00:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Iterators in Rust</title>
    <id>https://sierrasoftworks.com/2023/12/01/rust-iterators/</id>
    <link href="https://sierrasoftworks.com/2023/12/01/rust-iterators/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Advent of Code 2023 has just kicked off, and I'm going to try something a bit
different this year, I'm going to try and share useful concepts and patterns
that play a role in solving each day's puzzle.</p>
<p>Today, we're looking at iterators (in Rust) and how they can be used to
simplify your code by abstracting away the complex details of incremental
computation.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="iterators-in-rust" tabindex="-1"><a class="header-anchor" href="#iterators-in-rust"><span>Iterators in Rust</span></a></h1>
<p>Advent of Code 2023 has just kicked off, and I'm going to try something a bit
different this year, I'm going to try and share useful concepts and patterns
that play a role in solving each day's puzzle.</p>
<p>Today, we're looking at iterators (in Rust) and how they can be used to
simplify your code by abstracting away the complex details of incremental
computation.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <category term="advent-of-code"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2023-12-01T00:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">YNAB Automation</title>
    <id>https://sierrasoftworks.com/2023/11/26/ynab-automation/</id>
    <link href="https://sierrasoftworks.com/2023/11/26/ynab-automation/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Over the years I have tried several different budgeting tools, from spreadsheets, to desktop applications,
to one-person-startups, and finally to <a href="https://www.ynab.com" target="_blank" rel="noopener noreferrer">YNAB</a>. They've all had their quirks and limitations,
but in the end YNAB is the one I've hated the least, and with some creative automation, I've been able to
close the deal-breaking gaps in its functionality and happily use it for several years now.</p>
<p>In this post, I'll share how I've set built and hosted my own YNAB automation system, and how you can
easily (literally a few minutes) set up your own.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="ynab-automation" tabindex="-1"><a class="header-anchor" href="#ynab-automation"><span>YNAB Automation</span></a></h1>
<p>Over the years I have tried several different budgeting tools, from spreadsheets, to desktop applications,
to one-person-startups, and finally to <a href="https://www.ynab.com" target="_blank" rel="noopener noreferrer">YNAB</a>. They've all had their quirks and limitations,
but in the end YNAB is the one I've hated the least, and with some creative automation, I've been able to
close the deal-breaking gaps in its functionality and happily use it for several years now.</p>
<p>In this post, I'll share how I've set built and hosted my own YNAB automation system, and how you can
easily (literally a few minutes) set up your own.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="finance"/>
    <category term="home-automation"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2023-11-26T00:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Ductile Burnout</title>
    <id>https://sierrasoftworks.com/2023/04/01/ductile-burnout/</id>
    <link href="https://sierrasoftworks.com/2023/04/01/ductile-burnout/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Burnout is one of those terms that most of us have heard
used in our professional lives, many of us have been
subject to, and yet few of us really have a means of
grasping the severity of the problem or when it goes
too far.</p>
<p>Hopefully this post will give you some ideas no how to
reason about burnout in both your professional and
personal environments.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="ductile-burnout" tabindex="-1"><a class="header-anchor" href="#ductile-burnout"><span>Ductile Burnout</span></a></h1>
<p>Burnout is one of those terms that most of us have heard
used in our professional lives, many of us have been
subject to, and yet few of us really have a means of
grasping the severity of the problem or when it goes
too far.</p>
<p>Hopefully this post will give you some ideas no how to
reason about burnout in both your professional and
personal environments.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <category term="psychology"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2023-04-01T00:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">ASP.NET Lock Contention</title>
    <id>https://sierrasoftworks.com/2022/07/22/aspnet-api-locks/</id>
    <link href="https://sierrasoftworks.com/2022/07/22/aspnet-api-locks/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>If you're running a (large) API on ASP.NET (.NET Framework) there's a good chance that
you're significantly throughput and concurrency limited. Part of this is no doubt due to
the relative performance increases we've seen in ASP.NET Core over the years, but I'm here
to show you a one line change you can make which (depending on your use case) might unlock
a significant amount of additional performance headroom.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="asp-net-lock-contention" tabindex="-1"><a class="header-anchor" href="#asp-net-lock-contention"><span>ASP.NET Lock Contention</span></a></h1>
<p>If you're running a (large) API on ASP.NET (.NET Framework) there's a good chance that
you're significantly throughput and concurrency limited. Part of this is no doubt due to
the relative performance increases we've seen in ASP.NET Core over the years, but I'm here
to show you a one line change you can make which (depending on your use case) might unlock
a significant amount of additional performance headroom.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <category term="sre"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2022-07-22T00:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Commenting in Reviews</title>
    <id>https://sierrasoftworks.com/2022/06/13/commenting-in-reviews/</id>
    <link href="https://sierrasoftworks.com/2022/06/13/commenting-in-reviews/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>As engineers, managers, friends, or family members we are often called upon to review
the work of others. Reviews are a critical part of our professional social contract and
give us the opportunity to build cohesion, socialize knowledge, improve clarity, and
support the production of high quality artifacts.</p>
<p>How we comment in a review determines whether we are able to foster those positive
outcomes, or end up in a confrontation over the validity of our distinct perspectives.
In this blog post I'll talk about how you can approach reviews in a manner which is
more likely to succeed in more situations.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="commenting-in-reviews" tabindex="-1"><a class="header-anchor" href="#commenting-in-reviews"><span>Commenting in Reviews</span></a></h1>
<p>As engineers, managers, friends, or family members we are often called upon to review
the work of others. Reviews are a critical part of our professional social contract and
give us the opportunity to build cohesion, socialize knowledge, improve clarity, and
support the production of high quality artifacts.</p>
<p>How we comment in a review determines whether we are able to foster those positive
outcomes, or end up in a confrontation over the validity of our distinct perspectives.
In this blog post I'll talk about how you can approach reviews in a manner which is
more likely to succeed in more situations.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="processes"/>
    <category term="culture"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2022-06-13T00:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">What could SRE be?</title>
    <id>https://sierrasoftworks.com/2022/06/08/what-could-sre-be/</id>
    <link href="https://sierrasoftworks.com/2022/06/08/what-could-sre-be/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Site Reliability Engineering is an incredibly interesting field, one which has straddled
the interesting line of both being relatively clearly defined and being hugely open to
interpretation. For many familiar with it, the idea of SRE brings thoughts of SLI/SLO/SLAs,
incident response, on-call, and an obsession with system architecture and failure modes. For
others, the line between concepts like DevOps and SRE is hard to make out, and to add yet
another perspective to the pile - it can simply mean "we want to hire an ops team, but nobody
wants to work for us unless we call it something else".</p>
<p>Recently, Niall Murphy (one of the original authors of the (in)famous Google SRE Book) wrote
<a href="https://blog.relyabilit.ie/what-sre-could-be/" target="_blank" rel="noopener noreferrer">a thought provoking piece</a> about the future of
SRE and the assumptions that underpin it. It does a great job of articulating some of the
problems that have consistently worn a blister in my experience of SRE - especially when it comes
to articulating what it is we do to leadership.</p>
<p>I'd like to present what Site Reliability Engineering means to me and a hypothesis for what
SRE may be when we take a step back from some of the implementation details.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="what-is-site-reliability-engineering" tabindex="-1"><a class="header-anchor" href="#what-is-site-reliability-engineering"><span>What is Site Reliability Engineering?</span></a></h1>
<p>Site Reliability Engineering is an incredibly interesting field, one which has straddled
the interesting line of both being relatively clearly defined and being hugely open to
interpretation. For many familiar with it, the idea of SRE brings thoughts of SLI/SLO/SLAs,
incident response, on-call, and an obsession with system architecture and failure modes. For
others, the line between concepts like DevOps and SRE is hard to make out, and to add yet
another perspective to the pile - it can simply mean &quot;we want to hire an ops team, but nobody
wants to work for us unless we call it something else&quot;.</p>
<p>Recently, Niall Murphy (one of the original authors of the (in)famous Google SRE Book) wrote
<a href="https://blog.relyabilit.ie/what-sre-could-be/" target="_blank" rel="noopener noreferrer">a thought provoking piece</a> about the future of
SRE and the assumptions that underpin it. It does a great job of articulating some of the
problems that have consistently worn a blister in my experience of SRE - especially when it comes
to articulating what it is we do to leadership.</p>
<p>I'd like to present what Site Reliability Engineering means to me and a hypothesis for what
SRE may be when we take a step back from some of the implementation details.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="sre"/>
    <category term="theory"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2022-06-08T00:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Using Vault with GitHub Actions</title>
    <id>https://sierrasoftworks.com/2021/12/20/vault-github-actions/</id>
    <link href="https://sierrasoftworks.com/2021/12/20/vault-github-actions/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>So, you're using GitHub Actions to deploy your project and have tossed some
service principal credentials into your GitHub Actions Secrets to let you
do so. The birds are signing, the sun is shining, an hackers are hacking your
code coverage service...</p>
<p>How confident are you that your service principal credentials aren't
compromised? If you're like me, that number goes to zero very, very quickly.
Rotating them for hundreds of repositories and service principals is far from
a simple task, and I hate having to do complex work - so let's look at a better
solution.</p>
<p>Enter <a href="https://www.vaultproject.io/" target="_blank" rel="noopener noreferrer">Hashicorp Vault</a>, a comprehensive secrets
management platform which (amongst other things) lets you issue short lived
credentials with limited permissions. If configured correctly, this can help
greatly reduce the risk surface area for compromised credentials and minimize
the operator overhead associated with managing them.</p>
<p>This blog post is a top-to-bottom run-through of setting up Hashicorp Vault
and GitHub Actions so that you can easily consume secrets from your GitHub
Actions workflows.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="using-vault-with-github-actions" tabindex="-1"><a class="header-anchor" href="#using-vault-with-github-actions"><span>Using Vault with GitHub Actions</span></a></h1>
<p>So, you're using GitHub Actions to deploy your project and have tossed some
service principal credentials into your GitHub Actions Secrets to let you
do so. The birds are signing, the sun is shining, an hackers are hacking your
code coverage service...</p>
<p>How confident are you that your service principal credentials aren't
compromised? If you're like me, that number goes to zero very, very quickly.
Rotating them for hundreds of repositories and service principals is far from
a simple task, and I hate having to do complex work - so let's look at a better
solution.</p>
<p>Enter <a href="https://www.vaultproject.io/" target="_blank" rel="noopener noreferrer">Hashicorp Vault</a>, a comprehensive secrets
management platform which (amongst other things) lets you issue short lived
credentials with limited permissions. If configured correctly, this can help
greatly reduce the risk surface area for compromised credentials and minimize
the operator overhead associated with managing them.</p>
<p>This blog post is a top-to-bottom run-through of setting up Hashicorp Vault
and GitHub Actions so that you can easily consume secrets from your GitHub
Actions workflows.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="security"/>
    <category term="github"/>
    <category term="hashicorp"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2021-12-20T10:18:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Hashicorp Vault on Azure Functions</title>
    <id>https://sierrasoftworks.com/2021/12/19/vault-on-azure-functions/</id>
    <link href="https://sierrasoftworks.com/2021/12/19/vault-on-azure-functions/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>I've long been a fan of Hashicorp's <a href="https://www.vaultproject.io/" target="_blank" rel="noopener noreferrer">Vault</a> for
its ability to go far beyond the traditional "key/value" secrets management solution.
Even "advanced" offerings like Azure's KeyVault tend to barely scratch the surface
of what is possible with Hashicorp Vault.</p>
<p>Unfortunately, for all that Vault is phenomenally powerful, it is also a fair bit more
difficult to setup and run than its cloud-native counterparts. Where deploying an
Azure KeyVault only takes a few clicks and runs almost for free, Hashicorp Vault's
suggested configuration relies on you building and maintaining a cluster of virtual
machines, which is a lot of additional work and cost.</p>
<p>While I'm not averse to putting in effort and paying a bit of money for a good service,
I'm also not going to do so if there is an easier solution at hand. This blob post
is a (not so quick) run through of how to run Vault without the overhead of managing
your own cluster, and without needing to spend a small fortune on virtual machines.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="hashicorp-vault-on-azure-functions" tabindex="-1"><a class="header-anchor" href="#hashicorp-vault-on-azure-functions"><span>Hashicorp Vault on Azure Functions</span></a></h1>
<p>I've long been a fan of Hashicorp's <a href="https://www.vaultproject.io/" target="_blank" rel="noopener noreferrer">Vault</a> for
its ability to go far beyond the traditional &quot;key/value&quot; secrets management solution.
Even &quot;advanced&quot; offerings like Azure's KeyVault tend to barely scratch the surface
of what is possible with Hashicorp Vault.</p>
<p>Unfortunately, for all that Vault is phenomenally powerful, it is also a fair bit more
difficult to setup and run than its cloud-native counterparts. Where deploying an
Azure KeyVault only takes a few clicks and runs almost for free, Hashicorp Vault's
suggested configuration relies on you building and maintaining a cluster of virtual
machines, which is a lot of additional work and cost.</p>
<p>While I'm not averse to putting in effort and paying a bit of money for a good service,
I'm also not going to do so if there is an easier solution at hand. This blob post
is a (not so quick) run through of how to run Vault without the overhead of managing
your own cluster, and without needing to spend a small fortune on virtual machines.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="security"/>
    <category term="azure"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2021-12-19T19:32:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Inner-Loop Planning for SRE Teams</title>
    <id>https://sierrasoftworks.com/2021/06/14/tactical-planning/</id>
    <link href="https://sierrasoftworks.com/2021/06/14/tactical-planning/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>When it comes to planning and strategy; Site Reliability Engineering teams walk a fine line.
On one side of this line is a team who is closely aligned with the product group's priorities,
to the point where they cannot be distinguished from one another (staff augmentation). On the
other side is a separate operations team who only peripherally works on the same product as
the product group.</p>
<p>Neither of these extremes is healthy and a well functioning SRE team will attempt to strike a
balance between the two. In my mind, our goal is to balance the broomstick in the palm of our
hand. This kind of balance trick is one that every control systems engineer is familiar with
and the technique for solving it is a well trodden path. Let's discuss it and use it to formulate
a method for planning how your team works on a daily basis.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="inner-loop-planning-for-sre-teams" tabindex="-1"><a class="header-anchor" href="#inner-loop-planning-for-sre-teams"><span>Inner-Loop Planning for SRE Teams</span></a></h1>
<p>When it comes to planning and strategy; Site Reliability Engineering teams walk a fine line.
On one side of this line is a team who is closely aligned with the product group's priorities,
to the point where they cannot be distinguished from one another (staff augmentation). On the
other side is a separate operations team who only peripherally works on the same product as
the product group.</p>
<p>Neither of these extremes is healthy and a well functioning SRE team will attempt to strike a
balance between the two. In my mind, our goal is to balance the broomstick in the palm of our
hand. This kind of balance trick is one that every control systems engineer is familiar with
and the technique for solving it is a well trodden path. Let's discuss it and use it to formulate
a method for planning how your team works on a daily basis.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="sre"/>
    <category term="planning"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2021-06-14T22:36:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">How Async Works</title>
    <id>https://sierrasoftworks.com/2021/04/25/how-async-works/</id>
    <link href="https://sierrasoftworks.com/2021/04/25/how-async-works/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Modern languages are increasingly moving towards <code>async</code> as the default means by which
concurrency and I/O are managed, reducing our visibility into the threads and processes
which underpin our code. The promise is that, by tossing a few <code>async</code> and <code>await</code>s around
your codebase, you'll achieve scaling nirvana - but as with all magic, there is a dark side.</p>
<p>Over the course of my career, I have spent a lot of time leveraging and debugging asynchronous
code across a range of different languages. One of the things that has helped me do so is
a solid mental model of how a feature like <code>async</code> is implemented and the impact that has.
This blog post is my rough attempt at explaining that.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="how-async-works" tabindex="-1"><a class="header-anchor" href="#how-async-works"><span>How Async Works</span></a></h1>
<p>Modern languages are increasingly moving towards <code v-pre>async</code> as the default means by which
concurrency and I/O are managed, reducing our visibility into the threads and processes
which underpin our code. The promise is that, by tossing a few <code v-pre>async</code> and <code v-pre>await</code>s around
your codebase, you'll achieve scaling nirvana - but as with all magic, there is a dark side.</p>
<p>Over the course of my career, I have spent a lot of time leveraging and debugging asynchronous
code across a range of different languages. One of the things that has helped me do so is
a solid mental model of how a feature like <code v-pre>async</code> is implemented and the impact that has.
This blog post is my rough attempt at explaining that.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2021-04-25T17:25:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Building Dashboards</title>
    <id>https://sierrasoftworks.com/2021/03/30/building-dashboards/</id>
    <link href="https://sierrasoftworks.com/2021/03/30/building-dashboards/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Dashboards are one of those things which sound easy to get right on the surface,
but often fall short of expectations. In the majority of cases, my experience has
been that they, at best, do not support an investigation and at worst can actively
hinder it.</p>
<p>That is a huge pity, because when they are done well, dashboards can be one of your
most powerful tools for showcasing the current state of your system and enabling
engineers to rapidly track down failures.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="building-dashboards" tabindex="-1"><a class="header-anchor" href="#building-dashboards"><span>Building Dashboards</span></a></h1>
<p>Dashboards are one of those things which sound easy to get right on the surface,
but often fall short of expectations. In the majority of cases, my experience has
been that they, at best, do not support an investigation and at worst can actively
hinder it.</p>
<p>That is a huge pity, because when they are done well, dashboards can be one of your
most powerful tools for showcasing the current state of your system and enabling
engineers to rapidly track down failures.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="sre"/>
    <category term="observability"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2021-03-30T22:14:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Blueprint for a Monitoring Stack</title>
    <id>https://sierrasoftworks.com/2021/02/14/recipe-for-a-monitoring-service/</id>
    <link href="https://sierrasoftworks.com/2021/02/14/recipe-for-a-monitoring-service/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>At one point in my career, I spent over two years building a monitoring stack. It started out
the way many do; with people staring at dashboards, hoping to divine the secrets of production
from ripples in gravitational waves before an outage occurred. The most experienced engineers
could sometimes spot the high energy particles as they were about to flip bits, but I never
got that good.</p>
<p>Over these two years we was able to transform not just the technology used, but the entire
way the organization viewed monitoring, eventually removing the need for a NOC altogether.
To achieve this, we spent a lot of time focusing on what is important and, more importantly,
what is irrelevant in a monitoring system.</p>
<p>What I'm going to describe here isn't that stack specifically, but rather the key design
decisions and crucial pieces which allowed us to build something successful and which have
left me wishing for something equivalent in everywhere I've worked since. If you're planning
to build a monitoring stack from the ground up, this might be a good place to start.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="blueprint-for-a-monitoring-stack" tabindex="-1"><a class="header-anchor" href="#blueprint-for-a-monitoring-stack"><span>Blueprint for a Monitoring Stack</span></a></h1>
<p>At one point in my career, I spent over two years building a monitoring stack. It started out
the way many do; with people staring at dashboards, hoping to divine the secrets of production
from ripples in gravitational waves before an outage occurred. The most experienced engineers
could sometimes spot the high energy particles as they were about to flip bits, but I never
got that good.</p>
<p>Over these two years we was able to transform not just the technology used, but the entire
way the organization viewed monitoring, eventually removing the need for a <abbr title="Network Operations Center">NOC</abbr> altogether.
To achieve this, we spent a lot of time focusing on what is important and, more importantly,
what is irrelevant in a monitoring system.</p>
<p>What I'm going to describe here isn't that stack specifically, but rather the key design
decisions and crucial pieces which allowed us to build something successful and which have
left me wishing for something equivalent in everywhere I've worked since. If you're planning
to build a monitoring stack from the ground up, this might be a good place to start.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <category term="operations"/>
    <category term="theory"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2021-02-14T01:53:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Devil&amp;apos;s Advocate in Operations</title>
    <id>https://sierrasoftworks.com/2021/02/10/devils-advocate-role/</id>
    <link href="https://sierrasoftworks.com/2021/02/10/devils-advocate-role/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Around the world, Israeli intelligence agencies have a reputation for punching well above their weight.
For a country of less than 10 million people, they compete with nations orders of magnitude larger and
have routinely demonstrated an ability to achieve far more than their larger cousins.</p>
<p>There are many factors which play a role in this, but today I'd like to focus on a small keynote in that
story which has, on numerous occasions, been the primary factor in advancing the reliability of the
services I support. That factor is the role of the "Devil's Advocate".</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="devil-s-advocate-in-operations" tabindex="-1"><a class="header-anchor" href="#devil-s-advocate-in-operations"><span>Devil's Advocate in Operations</span></a></h1>
<p>Around the world, Israeli intelligence agencies have a reputation for punching well above their weight.
For a country of less than 10 million people, they compete with nations orders of magnitude larger and
have routinely demonstrated an ability to achieve far more than their larger cousins.</p>
<p>There are many factors which play a role in this, but today I'd like to focus on a small keynote in that
story which has, on numerous occasions, been the primary factor in advancing the reliability of the
services I support. That factor is the role of the &quot;Devil's Advocate&quot;.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="operations"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2021-02-10T18:37:07.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Designing Human Systems</title>
    <id>https://sierrasoftworks.com/2020/05/15/designing-human-systems/</id>
    <link href="https://sierrasoftworks.com/2020/05/15/designing-human-systems/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Recently I was having a conversation with a colleague who asserted that we (SREs) are broadly the
types of engineer who, if given the choice, try to focus on perfecting the fundamentals. This
surprised me, because if you were to ask me about my views on engineering, I'd probably lean
in a slightly different direction.</p>
<p>My personal view on SRE is that its a game of balance. We're not Software Engineers, we're
not Operations Engineers and we're also not Security Engineers. We tread a fine line in the
middle, pushing on aspects of the broader (humans included) system to help it find a stable
equilibrium in which it delivers maximum value for all stakeholders. That kind of balancing
requires a very pragmatic, flexible approach and often depends more on the subtleties of the
system at hand than a rigidly theoretical approach can offer.</p>
<p>With that in mind, I think that as engineers, we need to focus on building systems that support
that healthy equilibrium. Doing so means balancing a wide range of requirements from different,
often competing, stakeholders while attempting to divine what the future may bring. In my
experience, however, all of this becomes much easier to deal with if you can solve two key
problems: velocity and observability.</p>
<p>Before I dive into that, let's quickly talk about that experience.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="designing-human-systems" tabindex="-1"><a class="header-anchor" href="#designing-human-systems"><span>Designing Human Systems</span></a></h1>
<p>Recently I was having a conversation with a colleague who asserted that we (SREs) are broadly the
types of engineer who, if given the choice, try to focus on perfecting the fundamentals. This
surprised me, because if you were to ask me about my views on engineering, I'd probably lean
in a slightly different direction.</p>
<p>My personal view on SRE is that its a game of balance. We're not Software Engineers, we're
not Operations Engineers and we're also not Security Engineers. We tread a fine line in the
middle, pushing on aspects of the broader (humans included) system to help it find a stable
equilibrium in which it delivers maximum value for all stakeholders. That kind of balancing
requires a very pragmatic, flexible approach and often depends more on the subtleties of the
system at hand than a rigidly theoretical approach can offer.</p>
<p>With that in mind, I think that as engineers, we need to focus on building systems that support
that healthy equilibrium. Doing so means balancing a wide range of requirements from different,
often competing, stakeholders while attempting to divine what the future may bring. In my
experience, however, all of this becomes much easier to deal with if you can solve two key
problems: velocity and observability.</p>
<p>Before I dive into that, let's quickly talk about that experience.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="sre"/>
    <category term="balance"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2020-05-15T08:00:52.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Fight COVID with F@H</title>
    <id>https://sierrasoftworks.com/2020/03/21/folding-covid/</id>
    <link href="https://sierrasoftworks.com/2020/03/21/folding-covid/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p><strong>Deploy an Azure VM to help Folding@Home.</strong></p>
<p>This is an Azure VM template which deploys a GPU-enabled VM of your choice to help the
<a href="https://foldingathome.org/" target="_blank" rel="noopener noreferrer">Folding@Home</a> project find ways to combat COVID-19. It is
expected that the default VM (<code>Standard_NC6_Promo</code>) will cost about $350 per month to run
(depending on your choice of region etc) which means that on the stock Azure trial benefit
you should be able to get about 2 weeks of runtime before running out of free credits.</p>]]></summary>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2020-03-21T00:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">App Updates</title>
    <id>https://sierrasoftworks.com/2019/10/15/app-updates/</id>
    <link href="https://sierrasoftworks.com/2019/10/15/app-updates/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Today I work as an SRE, surrounded by dozens of complex systems designed to make the process of
taking code we write and exposing it to customers. It's easy to forget that software deployment
itself is a problem that many developers have not yet solved.</p>
<p>Today I'd like to run you through a straightforward process I recently implemented for [Git Tool][git-tool]
to enable automated updates with minimal fuss. It's straightforward, easy to implement and works
without any fancy tooling.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="app-updates" tabindex="-1"><a class="header-anchor" href="#app-updates"><span>App Updates</span></a></h1>
<p>Today I work as an SRE, surrounded by dozens of complex systems designed to make the process of
taking code we write and exposing it to customers. It's easy to forget that software deployment
itself is a problem that many developers have not yet solved.</p>
<p>Today I'd like to run you through a straightforward process I recently implemented for <a href="https://github.com/sierrasoftworks/git-tool" target="_blank" rel="noopener noreferrer">Git Tool</a>
to enable automated updates with minimal fuss. It's straightforward, easy to implement and works
without any fancy tooling.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2019-10-15T12:21:22.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Live Unit Testing .NET Core - Where are my tests?</title>
    <id>https://sierrasoftworks.com/2019/10/11/live-unit-testing-dotnet-core-no-tests/</id>
    <link href="https://sierrasoftworks.com/2019/10/11/live-unit-testing-dotnet-core-no-tests/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>So you're sitting in front of your computer, wondering why your unit tests won't
show up in Visual Studio's Live Test Window. They appear fine in the normal Tests
Window and they run without problems, you haven't done anything weird and all you
want is to be able to see whether your code works.</p>
<p>You're not alone and there is a solution!</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="live-unit-testing-net-core-where-are-my-tests" tabindex="-1"><a class="header-anchor" href="#live-unit-testing-net-core-where-are-my-tests"><span>Live Unit Testing .NET Core - Where are my tests?</span></a></h1>
<p>So you're sitting in front of your computer, wondering why your unit tests won't
show up in Visual Studio's Live Test Window. They appear fine in the normal Tests
Window and they run without problems, you haven't done anything weird and all you
want is to be able to see whether your code works.</p>
<p>You're not alone and there is a solution!</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2019-10-11T13:08:17.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">.gitignore unicode</title>
    <id>https://sierrasoftworks.com/2019/07/12/gitignore-unicode/</id>
    <link href="https://sierrasoftworks.com/2019/07/12/gitignore-unicode/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Have you ever run into a situation where Git just refused to obey your commands? No, I'm
not talking about that time you "typo-ed" <code>git commit</code> and ended up <code>git reset --hard</code>-ing
your repository back to the dawn of the universe, I'm talking about it really, truly,
ignoring you.</p>
<p>I have, so let me tell you a story about what happened and how I fixed it so that you can
avoid future hair-loss and avoid questioning the nature of your reality.</p>
<div class="hint-container tip">
<p class="hint-container-title">Tips</p>
<p><em>(For those who want to skip right to the punchline)</em></p>
<p>Make sure your <code>.gitignore</code> file is saved in UTF-8 format, or you'll have a bad time.</p>
</div>
]]></summary>
    <content type="html"><![CDATA[<h1 id="gitignore-unicode" tabindex="-1"><a class="header-anchor" href="#gitignore-unicode"><span>.gitignore 💔 Unicode</span></a></h1>
<p>Have you ever run into a situation where Git just refused to obey your commands? No, I'm
not talking about that time you &quot;typo-ed&quot; <code v-pre>git commit</code> and ended up <code v-pre>git reset --hard</code>-ing
your repository back to the dawn of the universe, I'm talking about it really, truly,
ignoring you.</p>
<p>I have, so let me tell you a story about what happened and how I fixed it so that you can
avoid future hair-loss and avoid questioning the nature of your reality.</p>
<div class="hint-container tip">
<p class="hint-container-title">Tips</p>
<p><em>(For those who want to skip right to the punchline)</em></p>
<p>Make sure your <code v-pre>.gitignore</code> file is saved in UTF-8 format, or you'll have a bad time.</p>
</div>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <category term="operations"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2019-07-12T16:35:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Organizing your Development Directory</title>
    <id>https://sierrasoftworks.com/2019/04/15/git-tool/</id>
    <link href="https://sierrasoftworks.com/2019/04/15/git-tool/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>As an engineer, I like to think that I help fix problems. That's what I've tried to do most of
my life and career and I love doing so to this day. It struck me, though, that there was one
problem which has followed me around for years without due attention: the state of my development
directories.</p>
<p>That's not to say that they are disorganized, I've spent hours deliberating over the best way
to arrange them such that I can always find what I need, yet I often end up having to resort to
some dark incantation involving <code>find</code> to locate the project I was <em>certain</em> sat under my <code>Work</code>
folder.</p>
<p>No more, I've drawn the line and decided that if I can't fix the problem, automation damn well
better be able to!</p>
<p>I'd like to introduce you to my new, standardized (and automated), development directory structure
and the tooling I use to maintain it. With any luck, you'll find it useful and it will enable you
to save time, avoid code duplication and more easily transition between machines.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="organizing-your-development-directory" tabindex="-1"><a class="header-anchor" href="#organizing-your-development-directory"><span>Organizing your Development Directory</span></a></h1>
<p>As an engineer, I like to think that I help fix problems. That's what I've tried to do most of
my life and career and I love doing so to this day. It struck me, though, that there was one
problem which has followed me around for years without due attention: the state of my development
directories.</p>
<p>That's not to say that they are disorganized, I've spent hours deliberating over the best way
to arrange them such that I can always find what I need, yet I often end up having to resort to
some dark incantation involving <code v-pre>find</code> to locate the project I was <em>certain</em> sat under my <code v-pre>Work</code>
folder.</p>
<p>No more, I've drawn the line and decided that if I can't fix the problem, automation damn well
better be able to!</p>
<p>I'd like to introduce you to my new, standardized (and automated), development directory structure
and the tooling I use to maintain it. With any luck, you'll find it useful and it will enable you
to save time, avoid code duplication and more easily transition between machines.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2019-04-15T19:05:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Patterns for APIs</title>
    <id>https://sierrasoftworks.com/2018/03/28/api-patterns/</id>
    <link href="https://sierrasoftworks.com/2018/03/28/api-patterns/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>If you've built a production API before, you'll know that they tend to
evolve over time. This evolution is not only unavoidable, it is a natural
state that any active system will exist in until it is deprecated.</p>
<p>Realizing and designing to support this kind of evolution in a proactive
way is one of the aspects that differentiates a mature API from the thousands
that litter the Wall of Shame.</p>
<p>At the same time, it is important that your API remains easy to use and
intuitive, maximizing the productivity of developers who will make use of it.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="patterns-for-apis" tabindex="-1"><a class="header-anchor" href="#patterns-for-apis"><span>Patterns for APIs</span></a></h1>
<p>If you've built a production API before, you'll know that they tend to
evolve over time. This evolution is not only unavoidable, it is a natural
state that any active system will exist in until it is deprecated.</p>
<p>Realizing and designing to support this kind of evolution in a proactive
way is one of the aspects that differentiates a mature API from the thousands
that litter the Wall of Shame.</p>
<p>At the same time, it is important that your API remains easy to use and
intuitive, maximizing the productivity of developers who will make use of it.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2018-03-28T20:00:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Scheduled Backups with Kubernetes</title>
    <id>https://sierrasoftworks.com/2017/11/01/scheduled-backups-with-k8s/</id>
    <link href="https://sierrasoftworks.com/2017/11/01/scheduled-backups-with-k8s/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>It's a poorly hidden fact that I love Kubernetes. After spending months running everything from
Marathon DCOS and CoreOS to Rancher and Docker Swarm in production, Kubernetes is the only
container orchestration platform that has truly struck me as truly "production ready" and I
have been running it for the past year as a result.</p>
<p>While functionality when I first started using it (v1.4) was somewhat patchy and uninteresting,
some of the more recent updates have been making sizeable strides towards addressing the operations
challenges we face on a daily basis.</p>
<p>With v1.8, Kubernetes has introduced the [CronJob][] controller to <code>batch/v1beta1</code>, making it
generally available for people to play with. Sounds like the perfect time to show you how we
use [CronJobs][CronJob] to manage automated, scheduled, backups within our environments.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="scheduled-backups-with-kubernetes" tabindex="-1"><a class="header-anchor" href="#scheduled-backups-with-kubernetes"><span>Scheduled Backups with Kubernetes</span></a></h1>
<p>It's a poorly hidden fact that I love Kubernetes. After spending months running everything from
Marathon DCOS and CoreOS to Rancher and Docker Swarm in production, Kubernetes is the only
container orchestration platform that has truly struck me as truly &quot;production ready&quot; and I
have been running it for the past year as a result.</p>
<p>While functionality when I first started using it (v1.4) was somewhat patchy and uninteresting,
some of the more recent updates have been making sizeable strides towards addressing the operations
challenges we face on a daily basis.</p>
<p>With v1.8, Kubernetes has introduced the <a href="https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/" target="_blank" rel="noopener noreferrer">CronJob</a> controller to <code v-pre>batch/v1beta1</code>, making it
generally available for people to play with. Sounds like the perfect time to show you how we
use <a href="https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/" target="_blank" rel="noopener noreferrer">CronJobs</a> to manage automated, scheduled, backups within our environments.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2017-11-01T20:32:07.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Relational and Document DBs</title>
    <id>https://sierrasoftworks.com/2017/01/26/relational-vs-document/</id>
    <link href="https://sierrasoftworks.com/2017/01/26/relational-vs-document/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>One of the most interesting discussions to have with people, notably those
with traditional database experience, is that of the relationship between
an off the shelf [RDBMS][] and some modern [NoSQL][] document stores.</p>
<p>What makes this discussion so interesting is that there's invariably a lot
of opinion driven from, often very valid, experience one way or another.
The truth is that there simply isn't a silver-bullet database solution and
that by better understanding the benefits and limitations of each, one can
make vastly better decisions on their adoption.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="relational-and-document-dbs" tabindex="-1"><a class="header-anchor" href="#relational-and-document-dbs"><span>Relational and Document DBs</span></a></h1>
<p>One of the most interesting discussions to have with people, notably those
with traditional database experience, is that of the relationship between
an off the shelf <a href="https://en.wikipedia.org/wiki/Relational_database_management_system" target="_blank" rel="noopener noreferrer"><abbr title="Relational Database Management System">RDBMS</abbr></a> and some modern <a href="https://en.wikipedia.org/wiki/NoSQL" target="_blank" rel="noopener noreferrer">NoSQL</a> document stores.</p>
<p>What makes this discussion so interesting is that there's invariably a lot
of opinion driven from, often very valid, experience one way or another.
The truth is that there simply isn't a silver-bullet database solution and
that by better understanding the benefits and limitations of each, one can
make vastly better decisions on their adoption.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <category term="architecture"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2017-01-26T17:31:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Out of the Box Docker</title>
    <id>https://sierrasoftworks.com/2017/01/05/out-of-the-box-docker/</id>
    <link href="https://sierrasoftworks.com/2017/01/05/out-of-the-box-docker/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<figure src="https://cdn.sierrasoftworks.com/blog/docker_logo.png">
Docker's Logo
</figure>
<p><a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer">Docker</a> is become an incredibly prevalent tool in the development and
operations realms in recent months. Its combination of developer friendly
configuration and simple operational management make it a very attractive
prospect for companies and teams looking to adopt CI and CD practices.</p>
<p>In most cases, you'll see <a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer">Docker</a> used to deploy applications in much the
same way as a zip file or virtual machine image. This is certainly the
most common use case for <a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer">Docker</a>, but by no means the extent of its
functionality.</p>
<p>In this post I'm going to discuss some of the more interesting problems
we've used <a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer">Docker</a> to solve and why it serves as a great solution to them.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="out-of-the-box-docker" tabindex="-1"><a class="header-anchor" href="#out-of-the-box-docker"><span>Out of the Box Docker</span></a></h1>
<Figure src="https://cdn.sierrasoftworks.com/blog/docker_logo.png">
Docker's Logo
</Figure>
<p><a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer">Docker</a> is become an incredibly prevalent tool in the development and
operations realms in recent months. Its combination of developer friendly
configuration and simple operational management make it a very attractive
prospect for companies and teams looking to adopt <abbr title="Continuous Integration">CI</abbr> and <abbr title="Continuous Deployment">CD</abbr> practices.</p>
<p>In most cases, you'll see <a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer">Docker</a> used to deploy applications in much the
same way as a zip file or virtual machine image. This is certainly the
most common use case for <a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer">Docker</a>, but by no means the extent of its
functionality.</p>
<p>In this post I'm going to discuss some of the more interesting problems
we've used <a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer">Docker</a> to solve and why it serves as a great solution to them.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="operations"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2017-01-05T21:39:45.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Dockerizing Aurelia</title>
    <id>https://sierrasoftworks.com/2016/12/21/dockerizing-aurelia/</id>
    <link href="https://sierrasoftworks.com/2016/12/21/dockerizing-aurelia/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<figure src="https://cdn.sierrasoftworks.com/blog/aurelia_logo.png" alt="Aurelia's logo">
Aurelia's Logo
</figure>
<p><a href="http://aurelia.io" target="_blank" rel="noopener noreferrer">Aurelia</a> is a modern web application framework in the spirit of <a href="https://angularjs.org" target="_blank" rel="noopener noreferrer">Angular</a>,
with an exceptionally concise and accessible developer experience and
standards compliant implementation. It is hands down my favourite web
framework right now and one I'd strongly recommend for most projects.</p>
<p>One of Aurelia's greatest claims to fame is the incredible productivity
you can achieve, enabling you to build a full web application in just
days, if not hours.</p>
<p>When building the application becomes that fast, spending a day putting
together your deployment pipelines to roll out your application becomes
incredibly wasteful, so how can we avoid that?</p>
<p>Well, <a href="https://www.docker.com" target="_blank" rel="noopener noreferrer">Docker</a> offers us a great way to deploy and manage the life-cycle
of production applications. It enables us to deploy almost anywhere, with
minimal additional effort and in a highly reproducible fashion.</p>
<p>In this post I'll go over the process of Dockerizing an existing Aurelia
web application built with <a href="https://webpack.github.io/" target="_blank" rel="noopener noreferrer">WebPack</a>, however the same process applies to
those built using <a href="https://github.com/systemjs/systemjs" target="_blank" rel="noopener noreferrer">SystemJS</a>.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="dockerizing-aurelia" tabindex="-1"><a class="header-anchor" href="#dockerizing-aurelia"><span>Dockerizing Aurelia</span></a></h1>
<Figure src="https://cdn.sierrasoftworks.com/blog/aurelia_logo.png" alt="Aurelia's logo">
Aurelia's Logo
</Figure>
<p><a href="http://aurelia.io" target="_blank" rel="noopener noreferrer">Aurelia</a> is a modern web application framework in the spirit of <a href="https://angularjs.org" target="_blank" rel="noopener noreferrer">Angular</a>,
with an exceptionally concise and accessible developer experience and
standards compliant implementation. It is hands down my favourite web
framework right now and one I'd strongly recommend for most projects.</p>
<p>One of Aurelia's greatest claims to fame is the incredible productivity
you can achieve, enabling you to build a full web application in just
days, if not hours.</p>
<p>When building the application becomes that fast, spending a day putting
together your deployment pipelines to roll out your application becomes
incredibly wasteful, so how can we avoid that?</p>
<p>Well, <a href="https://www.docker.com" target="_blank" rel="noopener noreferrer">Docker</a> offers us a great way to deploy and manage the life-cycle
of production applications. It enables us to deploy almost anywhere, with
minimal additional effort and in a highly reproducible fashion.</p>
<p>In this post I'll go over the process of Dockerizing an existing Aurelia
web application built with <a href="https://webpack.github.io/" target="_blank" rel="noopener noreferrer">WebPack</a>, however the same process applies to
those built using <a href="https://github.com/systemjs/systemjs" target="_blank" rel="noopener noreferrer">SystemJS</a>.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="web"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2016-12-21T07:40:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Signing Git Commits using KeyBase</title>
    <id>https://sierrasoftworks.com/2016/12/19/signed-commits-keybase/</id>
    <link href="https://sierrasoftworks.com/2016/12/19/signed-commits-keybase/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<figure src="https://cdn.sierrasoftworks.com/blog/keybase_logo.png">
KeyBase's Logo
</figure>
<p>With the increasing popularity of Git as a tool for open source collaboration,
not to mention distribution of code for tools like [Go][golang], being able
to verify that the author of a piece of code is indeed who they claim to be
has become absolutely critical.</p>
<p>This requirement extends beyond simply ensuring that malicious actors cannot
modify the code we've published, something GitHub and its kin
([usually][github-security-breach]) do a very good job of preventing.
The simple fact is that by adopting code someone else has written, you are
entrusting your clients' security to them - you best be certain that trust
is wisely placed.</p>
<p>Using Git's built in support for [PGP][pgp] signing and pairing it with
[Keybase][keybase] provides you with a great framework on which to build and
verify that trust. In this post I'll go over how one sets up their development
environment to support this workflow.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="signing-git-commits-using-keybase" tabindex="-1"><a class="header-anchor" href="#signing-git-commits-using-keybase"><span>Signing Git Commits using KeyBase</span></a></h1>
<Figure src="https://cdn.sierrasoftworks.com/blog/keybase_logo.png">
KeyBase's Logo
</Figure>
<p>With the increasing popularity of Git as a tool for open source collaboration,
not to mention distribution of code for tools like <a href="https://golang.org/" target="_blank" rel="noopener noreferrer">Go</a>, being able
to verify that the author of a piece of code is indeed who they claim to be
has become absolutely critical.</p>
<p>This requirement extends beyond simply ensuring that malicious actors cannot
modify the code we've published, something GitHub and its kin
(<a href="http://homakov.blogspot.ie/2014/02/how-i-hacked-github-again.html" target="_blank" rel="noopener noreferrer">usually</a>) do a very good job of preventing.
The simple fact is that by adopting code someone else has written, you are
entrusting your clients' security to them - you best be certain that trust
is wisely placed.</p>
<p>Using Git's built in support for <a href="https://en.wikipedia.org/wiki/Pretty_Good_Privacy" target="_blank" rel="noopener noreferrer"><abbr title="Pretty Good Privacy">PGP</abbr></a> signing and pairing it with
<a href="https://keybase.io/" target="_blank" rel="noopener noreferrer">Keybase</a> provides you with a great framework on which to build and
verify that trust. In this post I'll go over how one sets up their development
environment to support this workflow.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2016-12-19T07:55:47.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Feeling Lucky</title>
    <id>https://sierrasoftworks.com/2016/12/18/feeling-lucky/</id>
    <link href="https://sierrasoftworks.com/2016/12/18/feeling-lucky/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Anybody who has worked in the development world for a significant portion of
time will have built up a vast repertoire of abbreviations to describe how
they solve problems. Everything from TDD to DDD and, my favourites, <a href="http://www.hanselman.com/blog/FearDrivenDevelopmentFDD.aspx" target="_blank" rel="noopener noreferrer">FDD</a>
and <a href="http://hopedrivendevelopment.blogspot.ie/" target="_blank" rel="noopener noreferrer">HDD</a>. There are so many in fact that you'll find a
<a href="http://devdriven.by" target="_blank" rel="noopener noreferrer">website dedicated to naming and shaming them</a>.</p>
<p>I'm not one to add another standard to the mix... Oh who am I kidding, let me
introduce you to Chance Driven Development.</p>
<p><a href="https://xkcd.com/927/" target="_blank" rel="noopener noreferrer"><img src="https://imgs.xkcd.com/comics/standards.png" alt="XKCD Standards"></a></p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="feeling-lucky" tabindex="-1"><a class="header-anchor" href="#feeling-lucky"><span>Feeling Lucky</span></a></h1>
<p>Anybody who has worked in the development world for a significant portion of
time will have built up a vast repertoire of abbreviations to describe how
they solve problems. Everything from TDD to DDD and, my favourites, <a href="http://www.hanselman.com/blog/FearDrivenDevelopmentFDD.aspx" target="_blank" rel="noopener noreferrer">FDD</a>
and <a href="http://hopedrivendevelopment.blogspot.ie/" target="_blank" rel="noopener noreferrer">HDD</a>. There are so many in fact that you'll find a
<a href="http://devdriven.by" target="_blank" rel="noopener noreferrer">website dedicated to naming and shaming them</a>.</p>
<p>I'm not one to add another standard to the mix... Oh who am I kidding, let me
introduce you to Chance Driven Development.</p>
<p><a href="https://xkcd.com/927/" target="_blank" rel="noopener noreferrer"><img src="https://imgs.xkcd.com/comics/standards.png" alt="XKCD Standards"></a></p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="development"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2016-12-18T15:25:16.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Inki</title>
    <id>https://sierrasoftworks.com/2016/12/15/inki/</id>
    <link href="https://sierrasoftworks.com/2016/12/15/inki/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>[Inki][] is a small proof of concept project I've been working on which is
designed to manage transient, single-use, SSH keys for an automated remediation
tool our team is in the process of building.</p>
<p>In this blog post I'll go over some of the design decisions motivating
a tool like [Inki][], some of its interesting implementation details and
the questions we're hoping it will allow us to answer.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="inki" tabindex="-1"><a class="header-anchor" href="#inki"><span>Inki</span></a></h1>
<p><a href="https://github.com/SierraSoftworks/inki" target="_blank" rel="noopener noreferrer">Inki</a> is a small proof of concept project I've been working on which is
designed to manage transient, single-use, SSH keys for an automated remediation
tool our team is in the process of building.</p>
<p>In this blog post I'll go over some of the design decisions motivating
a tool like <a href="https://github.com/SierraSoftworks/inki" target="_blank" rel="noopener noreferrer">Inki</a>, some of its interesting implementation details and
the questions we're hoping it will allow us to answer.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="projects"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2016-12-15T16:53:47.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Autocompletion for Bash CLI</title>
    <id>https://sierrasoftworks.com/2016/12/14/bash-cli-autocompletion/</id>
    <link href="https://sierrasoftworks.com/2016/12/14/bash-cli-autocompletion/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container tip">
<p class="hint-container-title">Tips</p>
<p>If you haven't yet read the article on
<a href="https://github.com/SierraSoftworks/bash-cli" target="_blank" rel="noopener noreferrer">Bash CLI</a> then
go <a href="/post/bash-cli">read it now</a>.</p>
</div>
<p>Bash's ability to automatically provide suggested completions to a command
by pressing the <kbd>Tab</kbd> key is one of its most useful features. It
makes navigating complex command lines trivially simple, however it's generally
not something we see that often.</p>
<p>Bash CLI was designed with the intention of making it as easy as possible to
build a command line tool with a great user experience. Giving our users the
ability to use autocompletion would be great, but we don't want to make it
any more difficult for developers to build their command lines.</p>
<p>Thankfully, Bash CLI's architecture makes adding basic autocomplete possible
without changing our developer-facing API (always a good thing).</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="autocompletion-for-bash-cli" tabindex="-1"><a class="header-anchor" href="#autocompletion-for-bash-cli"><span>Autocompletion for Bash CLI</span></a></h1>
<div class="hint-container tip">
<p class="hint-container-title">Tips</p>
<p>If you haven't yet read the article on
<a href="https://github.com/SierraSoftworks/bash-cli" target="_blank" rel="noopener noreferrer">Bash CLI</a> then
go <a href="/post/bash-cli">read it now</a>.</p>
</div>
<p>Bash's ability to automatically provide suggested completions to a command
by pressing the <kbd>Tab</kbd> key is one of its most useful features. It
makes navigating complex command lines trivially simple, however it's generally
not something we see that often.</p>
<p>Bash CLI was designed with the intention of making it as easy as possible to
build a command line tool with a great user experience. Giving our users the
ability to use autocompletion would be great, but we don't want to make it
any more difficult for developers to build their command lines.</p>
<p>Thankfully, Bash CLI's architecture makes adding basic autocomplete possible
without changing our developer-facing API (always a good thing).</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2016-12-14T10:41:20.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Building a CLI in Bash</title>
    <id>https://sierrasoftworks.com/2016/12/12/bash-cli/</id>
    <link href="https://sierrasoftworks.com/2016/12/12/bash-cli/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container tip">
<p class="hint-container-title">Tips</p>
<p>If you're just looking to hop straight to the final project, you'll want
to check out <a href="https://github.com/SierraSoftworks/bash-cli" target="_blank" rel="noopener noreferrer">SierraSoftworks/bash-cli</a> on GitHub.</p>
</div>
<p>Anybody who has worked in the ops space as probably built up a veritable
library of scripts which they use to manage everything from deployments
to <a href="https://github.com/NARKOZ/hacker-scripts" target="_blank" rel="noopener noreferrer">brewing you coffee</a>.</p>
<p>Unfortunately, this tends to make finding the script you're after
and its usage information a pain, you'll either end up <code>grep</code>-ing
a README file, or praying that the script has a <code>help</code> feature built
in.</p>
<p>Neither approach is conducive to a productive workflow for you or
those who will (inevitably) replace you. Even if you do end up adding
help functionality to all your scripts, it's probably a rather significant
chunk of your script code that is dedicated to docs...</p>
<p>After a project I was working on started reaching that point, I decided
to put together a tool which should help minimize both the development
workload around building well documented scripts, as well as the usage
complexity related to them.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="building-a-cli-in-bash" tabindex="-1"><a class="header-anchor" href="#building-a-cli-in-bash"><span>Building a <abbr title="Command Line Interface">CLI</abbr> in Bash</span></a></h1>
<div class="hint-container tip">
<p class="hint-container-title">Tips</p>
<p>If you're just looking to hop straight to the final project, you'll want
to check out <a href="https://github.com/SierraSoftworks/bash-cli" target="_blank" rel="noopener noreferrer">SierraSoftworks/bash-cli</a> on GitHub.</p>
</div>
<p>Anybody who has worked in the ops space as probably built up a veritable
library of scripts which they use to manage everything from deployments
to <a href="https://github.com/NARKOZ/hacker-scripts" target="_blank" rel="noopener noreferrer">brewing you coffee</a>.</p>
<p>Unfortunately, this tends to make finding the script you're after
and its usage information a pain, you'll either end up <code v-pre>grep</code>-ing
a README file, or praying that the script has a <code v-pre>help</code> feature built
in.</p>
<p>Neither approach is conducive to a productive workflow for you or
those who will (inevitably) replace you. Even if you do end up adding
help functionality to all your scripts, it's probably a rather significant
chunk of your script code that is dedicated to docs...</p>
<p>After a project I was working on started reaching that point, I decided
to put together a tool which should help minimize both the development
workload around building well documented scripts, as well as the usage
complexity related to them.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2016-12-12T08:43:55.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">New Website</title>
    <id>https://sierrasoftworks.com/2016/12/11/new-website/</id>
    <link href="https://sierrasoftworks.com/2016/12/11/new-website/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Sierra Softworks has a brand new website, rebuilt from the ground up using the
brilliant [Hexo][hexo] project. A lot of emphasis was placed on making it as
easy as possible for us to publish new content here while minimizing the rate
at which content becomes outdated (something our previous website suffered
from rather badly).</p>
<p>As a result, we've tried to move all the project pages to their GitHub repositories
and provide a dynamically generated list of them <a href="/projects/" target="_blank">here</a>. Unfortunately,
not every project we had previously is on GitHub, so we're busy migrating some
of the older content across to this website.</p>
<div class="hint-container tip">
<p class="hint-container-title">Tips</p>
<p>If you can't find one of our older projects here, please
<a href="mailto:contact@sierrasoftworks.com" target="_blank" rel="noopener noreferrer">send us an email</a>.</p>
</div>
]]></summary>
    <content type="html"><![CDATA[<h1 id="new-website" tabindex="-1"><a class="header-anchor" href="#new-website"><span>New Website</span></a></h1>
<p>Sierra Softworks has a brand new website, rebuilt from the ground up using the
brilliant <a href="https://hexo.io" target="_blank" rel="noopener noreferrer">Hexo</a> project. A lot of emphasis was placed on making it as
easy as possible for us to publish new content here while minimizing the rate
at which content becomes outdated (something our previous website suffered
from rather badly).</p>
<p>As a result, we've tried to move all the project pages to their GitHub repositories
and provide a dynamically generated list of them <RouteLink to="/projects/">here</RouteLink>. Unfortunately,
not every project we had previously is on GitHub, so we're busy migrating some
of the older content across to this website.</p>
<div class="hint-container tip">
<p class="hint-container-title">Tips</p>
<p>If you can't find one of our older projects here, please
<a href="mailto:contact@sierrasoftworks.com" target="_blank" rel="noopener noreferrer">send us an email</a>.</p>
</div>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="web"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2016-12-11T22:36:47.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Traefik on Docker Swarm</title>
    <id>https://sierrasoftworks.com/2016/12/11/traefik-on-swarm/</id>
    <link href="https://sierrasoftworks.com/2016/12/11/traefik-on-swarm/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>[Traefik][traefik] is an application load balancer written in Go and designed to simplify
the task of serving HTTP(S) services whose configuration changes on the fly. Traefik v1.1.0
was recently released with support for Docker Swarm and it works excellently.</p>
<p>In this post, we'll go through how one sets up their Swarm cluster to automatically expose
its services through Traefik.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="traefik-on-docker-swarm" tabindex="-1"><a class="header-anchor" href="#traefik-on-docker-swarm"><span>Traefik on Docker Swarm</span></a></h1>
<p><a href="https://traefik.io" target="_blank" rel="noopener noreferrer">Traefik</a> is an application load balancer written in Go and designed to simplify
the task of serving HTTP(S) services whose configuration changes on the fly. Traefik v1.1.0
was recently released with support for Docker Swarm and it works excellently.</p>
<p>In this post, we'll go through how one sets up their Swarm cluster to automatically expose
its services through Traefik.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="operations"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2016-12-11T14:11:22.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Docker Swarm</title>
    <id>https://sierrasoftworks.com/2016/12/11/docker-swarm/</id>
    <link href="https://sierrasoftworks.com/2016/12/11/docker-swarm/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Docker Swarm is one of those interesting new technologies which has succeeded in shaking up
people's preconceptions around what it means to run a scaleable cluster. In an environment
where everyone seems to be building a cluster orchestrator, including some big names like
Google's [Kubernetes][kubernetes], HashiCorp's [Nomad][nomad] and Mesosphere's [Marathon][marathon];
Swarm has managed to burst through as one of the most attractive orchestration frameworks out
there.</p>
<p>As a result of all this hype, it can be difficult to make a decision around whether Swarm is
the right tool to use. As someone who has had extensive experience with running [Swarm][swarm],
[Kubernetes][kubernetes], DC/OS ([Marathon][marathon]) and [Rancher][rancher] in production
environments, I'll try to give you an unbiased view on the reasons you'd choose Swarm
and some of the gotchas to be aware of.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="docker-swarm" tabindex="-1"><a class="header-anchor" href="#docker-swarm"><span>Docker Swarm</span></a></h1>
<p>Docker Swarm is one of those interesting new technologies which has succeeded in shaking up
people's preconceptions around what it means to run a scaleable cluster. In an environment
where everyone seems to be building a cluster orchestrator, including some big names like
Google's <a href="http://kubernetes.io" target="_blank" rel="noopener noreferrer">Kubernetes</a>, HashiCorp's <a href="https://nomadproject.io" target="_blank" rel="noopener noreferrer">Nomad</a> and Mesosphere's <a href="https://mesosphere.github.io/marathon/" target="_blank" rel="noopener noreferrer">Marathon</a>;
Swarm has managed to burst through as one of the most attractive orchestration frameworks out
there.</p>
<p>As a result of all this hype, it can be difficult to make a decision around whether Swarm is
the right tool to use. As someone who has had extensive experience with running <a href="https://www.docker.com/products/docker-swarm" target="_blank" rel="noopener noreferrer">Swarm</a>,
<a href="http://kubernetes.io" target="_blank" rel="noopener noreferrer">Kubernetes</a>, DC/OS (<a href="https://mesosphere.github.io/marathon/" target="_blank" rel="noopener noreferrer">Marathon</a>) and <a href="http://rancher.com/" target="_blank" rel="noopener noreferrer">Rancher</a> in production
environments, I'll try to give you an unbiased view on the reasons you'd choose Swarm
and some of the gotchas to be aware of.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="operations"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2016-12-11T09:26:53.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Markdown or HTML?</title>
    <id>https://sierrasoftworks.com/2014/01/22/markdown-vs-html/</id>
    <link href="https://sierrasoftworks.com/2014/01/22/markdown-vs-html/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Until now, all of my work on websites has been done in HTML. Write HTML for this page,
write HTML for that project and so on. HTML is one of those languages which anyone who considers
themselves good with computers should know, but it also leaves a lot to be desired. In the latest version of our website,
I decided to move to Markdown as our primary markup language for documents. Markdown is one of those languages which
continues to grow more popular, especially on very tech-centric sites like [StackOverflow][stackoverflow] and [GitHub][github]
and yet if you talk to most people who are merely "good" with computers, they have never heard of it. Somewhat strange given
that Markdown is designed to be an easier to use, easier to read, shorthand version of HTML for writing documents; but I guess
that's just the way of things.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="markdown-or-html" tabindex="-1"><a class="header-anchor" href="#markdown-or-html"><span>Markdown or HTML?</span></a></h1>
<p>Until now, all of my work on websites has been done in HTML. Write HTML for this page,
write HTML for that project and so on. HTML is one of those languages which anyone who considers
themselves good with computers should know, but it also leaves a lot to be desired. In the latest version of our website,
I decided to move to Markdown as our primary markup language for documents. Markdown is one of those languages which
continues to grow more popular, especially on very tech-centric sites like <a href="http://www.stackoverflow.com" target="_blank" rel="noopener noreferrer">StackOverflow</a> and <a href="http://github.com" target="_blank" rel="noopener noreferrer">GitHub</a>
and yet if you talk to most people who are merely &quot;good&quot; with computers, they have never heard of it. Somewhat strange given
that Markdown is designed to be an easier to use, easier to read, shorthand version of HTML for writing documents; but I guess
that's just the way of things.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="web"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2014-01-22T21:52:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Code Highlighters</title>
    <id>https://sierrasoftworks.com/2013/12/06/highlighters/</id>
    <link href="https://sierrasoftworks.com/2013/12/06/highlighters/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Code Highlighting is one of those things which doesn't seem like a big deal, until you see what a difference it can make. The issue is that source
code is inherently difficult to read due to the vast number of keywords and punctuation used by compilers to understand what we are trying to tell
them to do. In an effort to combat this difficulty, we rely on two different tools.</p>
<p>The first, formatting, is probably the most important; it is the process of making code easier to read through added whitespace, often this
whitespace makes no difference for a compiler but by adding newlines and tabs, humans are able to read it considerably more easily.</p>
<p>The second, highlighting, is the automated (or manual, if you're a masochist) process of colouring different parts of the source code to make
it easier for humans to read. This involves colouring specific keywords in certain colours, maybe colouring variable names another etc.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="code-highlighters" tabindex="-1"><a class="header-anchor" href="#code-highlighters"><span>Code Highlighters</span></a></h1>
<p>Code Highlighting is one of those things which doesn't seem like a big deal, until you see what a difference it can make. The issue is that source
code is inherently difficult to read due to the vast number of keywords and punctuation used by compilers to understand what we are trying to tell
them to do. In an effort to combat this difficulty, we rely on two different tools.</p>
<p>The first, formatting, is probably the most important; it is the process of making code easier to read through added whitespace, often this
whitespace makes no difference for a compiler but by adding newlines and tabs, humans are able to read it considerably more easily.</p>
<p>The second, highlighting, is the automated (or manual, if you're a masochist) process of colouring different parts of the source code to make
it easier for humans to read. This involves colouring specific keywords in certain colours, maybe colouring variable names another etc.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="web"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2013-12-06T09:25:02.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Do you need a dynamic website?</title>
    <id>https://sierrasoftworks.com/2013/10/17/static-websites/</id>
    <link href="https://sierrasoftworks.com/2013/10/17/static-websites/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>Static websites are synonymous with the dawn of the internet, before database servers became mainstream, before the advent of the CMS and long before the
dawn of the web application. Over the years we've seen the advent of web development frameworks like Ruby on Rails, Express.js and MVC to name but a few.
These frameworks include support for advanced templating engines, database backed page generation and custom routing, but is it really necessary to use
such a framework when a static website might address all the same problems at a fraction of the cost.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="do-you-need-a-dynamic-website" tabindex="-1"><a class="header-anchor" href="#do-you-need-a-dynamic-website"><span>Do you need a dynamic website?</span></a></h1>
<p>Static websites are synonymous with the dawn of the internet, before database servers became mainstream, before the advent of the CMS and long before the
dawn of the web application. Over the years we've seen the advent of web development frameworks like Ruby on Rails, Express.js and MVC to name but a few.
These frameworks include support for advanced templating engines, database backed page generation and custom routing, but is it really necessary to use
such a framework when a static website might address all the same problems at a fraction of the cost.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="web"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2013-10-17T09:20:12.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Behind Our Corporate Logo</title>
    <id>https://sierrasoftworks.com/2013/09/13/new-logo/</id>
    <link href="https://sierrasoftworks.com/2013/09/13/new-logo/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="html"><![CDATA[
<p>First off, I'm not a graphic designer by profession and haven't received any kind of training in the field -
so don't take this as a tutorial on how to create your company's logo because in all likelihood I haven't got
the faintest clue what I'm talking about. I am, however, a huge fan of learning to do new things; and in my case
that generally involves mashing together a bunch of Google searches until I find some information that gets me on the way.</p>
]]></summary>
    <content type="html"><![CDATA[<h1 id="behind-our-corporate-logo" tabindex="-1"><a class="header-anchor" href="#behind-our-corporate-logo"><span>Behind our Corporate Logo</span></a></h1>
<p>First off, I'm not a graphic designer by profession and haven't received any kind of training in the field -
so don't take this as a tutorial on how to create your company's logo because in all likelihood I haven't got
the faintest clue what I'm talking about. I am, however, a huge fan of learning to do new things; and in my case
that generally involves mashing together a bunch of Google searches until I find some information that gets me on the way.</p>
]]></content>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <category term="design"/>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <published>2013-09-13T20:13:00.000Z</published>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
  <entry>
    <title type="text">Blog Posts</title>
    <id>https://sierrasoftworks.com/posts/</id>
    <link href="https://sierrasoftworks.com/posts/"/>
    <updated>2025-11-06T22:02:17.000Z</updated>
    <summary type="text">Here are some recent blog posts I&amp;apos;ve written.</summary>
    <author>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </author>
    <contributor>
      <name>Benjamin Pannell</name>
      <uri>https://benjamin.pannell.dev</uri>
    </contributor>
    <rights>Copyright by Benjamin Pannell</rights>
  </entry>
</feed>