Blog
Setting Up a Model Context Protocol (MCP) Remote Server in VSCode
#model context protocol#mcp#vscode#c##mcp remote server
This guide walks you through the process of connecting a Model Context Protocol (MCP) remote server to Visual Studio Code (VSCode)
April 23, 2025
Prompts
#prompts#prompt engineering#ai#vscode
This post explains what prompts are in the context of GitHub Copilot Chat
April 18, 2025
What is the Inner Loop?
#ci#continuous integration#clean code#code quality#Inner-loop
This post explores the concept of the Inner Loop in software development, emphasizing its importance in enhancing productivity, reducing feedback delays, and improving code quality. It provides practical examples and tools to optimize the inner loop, ensuring a more efficient and enjoyable development process. What is the Inner-loop? The “Inner Loop” in software development refers to the set of activities and processes a developer repeatedly goes through while writing, testing, and debugging code in the development phase, before committing changes to a version control system. This loop typically includes writing code, compiling, running, testing locally, and debugging. The goal of optimizing the inner loop is to maximize developer productivity and satisfaction by making these activities as efficient and frictionless as possible.
July 6, 2024
Shortcode - An image with a caption
#shortcode#caption#html#hugo#image
I had an article I wanted to post but knew with the number of images I planned on including, it will look unsightly. The first idea I had to make it less so, was to indent the image to break up the page a little. The next idea I had was to include a caption under each image. Knowing that HTML has an element called figure, I decided to use this. I didn’t want anything complicated so I planned to keep the code to a minimum.
February 26, 2024
.NET Aspire and Redis
#.net aspire#azd#blazor#csharp#devex#dependency injection#nuget#redis
First look into .NET AspireTL;DR: See here for why AZD is not yet supported. I decided to give .NET Aspire a try. I’m yet to watch an online tutorial but I did watch its announcement a few months ago. At the time I did think YAGNI. For me, it didn’t make much sense. Either that, or it just wasn’t being explained well enough. Enthusiasm alone isn’t enough to promote a new tool. Since then, I’ve seen many tweets. So, over the last month or so, I’ve gradually grasped its raison d’être.
February 25, 2024
The 3rd Wave of Cloud Computing
#wasm#wasi#compute#docker#component model#sustainability#sustainability transformation
That’s quite an opening statement, isn’t it? As a reminder, the 1st and 2nd waves were Virtual Machines and Containers, respectively. Warning, profound statement inbound… 🌐 The Docker cofounder, Solomon Hykes, said this in 2019 “If WASM+WASI existed in 2008, we wouldn’t have needed to create Docker. That’s how important it is. WebAssembly on the server is the future of computing.” - Quote I think we need to let this sink in for a few moments. IMO, this is huge. Personally, since 2016, most of my DevOps [development & orchestration] work has involved containers. Container and FaaS is my preferred approach to development and orchestration. But now there’s a new way? Will I now have to throw out all this knowledge and return to ground zero and start over? In short, no. Anyways, back to this 3rd wave…
February 5, 2024
Compare Resources From Terraform Plan
Here’s a link to a repo I created today, that will be used to host examples of all challenges I encounter that relate to Terraform. In this particular sample, I need to list out all those resources that will be created using Terraform where we do not have a state file. The product of this will be added to sheets, by Resource Group, in an Excel spreadsheet. Each sheet is an Azure Resource Group. The rationale for this is that at some point an apply was executed, and due to the state not being managed, we do not know if the current config matches with what has been deployed.
February 4, 2024
Error NETSDK1045
#error#visual studio#vs#vs2019#.net#sdk
Error NETSDK1045 The current .NET SDK does not support targeting .NET 6.0Error A colleague had Visual Studio shout this (see 👇) at him when he loaded up a FunctionsApp project. He received this error twice as the second project was the unit tests for the FunctionsApp. Caution
September 28, 2022
How to Write Clipboard to File
#clipboard#powershell#Microsoft.PowerShell.Management
Have you ever wondered how to persist your clipboard to disk? Wonder no more… To get started, copy a random sentence into your clipboard like so: Set-Clipboard -Value "This is being copied into clipboard" Let’s confirm the contents of the clipboard, like so:
September 26, 2022
How to Conditionally Include a Nuget Package
#azure#functionsapp#selenium#chromedriver#docker#nuget#linux#runtime identifier
The contextI have implemented a solution that as it’s primary objective iterates through a sequence of HTTP Requests and page interactions. With sequencing through these steps regularly it gives the support team the maximum amount of time to react to an outage. This outage can be isolated to this particular service, or can originate from any of it’s downstream dependencies. To help with the automation of these steps, I’m using Selenium and in particular, it’s headless browser capability in conjunction with ChromeDriver. With this combination, I can navigate within a Chrome browser, provide alphanumerical inputs and execute mouse clicks, all by using imperative code.
September 21, 2022
.NET Stack, Heap and Boxing
#csharp#.net#stack#heap#allocations#gc#boxing
This week I have been investigating how to reduce memory allocation in a few HTTP APIs. I won’t go into any explicit work-related examples here but I will touch on facets relating to this effort. Let’s start off by looking at Reference Types and Value types and how they get allocated into the Heap. I will also touch on concepts such as boxing and GC pressure. Let me start off with some facts:
February 4, 2022
The Grass Is Rarely Greener
#azure#aws#empty promises#building relationship#willing#attrition#managed service
I recently had a conversation that stirred up some surpressed memories. The conversation was related to moving to a different cloud vendor. That journey didn’t work out so well for me and the company I was working for at the time. Sadly, that company stopped trading and I don’t think it’s that much of a leap to link that journey to the demise of that company. Hopefully, now the title of this post is starting to make more sense?
January 30, 2022
Nodejs Install E401
#nodejs#e401#azure functions#npm feed#upstream feed#typescript
Today I created a simple nodeJS Azure Functions Applicaiton to start building out a PoC and when I tried to install it’s dependencies like so: npm install I got this little cherub back instead:
January 22, 2022
Kubernetes Pod Disruption Budget and the Helm hasKey Function
Pod Disruption BudgetWhen working with Kubernetes, one crucial component of configuration is known as a PDB (Pod Disruption Budget). A PDB will ensure your workload remains running when you work through a Voluntary Disruption. What on earth is a Voluntary Disruption? A Voluntary Disruption is when you trigger an action that causes the disruption. For example, if you wish to upgrade a Minor AKS version or any action that recycles a Node Pool. Click here ➡ Disruptions to read up on what Disruptions are.
January 21, 2022
Adding more Github Self-Hosted Runners
#github self-hosted runner#linux#issue
Adding more GitHub Self-Hosted RunnersTo help build out our numbers of GitHub Self-Hosted Runner, we took a shortcut and had cloned an existing Linux VM. Unfortunately, the by-product of doing this resulted in (a) the clonee (source) Linux VM had their Self-Hosted hijacked by the new VM and (b) we had a Runner registered in GitHub that didn’t actually have a running runner - Offline 🤪. Madness! Ok, so what to do?…
January 18, 2022
Hybrid Origins Http Traffic
#cloudflare#dns#uri forwarder#page rules#zones#domain#hostname
We’re migrating our on-premise workloads to Azure. This has presented several challenges. One of which is what I am covering specifically here in this post and that is … How to reduce code change effort? This isn’t about updating runtimes, this is about having workloads spread across different platforms that need to talk to each other (with some HTTP chaining 👀). It is not uncommon for one HTTP API to need to talk to another HTTP API. If you move one HTTP service to run in different zone, you will need update references in those ALL dependant services so they point to that new DNS Hostname. This isn’t a big issue if you’ve only few HTTP APIs. However, if you’ve 100+ HTTP APIs that you’re migrating, including many with several HTTP dependencies, then this quickly becomes daunting and a potential PR approval and deployment (multiple environments) scheduling nightmare. A simple domain name search in your organisation’s Github account will illuminate my point.
January 15, 2022
K8s Selectors and Labels
#kubernetes#k8s#deployment#pod#replicaset#selectors#equality-based#set-based#kubectl
Right, what’s the deal with all the labels and metadata in a Deployment manifest?!!!! Take this example: apiVersion: apps/v1 kind: Deployment metadata: namespace: default name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx foo: baa template: metadata: labels: app: nginx foo: baa spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 Here, we see metadata twice, and also there’s mention of matchLabels in selector??? What does it all mean???
January 15, 2022
Azure Defender for Cloud
#azure#defender for cloud#cicd#cve#github actions#windows containers
Defender for Cloud ContainersSetting up Defender for Cloud Containers to work with your CICD pipeline is quick and uncomplicated. I do not walk through these set up steps in this post. For that, you can follow those few steps here in this Microsoft post instead ➡ Setup. The goal of this post is to highlight a few areas of interest and to share my opinions on this feature. I have understandably obfuscated sensitive information.
January 15, 2022
Npm E401 and CERT_NOT_YET_VALID
#github actions#npm#nodejs#e401#cert_not_yet_valid#docker#acr#npmrc#GH Secrets
Today a PR Merge resulted in a GHA failure. Sadly, this is not the only CICD pipeline to fail this year! This particular pipeline builds a NodeJS Image, pushes the image to ACR and deploys the service to a production Docker Swarm (on merge to main). This was the error: 🚫 [3/7] RUN npm install:
January 11, 2022
Github Action Workflow Starter
#github action workflow#starter#cruft#azure devops#bamboo#github plans
In this post, I share practical insights on how to simplify and streamline your CI/CD processes using GitHub Actions. The focus is on reducing complexity, minimizing effort, and making it easier for teams to adopt new workflows with less cognitive overhead. Background During our migration from on-premise infrastructure to Azure, I had the opportunity to revisit and redesign our CI/CD pipelines. My guiding principle throughout this process was to keep things as simple as possible, always returning to first principles when evaluating tooling and process changes. GitHub Actions emerged as a strong candidate for our needs, offering flexibility and ease of use.
January 9, 2022
Github Actions Workflow Env Vars
#github actions#linux#windows#syntax#self-hosted runner#environment variables#workflow#cicd
In my current role as Head of Cloud Platform, I am leading the technical effort of migrating our entire on-premise real-estate to Azure. Part of this mission, is to upgrade the runtimes of our applications, regardless of their current placement; IIS Web apps, Windows Services and Docker Swarm containers. I say “part of this mission” as another aspect of this migration is to create a new foundation for our platform - AKS. I hope to cover more on this in later posts.
January 8, 2022
Runtimes
#.net framework#.net core#.NET 6.0#.NET 3.1#end-fo-life support#linux#windows#syntax#self-hosted runner#cicd#microsoft fasttrak#code quality#image scanning#licensing#cve#nuget#npm
In my current role as Head of Cloud Platform, I am leading the technical effort of migrating our entire on-premise real-estate to Azure. Part of this mission, is to upgrade the runtimes of our applications, regardless of their current placement; IIS Web apps, Windows Services and Docker Swarm containers. I say “part of this mission” as another aspect of this migration is to create a new foundation for our platform - AKS. I hope to cover more on this in later posts.
January 8, 2022
Permission Denied While Trying to Connect to the Docker Daemon Socket
#docker#linux#github actions#GHA#Self-Hosted Runner#dotnet#Azure Container Registry#ACR#containers#pods
Out of the blue today, my first day back after Christmas break, I got this when running a GH Actions Workflow on one of our Self-Hosted Linux Runners 😱: 🚫 Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get “http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied ℹ️ We have several GitHub Self-Hosted Runners running on Linux and Windows O/S that produce, amongst other artefacts, Linux and Windows images. These images are pushed to ACR. We’re in the process of migrating our on-premise real-estate - IIS Web apps, Windows Services, Docker swarm containers - to AKS as well as migrating our SQL Server AG to Azure. We’re using Self-Hosted Runners as we have spare compute capacity and some of our applications have a dependency on a legacy NuGet server which requires our CI pipelines to run in our network. We are in the process of also migrating these legacy packages to our Azure DevOps NuGet Feed as part of our modernization initiative. This modernization initiative encompasses upgrading our runtimes to .NET Framework 4.8 and .NET 6.0. It had been running fine prior to my break so what gives? I started to investigate…
January 7, 2022
My First Outing With Dapr
#dapr#kubernetes#redis#secret store csi driver#aks#nestjs#keda
TL;DR: Not as forgiving as I’d have liked … ℹ️ I was a speaker at a meet-up in Manchester in late 2020. I spoke about Dapr, Keda and the NestJS Framework. My talk topic was on “Writing less code - let your architecture and abstractions help with your *-cases”. The * in the title is a wildcard for use/edge/corner.
November 6, 2020
How to Use Kubernetes Configmap
#kuberetes#configmap#cm#kubectl#secrets#best practice
There’s a ton of material out there on how to use a ConfigMap. In this post I will provide a recap on the basics then I drill into how to protect your secrets! There are a few ways to create a configMap. Here, I cover just two of these ways;--from-env-file and –from-literal. I won’t cover options like from volume. How to create a ConfigMap from a literal To create a configMap from literals and from the command line, you would type this:
November 2, 2020
Nodejs Container Restart Policy
#nodejs#cluster#docker#docker-compose#resilience
If by accident to deploy a solution using the Node.js Cluster API and do not fork exited processes then the following docker-compose restart_policy will not help you: docker-compose.ymldeploy: restart_policy: condition: on-failure If you’re using the Cluster API to schedule tasks across your processes, and all forked processes die, then the docker engine will just assume you’ve gracefully shutdown.
September 21, 2020
How to run the Apache Ignite Agent with an Ignite.NET Core Server Node
#apache ignite#ignite#gridgain#data grid#Ignite.NET
I’ve recently been researching into Apache Ignite. Apache Ignite is an in-memory, memory-centric, distributed database, caching and processing platform for transactional, analytical, and streaming workloads. So why the post? Well, with using .NET Core, I have run into one or two challenges that I have had to work through. One of which involves the Agent. I feel it is important to share with you how I get beyond this issue. It may save you a lot of time if you’re an Apache Ignite noob like me.
July 28, 2020
Terraform Get Values
With not wanting to have hard coded values pushed to a project’s code repository, and an antiquated way to derive Azure Service Principal credentials, I set about exploring ways on accomplishing this with this in mind using Terraform. Attempt 1 Here ins my first attempt, I load all permutations into map variables. I use an environment variable as an indexer to the appropriate map value: provider "azurerm" { version = "=2.17" ... subscription_id = var.azure_subscription_id[var.environment] client_id = var.azure_client_id[var.environment] ... } variable "azure_subscription_id" { type = map default = { "dev" = "********-****-****-****-************" "prod"= "********-****-****-****-************" } } variable "azure_client_id" { type = map default = { "dev" = "********-****-****-****-************" "prod"= "********-****-****-****-************" } } ... Attempt 2 This second and more efficient approach, I used jsondecode function to load the entire credentials JSON to access the subscriptionId property:
July 23, 2020
Digital Certificates
#ssl#openssl#digital certificate#digital signature#key pairs#keys#signing#hash#encryption#sso
I’ve been wanting to put some notes down on digital certificates, signing and JWT for some time now. I find there are plenty of confusing terms involved in this area, plus a few nuances that have added to my personal confusion. I feel it now important to document these before I forget and move on [to another project]. So, what’s triggered this post? Well, one of many tasks I’m involved in [juggling] evolves SSO (single sign on). Albeit, mainly focused on the architecture on this task, I have compiled a few PoCs where I’m using digital certificates for authentication. In particular, SSOing into Twilio Flex and using an identity field returned from their I.AM service, to seamlessly log into our internal CRM, securely using a digital certificate.
June 8, 2020
Unit testing and mocking fs.ReadFileSync
#jest#unit testing#twilio#rabbitmq#twilio taskrouter#mssql#sync#twilio sync#taskrouter
I’d just ran npm run test in a newly created package I’d added to a monorepo (lerna) I’d created for a project I was working on that integrates with Twilio Sync, RabbitMQ, Twilio TaskRouter and MSSQL, and I go this: *******************************consumers\packages\eda [CRMBROK-233 +0 ~2 -0 !]> npm run test > @cf247/eda@1.0.2 test *******************************consumers\packages\eda > jest FAIL __tests__/eda.test.js ● Test suite failed to run ENOENT: no such file or directory, open '.env' 2 | const fs = require('fs') 3 | const dotenv = require('dotenv') > 4 | const envConfig = dotenv.parse(fs.readFileSync(`.env`)) | ^ 5 | for (const k in envConfig) { 6 | process.env[k] = envConfig[k] 7 | } at Object.<anonymous> (lib/setenv.js:4:35) at Object.<anonymous> (lib/eda.js:1:1) Test Suites: 1 failed, 1 total Tests: 0 total Snapshots: 0 total Time: 1.772 s Ran all test suites. npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! @cf247/eda@1.0.2 test: `jest` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the @cf247/eda@1.0.2 test script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above. npm WARN Local package.json exists, but node_modules missing, did you mean to install? npm ERR! A complete log of this run can be found in: npm ERR! *******************************\npm-cache\_logs\2020-05-28T08_04_32_271Z-debug.log *******************************consumers\packages\eda [CRMBROK-233 +0 ~3 -0 !]> Not great but hey, first run and all!
May 28, 2020
Hugo Shortcodes - my first try
My first attemptHere’s my first effort at creating a shortcode. This shortcode is available here Information Basic {{< note Sample text >}} Sample text With italics {{< note italic=“true” Sample text >}}
April 6, 2020
Kubernetes on Windows
#blogging#kubernetes#setup#windows#containers#pods#services#azure#aws#gcp
This post is a reminder to me of what needs to be installed in order for a pod, created from a local image, that is to be served up via a kubernetes cluster, to be run from your local development environment. What is Kubernetes and why is it so important? “Kubernetes is a portable, extensible, open-source platform for managing containerized workloads and services, that facilitates both declarative configuration and automation. It has a large, rapidly growing ecosystem. Kubernetes services, support, and tools are widely available.”
April 6, 2020
Modern-ish Javascript
#javascript#destructuring#arrow functions#typescript#class#babel#decorator
This post includes a few notes on ECMA language features that I like as well as some info on memory leaking. I have no doubt that it will read disjointed; I started this eons ago and only now have I decided to publish it. A simple reminder of what Node.js is …it is a set of APIs wrapped around the V8 Engine (written in c++) and is a high-performance JavaScript and WebAssembly engine.
April 5, 2020
How do I mentor?
#Hugo#blogging#mentoring#The Manager's Path#Heisenberg Effect
I have written this post to document my experiences of mentoring. I have mentored front-end engineers, back-end engineers and UX designers. I have had the pleasure of helping others as well as learning one of two things about myself along this journey too. If ever you get the opportunity to be a mentor, I recommend you jump at the opportunity. It is a self-rewarding experience. So, what is mentoring?… The definition of Mentoring is the act of advising or training (someone, especially a younger colleague).
March 26, 2020
Good Engineering - Principles
#Hugo#blogging#good engineering#principles
I have written this post as a method to document what I see as the basics, foundations if you will, for good engineering. Undoubtedly if you are a seasoned engineer, you will recognised all of these principles, less so, if you’re just starting out. Most Engineers are fully versed in the foundations of writing quality, efficient, succinct and testable code. As a Principal Engineer, one of my responsibilities is to ensure that these (1) foundations are recognised by the engineers and (2) are adhered to by all engineers.
March 1, 2020