geoffhayward.eu Ads.txt file

<!doctype html>
<html lang="en">
<head>


<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-P5C4B6K6');</script>


<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">

<title>Geoffrey&#39;s Computing Blog</title>

<meta name="description" content="Geoffrey&#39;s Computing Blog" >

<link rel="canonical" href="https://geoffrey.run/computing/">

<link rel="alternate" type="application/rss+xml" href="https://geoffrey.run/computing/index.xml" title="Geoffrey's Blogs">



<link rel="preload" href="https://geoffrey.run/css/combined.min.0111772b27b78a6fed25632420b62c739b242495890a6a8cf2349f0dae747ff2.css" as="style">
<link rel="stylesheet" href="https://geoffrey.run/css/combined.min.0111772b27b78a6fed25632420b62c739b242495890a6a8cf2349f0dae747ff2.css">


</head>

<body>


<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-P5C4B6K6"
height="0" width="0" style="display:none;visibility:hidden"></iframe>
</noscript>



<nav class="navbar navbar-expand-lg">
<div class="container-xl">
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#menu" aria-controls="menu" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="menu">
<ul class="navbar-nav">



<li class="nav-item">
<a class="nav-link " aria-current="page" href="/">Home</a>
</li>


<li class="nav-item">
<a class="nav-link " aria-current="page" href="/about/">About</a>
</li>


<li class="nav-item">
<a class="nav-link " aria-current="page" href="/running/">Running</a>
</li>


<li class="nav-item">
<a class="nav-link active" aria-current="page" href="/computing/">Computing</a>
</li>


<li class="nav-item">
<a class="nav-link " aria-current="page" href="/contact/">Contact Me</a>
</li>

</ul>
</div>
</div>
</nav>




<div class="text-white" style="background: url(/images/img_20230502_124425-pano_hu7381b2dcf70d8d9b936ff2edc280ae0b_4835761_1800x400_fill_q75_box_smart1.jpg) no-repeat center center; background-size: cover; opacity: 0.9;">
<div class="container-xl py-3">
<div class="row">
<div class="col-6 col-sm-4 col-md-2">


