<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Page not found | BloggingAbout.NET</title><meta name="description" content="Dennis van der Stelt on building distributed systems"><meta name="author" content="Dennis van der Stelt"><link rel="canonical" href="https://bloggingabout.net/404/"><link rel="alternate" type="application/rss+xml" title="BloggingAbout.NET" href="/feed.xml"><!-- Fonts --><link href="https://fonts.googleapis.com/css?family=Josefin+Sans:400,600%7CPoppins:400,600,700%7CSora:400,600&display=swap" rel="stylesheet"><!-- Ionicons --><link href="https://unpkg.com/ionicons@4.2.2/dist/css/ionicons.min.css" rel="stylesheet"><!-- Favicons --><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"><link rel="manifest" href="/site.webmanifest"><!-- Open Graph --><meta property="og:type" content="article"><meta property="og:site_name" content="BloggingAbout.NET"><meta property="og:locale" content="en_US"><meta property="og:title" content="Page not found | BloggingAbout.NET"><meta property="og:description" content="Dennis van der Stelt on building distributed systems"><meta property="og:url" content="https://bloggingabout.net/404/"><meta property="og:image" content="https://bloggingabout.net/images/404.jpg"><!-- Twitter --><meta name="twitter:card" content="summary"><meta name="twitter:site" content="@dvdstelt"><meta name="twitter:creator" content="@dvdstelt"><meta name="twitter:title" content="Page not found | BloggingAbout.NET"><meta name="twitter:description" content="Dennis van der Stelt on building distributed systems"><meta name="twitter:image" content="https://bloggingabout.net/images/404.jpg"><!-- JSON-LD --><script type="application/ld+json">{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"Dennis van der Stelt"},"description":"Dennis van der Stelt on building distributed systems","headline":"Page not found | BloggingAbout.NET","image":"https://bloggingabout.net/images/404.jpg","mainEntityOfPage":{"@type":"WebPage","@id":"https://bloggingabout.net/404/"},"url":"https://bloggingabout.net/404/"}</script><!-- Google Analytics --><script async src="https://www.googletagmanager.com/gtag/js?id=G-KYNPK4927H"></script><script>(function(){const GA_ID = "G-KYNPK4927H";

    window.dataLayer = window.dataLayer || [];
    function gtag() { dataLayer.push(arguments); }
    gtag('js', new Date());
    gtag('config', GA_ID);
  })();</script><link rel="stylesheet" href="/_astro/about.BypyyBxA.css"></head><body> <!-- begin header --><header class="header"> <div class="container"> <div class="row"> <div class="header__inner col col-12"> <div class="logo"> <a class="logo__link" href="/">
