<?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>/categories/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="/categories/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>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>Getting used to Anypoint Studio</title>
      <link>/post/development/getting-used-to-anypoint-studio/</link>
      <pubDate>Tue, 15 Oct 2024 00:00:00 +0000</pubDate>
      <guid>/post/development/getting-used-to-anypoint-studio/</guid>
      <description>Anypoint Studio, as a development tool, comes with a steep learning curve - it&amp;rsquo;s essentially a rebranded version of Eclipse, with a lot of custom Java packages (there are a lot for the Mulesoft server) and a package manager pointing at the Exchange repo.&#xA;Putting together a Mulesoft application, using the &amp;rsquo;low code&amp;rsquo; designer and DataWeave is easy enough, though I haven&amp;rsquo;t done any advanced data transformations yet. Currently it relays data from another Mulesoft API to an external service in a different format.</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>A rather strange use of OAuth 2.0</title>
      <link>/post/security/curl-oauth2/</link>
      <pubDate>Tue, 30 Apr 2024 00:00:00 +0000</pubDate>
      <guid>/post/security/curl-oauth2/</guid>
      <description>Recently I was asked to look into changing the authentication method to OAuth 2.0 for an integration service. It&amp;rsquo;s something I&amp;rsquo;d done enough times in Azure to know what&amp;rsquo;s involved: The service would need an app registration, which should provide a client ID and secret, an OAuth token request stage, and modifications to include the token in the Authorization header field of whatever was originally being sent.&#xA;After a little digging, it turned out the integration was a simple batch script, running on a Windows server, and it used curl to send data to a third-party service.</description>
    </item>
    <item>
      <title>Mulesoft Development Course - Part I</title>
      <link>/post/development/mulesoft-course-part-1/</link>
      <pubDate>Tue, 02 Apr 2024 00:00:00 +0000</pubDate>
      <guid>/post/development/mulesoft-course-part-1/</guid>
      <description>It took a while to get everything set up for the Mulesoft Development course, with the following being required:&#xA;Anypoint Studio Anypoint Platform account (separate to the training account) Salesforce account Advanced REST Client (Probably wasn&amp;rsquo;t needed, because I already had Postman installed) There are a few things to be aware of:&#xA;A considerable amount of disk space is required for Anypoint Studio and the training files. I reckon it&amp;rsquo;s somewhere around 4GB.</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>Another way to understand interfaces (C#)</title>
      <link>/post/development/interfaces/</link>
      <pubDate>Sat, 02 Mar 2024 00:00:00 +0000</pubDate>
      <guid>/post/development/interfaces/</guid>
      <description>One of the harder software engineering concepts to understand is that of interfaces. I once struggled to understand what interfaces are, how they work, and why a software engineer might use them. Most the explanations I could find on the Web didn&amp;rsquo;t make a lot of sense - some were more complicated than they needed to be, and others attempted to explain it in terms of other things I hadn&amp;rsquo;t grasped (i.</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>Azure Resource Group Security and Authentication</title>
      <link>/post/security/resource-group-security/</link>
      <pubDate>Wed, 31 Jan 2024 00:00:00 +0000</pubDate>
      <guid>/post/security/resource-group-security/</guid>
      <description>The security configuration of Azure services is a fairly broad subject area, and this is more of an introduction to how it works for a Resource Group, in the context of a Logic App that needs to interact with multiple resources. If a DevOps team, instead of the developers, is managing the security, a considerable amount of time will be spent planning and designing services beforehand, and later trying to figure out which security configurations are preventing the services working.</description>
    </item>
    <item>
      <title>Why &#39;low code&#39; isn&#39;t always better</title>
      <link>/post/development/low-code-development/</link>
      <pubDate>Sat, 20 Jan 2024 00:00:00 +0000</pubDate>
      <guid>/post/development/low-code-development/</guid>
      <description>One of the most important lessons I&amp;rsquo;d learned from working with Azure, over the last year or so, is that careful thought should be given to whether it&amp;rsquo;s better to implement a service as a &amp;rsquo;low code&amp;rsquo; solution, or as conventionally-developed software. The former isn&amp;rsquo;t always the fastest, cheapest or more efficient way to get something deployed.&#xA;I&amp;rsquo;m currently of the opinion that Azure&amp;rsquo;s Logic App system is quite good for integrations and basic scheduled tasks - and it has indeed made those kind of things easier to manage - and there aren&amp;rsquo;t any convoluted deployment pipelines to bother with.</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>Down the Rabbit Hole of Using SelectPdf on Microsoft Azure</title>
      <link>/post/development/selectpdf-azure/</link>
      <pubDate>Mon, 20 Nov 2023 00:00:00 +0000</pubDate>
      <guid>/post/development/selectpdf-azure/</guid>
      <description>Initially I thought it would be trivial to use SelectPdf to convert an HTML page into a PDF document as a service on Microsoft Azure, since I was easily able to do this as a .NET console app.&#xA;Everything was going well to begin with. I&amp;rsquo;d set up everything in the Resource Group: The Logic Apps that write to and read from the Service Bus, the Storage Account for the template files and generated documents, the Function App that&amp;rsquo;s supposed to handle the document generation itself&amp;hellip; The first problem I ran into was the following console message:</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>Using MySQL Linked Servers with OPENQUERY</title>
      <link>/post/development/openquery/</link>
      <pubDate>Fri, 05 May 2023 00:00:00 +0000</pubDate>
      <guid>/post/development/openquery/</guid>
      <description>It is possible to query a MySQL database as a linked server from Microsoft SQL Management Studio (SSMS), indirectly, using OPENQUERY. Querying a Linked Server To select all records from a database table in the linked server:&#xA;SELECT * FROM OPENQUERY(LINKED_MYSQL_DB, &amp;#39;SELECT * FROM databasename.databasetable&amp;#39;) Or to find a record with a field matching some condition:&#xA;SELECT * FROM OPENQUERY(LINKED_MYSQL_DB, &amp;#39;SELECT * FROM databaseame.users&amp;#39;) WHERE name LIKE &amp;#39;%PersonName%&amp;#39;; There&amp;rsquo;s one problem with the above queries: They will read the entire table through the linked servers before the rows are filtered.</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>Dependency scanning tools as solutions to a different problem</title>
      <link>/post/development/dependency-scanning/</link>
      <pubDate>Thu, 09 Mar 2023 00:00:00 +0000</pubDate>
      <guid>/post/development/dependency-scanning/</guid>
      <description>Since dependency vulnerability scanning has been suggested by colleagues as something that could help with security/standards compliance and addressing legacy software, I&amp;rsquo;ve been looking into a few services to see how useful the available options could be.&#xA;NPM Audit Dependency scanning is performed by default with the install command for later versions of NPM, and by default, the output of npm audit will show a few lines of relevant information about each package with a reported vulnerability - its rating, a brief description of the vulnerability and whether an update is available.</description>
    </item>
    <item>
      <title>Azure Function App Migration</title>
      <link>/post/development/azure-function-app-migration/</link>
      <pubDate>Thu, 27 Oct 2022 00:00:00 +0000</pubDate>
      <guid>/post/development/azure-function-app-migration/</guid>
      <description>After clicking ‘Create’, select ‘Develop in portal’, and HTTP Trigger or Service Bus Trigger, depending on the type of Function App being added.&#xA;Most the required information – function name, connection, queue name, etc. – can be copied from the original function’s JSON file.&#xA;In Code + Test, copy the code from the old function or the Visual Studio Solution.&#xA;In the Integration section, the values for Trigger, Inputs and Outputs also need to be copied over.</description>
    </item>
    <item>
      <title>Some notes on upgrading to .NET 7</title>
      <link>/post/development/dotnet-7-release/</link>
      <pubDate>Thu, 20 Oct 2022 00:00:00 +0000</pubDate>
      <guid>/post/development/dotnet-7-release/</guid>
      <description>The official release for .NET 7.0 is in November 2022, though there have been a number of preview versions this year. In order to upgrade services to this, it might be necessary to update Visual Studio and MSBuild first.&#xA;Target Framework To upgrade, set the target framework as follows:&#xA;&amp;lt;TargetFramework&amp;gt;net7.0&amp;lt;/TargetFramework&amp;gt; And maybe do the following update all package references to 7.0.0 for Microsoft.AspNetCore and Microsoft.Extensions.&#xA;Other target frameworks include:&#xA;net7.0 net7.</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>
    <item>
      <title>Netlify CMS and Continuous Deployment for Hugo</title>
      <link>/post/development/netlify-cms-hugo/</link>
      <pubDate>Tue, 20 Sep 2022 00:00:00 +0000</pubDate>
      <guid>/post/development/netlify-cms-hugo/</guid>
      <description>Netlify CMS and Continuous Deployment for Hugo Having experimented with this, I think Netlify&amp;rsquo;s idea of tacking a CMS onto a static site generator is tailored for situations where multiple developers, through Continuous Deployment, are providing a corporate site for which the content is being edited by non-technical users. At least it appears that way, because it takes a lot of work to develop the site and configure the CMS for anything more generic than the template provided, and an individual developer working on this as a personal project would most likely dispense with the CMS entirely and modify the files in the /content directory themselves (I&amp;rsquo;ll explain why).</description>
    </item>
    <item>
      <title>Static Site Generator or Content Management System?</title>
      <link>/post/development/ssg-vs-cms/</link>
      <pubDate>Sun, 18 Sep 2022 00:00:00 +0000</pubDate>
      <guid>/post/development/ssg-vs-cms/</guid>
      <description>Can a static site generator (SSG) be more accessible than a content management system (CMS) to someone without Web development experience? And should we use an SSG instead of setting up something like WordPress?&#xA;For those who don&amp;rsquo;t know, a static site generator is essentially a program that compiles a directory of text/Markdown files into a Web site that can be hosted on any Web server. Its core function is to convert Markdown to HTML.</description>
    </item>
    <item>
      <title>Migrations Using Visual Studio SQL Server Database Project</title>
      <link>/post/development/sql-server-database-vs-project/</link>
      <pubDate>Thu, 15 Sep 2022 00:00:00 +0000</pubDate>
      <guid>/post/development/sql-server-database-vs-project/</guid>
      <description>Migrations Using Visual Studio SQL Server Database Project Setting Up the Migration Project Add a new project to the Visual Studio solution. This project will initially be empty, without assembly references or scaffold files - it appears everything is native to Visual Studio. To this we need to add the connection to the database the schema is to be imported from. There will be a menu option for &amp;lsquo;Import&amp;rsquo; -&amp;gt; &amp;lsquo;Database&amp;rsquo;.</description>
    </item>
    <item>
      <title>Docker Basics</title>
      <link>/post/development/docker-basics/</link>
      <pubDate>Fri, 02 Sep 2022 00:00:00 +0000</pubDate>
      <guid>/post/development/docker-basics/</guid>
      <description>A Docker container runs as a sandboxed process on a local system or a server, and consists of at least one image. An image is built from the source code of an application or service, and can be distributed, through a repository, to provide others the means of testing an existing software product with minimal setup.&#xA;Containers and images can be managed through the Docker Dashboard application. As such, a Docker container will require its own configurations and script that enable it to run as intended.</description>
    </item>
    <item>
      <title>Entity Framework Migrations</title>
      <link>/post/development/entity-framework-migrations/</link>
      <pubDate>Thu, 01 Sep 2022 00:00:00 +0000</pubDate>
      <guid>/post/development/entity-framework-migrations/</guid>
      <description>The purpose of generating Entity Framework migrations is to apply database schema changes consistently across Staging, UAT and Production environments.&#xA;The proposed method would involve developers generating migration a migration script whenever changes are made to the Entity Framework model in their projects. The DevOps team would apply that migration script to update the Azure environments. The services and applications being developed themselves should not have permissions to modify the environment.</description>
    </item>
    <item>
      <title>Kestrel HTTPS Error - .Net Core and Docker</title>
      <link>/post/development/kestrel-errors/</link>
      <pubDate>Mon, 15 Aug 2022 00:00:00 +0000</pubDate>
      <guid>/post/development/kestrel-errors/</guid>
      <description>The following is another commonly-posted question in Stack Overflow, which I&amp;rsquo;ve been looking at while debugging the same problem:&#xA;System.InvalidOperationException: Unable to configure HTTPS endpoint. No server certificate was specified, and the default developer certificate could not be found or is out of date. The most obvious cause would be Kestrel trying to use invalid or expired HTTPS certificates. However, looking more closely, my error message was preceded by:&#xA;[...]&#xD;[15:25:25 FTL] Unable to start Kestrel.</description>
    </item>
    <item>
      <title>Azure Active Directory Authentication for .NET Core Services</title>
      <link>/post/security/dotnet-core-azure-ad-authentication/</link>
      <pubDate>Wed, 01 Jun 2022 00:00:00 +0000</pubDate>
      <guid>/post/security/dotnet-core-azure-ad-authentication/</guid>
      <description>If upgrading an existing application, the following are required from NuGet:&#xA;Microsoft.Identity.Web Microsoft.Identity.Web.UI Generating the Project The project in this repository was generated from the ASP.NET Core Web App template. When generating the project, select &amp;lsquo;Microsoft identity platform&amp;rsquo; as the Authentication type in the Additional Information section. HTTPS and Docker were also enabled for this project.&#xA;After installing dotnet msidentity tool, Visual Studio will display the Service Dependencies and Service References.</description>
    </item>
    <item>
      <title>.NET Core - xUnit Tests with Repository Pattern and IUNitOfWork</title>
      <link>/post/development/dotnet-core-xunit/</link>
      <pubDate>Tue, 03 May 2022 00:00:00 +0000</pubDate>
      <guid>/post/development/dotnet-core-xunit/</guid>
      <description>After some hours of frustration and asking myself whether I should have used Unit of Work in the first place (there are already layers of abstraction in the standard .NET Core template project) I managed to get a functioning xUnit test method that mocks the repositories, populates them with data and verifies the model returned by a controller method.&#xA;Setting Up a Unit Test Project Add a xUnit project to the solution, then add an assembly reference in that to the project being tested.</description>
    </item>
    <item>
      <title>Entity Framework Core Command Line Reference</title>
      <link>/post/development/ef-core-cli-reference/</link>
      <pubDate>Tue, 03 May 2022 00:00:00 +0000</pubDate>
      <guid>/post/development/ef-core-cli-reference/</guid>
      <description>Installing Entity command line The .NET Entity Framework command line tools can be installed globally in PowerShell, or just for a specific project.&#xA;dotnet tool install --global dotnet-ef After installation, it might be a good idea to update the tools:&#xA;dotnet tool update --global dotnet-ef Add the Entity Framework Packages to a Project In order to use the Entity Framework command line tools for a .NET Core project, it&amp;rsquo;s necessary to install the Design package.</description>
    </item>
    <item>
      <title>.NET Core 6 - Dependency Injection, Repository Pattern and Unit of Work</title>
      <link>/post/development/repository-pattern-and-uow/</link>
      <pubDate>Mon, 25 Apr 2022 00:00:00 +0000</pubDate>
      <guid>/post/development/repository-pattern-and-uow/</guid>
      <description>A repository pattern exists to add another layer of abstraction between the application logic and the data layer, using dependency injection to decouple the two. It&amp;rsquo;s not my preferred way of doing things, because of the effort and complexity involved, and I&amp;rsquo;m certainly not the only person who initially struggled to understand the concepts behind it. Plus, it&amp;rsquo;s apparent that Entity Framework makes heavy use of that dependency injection already. But a Repository Pattern is widely considered - by software engineers far more experienced than I am - best practice for engineering services that deal with critical data.</description>
    </item>
    <item>
      <title>Implementing an AJAX Request in .NET Core 6 MVC</title>
      <link>/post/development/dotnet-core-ajax/</link>
      <pubDate>Wed, 20 Apr 2022 00:00:00 +0000</pubDate>
      <guid>/post/development/dotnet-core-ajax/</guid>
      <description>One of the problems with implementing a search feature that returns a table in a partial view is the Entity Framework model declarations must be strongly-typed. This means we run into difficulties declarating a model in the containing view and an IEnumerable instance of it for the partial view. One way around this is to instead discard the model for the mainview, and use jQuery and AJAX to read values from specific input elements in the main view, and pass those values to the controller action that returns the partial view with the IEnumerable model.</description>
    </item>
    <item>
      <title>Several potential fixes for the missing .NET SDK error (Docker and .NET Core)</title>
      <link>/post/development/docker-missing-dotnet-sdk/</link>
      <pubDate>Sat, 16 Apr 2022 00:00:00 +0000</pubDate>
      <guid>/post/development/docker-missing-dotnet-sdk/</guid>
      <description>There have been many people asking about this on Stack Overflow, and none of the answers there brought me closer to resolving the problem, which, it later transpired, was caused by something really silly I&amp;rsquo;d overlooked. When running &amp;lsquo;docker-compose up&amp;rsquo; in the Docker CLI, for a .NET Core service, the output reports that it cannot find an installed SDK:&#xA;It was not possible to find any installed .NET Core SDKs&#xD;Did you mean to run .</description>
    </item>
    <item>
      <title>Thoughts on NET Core 6.0, Entity Framework and the New MVC Pattern</title>
      <link>/post/development/dotnet-core-6-ef-mvc/</link>
      <pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate>
      <guid>/post/development/dotnet-core-6-ef-mvc/</guid>
      <description>The following mostly doesn&amp;rsquo;t refer to problems native to the .NET Core 6 Framework itself, but rather some difficulties I encountered while getting an Entity Framework Database-First model working in the MVC project template generated by Visual Studio 2022.&#xA;Some of the problems centred around:&#xA;Breaking changes and things that might be awkward for developers accustomed to working with legacy non-Core versions of .NET (espectially .NET MVC). Not much documentation out there, relative to what&amp;rsquo;s published for the older .</description>
    </item>
    <item>
      <title>Using MKDocs</title>
      <link>/post/development/mkdocs-intro/</link>
      <pubDate>Fri, 10 Dec 2021 00:00:00 +0000</pubDate>
      <guid>/post/development/mkdocs-intro/</guid>
      <description>As you can tell, this site is no longer based on Publii CMS (which is still a very good CMS). After spending a few hours with MkDocs, I&amp;rsquo;ve been tempted to use that instead, as I can do pretty much everything using Vim. I&amp;rsquo;m still migrating the content, so this site is a work in progress.&#xA;Using a static site generator might initially seem like a long-assed way of getting a basic site up, but once MkDocs is installed and running, and the site&amp;rsquo;s customised, we only need to worry about a single configuration file and where to place the content.</description>
    </item>
    <item>
      <title>Things to do with .ipynb files</title>
      <link>/post/development/jupyter-notebook/</link>
      <pubDate>Fri, 26 Nov 2021 00:00:00 +0000</pubDate>
      <guid>/post/development/jupyter-notebook/</guid>
      <description>Although Jupyter Notebook is designed primarily for data analysts, I think there are other use cases in which it can be an effective method of distributing Python code and associated documentation in a single .ipynb file. There are other editors we can use to handle .ipynb files: JupyterLab, Deepnote and Visual Studio Code (with the right extensions) are just a few I&amp;rsquo;ve tried.&#xA;Jupyter Notebook is essentially a markdown editor with an embedded Python interpreter that executes whatever code is included in a document.</description>
    </item>
    <item>
      <title>Research Code Doesn&#39;t Need to Be a Tangled Mess</title>
      <link>/post/development/research-code-standards/</link>
      <pubDate>Mon, 01 Mar 2021 00:00:00 +0000</pubDate>
      <guid>/post/development/research-code-standards/</guid>
      <description>Writing at The Shape of Code blog, Derek Jones asserted that &amp;lsquo;Structural differences between academia and industry make it likely that research software will always be a tangled mess, only usable by the person who wrote it.&amp;rsquo;&#xA;Yes, there are structural (and insurmountable) differences between academia and industry in how programming languages are used to solve problems. Professional developers more often engineer code, because there are typically real-world consequences to releasing poor-quality software, from damage to a company&amp;rsquo;s reputation to injury or death.</description>
    </item>
    <item>
      <title>OpenCart Development Notes</title>
      <link>/post/development/opencart/</link>
      <pubDate>Tue, 25 Aug 2020 00:00:00 +0000</pubDate>
      <guid>/post/development/opencart/</guid>
      <description>Overview The OpenCart system follows the MVC (Model, View, Controller) pattern. A simple description of how this works is that a View determines the layout and appearance of a Web site, whereas the content itself is generated and inserted into the View by a Controller. A Model contains data objects that represent database entities being processed by the Controller.&#xA;With OpenCart, we have a more complicated implementation of the MVC pattern, mainly because a site&amp;rsquo;s appearance isn&amp;rsquo;t actually determined by a set of HTML/CSHTML files in the /views directory.</description>
    </item>
  </channel>
</rss>
