<!doctype html>
<html xmlns:og="http://opengraphprotocol.org/schema/" xmlns:fb="http://www.facebook.com/2008/fbml" lang="en-GB"  class="touch-styles">
  <head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- This is Squarespace. --><!-- jaguar-violin-d28j -->
<base href="">
<meta charset="utf-8" />
<title>Blog &mdash; Bitfield Consulting</title>
<meta http-equiv="Accept-CH" content="Sec-CH-UA-Platform-Version, Sec-CH-UA-Model" /><link rel="icon" type="image/x-icon" href="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/74626115-055d-4db8-bc4b-b866f27a3b02/favicon.ico?format=100w"/>
<link rel="canonical" href="https://bitfieldconsulting.com/posts"/>
<meta property="og:site_name" content="Bitfield Consulting"/>
<meta property="og:title" content="Blog &mdash; Bitfield Consulting"/>
<meta property="og:url" content="https://bitfieldconsulting.com/posts"/>
<meta property="og:type" content="website"/>
<meta property="og:description" content="Tutorials, exercises, and articles on programming."/>
<meta property="og:image" content="http://static1.squarespace.com/static/5e10bdc20efb8f0d169f85f9/t/6676d28a409eb81ea906b7ed/1719063178357/heart-balloon-ferris.png?format=1500w"/>
<meta property="og:image:width" content="500"/>
<meta property="og:image:height" content="457"/>
<meta itemprop="name" content="Blog — Bitfield Consulting"/>
<meta itemprop="url" content="https://bitfieldconsulting.com/posts"/>
<meta itemprop="description" content="Tutorials, exercises, and articles on programming."/>
<meta itemprop="thumbnailUrl" content="http://static1.squarespace.com/static/5e10bdc20efb8f0d169f85f9/t/6676d28a409eb81ea906b7ed/1719063178357/heart-balloon-ferris.png?format=1500w"/>
<link rel="image_src" href="http://static1.squarespace.com/static/5e10bdc20efb8f0d169f85f9/t/6676d28a409eb81ea906b7ed/1719063178357/heart-balloon-ferris.png?format=1500w" />
<meta itemprop="image" content="http://static1.squarespace.com/static/5e10bdc20efb8f0d169f85f9/t/6676d28a409eb81ea906b7ed/1719063178357/heart-balloon-ferris.png?format=1500w"/>
<meta name="twitter:title" content="Blog — Bitfield Consulting"/>
<meta name="twitter:image" content="http://static1.squarespace.com/static/5e10bdc20efb8f0d169f85f9/t/6676d28a409eb81ea906b7ed/1719063178357/heart-balloon-ferris.png?format=1500w"/>
<meta name="twitter:url" content="https://bitfieldconsulting.com/posts"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:description" content="Tutorials, exercises, and articles on programming."/>
<meta name="description" content=" Tutorials, exercises, and articles on programming. " />
<link rel="preconnect" href="https://images.squarespace-cdn.com">
<link rel="preconnect" href="https://use.typekit.net" crossorigin>
<link rel="preconnect" href="https://p.typekit.net" crossorigin>
<script type="text/javascript" src="//use.typekit.net/ik/M_8TXkheQIrSDuXCOfJ0mll5qlIYSx2EKXzG1WlkRi6fe76gfFHN4UJLFRbh52jhWDm8wQgKZewkwemcjRycwebUFR8c52mc5sGMJygDdamkjh9lShmk-AjlSY4zJ6Tl-AoTdhtlSY4zH6GJKOJgIMMjgfMfH6GJKdJgIMMjgkMfH6GJcnqfIMMj2KMfH6GJ1OqfIMMjIPMfH6qJGQ9bMs6IJMJ7fbKSFsMgeMS6MKG4f4tuIMIj2KMfH6qJ1Q9bMs6sJMHbM-Otlwje.js" async fetchpriority="high" onload="try{Typekit.load();}catch(e){} document.documentElement.classList.remove('wf-loading');"></script>
<script>document.documentElement.classList.add('wf-loading')</script>
<style>@keyframes fonts-loading { 0%, 99% { color: transparent; } } html.wf-loading * { animation: fonts-loading 3s; }</style>
<link rel="preconnect" href="https://file.squarespace-cdn.com" crossorigin>
<style data-sqsp-font-ids="6a31393d494e3c6626e63daa,6a3136d96307d35684222716,6a313b8c6307d3568422317a,6a313a715ede88444e8c50d3">
/* latin */
@font-face {
  font-family: 'Nunito Sans';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/b4363838-f644-4269-a277-2ece4cf31de6/latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* latin-ext */
@font-face {
  font-family: 'Nunito Sans';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/c3832582-ee38-48b0-8c46-f18b014cd3f6/latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* vietnamese */
@font-face {
  font-family: 'Nunito Sans';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/f3525762-0fea-4331-9d13-583b3211902e/vietnamese.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* cyrillic */
@font-face {
  font-family: 'Nunito Sans';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/bd266b1b-021f-48b9-9182-2119e1c0bca2/cyrillic.woff2') format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Nunito Sans';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/0da38731-f066-4d4d-ac79-9d4af2ea0358/cyrillic-ext.woff2') format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* latin-ext */
@font-face {
  font-family: 'Lato';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/0e48baa8-3b27-43a8-b31d-07bd5927372a/latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Lato';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/9b7fd711-2de3-4280-9313-db3740d27a01/latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Nunito Sans';
  font-style: italic;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/d7b79217-8d1e-4e71-9851-2481edbf8ba2/cyrillic-ext.woff2') format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'Nunito Sans';
  font-style: italic;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/4bf68365-0154-4180-9568-25a9c746c62a/cyrillic.woff2') format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* vietnamese */
@font-face {
  font-family: 'Nunito Sans';
  font-style: italic;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/66a7fd1e-b365-4ad4-828d-3e2ebd388950/vietnamese.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin */
@font-face {
  font-family: 'Nunito Sans';
  font-style: italic;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/a067dfe4-ae5d-4154-a24a-f891930ebc25/latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* latin-ext */
@font-face {
  font-family: 'Nunito Sans';
  font-style: italic;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/a6cd822f-d142-446d-86db-4d3ffa889d41/latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* cyrillic */
@font-face {
  font-family: 'Source Serif Pro';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/98cbf9b2-b4fc-4a11-aabf-5685347b1494/cyrillic.woff2') format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek */
@font-face {
  font-family: 'Source Serif Pro';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/6780b7c1-382c-4b8a-9fba-299fe7a6ee50/greek.woff2') format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Source Serif Pro';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/76fe6117-cda5-4526-84ac-6af8cc2c87d2/cyrillic-ext.woff2') format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* latin */
@font-face {
  font-family: 'Source Serif Pro';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/1c296828-0fa8-4ff8-8d2b-f2e57ca33fa0/latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* vietnamese */
@font-face {
  font-family: 'Source Serif Pro';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/64248e89-2b0b-41e4-91b3-e7c58b516e62/vietnamese.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Source Serif Pro';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/5fe5f433-4413-4b50-b2c8-4eba09375d6a/latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin-ext */
@font-face {
  font-family: 'Roboto Slab';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/aaf61676-e84b-47bc-b641-c60c74595f88/latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* greek-ext */
@font-face {
  font-family: 'Roboto Slab';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/057a65e8-60da-444b-847d-ad7c3b2ec1f3/greek-ext.woff2') format('woff2');
  unicode-range: U+1F00-1FFF;
}
/* vietnamese */
@font-face {
  font-family: 'Roboto Slab';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/fae5b31a-5a86-44ca-9384-45fdb052e51e/vietnamese.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin */
@font-face {
  font-family: 'Roboto Slab';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/7f4f4fd0-8785-4333-8e67-35104b98cc75/latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* cyrillic */
@font-face {
  font-family: 'Roboto Slab';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/57dd5f26-046a-48f2-9a5e-c5e6c27bd640/cyrillic.woff2') format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek */
@font-face {
  font-family: 'Roboto Slab';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/4b01fe59-494f-49a7-947a-e03471dcc895/greek.woff2') format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Roboto Slab';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/975271b6-241a-4210-8cb8-d4b615385db5/cyrillic-ext.woff2') format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Nunito Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/aa238b2d-688a-4c8c-a4f0-171ac8baeb7c/cyrillic-ext.woff2') format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'Nunito Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/63da1631-d192-4015-8593-e2e390a39da5/cyrillic.woff2') format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* latin-ext */
@font-face {
  font-family: 'Nunito Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/f4b13614-7f19-433e-a39b-8a79c1ccfde8/latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Nunito Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/72c60f2d-fcc7-4c45-a2b5-13bb32410d52/latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* vietnamese */
@font-face {
  font-family: 'Nunito Sans';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/a194a5b3-fefd-4f23-aba2-8de4983ecd91/vietnamese.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* cyrillic */
@font-face {
  font-family: 'Nunito Sans';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/579bf29a-4da0-49bb-be1c-e859bc2fd8bb/cyrillic.woff2') format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Nunito Sans';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/6f018d4b-6e26-4595-b338-7aae84a53373/cyrillic-ext.woff2') format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* vietnamese */
@font-face {
  font-family: 'Nunito Sans';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/e0e4673f-f704-4429-9596-37d786e27a55/vietnamese.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Nunito Sans';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/35ecdce1-b97a-45f1-a9cb-2b71ef197243/latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Nunito Sans';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/0ba8d383-b036-406f-913c-77027b6df7e1/latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* greek */
@font-face {
  font-family: 'Source Serif Pro';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/1b2769f3-cd71-493c-99e1-a835b71d7e8a/greek.woff2') format('woff2');
  unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
/* vietnamese */
@font-face {
  font-family: 'Source Serif Pro';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/0b7b7bd1-a2e2-4fd5-b896-ddbdd86f5915/vietnamese.woff2') format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* cyrillic-ext */
@font-face {
  font-family: 'Source Serif Pro';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/8c458c63-e1e0-4e80-8b22-4a6a0faf8b82/cyrillic-ext.woff2') format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'Source Serif Pro';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/c45204ec-2165-432f-b74d-ad8c37b274c3/cyrillic.woff2') format('woff2');
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* latin-ext */
@font-face {
  font-family: 'Source Serif Pro';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/fc3002d5-38db-41a8-81ad-a73502feee42/latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Source Serif Pro';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('https://file.squarespace-cdn.com/content/v2/namespaces/fonts/libraries/sqsp/assets/7ddc2e04-3854-4af3-804f-4ae7dc38f5a1/latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
</style><script type="text/javascript" crossorigin="anonymous" nomodule="nomodule" src="//assets.squarespace.com/@sqs/polyfiller/1.6/legacy.js"></script>
<script type="text/javascript" crossorigin="anonymous" src="//assets.squarespace.com/@sqs/polyfiller/1.6/modern.js"></script>
<script data-name="static-context">Static = window.Static || {}; Static.SQUARESPACE_CONTEXT = {"betaFeatureFlags":["marketing_landing_page","campaigns_thumbnail_layout","commerce_product_payment_plan_editing","order_status_page_checkout_landing_enabled","enable_modernized_standalone_pages","marketing_automations","json_tweaks","campaigns_discount_section_in_blasts","campaigns_table_v2","enable_modernized_pdp_m3_fluid","output_template_css_assets","campaigns_import_discounts","campaigns_discount_section_in_automations","campaigns_new_image_layout_picker","enable_modernized_standalone_pages_kill_switch","contacts_and_campaigns_redesign","i18n_beta_website_locales","enable_modernized_pdp_m3_layout_ux","product_list_filters_v2_separate_categories","campaigns_merch_state","enable_form_submission_trigger","modernized-pdp-m2-enabled","public_api_discounts_enabled"],"facebookAppId":"314192535267336","facebookApiVersion":"v6.0","rollups":{"squarespace-announcement-bar":{"js":"//assets.squarespace.com/universal/scripts-compressed/announcement-bar-84ac4ebc6c2eb13d-min.en-US.js"},"squarespace-audio-player":{"css":"//assets.squarespace.com/universal/styles-compressed/audio-player-b05f5197a871c566-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/audio-player-88f12b1274cb1715-min.en-US.js"},"squarespace-blog-collection-list":{"css":"//assets.squarespace.com/universal/styles-compressed/blog-collection-list-b4046463b72f34e2-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/blog-collection-list-804d48b04f8cd8a1-min.en-US.js"},"squarespace-calendar-block-renderer":{"css":"//assets.squarespace.com/universal/styles-compressed/calendar-block-renderer-c3fef2a497c8e56b-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/calendar-block-renderer-cb9e5d2662e9606c-min.en-US.js"},"squarespace-chartjs-helpers":{"css":"//assets.squarespace.com/universal/styles-compressed/chartjs-helpers-96b256171ee039c1-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/chartjs-helpers-09376c2f45ec20f7-min.en-US.js"},"squarespace-comments":{"css":"//assets.squarespace.com/universal/styles-compressed/comments-bd6c75e172166fdc-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/comments-42049f58670fcd5d-min.en-US.js"},"squarespace-custom-css-popup":{"css":"//assets.squarespace.com/universal/styles-compressed/custom-css-popup-ce62092cd89db3df-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/custom-css-popup-e785f223dcfc8786-min.en-US.js"},"squarespace-dialog":{"css":"//assets.squarespace.com/universal/styles-compressed/dialog-86aacd645d83874c-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/dialog-7735654fd1551dd5-min.en-US.js"},"squarespace-events-collection":{"css":"//assets.squarespace.com/universal/styles-compressed/events-collection-c3fef2a497c8e56b-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/events-collection-67eeda22a3fc9673-min.en-US.js"},"squarespace-form-rendering-utils":{"js":"//assets.squarespace.com/universal/scripts-compressed/form-rendering-utils-1c9bf49d95349e29-min.en-US.js"},"squarespace-forms":{"css":"//assets.squarespace.com/universal/styles-compressed/forms-0afd3c6ac30bbab1-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/forms-bf2be08965a0fa19-min.en-US.js"},"squarespace-gallery-collection-list":{"css":"//assets.squarespace.com/universal/styles-compressed/gallery-collection-list-b4046463b72f34e2-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/gallery-collection-list-7b9e3df420b8fb7f-min.en-US.js"},"squarespace-image-zoom":{"css":"//assets.squarespace.com/universal/styles-compressed/image-zoom-b4046463b72f34e2-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/image-zoom-8fb2d4ed417f5ff2-min.en-US.js"},"squarespace-pinterest":{"css":"//assets.squarespace.com/universal/styles-compressed/pinterest-b4046463b72f34e2-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/pinterest-03f111daaffa1a53-min.en-US.js"},"squarespace-popup-overlay":{"css":"//assets.squarespace.com/universal/styles-compressed/popup-overlay-b742b752f5880972-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/popup-overlay-9135c3716a7435b1-min.en-US.js"},"squarespace-product-quick-view":{"css":"//assets.squarespace.com/universal/styles-compressed/product-quick-view-0afd3c6ac30bbab1-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/product-quick-view-a1b7644de55dc7c2-min.en-US.js"},"squarespace-products-collection-item-v2":{"css":"//assets.squarespace.com/universal/styles-compressed/products-collection-item-v2-b4046463b72f34e2-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/products-collection-item-v2-99be948a1d39ff28-min.en-US.js"},"squarespace-products-collection-list-v2":{"css":"//assets.squarespace.com/universal/styles-compressed/products-collection-list-v2-b4046463b72f34e2-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/products-collection-list-v2-776747e4add9de69-min.en-US.js"},"squarespace-search-page":{"css":"//assets.squarespace.com/universal/styles-compressed/search-page-90a67fc09b9b32c6-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/search-page-305401ddcbfa5f68-min.en-US.js"},"squarespace-search-preview":{"js":"//assets.squarespace.com/universal/scripts-compressed/search-preview-d64b2fb30d3da89f-min.en-US.js"},"squarespace-simple-liking":{"css":"//assets.squarespace.com/universal/styles-compressed/simple-liking-701bf8bbc05ec6aa-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/simple-liking-69bfa10d1d97bade-min.en-US.js"},"squarespace-social-buttons":{"css":"//assets.squarespace.com/universal/styles-compressed/social-buttons-95032e5fa98e47a5-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/social-buttons-477c45eeedaa78b2-min.en-US.js"},"squarespace-tourdates":{"css":"//assets.squarespace.com/universal/styles-compressed/tourdates-b4046463b72f34e2-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/tourdates-2591addc7c341d92-min.en-US.js"},"squarespace-website-overlays-manager":{"css":"//assets.squarespace.com/universal/styles-compressed/website-overlays-manager-07ea5a4e004e6710-min.en-US.css","js":"//assets.squarespace.com/universal/scripts-compressed/website-overlays-manager-a09a45eede4cfe05-min.en-US.js"}},"pageType":1,"website":{"id":"5e10bdc20efb8f0d169f85f9","captchaSettings":{"siteKey":"","enabledForDonations":false},"cloneable":false,"contentModifiedOn":1786267844591,"formattingLocale":"en-US","fullSiteTitle":"Blog \u2014 Bitfield Consulting","identifier":"jaguar-violin-d28j","imageMetadataProcessingEnabled":false,"isHstsEnabled":true,"language":"en-GB","location":{"addressTitle":"","addressLine1":"","addressLine2":"","addressCountry":"United States"},"logoImageId":"68cbe5618326354b921ffaf9","primaryDomain":"bitfieldconsulting.com","screenshotId":"1a2d4d258c3a5bcad7f970309c4ccb12c4934181f35f67ee94a9ba24048f662a","shareButtonOptions":{"3":true},"showOwnerLogin":false,"siteDescription":"","siteStatus":{},"siteTagLine":"Friendly, professional Go &amp; Rust training","siteTitle":"Bitfield Consulting","socialLogoImageId":"6676d28a409eb81ea906b7ed","sslSetting":3,"timeZone":"Europe/London","translationLocale":"en-US","typekitId":"","websiteType":1,"hasBeenCloneable":false,"statsMigrated":false,"authenticUrl":"https://bitfieldconsulting.com","baseUrl":"https://bitfieldconsulting.com","internalUrl":"https://jaguar-violin-d28j.squarespace.com","logoImageUrl":"//images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/21abedc0-3e70-4f7f-a319-7d33cc23c05d/heart-balloon-ferris+small.png","machineTimeZoneOffset":3600000,"socialAccounts":[{"serviceId":73,"screenname":"GitHub","addedOn":1579276993645,"profileUrl":"https://github.com/bitfield","iconEnabled":true,"serviceName":"github-unauth"},{"serviceId":86,"screenname":"Bluesky","addedOn":1758040564669,"profileUrl":"https://bsky.app/profile/bitfieldconsulting.bsky.social","iconEnabled":true,"serviceName":"bluesky-unauth"},{"serviceId":65,"screenname":"LinkedIn","addedOn":1578156370584,"profileUrl":"https://www.linkedin.com/in/bitfieldconsulting/","iconEnabled":true,"serviceName":"linkedin-unauth"},{"serviceId":43,"screenname":"Reddit","addedOn":1758040651678,"profileUrl":"https://www.reddit.com/r/bitfieldconsulting/","iconEnabled":true,"serviceName":"reddit"}],"socialLogoImageUrl":"//images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/a8898c13-56a6-4de1-99ee-7ae5946132d5/heart-balloon-ferris.png","timeZoneAbbr":"BST","timeZoneOffset":3600000},"websiteSettings":{"id":"5e10bdc20efb8f0d169f85fb","websiteId":"5e10bdc20efb8f0d169f85f9","type":"Business","subjects":[],"country":"US","state":"NY","simpleLikingEnabled":false,"mobileInfoBarSettings":{"style":1,"isContactEmailEnabled":false,"isContactPhoneNumberEnabled":false,"isLocationEnabled":false,"isBusinessHoursEnabled":false},"announcementBarSettings":{"style":1},"popupOverlaySettings":{"style":1,"enabledPages":[]},"commentLikesAllowed":true,"commentAnonAllowed":true,"commentThreaded":true,"commentApprovalRequired":false,"commentAvatarsOn":true,"commentSortType":2,"commentFlagThreshold":0,"commentFlagsAllowed":true,"commentEnableByDefault":true,"commentDisableAfterDaysDefault":0,"disqusShortname":"","commentsEnabled":false,"contactPhoneNumber":"+441503205247","businessHours":{"monday":{"text":"All day","ranges":[{"from":0,"to":1440}]},"tuesday":{"text":"All day","ranges":[{"from":0,"to":1440}]},"wednesday":{"text":"All day","ranges":[{"from":0,"to":1440}]},"thursday":{"text":"All day","ranges":[{"from":0,"to":1440}]},"friday":{"text":"All day","ranges":[{"from":0,"to":1440}]},"saturday":{"text":"Closed","ranges":[{}]},"sunday":{"text":"Closed","ranges":[{}]}},"storeSettings":{"returnPolicy":null,"termsOfService":null,"privacyPolicy":null,"expressCheckout":false,"continueShoppingLinkUrl":"/","useLightCart":true,"showNoteField":false,"shippingCountryDefaultValue":"US","billToShippingDefaultValue":true,"showShippingPhoneNumber":false,"isShippingPhoneRequired":false,"showBillingPhoneNumber":false,"isBillingPhoneRequired":false,"currenciesSupported":["USD","ARS","AUD","BRL","CAD","CHF","COP","CZK","DKK","EUR","GBP","HKD","IDR","ILS","INR","JPY","MXN","MYR","NOK","NZD","PHP","PLN","RUB","SEK","SGD","THB","ZAR"],"defaultCurrency":"GBP","selectedCurrency":"USD","measurementStandard":2,"showCustomCheckoutForm":false,"checkoutPageMarketingOptInEnabled":true,"enableMailingListOptInByDefault":true,"mailingListDescription":"Join my free newsletter\u2014learn Go & Rust, and be a better engineer","sameAsRetailLocation":false,"merchandisingSettings":{"scarcityEnabledOnProductItems":false,"scarcityEnabledOnProductBlocks":false,"scarcityMessageType":"DEFAULT_SCARCITY_MESSAGE","scarcityThreshold":10,"multipleQuantityAllowedForServices":true,"restockNotificationsEnabled":false,"restockNotificationsMailingListSignUpEnabled":false,"relatedProductsEnabled":true,"relatedProductsOrdering":"random","customSoldOutText":"Sold Out","soldOutVariantsDropdownDisabled":false,"productComposerOptedIn":false,"productComposerABTestOptedOut":false,"productReviewsEnabled":false,"displayNativeProductReviewsEnabled":false,"displayImportedProductReviewsEnabled":false,"productReviewsDisplayScope":"ALL_REVIEWS","productReviewsMerchantEmailEnabled":false,"hasOptedToCollectNativeReviews":false},"minimumOrderSubtotalEnabled":false,"minimumOrderSubtotal":{"currency":"USD","value":"0.00"},"addToCartConfirmationType":2,"isLive":true,"multipleQuantityAllowedForServices":true},"useEscapeKeyToLogin":true,"ssBadgeType":1,"ssBadgePosition":4,"ssBadgeVisibility":1,"ssBadgeDevices":1,"pinterestOverlayOptions":{"mode":"disabled"},"userAccountsSettings":{"loginAllowed":true,"signupAllowed":true}},"cookieSettings":{"isCookieBannerEnabled":false,"isRestrictiveCookiePolicyEnabled":false,"cookieBannerText":"","cookieBannerTheme":"","cookieBannerVariant":"","cookieBannerPosition":"","cookieBannerCtaVariant":"","cookieBannerCtaText":"","cookieBannerAcceptType":"OPT_IN","cookieBannerOptOutCtaText":"","cookieBannerHasOptOut":false,"cookieBannerHasManageCookies":true,"cookieBannerManageCookiesLabel":"","cookieBannerSavedPreferencesText":"","cookieBannerSavedPreferencesLayout":"PILL"},"websiteCloneable":false,"collection":{"title":"Blog","id":"5e949913434baa2223121b85","fullUrl":"/posts","type":1,"permissionType":1},"subscribed":false,"appDomain":"squarespace.com","templateTweakable":true,"tweakJSON":{"aspect-ratio":"Auto","gallery-arrow-style":"Circular","gallery-aspect-ratio":"16:9 Widescreen","gallery-auto-crop":"true","gallery-autoplay":"false","gallery-design":"Slideshow","gallery-info-overlay":"Always Show","gallery-loop":"false","gallery-navigation":"Thumbnails","gallery-show-arrows":"true","gallery-transitions":"Fade","galleryArrowBackground":"rgba(255,255,255,0.7)","galleryArrowColor":"rgba(102,102,102,1)","galleryAutoplaySpeed":"3","galleryCircleColor":"rgba(255,255,255,0.8)","galleryInfoBackground":"rgba(255,255,255,0.7)","galleryThumbnailSize":"100px","gridSize":"350px","gridSpacing":"20px","maxNumberColumns":"4","minColumnWidth":"230","tweak-blog-list-grid-alignment":"Top","tweak-blog-list-grid-narrow-columns":"true","tweak-blog-list-max-width":"Full","tweak-crop-images":"Square","tweak-infinite-scroll":"true","tweak-product-item-image-zoom-factor":"2.5","tweak-product-list-item-hover-behavior":"None","tweak-product-list-items-per-row":"4","tweak-related-products-items-per-row":"3","tweak-related-products-title-spacing":"50px","tweak-show-progress-indicator":"false","tweak-user-account-link-position":"With Nav"},"templateId":"54d3906fe4b04c1c9981b00e","templateVersion":"7","pageFeatures":[1,2,4],"gmRenderKey":"QUl6YVN5Q0JUUk9xNkx1dkZfSUUxcjQ2LVQ0QWVUU1YtMGQ3bXk4","templateScriptsRootUrl":"https://static1.squarespace.com/static/ta/54d39057e4b01a0da310c80f/4948/scripts/","impersonatedSession":false,"tzData":{"zones":[[0,"EU","GMT/BST",null]],"rules":{"EU":[[1981,"max",null,"Mar","lastSun","1:00u","1:00","S"],[1996,"max",null,"Oct","lastSun","1:00u","0",null]]}},"showAnnouncementBar":false,"recaptchaEnterpriseContext":{"recaptchaEnterpriseSiteKey":"6LdDFQwjAAAAAPigEvvPgEVbb7QBm-TkVJdDTlAv"},"i18nContext":{"timeZoneData":{"id":"Europe/London","name":"Greenwich Mean Time"}},"env":"PRODUCTION","visitorFormContext":{"formFieldFormats":{"initialNameOrder":"GIVEN_FIRST","initialPhoneFormat":{"id":0,"type":"PHONE_NUMBER","country":"US","labelLocale":"en-US","fields":[{"type":"SEPARATOR","label":"(","identifier":"LeftParen","length":0,"required":false,"metadata":{}},{"type":"FIELD","label":"1","identifier":"1","length":3,"required":false,"metadata":{}},{"type":"SEPARATOR","label":")","identifier":"RightParen","length":0,"required":false,"metadata":{}},{"type":"SEPARATOR","label":" ","identifier":"Space","length":0,"required":false,"metadata":{}},{"type":"FIELD","label":"2","identifier":"2","length":3,"required":false,"metadata":{}},{"type":"SEPARATOR","label":"-","identifier":"Dash","length":0,"required":false,"metadata":{}},{"type":"FIELD","label":"3","identifier":"3","length":14,"required":false,"metadata":{}}]},"countries":[{"name":"Afghanistan","code":"AF","phoneCode":"+93"},{"name":"\u00C5land Islands","code":"AX","phoneCode":"+358"},{"name":"Albania","code":"AL","phoneCode":"+355"},{"name":"Algeria","code":"DZ","phoneCode":"+213"},{"name":"American Samoa","code":"AS","phoneCode":"+1"},{"name":"Andorra","code":"AD","phoneCode":"+376"},{"name":"Angola","code":"AO","phoneCode":"+244"},{"name":"Anguilla","code":"AI","phoneCode":"+1"},{"name":"Antigua & Barbuda","code":"AG","phoneCode":"+1"},{"name":"Argentina","code":"AR","phoneCode":"+54"},{"name":"Armenia","code":"AM","phoneCode":"+374"},{"name":"Aruba","code":"AW","phoneCode":"+297"},{"name":"Ascension Island","code":"AC","phoneCode":"+247"},{"name":"Australia","code":"AU","phoneCode":"+61"},{"name":"Austria","code":"AT","phoneCode":"+43"},{"name":"Azerbaijan","code":"AZ","phoneCode":"+994"},{"name":"Bahamas","code":"BS","phoneCode":"+1"},{"name":"Bahrain","code":"BH","phoneCode":"+973"},{"name":"Bangladesh","code":"BD","phoneCode":"+880"},{"name":"Barbados","code":"BB","phoneCode":"+1"},{"name":"Belarus","code":"BY","phoneCode":"+375"},{"name":"Belgium","code":"BE","phoneCode":"+32"},{"name":"Belize","code":"BZ","phoneCode":"+501"},{"name":"Benin","code":"BJ","phoneCode":"+229"},{"name":"Bermuda","code":"BM","phoneCode":"+1"},{"name":"Bhutan","code":"BT","phoneCode":"+975"},{"name":"Bolivia","code":"BO","phoneCode":"+591"},{"name":"Bosnia & Herzegovina","code":"BA","phoneCode":"+387"},{"name":"Botswana","code":"BW","phoneCode":"+267"},{"name":"Brazil","code":"BR","phoneCode":"+55"},{"name":"British Indian Ocean Territory","code":"IO","phoneCode":"+246"},{"name":"British Virgin Islands","code":"VG","phoneCode":"+1"},{"name":"Brunei","code":"BN","phoneCode":"+673"},{"name":"Bulgaria","code":"BG","phoneCode":"+359"},{"name":"Burkina Faso","code":"BF","phoneCode":"+226"},{"name":"Burundi","code":"BI","phoneCode":"+257"},{"name":"Cambodia","code":"KH","phoneCode":"+855"},{"name":"Cameroon","code":"CM","phoneCode":"+237"},{"name":"Canada","code":"CA","phoneCode":"+1"},{"name":"Cape Verde","code":"CV","phoneCode":"+238"},{"name":"Caribbean Netherlands","code":"BQ","phoneCode":"+599"},{"name":"Cayman Islands","code":"KY","phoneCode":"+1"},{"name":"Central African Republic","code":"CF","phoneCode":"+236"},{"name":"Chad","code":"TD","phoneCode":"+235"},{"name":"Chile","code":"CL","phoneCode":"+56"},{"name":"China","code":"CN","phoneCode":"+86"},{"name":"Christmas Island","code":"CX","phoneCode":"+61"},{"name":"Cocos (Keeling) Islands","code":"CC","phoneCode":"+61"},{"name":"Colombia","code":"CO","phoneCode":"+57"},{"name":"Comoros","code":"KM","phoneCode":"+269"},{"name":"Congo - Brazzaville","code":"CG","phoneCode":"+242"},{"name":"Congo - Kinshasa","code":"CD","phoneCode":"+243"},{"name":"Cook Islands","code":"CK","phoneCode":"+682"},{"name":"Costa Rica","code":"CR","phoneCode":"+506"},{"name":"C\u00F4te d\u2019Ivoire","code":"CI","phoneCode":"+225"},{"name":"Croatia","code":"HR","phoneCode":"+385"},{"name":"Cuba","code":"CU","phoneCode":"+53"},{"name":"Cura\u00E7ao","code":"CW","phoneCode":"+599"},{"name":"Cyprus","code":"CY","phoneCode":"+357"},{"name":"Czechia","code":"CZ","phoneCode":"+420"},{"name":"Denmark","code":"DK","phoneCode":"+45"},{"name":"Djibouti","code":"DJ","phoneCode":"+253"},{"name":"Dominica","code":"DM","phoneCode":"+1"},{"name":"Dominican Republic","code":"DO","phoneCode":"+1"},{"name":"Ecuador","code":"EC","phoneCode":"+593"},{"name":"Egypt","code":"EG","phoneCode":"+20"},{"name":"El Salvador","code":"SV","phoneCode":"+503"},{"name":"Equatorial Guinea","code":"GQ","phoneCode":"+240"},{"name":"Eritrea","code":"ER","phoneCode":"+291"},{"name":"Estonia","code":"EE","phoneCode":"+372"},{"name":"Eswatini","code":"SZ","phoneCode":"+268"},{"name":"Ethiopia","code":"ET","phoneCode":"+251"},{"name":"Falkland Islands","code":"FK","phoneCode":"+500"},{"name":"Faroe Islands","code":"FO","phoneCode":"+298"},{"name":"Fiji","code":"FJ","phoneCode":"+679"},{"name":"Finland","code":"FI","phoneCode":"+358"},{"name":"France","code":"FR","phoneCode":"+33"},{"name":"French Guiana","code":"GF","phoneCode":"+594"},{"name":"French Polynesia","code":"PF","phoneCode":"+689"},{"name":"Gabon","code":"GA","phoneCode":"+241"},{"name":"Gambia","code":"GM","phoneCode":"+220"},{"name":"Georgia","code":"GE","phoneCode":"+995"},{"name":"Germany","code":"DE","phoneCode":"+49"},{"name":"Ghana","code":"GH","phoneCode":"+233"},{"name":"Gibraltar","code":"GI","phoneCode":"+350"},{"name":"Greece","code":"GR","phoneCode":"+30"},{"name":"Greenland","code":"GL","phoneCode":"+299"},{"name":"Grenada","code":"GD","phoneCode":"+1"},{"name":"Guadeloupe","code":"GP","phoneCode":"+590"},{"name":"Guam","code":"GU","phoneCode":"+1"},{"name":"Guatemala","code":"GT","phoneCode":"+502"},{"name":"Guernsey","code":"GG","phoneCode":"+44"},{"name":"Guinea","code":"GN","phoneCode":"+224"},{"name":"Guinea-Bissau","code":"GW","phoneCode":"+245"},{"name":"Guyana","code":"GY","phoneCode":"+592"},{"name":"Haiti","code":"HT","phoneCode":"+509"},{"name":"Honduras","code":"HN","phoneCode":"+504"},{"name":"Hong Kong SAR China","code":"HK","phoneCode":"+852"},{"name":"Hungary","code":"HU","phoneCode":"+36"},{"name":"Iceland","code":"IS","phoneCode":"+354"},{"name":"India","code":"IN","phoneCode":"+91"},{"name":"Indonesia","code":"ID","phoneCode":"+62"},{"name":"Iran","code":"IR","phoneCode":"+98"},{"name":"Iraq","code":"IQ","phoneCode":"+964"},{"name":"Ireland","code":"IE","phoneCode":"+353"},{"name":"Isle of Man","code":"IM","phoneCode":"+44"},{"name":"Israel","code":"IL","phoneCode":"+972"},{"name":"Italy","code":"IT","phoneCode":"+39"},{"name":"Jamaica","code":"JM","phoneCode":"+1"},{"name":"Japan","code":"JP","phoneCode":"+81"},{"name":"Jersey","code":"JE","phoneCode":"+44"},{"name":"Jordan","code":"JO","phoneCode":"+962"},{"name":"Kazakhstan","code":"KZ","phoneCode":"+7"},{"name":"Kenya","code":"KE","phoneCode":"+254"},{"name":"Kiribati","code":"KI","phoneCode":"+686"},{"name":"Kosovo","code":"XK","phoneCode":"+383"},{"name":"Kuwait","code":"KW","phoneCode":"+965"},{"name":"Kyrgyzstan","code":"KG","phoneCode":"+996"},{"name":"Laos","code":"LA","phoneCode":"+856"},{"name":"Latvia","code":"LV","phoneCode":"+371"},{"name":"Lebanon","code":"LB","phoneCode":"+961"},{"name":"Lesotho","code":"LS","phoneCode":"+266"},{"name":"Liberia","code":"LR","phoneCode":"+231"},{"name":"Libya","code":"LY","phoneCode":"+218"},{"name":"Liechtenstein","code":"LI","phoneCode":"+423"},{"name":"Lithuania","code":"LT","phoneCode":"+370"},{"name":"Luxembourg","code":"LU","phoneCode":"+352"},{"name":"Macao SAR China","code":"MO","phoneCode":"+853"},{"name":"Madagascar","code":"MG","phoneCode":"+261"},{"name":"Malawi","code":"MW","phoneCode":"+265"},{"name":"Malaysia","code":"MY","phoneCode":"+60"},{"name":"Maldives","code":"MV","phoneCode":"+960"},{"name":"Mali","code":"ML","phoneCode":"+223"},{"name":"Malta","code":"MT","phoneCode":"+356"},{"name":"Marshall Islands","code":"MH","phoneCode":"+692"},{"name":"Martinique","code":"MQ","phoneCode":"+596"},{"name":"Mauritania","code":"MR","phoneCode":"+222"},{"name":"Mauritius","code":"MU","phoneCode":"+230"},{"name":"Mayotte","code":"YT","phoneCode":"+262"},{"name":"Mexico","code":"MX","phoneCode":"+52"},{"name":"Micronesia","code":"FM","phoneCode":"+691"},{"name":"Moldova","code":"MD","phoneCode":"+373"},{"name":"Monaco","code":"MC","phoneCode":"+377"},{"name":"Mongolia","code":"MN","phoneCode":"+976"},{"name":"Montenegro","code":"ME","phoneCode":"+382"},{"name":"Montserrat","code":"MS","phoneCode":"+1"},{"name":"Morocco","code":"MA","phoneCode":"+212"},{"name":"Mozambique","code":"MZ","phoneCode":"+258"},{"name":"Myanmar (Burma)","code":"MM","phoneCode":"+95"},{"name":"Namibia","code":"NA","phoneCode":"+264"},{"name":"Nauru","code":"NR","phoneCode":"+674"},{"name":"Nepal","code":"NP","phoneCode":"+977"},{"name":"Netherlands","code":"NL","phoneCode":"+31"},{"name":"New Caledonia","code":"NC","phoneCode":"+687"},{"name":"New Zealand","code":"NZ","phoneCode":"+64"},{"name":"Nicaragua","code":"NI","phoneCode":"+505"},{"name":"Niger","code":"NE","phoneCode":"+227"},{"name":"Nigeria","code":"NG","phoneCode":"+234"},{"name":"Niue","code":"NU","phoneCode":"+683"},{"name":"Norfolk Island","code":"NF","phoneCode":"+672"},{"name":"Northern Mariana Islands","code":"MP","phoneCode":"+1"},{"name":"North Korea","code":"KP","phoneCode":"+850"},{"name":"North Macedonia","code":"MK","phoneCode":"+389"},{"name":"Norway","code":"NO","phoneCode":"+47"},{"name":"Oman","code":"OM","phoneCode":"+968"},{"name":"Pakistan","code":"PK","phoneCode":"+92"},{"name":"Palau","code":"PW","phoneCode":"+680"},{"name":"Palestinian Territories","code":"PS","phoneCode":"+970"},{"name":"Panama","code":"PA","phoneCode":"+507"},{"name":"Papua New Guinea","code":"PG","phoneCode":"+675"},{"name":"Paraguay","code":"PY","phoneCode":"+595"},{"name":"Peru","code":"PE","phoneCode":"+51"},{"name":"Philippines","code":"PH","phoneCode":"+63"},{"name":"Poland","code":"PL","phoneCode":"+48"},{"name":"Portugal","code":"PT","phoneCode":"+351"},{"name":"Puerto Rico","code":"PR","phoneCode":"+1"},{"name":"Qatar","code":"QA","phoneCode":"+974"},{"name":"R\u00E9union","code":"RE","phoneCode":"+262"},{"name":"Romania","code":"RO","phoneCode":"+40"},{"name":"Russia","code":"RU","phoneCode":"+7"},{"name":"Rwanda","code":"RW","phoneCode":"+250"},{"name":"Samoa","code":"WS","phoneCode":"+685"},{"name":"San Marino","code":"SM","phoneCode":"+378"},{"name":"S\u00E3o Tom\u00E9 & Pr\u00EDncipe","code":"ST","phoneCode":"+239"},{"name":"Saudi Arabia","code":"SA","phoneCode":"+966"},{"name":"Senegal","code":"SN","phoneCode":"+221"},{"name":"Serbia","code":"RS","phoneCode":"+381"},{"name":"Seychelles","code":"SC","phoneCode":"+248"},{"name":"Sierra Leone","code":"SL","phoneCode":"+232"},{"name":"Singapore","code":"SG","phoneCode":"+65"},{"name":"Sint Maarten","code":"SX","phoneCode":"+1"},{"name":"Slovakia","code":"SK","phoneCode":"+421"},{"name":"Slovenia","code":"SI","phoneCode":"+386"},{"name":"Solomon Islands","code":"SB","phoneCode":"+677"},{"name":"Somalia","code":"SO","phoneCode":"+252"},{"name":"South Africa","code":"ZA","phoneCode":"+27"},{"name":"South Korea","code":"KR","phoneCode":"+82"},{"name":"South Sudan","code":"SS","phoneCode":"+211"},{"name":"Spain","code":"ES","phoneCode":"+34"},{"name":"Sri Lanka","code":"LK","phoneCode":"+94"},{"name":"St. Barth\u00E9lemy","code":"BL","phoneCode":"+590"},{"name":"St. Helena","code":"SH","phoneCode":"+290"},{"name":"St. Kitts & Nevis","code":"KN","phoneCode":"+1"},{"name":"St. Lucia","code":"LC","phoneCode":"+1"},{"name":"St. Martin","code":"MF","phoneCode":"+590"},{"name":"St. Pierre & Miquelon","code":"PM","phoneCode":"+508"},{"name":"St. Vincent & Grenadines","code":"VC","phoneCode":"+1"},{"name":"Sudan","code":"SD","phoneCode":"+249"},{"name":"Suriname","code":"SR","phoneCode":"+597"},{"name":"Svalbard & Jan Mayen","code":"SJ","phoneCode":"+47"},{"name":"Sweden","code":"SE","phoneCode":"+46"},{"name":"Switzerland","code":"CH","phoneCode":"+41"},{"name":"Syria","code":"SY","phoneCode":"+963"},{"name":"Taiwan","code":"TW","phoneCode":"+886"},{"name":"Tajikistan","code":"TJ","phoneCode":"+992"},{"name":"Tanzania","code":"TZ","phoneCode":"+255"},{"name":"Thailand","code":"TH","phoneCode":"+66"},{"name":"Timor-Leste","code":"TL","phoneCode":"+670"},{"name":"Togo","code":"TG","phoneCode":"+228"},{"name":"Tokelau","code":"TK","phoneCode":"+690"},{"name":"Tonga","code":"TO","phoneCode":"+676"},{"name":"Trinidad & Tobago","code":"TT","phoneCode":"+1"},{"name":"Tristan da Cunha","code":"TA","phoneCode":"+290"},{"name":"Tunisia","code":"TN","phoneCode":"+216"},{"name":"T\u00FCrkiye","code":"TR","phoneCode":"+90"},{"name":"Turkmenistan","code":"TM","phoneCode":"+993"},{"name":"Turks & Caicos Islands","code":"TC","phoneCode":"+1"},{"name":"Tuvalu","code":"TV","phoneCode":"+688"},{"name":"U.S. Virgin Islands","code":"VI","phoneCode":"+1"},{"name":"Uganda","code":"UG","phoneCode":"+256"},{"name":"Ukraine","code":"UA","phoneCode":"+380"},{"name":"United Arab Emirates","code":"AE","phoneCode":"+971"},{"name":"United Kingdom","code":"GB","phoneCode":"+44"},{"name":"United States","code":"US","phoneCode":"+1"},{"name":"Uruguay","code":"UY","phoneCode":"+598"},{"name":"Uzbekistan","code":"UZ","phoneCode":"+998"},{"name":"Vanuatu","code":"VU","phoneCode":"+678"},{"name":"Vatican City","code":"VA","phoneCode":"+39"},{"name":"Venezuela","code":"VE","phoneCode":"+58"},{"name":"Vietnam","code":"VN","phoneCode":"+84"},{"name":"Wallis & Futuna","code":"WF","phoneCode":"+681"},{"name":"Western Sahara","code":"EH","phoneCode":"+212"},{"name":"Yemen","code":"YE","phoneCode":"+967"},{"name":"Zambia","code":"ZM","phoneCode":"+260"},{"name":"Zimbabwe","code":"ZW","phoneCode":"+263"}],"initialAddressFormat":{"id":0,"type":"ADDRESS","country":"US","labelLocale":"en","fields":[{"type":"FIELD","label":"Address Line 1","identifier":"Line1","length":0,"required":true,"metadata":{"autocomplete":"address-line1"}},{"type":"SEPARATOR","label":"\n","identifier":"Newline","length":0,"required":false,"metadata":{}},{"type":"FIELD","label":"Address Line 2","identifier":"Line2","length":0,"required":false,"metadata":{"autocomplete":"address-line2"}},{"type":"SEPARATOR","label":"\n","identifier":"Newline","length":0,"required":false,"metadata":{}},{"type":"FIELD","label":"City","identifier":"City","length":0,"required":true,"metadata":{"autocomplete":"address-level2"}},{"type":"SEPARATOR","label":",","identifier":"Comma","length":0,"required":false,"metadata":{}},{"type":"SEPARATOR","label":" ","identifier":"Space","length":0,"required":false,"metadata":{}},{"type":"FIELD","label":"State","identifier":"State","length":0,"required":true,"metadata":{"autocomplete":"address-level1"}},{"type":"SEPARATOR","label":" ","identifier":"Space","length":0,"required":false,"metadata":{}},{"type":"FIELD","label":"ZIP Code","identifier":"Zip","length":0,"required":true,"metadata":{"autocomplete":"postal-code"}}]}},"localizedStrings":{"validation":{"noValidSelection":"A valid selection must be made.","invalidUrl":"Must be a valid URL.","stringTooLong":"Value should have a length no longer than {0}.","containsInvalidKey":"{0} contains an invalid key.","invalidTwitterUsername":"Must be a valid Twitter username.","valueOutsideRange":"Value must be in the range {0} to {1}.","invalidPassword":"Passwords should not contain whitespace.","missingRequiredSubfields":"{0} is missing required subfields: {1}","invalidCurrency":"Currency value should be formatted like 1234 or 123.99.","invalidMapSize":"Value should contain exactly {0} elements.","subfieldsRequired":"All fields in {0} are required.","formSubmissionFailed":"Form submission failed. Review the following information: {0}.","invalidCountryCode":"Country code should have an optional plus and up to 4 digits.","invalidDate":"This is not a real date.","required":"{0} is required.","invalidStringLength":"Value should be {0} characters long.","invalidEmail":"Email addresses should follow the format user@domain.com.","invalidListLength":"Value should be {0} elements long.","allEmpty":"Please fill out at least one form field.","missingRequiredQuestion":"Missing a required question.","invalidQuestion":"Contained an invalid question.","captchaFailure":"Captcha validation failed. Please try again.","stringTooShort":"Value should have a length of at least {0}.","invalid":"{0} is not valid.","formErrors":"Form Errors","containsInvalidValue":"{0} contains an invalid value.","invalidUnsignedNumber":"Numbers must contain only digits and no other characters.","invalidName":"Valid names contain only letters, numbers, spaces, ', or - characters."},"submit":"Submit","status":{"title":"{@} Block","learnMore":"Learn more"},"name":{"firstName":"First Name","lastName":"Last Name"},"lightbox":{"openForm":"Open Form"},"likert":{"agree":"Agree","stronglyDisagree":"Strongly Disagree","disagree":"Disagree","stronglyAgree":"Strongly Agree","neutral":"Neutral"},"time":{"am":"AM","second":"Second","pm":"PM","minute":"Minute","amPm":"AM/PM","hour":"Hour"},"notFound":"Form not found.","date":{"yyyy":"YYYY","year":"Year","mm":"MM","day":"Day","month":"Month","dd":"DD"},"phone":{"country":"Country","number":"Number","prefix":"Prefix","areaCode":"Area Code","line":"Line"},"submitError":"Unable to submit form. Please try again later.","address":{"stateProvince":"State/Province","country":"Country","zipPostalCode":"Zip/Postal Code","address2":"Address 2","address1":"Address 1","city":"City"},"email":{"signUp":"Sign up for news and updates"},"required":"(required)","invalidData":"Invalid form data."}}};</script><script type="text/javascript">SQUARESPACE_ROLLUPS = {};</script>
<script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].js = ["//assets.squarespace.com/universal/scripts-compressed/visitor-site-error-reporter-976d22448e700b77-min.en-US.js"]; })(SQUARESPACE_ROLLUPS, 'squarespace-visitor_site_error_reporter');</script>
<script crossorigin="anonymous" src="//assets.squarespace.com/universal/scripts-compressed/visitor-site-error-reporter-976d22448e700b77-min.en-US.js" ></script><script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].js = ["//assets.squarespace.com/universal/scripts-compressed/extract-css-runtime-3ad6ff0326a67abc-min.en-US.js"]; })(SQUARESPACE_ROLLUPS, 'squarespace-extract_css_runtime');</script>
<script crossorigin="anonymous" src="//assets.squarespace.com/universal/scripts-compressed/extract-css-runtime-3ad6ff0326a67abc-min.en-US.js" ></script><script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].js = ["//assets.squarespace.com/universal/scripts-compressed/extract-css-moment-js-vendor-a5cfdec1ae227f33-min.en-US.js"]; })(SQUARESPACE_ROLLUPS, 'squarespace-extract_css_moment_js_vendor');</script>
<script crossorigin="anonymous" src="//assets.squarespace.com/universal/scripts-compressed/extract-css-moment-js-vendor-a5cfdec1ae227f33-min.en-US.js" ></script><script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].js = ["//assets.squarespace.com/universal/scripts-compressed/cldr-resource-pack-22bdf933fb74be0d-min.en-US.js"]; })(SQUARESPACE_ROLLUPS, 'squarespace-cldr_resource_pack');</script>
<script crossorigin="anonymous" src="//assets.squarespace.com/universal/scripts-compressed/cldr-resource-pack-22bdf933fb74be0d-min.en-US.js" ></script><script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].js = ["//assets.squarespace.com/universal/scripts-compressed/common-vendors-stable-784b947826b4c445-min.en-US.js"]; })(SQUARESPACE_ROLLUPS, 'squarespace-common_vendors_stable');</script>
<script crossorigin="anonymous" src="//assets.squarespace.com/universal/scripts-compressed/common-vendors-stable-784b947826b4c445-min.en-US.js" ></script><script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].js = ["//assets.squarespace.com/universal/scripts-compressed/common-vendors-94acdaabac92f1bf-min.en-US.js"]; })(SQUARESPACE_ROLLUPS, 'squarespace-common_vendors');</script>
<script crossorigin="anonymous" src="//assets.squarespace.com/universal/scripts-compressed/common-vendors-94acdaabac92f1bf-min.en-US.js" ></script><script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].js = ["//assets.squarespace.com/universal/scripts-compressed/common-75ed080b594d6d40-min.en-US.js"]; })(SQUARESPACE_ROLLUPS, 'squarespace-common');</script>
<script crossorigin="anonymous" src="//assets.squarespace.com/universal/scripts-compressed/common-75ed080b594d6d40-min.en-US.js" ></script><script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].js = ["//assets.squarespace.com/universal/scripts-compressed/commerce-f142029029b3802a-min.en-US.js"]; })(SQUARESPACE_ROLLUPS, 'squarespace-commerce');</script>
<script crossorigin="anonymous" src="//assets.squarespace.com/universal/scripts-compressed/commerce-f142029029b3802a-min.en-US.js" ></script><script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].css = ["//assets.squarespace.com/universal/styles-compressed/commerce-d50e5960dc9fd059-min.en-US.css"]; })(SQUARESPACE_ROLLUPS, 'squarespace-commerce');</script>
<link rel="stylesheet" type="text/css" href="//assets.squarespace.com/universal/styles-compressed/commerce-d50e5960dc9fd059-min.en-US.css"><script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].js = ["//assets.squarespace.com/universal/scripts-compressed/user-account-core-b8a639c331cc5d86-min.en-US.js"]; })(SQUARESPACE_ROLLUPS, 'squarespace-user_account_core');</script>
<script crossorigin="anonymous" src="//assets.squarespace.com/universal/scripts-compressed/user-account-core-b8a639c331cc5d86-min.en-US.js" ></script><script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].css = ["//assets.squarespace.com/universal/styles-compressed/user-account-core-433d5f055f1af432-min.en-US.css"]; })(SQUARESPACE_ROLLUPS, 'squarespace-user_account_core');</script>
<link rel="stylesheet" type="text/css" href="//assets.squarespace.com/universal/styles-compressed/user-account-core-433d5f055f1af432-min.en-US.css"><script>(function(rollups, name) { if (!rollups[name]) { rollups[name] = {}; } rollups[name].js = ["//assets.squarespace.com/universal/scripts-compressed/performance-4bff35d9d1a02d45-min.en-US.js"]; })(SQUARESPACE_ROLLUPS, 'squarespace-performance');</script>
<script crossorigin="anonymous" src="//assets.squarespace.com/universal/scripts-compressed/performance-4bff35d9d1a02d45-min.en-US.js" defer ></script><link rel="stylesheet" type="text/css" href="https://definitions.sqspcdn.com/website-component-definition/static-assets/website.components.product/7ce02c62-bacc-4d5c-bad8-07c02a87177d_1205/website.components.product.styles.css"/><link rel="stylesheet" type="text/css" href="https://definitions.sqspcdn.com/website-component-definition/static-assets/website.components.socialLinks/c72084ae-3374-4313-b635-0677b56461aa_589/website.components.socialLinks.styles.css"/><link rel="stylesheet" type="text/css" href="https://definitions.sqspcdn.com/website-component-definition/static-assets/website.components.code/d28a797c-3ae4-4700-806e-9ba44de81050_856/website.components.code.styles.css"/><link rel="stylesheet" type="text/css" href="https://definitions.sqspcdn.com/website-component-definition/static-assets/website.components.spacer/3b0b5a8a-208b-40d1-bef1-de7bfc165cc2_1134/website.components.spacer.styles.css"/><script src="https://definitions.sqspcdn.com/website-component-definition/static-assets/website.components.product/7ce02c62-bacc-4d5c-bad8-07c02a87177d_1205/website.components.product.visitor.js"></script><script src="https://definitions.sqspcdn.com/website-component-definition/static-assets/website.components.socialLinks/c72084ae-3374-4313-b635-0677b56461aa_589/website.components.socialLinks.visitor.js"></script><script src="https://definitions.sqspcdn.com/website-component-definition/static-assets/website.components.code/d28a797c-3ae4-4700-806e-9ba44de81050_856/website.components.code.visitor.js"></script><script src="https://definitions.sqspcdn.com/website-component-definition/static-assets/website.components.spacer/3b0b5a8a-208b-40d1-bef1-de7bfc165cc2_1134/website.components.spacer.visitor.js"></script><script>Squarespace.load(window);</script>
<link rel="alternate" type="application/rss+xml" title="RSS Feed" href="https://feeds.feedburner.com/bitfieldconsulting" />
<script type="application/ld+json">{"url":"https://bitfieldconsulting.com","name":"Bitfield Consulting","description":"","image":"//images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/21abedc0-3e70-4f7f-a319-7d33cc23c05d/heart-balloon-ferris+small.png","@context":"http://schema.org","@type":"WebSite"}</script><script type="application/ld+json">{"legalName":"","address":"United States","email":"hello@bitfieldconsulting.com","telephone":"+441503205247","sameAs":["https://github.com/bitfield","https://bsky.app/profile/bitfieldconsulting.bsky.social","https://www.linkedin.com/in/bitfieldconsulting/","https://www.reddit.com/r/bitfieldconsulting/"],"@context":"http://schema.org","@type":"Organization"}</script><script type="application/ld+json">{"address":"United States","image":"https://static1.squarespace.com/static/5e10bdc20efb8f0d169f85f9/t/68cbe5618326354b921ffaf9/1786267844591/","name":"","openingHours":"Mo 00:00-00:00, Tu 00:00-00:00, We 00:00-00:00, Th 00:00-00:00, Fr 00:00-00:00, , ","@context":"http://schema.org","@type":"LocalBusiness"}</script><link rel="stylesheet" type="text/css" href="https://static1.squarespace.com/static/sitecss/5e10bdc20efb8f0d169f85f9/267/54d3906fe4b04c1c9981b00e/5e10bdc20efb8f0d169f860e/4948/site.css?nocustom=true"/><link rel="stylesheet" type="text/css" href="https://static1.squarespace.com/static/custom-css/5e10bdc20efb8f0d169f85f9/5e10bdc20efb8f0d169f860e/45/custom.css"/><link rel="stylesheet" href="//cdn.jsdelivr.net/npm/hack-font@3/build/web/hack.css">
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "Bitfield Consulting",
  "url": "https://bitfieldconsulting.com",
  "logo": "https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/21abedc0-3e70-4f7f-a319-7d33cc23c05d/heart-balloon-ferris+small.png?format=1500w",
  "image": "https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/21abedc0-3e70-4f7f-a319-7d33cc23c05d/heart-balloon-ferris+small.png?format=1500w",
  "description": "Bitfield Consulting provides high-quality books, training, and consulting for Go and Rust developers.",
  "sameAs": [
    "https://github.com/bitfield",
    "https://bsky.app/profile/bitfieldconsulting.com",
    "https://www.linkedin.com/company/bitfield-consulting",
    "https://www.reddit.com/user/bitfieldconsulting"
  ],
  "founder": {
    "@type": "Person",
    "name": "John Arundel",
    "url": "https://bitfieldconsulting.com",
    "sameAs": [
      "https://github.com/bitfield",
      "https://www.linkedin.com/in/johnarundel",
      "https://bsky.app/profile/johnarundel.com"
    ]
  },
  "contactPoint": {
    "@type": "ContactPoint",
    "contactType": "customer support",
    "email": "hello@bitfieldconsulting.com"
  }
}
</script>
<meta name="color-scheme" content="only light"><meta name="robots" content="max-image-preview:large"><script>Static.COOKIE_BANNER_CAPABLE = true;</script>
<!-- End of Squarespace Headers -->
  <script>
    (function(){
      var touchTest = 'ontouchstart' in window || navigator.msMaxTouchPoints;
      if (!touchTest) {
        document.documentElement.className = document.documentElement.className.replace(/touch\-styles/g, '');
      }
    })();</script>
  </head>
  <body id="collection-5e949913434baa2223121b85" class="tweak-header-background-color-on   tweak-ui-icon-weight-medium tweak-navigation-link-spacing-small tweak-hide-right-nav-column tweak-site-branding-borders-none tweak-show-site-tagline tweak-site-branding-layout-inline tweak-show-search-in-header tweak-show-social-in-header tweak-user-account-link-position-with-nav tweak-quote-block-alignment-left tweak-blog-list-grid-alignment-top tweak-blog-list-max-width-full tweak-blog-list-grid-narrow-columns tweak-crop-images-square   tweak-show-excerpt-on-blog-list tweak-infinite-scroll  tweak-blog-text-alignment-left tweak-blog-promoted-meta-none tweak-blog-date-style-callout-circle tweak-blog-show-divider  tweak-blog-item-banner-image-width-normal  tweak-show-blog-item-author-profile-hide  tweak-template-social-icon-style-regular    event-show-past-events event-thumbnails event-thumbnail-size-11-square event-date-label event-date-label-time event-list-show-cats event-list-date event-list-time event-list-address event-list-icalgcal-links event-list-like-and-share-buttons event-icalgcal-links event-like-and-share-buttons event-excerpts event-list-cta-button event-item-back-link    gallery-design-slideshow aspect-ratio-auto lightbox-style-dark gallery-navigation-thumbnails gallery-info-overlay-always-show gallery-aspect-ratio-169-widescreen gallery-arrow-style-circular gallery-transitions-fade gallery-show-arrows gallery-auto-crop   tweak-product-list-image-aspect-ratio-23-standard-vertical tweak-product-list-item-hover-behavior-none tweak-product-list-meta-position-under tweak-product-list-mobile-meta-position-under tweak-product-list-meta-alignment-under-left tweak-product-list-meta-alignment-overlay-center-center tweak-product-list-show-title tweak-product-list-show-price tweak-product-list-filter-display-left-side tweak-product-list-filter-alignment-left tweak-product-item-nav-show-breadcrumb-and-pagination tweak-product-item-nav-pagination-style-titles tweak-product-item-nav-breadcrumb-alignment-left tweak-product-item-nav-pagination-alignment-split tweak-product-item-gallery-position-right tweak-product-item-gallery-design-stacked tweak-product-item-gallery-aspect-ratio-11-square tweak-product-item-gallery-thumbnail-alignment-left tweak-product-item-details-alignment-left tweak-product-item-details-show-title tweak-product-item-details-show-price tweak-product-item-details-show-excerpt tweak-product-item-details-excerpt-position-below-add-to-cart-button tweak-product-item-details-show-share-buttons tweak-product-item-details-show-variants tweak-product-item-details-show-quantity tweak-product-item-details-options-style-rounded tweak-product-item-details-show-add-to-cart-button tweak-product-item-details-add-to-cart-button-style-outline tweak-product-item-details-add-to-cart-button-shape-pill tweak-product-item-details-add-to-cart-button-padding-small  tweak-product-item-image-zoom-behavior-hover  tweak-related-products-image-aspect-ratio-23-standard-vertical tweak-related-products-meta-alignment-under-center tweak-product-badge-style-none tweak-product-badge-position-top-right tweak-product-badge-inset-floating newsletter-style-dark hide-opentable-icons opentable-style-dark small-button-style-outline small-button-shape-pill medium-button-style-outline medium-button-shape-pill large-button-style-outline large-button-shape-pill image-block-poster-text-alignment-center image-block-card-dynamic-font-sizing image-block-card-content-position-center image-block-card-text-alignment-left image-block-overlap-dynamic-font-sizing image-block-overlap-content-position-center image-block-overlap-text-alignment-left image-block-collage-dynamic-font-sizing image-block-collage-content-position-top image-block-collage-text-alignment-left image-block-stack-dynamic-font-sizing image-block-stack-text-alignment-left button-style-outline button-corner-style-pill tweak-product-quick-view-button-style-floating tweak-product-quick-view-button-position-bottom tweak-product-quick-view-lightbox-excerpt-display-truncate tweak-product-quick-view-lightbox-show-arrows tweak-product-quick-view-lightbox-show-close-button tweak-product-quick-view-lightbox-controls-weight-light tweak-share-buttons-style-icon-only tweak-share-buttons-icons-show  tweak-share-buttons-counts-show  tweak-share-buttons-standard-background-color native-currency-code-usd collection-5e949913434baa2223121b85 collection-type-blog collection-layout-default view-list mobile-style-available" data-controller="SyncHeader, AddScrollingClass, HeaderScroll, BodyMinHeight">
    <div class="nav-close-overlay">

    </div>
    <div class="nav-close-toggle-wrapper" id="navCloseToggleWrapper">
      <a class="nav-toggle-close-label responsive-position--left" id="navCloseToggle" data-controller="NavToggle">
        <svg class="Icon Icon--close close-icon" viewBox="0 0 18 18">
          <use xlink:href="/assets/ui-icons.svg#close-icon-line"></use>
        </svg>
      </a>
    </div>
    <div id="sideTrayWrapper" class="sidetray-wrapper">
      <div class="main-nav-wrapper responsive-padding--top responsive-padding--bottom" data-controller="NavOverflow">
        <div class="nav-blocks-wrapper">
          