<img class="img-fluid rounded-circle" src="data:image/jpeg;base64,/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAOEA4QMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&#43;Tl5ufo6ery8/T19vf4&#43;fr/2gAMAwEAAhEDEQA/APVs0hNNLUm6tTO47NJmk3UmaQC7qXdTM0UCJM0maZmlzQA/NKGpmao6lqsGmxFnIaQ/dQHk0NpK7Gk27I0mdVXcxAHqazp9esoJPL3l2/2BkVzH9pT6huuLubZAPuIDgVmtrcAuPLRRjtnFc8q3Y6I0O52reIrVBl1kHpwDT4/EFi8gjLlGPTcK5FdYjb5GQEH1NVb6Jy6SwbSADyVznPY1KrSLdCJ6THMkqBkZWB6EHNO3VwWkatJZTyRgqqrgFDwPauztbuO7hEkbD0Iz0NbwqKRhODiWt1LuqHdRuqzK5T1J/wDTdL/6&#43;T/6A1aW/wB6xtVP&#43;maUf&#43;nr/wBpvWnuoHcm3&#43;9LvqDdS80CuTb6XfUGTRuoHcsB6d5lVt1Lk0BcseZS&#43;ZVfNKM0AWN/vRv96h5o5oAq5ozSUUxBSUtFACZozQaSgBc04GmU4UAMuZ/s9rLNjOxScV5lcakdQ1BmZmZ2cjH&#43;Fd94gkMejTEHGeK850hEFxPcsMgNsX29a5qz1sdWHjc1NQt5HijWMfIo4Wudm0e5klJQEt9etdUl0shI7ds1NG6EDoCOMisDtUDA03Tb2WNg6gMpxmujg0gvbYaV&#43;RjG44qaOVY0wEAGfzqxFeKoAA4paA4nL6jpsti&#43;9M7QMHPQit7w9qBhuY1dvlmIUj37GrWpwpe2LLnBxwaw02WzRbc7kxjHerWjuYTjdNHoVJzRG3mRI5yCyg4pxxXaeeZWrEi60r/r7H/oDVp45rL1k/6RpX/X4v8A6A1amaAHgU7NRBqXdQBJmjFR7jRuNAEoApcVDuNKGNAE2BThxUIenb6Bk2RRkVDvo30AQUUUUxBRmm5opALmkoooAWlpBSigDE8Xl18NXMiDLJg/rivPdKnLaYFbhixJr1XUbQX&#43;mXNq3/LWMr&#43;PavJ7OFooGRhhg5U/UVzYhdTtwmpbjmkL4Hb0rRh3MDu69jms1ZEgKmSRU/3jirKXse7aHBGOoOa50d6NKOGQj7/WrEcJjbJOT9awW1YW8ZZicA1QHjT9&#43;UEICjjLOOaNxS0O4VyY8MDjvWLdW7NqcYyduP8AIqOz8UW8q7JF27uBjkGp9Uu47WwF6TgowUY77iBVLV2MZqyud3bbTbRqjKdqgHB6cVLtNcp4adv7W87zt8M8GOvAI5rryvOM812U580Thr0vZzsncx9ZX99pmf8An8X/ANBatPbVLWIyX072vE/k1aWyrMLEWMUoqQR04RigLEYGaXYTTopEaeWIDlMZP1qf5R1ouOxXEbelL5RqcyIqbsjFODAjIouFiqYyO1KI29Ks8UuRQFit5TUeU1WeKOKAM2kzTc0ZpiHZNJk00tUU91FbpvmkVF9TQBPk0oqrb3sF0CYJVfHXFFzfQWcZeeQIMZ5oAmnuI7dC8jAAe9ZS60HvYxwqMOBnrXKax4nN2T5eAinhgev0rLttZ2SRyOMhWAz9TXO6ybsi1E9J1lnm8PXrWzEP5LFSOvAzXlA1N3troldssUuMjvwMn8811U981xsKSuFK8rkgVzQ02eyvrt5WjeG5kDxKucgc9azrTi9nqdmGbty263OVvZby9Z2hiaUKfvOTz9BVvSI75L6ESS5Tjeuc4/KusbQ4ZR5nmPET1VW4NNWzjiPlQjAHJI/mTWV1ax1qLve5e1vR0vdLAhUq3H1IrjZ/D0SBYbqKddrZ8xBncPTvXpsH72xVWILqPzqhfXH2KYLMiqpGQwOQad2tUEop6MxtP0K1lcTQW7wKB3P3vqM/4Vd1zTbm/wBFaxtGjSTerBnJwMHNaFtqlsQPuGl&#43;1xyvKIQN6ZG09M9RU31uEoaWa0JdMVtEs4vNxNKF&#43;8nAJI5IqP8AtzVGYkXGMcH5RWHPrkuSPugrtVQOFqg2qyNLnJ9D71SnZHDW9&#43;Vz0i61W3ex0Uzy5na6j38d8Gt46hZ5/wBbXjg1eXFszuSYZQyNnpWtL4l3oqyA7mIIxgVqqqtqYcp6NJqNqtzGfPATBBGDVk3Nuyb45lPsTiuI0rxHYXCCC9CqwzhgvOK0Df2wLfZ51cHBAPFaKpG25LTNf7bGLu4KuuSqE8545zWbfa&#43;ElKDPGOhznPpXJXeqxxTXB37m3cAGqzanFPht4x0AJrKVdbDUTsTrTmBCQSM/54q9b6&#43;mTuODngfzzXArfKIRtbD9TntTYr9t6l2wwNT7bsPkPVU1KJo0ZWzu5GKuQzJLuwRx1rz3TtTYK67wCWGF/XNTS&#43;IntxvD7i/I9q1VbuTynoG5f74/Ojcv98fnXmP9tXH98/rR/bVx/fP60e3Q&#43;Rm9oPiKLVsxuoR1AGSfvGug2D0ryHw5qH9mavF84bJwRnGc16mut6dsy95Cp7hjj&#43;dOlUbVpFeym9lcwL/X5Yb6WIRgBDt&#43;9VrxB&#43;80CGUj7xU/mK47X9WtTdXsltMkh3ErtPU1Db&#43;MmufCMtlej/SoGXycfxr/AIiut6NWRzqMtbnUeFXP2iZAvBXP5Vn&#43;L9USQG2K8r3FZfh/xGLGQSyxnzGUqQcgZ&#43;tY2s6i13dtOUGCeh6VxYuo72XU0pxstTPM29yueM1OJkjtwNiZ3D5jnPWjTtNl1Lzpowo2AtgegxmnTWa&#43;WxMg2rg8fWuVNRepukbMUplAcEKMdKbdXTHZzlVPHtUUdxFxGpI4wMiq95OIkyCMY5965lJuobU5crTJbvV3jO1fvNwKhjup7aBmTDs/LBjVVJI50AbBVuh9Kr3uizb0uLW4kRh95NxKsPpXTHXc9GXSxrxeJLoYjjj2t3z0/OrNzqcIsnm1C6RiB83B49hgVRhu7ePbjSkdwwIL3GMj3GP0rTW2h1IqXhhEatuVI0wo9v8AaqyJXfQwrYtPKssSSRQk5BbjcPpXRWLkysV5LkDHqQMU2&#43;iWKMkL83AAHapNDjIvI8AnDZ/Ks20mVGLnFmBeLNbTeXPG6NjOHGDVQy4Fdd4s1JNX0iJmsp450AdHdegzgqT2PQ4rj7OF7i5igyAzsFXJ9au3Y82cXGVhrbZ1ixLnDg4xitJYtyAsfmHSt6z8J2cVqN&#43;Lh2Yl2LMvl&#43;m0Dr9TWLLBBbySweZcMyMVyE/xNaeylVdqSInCcPiFeK5hhF2lsxQEKGB4zUD3krttizuycnPFTm7uDataqJTCeMHA/GpNP0i/kgVoIFZS2CZH6c&#43;gp1MHOCuyIxcnYwJ7mcysQQET72asvewNAgQ9DkFT3rVubQ2N3JDLZ27upy2STkH8agcqy4htbeE5zlY8YrWngXUSkmFmnZkEVxuB&#43;9zjn0NOEoQZc7Q3Iya09GiZtQjguLg&#43;VOwjffyBn2rkLpMXlwrMW2yMo&#43;gNXLA8srXBysdBHrEcXLSoPxpz6tBJ8wlVti7iAa5UoB0GKnj3CGfB5MZH6im8LCMbijJtmv8A8JE3q35ij/hIm9W/MVx37z&#43;5&#43;tH7z&#43;5&#43;tYcqOk9J8MWNjqGmXM11AyzxyFI5c4ZSAMVsWWm3eqObi5lCJtzvc5JwPT0pttYeVq0oimcIW3CNOFYt6ikkivXvZ7Kyb99sKxlzwTjjNZc3V7HVCUqXwuzsYK&#43;GLWeK5P8AaXm3JBeIL1&#43;hqJkuTa28DOESJcoVjAPPXmteOHUdFnt7W9aLeU3YiAwB3ya6Ww0S11SxacGMRynIOACR2O4Vm8VGnHn5rJ9TKpFNXW55vNqmoC7EEl1JJHkAg960dPtLW9F2t9mFjCzwOT/GoyBj3rSv9Oj0tIrG9jtheThtrtIAFIPB3HoMVxd9rjSEWZAMcDFcl9&#43;cH17iutN4nll2X3nLKEYLV7npPhTRbg2EN6EhjDZZfMJy4PHp0xXNahoUya7NFe29zDEMMBAQd&#43;ehB9K1PDXi838Ys9oSZE&#43;RIgSCoHQCruofaddtFeBgy26s5U8FumBnPGaxmuTR9DejTjKSaVzO03wo&#43;oX6xWVzJCNjE/bSfvAgcfXNc9rVpdW2rNpcyM88TgSRxck9&#43;PwxXU2thchENxO0RByI4nyR9W7fhmtGXbLdNdeVGszhVeRV&#43;ZgBgZP4VwVcdRjrHWX4HpQympVld&#43;7E4f8As8aVZKl&#43;6xTzy/uIt2WxjnOOB&#43;fWtKwuImQRTH2yayfHENxdapZw2qs82zMar13Z/wDrVFp839o2McynbIV&#43;YD1ropqcqUaz&#43;0TV9nCrLD/y7M61NPtZPmZga0UFnaxjaQMVxKz3cZ27zUuLq46s2KfP5B7J9zauLtLichecHNXIZl0yykvJOqKSB79h&#43;dZ1hY&#43;WQWbJqh4jvfMlisUPyx/PJj17D8v51pQpOrUSMa9dUqbSOhs7mLXdLktJJXXzVAdlxnII/wDrVlP4SubHUre70&#43;a3keEk&#43;XcgrnIxwRnmtQ6nBfXmk/ZUiQtAfP2RopL9DnaB/dyM9j71uYEoKuOR&#43;orjzOvWwdflpv3ZK9jqy&#43;nSxdBSqLVaXMjUYbi4tJLWOIOZk2ybJMEH2zisiWxubVVE9vJGcdxn9RXUyQgja&#43;HXsf4hRH5sODFNuX&#43;63ascLnlSho4pnRWymnU1UmjkRj1qSLUDaOYn1J7VGX5AqA/Nn1rrGW2uztuYV3nuR1/GsTWvDE0pW50x13xjmFx976E/1r0JZ3RxMVCS5X&#43;Bwyy6rQd1qiC9njuI/NwXcBUMuPvd&#43;f0rMLAtwKo3Gu3ukWkVtFE0BnbywZoyGJBw3B/KrOhQS32j3N5HLE4t5Crxox8yNf7xB/h9xXtYKaUFFnlVm3UsStJsZCMg7hg&#43;&#43;a5Sbcb2VieN5rpvOPneX/eGP61zYP8ApEuem81VX&#43;IzKxOJbZcF4&#43;FGTxV6yS1v9He4iiKSZYZB4OO2PpzVWwEL3ZEq5UqQB74qTQpLfTtRuNLusK5kD2&#43;ehJGCv8q4cTOV&#43;VHVhoR3kVfsA9aPsA9a7L7LD/dH5UfZYf7o/KuTmZ0&#43;zLmh3tvLqlpNPNHAJ13APIAWI4FWvD&#43;pJqPiXUrS3JMkTMVBx86hsZH515Tc3Uuu&#43;J0G7f5koQbeARnJI/HJr3TTItLmu4LwW0aXsQ2iVeGxjGDjr&#43;NXWUVCVK&#43;kjmjH2slN7oxtXkVdQnWeNlEsSQqW4JYkjH61uwbbW0jtIUxHFEAG7cVL4kt4riziuHGXt5FkUhck47frWJJcyx2FxqSwTIFjKos3yhiM9vrXiYzDyUYxgm0uvnsjRe63zMp&#43;KdBtvFOl&#43;YZzHc2VrJNweCP4QfxBrhvCvhyx8SXcchiNpp9oqi5YvueaQ9Qvp/QVp6dpmoX0twDqVxHFOoFyoPDcfdH5n6V1ljZ2ej2a2tnEI4xycdSfUnuadStLCU/YqV5fl3OjC5dPFS9pLSP5mt9qhtJIhpltHaRQpsjCqOB6/Ws8lFBCgAdTgYqJ7jPeoTKO5ry3OcviZ9Lh8HToq0I2JyQeThUFRNMh4HSqs0&#43;75RnFCA4JNFjtVOyuzE1a5htfFdjdTRvJFHESVQKTn5sfeGOpHJrDsZ/tOr3YgtxAHYyLEsgfr15&#43;v86veKV/060YrkYIwe/P/wBes&#43;6jmsLux1OIeWQxAAxyBjcDjtg19hg4upgoRS6P8z43HxjDF1JOWt1p6rc30tjN/Dhx1BGKtRW8keFkRh9BWiJycN5SN3yBira6k5TZ5CfU15P1yj3PT/s3Era33lOOOTynk24VFJ5rhbWT7VcTTTgsznOAcEk84/Q11fiDUJ7fS5fn2&#43;Z&#43;7Crx16/pmuTs1QQFvlLL856dP8j9a9bL6nPTlUiutkedi8MqdeNObT0uzc0PH9uIsYO2MMTn6Y/ma7ETM3TtXK&#43;FbfZFNdN1dtoJ9B1/n&#43;ldKPklHoa8HOq3tMU1/KrHr5RQUMMpW&#43;Jt/wCX4DpSy4YEkUxZ&#43;/epSMgqenaqcqshyK8qOp6sUnoXBKCOanjudvespZNyFh1HUU&#43;OTc2M03EJUUxPFWiReINKZ4owdQgUtbtnBz/d/H&#43;deY&#43;DdVfRvEtssuY0eQwTqw/hbhgR/npXrEVwUJBPSuG8eeHma8h1exRVEzbZ&#43;cYfs349Prj1r3MmxjhU9jJ77f5Hz&#43;aYGy9rH5lvUtGm0/VrmKXK20bFoXbo6kcDPqOfyrkw2GkPqxrtb7UJdc0CxuZ4ylzaKY5DuyHyMdPXPP4muZ0jw7q&#43;uSldOsZpxu5cDCj6seBX0qmpybTPm5KUXqJYQm61K2hV1jWRgN7dBXX&#43;IPCGnQSWeqJMUkilVpJCc&#43;YcjHHaul8NfC&#43;105UutZnaW6AOYIW&#43;RcjHXrnr0rmPGbXia9Jo0QbyHCC2jUZJbkAjuTyf0rGpTc5rsaU5JJplnzUo81Kyv7O8S/8APsn/AH0v&#43;NH9neJf&#43;fZP&#43;&#43;l/xrD6pUOv61A57RvA3iuPUra6j0t4vLcNmZ1Tjv1Oa9W0jw/qFtqD3F1cW6oRwiuSQfyqonjWyuEzHIh&#43;jZqKbxVFjhhXNOXM9TWnS5FodxKImtyG2vt59q8l17xTLdsbRCBFFIwCouOc810dlq2pXz4tbZ3ibgux2qPfNcP4WsZNQ1Ka9ul&#43;SCUkg/xSZzj8Ov5UnWVKm5y2Qnh5Vqkacd2drpifY9JgWRAsxXc49Cf60ksueaa0m52XPuKglbnFfMyk5ycnuz7PD0FTioLoAck9aUEsT7UxBhSaen3TSOlqwRqCc1MeEpI14px&#43;ZvYVLZlJ3ZzXiqHMNtL/AHWIz9f/ANVRakDceGUkXH7u53cH&#43;&#43;nPHXqo5rR8Tx79J3Y&#43;5ID/ADH9ayo720Hh&#43;6tWlcSyLGURV&#43;UMrc5/DPNfaZJPmwiXZs&#43;Gz&#43;NsY5d0v8v0OhsJGl0&#43;3fcMmNc/lVkK7dGz7Vn&#43;HnEukRAnlSV/WtUhVBYnGO9fJ4mHJXnDs2fZYarz0IT7pfkcxq0T6nrtlpaN951UknoWP9BV/wAXWtjbWlsIdLNncOxBDLtIXCsBxjJG8AkjOQeeDUHh23bVNeutSLOsUDBiytggHPX5SNu0NnOPzwC7UvN1DxkbeRg8dtIQAIljAUHONq8deM9TxmvtKEVhMKub7Ku/zZ8HiaksbjXy/adl6bI1rK2&#43;yaZBDjBVRn69T&#43;tXm&#43;aJW9KjI&#43;Q0&#43;H5oSPSvhKk3OTnLds&#43;8jBQgorZEoOQDTZFyKSM8bak6jP4VlsLZmeV8q4H91uDUL5ilHsa0LiHehwORyKoXPzKrdzWsXc6acuYmll&#43;ZCO/JqyBHcQtDKoaNxhgay5G4Q&#43;nFXbeT5QTRrG0luTVpJwszoPCXge3On&#43;ZqTJNCzkpEp4Iz1Y/0ruo4oLaBLe3iSKFBhUjUAAewFcp4bvXTfbBuD86A9PcV0PnEqGGcHt6GvtMBWjWoqp1e/qfA46hKlXcHt09B0v3uDXAfEXQbm8sYtV0/eLqzJJMZwxTvjHcfyrug245prg4PcHqK7TjPnf8A4SXX/wDoK3X/AH3R/wAJLr//AEFbr/vuvbf&#43;EX0X/oGQflR/wi&#43;i/wDQMg/KtOZEcsj5ev7KbTLryJJY2baG3RPkYP8AI&#43;x5qASyswUyOfYsa7X4siIeNSsShcW6bsDqeT/hXI2ce6UN2Arz3ZHRBOTSPaPh9cT3eiWzu2ETKMc&#43;lWXit7ZphbRiON5HkwPViST&#43;tY3gVprTQJg5G13JTB7GtWVsivnMyrKU1TXTc&#43;tyjDNJ1JehXDN5ob0obk57UvTmmr1K/jXnH0HmSdExT0GUAqInhqmiYKoz17UiJbExAUAd6AQoyaQc8n60mNxz2pGVijrUZm0i59lyPwOa5XTvD2o6rE0tr5TIrbTunRDnjHBIJySB0rtLqLzbOaPH3oyv6VT8Cx2zrdvNACYirGUS7W65VQNwBO5QeRxjqK&#43;q4fn&#43;5nHs/wA/&#43;GPkeJIWqwn3Vvuf/BKHhRybOeLP3JM/mP8A61XtduTa6TMQ2GceWv4//WzWf4dYQ6pfW2NpHVcg4wcdRx3qt4qut9zFbKeEG5vqen&#43;feuarhfaZry9NH&#43;H&#43;Z10sZ7PKOfrZr8bHQeGo20nwhPqM0KzbsyBVjwVx0y75TtkAAnmsfwyskgvL5hmRiVUnuep/pVHU9fj1DTordbL7PMmAZIpTtdQiqAVIz0QY5x145resLMx6CttgBnjOcjua9LOq3Jh1D&#43;Z/geVkVB1MQ6lvhX49CaTUVaOxkVwPOcgoTjPynj8Dipbea&#43;MzoIUC5IGe/P1riTJIF8tmY4YnB7HvXY6RqC3NrFIT&#43;8TCOPf/AOvXhYvBfV6alFXX9WPdwOPWJnKnLR/1cS7u57QxTz7UCygYXOWByD&#43;HIP4Vfs7xZp7hA4Yo5BAPIHHNZHiyRTbwIPvFy35D/wCvVPwv5n9oSv8AMQY/m54zkYz&#43;tQsLGeDdZ6Nf5iljJRxiodHb8jseMdazr4BSMdM5q5uxVC&#43;cNGcdV/wryobntUk&#43;Yo7t0RP&#43;1Vi2fgg1SgfdCwqe3bD1u1oztlHRm9p108Tq6thkPFdta3K3Ee9DxIu7HoR1rzq1fbIa6LSL8QXKK7YRjz7V25ZjPq9Xkl8L/DzPnM3wPtY88d0dVGecGpsZFUxIA&#43;M96sq4r69M&#43;PasO8sUeWKXf7Ub/aquSfJfia/Opa7NcG7N3kKBLjGcCmaIj3N9Haxf62VtqcdzWUDXo3w80TZG&#43;sTqMkFLcH06M39PzrysXXjRpOb&#43;R6GCpTr10lvuzr7Wzj06xitIznaPmY9WbuaJDUshy&#43;arufmr5G7k7vc&#43;8pQUUkhh6U0HEgP4UE/LQgypNUdHQXs3NSRkYG78KjP3TjvSg4cD0FMTVy0Gycdh1p67m5A47VDHgLlj&#43;HrVgAkAt8o7CoZzy0DacEZyaxvB8v2XWbyz854ZHwEAm8sOytwn3hnJOO/GeK3BgDgYrA0x0tPG0gIRnIcxq&#43;3l9u5eW4HOBmvf4fn&#43;8nDur/d/w58zxHC9GE&#43;z/Nf8ArxyQx&#43;NbponVo5S53B9wJI3E557g&#43;tUIbZNavtQuZpjFDGjOG25yeij26dfar/jZDa6/HMiLA0kbZCsp6MyfwkgHAGR2JqfT7c2XhYsDhro&#43;eSrEHahwoOD0yCRX0kMOlXdfq0l/X4HzU8U3hlQ7Nv/AC/U5yCyVtVjt0bzF3AlsYyOtd2pwBiuIsNQstOvHmvZ8SP90AFifU8V2UEqzRJIp&#43;VlDD6Gvmc&#43;qSnXStovz6n13D9KEMLe/vN3fp0MnWtIkmdrm2GWP31HU&#43;9Z&#43;jXiWckiSkjzMDOOhrrC6ou5mAA6kmqZs9KLG9Kw4Q7mk3/KD6nnFctHHXoujVTa6WNK&#43;X8uIWIoNJ9b7Gb4hf8A0a1jkVzIMndjt0q34Z042dq907EvcnOCc7QOnarU1zpstkLieWB4Fb5ZNwIB&#43;tX45Ynt4nhwYmQFNowMdsVlVxUnhlRUWtdf8i4YRfW3WbT00/zByVBqjdISGIP3lPFXJDlc&#43;tY098qShRIpI5Kk84z2rjpQlJ&#43;6etGUYLmk7FWylzuWrcLYastX8jUXT&#43;FvmX6Vfjf5q3lHqd26NGFsPWlG2UVgeRxWNE/Oc1qWbhhg9Otc1RHHXj1Oo0q6aSIRtyUHB9quahqkGkWFzfXTbYYULnHU&#43;w9yeK8117xJJoWt6V5T92edF/ijJAwf1/KrnxeuZo/DVkseRFLcYkI6HAJAP8/wr67LJzeFi5HwuYxisRJRKH/C5L3/AKBsP/fZo/4XJe/9A2H/AL7NeU&#43;bR5tdntGcFiTw7oz65rMFoM7Cd0rD&#43;FB1P&#43;e5r2lYIbW3igt0CQxKEVR2ArgPhmVS&#43;v0wNzRKwPcYPP8AMV307Mmdp4POK&#43;XzarKVb2b2R9XkdCKpe0W7I3OBnPNVnPepWcN7exqvIcV5sUfRQQn8P40ktxHAFRu9JvCJub61kz3H2m4wDwD1rWMOZmtrmurjbkGrEMDSjdjr3rCbXtPs5lt5ZcvkAKvPNPm1i6uv3VtEY09TVujPqrGXtIzbjBptbl3WdbttDjiAja6upW2RRIeM/X8qj0rVdVub8xahpht4yMiTdwPb3/CsvUdLlubBXWQC7hcSxFv7w7Vh3v26/wBQguLeyv1vhIrESNmJcentXXRoUp07aX1u3&#43;HU8rFOtSq8121pZLr36PX7jsrrxNAl9JZWltPeTxAlxEOF/GuSvdfW51qK/tA9vKm3lgMow71ZufDt1FrM13DFFdQTks0TStHgk56jqM1ma1plxY2sNzNHbR5crst1IA7jJPXoa9DLfq9KrFwerVjyczhiqlGXtI6Rd9unTX/g/JFu7vr3Vp4xdTmd1GxCAB1Oc8dSScknk1p6v57wQxqxQCNIlUdAqj3GevPXvVTw3pV/rdxI1pbpMUAaR5H2LGPUtkY/OtKax8rV2s5JkkZG2vJDIXXP&#43;ySO3SvoZzdOPtJPRK7PnqcKVWTowheUmlF9jnL7Tbiz1qxL3BVpdu1wvMfPP1xnNampLeDxTDprX9ykE8ahtr47c4HbJX9a6i60e0v7iF7iMsYuUIYjHT0&#43;lS3el2st7FeSQB54wAj5OR3/AK18hPMVNqUlrZ/e9j6&#43;GWezvCm7RbTWr2W6ZyHiNJLTVNOt5DvsUjVV85iEJHBLEd&#43;lWdEghGvSJDdWzxSoVmtrcO0ZUj&#43;8eP8AOK6mSCOeIxzRrIp6qwyKSCGK3TZDEka&#43;iKAKx&#43;u/uuS2trf8E6P7OXtfaX0vf/gb7HDX9tdWVyfDwJaGa5SSJ/8AZOR/h&#43;Rr0KNQltGiDCp8oHoKybXQI01IX1xdTXMyA&#43;X5h4Uc/wCNaoP7lvY1GLrxq8qj039QwOGlScnLq9PJf0x5yYT6g1hfYEEs9wtvulbKl&#43;SQBW6DhPrWTdSPDKCrYB5IrTLH&#43;&#43;5e6Mc4v9Vcl0aMye0keOK6jxjOAueRUqs6EK6Mp9xVqE7rH0Cua07WaCW3MNwgZSO/b3FdlXDJvTQywmcVIxXtFdfiZ0LHoeB6mtK2lWMFmYBAMsx4GK4HUPFA0nVbmzMBuFhcqsgO0ke4xWLq3i2&#43;1WE2yAW9u3DKpyW9ifSudZbVnKz0Xc68TnWFVNuLu&#43;1iTXNX/tjxDcXKMfK3bI/90cD8&#43;v417Z4dgtPEngG0tdSjWeFo9jBjyCpIBz1B4HNfPVvww6/hXqfhXVpIPDyQqThHbAz9DX0EXGhTSS0Wh8cuavVbe7Og/wCFV&#43;F/79z/AN/x/hR/wqvwv/fuf&#43;/4/wAKp/21P6tR/bU/q1Z/Wo/ym/1N9zzHwrqw0jVY7l/9UTslx/dPf8OD&#43;FetGWKVFIIKONyMOQa8p1Tw3Lo1t5xnWVHfbwuCOCaveGvFX2BV0/UCTaE/JJ3j/wDrfyrz8xwnt0qtPdHoZVjFh5&#43;wraJ9ex30pRRgMKqNIucEioZ5bVk8zzo3QjIdWHIrHN9pzX9vbeeczSBPk&#43;YjJx2ryKVCU3ZI&#43;tnWp0Yc85aG2Y1uobljIVjhiZyV5yQOleZXOu3k4KIwhU/3Op/GvaHt47SxNvBbRycY2O23f65NYh&#43;G9tqIS8itRaxMMlBLvOfQDFe7hsNTpR95XZ8bj81rV5vkk4x7HlFocXcJJ5Dgn869PggaGMbRkdq5C68H39hcJJJGyoHGQ6le9d/Gg2lfSubNZW5fmenw47QqX8v1KYjeRsuDircUCwoXI57VLGNhwRkVFcSF22LXjXb0PpL3diItk4rP8R2izaFMZBwuGA981FrWozaQsbRJG7MpJ357EDjH1rIn1S/1O3KufMfAKxRr945Ax&#43;v6V6uBwNWUo11ZRTv&#43;J4ua5nQpwnh3dtpr70Zeh&#43;JLvw/qa3MG4r0dQBkj2yDg&#43;9bnguae/ubqa5d3bdks3OSeaprY6qygnSmJOMAyJnn2zmp7Ke806aaMBrRxu3RlVOSoznPpX0GNgsTRdKnNXZ8hltdYXEKrUjor/kegDYB3JqThkrkorrVriVYhOqM3ALMqjpnr0ouLLxCq7v7SiVc4GLkZJ/Dp9TgV8&#43;sjqPXnX4n0s85pwdpRafmdKy4qM9a58aVrqyNG&#43;swbwcY&#43;0nHTPpXNXer6jDcSwG/mZkYplJTgkHHFaRyKp/Og/t&#43;ivss9IibDDNDgqJR6V56yahaz2xvri4IljEpUuwZRkjnPfjNdZ4bLSaayuxYq7qSxya5sZlbw1P2jlc6MHmscVV5FG2lzbgO&#43;IVk6qAjRE98/0rTs8q&#43;3tnFZniGOU2v7niQbgp9DXPl7tiY/P8h5uv8AZZr0/MrR6lpywCwNyv2t3z5fOcY9elQyTSRNgAkfWuEuEex1FGeUefw5Ibv1xXXQtNcQq/y/MoPWvfq03e6PmMPVSjaRxHiN2l1y6dyMlh27YGKywK1deTZrFwpxnIzg&#43;wrNUYrph8KOao7ydiaHqK7rwz9omsRBBE0rM5wqjPYVw0fXpXtHwy2L4bcgDzPOY574wKqUFNWYqU3CV0U/7I1X/n1P/fQ/xo/sjVf&#43;fU/99D/Guz3Gjcaz9hA6PrMzzXxGn2nRJwPvJhx&#43;B5/TNedSD2r0ty1wzQMh2uCp&#43;hrzm6tzBcSQvjcjFT&#43;BqMO7poMbG0kymVBqS3JjmR1OGUgg&#43;lIQB/8AXoXGa3OS57yLEXNvFcIwZZUDgn0IzXT6LFFc6fNZyfMg9G7H/wDVXNeHp47nwtppdyM2yLkjuBjv9K39HcWl4q72Kv8AKc&#43;/SubZm0ruOpqJpUCRLDvmZBwA8rN&#43;prgJI/Iu3Q9mKn869PYV53rEW3VLoY/5asfzOa8zM17sWe5w9O05x7pFGU7KjW6to&#43;qktU67Z0KP94VC1sIjnbXjq2zPqlZ6MltNAj1zU49RuIwbGCPaY26lg6nJGOn&#43;BrH1mcR3rw6NaopKKjyKm4qoUAEgjqQOnTvznj0KwjMfgxyi4d45CfzIrgNVvkiiexSFRIB5jSbs59AR04GOetfS0Xy0YQ6WufCY5qWKqS82jO04tbTyzXl5eTeUm4qkrHc3QLuzt6kY259&#43;Kktrs6rJLb31qkLGM7GiUkR5yMfgPz/Kqi3l1NIiz3DyHfkbzu6H3rp9N1ewkjuIbyKK5vLicsjLH8ytt69OgP6CteePTQ4rPqYTaJ4ocYj0ySSMcBgvDjkevINOXwz4yuQ2dNC9fvKmSD1HXoefzNdU3iLxTocEd3LpcFxoaFV8wHbJg4yevHzZHI9K1te8TagL7TLbQjbk3dqbndcYA24JGSTgdDXdTq&#43;6rIzqynOV5u55mdB8XRfe0mfcpJBVckEjHY&#43;lS6B4E1TU9Tla/tbiyCDzVdovlLbh8uK9L0rUvEEOmanfa&#43;ln5cMPmwtbMGDYDFs4J9BXPaLrPjPVbOC4XU9Jg8/JSOQornBI&#43;6QT2q3WfYix20ujreabBbTDIVzuyuSykMpHtwa5rUNJh0e&#43;WG3QpFIgYKe38P49M5969AUYUFuuOa5XxYR9ttW/2CP1ryM01w7Payd2xKS7M5hSVZgvXIx&#43;dTzQC4QhiAetCx4uT6EVI0ZkBUde1eBhZWrw9T6PMUpYafoc3qXhixuZvNnicsP4wcYqaPTre3iUK78dAxxWzIMKIWG1z65PFU2hcNyue2BzX1aPhGeX&#43;LI/L1&#43;YYwCqkfkKxBXR&#43;NIli8QOBgsY1JI7/wCeK50den61oiuhLGoJr2HwZDLp/h2xuV/5aBmYexY4/TFeRQqSQBnJ&#43;tfRNnpcVvotnarwY4ETPqQMGrUbhB2epjf2jceho/tG49DWl/Yp/vn86P7FP98/nT9ku7N/rE/5UcfaRO00bMOCRXC&#43;KbQ22szPghZGPT1B5/pXounQnGZWOfT0rznXbW4XxFqED3H7oM8sYduCcbsD3wa4MP8AEb4x3iYLD0FCBsj/ABqQgnqf8/hTTGVchgQR1BFdjPPR7L4MBu/B9nuBUx7k46HDGumhOxRuYgg4DEc1wXw61CdtCvdPiXfLHMkqFm4VSMED8QK7S6S7lsi0REcyEMBnIbHauaS1NlJtWOys7gXNssiqQvTPr6/rXHeIYtmsz/7W1v0Fbvhy8S5g8surMBuBU557is/xVFi&#43;il7PHj8j/wDXrgzGN6F&#43;zPTyWXLird0/8zmXjYHchww6U5bpSNsgw1TcFck9Khka3IyccV4O59infdHb6Q8M2iW8YIKlCCPxOa5HV7CaxvliJQKTuG5M&#43;Yo7Uln4gtdPgKXMjRpu&#43;RgpPXtxVu&#43;u/Dnie3sze6q8ZtWLIYztY5x1yM9q&#43;louFajHWzSPjsdg61OvJqLab7dznlSN7p18&#43;Mkt8qCBePUZKnNW7DS/OvhHbR2zXZQmMsirtPqSBnHNdEZ/B4kz9q69lLkU7RJPCegyXUlpfzO10waQyhmORnGPl96uNDX3nocv1et/I/uZyOo3ni8wWnhLUILVWuSqLJGQWkUNwTg8DjOcDofet3UdD8KjxHY2Gp6qfNhtFiFs7bFIUcZbsTknGea0v7R8MRa&#43;&#43;rrPPLesmwFo3IQYxwMccfzPrVXXZfC2utGb&#43;yuJ5lG1JI42VwOuMjr9K7OeK6mX1PEP7D&#43;4ydLsdNt/EeuaTZ3kh0SS1ZpmR96x8DJB5yRkj/8AVTLy38E2fhKeWC9R71VPllpCJWfsNmen4dK1tP13QPDlq8Njp9xErEB2aPLN6ZLH9Kxmm8FyX32w6A7S53cj5c/7u7b&#43;lJ1YrqXHLcVLaDO28I3V3c&#43;EtOmvdwmaMn5&#43;pXJ2k/8AAcVl&#43;IphPqKID/q1wfqaqXPxBg2eVaWMpkIwu8gBffAqoHaRjJIcuxySa8jNa69moLr&#43;h7WV4CrRqOpVVrbDzw6tU8C5uAMZ60zbmprTP2tMY79fpXi4f&#43;ND1R6eLf7ifo/yJJrKGSIuvDg/dA4NZ32U8ghM56lua3pkXyyUbb06VUezhcZIOR/tHmvrE7HxDVzx3x2V/wCEhCBQNkKg4OfU/wBa5tfp&#43;tbnjKeOfxVe&#43;WhURsIzn1UAH&#43;VYan2P4Gt4kvY3PCliNR8T6baspKPcJv8A90HJ/QGvocwpG3lMf3Tn5T/dNeN/Ce0W58ZJK6/LbwPJn0J&#43;X/2avc5rfchUpuU966IRuiL2KH2CT/nqKPsEn/PUVJ9km/vtR9km/vtV28h3fc8/t&#43;tebeLf&#43;Rvn&#43;qf&#43;givSbfrXm3i3/kb5/qn/AKCK8jD/ABHfi/gM/S/&#43;Qjb/APXVf51Wf/WN9as6X/yEbf8A66r/ADqs/wDrG&#43;tdzOA7n4af8hG&#43;/wCuA/8AQhXpv/LNvpXmXw0/5CN9/wBcB/6EK9N/5Zt9K5qnxGsdhvhP/l1/4HV/xd/y6f8AA/8A2WqHhP8A5df&#43;B1f8Xf8ALp/wP/2WuLG/7vI9DK/98h8/yZyU33DVB&#43;tX5vuGqD9a8CJ93S2M7V/&#43;PI/7wrMtO9aer/8AHkf94VmWnevXwf8AD&#43;ZFT4y8n3xXp1n/AMecX/YMrzFPvivTrP8A484v&#43;wZXo0up4ubbQLv/AC9y/wDXtD/N6ZL/AKtv&#43;uj/APopqf8A8vcv/XtD/N6ZL/q2/wCuj/8Aopq6EeFLf&#43;uxxXif/jws/wDfb&#43;S1za/drpPE/wDx4Wf&#43;&#43;38lrm1&#43;7XLV&#43;I&#43;oy7&#43;Avn&#43;ZDH/x/r/un&#43;Rrs06CuMj/AOP9f90/yNdmnQV42ZfZ&#43;Z1S3ZZHQVNaf8fkf4/yqEdBU1p/x&#43;R/j/KuLDfxoeq/M4cV/An6P8i/P/DUY/rUk/8ADUY/rX1jPikeJeLv&#43;Rs1L/rt/QViDrW34u/5GzUv&#43;u39BWIOtbxJkej/AAd/5GS//wCvI/8AoaV7hH/qxXh/wd/5GS//AOvI/wDoaV7hH/qxXVT2MpbBRRRWhmf/2Q==" alt="A photo of Geoffrey Hayward" width="225" height="225">