BloggingAbout.NET
</a> </div> <div class="menu-overlay"> <nav class="main-nav"> <div class="main-nav__box"> <div class="nav__icon-close"> <i class="ion ion-md-close"></i> </div> <div class="nav-grid"> <div class="nav-grid__item"> <h2 class="nav-grid__title">Menu</h2> <div class="mobile-nav"> <ul class="nav__list list-reset"> <li class="nav__item"> <a href="/" class="nav__link"> Home </a> </li><li class="nav__item"> <a href="/about/" class="nav__link"> About </a> </li><li class="nav__item"> <a href="/contact/" class="nav__link"> Contact </a> </li> </ul> </div> </div> </div> </div> </nav> </div> <div class="navigation"> <div class="top-nav"> <ul class="nav__list list-reset"> <li class="nav__item"> <a href="/" class="nav__link"> Home </a> </li><li class="nav__item"> <a href="/about/" class="nav__link"> About </a> </li><li class="nav__item"> <a href="/contact/" class="nav__link"> Contact </a> </li> </ul> </div> <div class="nav-buttons"> <i class="nav__icon nav__icon-menu ion ion-md-menu"></i> <i class="nav__icon nav__icon-search ion ion-md-search"></i> </div> </div> </div> </div> </div> </header> <!-- end header --> <div class="search" id="search-overlay"> <div class="search__panel" role="dialog" aria-modal="true" aria-label="Search posts"> <div class="search__input-wrap"> <i class="ion ion-md-search search__icon" aria-hidden="true"></i> <input type="text" id="search-input" class="search__input" placeholder="Type to search..." autocomplete="off" spellcheck="false" aria-label="Search posts" aria-controls="search-results" aria-autocomplete="list"> <button class="search__close" id="js-search-close" aria-label="Close search"> <i class="ion ion-md-close"></i> </button> </div> <p class="search__meta" id="search-meta" aria-live="polite"></p> <ul class="search__results" id="search-results" role="listbox" aria-label="Search results"></ul> <div class="search__footer" aria-hidden="true"> <span><kbd>↑</kbd><kbd>↓</kbd> navigate</span> <span><kbd>↵</kbd> open</span> <span><kbd>esc</kbd> close</span> </div> </div> </div> <script type="module">const g=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function w(e){const t=e.match(/\/(\d{4})\/(\d{2})\/(\d{2})\//);return t?`${g[+t[2]-1]} ${+t[3]}, ${t[1]}`:""}function $(e,t){if(!t.trim())return e;const n=t.trim().split(/\s+/).filter(Boolean).map(r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|");return e.replace(new RegExp(`(${n})`,"gi"),"<mark>$1</mark>")}let c=null;async function f(){if(c)return c;try{c=await new Function("u","return import(u)")("/pagefind/pagefind.js"),await c.init()}catch{}return c}let s=-1,d=0;function o(){return[...document.querySelectorAll("#search-results .search__result")]}function m(e){const t=o();if(!t.length)return;const n=Math.max(-1,Math.min(e,t.length-1));t.forEach((r,a)=>{r.classList.toggle("is-selected",a===n),r.querySelector("a")?.setAttribute("tabindex",a===n?"0":"-1")}),s=n,n>=0&&t[n].scrollIntoView({block:"nearest",behavior:"smooth"})}function b(){const e=o();(s>=0?e[s]:e[0])?.querySelector("a")?.click()}function y(e,t){const n=document.getElementById("search-results"),r=document.getElementById("search-meta");if(s=-1,!e.length){r.textContent="",n.innerHTML=`<li class="search__empty">No results for <em>${t}</em></li>`;return}const a=e.length;r.textContent=`${a} result${a===1?"":"s"}`,n.innerHTML=e.map((i,l)=>{const p=$(i.meta?.title??"",t),u=w(i.url);return`<li class="search__result" role="option" data-index="${l}">
        <a href="${i.url}" tabindex="${l===0?"0":"-1"}">
          <span class="search__result-title">${p}</span>
          ${u?`<span class="search__result-date">${u}</span>`:""}
        </a>
      </li>`}).join("")}function h(){document.getElementById("search-results").innerHTML="",document.getElementById("search-meta").textContent="",s=-1}async function v(e){if(!e.trim()){h();return}const t=await f();if(!t)return;const{results:n}=await t.search(e),r=await Promise.all(n.slice(0,20).map(a=>a.data()));y(r,e)}document.addEventListener("DOMContentLoaded",()=>{const e=document.getElementById("search-input"),t=document.querySelector(".search");new MutationObserver(()=>{t.classList.contains("is-visible")?(setTimeout(()=>e.focus(),60),f()):(h(),e.value="")}).observe(t,{attributes:!0,attributeFilter:["class"]}),e.addEventListener("input",()=>{clearTimeout(d),d=window.setTimeout(()=>v(e.value),150)}),e.addEventListener("keydown",n=>{if(!(!o().length&&n.key!=="Escape"))switch(n.key){case"ArrowDown":n.preventDefault(),m(s+1);break;case"ArrowUp":n.preventDefault(),m(s<=0?-1:s-1);break;case"Enter":n.preventDefault(),b();break}})});</script> <!-- begin content --> <main class="content" aria-label="Content"> <div class="container"> <div class="row"> <div class="col col-12"> <div class="image-box"> <img class="page-image" src="/images/404.jpg" alt="Page not found"> </div> </div> </div> </div><div class="container"> <div class="row"> <div class="col col-8 push-2 col-d-10 col-m-12 push-d-1 push-m-0"> <!-- begin page --> <article class="page animate"> <div class="page-head"> <h1 class="page-title">Page not found</h1> </div> <div class="page__content">  <div class="container"> <div class="row"> <div class="col col-12" style="text-align: center"> <h2>404</h2> <p>This page has joined the dark side and cannot be found</p> <p> <a href="/" class="button button--middle" style="text-decoration: none"> <i class="ion ion-md-arrow-back"></i> Back to the blog
</a> </p> </div> </div> </div>  </div> </article> <!-- end page --> </div> </div> </div>  </main> <!-- end content --> <div class="top" title="Top"><i class="ion ion-ios-arrow-up"></i></div> <!-- begin footer-widgets --><section class="footer-widgets"> <div class="container"> <div class="row"> <div class="col col-4 col-d-6 col-t-12"> <div class="widget widget-info"> <div class="footer-logo">BloggingAbout.NET</div> <p class="footer-desc">I&#39;m a developer, international speaker and coach/trainer. I love to discuss code, software architecture and distributed systems, messaging, star wars and lego with anyone who wants to listen or speak. I currently work at Particular Software on NServiceBus.</p> </div> </div> <div class="col col-4 col-d-6 col-t-12"> <div class="widget widget-nav"> <div class="widget__head"> <h3 class="widget__title">Menu</h3> </div> <ul class="nav__list list-reset"> <li class="nav__item"> <a href="/" class="nav__link"> Home </a> </li><li class="nav__item"> <a href="/about/" class="nav__link"> About </a> </li><li class="nav__item"> <a href="/contact/" class="nav__link"> Contact </a> </li> </ul> </div> </div> </div> </div> </section> <!-- end footer-widgets --> <!-- begin footer --> <footer class="footer"> <div class="container"> <div class="row"> <div class="col col-12 col-d-10 push-d-1 col-m-12 push-m-0"> <div class="footer__inner"> <div class="social"> <ul class="social__list list-reset"> <li class="social__item"> <a class="social__link" href="https://twitter.com/dvdstelt" aria-label="Twitter"> <i class="ion ion-logo-twitter"></i> </a> </li><li class="social__item"> <a class="social__link" href="https://github.com/dvdstelt" aria-label="GitHub"> <i class="ion ion-logo-github"></i> </a> </li><li class="social__item"> <a class="social__link" href="https://www.linkedin.com/in/dvdstelt/" aria-label="LinkedIn"> <i class="ion ion-logo-linkedin"></i> </a> </li><li class="social__item"> <a class="social__link" href="https://api.whatsapp.com/send?phone=%2B31648536810" aria-label="WhatsApp"> <i class="ion ion-logo-whatsapp"></i> </a> </li><li class="social__item"> <a class="social__link" href="/feed.xml" aria-label="RSS feed"> <i class="ion ion-logo-rss"></i> </a> </li> </ul> </div> <div class="copyright"> 2026 &copy; <a href="/"><strong>BloggingAbout.NET</strong></a>. Owned by <a href="https://compilesoftware.nl">Dennis van der Stelt</a>.
</div> </div> </div> </div> </div> </footer> <!-- end footer --> <script type="module">const y=document.querySelector(".nav__icon-menu"),b=document.querySelector(".nav__icon-close"),p=document.querySelector(".menu-overlay"),h=document.querySelector(".nav__icon-search"),g=document.querySelector("#js-search-close"),d=document.querySelector(".search"),v=document.querySelector(".top");y?.addEventListener("click",()=>p?.classList.add("is-open"));b?.addEventListener("click",()=>p?.classList.remove("is-open"));h?.addEventListener("click",()=>{d?.classList.add("is-visible")});g?.addEventListener("click",()=>d?.classList.remove("is-visible"));d?.addEventListener("click",e=>{e.target===d&&d.classList.remove("is-visible")});document.addEventListener("keyup",e=>{e.key==="Escape"&&d?.classList.remove("is-visible")});setTimeout(()=>document.body.classList.add("is-in"),150);v?.addEventListener("click",()=>window.scrollTo({top:0,behavior:"smooth"}));window.addEventListener("scroll",()=>{v?.classList.toggle("is-active",window.scrollY>window.innerHeight)});document.querySelectorAll(".post__content pre, .page__content pre").forEach(e=>{e.style.removeProperty("overflow-x");const r=e.parentElement?.classList.contains("code-block-wrapper")?e.parentElement:e;r.addEventListener("mouseenter",()=>{document.documentElement.style.overflowX="hidden",document.body.style.overflowX="visible"}),r.addEventListener("mouseleave",()=>{document.documentElement.style.overflowX="",document.body.style.overflowX=""})});(()=>{const e=document.createElement("div");e.className="lightbox-overlay";const r=document.createElement("img"),l=document.createElement("button");l.className="lightbox-prev",l.setAttribute("aria-label","Previous image"),l.innerHTML='<i class="ion ion-ios-arrow-back"></i>';const s=document.createElement("button");s.className="lightbox-next",s.setAttribute("aria-label","Next image"),s.innerHTML='<i class="ion ion-ios-arrow-forward"></i>';const c=document.createElement("div");c.className="lightbox-counter",e.appendChild(l),e.appendChild(r),e.appendChild(s),e.appendChild(c),document.body.appendChild(e);let o=[],n=0;const i=t=>{n=t;const m=o[t];r.src=m.src,r.alt=m.alt;const a=o.length>1;l.classList.toggle("is-hidden",!a),s.classList.toggle("is-hidden",!a),c.classList.toggle("is-hidden",!a),a&&(c.textContent=`${t+1} / ${o.length}`,l.disabled=t===0,s.disabled=t===o.length-1)},u=()=>{e.classList.remove("is-open"),o=[]};l.addEventListener("click",t=>{t.stopPropagation(),n>0&&i(n-1)}),s.addEventListener("click",t=>{t.stopPropagation(),n<o.length-1&&i(n+1)}),e.addEventListener("click",t=>{t.target===e&&u()}),document.addEventListener("keyup",t=>{t.key==="Escape"&&u(),e.classList.contains("is-open")&&(t.key==="ArrowLeft"&&n>0&&i(n-1),t.key==="ArrowRight"&&n<o.length-1&&i(n+1))}),document.querySelectorAll(".post__content img, .page__content img").forEach(t=>{t.closest("a")||t.addEventListener("click",()=>{const m=Array.from(t.parentElement?.querySelectorAll("img")??[t]).filter(a=>!a.closest("a"));o=m.length>0?m:[t],i(o.indexOf(t)),e.classList.add("is-open")})})})();document.querySelectorAll('.post__content iframe[src*="youtube.com/embed"], .page__content iframe[src*="youtube.com/embed"]').forEach(e=>{const l=(e.getAttribute("src")?.trim()??"").match(/youtube\.com\/embed\/([^?&\s]+)/);if(!l)return;const s=l[1],c=document.createElement("div");c.className="yt-embed";const o=document.createElement("img");o.src=`https://img.youtube.com/vi/${s}/maxresdefault.jpg`,o.alt="YouTube video",o.loading="lazy",o.onerror=()=>{o.src=`https://img.youtube.com/vi/${s}/hqdefault.jpg`};const n=document.createElement("button");n.className="yt-embed__play",n.setAttribute("aria-label","Play video"),n.innerHTML='<i class="ion ion-ios-play"></i>',c.appendChild(o),c.appendChild(n),e.replaceWith(c),c.addEventListener("click",()=>{const i=document.createElement("iframe");i.src=`https://www.youtube.com/embed/${s}?autoplay=1`,i.setAttribute("allowfullscreen",""),i.setAttribute("allow","autoplay; encrypted-media; picture-in-picture"),i.className="yt-embed__player",c.replaceWith(i)},{once:!0})});</script> </body> </html> <script type="module">(function(){let i=window.location.pathname;i.endsWith("/")&&(i=i.slice(0,-1)),i.endsWith(".aspx")&&(i=i.slice(0,-5)),i.startsWith("/dennis/")&&(i=i.slice(7)),i.startsWith("/blogs/dennis/archive/")&&(i=i.slice(21)),/^\/\d{4}\/\d{2}\/\d{2}\/.+/.test(i)&&window.location.replace(i+"/")})();</script>