<nav id="mainNavigation" class="main-navigation" role="navigation" data-content-field="navigation">
  

    
      

        
        <div class="nav-link--collection nav-link--homepage" id="id-5e10c09d08c15a57c828e0fd">
          <a href="/">
            <span>About</span>
          </a>
        </div>
        

      

    

  

    
      

        
        <div class="nav-link--collection" id="id-651954752654166c4154aac0">
          <a href="/subscribe">
            <span>Subscribe</span>
          </a>
        </div>
        

      

    

  

    
      

        
        <div class="nav-link--collection" id="id-5f4a45b12d7a7777df282846">
          <a href="/books">
            <span>Books</span>
          </a>
        </div>
        

      

    

  

    
      

        
        <div class="nav-link--collection" id="id-679b8196a4e0fa47695dc83f">
          <a href="/training">
            <span>Training</span>
          </a>
        </div>
        

      

    

  

    
      

        
        <div class="nav-link--collection nav-link--active" id="id-5e949913434baa2223121b85">
          <a href="/posts">
            <span>Blog</span>
          </a>
        </div>
        

      

    

  

    
      

        
        <div class="nav-link--collection" id="id-5e10c03562ad5d43f39b21ff">
          <a href="/contact">
            <span>Contact</span>
          </a>
        </div>
        

      

    

  
  
  <div class="nav-link--user-account user-account-link" data-controller="UserAccountsSetup">
    <a href="#">
      <span class="sign-in">Sign In</span>
      <span class="my-account">My Account</span>        
    </a>
  </div>
  