</div>

</div>
</div>
</div>



<div class="border-bottom bg-light shadow">
<div class="container-xl mt-3 mb-3 ">
<nav style="--bs-breadcrumb-divider: '>';" aria-label="breadcrumbs">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="/">Home</a>
</li>
<li class="breadcrumb-item active" aria-current="page">Geoffrey&#39;s Computing Blog</li>
</ol>
</nav>
</div>
</div>





<main class="container-lg py-5">
<div class="row g-4">

















<div class="col-12 col-sm-6 col-lg-4">
<div class="card h-100 d-flex flex-column">






<a href="/computing/configure-terraform-cloud-to-assume-an-aws-iam-role-via-oidc/">
<img
src="/computing/configure-terraform-cloud-to-assume-an-aws-iam-role-via-oidc/images/configuring-terraform-cloud-with-aws-oidc_hu52d04558bfc1413b9619457a5bfca1db_2066468_520x320_fill_box_center_3.png"
class="card-img-top img-fluid"
alt="A simple graph that says configure Terraform Cloud to assume an AWS IAM role via OIDC. "
width="520"
height="320"
loading="lazy"
>
</a>


<div class="card-body d-flex flex-column justify-content-between">
<div class="mb-3">
<h2 class="h4 card-title">Configure Terraform Cloud to Assume an AWS IAM Role via OIDC</h2>

