<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Development on scarbrough.co.uk</title>
    <link>/tags/development/</link>
    <description>Recent content in Development on scarbrough.co.uk</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 21 Jul 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="/tags/development/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Rewriting Azure Functions for .NET 10</title>
      <link>/post/reworking-azure-function-apps/</link>
      <pubDate>Tue, 21 Jul 2026 00:00:00 +0000</pubDate>
      <guid>/post/reworking-azure-function-apps/</guid>
      <description>It seemed like a strange request, when a colleague asked me to look into upgrading our Function Apps to use .NET 10, &amp;lsquo;isolated worker&amp;rsquo;. Since when was it possible to change their runtime version ourselves? And what on God&amp;rsquo;s Green Earth was an &amp;lsquo;isolated worker&amp;rsquo;? It was time to investigate.&#xA;There are a couple of important things to remember about Function Apps, as a starting point. Firstly, my colleagues and I had developed Function Apps exclusively as custom Logic App components, to handle more cumbersome data transforms.</description>
    </item>
    <item>
      <title>Vim as a code editor</title>
      <link>/post/vim-developer-environment/</link>
      <pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate>
      <guid>/post/vim-developer-environment/</guid>
      <description>In the last post, I covered some very basic stuff for editing text in Vim. There are a few more advanced features I picked up while using it as an actual code editor.&#xA;Basic keybindings Use &amp;lsquo;Esc&amp;rsquo; key to enter visual mode.&#xA;Select text, use &amp;lsquo;v&amp;rsquo; and &amp;lsquo;Ctrl+Right&amp;rsquo; Cut text: &amp;lsquo;d&amp;rsquo; Copy text: &amp;lsquo;y&amp;rsquo; Paste text: &amp;lsquo;p&amp;rsquo; Line numbers Either use the :set number command, or add it to /etc/vim/vimrc.</description>
    </item>
    <item>
      <title>Breaking my VS Code habit with Vim</title>
      <link>/post/going-back-to-vim/</link>
      <pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate>
      <guid>/post/going-back-to-vim/</guid>
      <description>Microsoft earned itself the rather descriptive name &amp;lsquo;Microslop&amp;rsquo; in recent months, on account of having infested virtually all its products with &amp;lsquo;AI&amp;rsquo;/Co-Pilot stuff that nobody asked for and few want. It&amp;rsquo;s especially insidious and invasive enough in Windows 11 that one shouldn&amp;rsquo;t expect any privacy when using it.&#xA;Visual Studio Code was a decent editor that I&amp;rsquo;d been using since Atom got deprecated. Now it&amp;rsquo;s primarily an &amp;lsquo;open source AI code editor&amp;rsquo;, its official Web site declares.</description>
    </item>
    <item>
      <title>On going full IndyWeb</title>
      <link>/post/going-full-indyweb/</link>
      <pubDate>Wed, 17 Dec 2025 00:00:00 +0000</pubDate>
      <guid>/post/going-full-indyweb/</guid>
      <description>Although Substack was never designed to be just a newsletter service for something else, it can be pretty useful for that. I&amp;rsquo;ve been increasingly less inclined to use it since it became more of a &amp;lsquo;social&amp;rsquo; media platform, with certain authors being promoted by The Algorithm. What really did it for me, though, was an email sent to authors the other week, which stated:&#xA;&amp;lsquo;Substack is introducing age verification steps for those in the UK.</description>
    </item>
    <item>
      <title>Generative technical debt</title>
      <link>/post/development/generative-technical-debt/</link>
      <pubDate>Thu, 20 Nov 2025 00:00:00 +0000</pubDate>
      <guid>/post/development/generative-technical-debt/</guid>
      <description>I&amp;rsquo;m somewhat in agreement with the first half of Jamie Lord&amp;rsquo;s post on Nearly Right (Engineering leaders demand systems design skills as AI coding assistants produce mounting technical debt), and Jason Gorman made a good point about unreadable code being a form of technical debt (he coined the term &amp;lsquo;codemanship&amp;rsquo;, which I&amp;rsquo;m going to borrow). In my opinion, &amp;lsquo;AI&amp;rsquo; generated code absolutely should not find its way into the codebase of critical software, unchecked, regardless of what some bastardised implementation of Agile might demand.</description>
    </item>
    <item>
      <title>File Recovery from a legacy SQL Server database</title>
      <link>/post/development/sql-server-file-recovery/</link>
      <pubDate>Sat, 08 Nov 2025 00:00:00 +0000</pubDate>
      <guid>/post/development/sql-server-file-recovery/</guid>
      <description>Someone wanted files retrieved from a legacy database export. In this case, they were Word documents and PDFs stored as hex strings in an IMAGE column. The hex strings, of course, are representations of the bytes that make up the files. Now, there is a way of recovering files from this, using a native stored procedure, but I didn&amp;rsquo;t have admin-level access to this particular database. I also couldn&amp;rsquo;t use the online conversion sites, as the data was too sensitive.</description>
    </item>
    <item>
      <title>Traditional software engineering is still better than &#39;low code&#39;</title>
      <link>/post/development/low-code-the-way-forward/</link>
      <pubDate>Wed, 08 Oct 2025 00:00:00 +0000</pubDate>
      <guid>/post/development/low-code-the-way-forward/</guid>
      <description>I&amp;rsquo;ve worked with several &amp;rsquo;low code&amp;rsquo; platforms in recent years. Some are better than others, but I&amp;rsquo;m always asking one question: What problems are they supposed to solve?&#xA;The biggest of them is &amp;rsquo;technical debt&amp;rsquo;. Dependencies become outdated and unmaintained, updates sometimes have breaking changes that require code to be reworked, additional code gets tacked on over the years by various people, amateur code makes that harder, etc. Technical debt might be an inevitability for an organisation that&amp;rsquo;s been developing software in-house for long enough.</description>
    </item>
    <item>
      <title>Projects need fixing in Anypoint Studio</title>
      <link>/post/development/project-loading-anypoint-studio/</link>
      <pubDate>Wed, 16 Jul 2025 00:00:00 +0000</pubDate>
      <guid>/post/development/project-loading-anypoint-studio/</guid>
      <description>Typically I find that some troubleshooting and configuration is required to get an imported project to a state where it builds and the unit tests run, and the reasons usually aren&amp;rsquo;t obvious.&#xA;Importing a project Most Mulesoft developers would have made the mistake, at least once, of trying to import a project using one of the options under the &amp;lsquo;General&amp;rsquo; section, as that&amp;rsquo;s the first displayed in the import options window.</description>
    </item>
    <item>
      <title>How to get a Mulesoft application to page large volumes of data without resetting</title>
      <link>/post/development/mulesoft-api-paging/</link>
      <pubDate>Fri, 28 Feb 2025 00:00:00 +0000</pubDate>
      <guid>/post/development/mulesoft-api-paging/</guid>
      <description>Recently I&amp;rsquo;d been developing a Mulesoft application that uses another as a source API. The response from the source API looks something like this:&#xA;{&#xD;&amp;#34;nextLink&amp;#34;: &amp;#34;https://server:port/external-api/endpoint?page=1&amp;#34;,&#xD;&amp;#34;nextOffset&amp;#34;: 1000,&#xD;&amp;#34;morePages&amp;#34;: true,&#xD;&amp;#34;totalRows&amp;#34;: 12345,&#xD;&amp;#34;totalPages&amp;#34;: 13,&#xD;&amp;#34;results&amp;#34;:&#xD;[&#xD;{...}&#xD;]&#xD;} There are a few things that could potentially be used for paging the response data. As a .NET engineer, I would have approached it by using a While or Until loop on &amp;lsquo;morePages: true&amp;rsquo;, used the nextLink URI and appended the response payload to a typed list.</description>
    </item>
    <item>
      <title>I&#39;m still not a Mulesoft expert yet</title>
      <link>/post/first-post-of-2025/</link>
      <pubDate>Wed, 26 Feb 2025 00:00:00 +0000</pubDate>
      <guid>/post/first-post-of-2025/</guid>
      <description>After a very busy and difficult couple of months, the system I&amp;rsquo;d been working on is about to go live to ~27,000 users, and I&amp;rsquo;m feeling slightly pleased with myself. What should have been a simple integration morphed into a complex Mulesoft project. What a learning curve that was!&#xA;The following is my experience with Mulesoft so far.&#xA;I think the one advantage Mulesoft has over other platforms - and maybe its selling point - is that the Anypoint portal provides us with a single place from which numerous integrations, API specifications and deployment environments can be managed.</description>
    </item>
    <item>
      <title>An alternative way of getting OAuth working in Anypoint Studio</title>
      <link>/post/security/mulesoft-oauth/</link>
      <pubDate>Tue, 05 Nov 2024 00:00:00 +0000</pubDate>
      <guid>/post/security/mulesoft-oauth/</guid>
      <description>Getting software to work with OAuth is usually one of the easiest things a developer could be tasked with, if s/hehas done it a few times: Create an HTTP client method that sends four values to an OAuth provider, then pass the response to the next HTTP client method as a variable to be used in the Authorization header.&#xA;Doing that in Anypoint Studio, for a Mulesoft application, was an uphill struggle of resolving one error message after another.</description>
    </item>
    <item>
      <title>Thread Safety in Azure Logic Apps</title>
      <link>/post/development/azure-logic-app-thread-safety/</link>
      <pubDate>Wed, 18 Sep 2024 00:00:00 +0000</pubDate>
      <guid>/post/development/azure-logic-app-thread-safety/</guid>
      <description>After resolving the previous issue with the Content-Type defect in the Azure Logic App&amp;rsquo;s storage connector, I ran into a second problem: The Web pages being generated were populated with the correct content type, but the incorrect content. I quickly discovered that was partly caused by a race condition and with how memory is managed by Azure.&#xA;By default, a Logic App will run up to twenty instances of a &amp;lsquo;For Each&amp;rsquo; loop in parallel, but this is multi-threading instead of true parallel processing.</description>
    </item>
    <item>
      <title>Content-Type Problem with Azure Storage Connector</title>
      <link>/post/development/azure-content-type-bug/</link>
      <pubDate>Tue, 17 Sep 2024 00:00:00 +0000</pubDate>
      <guid>/post/development/azure-content-type-bug/</guid>
      <description>One of our Logic Apps, which we developed as a static site generator, began writing the Web pages to the storage account as octet stream files, and I narrowed down the problem to a defect in the storage account connector.&#xA;I believe (but I&amp;rsquo;m not 100% certain yet) Microsoft&amp;rsquo;s developers hadn&amp;rsquo;t implemented the &amp;lsquo;&amp;quot;headers&amp;quot;: {&amp;quot;Content-Type&amp;quot;: &amp;quot;text/html&amp;quot;}&amp;rsquo; code for the storage account connectors, and the file type, therefore, always defaults to octet stream.</description>
    </item>
    <item>
      <title>Is Agile really to blame for the lack of innovation?</title>
      <link>/post/development/agile-and-innovation/</link>
      <pubDate>Sat, 17 Aug 2024 00:00:00 +0000</pubDate>
      <guid>/post/development/agile-and-innovation/</guid>
      <description>One of the central claims made by Moxie Marlinspike, during his discussion at the Black Hat conference appears nonsensical, because he referred to two entirely different meanings of &amp;lsquo;abstraction&amp;rsquo;, and was thus comparing two entirely different things:&#xA;&amp;lsquo;We spent the past 20 years onboarding people into software by putting them into black box abstraction layers, and then putting them into organizations composed of black box abstraction layers, [&amp;hellip;] Marlinspike posited that security researchers, who routinely probe beneath surface-level abstractions, are better positioned to drive innovation in software development.</description>
    </item>
    <item>
      <title>Bigger things</title>
      <link>/post/senior-position/</link>
      <pubDate>Sat, 16 Mar 2024 00:00:00 +0000</pubDate>
      <guid>/post/senior-position/</guid>
      <description>Something unexpected happened this week: I was offered my first senior engineer position. I&amp;rsquo;ll be focussed mainly on the project management and planning side of things, and I&amp;rsquo;m being encouraged to delegate the software development work. I&amp;rsquo;m still prepared to get my hands dirty with the coding and systems administration, if anyone gets stuck on a tricky problem, and I&amp;rsquo;ll likely be working on a couple of .NET applications as personal projects.</description>
    </item>
    <item>
      <title>Authenticating Requests to a Logic App</title>
      <link>/post/security/authenticating-requests-to-logic-app/</link>
      <pubDate>Thu, 22 Feb 2024 00:00:00 +0000</pubDate>
      <guid>/post/security/authenticating-requests-to-logic-app/</guid>
      <description>One of my Logic Apps originally had just three steps:&#xA;HTTP trigger Deserialise HTTP request JSON payload Send objects from the request payload to a Service Bus queue Another Logic App would read the objects from the Service Bus queue, use them to query another source for data, then send a email to whatever address was in the initial request. I used this approach because there could be more requests than a Logic App can handle concurrently, and it made sense, therefore, to queue the requests.</description>
    </item>
    <item>
      <title>Authenticating API Requests in an Azure Logic App</title>
      <link>/post/security/authenticating-api-requests-azure/</link>
      <pubDate>Sat, 09 Dec 2023 00:00:00 +0000</pubDate>
      <guid>/post/security/authenticating-api-requests-azure/</guid>
      <description>One way to help understand how Active Directory, App Registrations, managed identities and Key Vaults work in Microsoft Azure is to look at a typical Logic App that authenticates itself with an API that provides data only to services registered with the organisation&amp;rsquo;s Active Directory.&#xA;The basic sequence for the authentication part of the Logic App here is this:&#xA;Get a password from an Azure Key Vault. Get an OAuth token for the Logic App from Active Directory.</description>
    </item>
    <item>
      <title>How secure is Azure Key Vault?</title>
      <link>/post/security/azure-key-vault-security/</link>
      <pubDate>Sun, 17 Sep 2023 00:00:00 +0000</pubDate>
      <guid>/post/security/azure-key-vault-security/</guid>
      <description>Azure Key Vault is designed to store (and protect) secrets such as API keys, passwords, cryptographic keys, connection strings, etc. It can store the following categories of data:&#xA;Keys Certificates Secrets The Secrets storage can store arbitrary plaintext values, so Key Vault could potentially be used as a means of centrally managing a collection of usernames and passwords that could be copied and pasted straight from the Azure Portal. Is this a safe method of password management, though?</description>
    </item>
    <item>
      <title>If you must use Power BI Report Builder....</title>
      <link>/post/development/power-bi-report-builder/</link>
      <pubDate>Tue, 12 Sep 2023 00:00:00 +0000</pubDate>
      <guid>/post/development/power-bi-report-builder/</guid>
      <description>My brief encounter with Power BI began after one of the project managers had the idea of using Power BI Report Builder as a means for generating archived versions of what&amp;rsquo;s displayed on a site I developed not long ago, because he wanted a PDF export feature for that. &amp;lsquo;Why not just copy a couple of the API methods and add a PDF converter to them?&amp;rsquo;, I wondered, with the feeling I&amp;rsquo;d end up needing to do that anyway.</description>
    </item>
    <item>
      <title>Implementing Microsoft Graph requests in a .NET API</title>
      <link>/post/development/microsoft-graph/</link>
      <pubDate>Wed, 03 May 2023 00:00:00 +0000</pubDate>
      <guid>/post/development/microsoft-graph/</guid>
      <description>Recently I was tasked with implementing role-based security for a .NET API, based on the Active Directory groups the user is a member of. Easy, I thought initially, as there&amp;rsquo;s a well-documented way of doing this by adding [Authorize] annotations to controller methods.&#xA;The first problem I ran into was the API was designed to be used by a Node.js/React application. In this case (and this is a simplified description), users obviously don&amp;rsquo;t authenticate themselves directly with the API, but instead with the React application, via Active Directory Single Sign-On.</description>
    </item>
    <item>
      <title>Some principles for coding and refactoring</title>
      <link>/post/development/coding-principles/</link>
      <pubDate>Sat, 29 Apr 2023 00:00:00 +0000</pubDate>
      <guid>/post/development/coding-principles/</guid>
      <description>Notes initially published on my Bear Blog site.&#xA;A decade of software development and engineering taught me there are two design principles that I&amp;rsquo;d argue are more important than any particular pattern or design approach:&#xA;Code should be readable and self-explanatory. Each function or method (I use these terms interchangeably) should have a single, well-defined purpose. Code should be readable Programming languages are designed to provide human-readable abstractions of software, and, as such, code should be intelligible and relatively easy to work with.</description>
    </item>
    <item>
      <title>Hugo and the Mainroad Theme</title>
      <link>/post/development/hugo-and-mainroad/</link>
      <pubDate>Sat, 01 Oct 2022 00:00:00 +0000</pubDate>
      <guid>/post/development/hugo-and-mainroad/</guid>
      <description>I think I&amp;rsquo;ve found the ideal theme for my Hugo site. Mainroad is relatively simple in design, the layout is roughly what I was looking for, and it&amp;rsquo;s easier to customise. It still has tags and categories features that are essential for a site hosting technical documentation. I spent around six hours learning how the template works, re-arranging the content and tweaking the CSS to make it as clean as my MkDocs site.</description>
    </item>
  </channel>
</rss>