</nav>


          <div class="sqs-layout sqs-grid-1 columns-1" data-layout-label="Nav Blocks" data-type="block-field" data-updated-on="1674224338874" id="navBlocks"><div class="row sqs-row"><div class="col sqs-col-1 span-1"><div class="sqs-block website-component-block sqs-block-website-component sqs-block-socialaccountlinks social-account-links-block social-account-links-v2-block" data-block-css="[&quot;https://definitions.sqspcdn.com/website-component-definition/static-assets/website.components.socialLinks/c72084ae-3374-4313-b635-0677b56461aa_589/website.components.socialLinks.styles.css&quot;]" data-block-scripts="[&quot;https://definitions.sqspcdn.com/website-component-definition/static-assets/website.components.socialLinks/c72084ae-3374-4313-b635-0677b56461aa_589/website.components.socialLinks.visitor.js&quot;]" data-block-type="1337" data-definition-name="website.components.socialLinks" data-sqsp-block="social-links" data-website-component-id="f1b7c9170e3aa0e621d0" id="block-f1b7c9170e3aa0e621d0"><div class="sqs-block-content">
  























<div class="sqs-block-socialaccountlinks-content">
  <div class="sqs-svg-icon--outer social-icon-alignment-center social-icons-color-black social-icons-size-medium social-icons-style-regular ">
    <style>
      
      #block-f1b7c9170e3aa0e621d0 {
        --social-icons-justify-content: center;
        --social-icons-dimension: 24px;--social-icons-gap: 14px;
        
      }

      
      #block-f1b7c9170e3aa0e621d0 .sqs-svg-icon--wrapper {
        --si-border-radius: 0;--si-scale: 2;--si-box-shadow: none;--si-fill-icon: var(--si-primary);--si-fill-icon-fade: var(--si-primary-faded);--si-fill-icon-hover: var(--si-primary);--si-fill-mask: transparent;--si-fill-mask-fade: transparent;--si-fill-mask-hover: transparent;--si-bg: transparent;--si-bg-fade: transparent;--si-bg-hover: transparent;
      }

      
      #block-f1b7c9170e3aa0e621d0 .sqs-svg-icon--list {
        justify-content: var(--social-icons-justify-content, center);
        column-gap: var(--social-icons-gap, 12px);
        row-gap: var(--social-icons-gap, 12px);
      }
      #block-f1b7c9170e3aa0e621d0 .sqs-svg-icon--wrapper {
        width: var(--social-icons-dimension, 20px);
        height: var(--social-icons-dimension, 20px);
        margin: 0;
        border: none; 
        background-color: var(--si-bg, transparent);
        box-shadow: var(--si-box-shadow, none);
        border-radius: var(--si-border-radius, 0);
      }
      #block-f1b7c9170e3aa0e621d0 .sqs-svg-icon--wrapper > div {
        transform: scale(var(--si-scale, 1));
      }
      #block-f1b7c9170e3aa0e621d0 .sqs-use--icon {
        fill: var(--si-fill-icon, transparent);
      }
      #block-f1b7c9170e3aa0e621d0 .sqs-use--mask {
        fill: var(--si-fill-mask, transparent);
      }
      #block-f1b7c9170e3aa0e621d0 .sqs-svg-icon--list:hover .sqs-svg-icon--wrapper {
        background-color: var(--si-bg-fade, var(--si-bg, transparent));
      }
      #block-f1b7c9170e3aa0e621d0 .sqs-svg-icon--list:hover .sqs-svg-icon--wrapper .sqs-use--icon {
        fill: var(--si-fill-icon-fade, var(--si-fill-icon, transparent));
      }
      #block-f1b7c9170e3aa0e621d0 .sqs-svg-icon--list:hover .sqs-svg-icon--wrapper .sqs-use--mask {
        fill: var(--si-fill-mask-fade, var(--si-fill-mask, transparent));
      }
      #block-f1b7c9170e3aa0e621d0 .sqs-svg-icon--list:hover .sqs-svg-icon--wrapper:hover {
        background-color: var(--si-bg-hover, var(--si-bg, transparent));
      }
      #block-f1b7c9170e3aa0e621d0 .sqs-svg-icon--list:hover .sqs-svg-icon--wrapper:hover .sqs-use--icon {
        fill: var(--si-fill-icon-hover, var(--si-fill-icon, transparent));
      }
      #block-f1b7c9170e3aa0e621d0 .sqs-svg-icon--list:hover .sqs-svg-icon--wrapper:hover .sqs-use--mask {
        fill: var(--si-fill-mask-hover, var(--si-fill-mask, transparent));
      }
    </style>
    <nav class="sqs-svg-icon--list">
      
        
          <a
            href="https://github.com/bitfield"
            target="_blank"
            class="sqs-svg-icon--wrapper github-unauth"
            aria-label="GitHub"
          >
            <div>
              <svg class="sqs-svg-icon--social" viewBox="0 0 64 64">
                <use class="sqs-use--icon" xlink:href="/universal/svg/social-accounts.svg#github-unauth-icon"></use>
                <use class="sqs-use--mask" xlink:href="/universal/svg/social-accounts.svg#github-unauth-mask"></use>
              </svg>
            </div>
          </a>
        
      
        
          <a
            href="https://bsky.app/profile/bitfieldconsulting.bsky.social"
            target="_blank"
            class="sqs-svg-icon--wrapper bluesky-unauth"
            aria-label="Bluesky"
          >
            <div>
              <svg class="sqs-svg-icon--social" viewBox="0 0 64 64">
                <use class="sqs-use--icon" xlink:href="/universal/svg/social-accounts.svg#bluesky-unauth-icon"></use>
                <use class="sqs-use--mask" xlink:href="/universal/svg/social-accounts.svg#bluesky-unauth-mask"></use>
              </svg>
            </div>
          </a>
        
      
        
          <a
            href="https://www.linkedin.com/in/bitfieldconsulting/"
            target="_blank"
            class="sqs-svg-icon--wrapper linkedin-unauth"
            aria-label="LinkedIn"
          >
            <div>
              <svg class="sqs-svg-icon--social" viewBox="0 0 64 64">
                <use class="sqs-use--icon" xlink:href="/universal/svg/social-accounts.svg#linkedin-unauth-icon"></use>
                <use class="sqs-use--mask" xlink:href="/universal/svg/social-accounts.svg#linkedin-unauth-mask"></use>
              </svg>
            </div>
          </a>
        
      
        
          <a
            href="https://www.reddit.com/r/bitfieldconsulting/"
            target="_blank"
            class="sqs-svg-icon--wrapper reddit"
            aria-label="Reddit"
          >
            <div>
              <svg class="sqs-svg-icon--social" viewBox="0 0 64 64">
                <use class="sqs-use--icon" xlink:href="/universal/svg/social-accounts.svg#reddit-icon"></use>
                <use class="sqs-use--mask" xlink:href="/universal/svg/social-accounts.svg#reddit-mask"></use>
              </svg>
            </div>
          </a>
        
      
        
      
    </nav>
  </div>
  
    