<p class="text-muted">June 11, 2025</p>



<a href="/computing/" class="badge bg-primary text-decoration-none mb-2">Computing</a>


<p class="card-text">Here is how to configure Terraform Cloud to assume an AWS IAM role via OIDC (OpenID Connect) using only environment variables—no static AWS keys are required.</p>
</div>

<a href="/computing/configure-terraform-cloud-to-assume-an-aws-iam-role-via-oidc/" class="btn btn-success mt-3">Continue reading</a>

</div>
</div>
</div>


















<div class="col-12 col-sm-6 col-lg-4">
<div class="card h-100 d-flex flex-column">






<a href="/computing/responsible-ai-coding-what-ive-learned-so-far/">
<img
src="/computing/responsible-ai-coding-what-ive-learned-so-far/images/chatgpt-image-may-9-2025_hu6dcd35b0ada160e9f1449432698cf042_2762525_520x320_fill_box_center_3.png"
class="card-img-top img-fluid"
alt="Developer with laptop and friendly robot assistant outdoors, coding with Spring Boot."
width="520"
height="320"
loading="lazy"
>
</a>


<div class="card-body d-flex flex-column justify-content-between">
<div class="mb-3">
<h2 class="h4 card-title">Responsible AI Coding: What I’ve Learned So Far</h2>