<style id="container-styles">#block-f1b7c9170e3aa0e621d0 {
    
    
    
  }

  #block-f1b7c9170e3aa0e621d0 .sqs-block-socialaccountlinks-content {
    
    }

  #block-f1b7c9170e3aa0e621d0 {
      mix-blend-mode: var(--tweak-social-links-block-blend);
      border-radius: var(--tweak-social-links-block-radius);
  }

  
  



  
  

  
</style>

<style id="override-container-styles">
    @media screen and (max-width: 767px) {
          
            

#block-f1b7c9170e3aa0e621d0 {
            
            }
        }
    
  
    @media screen and (max-width: 767px) {
          #block-f1b7c9170e3aa0e621d0 .sqs-block-socialaccountlinks-content {
            
            }
        }
    
  @media screen and (max-width: 767px) {
          
          

          
          
          
        }</style>

    <style class="transform-overrides-vars">
  
</style>

    



  
</div>
</div></div><div class="sqs-block rss-block sqs-block-rss" data-block-type="49" id="block-yui_3_17_2_1_1579534855096_3758"><div class="sqs-block-content">



<a href="https://feeds.feedburner.com/bitfieldconsulting" title="Blog RSS" class="social-rss">Blog RSS</a>
</div></div></div></div></div>
        </div>
      </div><!--
      --><div class="sidetray-blocks responsive-padding--top responsive-padding--bottom" data-controller="SidetrayBlocksOverflow">
        <div class="sidetray-blocks-wrapper">
          <div class="sqs-layout sqs-grid-1 columns-1 empty" data-layout-label="Sidetray Blocks" data-type="block-field" data-updated-on="1579264847169" id="sideTrayBlocks"><div class="row sqs-row"><div class="col sqs-col-1 span-1"></div></div></div>
        </div>
      </div>
    </div>

    <form class="header-search-form" id="headerSearch" action="/search" method="get">
      <input class="header-search-form-input" name="q" placeholder="Search" type="text" spellcheck="false" value="" autocomplete="off">
    </form>

    
    
    <div class="mobile-social">
      <nav class="sqs-template-social-icons sqs-svg-icon--list" data-content-field="connected-accounts">
        


  <a href="https://github.com/bitfield" target="_blank" class="sqs-svg-icon--wrapper github-unauth">
    <div>
      <svg class="sqs-svg-icon--social" viewBox="0 0 64 64">
        <use class="sqs-use--icon" xlink:href="#github-unauth-icon"></use>
        <use class="sqs-use--mask" xlink:href="#github-unauth-mask"></use>
      </svg>
    </div>
  </a>

  <a href="https://bsky.app/profile/bitfieldconsulting.bsky.social" target="_blank" class="sqs-svg-icon--wrapper bluesky-unauth">
    <div>
      <svg class="sqs-svg-icon--social" viewBox="0 0 64 64">
        <use class="sqs-use--icon" xlink:href="#bluesky-unauth-icon"></use>
        <use class="sqs-use--mask" xlink:href="#bluesky-unauth-mask"></use>
      </svg>
    </div>
  </a>

  <a href="https://www.linkedin.com/in/bitfieldconsulting/" target="_blank" class="sqs-svg-icon--wrapper linkedin-unauth">
    <div>
      <svg class="sqs-svg-icon--social" viewBox="0 0 64 64">
        <use class="sqs-use--icon" xlink:href="#linkedin-unauth-icon"></use>
        <use class="sqs-use--mask" xlink:href="#linkedin-unauth-mask"></use>
      </svg>
    </div>
  </a>

  <a href="https://www.reddit.com/r/bitfieldconsulting/" target="_blank" class="sqs-svg-icon--wrapper reddit">
    <div>
      <svg class="sqs-svg-icon--social" viewBox="0 0 64 64">
        <use class="sqs-use--icon" xlink:href="#reddit-icon"></use>
        <use class="sqs-use--mask" xlink:href="#reddit-mask"></use>
      </svg>
    </div>
  </a>


      </nav>
    </div>
    
    

    <div id="site" class="site-container clearfix">

      <div class="sqs-announcement-bar-dropzone header-announcement-wrapper responsive-padding--left responsive-padding--right" id="headerAnnouncementWrapper">
        <header id="header" class="site-header loading" role="banner">
          <a class="nav-toggle-label flex-item" id="navToggle" data-controller="NavToggle">
            <svg class="Icon Icon--hamburger nav-toggle-label-icon" viewBox="0 0 26 18">
              <use xlink:href="/assets/ui-icons.svg#hamburger-icon--even"></use>
            </svg>
          </a>

          <div class="logo-wrapper flex-item">
          
            
              <div class="logo-image branding" data-content-field="site-title">
                <a href="/"><img src="//images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/21abedc0-3e70-4f7f-a319-7d33cc23c05d/heart-balloon-ferris+small.png?format=1500w" alt="Bitfield Consulting" /></a>
                <div class="site-tagline-logo">Friendly, professional Go &amp; Rust training</div>
              </div>
            
          
          </div>

          
          
           <nav class="header-special-social--shown-on-collapse sqs-template-social-icons sqs-svg-icon--list">
             


  <a href="https://github.com/bitfield" target="_blank" class="sqs-svg-icon--wrapper github-unauth">
    <div>
      <svg class="sqs-svg-icon--social" viewBox="0 0 64 64">
        <use class="sqs-use--icon" xlink:href="#github-unauth-icon"></use>
        <use class="sqs-use--mask" xlink:href="#github-unauth-mask"></use>
      </svg>
    </div>
  </a>

  <a href="https://bsky.app/profile/bitfieldconsulting.bsky.social" target="_blank" class="sqs-svg-icon--wrapper bluesky-unauth">
    <div>
      <svg class="sqs-svg-icon--social" viewBox="0 0 64 64">
        <use class="sqs-use--icon" xlink:href="#bluesky-unauth-icon"></use>
        <use class="sqs-use--mask" xlink:href="#bluesky-unauth-mask"></use>
      </svg>
    </div>
  </a>

  <a href="https://www.linkedin.com/in/bitfieldconsulting/" target="_blank" class="sqs-svg-icon--wrapper linkedin-unauth">
    <div>
      <svg class="sqs-svg-icon--social" viewBox="0 0 64 64">
        <use class="sqs-use--icon" xlink:href="#linkedin-unauth-icon"></use>
        <use class="sqs-use--mask" xlink:href="#linkedin-unauth-mask"></use>
      </svg>
    </div>
  </a>

  <a href="https://www.reddit.com/r/bitfieldconsulting/" target="_blank" class="sqs-svg-icon--wrapper reddit">
    <div>
      <svg class="sqs-svg-icon--social" viewBox="0 0 64 64">
        <use class="sqs-use--icon" xlink:href="#reddit-icon"></use>
        <use class="sqs-use--mask" xlink:href="#reddit-mask"></use>
      </svg>
    </div>
  </a>


           </nav>
          
          

          <div class="header-special flex-item">
            <div class="social-search-wrapper cart-visible">
              <div class="social-ellipsis" id="socialEllipsis" data-controller="SocialToggle">
                <svg class="ellipsis-icon" viewBox="0 0 100 24">
                  <use xlink:href="/assets/ui-icons.svg#ellipsis-icon"></use>
                </svg>
                <svg class="social-close-icon Icon Icon--close" viewBox="0 0 18 18">
                  <use xlink:href="/assets/ui-icons.svg#close-icon-line"></use>
                </svg>
              </div><!--
               
               
                --><nav class="header-special-social sqs-template-social-icons sqs-svg-icon--list" data-content-field="connected-accounts">
                  


  <a href="https://github.com/bitfield" target="_blank" class="sqs-svg-icon--wrapper github-unauth">
    <div>
      <svg class="sqs-svg-icon--social" viewBox="0 0 64 64">
        <use class="sqs-use--icon" xlink:href="#github-unauth-icon"></use>
        <use class="sqs-use--mask" xlink:href="#github-unauth-mask"></use>
      </svg>
    </div>
  </a>

  <a href="https://bsky.app/profile/bitfieldconsulting.bsky.social" target="_blank" class="sqs-svg-icon--wrapper bluesky-unauth">
    <div>
      <svg class="sqs-svg-icon--social" viewBox="0 0 64 64">
        <use class="sqs-use--icon" xlink:href="#bluesky-unauth-icon"></use>
        <use class="sqs-use--mask" xlink:href="#bluesky-unauth-mask"></use>
      </svg>
    </div>
  </a>

  <a href="https://www.linkedin.com/in/bitfieldconsulting/" target="_blank" class="sqs-svg-icon--wrapper linkedin-unauth">
    <div>
      <svg class="sqs-svg-icon--social" viewBox="0 0 64 64">
        <use class="sqs-use--icon" xlink:href="#linkedin-unauth-icon"></use>
        <use class="sqs-use--mask" xlink:href="#linkedin-unauth-mask"></use>
      </svg>
    </div>
  </a>

  <a href="https://www.reddit.com/r/bitfieldconsulting/" target="_blank" class="sqs-svg-icon--wrapper reddit">
    <div>
      <svg class="sqs-svg-icon--social" viewBox="0 0 64 64">
        <use class="sqs-use--icon" xlink:href="#reddit-icon"></use>
        <use class="sqs-use--mask" xlink:href="#reddit-mask"></use>
      </svg>
    </div>
  </a>


                </nav><!--
               
               
             --><a href="/search" rel="search" class="header-search" data-controller="SearchToggle">
                <svg class="Icon Icon--search search-icon" viewBox="0 0 20 20" shape-rendering="geometricPrecision">
                  <use xlink:href="/assets/ui-icons.svg#search-icon"></use>
                </svg>
                <svg class="Icon Icon--close search-close-icon" viewBox="0 0 18 18">
                  <use xlink:href="/assets/ui-icons.svg#close-icon-line"></use>
                </svg>
               </a>
              </div><!--
              --><div class="user-account-link user-account-link--icon" data-controller="UserAccountsSetup">
                <a href="#">
                  <svg class="Icon Icon--user-accounts user-account-icon" viewBox="0 0 28 28">
                    <use class="use--odd" xlink:href="/assets/ui-icons.svg#accounts-icon--odd"></use>
                    <use class="use--even" xlink:href="/assets/ui-icons.svg#accounts-icon--even"></use>
                  </svg>
                </a>
              </div><!--
              --><a href="/cart" class="sqs-custom-cart custom-cart">
              <div class="custom-cart-bag">
                <svg class="Icon Icon--bag custom-cart-bag-icon" viewBox="0 0 34 38">
                  <use class="use--odd" xlink:href="/assets/ui-icons.svg#bag-icon--odd"></use>
                  <use class="use--even" xlink:href="/assets/ui-icons.svg#bag-icon--even"></use>
                </svg>
                <span class="sqs-cart-quantity">0</span>
              </div>
            </a>
          </div>
        </header>
      </div>

      <main id="page" class="site-page loading responsive-padding--left responsive-padding--right site-page--blog-list" role="main" data-content-field="main-content" data-controller="FadeInContent">

        <div class="loading-spinner"></div>
  <div class="blog-list blog-wrapper" id="blogList" data-controller="BlogLayout"><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-go tag-golang tag-tdd tag-slicesissorted tag-testing tag-slice tag-tparallel tag-trun tag-subtest tag-gotestdox tag-be-a-better-engineer tag-ai author-john-arundel post-type-text article-index-1" id="article-692f23c2ed169c1764c32ae9" label="Blog Post" data-item-id="692f23c2ed169c1764c32ae9" data-offset="1785856200057">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/code-like-pirate" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1767528843255-XLHGPUXW7VB5AYXDQ64G/lego-pirates+square.webp" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1767528843255-XLHGPUXW7VB5AYXDQ64G/lego-pirates+square.webp" data-image-dimensions="674x674" data-image-focal-point="0.5,0.5" alt="Code like a pirate with AI"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2026-08-04" pubdate>
          <div class="date-wrapper">
            <span class="month">Aug </span><span class="day"> 4</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/code-like-pirate" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2026-08-04" pubdate>Aug  4 </time>
            Code like a pirate with AI
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p style="white-space:pre-wrap;" data-rte-preserve-empty="true">Will AI coding agents pirate all our jobs? Not if we take back control, using my six-step PIRATE workflow for shipboard discipline.</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-master-of-your-domain tag-marketing tag-be-a-better-engineer author-john-arundel post-type-text article-index-2" id="article-6a1db97884c4507036c84b48" label="Blog Post" data-item-id="6a1db97884c4507036c84b48" data-offset="1783936200401">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/castle-building" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1780334476233-0IEDX4RRLDJJPNYJ63QJ/castle-square.webp" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1780334476233-0IEDX4RRLDJJPNYJ63QJ/castle-square.webp" data-image-dimensions="1008x1008" data-image-focal-point="0.5,0.5" alt="Castle building for beginners: marketing yourself"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2026-07-13" pubdate>
          <div class="date-wrapper">
            <span class="month">Jul </span><span class="day">13</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/castle-building" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2026-07-13" pubdate>Jul 13 </time>
            Castle building for beginners: marketing yourself
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p style="white-space:pre-wrap;" data-rte-preserve-empty="true">Marketing doesn’t come naturally to most engineers, but it’s more essential than ever. Here’s lesson 1.</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-rust tag-ai tag-migration author-john-arundel post-type-text article-index-3" id="article-69d7b796110d74441ee59466" label="Blog Post" data-item-id="69d7b796110d74441ee59466" data-offset="1782199680303">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/rewrite-in-rust" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1779294650695-VIOA7IGRWYSVYCWY5MBF/rewrite-rust-square.webp" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1779294650695-VIOA7IGRWYSVYCWY5MBF/rewrite-rust-square.webp" data-image-dimensions="1024x1024" data-image-focal-point="0.5,0.5" alt="Rewriting the world in Rust"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2026-06-23" pubdate>
          <div class="date-wrapper">
            <span class="month">Jun </span><span class="day">23</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/rewrite-in-rust" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2026-06-23" pubdate>Jun 23 </time>
            Rewriting the world in Rust
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p style="white-space:pre-wrap;" data-rte-preserve-empty="true">The world runs on legacy code—hundreds of millions of lines of it. Can we rewrite it all in Rust? And is that even a good idea?</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-go tag-golang tag-goland tag-nil tag-pointers tag-snippet tag-template tag-refactoring tag-debugging tag-ai author-john-arundel post-type-text article-index-4" id="article-690dfbcb41d68839dc00fcdb" label="Blog Post" data-item-id="690dfbcb41d68839dc00fcdb" data-offset="1780146060438">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/power-of-goland" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1762524341642-U4B3SSTS8YNX1OGCR0DS/power-of-goland+square.webp" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1762524341642-U4B3SSTS8YNX1OGCR0DS/power-of-goland+square.webp" data-image-dimensions="720x720" data-image-focal-point="0.5,0.5" alt="The power of GoLand: 10 hidden spells"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2026-05-30" pubdate>
          <div class="date-wrapper">
            <span class="month">May </span><span class="day">30</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/power-of-goland" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2026-05-30" pubdate>May 30 </time>
            The power of GoLand: 10 hidden spells
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p style="white-space:pre-wrap;" data-rte-preserve-empty="true">Modern IDEs like GoLand are more than just a text editor: they’re packed with power coding features that can turn you into a software superhero.</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-rust tag-the-secrets-of-rust-tools tag-mocking tag-dependency-injection tag-mustuse tag-bebugging tag-httpmock author-john-arundel post-type-text article-index-5" id="article-685e7b4a4c51632dea3f3650" label="Blog Post" data-item-id="685e7b4a4c51632dea3f3650" data-offset="1778407560374">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/sun-keeps-shinin" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1764415659285-G9ZNSUUQ80X19FZW6EKR/umbrella-square.jpg" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1764415659285-G9ZNSUUQ80X19FZW6EKR/umbrella-square.jpg" data-image-dimensions="797x797" data-image-focal-point="0.5,0.5" alt="Where the sun keeps shinin': the provider pattern in Rust"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2026-05-10" pubdate>
          <div class="date-wrapper">
            <span class="month">May </span><span class="day">10</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/sun-keeps-shinin" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2026-05-10" pubdate>May 10 </time>
            Where the sun keeps shinin': the provider pattern in Rust
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p style="white-space:pre-wrap;" data-rte-preserve-empty="true">Let’s add a provider abstraction to brighten up our Rust weather client’s API.</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-go tag-golang tag-the-deeper-love-of-go tag-goroutine tag-concurrency tag-mutex tag-syncmutex tag-data-race tag-lock tag-race-detector author-john-arundel post-type-text article-index-6" id="article-68bd6a6e7389475758ca5824" label="Blog Post" data-item-id="68bd6a6e7389475758ca5824" data-offset="1777198800829">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/sync-mutex" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1757244217219-X647RAQ7VMX2NRFENJ7Z/gopher-obtain-token+square.png" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1757244217219-X647RAQ7VMX2NRFENJ7Z/gopher-obtain-token+square.png" data-image-dimensions="835x835" data-image-focal-point="0.5,0.5" alt="It's a lock: sync.Mutex in Go"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2026-04-26" pubdate>
          <div class="date-wrapper">
            <span class="month">Apr </span><span class="day">26</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/sync-mutex" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2026-04-26" pubdate>Apr 26 </time>
            It's a lock: sync.Mutex in Go
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p style="white-space:pre-wrap;" data-rte-preserve-empty="true">When two goroutines go to war, a data race is all that you can score. To prevent that, Go’s sync.Mutex type can help.</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-rust tag-romance author-john-arundel post-type-text article-index-7" id="article-69b4123c88b82536671a27fc" label="Blog Post" data-item-id="69b4123c88b82536671a27fc" data-offset="1775032380352">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/zero-cost-to-love" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1773409609048-RWB3XICXUGSQKUIZG2BA/Zero+Cost+to+Love.jpg" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1773409609048-RWB3XICXUGSQKUIZG2BA/Zero+Cost+to+Love.jpg" data-image-dimensions="1024x1024" data-image-focal-point="0.5,0.5" alt="Zero Cost to Love"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2026-04-01" pubdate>
          <div class="date-wrapper">
            <span class="month">Apr </span><span class="day"> 1</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/zero-cost-to-love" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2026-04-01" pubdate>Apr  1 </time>
            Zero Cost to Love
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p style="white-space:pre-wrap;" data-rte-preserve-empty="true">She’s an internationally famous high-performance computing architect. He’s a rumpled, handsome, yet socially awkward basement coder. They fall in love—<em>blazing fast</em>.</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-consultancy tag-master-of-your-domain tag-be-a-better-engineer author-john-arundel post-type-text article-index-8" id="article-68ee7df0d014624344c38c91" label="Blog Post" data-item-id="68ee7df0d014624344c38c91" data-offset="1774889040386">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/batman-trap" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1760460305764-6LXN3Z0OL7IHY8MOXQG6/bat-signal-square.jpg" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1760460305764-6LXN3Z0OL7IHY8MOXQG6/bat-signal-square.jpg" data-image-dimensions="445x356" data-image-focal-point="0.5,0.5" alt="The Batman trap: when helping isn't helping"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2026-03-30" pubdate>
          <div class="date-wrapper">
            <span class="month">Mar </span><span class="day">30</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/batman-trap" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2026-03-30" pubdate>Mar 30 </time>
            The Batman trap: when helping isn't helping
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p style="white-space:pre-wrap;" data-rte-preserve-empty="true">What does a consultant actually do? Sometimes the right answer, surprisingly, is “nothing”.</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-rust tag-espaol author-john-arundel post-type-text article-index-9" id="article-69becff2fed5585eafd7984f" label="Blog Post" data-item-id="69becff2fed5585eafd7984f" data-offset="1774112749251">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/aprende-rust" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1774113397975-PTJ50EAZPJ2HP0BALTDM/ferris-aprende-rust-square.webp" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1774113397975-PTJ50EAZPJ2HP0BALTDM/ferris-aprende-rust-square.webp" data-image-dimensions="1056x1056" data-image-focal-point="0.5,0.5" alt="Aprende Rust: recursos en español"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2026-03-21" pubdate>
          <div class="date-wrapper">
            <span class="month">Mar </span><span class="day">21</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/aprende-rust" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2026-03-21" pubdate>Mar 21 </time>
            Aprende Rust: recursos en español
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p style="white-space:pre-wrap;" data-rte-preserve-empty="true">Enlaces y recursos en español para aprender el lenguaje de programación Rust.</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-rust tag-zed tag-wispr-flow tag-nushell tag-chatgpt tag-pixelmator-pro tag-brave tag-omnifocus tag-be-a-better-engineer author-john-arundel post-type-text article-index-10" id="article-69a2ecd2ac244302cf167b6c" label="Blog Post" data-item-id="69a2ecd2ac244302cf167b6c" data-offset="1773143580614">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/rust-dev-tools" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1772288050292-MMMM7O75P28X4Y9MK2X8/hero-square.webp" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1772288050292-MMMM7O75P28X4Y9MK2X8/hero-square.webp" data-image-dimensions="1024x1024" data-image-focal-point="0.5,0.5" alt="My Rust dev setup in 2026"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2026-03-10" pubdate>
          <div class="date-wrapper">
            <span class="month">Mar </span><span class="day">10</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/rust-dev-tools" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2026-03-10" pubdate>Mar 10 </time>
            My Rust dev setup in 2026
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p style="white-space:pre-wrap;" data-rte-preserve-empty="true">You don’t need many tools to write Rust—just a decent editor, and maybe an AI assistant or two. Here’s my Rust dev setup in 2026.</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-go tag-golang tag-packages tag-testing tag-test-coverage tag-readability tag-values tag-configuration tag-struct tag-constants tag-iota tag-osopenroot tag-errors tag-error-wrapping tag-errorsnew tag-fmterrorf tag-errorsis tag-concurrency tag-goroutine tag-data-race tag-mutex tag-syncmutex tag-httpdefaultservemux tag-httpnewservemux tag-httpdefaultclient tag-channels tag-context tag-waitgroup tag-errgroup tag-syncwaitgroup tag-errgroupgroup tag-osgetenv tag-osargs tag-environment tag-embed tag-xdg tag-garbage-collection tag-stack-trace tag-logging tag-slog tag-tracing tag-metrics tag-walking-skeleton tag-shameless-green author-john-arundel post-type-text article-index-11" id="article-690e0254175d027594095d2b" label="Blog Post" data-item-id="690e0254175d027594095d2b" data-offset="1771327440251">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/go-right-way" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1762526051860-VHHVWLPOXW5PBJ37GU8J/10x-commandments-square.webp" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1762526051860-VHHVWLPOXW5PBJ37GU8J/10x-commandments-square.webp" data-image-dimensions="686x686" data-image-focal-point="0.5,0.5" alt="Go the right way: the Zen of Go coding"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2026-02-17" pubdate>
          <div class="date-wrapper">
            <span class="month">Feb </span><span class="day">17</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/go-right-way" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2026-02-17" pubdate>Feb 17 </time>
            Go the right way: the Zen of Go coding
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p style="white-space:pre-wrap;" data-rte-preserve-empty="true">I finally found the one serene, omnicompetent guru who writes perfect code! Here are her ten secret mantras of Go excellence.</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-rust tag-go tag-golang tag-espaol author-john-arundel post-type-text article-index-12" id="article-6991c04d12159d6f2f48b758" label="Blog Post" data-item-id="6991c04d12159d6f2f48b758" data-offset="1771162200054">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/rust-vs-go-es" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1771159739421-JO0YM9RN8J76Y36TZMJD/rust-vs-go.webp" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1771159739421-JO0YM9RN8J76Y36TZMJD/rust-vs-go.webp" data-image-dimensions="1091x513" data-image-focal-point="0.5,0.5" alt="Rust vs Go: ¿cuál elegir?"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2026-02-15" pubdate>
          <div class="date-wrapper">
            <span class="month">Feb </span><span class="day">15</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/rust-vs-go-es" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2026-02-15" pubdate>Feb 15 </time>
            Rust vs Go: ¿cuál elegir?
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p style="white-space:pre-wrap;" data-rte-preserve-empty="true">Un resumen de Rust y Go que destaca sus ventajas, señala lo que comparten y aclara sus diferencias clave. ¿Cuál deberías elegir?</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-golang tag-go tag-rust tag-memory-safety tag-performance tag-simplicity tag-concurrency tag-scale author-john-arundel post-type-text article-index-13 featured" id="article-5fa52db75dfc746ea899bfdc" label="Blog Post" data-item-id="5fa52db75dfc746ea899bfdc" data-offset="1770800640902">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/rust-vs-go" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1631444995097-A7JOBWN2X0IMO7EO2QYW/rust-vs-go-square.png" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1631444995097-A7JOBWN2X0IMO7EO2QYW/rust-vs-go-square.png" data-image-dimensions="1091x1091" data-image-focal-point="0.5,0.5" alt="Rust vs Go"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2026-02-11" pubdate>
          <div class="date-wrapper">
            <span class="month">Feb </span><span class="day">11</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/rust-vs-go" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2026-02-11" pubdate>Feb 11 </time>
            Rust vs Go
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p class="">Which is a better choice, Rust or Go? Which language should you choose for your next project, and why? How do the two compare in areas like performance, simplicity, safety, features, scale, and concurrency?</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-rust author-john-arundel-cady-galleta post-type-text article-index-14" id="article-697260c8a6e5fa00836f10fc" label="Blog Post" data-item-id="697260c8a6e5fa00836f10fc" data-offset="1769949960972">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/why-rust" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1769949888053-JQE3X14Y3B4JN89RH0CJ/worth-your-time.webp" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1769949888053-JQE3X14Y3B4JN89RH0CJ/worth-your-time.webp" data-image-dimensions="800x655" data-image-focal-point="0.5,0.5" alt="What's so great about Rust?"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2026-02-01" pubdate>
          <div class="date-wrapper">
            <span class="month">Feb </span><span class="day"> 1</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/why-rust" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2026-02-01" pubdate>Feb  1 </time>
            What's so great about Rust?
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=6979eaaaecf4825398461075" class="blog-author-name">John Arundel, Cady Galleta</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p style="white-space:pre-wrap;" data-rte-preserve-empty="true">If you’ve heard about Rust and you’re wondering about the facts behind the hype, this is for you: no sales pitch, just a clear, point-by-point outline of why Rust is worth considering.</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-consultancy tag-master-of-your-domain tag-be-a-better-engineer author-john-arundel post-type-text article-index-15" id="article-68ac7cf6b3f7b33f7b361d7d" label="Blog Post" data-item-id="68ac7cf6b3f7b33f7b361d7d" data-offset="1768909560097">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/secret-consultant" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1768913744467-1KJR4AALZUEG7E7WNJF0/woman-eye-square.jpg" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1768913744467-1KJR4AALZUEG7E7WNJF0/woman-eye-square.jpg" data-image-dimensions="753x753" data-image-focal-point="0.5,0.5" alt="The secret consultant: your first steps to independence"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2026-01-20" pubdate>
          <div class="date-wrapper">
            <span class="month">Jan </span><span class="day">20</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/secret-consultant" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2026-01-20" pubdate>Jan 20 </time>
            The secret consultant: your first steps to independence
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p style="white-space:pre-wrap;" data-rte-preserve-empty="true">At work, nobody need know you’re a secret consultant. As well as preparing you to run your own business someday, it might also make you a better employee.</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-rust tag-books tag-the-rust-programming-language tag-effective-rust tag-rust-for-rustaceans tag-programming-rust tag-rust-in-action tag-zero-to-production-in-rust tag-the-secrets-of-rust-tools author-john-arundel post-type-text article-index-16 featured" id="article-6688212a33b85e6f7dfbacd8" label="Blog Post" data-item-id="6688212a33b85e6f7dfbacd8" data-offset="1767695760328">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/best-rust-books" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1781955099823-QHVYWEX6JQNYY92P4YNR/reading.webp" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1781955099823-QHVYWEX6JQNYY92P4YNR/reading.webp" data-image-dimensions="540x540" data-image-focal-point="0.5,0.5" alt="The best Rust books for 2026, reviewed"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2026-01-06" pubdate>
          <div class="date-wrapper">
            <span class="month">Jan </span><span class="day"> 6</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/best-rust-books" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2026-01-06" pubdate>Jan  6 </time>
            The best Rust books for 2026, reviewed
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p>There are many Rust books, but these are my favourites—and I think you’ll like them too. Here are my reviews of what I think are the truly essential Rust books available today.</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-go tag-goroutine tag-concurrency tag-data-race tag-scheduler tag-timesleep tag-the-deeper-love-of-go tag-golang author-john-arundel post-type-text article-index-17" id="article-687e5e61ca76ff34f6dd5f03" label="Blog Post" data-item-id="687e5e61ca76ff34f6dd5f03" data-offset="1767612900771">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/racing-with-disaster" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1752075724146-IRZV0WGXJ055H5E2BWUG/racing-gophers+square.png" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1752075724146-IRZV0WGXJ055H5E2BWUG/racing-gophers+square.png" data-image-dimensions="599x599" data-image-focal-point="0.5,0.5" alt="Racing with disaster: data races in Go"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2026-01-05" pubdate>
          <div class="date-wrapper">
            <span class="month">Jan </span><span class="day"> 5</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/racing-with-disaster" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2026-01-05" pubdate>Jan  5 </time>
            Racing with disaster: data races in Go
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p style="white-space:pre-wrap;" data-rte-preserve-empty="true">Writing concurrent programs is easy, but understanding why they don’t work is hard. In this post, we’ll talk about data races, why they’re a problem, and how they arise in Go programs.</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-go tag-books tag-the-deeper-love-of-go tag-the-power-of-go-tools tag-know-go tag-the-power-of-go-tests tag-concurrency tag-golang tag-learning-go tag-jon-bodner tag-concurrency-in-go tag-know-go tag-generics tag-the-go-programming-language tag-lets-go tag-review author-john-arundel post-type-text article-index-18 featured" id="article-61d09404c554b6648a363309" label="Blog Post" data-item-id="61d09404c554b6648a363309" data-offset="1767548880416">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/best-go-books" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1641059684014-AL14YQXUONRLJW67G0RL/books.png" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1641059684014-AL14YQXUONRLJW67G0RL/books.png" data-image-dimensions="360x360" data-image-focal-point="0.5,0.5" alt="What are the best Go books in 2026?"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2026-01-04" pubdate>
          <div class="date-wrapper">
            <span class="month">Jan </span><span class="day"> 4</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/best-go-books" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2026-01-04" pubdate>Jan  4 </time>
            What are the best Go books in 2026?
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p class="" style="white-space:pre-wrap;" data-rte-preserve-empty="true">What are the best Go books this year? Read my (relatively) unbiased recommendations for the Go books you should absolutely buy and read right now, whether you’re a beginner or expert Gopher.</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-rust tag-the-secrets-of-rust-tools tag-mock tag-httpmock tag-testing tag-mocking tag-http tag-api tag-reqwest author-john-arundel post-type-text article-index-19" id="article-68443eca69bb8104cfa3abc3" label="Blog Post" data-item-id="68443eca69bb8104cfa3abc3" data-offset="1766406540263">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/mockingbird-wont-sing" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1749303039995-XW8U1TWS1WS53SUCUO42/arturo-alvarez-a7QF-vYWQ0A-unsplash+square.jpg" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/1749303039995-XW8U1TWS1WS53SUCUO42/arturo-alvarez-a7QF-vYWQ0A-unsplash+square.jpg" data-image-dimensions="2473x2473" data-image-focal-point="0.5,0.5" alt="That mockingbird won't sing: a mock API server in Rust"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2025-12-22" pubdate>
          <div class="date-wrapper">
            <span class="month">Dec </span><span class="day">22</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/mockingbird-wont-sing" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2025-12-22" pubdate>Dec 22 </time>
            That mockingbird won't sing: a mock API server in Rust
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p style="white-space:pre-wrap;" data-rte-preserve-empty="true">Faking it till you make it isn’t always the best strategy in life, but it can be a useful one in software engineering. Here’s an easy way to create a local HTTP server for testing Rust API clients.</p></div>
        
      </div>
    </div>
  </article><article class="entry entry--list h-entry grid-hidden  has-main-image hentry tag-cryptography tag-cryptocurrency tag-blockchain tag-hash tag-go tag-explore-go-cryptography tag-digest tag-bitcoin tag-golang author-john-arundel post-type-text article-index-20" id="article-67e7fdec99ff6a3a470b52f3" label="Blog Post" data-item-id="67e7fdec99ff6a3a470b52f3" data-offset="1765191840575">
    <div class="thumbnail-title-wrapper">
      
      <div class="excerpt-thumb">
        <a href="/posts/when-doomed-stubs-attack" class="excerpt-image content-fill">
          <img data-src="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/485fd41f-da17-480c-8a1b-24f90a75960a/treasure.png" data-image="https://images.squarespace-cdn.com/content/v1/5e10bdc20efb8f0d169f85f9/485fd41f-da17-480c-8a1b-24f90a75960a/treasure.png" data-image-dimensions="400x366" data-image-focal-point="0.5,0.5" alt="When doomed stubs attack: blockchain voting and proof of work"  data-load="false" />
          <div class="thumb-overlay"></div>
        </a>
      </div>
      
    </div>

    <div class="entry-text">
      
      <header class="entry-header">
        <time class="dt-published date-callout" datetime="2025-12-08" pubdate>
          <div class="date-wrapper">
            <span class="month">Dec </span><span class="day"> 8</span>
          </div>
        </time>
        <h2 class="entry-title entry-title--list p-name" itemprop="headline" data-content-field="title" >
          
          <a href="/posts/when-doomed-stubs-attack" class="u-url" rel="bookmark">
          
            <time class="dt-published date-highlight" datetime="2025-12-08" pubdate>Dec  8 </time>
            When doomed stubs attack: blockchain voting and proof of work
          </a>
        </h2>
      </header>
      

      <div class="entry-content">
        <div class="blog-meta-item blog-meta-author"><a href="/posts?author=5e10bdc11264f20181591485" class="blog-author-name">John Arundel</a> </div>

        

        
          <div class="entry-excerpt p-summary"><p style="white-space:pre-wrap;" data-rte-preserve-empty="true">If cryptocurrencies aren’t managed by any central authority, what’s to stop anyone just printing themselves some money and spending it on pizza? The answer, excitingly, is “math”.</p></div>
        
      </div>
    </div>
  </article>