<p class="text-muted">May 9, 2025</p>



<a href="/computing/" class="badge bg-primary text-decoration-none mb-2">Computing</a>


<p class="card-text">A whole new way of coding. When JetBrains offered me a trial of Junie, an AI assistant built into IntelliJ, I had to give it a go. I soon saw the potential, it’s kind of like an AI coding partner (albeit a little dumb at times), but that’s okay, if used responsibly. So here’s what I’ve learned about coding responsibly with AI—so far.</p>
</div>

<a href="/computing/responsible-ai-coding-what-ive-learned-so-far/" class="btn btn-success mt-3">Continue reading</a>

</div>
</div>
</div>


















<div class="col-12 col-sm-6 col-lg-4">
<div class="card h-100 d-flex flex-column">






<a href="/computing/running-ubuntu-in-virtualbox/">
<img
src="/computing/running-ubuntu-in-virtualbox/images/abstract-penguin_hu67780d8962699415443dbec889740de1_329683_520x320_fill_box_center_3.png"
class="card-img-top img-fluid"
alt="And abstract image of programming code surrounded by a light bulb."
width="520"
height="320"
loading="lazy"
>
</a>


<div class="card-body d-flex flex-column justify-content-between">
<div class="mb-3">
<h2 class="h4 card-title">Notes on Successfully Running Ubuntu in VirtualBox</h2>