</div>

<div class="load-more-wrapper"><a class="load-more" href="/posts?offset=1765191840575">Load More</a></div>

<div class="breaker"></div>

      </main>

      <footer id="footer" class="site-footer responsive-margin--top responsive-padding--left responsive-padding--right responsive-padding--top responsive-padding--bottom" role="contentinfo">
        <div class="sqs-layout sqs-grid-12 columns-12" data-layout-label="Footer Content" data-type="block-field" data-updated-on="1781865643629" id="footerBlocks"><div class="row sqs-row"><div class="col sqs-col-12 span-12"><div class="sqs-block website-component-block sqs-block-website-component sqs-block-code code-block" data-block-css="[&quot;https://definitions.sqspcdn.com/website-component-definition/static-assets/website.components.code/d28a797c-3ae4-4700-806e-9ba44de81050_856/website.components.code.styles.css&quot;]" data-block-scripts="[&quot;https://definitions.sqspcdn.com/website-component-definition/static-assets/website.components.code/d28a797c-3ae4-4700-806e-9ba44de81050_856/website.components.code.visitor.js&quot;]" data-block-type="1337" data-definition-name="website.components.code" data-sqsp-block="code" data-website-component-id="yui_3_17_2_1_1696758897266_61679" id="block-yui_3_17_2_1_1696758897266_61679"><div class="sqs-block-content">
  

<div
  class="sqs-code-container"
  
  
    data-localized="{&quot;enableSafeModeButton&quot;:&quot;Preview in safe mode&quot;,&quot;enableSafeModeText&quot;:&quot;This block contains embedded scripts. Embedded scripts are disabled while you're logged in and editing your site.&quot;,&quot;enableSafeModeTitle&quot;:&quot;Embedded Scripts&quot;,&quot;exitSafeModeButton&quot;:&quot;Exit safe preview&quot;,&quot;exitSafeModeText&quot;:&quot;Please view the page after logging out for accurate rendering.&quot;,&quot;exitSafeModeTitle&quot;:&quot;Safe Preview&quot;,&quot;globalSafeMode&quot;:&quot;Embedded Code: This block contains embedded code that has been disabled.&quot;,&quot;scriptDisabled&quot;:&quot;Script Disabled&quot;}"
  
  
  
  
>
  
    <div align="center"><script async src="https://eomail4.com/form/41ce54bc-5695-11f1-87e5-97f9994238d7.js" data-form="41ce54bc-5695-11f1-87e5-97f9994238d7"></script></div>
  
  



</div>

<style class="transform-overrides-vars">
  
</style>

</div></div></div></div></div>
        <div id="footerNavWrapper" class="nav-wrapper footer-nav">
          

        </div>
      </footer>

    </div>

    <div id="mobileBar" class="mobile-bar mobile-bar--has-cart mobile-bar--user-account-active" data-controller="MobileOffset">
      <a class="nav-toggle-label nav-toggle-label--mobile flex-item" id="navToggleMobile" data-controller="NavToggle">
        <svg class="Icon Icon--hamburger nav-toggle-label-icon" viewBox="0 0 26 18">
          <use class="use--odd" xlink:href="/assets/ui-icons.svg#hamburger-icon--odd"></use>
          <use class="use--even" xlink:href="/assets/ui-icons.svg#hamburger-icon--even"></use>
        </svg>
      </a><!--
      --><div class="social-ellipsis social-ellipsis--mobile flex-item" id="socialEllipsisMobile" data-controller="SocialToggle">
        <svg class="ellipsis-icon" viewBox="0 0 25 6">
          <use xlink:href="/assets/ui-icons.svg#ellipsis-icon"></use>
        </svg>
        <svg class="Icon Icon--close social-close-icon" viewBox="0 0 18 18">
          <use xlink:href="/assets/ui-icons.svg#close-icon-line"></use>
        </svg>
      </div><!--
      --><div class="search-cart--mobile flex-item">
        <a href="/search" rel="search" class="header-search header-search--mobile" data-controller="SearchToggle">
          <svg class="Icon Icon--search search-icon" viewBox="0 0 20 20">
            <use xlink:href="/assets/ui-icons.svg#search-icon"></use>
          </svg>
          <svg class="Icon Icon--close search-close-icon" viewBox="0 0 18 18">
            <use xlink:href="/assets/ui-icons.svg#close-icon-line"></use>
          </svg>
        </a>
        
        <div class="user-account-link user-account-link--icon user-account-link--mobile" data-controller="UserAccountsSetup">
          <a href="#">
            <svg class="Icon Icon--user-accounts user-account-icon" viewBox="0 0 28 28">
              <use class="use--odd" xlink:href="/assets/ui-icons.svg#accounts-icon--odd"></use>
              <use class="use--even" xlink:href="/assets/ui-icons.svg#accounts-icon--even"></use>
            </svg>
          </a>
        </div>
        
        <a href="/cart" class="sqs-custom-cart custom-cart mobile-cart">
          <div class="custom-cart-bag">
            <svg class="Icon Icon--bag custom-cart-bag-icon" viewBox="0 0 34 38">
              <use class="use--odd" xlink:href="/assets/ui-icons.svg#bag-icon--odd"></use>
              <use class="use--even" xlink:href="/assets/ui-icons.svg#bag-icon--even"></use>
            </svg>
            <span class="sqs-cart-quantity">0</span>
          </div>
        </a>
      </div><!--
      -->
    </div>

    <script src="https://static1.squarespace.com/static/ta/54d39057e4b01a0da310c80f/4948/scripts/site-bundle.js" type="text/javascript"></script>
    <script data-sqs-type="imageloader-bootstrapper">if(window.ImageLoader) window.ImageLoader.bootstrap({}, document);</script><script>Squarespace.afterBodyLoad(Y);</script><svg xmlns="http://www.w3.org/2000/svg" version="1.1" style="display:none" data-usage="social-icons-svg"><symbol id="github-unauth-icon" viewBox="0 0 64 64"><path d="M32,16c-8.8,0-16,7.2-16,16c0,7.1,4.6,13.1,10.9,15.2 c0.8,0.1,1.1-0.3,1.1-0.8c0-0.4,0-1.4,0-2.7c-4.5,1-5.4-2.1-5.4-2.1c-0.7-1.8-1.8-2.3-1.8-2.3c-1.5-1,0.1-1,0.1-1 c1.6,0.1,2.5,1.6,2.5,1.6c1.4,2.4,3.7,1.7,4.7,1.3c0.1-1,0.6-1.7,1-2.1c-3.6-0.4-7.3-1.8-7.3-7.9c0-1.7,0.6-3.2,1.6-4.3 c-0.2-0.4-0.7-2,0.2-4.2c0,0,1.3-0.4,4.4,1.6c1.3-0.4,2.6-0.5,4-0.5c1.4,0,2.7,0.2,4,0.5c3.1-2.1,4.4-1.6,4.4-1.6 c0.9,2.2,0.3,3.8,0.2,4.2c1,1.1,1.6,2.5,1.6,4.3c0,6.1-3.7,7.5-7.3,7.9c0.6,0.5,1.1,1.5,1.1,3c0,2.1,0,3.9,0,4.4 c0,0.4,0.3,0.9,1.1,0.8C43.4,45.1,48,39.1,48,32C48,23.2,40.8,16,32,16z"/></symbol><symbol id="github-unauth-mask" viewBox="0 0 64 64"><path d="M0,0v64h64V0H0z M37.1,47.2c-0.8,0.2-1.1-0.3-1.1-0.8c0-0.5,0-2.3,0-4.4c0-1.5-0.5-2.5-1.1-3 c3.6-0.4,7.3-1.7,7.3-7.9c0-1.7-0.6-3.2-1.6-4.3c0.2-0.4,0.7-2-0.2-4.2c0,0-1.3-0.4-4.4,1.6c-1.3-0.4-2.6-0.5-4-0.5 c-1.4,0-2.7,0.2-4,0.5c-3.1-2.1-4.4-1.6-4.4-1.6c-0.9,2.2-0.3,3.8-0.2,4.2c-1,1.1-1.6,2.5-1.6,4.3c0,6.1,3.7,7.5,7.3,7.9 c-0.5,0.4-0.9,1.1-1,2.1c-0.9,0.4-3.2,1.1-4.7-1.3c0,0-0.8-1.5-2.5-1.6c0,0-1.6,0-0.1,1c0,0,1,0.5,1.8,2.3c0,0,0.9,3.1,5.4,2.1 c0,1.3,0,2.3,0,2.7c0,0.4-0.3,0.9-1.1,0.8C20.6,45.1,16,39.1,16,32c0-8.8,7.2-16,16-16c8.8,0,16,7.2,16,16 C48,39.1,43.4,45.1,37.1,47.2z"/></symbol><symbol id="bluesky-unauth-icon" viewBox="0 0 64 64"><g class="svg-icon"><path d="M22.9364 19.8673C26.6051 22.579 30.551 28.0775 32 31.0279C33.449 28.0775 37.3949 22.579 41.0636 19.8673C43.7108 17.9106 48 16.3966 48 21.2142C48 22.1763 47.4397 29.2966 47.1111 30.4526C45.9688 34.4714 41.8066 35.4965 38.1041 34.8761C44.5759 35.9605 46.2222 39.5526 42.6666 43.1448C35.914 49.9669 32.9612 41.4331 32.2046 39.2464C32.0659 38.8455 32.001 38.658 32 38.8175C31.999 38.658 31.9341 38.8455 31.7954 39.2464C31.0388 41.4331 28.086 49.9669 21.3333 43.1448C17.7778 39.5526 19.4241 35.9605 25.8959 34.8761C22.1934 35.4965 18.0312 34.4714 16.8889 30.4526C16.5603 29.2966 16 22.1763 16 21.2142C16 16.3966 20.2893 17.9106 22.9364 19.8673Z"/></g></symbol><symbol id="bluesky-unauth-mask" viewBox="0 0 64 64"><g class="svg-mask"><path d="M64 64H0V0H64V64ZM48 21.2139C47.9998 16.3967 43.7106 17.9106 41.0635 19.8672C37.3948 22.579 33.449 28.0779 32 31.0283C30.551 28.0779 26.6052 22.579 22.9365 19.8672C20.2895 17.9106 16.0002 16.3967 16 21.2139C16 22.1758 16.5601 29.2945 16.8887 30.4521C18.0309 34.4708 22.1931 35.4962 25.8955 34.876C19.4242 35.9605 17.7779 39.5526 21.333 43.1445C28.0857 49.9667 31.0393 41.4328 31.7959 39.2461C31.9345 38.8456 31.999 38.6581 32 38.8174C32.001 38.6581 32.0655 38.8456 32.2041 39.2461C32.9607 41.4328 35.9143 49.9667 42.667 43.1445C46.2221 39.5526 44.5758 35.9605 38.1045 34.876C41.8069 35.4962 45.9691 34.4708 47.1113 30.4521C47.44 29.2945 48 22.1758 48 21.2139Z"/></g></symbol><symbol id="linkedin-unauth-icon" viewBox="0 0 64 64"><path d="M20.4,44h5.4V26.6h-5.4V44z M23.1,18c-1.7,0-3.1,1.4-3.1,3.1c0,1.7,1.4,3.1,3.1,3.1 c1.7,0,3.1-1.4,3.1-3.1C26.2,19.4,24.8,18,23.1,18z M39.5,26.2c-2.6,0-4.4,1.4-5.1,2.8h-0.1v-2.4h-5.2V44h5.4v-8.6 c0-2.3,0.4-4.5,3.2-4.5c2.8,0,2.8,2.6,2.8,4.6V44H46v-9.5C46,29.8,45,26.2,39.5,26.2z"/></symbol><symbol id="linkedin-unauth-mask" viewBox="0 0 64 64"><path d="M0,0v64h64V0H0z M25.8,44h-5.4V26.6h5.4V44z M23.1,24.3c-1.7,0-3.1-1.4-3.1-3.1c0-1.7,1.4-3.1,3.1-3.1 c1.7,0,3.1,1.4,3.1,3.1C26.2,22.9,24.8,24.3,23.1,24.3z M46,44h-5.4v-8.4c0-2,0-4.6-2.8-4.6c-2.8,0-3.2,2.2-3.2,4.5V44h-5.4V26.6 h5.2V29h0.1c0.7-1.4,2.5-2.8,5.1-2.8c5.5,0,6.5,3.6,6.5,8.3V44z"/></symbol><symbol id="reddit-icon" viewBox="0 0 64 64"><path d="M47.8,30.7c0-2.1-1.7-3.8-3.8-3.8c-0.9,0-1.7,0.3-2.4,0.9c-2.3-1.4-5.2-2.4-8.5-2.5l1.7-5.3 l4.6,1.1c0.1,1.6,1.5,3,3.2,3c1.8,0,3.2-1.4,3.2-3.2s-1.4-3.2-3.2-3.2c-1.2,0-2.3,0.7-2.8,1.7l-5.3-1.2c-0.4-0.1-0.9,0.1-1,0.6 l-2.1,6.5c-3.5,0.1-6.7,1-9.1,2.6c-0.7-0.5-1.5-0.9-2.4-0.9c-2.1,0-3.8,1.7-3.8,3.8c0,1.3,0.7,2.5,1.7,3.1c0,0.3-0.1,0.6-0.1,0.9 c0,5.3,6.4,9.6,14.2,9.6s14.2-4.3,14.2-9.6c0-0.3,0-0.6-0.1-0.9C47.2,33.2,47.8,32,47.8,30.7z M42.6,19.4c0.8,0,1.5,0.7,1.5,1.5 c0,0.8-0.7,1.5-1.5,1.5s-1.5-0.7-1.5-1.5C41.1,20,41.8,19.4,42.6,19.4z M17.8,30.7c0-1.2,0.9-2.1,2.1-2.1c0.3,0,0.6,0.1,0.9,0.2 c-1.1,0.9-2,2-2.5,3.2C18.1,31.7,17.8,31.2,17.8,30.7z M32,42.6c-6.9,0-12.5-3.5-12.5-7.9s5.6-7.9,12.5-7.9s12.5,3.5,12.5,7.9 S38.9,42.6,32,42.6z M45.6,32.1c-0.5-1.2-1.4-2.3-2.5-3.2c0.3-0.1,0.6-0.2,0.9-0.2c1.2,0,2.1,0.9,2.1,2.1 C46.2,31.2,45.9,31.7,45.6,32.1z M29.4,33.1c0-1.2-1-2.1-2.1-2.1s-2.1,1-2.1,2.1s1,2.2,2.1,2.2S29.4,34.2,29.4,33.1z M36.7,30.9 c-1.2,0-2.1,1-2.1,2.1s1,2.2,2.1,2.2c1.2,0,2.1-1,2.1-2.2S37.9,30.9,36.7,30.9z M36,38.2c-0.8,0.8-2.1,1.1-4,1.1 c-1.9,0-3.2-0.4-4-1.1c-0.3-0.3-0.9-0.3-1.2,0c-0.3,0.3-0.3,0.9,0,1.2c1.1,1.1,2.8,1.6,5.2,1.6c2.4,0,4.1-0.5,5.2-1.6 c0.3-0.3,0.3-0.9,0-1.2C36.9,37.8,36.3,37.8,36,38.2z"/></symbol><symbol id="reddit-mask" viewBox="0 0 64 64"><path d="M32,26.9c-6.9,0-12.5,3.5-12.5,7.9s5.6,7.9,12.5,7.9s12.5-3.5,12.5-7.9S38.9,26.9,32,26.9z M25.2,33.1 c0-1.2,1-2.1,2.1-2.1s2.1,1,2.1,2.1s-1,2.2-2.1,2.2S25.2,34.2,25.2,33.1z M37.2,39.4C36.1,40.5,34.4,41,32,41 c-2.4,0-4.1-0.5-5.2-1.6c-0.3-0.3-0.3-0.9,0-1.2c0.3-0.3,0.9-0.3,1.2,0c0.8,0.8,2.1,1.1,4,1.1c1.9,0,3.2-0.4,4-1.1 c0.3-0.3,0.9-0.3,1.2,0C37.5,38.5,37.5,39,37.2,39.4z M36.7,35.2c-1.2,0-2.1-1-2.1-2.2s1-2.1,2.1-2.1c1.2,0,2.1,1,2.1,2.1 S37.9,35.2,36.7,35.2z M44.1,28.6c-0.3,0-0.6,0.1-0.9,0.2c1.1,0.9,2,2,2.5,3.2c0.3-0.4,0.5-0.8,0.5-1.4 C46.2,29.6,45.2,28.6,44.1,28.6z M20.9,28.8c-0.3-0.1-0.6-0.2-0.9-0.2c-1.2,0-2.1,0.9-2.1,2.1c0,0.5,0.2,1,0.5,1.4 C18.9,30.9,19.8,29.8,20.9,28.8z M42.6,22.3c0.8,0,1.5-0.7,1.5-1.5c0-0.8-0.7-1.5-1.5-1.5s-1.5,0.7-1.5,1.5 C41.1,21.7,41.8,22.3,42.6,22.3z M0,0v64h64V0H0z M46.1,33.9c0,0.3,0.1,0.6,0.1,0.9c0,5.3-6.4,9.6-14.2,9.6S17.8,40,17.8,34.8 c0-0.3,0-0.6,0.1-0.9c-1-0.7-1.7-1.8-1.7-3.1c0-2.1,1.7-3.8,3.8-3.8c0.9,0,1.7,0.3,2.4,0.9c2.4-1.5,5.6-2.5,9.1-2.6l2.1-6.5 c0.1-0.4,0.6-0.7,1-0.6l5.3,1.2c0.5-1,1.6-1.7,2.8-1.7c1.8,0,3.2,1.4,3.2,3.2S44.3,24,42.6,24c-1.7,0-3-1.3-3.2-3L34.8,20l-1.7,5.3 c3.3,0.2,6.2,1.1,8.5,2.5c0.7-0.5,1.5-0.9,2.4-0.9c2.1,0,3.8,1.7,3.8,3.8C47.8,32,47.2,33.2,46.1,33.9z"/></symbol></svg>

  </body>
</html>