<p class="text-muted">January 26, 2024</p>



<a href="/computing/" class="badge bg-primary text-decoration-none mb-2">Computing</a>


<p class="card-text">As a Software Developer who likes to use Ubuntu for Development but can sometimes only run it as just another window in Windows, I would like to share some nuanced VirtualBox configurations I built up over the years.</p>
</div>

<a href="/computing/running-ubuntu-in-virtualbox/" class="btn btn-success mt-3">Continue reading</a>

</div>
</div>
</div>


















<div class="col-12 col-sm-6 col-lg-4">
<div class="card h-100 d-flex flex-column">






<a href="/computing/setting-default-values-in-github-actions-workflows/">
<img
src="/computing/setting-default-values-in-github-actions-workflows/images/programming-code-surrounding-a-light-bulb_hu770c90c8b64a69e4d183a776faccd5af_947068_520x320_fill_box_top_3.png"
class="card-img-top img-fluid"
alt="And abstract image of programming code surrounded by a light bulb."
width="520"
height="320"
loading="lazy"
>
</a>


<div class="card-body d-flex flex-column justify-content-between">
<div class="mb-3">
<h2 class="h4 card-title">Setting Default Values in GitHub Actions Workflows</h2>

<p class="text-muted">October 20, 2023</p>



<a href="/computing/" class="badge bg-primary text-decoration-none mb-2">Computing</a>


<p class="card-text">GitHub Actions is a powerful platform for automating workflows and tasks in your software development process. When creating workflows, you often need to set default values for variables or parameters, especially when certain values are not always going to be provided. In this blog post, let’s explore two techniques to set default values in GitHub Actions workflows, including a handy <!-- raw HTML omitted -->! contains()<!-- raw HTML omitted --> approach and the double pipe <!-- raw HTML omitted -->||<!-- raw HTML omitted --> hack. We’ll also discuss the potential limitations of the double pipe hack.</p>
</div>

<a href="/computing/setting-default-values-in-github-actions-workflows/" class="btn btn-success mt-3">Continue reading</a>

</div>
</div>
</div>


















<div class="col-12 col-sm-6 col-lg-4">
<div class="card h-100 d-flex flex-column">






<a href="/computing/triggering-a-github-actions-workflow-with-a-slack-slash-command/">
<img
src="/computing/triggering-a-github-actions-workflow-with-a-slack-slash-command/images/_hud6addc6c40aa074591337ef15f096a9b_1093409_3f00ff298749796ea9acc1a62ffd1fad.png"
class="card-img-top img-fluid"
alt="A post style illustration of a slack slash command that shows an Octocat"
width="520"
height="320"
loading="lazy"
>
</a>


<div class="card-body d-flex flex-column justify-content-between">
<div class="mb-3">
<h2 class="h4 card-title">Triggering a GitHub Actions Workflow with a Slack Slash Command</h2>

<p class="text-muted">May 10, 2021</p>



<a href="/computing/" class="badge bg-primary text-decoration-none mb-2">Computing</a>


<p class="card-text">In this post I am going to show how you can trigger a <!-- raw HTML omitted -->GitHub Actions<!-- raw HTML omitted --> workflow with a Slack Slash command.</p>
</div>

<a href="/computing/triggering-a-github-actions-workflow-with-a-slack-slash-command/" class="btn btn-success mt-3">Continue reading</a>

</div>
</div>
</div>


















<div class="col-12 col-sm-6 col-lg-4">
<div class="card h-100 d-flex flex-column">






<a href="/computing/serving-static-assets-from-bloomreach-cms/">
<img
src="/computing/serving-static-assets-from-bloomreach-cms/images/hippo_hu757f65a653ebf2063b5b1c0ff8bb7c85_2134978_520x320_fill_box_center_3.png"
class="card-img-top img-fluid"
alt="An abstract illustration, featuring a stylized file icons with a mini hippo design prominently displayed."
width="520"
height="320"
loading="lazy"
>
</a>


<div class="card-body d-flex flex-column justify-content-between">
<div class="mb-3">
<h2 class="h4 card-title">Serving Static Assets from Bloomreach CMS</h2>

<p class="text-muted">June 19, 2019</p>



<a href="/computing/" class="badge bg-primary text-decoration-none mb-2">Computing</a>


<p class="card-text">Serving a static files with Bloomreach (formally known as Hippo CMS), such as BingVerify.xml, is not as simple as dropping it in the webapp folder. However, with a little extra configuration Bloomreach CMS will serve the file.</p>
</div>

<a href="/computing/serving-static-assets-from-bloomreach-cms/" class="btn btn-success mt-3">Continue reading</a>

</div>
</div>
</div>


















<div class="col-12 col-sm-6 col-lg-4">
<div class="card h-100 d-flex flex-column">






<a href="/computing/java-junit-reset-a-singleton/">
<img
src="/computing/java-junit-reset-a-singleton/images/junit-reset-a-singleton_hu4c5bb5c477df1a75419433dc580e8bb1_1373945_520x320_fill_box_center_3.png"
class="card-img-top img-fluid"
alt="Illustration of Java code resetting a singleton in a JUnit."
width="520"
height="320"
loading="lazy"
>
</a>


<div class="card-body d-flex flex-column justify-content-between">
<div class="mb-3">
<h2 class="h4 card-title">Java JUnit: Reset a singleton</h2>

<p class="text-muted">February 28, 2018</p>



<a href="/computing/" class="badge bg-primary text-decoration-none mb-2">Computing</a>


<p class="card-text">Java singleton’s are hard to unit test because the state of the singleton is altered as each test runs. But for testing sake you can reset the singleton’s state use reflection. Here is an example that worked for me.</p>
</div>

<a href="/computing/java-junit-reset-a-singleton/" class="btn btn-success mt-3">Continue reading</a>

</div>
</div>
</div>


















<div class="col-12 col-sm-6 col-lg-4">
<div class="card h-100 d-flex flex-column">






<a href="/computing/java-stream-api-arraylist-to-jsonarray/">
<img
src="/computing/java-stream-api-arraylist-to-jsonarray/images/java-stream-api-arraylist-to-jsonarray_hu9ea289fc5bd53289fa9326258a1fe765_1479169_520x320_fill_box_bottom_3.png"
class="card-img-top img-fluid"
alt="Illustration of Java code converting an ArrayList to a JsonArray, displayed on a simple and clean background."
width="520"
height="320"
loading="lazy"
>
</a>


<div class="card-body d-flex flex-column justify-content-between">
<div class="mb-3">
<h2 class="h4 card-title">Java Stream API: ArrayList to JsonArray</h2>

<p class="text-muted">February 3, 2017</p>



<a href="/computing/" class="badge bg-primary text-decoration-none mb-2">Computing</a>


<p class="card-text">You can convert an ArrayList to a Java EE JsonArray using a Java Stream in the following way.</p>
</div>

<a href="/computing/java-stream-api-arraylist-to-jsonarray/" class="btn btn-success mt-3">Continue reading</a>

</div>
</div>
</div>


















<div class="col-12 col-sm-6 col-lg-4">
<div class="card h-100 d-flex flex-column">






<a href="/computing/wildfly-removing-a-failed-deployment-with-jboss-cli/">
<img
src="/computing/wildfly-removing-a-failed-deployment-with-jboss-cli/images/a_huc6f0f2cd1f9eb99ca0c7608505059d7d_2964702_d32468030c74cf7787340bad4c3da544.png"
class="card-img-top img-fluid"
alt="Humorous illustration of a server mascot panicking while removing a failed deployment with JBoss CLI, with error messages flying around."
width="520"
height="320"
loading="lazy"
>
</a>


<div class="card-body d-flex flex-column justify-content-between">
<div class="mb-3">
<h2 class="h4 card-title">WildFly: Removing a Failed Deployment with JBoss CLI</h2>

<p class="text-muted">September 5, 2016</p>



<a href="/computing/" class="badge bg-primary text-decoration-none mb-2">Computing</a>


<p class="card-text">I was having trouble working out how to remove the WAR file of a failed deployment from WildFly using the JBoss CLI. I found that I could not simply type <!-- raw HTML omitted -->undeploy &lt;WAR name&gt;<!-- raw HTML omitted --> to remove a failed deployment from WildFly using the JBoss CLI. However, I did find that the following command let me remove a failed deployment and it’s WAR file.</p>
</div>

<a href="/computing/wildfly-removing-a-failed-deployment-with-jboss-cli/" class="btn btn-success mt-3">Continue reading</a>

</div>
</div>
</div>


















<div class="col-12 col-sm-6 col-lg-4">
<div class="card h-100 d-flex flex-column">






<a href="/computing/find-the-context-path-with-jsf/">
<img
src="/computing/find-the-context-path-with-jsf/images/find-the-context-path-with-jsf_huf4afd298b3488c62c5e26a4cc9af3215_1104355_520x320_fill_box_center_3.png"
class="card-img-top img-fluid"
alt="Illustration of a laptop displaying Java code related to finding the context path with JSF, set against a web development-themed background."
width="520"
height="320"
loading="lazy"
>
</a>


<div class="card-body d-flex flex-column justify-content-between">
<div class="mb-3">
<h2 class="h4 card-title">Find the Context Path with JSF</h2>

<p class="text-muted">September 22, 2015</p>



<a href="/computing/" class="badge bg-primary text-decoration-none mb-2">Computing</a>


<p class="card-text">Sometimes JSF does not have a component that will produce a particular type of HTML element. That’s not a problem but, I always forget the three method deep route to the context path. I always find I have to work through an IDE’s code completion tool to find the application’s path.</p>
</div>

<a href="/computing/find-the-context-path-with-jsf/" class="btn btn-success mt-3">Continue reading</a>

</div>
</div>
</div>


















<div class="col-12 col-sm-6 col-lg-4">
<div class="card h-100 d-flex flex-column">






<a href="/computing/how-to-store-variables-in-jsf-facelets/">
<img
src="/computing/how-to-store-variables-in-jsf-facelets/images/store-variables-in-jsf_hubc07c3f98fb7f8e2431f3ce9c2b83c49_218745_520x320_fill_q75_box_bottom.jpg"
class="card-img-top img-fluid"
alt=""
width="520"
height="320"
loading="lazy"
>
</a>


<div class="card-body d-flex flex-column justify-content-between">
<div class="mb-3">
<h2 class="h4 card-title">How to Store Variables in JSF Facelets</h2>

<p class="text-muted">September 7, 2015</p>



<a href="/computing/" class="badge bg-primary text-decoration-none mb-2">Computing</a>


<p class="card-text">JSF Facelets can store the returned value yielded from a call to an EJB. Doing so will mean the EJB does less work.</p>
</div>

<a href="/computing/how-to-store-variables-in-jsf-facelets/" class="btn btn-success mt-3">Continue reading</a>

</div>
</div>
</div>


</div>
</main>



<footer class="mt-5">

<div class="border-top bg-light">
<div class="container-xl pt-3 pb-2">
<div class="col text-center">
<figure>
<blockquote class="blockquote">
<p>To give anything less than your best, is to sacrifice the gift.</p>
</blockquote>
<figcaption class="blockquote-footer">
American long-distance runner <cite title="Steve Prefontaine">Steve Prefontaine</cite>
</figcaption>
</figure>
</div>
</div>
</div>

<div class="border-top">
<div class="container-xl">
<div class="d-flex flex-wrap justify-content-between align-items-center py-3 my-2">
<ul class="nav col-12 col-md-4 justify-content-md-start list-unstyled d-flex flex-column flex-md-row">
<li class="mb-2"><span class="text-muted">© 2025 Geoffrey Hayward</span></li>
</ul>
<ul class="nav col-12 col-md-8 justify-content-md-end list-unstyled d-flex flex-column flex-md-row">
<li class="ms-md-3 mb-2"><a title="Strava" class="text-muted text-decoration-none" href="https://www.strava.com/athletes/geoffreyhayward"><i class="bi bi-strava"></i> Strava</a></li>
<li class="ms-md-3 mb-2"><a title="Run Britain Profile" class="text-muted text-decoration-none" href="https://www.runbritainrankings.com/runners/profile.aspx?athleteid=1125135"><i class="bi bi-clipboard2-fill"></i> <strong>run</strong>britain</a></li>
<li class="ms-md-3 mb-2"><a title="Instagram" class="text-muted text-decoration-none" href="https://www.instagram.com/geoffrey.run/"><i class="bi bi-instagram"></i> Instagram</a></li>
<li class="ms-md-3 mb-2"><a title="Youtube" class="text-muted text-decoration-none" href="https://www.youtube.com/@GeoffreyRun"><i class="bi bi-youtube"></i> Youtube</a></li>
<li class="ms-md-3 mb-2"><a title="GitHub" class="text-muted text-decoration-none" href="https://github.com/GeoffreyHayward"><i class="bi bi-github"></i> GitHub</a></li>
<li class="ms-md-3 mb-2"><a title="RSS" class="text-muted text-decoration-none" href="/index.xml"><i class="bi bi-rss-fill"></i> RSS</a></li>
<li class="ms-md-3 mb-2"><a title="Cookie Settings" class="text-muted text-decoration-none" href="javascript:window.cookiehub.openSettings()"><i class="bi bi-gear-fill"></i> Settings</a></li>
</ul>
</div>
</div>
</div>

</footer>




<script defer="defer" src="https://geoffrey.run/js/combined.min.e103ba779b582ce3f06d1b248431a1da8bda97820c64843e41dc83398f80fe5e.js"></script>

</body>
</html>

Ads.Txt Alerts - A trading name of Red Volcano Limited

Waterloo Buildings, Second Floor Rear, 53 London Road, Southampton, Hampshire, United Kingdom, SO15 2AD

© Red Volcano 2020. All Rights Reserved.