Remove http://default from content

This commit is contained in:
Oliver Davies 2025-07-16 12:00:00 +01:00
parent 025aaf3be2
commit 76ed8e141b
392 changed files with 525 additions and 525 deletions

View file

@ -25,7 +25,7 @@ body:
- value: 'Not sure? [Browse the archive →](/archive)'
format: markdown
processed: |
<p>Not sure? <a href="http://default/archive">Browse the archive →</a></p>
<p>Not sure? <a href="/archive">Browse the archive →</a></p>
summary: ''
field_text_alignment:
- value: centre

View file

@ -52,7 +52,7 @@ body:
format: full_html
processed: |
<p>A side effect of <a href="http://default/daily/2023/03/04/why-i-built-a-tool-to-generate-configuration-files">using a tool to generate build configuration files</a> with templates is the consistency that it introduces.</p>
<p>A side effect of <a href="/daily/2023/03/04/why-i-built-a-tool-to-generate-configuration-files">using a tool to generate build configuration files</a> with templates is the consistency that it introduces.</p>
<p>The majority of my projects use a PHP-FPM or PHP CLI container. In my Docker Compose file, the service was mostly named <code>php</code> but sometimes it was <code>php-fpm</code>. In the templated file, it's always named <code>php</code>.</p>

View file

@ -69,13 +69,13 @@ body:
<p>You want the same result on every time on every environment.</p>
<p>You want every environment - including <a href="http://default/daily/2024/12/25/localhost">local development environments</a> to be as consistent as possible to minimise bugs and errors.</p>
<p>You want every environment - including <a href="/daily/2024/12/25/localhost">local development environments</a> to be as consistent as possible to minimise bugs and errors.</p>
<p>To do this, I automate things to make them as simple as possible.</p>
<p>I use <a href="http://default/daily/2022/08/15/using-run-file-simplify-project-tasks">run files</a> with commands to import databases, perform updates and run pre-update and post-update tasks.</p>
<p>I use <a href="/daily/2022/08/15/using-run-file-simplify-project-tasks">run files</a> with commands to import databases, perform updates and run pre-update and post-update tasks.</p>
<p>I use tools like Nix and <a href="http://default/daily/2024/11/11/could-nix-and-devenv-replace-docker-compose">devenv</a> to create identical and reproducible environments.</p>
<p>I use tools like Nix and <a href="/daily/2024/11/11/could-nix-and-devenv-replace-docker-compose">devenv</a> to create identical and reproducible environments.</p>
<p>The simpler and quicker is it, the more it can and will be done.</p>

View file

@ -109,7 +109,7 @@ body:
<p>This I think is a better approach and how I add PHPStan to existing codebases.</p>
<p>To learn more about static analysis and PHPStan, listen to <a href="http://default/podcast/22-dave-liddament">episode 22 of the Beyond Blocks podcast</a> with Dave Liddament.</p>
<p>To learn more about static analysis and PHPStan, listen to <a href="/podcast/22-dave-liddament">episode 22 of the Beyond Blocks podcast</a> with Dave Liddament.</p>
summary: null

View file

@ -37,6 +37,6 @@ path:
body:
- value: '<p>If a module or library has been added to an application, it was done to serve a purpose.</p><p>It must add some required functionality that was asked for earlier in the application''s lifecycle.</p><p>It was needed then.</p><p>But it is still needed now?</p><p>Are the original requirements still valid?</p><p>Have they changed or are no longer needed?</p><p>If the code is no longer serving a purpose, it should be removed.</p><p>Common culprits in Drupal projects are the Feeds and Migrate modules, which are used to import data from external sources, such as legacy applications when migrating to Drupal.</p><p>Once the data has been imported and the site is live, the modules are often so longer needed.</p><p><a href="/daily/2025/05/30/do-you-need-module">As I said yesterday</a>, having less code in your application will make it easier to maintain and upgrade in the future, so keep it as lean and minimal as possible - but this is an ongoing process as requirements change over time.<br>&nbsp;</p>'
format: basic_html
processed: '<p>If a module or library has been added to an application, it was done to serve a purpose.</p><p>It must add some required functionality that was asked for earlier in the application''s lifecycle.</p><p>It was needed then.</p><p>But it is still needed now?</p><p>Are the original requirements still valid?</p><p>Have they changed or are no longer needed?</p><p>If the code is no longer serving a purpose, it should be removed.</p><p>Common culprits in Drupal projects are the Feeds and Migrate modules, which are used to import data from external sources, such as legacy applications when migrating to Drupal.</p><p>Once the data has been imported and the site is live, the modules are often so longer needed.</p><p><a href="http://default/daily/2025/05/30/do-you-need-module">As I said yesterday</a>, having less code in your application will make it easier to maintain and upgrade in the future, so keep it as lean and minimal as possible - but this is an ongoing process as requirements change over time.<br>&nbsp;</p>'
processed: '<p>If a module or library has been added to an application, it was done to serve a purpose.</p><p>It must add some required functionality that was asked for earlier in the application''s lifecycle.</p><p>It was needed then.</p><p>But it is still needed now?</p><p>Are the original requirements still valid?</p><p>Have they changed or are no longer needed?</p><p>If the code is no longer serving a purpose, it should be removed.</p><p>Common culprits in Drupal projects are the Feeds and Migrate modules, which are used to import data from external sources, such as legacy applications when migrating to Drupal.</p><p>Once the data has been imported and the site is live, the modules are often so longer needed.</p><p><a href="/daily/2025/05/30/do-you-need-module">As I said yesterday</a>, having less code in your application will make it easier to maintain and upgrade in the future, so keep it as lean and minimal as possible - but this is an ongoing process as requirements change over time.<br>&nbsp;</p>'
summary: ''
field_daily_email_cta: { }

View file

@ -37,6 +37,6 @@ path:
body:
- value: "<p>There's nothing more frustrating for me than seeing an error I've seen before and not remembering how I fixed it last time.</p><p>I try to remember and search for the error message, just to find and read the same articles and posts again or watch the same videos.</p><p>I wrote my first blog post on my website in 2010 to document my learning for myself and to share with others.</p><p>I've also been a keen note taker, using tools like Evernote and others to take notes and write documentation for myself to refer to in the future.</p><p>These days, I just <a href=\"/daily/2024/11/10/write-plain-text-files\">write plain text files</a> using <a href=\"https://github.com/nickjj/notes\">Nick Janetakis' notes program</a>, which I've modified slightly <a href=\"/daily/2025/04/21/patch\">by patching it</a> to create daily notes instead of monthly ones.&nbsp;</p><p>They're fast to write, easy to search and available offline if I'm traveling or away from my computer.</p><p>I much prefer being able to search my notes and find what I'm looking for or, if it's a post that I've written publicly, searching online and finding my own answer.</p><p>Whether you're a new or experienced Developer, you're always learning new things, so write them down for yourself and, if you want, write publicly and share your learnings with others.</p>"
format: basic_html
processed: "<p>There's nothing more frustrating for me than seeing an error I've seen before and not remembering how I fixed it last time.</p><p>I try to remember and search for the error message, just to find and read the same articles and posts again or watch the same videos.</p><p>I wrote my first blog post on my website in 2010 to document my learning for myself and to share with others.</p><p>I've also been a keen note taker, using tools like Evernote and others to take notes and write documentation for myself to refer to in the future.</p><p>These days, I just <a href=\"http://default/daily/2024/11/10/write-plain-text-files\">write plain text files</a> using <a href=\"https://github.com/nickjj/notes\">Nick Janetakis' notes program</a>, which I've modified slightly <a href=\"http://default/daily/2025/04/21/patch\">by patching it</a> to create daily notes instead of monthly ones.&nbsp;</p><p>They're fast to write, easy to search and available offline if I'm traveling or away from my computer.</p><p>I much prefer being able to search my notes and find what I'm looking for or, if it's a post that I've written publicly, searching online and finding my own answer.</p><p>Whether you're a new or experienced Developer, you're always learning new things, so write them down for yourself and, if you want, write publicly and share your learnings with others.</p>"
processed: "<p>There's nothing more frustrating for me than seeing an error I've seen before and not remembering how I fixed it last time.</p><p>I try to remember and search for the error message, just to find and read the same articles and posts again or watch the same videos.</p><p>I wrote my first blog post on my website in 2010 to document my learning for myself and to share with others.</p><p>I've also been a keen note taker, using tools like Evernote and others to take notes and write documentation for myself to refer to in the future.</p><p>These days, I just <a href=\"/daily/2024/11/10/write-plain-text-files\">write plain text files</a> using <a href=\"https://github.com/nickjj/notes\">Nick Janetakis' notes program</a>, which I've modified slightly <a href=\"/daily/2025/04/21/patch\">by patching it</a> to create daily notes instead of monthly ones.&nbsp;</p><p>They're fast to write, easy to search and available offline if I'm traveling or away from my computer.</p><p>I much prefer being able to search my notes and find what I'm looking for or, if it's a post that I've written publicly, searching online and finding my own answer.</p><p>Whether you're a new or experienced Developer, you're always learning new things, so write them down for yourself and, if you want, write publicly and share your learnings with others.</p>"
summary: ''
field_daily_email_cta: { }

View file

@ -64,11 +64,11 @@ body:
<p>The answer will be "it depends" based on the project or team, but I'm personally not a fan of squashing commits.</p>
<p>Even though I commit small changes often, I put quite a bit of effort into <a href="http://default/daily/2023/01/24/small-commits-and-good-commit-messges">crafting commits and writing detailed commit messages</a> that capture the reason for each change. If the commits are squashed, either the messages will be combined into one extra-long commit message or I've seen them be deleted completely.</p>
<p>Even though I commit small changes often, I put quite a bit of effort into <a href="/daily/2023/01/24/small-commits-and-good-commit-messges">crafting commits and writing detailed commit messages</a> that capture the reason for each change. If the commits are squashed, either the messages will be combined into one extra-long commit message or I've seen them be deleted completely.</p>
<p>One large commit message would be very difficult to read and connect specific messages with their changes, and deleting the commit body would lose the history completely and waste the time it took to write the messages and craft the commits. It may be available within the pull or merge request page but there's no guarantee that you'll continue to use the same repository hosting service in the future.</p>
<p>One large commit would also be difficult to debug if there was an error. If the whole feature was added in a single commit, tools like <a href="http://default/daily/2023/01/23/debugging-with-git-bisect">git bisect</a> would no longer work and a single commit couldn't be simply reverted if it contained a bug.</p>
<p>One large commit would also be difficult to debug if there was an error. If the whole feature was added in a single commit, tools like <a href="/daily/2023/01/23/debugging-with-git-bisect">git bisect</a> would no longer work and a single commit couldn't be simply reverted if it contained a bug.</p>
<p>I prefer to keep the original small commits and instead prefer to use rebasing and only fast-forward merges to avoid merge commits and keep a simple, linear history in my Git log, and be able to easily read, find and, if needed, fix the code that's been committed.</p>

View file

@ -54,7 +54,7 @@ body:
format: full_html
processed: |
<p><a href="http://default/daily/2023/11/03/why-your-company-should-contribute-to-open-source-software">Yesterday's email</a> explained why your company should contribute to open-source software, but why should you contribute as an individual?</p>
<p><a href="/daily/2023/11/03/why-your-company-should-contribute-to-open-source-software">Yesterday's email</a> explained why your company should contribute to open-source software, but why should you contribute as an individual?</p>
<p>Most of the same reasons apply, such as gaining experience and improved knowledge from contributing.</p>

View file

@ -75,9 +75,9 @@ body:
<p>To me, this indicates the deployment process is too complicated, possibly due to a lack of automation, or deployments aren't happening frequently enough.</p>
<p>Having a <a href="http://default/daily/2025/01/30/gatekeeper">robust and passing CI pipeline</a> that runs automated checks and tests is crucial to know the code is deployable.</p>
<p>Having a <a href="/daily/2025/01/30/gatekeeper">robust and passing CI pipeline</a> that runs automated checks and tests is crucial to know the code is deployable.</p>
<p><a href="http://default/daily/2023/09/28/feature-flags-enable-continuous-integration">Feature flags are a great way</a> to separate deploying code from releasing changes to users, which means you don't need to avoid pushing some code until the change is complete. It can be done incrementally and released over several deployments.</p>
<p><a href="/daily/2023/09/28/feature-flags-enable-continuous-integration">Feature flags are a great way</a> to separate deploying code from releasing changes to users, which means you don't need to avoid pushing some code until the change is complete. It can be done incrementally and released over several deployments.</p>
<p>Too much time between deployments is a smell.</p>

View file

@ -57,7 +57,7 @@ body:
format: full_html
processed: |
<p><a href="http://default/daily/2025/01/13/patches">Applying patch files</a> is a common way to customise and extend open source software, and how we used to submit changes to Drupal before issue forks and merge requests were added to Drupal.org.</p>
<p><a href="/daily/2025/01/13/patches">Applying patch files</a> is a common way to customise and extend open source software, and how we used to submit changes to Drupal before issue forks and merge requests were added to Drupal.org.</p>
<p>Some software, such as dwm and st from suckless.org are released as minimal versions that you patch to add features to.</p>
@ -73,7 +73,7 @@ body:
<p>There are some patches I commonly apply to Drupal projects, but I'll try to either contribute the changes back to the Drupal so I no longer need the patch or make the change in a custom module.</p>
<p>Sometimes, though, <a href="http://default/daily/2025/01/14/patching-drupal">patching is the only option</a>.</p>
<p>Sometimes, though, <a href="/daily/2025/01/14/patching-drupal">patching is the only option</a>.</p>
summary: null

View file

@ -67,7 +67,7 @@ body:
<p>When I first created my website it was on Drupal 6 and upgraded to Drupal 7 before I started to take an interest in static site generators and later using Jekyll, Sculpin and Astro (and Sculpin, again).</p>
<p>I enjoyed learning Sculpin and took it as an opportunity to learn Twig before Drupal 8, which I spoke about in <a href="http://default/presentations/test-drive-twig-with-sculpin">the first Sculpin talk I gave</a>, at DrupalCamp North in July 2015.</p>
<p>I enjoyed learning Sculpin and took it as an opportunity to learn Twig before Drupal 8, which I spoke about in <a href="/presentations/test-drive-twig-with-sculpin">the first Sculpin talk I gave</a>, at DrupalCamp North in July 2015.</p>
<p>I had three Git repositories, the current Sculpin one, the Astro version, and the original Sculpin version with its first commit in March 2015 - a few months before DrupalCamp North.</p>
@ -77,9 +77,9 @@ body:
<p>After fixing some minor merge conflicts, everything was merged successfully and I have [one repository containing 5,272 all commits][2], going back to 2015.</p>
<p>This makes it older than <a href="http://default/daily/2023/08/08/8-years-of-dotfiles">my dotfiles repository</a>, which I started in July 2015.</p>
<p>This makes it older than <a href="/daily/2023/08/08/8-years-of-dotfiles">my dotfiles repository</a>, which I started in July 2015.</p>
<p>Similar to <a href="http://default/daily/2024/07/31/why-i-use-linux">why I use Linux</a>, I believe in owning your own content rather than relying on third-party platforms, so having all my content and history in one repository is great.</p>
<p>Similar to <a href="/daily/2024/07/31/why-i-use-linux">why I use Linux</a>, I believe in owning your own content rather than relying on third-party platforms, so having all my content and history in one repository is great.</p>
<p>And I learned something new about Git at the same time.</p>

View file

@ -44,7 +44,7 @@ body:
format: full_html
processed: |
<p><a href="http://default/podcast/2-alternate-realities">This week's episode</a> of the Beyond Blocks podcast is live, where I speak with Panagiotis Moutsopoulos (vensires on Drupal.org) - Drupal Backend Developer at E-Sepia.</p>
<p><a href="/podcast/2-alternate-realities">This week's episode</a> of the Beyond Blocks podcast is live, where I speak with Panagiotis Moutsopoulos (vensires on Drupal.org) - Drupal Backend Developer at E-Sepia.</p>
<p>We discuss his first time DrupalCon and, more specifically, his session "Drupal's Alternate Realities" - a "Birds of a Feather" (BoF) session presenting some history, but mainly the different ways to tackle a problem in Drupal using different methodologies.</p>

View file

@ -51,7 +51,7 @@ body:
format: full_html
processed: |
<p>As well as <a href="http://default/daily/2024/11/27/nix-as-an-operating-system">my laptop configuration</a>, <a href="http://default/daily/2024/11/30/using-nix-for-local-application-development">local development environments</a> and <a href="http://default/daily/2024/11/28/running-nixos-in-the-cloud">production server</a>, I've also been using Nix for something else recently.</p>
<p>As well as <a href="/daily/2024/11/27/nix-as-an-operating-system">my laptop configuration</a>, <a href="/daily/2024/11/30/using-nix-for-local-application-development">local development environments</a> and <a href="/daily/2024/11/28/running-nixos-in-the-cloud">production server</a>, I've also been using Nix for something else recently.</p>
<p>Setting up and configuring a Homelab on an old laptop.</p>

View file

@ -48,13 +48,13 @@ body:
format: full_html
processed: |
<p>This week on the <a href="http://default/podcast">Beyond Blocks podcast</a>, I'm joined by Dan Leech - a PHP Developer and open-source project creator.</p>
<p>This week on the <a href="/podcast">Beyond Blocks podcast</a>, I'm joined by Dan Leech - a PHP Developer and open-source project creator.</p>
<p>He and I recently gave talks at the PHP South West meetup, where Dan introduced a new project - PHP-TUI - for building terminal user interfaces (TUIs) with PHP.</p>
<p>I use one of Dan's other open-source projects - Phpactor - within Neovim, and he also presented at PHP South Wales about PHPBench, so it was great to discuss and learn more about these in this episode.</p>
<p><a href="http://default/podcast/6-dan-leech-php-tui">Listen to the episode now</a>, and I'll be back with more in the New Year.</p>
<p><a href="/podcast/6-dan-leech-php-tui">Listen to the episode now</a>, and I'll be back with more in the New Year.</p>
summary: null

View file

@ -55,7 +55,7 @@ body:
<p>It simplifies the development environment as there's no need for a separate database like MySQL or MariaDB but, if you'll be using one of those in production, won't that cause more issues when you migrate your local application?</p>
<p>Drupal supports using SQLite, but, other than for <a href="http://default/atdc">my automated testing course</a>, or when running automated tests, I've always used a MySQL or MariaDB database.</p>
<p>Drupal supports using SQLite, but, other than for <a href="/atdc">my automated testing course</a>, or when running automated tests, I've always used a MySQL or MariaDB database.</p>
<p>Maybe this is something to keep an eye on and potentially use more for some scenarios in the future.</p>

View file

@ -93,7 +93,7 @@ body:
format: full_html
processed: |
<p>As well as <a href="http://default/daily/2024/06/03/writing-comments-first">writing comments first</a>, when writing tests, I sometimes like to write my tests backwards and start by writing the assertions first.</p>
<p>As well as <a href="/daily/2024/06/03/writing-comments-first">writing comments first</a>, when writing tests, I sometimes like to write my tests backwards and start by writing the assertions first.</p>
<p>I know what I want to assert in the test, so it's an easy place to start.</p>

View file

@ -55,7 +55,7 @@ body:
format: full_html
processed: |
<p>It's shown in the examples of the <a href="http://default/daily/2023/11/24/are-conventional-commits-worth-it">conventional commits specification</a> as part of the optional footer data.</p>
<p>It's shown in the examples of the <a href="/daily/2023/11/24/are-conventional-commits-worth-it">conventional commits specification</a> as part of the optional footer data.</p>
<p>But is it useful?</p>

View file

@ -54,9 +54,9 @@ body:
<p>It was a great event with around 35 attendees and two other speakers as well as myself.</p>
<p>The <a href="http://default/presentations/things-you-should-know-about-php">latest version of my slides are online</a> as well <a href="http://default/things-about-php">some updated resources</a>.</p>
<p>The <a href="/presentations/things-you-should-know-about-php">latest version of my slides are online</a> as well <a href="/things-about-php">some updated resources</a>.</p>
<p>My next talk will be at the Norfolk Developers conference next month where I'll be presenting an updated version of <a href="http://default/presentations/taking-flight-with-tailwind-css">Taking Flight with Tailwind CSS</a>.</p>
<p>My next talk will be at the Norfolk Developers conference next month where I'll be presenting an updated version of <a href="/presentations/taking-flight-with-tailwind-css">Taking Flight with Tailwind CSS</a>.</p>
<p>If you have a topic idea for a talk or would like me to speak at your meetup or conference, please get in touch.</p>

View file

@ -79,7 +79,7 @@ body:
<p>Drupal works the same locally with access to all the usual core functionality and contrib modules and themes from Drupal.org, but you export everything to static files - the same as using Jekyll or Sculpin.</p>
<p>Sam Mortenson, the creator of the Tome module discussed it on <a href="http://default/podcast/19-sam-mortenson">our episode of the Beyond Blocks podcast</a> where we also talked about single file components.</p>
<p>Sam Mortenson, the creator of the Tome module discussed it on <a href="/podcast/19-sam-mortenson">our episode of the Beyond Blocks podcast</a> where we also talked about single file components.</p>
<p>If you want the power of a flexible content management system and the performance and security benefits of a static website, Tome gives you the best of both worlds.</p>

View file

@ -71,7 +71,7 @@ body:
<p>"CI is the practice of merging all developers' working copies to a shared mainline several times a day"</p>
</blockquote>
<p><a href="http://default/blog/continuous-integration-vs-continuous-integration">I've written about this before</a> and I think the term CI or CI/CD is one of the most misused or misleading in software development.</p>
<p><a href="/blog/continuous-integration-vs-continuous-integration">I've written about this before</a> and I think the term CI or CI/CD is one of the most misused or misleading in software development.</p>
<p>CI, or continuous integration, is, as the post days, the process of everyone merging their changes at least once, or usually several, times a day.</p>

View file

@ -53,7 +53,7 @@ body:
<p>I was able to present talks on automated testing and Tailwind CSS, which were my 99th and 100th talks, respectively!</p>
<p>The sessions were streamed live, or the slides and previous recordings <a href="http://default/dcg">are on my website</a>.</p>
<p>The sessions were streamed live, or the slides and previous recordings <a href="/dcg">are on my website</a>.</p>
<p>It was a great event and it's always nice to see and meet new people within the Drupal community, to see new places and share knowledge by giving presentations.</p>

View file

@ -69,7 +69,7 @@ body:
format: full_html
processed: |
<p>If <a href="http://default/daily/2025/02/18/conflicts">feature branches cause conflicts</a>, what is the alternative?</p>
<p>If <a href="/daily/2025/02/18/conflicts">feature branches cause conflicts</a>, what is the alternative?</p>
<p>Don't branch.</p>
@ -77,7 +77,7 @@ body:
<p>But how can you avoid releasing changes before they are ready?</p>
<p>You can have a local branch with your changes that you don't push and rebase locally, but then <a href="http://default/daily/2025/02/17/ci-cd">you're not doing continuous integration</a> and you're just as likely to get conflicts and have incompatible code.</p>
<p>You can have a local branch with your changes that you don't push and rebase locally, but then <a href="/daily/2025/02/17/ci-cd">you're not doing continuous integration</a> and you're just as likely to get conflicts and have incompatible code.</p>
<p>One of the main benefits of trunk-based development, where everything is on a single branch, is that everyone's work always works together.</p>
@ -97,7 +97,7 @@ body:
<p>For Drupal, there is a <a href="https://www.drupal.org/project/feature_toggle">Feature Toggle module</a> and <a href="https://www.drupal.org/project/feature_toggle_twig">an extension that I wrote</a> that make it easy to use and manage feature toggles by just logging into the admin UI and selecting the active toggles you want.</p>
<p>And, if an issue is discovered, it can also be easily disabled <a href="http://default/daily/2025/02/19/back-or-forward">without needing to roll back to the previous version</a>.</p>
<p>And, if an issue is discovered, it can also be easily disabled <a href="/daily/2025/02/19/back-or-forward">without needing to roll back to the previous version</a>.</p>
summary: null

View file

@ -49,7 +49,7 @@ body:
format: full_html
processed: |
<p>Instead of <a href="http://default/daily/2024/05/31/putting-glue-on-pizza">using AI to autocomplete code</a> or <a href="http://default/daily/2024/10/08/ai-in-drupal">perform tasks within your Drupal website</a>, I've seen people using AI as a virtual pair programming partner.</p>
<p>Instead of <a href="/daily/2024/05/31/putting-glue-on-pizza">using AI to autocomplete code</a> or <a href="/daily/2024/10/08/ai-in-drupal">perform tasks within your Drupal website</a>, I've seen people using AI as a virtual pair programming partner.</p>
<p>Similar to using a search engine or finding results on websites like Stack Overflow, but also being able to ask follow-up questions and for clarification as part of a conversation.</p>

View file

@ -74,9 +74,9 @@ body:
format: full_html
processed: |
<p>I've recently decided I'm going to open source <a href="http://default/presentations/building-build-configs">Build Configs tool</a> that I use to generate build configuration files for Drupal, Sculpin and Fractal projects.</p>
<p>I've recently decided I'm going to open source <a href="/presentations/building-build-configs">Build Configs tool</a> that I use to generate build configuration files for Drupal, Sculpin and Fractal projects.</p>
<p>Inspired by <a href="http://default/presentations/working-with-workspace">Workspace</a> and others, and based on previous versions of similar tools - most recently by <a href="https://github.com/ALT-F4-LLC/build-configs">TheAltF4Stream's project with the same name</a> (which is written in Rust and supports different template types) - I've been using this tool to manage configuration files for various personal, client and open-source projects.</p>
<p>Inspired by <a href="/presentations/working-with-workspace">Workspace</a> and others, and based on previous versions of similar tools - most recently by <a href="https://github.com/ALT-F4-LLC/build-configs">TheAltF4Stream's project with the same name</a> (which is written in Rust and supports different template types) - I've been using this tool to manage configuration files for various personal, client and open-source projects.</p>
<p>Before I open-source it, there are some changes I'd like to make, such as renaming some template types and updating the format and keys within the configuration file.</p>

View file

@ -59,7 +59,7 @@ body:
<p>These services also add extra terminology, such as forks, syncing and pull or merge requests which aren't part of Git itself.</p>
<p>This can cause confusion, which is why <a href="http://default/daily/2022/08/23/git-gui-command-line">I think it's important to learn Git itself</a> instead of relying on external services or desktop apps.</p>
<p>This can cause confusion, which is why <a href="/daily/2022/08/23/git-gui-command-line">I think it's important to learn Git itself</a> instead of relying on external services or desktop apps.</p>
<p>And, if you're going to use a remote repository, consider something like Gitea, which you can host yourself and keep control of your data.</p>

View file

@ -67,7 +67,7 @@ body:
<p>Code is easy to write, but needs to be maintained as newer language or framework features are added or have breaking changes.</p>
<p>Something I've added recently to Build Configs was an option to use an <a href="http://default/daily/2024/01/27/gitignore-inclusive-or-exclusive">inclusive or exclusive .gitignore file</a>.</p>
<p>Something I've added recently to Build Configs was an option to use an <a href="/daily/2024/01/27/gitignore-inclusive-or-exclusive">inclusive or exclusive .gitignore file</a>.</p>
<p>Whilst it's only adding an if condition based on a value, it adds a separate path in my code and both need to be maintained.</p>

View file

@ -63,7 +63,7 @@ body:
format: full_html
processed: |
<p>I recently had <a href="http://default/podcast/27-drupalisms">my first podcast episode with two guests</a>, where I discussed Drupal terminology and Drupalisms with Emma Horrell and Luke McCormick.</p>
<p>I recently had <a href="/podcast/27-drupalisms">my first podcast episode with two guests</a>, where I discussed Drupal terminology and Drupalisms with Emma Horrell and Luke McCormick.</p>
<p>It was a great episode, but there was something I needed to do before I could release it.</p>
@ -71,7 +71,7 @@ body:
<p>The other 26 episodes only had a single guest per episode, and my podcast pages were built to only show the first guest name.</p>
<p>When building the pages for the <a href="http://default/podcast/1-retrofit">first episode with Matt Glaman</a>, I only needed to show a single guest name.</p>
<p>When building the pages for the <a href="/podcast/1-retrofit">first episode with Matt Glaman</a>, I only needed to show a single guest name.</p>
<p>There was no need to show multiple guest names until I had an episode with multiple guests.</p>

View file

@ -69,7 +69,7 @@ body:
format: full_html
processed: |
<p>Last week, I asked <a href="http://default/daily/2024/05/15/should-you-include-issue-ids-in-your-commit-messages">whether you should include issue IDs in commit messages</a>.</p>
<p>Last week, I asked <a href="/daily/2024/05/15/should-you-include-issue-ids-in-your-commit-messages">whether you should include issue IDs in commit messages</a>.</p>
<p>Another thing I like to reference in a commit message is the commit ID (or SHA) of a related commit.</p>

View file

@ -70,7 +70,7 @@ body:
format: full_html
processed: |
<p>Note: The numbers within this post are taken from my <a href="http://default/presentations/tdd-test-driven-drupal">Test-Driven Drupal talk</a>, in which I also talk about this.</p>
<p>Note: The numbers within this post are taken from my <a href="/presentations/tdd-test-driven-drupal">Test-Driven Drupal talk</a>, in which I also talk about this.</p>
<p>My first commit to the 7.x-1.x branch of the Override Node Options module was in March 2012. According to Drupal.org, the module was used on 9,212 websites then.</p>

View file

@ -59,7 +59,7 @@ body:
format: full_html
processed: |
<p><a href="http://default/daily/2023/01/02/dont-use-arbitrary-values-in-tailwind-css">I generally don't use aritrary classes with Tailwind CSS</a>.</p>
<p><a href="/daily/2023/01/02/dont-use-arbitrary-values-in-tailwind-css">I generally don't use aritrary classes with Tailwind CSS</a>.</p>
<p>But, they are powerful, and I do use them in some situations.</p>

View file

@ -62,7 +62,7 @@ body:
processed: |
<p>A few years ago, decoupled or headless Drupal - where Drupal is used as an API with a separate front-end - was very popular with some large Drupal agencies and clients using it.</p>
<p><a href="http://default/talks/decoupling-drupal-vuejs">I gave a conference talk</a> about how to use Drupal as a backend application for a Vue.js frontend.</p>
<p><a href="/talks/decoupling-drupal-vuejs">I gave a conference talk</a> about how to use Drupal as a backend application for a Vue.js frontend.</p>
<p>Recently, though, I haven't heard much about it.</p>

View file

@ -37,6 +37,6 @@ path:
body:
- value: "<p>As well as <a href=\"/daily/2025/04/04/good\">writing good commit messages</a>, I've previously written about <a href=\"/daily/2023/01/25/to-squash-or-not-to-squash\">not squashing commits</a> when merging.</p><p>I think it's beneficial to keep the history of the commits that led to a change, especially if detailed messages have been written for some of the commits.</p><p>Typically, if the commits are squashed as part of a pull or merge request, the history and information is lost or all the messages are merged together - making them hard to read and, arguably, less valuable.</p><p>If you're working in a pair or mob and <a href=\"/daily/2025/06/01/good-commit-messages-dont-always-matter\">creating temporary commits on a short-lived branch</a>, that's a situation when squashing commits is OK - as long as it's done properly.</p><p>I wouldn't have a generic automatically generated message.</p><p>I'd take the time to review the changes on the temporary branch and compare them to the mainline, remove any unrelated changes and write a new commit message that describes all the changes.</p><p>I'd make sure the new message is used and not lost when merged - especially when using online tools.</p><p>Then I can squash any temporary commits and merge the final squashed version.</p>"
format: basic_html
processed: "<p>As well as <a href=\"http://default/daily/2025/04/04/good\">writing good commit messages</a>, I've previously written about <a href=\"http://default/daily/2023/01/25/to-squash-or-not-to-squash\">not squashing commits</a> when merging.</p><p>I think it's beneficial to keep the history of the commits that led to a change, especially if detailed messages have been written for some of the commits.</p><p>Typically, if the commits are squashed as part of a pull or merge request, the history and information is lost or all the messages are merged together - making them hard to read and, arguably, less valuable.</p><p>If you're working in a pair or mob and <a href=\"http://default/daily/2025/06/01/good-commit-messages-dont-always-matter\">creating temporary commits on a short-lived branch</a>, that's a situation when squashing commits is OK - as long as it's done properly.</p><p>I wouldn't have a generic automatically generated message.</p><p>I'd take the time to review the changes on the temporary branch and compare them to the mainline, remove any unrelated changes and write a new commit message that describes all the changes.</p><p>I'd make sure the new message is used and not lost when merged - especially when using online tools.</p><p>Then I can squash any temporary commits and merge the final squashed version.</p>"
processed: "<p>As well as <a href=\"/daily/2025/04/04/good\">writing good commit messages</a>, I've previously written about <a href=\"/daily/2023/01/25/to-squash-or-not-to-squash\">not squashing commits</a> when merging.</p><p>I think it's beneficial to keep the history of the commits that led to a change, especially if detailed messages have been written for some of the commits.</p><p>Typically, if the commits are squashed as part of a pull or merge request, the history and information is lost or all the messages are merged together - making them hard to read and, arguably, less valuable.</p><p>If you're working in a pair or mob and <a href=\"/daily/2025/06/01/good-commit-messages-dont-always-matter\">creating temporary commits on a short-lived branch</a>, that's a situation when squashing commits is OK - as long as it's done properly.</p><p>I wouldn't have a generic automatically generated message.</p><p>I'd take the time to review the changes on the temporary branch and compare them to the mainline, remove any unrelated changes and write a new commit message that describes all the changes.</p><p>I'd make sure the new message is used and not lost when merged - especially when using online tools.</p><p>Then I can squash any temporary commits and merge the final squashed version.</p>"
summary: ''
field_daily_email_cta: { }

View file

@ -55,7 +55,7 @@ body:
<p>I also got to meet Jürgen at DrupalCon in Barcelona, as well as several other podcast guests, which was fantastic.</p>
<p><a href="http://default/podcast/23-jurgen-haas-eca">Listen to the episode now</a>.</p>
<p><a href="/podcast/23-jurgen-haas-eca">Listen to the episode now</a>.</p>
<p>If you'd like to be a guest on the podcast or want to suggest a topic, reply and let me know!</p>

View file

@ -58,7 +58,7 @@ body:
format: full_html
processed: |
<p>Yesterday, I wanted to make a breaking change to my <a href="http://default/daily/2023/03/04/why-i-built-a-tool-to-generate-configuration-files">build-configs project</a> - changing the default database credentials that are used by Docker Compose.</p>
<p>Yesterday, I wanted to make a breaking change to my <a href="/daily/2023/03/04/why-i-built-a-tool-to-generate-configuration-files">build-configs project</a> - changing the default database credentials that are used by Docker Compose.</p>
<p>As I have several projects based on generated files by the tool, changing the values could cause issues in those projects in the future and this is something that I wanted to avoid.</p>

View file

@ -65,7 +65,7 @@ body:
<p>After this spike, I'm intrigued to see how we could use web components and what potential issues we can solve with them whilst reducing our implementation and maintenance efforts.</p>
<p>Are you interested in web components, too? <a href="http://default/podcast/11-mark-conroy">Listen to the podcast episode with Mark Conroy</a>.</p>
<p>Are you interested in web components, too? <a href="/podcast/11-mark-conroy">Listen to the podcast episode with Mark Conroy</a>.</p>
summary: null

View file

@ -91,7 +91,7 @@ body:
}
}
</code></pre><p>Note the <code>DailyEmail</code> class is <a href="http://default/daily/2025/06/17/drupal-bundle-classes">a bundle class</a> I've created that extends the regular <code>Node</code> class.</p>
</code></pre><p>Note the <code>DailyEmail</code> class is <a href="/daily/2025/06/17/drupal-bundle-classes">a bundle class</a> I've created that extends the regular <code>Node</code> class.</p>
<p>Different to a service, the class name describes the action being performed - usually starting with a verb followed by a noun to describe the action being taken and the object it's being taken on.</p>
<p>It's a simple pattern that doesn't require additional packages or libraries, and it's easy to implement in different frameworks and other languages.</p>
<p>Whether you call this an Action, Command or something else, I like that it encourages writing more structured code that's easy to read and test.</p>

View file

@ -94,9 +94,9 @@ body:
format: full_html
processed: |
<p>As well as <a href="http://default/daily/2025/04/05/strategies">working with different versions of an API</a>, I was able to use the same technique I wrote about yesterday to easily add a cacheable version of the API client.</p>
<p>As well as <a href="/daily/2025/04/05/strategies">working with different versions of an API</a>, I was able to use the same technique I wrote about yesterday to easily add a cacheable version of the API client.</p>
<p>As they all implement the same <code>ApiClientInterface</code>, I can inject and decorate a client with another client, making one solely responsible for caching the result from the API whilst keeping the API interaction logic separate (aka <a href="http://default/daily/2022/12/08/the-decorator-design-pattern">the Decorator design pattern</a>).</p>
<p>As they all implement the same <code>ApiClientInterface</code>, I can inject and decorate a client with another client, making one solely responsible for caching the result from the API whilst keeping the API interaction logic separate (aka <a href="/daily/2022/12/08/the-decorator-design-pattern">the Decorator design pattern</a>).</p>
<p>Here's an example based on the code I wrote:</p>

View file

@ -37,6 +37,6 @@ path:
body:
- value: '<p>I have recently <a href="/daily/2025/05/11/email-archive-tome">migrated my daily email archive</a> to Drupal and Tome.</p><p>The result is the same - a static website that I can upload onto my server, but it''s created with Drupal 11 locally and exported to a static website.</p><p>Similar to being able to <a href="/daily/2025/05/02/extend">extend Sculpin with PHP</a>, I get the same benefit with Tome.</p><p>I can write the same PHP code and custom Drupal modules as I would with a non-Tome Drupal website.</p><p>To count the number of sent daily emails, I created a <code>opd_daily_emails</code> module with a token that generates the number of emails, and displays it on the page.</p><p>I can also write the same automated tests.</p><p>I have a functional test that confirms the token result is generated and rendered correctly using <code>TokenTestTrait</code> - supported by some kernel tests and a custom <code>DailyEmailTestTrait</code> that makes it easier to create daily email nodes within the tests.</p><p>I have all the power and flexibility of Drupal locally and the benefits of a static site when it''s deployed.</p><p>P.S. If you want to learn how to write automated tests in Drupal, subscribe to <a href="/atdc">my free 10-day email course</a>.</p>'
format: basic_html
processed: '<p>I have recently <a href="http://default/daily/2025/05/11/email-archive-tome">migrated my daily email archive</a> to Drupal and Tome.</p><p>The result is the same - a static website that I can upload onto my server, but it''s created with Drupal 11 locally and exported to a static website.</p><p>Similar to being able to <a href="http://default/daily/2025/05/02/extend">extend Sculpin with PHP</a>, I get the same benefit with Tome.</p><p>I can write the same PHP code and custom Drupal modules as I would with a non-Tome Drupal website.</p><p>To count the number of sent daily emails, I created a <code>opd_daily_emails</code> module with a token that generates the number of emails, and displays it on the page.</p><p>I can also write the same automated tests.</p><p>I have a functional test that confirms the token result is generated and rendered correctly using <code>TokenTestTrait</code> - supported by some kernel tests and a custom <code>DailyEmailTestTrait</code> that makes it easier to create daily email nodes within the tests.</p><p>I have all the power and flexibility of Drupal locally and the benefits of a static site when it''s deployed.</p><p>P.S. If you want to learn how to write automated tests in Drupal, subscribe to <a href="http://default/atdc">my free 10-day email course</a>.</p>'
processed: '<p>I have recently <a href="/daily/2025/05/11/email-archive-tome">migrated my daily email archive</a> to Drupal and Tome.</p><p>The result is the same - a static website that I can upload onto my server, but it''s created with Drupal 11 locally and exported to a static website.</p><p>Similar to being able to <a href="/daily/2025/05/02/extend">extend Sculpin with PHP</a>, I get the same benefit with Tome.</p><p>I can write the same PHP code and custom Drupal modules as I would with a non-Tome Drupal website.</p><p>To count the number of sent daily emails, I created a <code>opd_daily_emails</code> module with a token that generates the number of emails, and displays it on the page.</p><p>I can also write the same automated tests.</p><p>I have a functional test that confirms the token result is generated and rendered correctly using <code>TokenTestTrait</code> - supported by some kernel tests and a custom <code>DailyEmailTestTrait</code> that makes it easier to create daily email nodes within the tests.</p><p>I have all the power and flexibility of Drupal locally and the benefits of a static site when it''s deployed.</p><p>P.S. If you want to learn how to write automated tests in Drupal, subscribe to <a href="/atdc">my free 10-day email course</a>.</p>'
summary: ''
field_daily_email_cta: { }

View file

@ -57,7 +57,7 @@ body:
<li><a href="https://www.drupal.org/u/vensires">Panagiotis on Drupal.org (vensires)</a></li>
<li><a href="https://www.e-sepia.gr">E-Sepia</a></li>
<li><a href="https://www.linkedin.com/in/panagiotis-moutsopoulos/">Panagiotis on LinkedIn</a></li>
<li><a href="http://default/drupal.org.gr">https://drupal.org.gr</a></li>
<li><a href="/drupal.org.gr">https://drupal.org.gr</a></li>
<li><a href="https://www.frontendunited.com">Frontend United</a></li>
</ul>
summary: ''

View file

@ -61,7 +61,7 @@ body:
<p>A common approach seems to be to use Docker and Docker Compose to run things in containers, especially ones that need multiple services like a web server, a database and a cache or proxy.</p>
<p><a href="http://default/daily/2024/12/09/drupal-devenv">I've moved my development projects from Docker to devenv</a>, but I still have Docker installed and available.</p>
<p><a href="/daily/2024/12/09/drupal-devenv">I've moved my development projects from Docker to devenv</a>, but I still have Docker installed and available.</p>
<p>I knew it was easy to create a container image from a Nix-based setup, but the opposite is also true.</p>

View file

@ -90,7 +90,7 @@ body:
<h2 id="want-to-learn-more%3F">Want to learn more?</h2>
<p>If you want to learn more about automated testing in Drupal, <a href="http://default/talks/tdd-test-driven-drupal">I have a talk about that</a>.</p>
<p>If you want to learn more about automated testing in Drupal, <a href="/talks/tdd-test-driven-drupal">I have a talk about that</a>.</p>
summary: null

View file

@ -68,9 +68,9 @@ body:
<p>No-one wants to work on it.</p>
<p>But, what happens when it needs to change?</p>
<p>How can you do it and be confident the change doesn't break the existing functionality?</p>
<p>Before you make any changes, identify the use cases of the current code and cover them by <a href="http://default/presentations/tdd-test-driven-drupal">writing automated tests</a>.</p>
<p>Before you make any changes, identify the use cases of the current code and cover them by <a href="/presentations/tdd-test-driven-drupal">writing automated tests</a>.</p>
<p>Functional, web or browser tests allow you to make HTTP requests to an endpoint and make assertions on a response, and ensure it returns the correct status code and content, rather than focussing on the implementation details.</p>
<p>If you need to test an existing Drupal website, <a href="http://default/daily/2025/06/18/exploring-drupal-test-traits">use Drupal Test Traits</a>.</p>
<p>If you need to test an existing Drupal website, <a href="/daily/2025/06/18/exploring-drupal-test-traits">use Drupal Test Traits</a>.</p>
<p>Once you have tests in place, you can make the required changes and ensure the original functionality still works by running them and checking they still pass.</p>
<p>Hopefully, you'll have written tests for the new functionality, so the test suite will start to grow.</p>
summary: ''

View file

@ -56,7 +56,7 @@ body:
<p>As Tailwind includes no components (other than the <code>container</code>) and only has low-level utility classes for things like spacing and colours (amongst many other things), you can build radically different-looking websites with the same classes.</p>
<p>There are some <a href="http://default/blog/uis-ive-rebuilt-tailwind-css">examples of UIs that I've rebuilt</a> and some websites that I show in my <a href="http://default/talks/taking-flight-with-tailwind-css">Taking Flight with Tailwind CSS talk</a>.</p>
<p>There are some <a href="/blog/uis-ive-rebuilt-tailwind-css">examples of UIs that I've rebuilt</a> and some websites that I show in my <a href="/talks/taking-flight-with-tailwind-css">Taking Flight with Tailwind CSS talk</a>.</p>
<p>If you take a look, you'll see what I mean.</p>

View file

@ -57,7 +57,7 @@ body:
format: full_html
processed: |
<p>In yesterday's email, I wrote about why <a href="http://default/daily/2024/08/16/what-are-err--req-and-res">readable variable names are important</a> and why I use descriptive variable names in my code.</p>
<p>In yesterday's email, I wrote about why <a href="/daily/2024/08/16/what-are-err--req-and-res">readable variable names are important</a> and why I use descriptive variable names in my code.</p>
<p>Given this pseudo-code:</p>

View file

@ -70,7 +70,7 @@ body:
<p>These days, I use trunk-based development as much as possible, so I hardly ever create new branches, whether working on a project myself or with a team.</p>
<p><a href="http://default/presentations/git-flow">I used to use Git Flow</a> and create branches for every new feature and bug fix, but I remember, whilst demonstrating two work-in-progress features to a client, switching between the different branches caused my local site to break. Whilst it wasnt a major issue, it wouldn't have seemed professional.</p>
<p><a href="/presentations/git-flow">I used to use Git Flow</a> and create branches for every new feature and bug fix, but I remember, whilst demonstrating two work-in-progress features to a client, switching between the different branches caused my local site to break. Whilst it wasnt a major issue, it wouldn't have seemed professional.</p>
<p>In a team environment, feature branches are intended to keep different changes and different people's work separate.</p>

View file

@ -46,7 +46,7 @@ body:
processed: |
<p>This week, I'll be in Lille, France for DrupalCon Europe, where I'm presenting a session on automated testing and test-driven development in Drupal.</p>
<p>I'll be taking a short break from these emails to enjoy the conference, focus on my talk, and finish my <a href="http://default/atdc">free email course on automated testing in Drupal</a>.</p>
<p>I'll be taking a short break from these emails to enjoy the conference, focus on my talk, and finish my <a href="/atdc">free email course on automated testing in Drupal</a>.</p>
summary: null

View file

@ -59,7 +59,7 @@ body:
<p>We've had online meetups and code practice sessions throughout the pandemic and during lockdowns, but this will be our first offline/in person/IRL meetup since February 2020.</p>
<p>As well as organising our online meetups during COVID, I attended a lot of other online events, <a href="http://default/blog/speaking-remotely-during-covid-19">usually giving various talks or workshops</a>, and whilst they were good for a while, I eventually started to get burned out by them.</p>
<p>As well as organising our online meetups during COVID, I attended a lot of other online events, <a href="/blog/speaking-remotely-during-covid-19">usually giving various talks or workshops</a>, and whilst they were good for a while, I eventually started to get burned out by them.</p>
<p>I've been an organiser of various meetups and conferences for a long time, and attending events has been a very large part of my career so far - providing opportunities to learn, to network and socialise with other attendees, and pass knowledge on through talks, workshops and mentoring.</p>

View file

@ -80,7 +80,7 @@ body:
format: full_html
processed: |
<p>Last month, I wrote an email explaining <a href="http://default/daily/2024/02/28/why-i-dont-branch">why I don't create branches</a>.</p>
<p>Last month, I wrote an email explaining <a href="/daily/2024/02/28/why-i-dont-branch">why I don't create branches</a>.</p>
<p>After sending that email, I received this question from a reader (shared with permission):</p>
@ -98,7 +98,7 @@ body:
<h2 id="option-1%3A-worktrees">Option 1: Worktrees</h2>
<p>Whilst I don't create branches, I do use <a href="http://default/daily/2022/08/12/git-worktrees-docker-compose">Git worktrees</a>, which allows me to have multiple versions of the code checked out at the same time - similar to having multiple clones of a repository.</p>
<p>Whilst I don't create branches, I do use <a href="/daily/2022/08/12/git-worktrees-docker-compose">Git worktrees</a>, which allows me to have multiple versions of the code checked out at the same time - similar to having multiple clones of a repository.</p>
<p>Having multiple worktrees, you don't need to stash the code for your incomplete feature or worry about commits you haven't pushed yet.</p>
@ -108,7 +108,7 @@ body:
<h2 id="option-2%3A-feature-flags">Option 2: Feature Flags</h2>
<p>My preferred approach is to use <a href="http://default/daily/2022/12/07/separating-releases-from-deployments-with-feature-flags">feature flags</a>, a.k.a. feature toggles.</p>
<p>My preferred approach is to use <a href="/daily/2022/12/07/separating-releases-from-deployments-with-feature-flags">feature flags</a>, a.k.a. feature toggles.</p>
<p>My wrapping the incomplete feature in a feature flag, it can be deployed but won't be active until the flag is enabled - similar to writing a new Drupal module but not enabling it.</p>

View file

@ -45,7 +45,7 @@ body:
format: full_html
processed: |
<p>In <a href="http://default/podcast/8-eirik-morland-violinist">today's episode of the Beyond Blocks podcast</a>, I'm joined by Eirik Morland - the Developer of <a href="https://violinist.io">Violinist</a>.</p>
<p>In <a href="/podcast/8-eirik-morland-violinist">today's episode of the Beyond Blocks podcast</a>, I'm joined by Eirik Morland - the Developer of <a href="https://violinist.io">Violinist</a>.</p>
<p>We discuss why you'd want to use a tool like Violinist to manage your dependency updates, why you'd want to automate repetitive tasks and focus on providing value for clients and customers.</p>

View file

@ -57,7 +57,7 @@ body:
format: full_html
processed: |
<p><a href="http://default/archives/2022/09/03/creating-infrastructure-with-ansible">In yesterday's email</a>, I described how to set up a blank server with Ansible.</p>
<p><a href="/archives/2022/09/03/creating-infrastructure-with-ansible">In yesterday's email</a>, I described how to set up a blank server with Ansible.</p>
<p>Now that we've done that, it needs to be configured.</p>
@ -73,7 +73,7 @@ body:
<hr>
<p>Want to learn more about how I use Ansible? <a href="http://default/ansible-course">Register for my upcoming free email course</a>.</p>
<p>Want to learn more about how I use Ansible? <a href="/ansible-course">Register for my upcoming free email course</a>.</p>
summary: null

View file

@ -55,7 +55,7 @@ body:
format: full_html
processed: |
<p><a href="http://default/daily/2024/03/04/why-you-need-layers-in-your-application-code">Yesterday</a>, I wrote about writing layers in your application code and the benefits of loosely coupled code.</p>
<p><a href="/daily/2024/03/04/why-you-need-layers-in-your-application-code">Yesterday</a>, I wrote about writing layers in your application code and the benefits of loosely coupled code.</p>
<p>Something else you can do with this approach is to write framework-agnostic code.</p>

View file

@ -67,8 +67,8 @@ body:
[4]: https://www.drupal.org/project/dtt
format: markdown
processed: |
<p>I've <a href="http://default/presentations/tdd-test-driven-drupal">given talks and workshops</a> on automated testing in Drupal.</p>
<p>I created <a href="http://default/atdc">a free 10-day email course</a>.</p>
<p>I've <a href="/presentations/tdd-test-driven-drupal">given talks and workshops</a> on automated testing in Drupal.</p>
<p>I created <a href="/atdc">a free 10-day email course</a>.</p>
<p>Something I haven't used until recently is <a href="https://www.drupal.org/project/dtt">Drupal Test Traits</a>.</p>
<p>The built-in PHPUnit tests create a new installation of Drupal for each test, setting up everything from scratch and installing the specified modules and configuration for each test.</p>
<p>The tests don't know about the site they're running on, which is what allows them to run in Drupal CI or on any Developer's computer.</p>

View file

@ -38,5 +38,5 @@ path:
body:
- value: '<p>P.S. Do you want to contribute more to open source but don''t have the time? <a href="/sponsor">Sponsor me to do it for you</a>!</p>'
format: basic_html
processed: '<p>P.S. Do you want to contribute more to open source but don''t have the time? <a href="http://default/sponsor">Sponsor me to do it for you</a>!</p>'
processed: '<p>P.S. Do you want to contribute more to open source but don''t have the time? <a href="/sponsor">Sponsor me to do it for you</a>!</p>'
summary: ''

View file

@ -51,7 +51,7 @@ body:
processed: |
<p>At Saturday's hackathon that I mentioned in yesterday's email, most of the squads decided to try Tailwind CSS in their applications.</p>
<p>I've been using Tailwind since it was released, and first gave <a href="http://default/presentations/taking-flight-with-tailwind-css">a Tailwind CSS talk</a> in January 2018.</p>
<p>I've been using Tailwind since it was released, and first gave <a href="/presentations/taking-flight-with-tailwind-css">a Tailwind CSS talk</a> in January 2018.</p>
<p>It's one of my most popular talks and, during COVID lockdowns, I also gave a workshop/webinar on Tailwind CSS for some online conferences.</p>

View file

@ -53,13 +53,13 @@ body:
format: full_html
processed: |
<p>As someone who develops with open-source software such as Drupal, Symfony, and Sculpin and uses Linux to <a href="http://default/daily/2024/11/28/running-nixos-in-the-cloud">host my applications</a> and <a href="http://default/daily/2024/11/23/no-more-random-packages">configure my laptop</a>, I've recently started to explore creating a home lab and self-hosting services based on other open source software.</p>
<p>As someone who develops with open-source software such as Drupal, Symfony, and Sculpin and uses Linux to <a href="/daily/2024/11/28/running-nixos-in-the-cloud">host my applications</a> and <a href="/daily/2024/11/23/no-more-random-packages">configure my laptop</a>, I've recently started to explore creating a home lab and self-hosting services based on other open source software.</p>
<p>I've started using Jellyfin for media management and playback, Immich for photos, Gitea for hosting my private Git repositories, and Tube Archivist for backing up YouTube videos.</p>
<p>There are a lot of other popular applications that people self-host that I want to look at, as well as maybe hosting my own website.</p>
<p>I've removed proprietary note-taking applications <a href="http://default/daily/2024/11/10/write-plain-text-files">in favour of plain text files</a> and continued searching for free and open source alternatives to services I've used.</p>
<p>I've removed proprietary note-taking applications <a href="/daily/2024/11/10/write-plain-text-files">in favour of plain text files</a> and continued searching for free and open source alternatives to services I've used.</p>
<p>My ethos is to be open source first and to favour an open source solution if there is one.</p>

View file

@ -94,7 +94,7 @@ body:
<p>I prefer not to have to consistently think about which to use and, if possible, like to use standard approaches in different codebases whether I'm working on a Drupal project, a Symfony project, or a PHP library.</p>
<p>Plus, I get to use new PHP features like <a href="http://default/daily/2023/04/12/cleaner-php-code-with-promoted-constructor-properties">promoted constructor properties</a> if everything is named in the same format.</p>
<p>Plus, I get to use new PHP features like <a href="/daily/2023/04/12/cleaner-php-code-with-promoted-constructor-properties">promoted constructor properties</a> if everything is named in the same format.</p>
summary: null

View file

@ -85,7 +85,7 @@ body:
<p>If you're familiar with the DevOps Research and Assessment (DORA) team, three of their key metrics are deployment frequency, lead time for changes, and time to restore service. All of these are improved by small and frequent releases.</p>
<p>In my <a href="http://default/presentations/deploying-php-ansible-ansistrano">Deployments with Ansible and Ansistrano talk</a>, I mention that there is a separate rollback role, but I don't think that I've ever used it.</p>
<p>In my <a href="/presentations/deploying-php-ansible-ansistrano">Deployments with Ansible and Ansistrano talk</a>, I mention that there is a separate rollback role, but I don't think that I've ever used it.</p>
<p>Because I'm deploying small changes often, it's usually much easier to fix forward than it is to rollback, and knowing this makes me a lot less anxious when deploying changes.</p>

View file

@ -70,7 +70,7 @@ body:
<p>If you wanted, you could enable a feature flag for a subset or a certain subsection of your users - allowing them to test it before making it available to everyone.</p>
<p>Another way I use feature flags is within a <a href="http://default/daily/2022/11/13/how-i-manage-multiple-drupal-websites-using-the-same-codebase">multi-site Drupal application</a> to enable a different feature set per site and allow me to keep one version of the code for all sites to keep this easy to manage and maintain.</p>
<p>Another way I use feature flags is within a <a href="/daily/2022/11/13/how-i-manage-multiple-drupal-websites-using-the-same-codebase">multi-site Drupal application</a> to enable a different feature set per site and allow me to keep one version of the code for all sites to keep this easy to manage and maintain.</p>
summary: null

View file

@ -37,6 +37,6 @@ path:
body:
- value: '<p>A few days ago, I published a new episode of the Beyond Blocks podcast with Luke McCormick, where we spoke about using AI and tools like Cursor for web coding.</p><p>Unfortunately, there was an export issue with the episode that affected the sound quality.</p><p>The recording was fine and the mp3 file was re-created and uploaded again to the episode page and the podcast feed for Spotify, Pocket Casts, etc.</p><p><a href="/podcast/28-using-ai-tools-web-coding">Listen to the episode here</a>.</p><p>Apologies to Luke and anyone who listened to the original release for the poor quality, but it should be fine now and I''ll add this to my checklist when editing podcast episodes to ensure it doesn''t happen again.</p>'
format: basic_html
processed: '<p>A few days ago, I published a new episode of the Beyond Blocks podcast with Luke McCormick, where we spoke about using AI and tools like Cursor for web coding.</p><p>Unfortunately, there was an export issue with the episode that affected the sound quality.</p><p>The recording was fine and the mp3 file was re-created and uploaded again to the episode page and the podcast feed for Spotify, Pocket Casts, etc.</p><p><a href="http://default/podcast/28-using-ai-tools-web-coding">Listen to the episode here</a>.</p><p>Apologies to Luke and anyone who listened to the original release for the poor quality, but it should be fine now and I''ll add this to my checklist when editing podcast episodes to ensure it doesn''t happen again.</p>'
processed: '<p>A few days ago, I published a new episode of the Beyond Blocks podcast with Luke McCormick, where we spoke about using AI and tools like Cursor for web coding.</p><p>Unfortunately, there was an export issue with the episode that affected the sound quality.</p><p>The recording was fine and the mp3 file was re-created and uploaded again to the episode page and the podcast feed for Spotify, Pocket Casts, etc.</p><p><a href="/podcast/28-using-ai-tools-web-coding">Listen to the episode here</a>.</p><p>Apologies to Luke and anyone who listened to the original release for the poor quality, but it should be fine now and I''ll add this to my checklist when editing podcast episodes to ensure it doesn''t happen again.</p>'
summary: ''
field_daily_email_cta: { }

View file

@ -75,7 +75,7 @@ body:
<p>I can also use direnv to achieve the same result by adding these lines to an .envrc file:</p>
<pre><code>use flake git+https://code.oliverdavies.uk/opdavies/dev-shells#php74
use flake git+https://code.oliverdavies.uk/opdavies/dev-shells#tailwindcss
</code></pre><p>For long-term projects, I would create and commit a <a href="http://default/daily/2025/06/26/project-specific-dependencies-nix-flakes">specific flake.nix file</a> to the code repository so the environment is reproducible and the packages are locked, but this works when I just need something quickly.</p>
</code></pre><p>For long-term projects, I would create and commit a <a href="/daily/2025/06/26/project-specific-dependencies-nix-flakes">specific flake.nix file</a> to the code repository so the environment is reproducible and the packages are locked, but this works when I just need something quickly.</p>
summary: ''
field_daily_email_cta:
- target_type: node

View file

@ -87,9 +87,9 @@ body:
<p>I use Sculpin for <a href="https://github.com/opdavies/oliverdavies.uk">this website</a> and client projects that don't need the features of a CMS or framework with the ability to have reusable components and functionality provided by Twig (this works great with Tailwind CSS, too).</p>
<p>I used it to <a href="http://default/test-drive-twig-with-sculpin">learn Twig before Drupal 8 was released</a>, back in 2015.</p>
<p>I used it to <a href="/test-drive-twig-with-sculpin">learn Twig before Drupal 8 was released</a>, back in 2015.</p>
<p>I've also given a talk on <a href="http://default/building-static-websites-sculpin">building websites with Sculpin</a> which I may submit to some upcoming conferences.</p>
<p>I've also given a talk on <a href="/building-static-websites-sculpin">building websites with Sculpin</a> which I may submit to some upcoming conferences.</p>
summary: null

View file

@ -62,7 +62,7 @@ body:
<p>That could declare the modules and themes you want to include, without the additional overhead.</p>
<p><a href="http://default/daily/2023/12/14/save-time-and-effort-with-drupal-distributions">drupal distribution</a></p>
<p><a href="/daily/2023/12/14/save-time-and-effort-with-drupal-distributions">drupal distribution</a></p>
summary: null

View file

@ -53,7 +53,7 @@ body:
format: full_html
processed: |
<p>The <a href="http://default/daily/2024/12/24/moving-changes">harder it is to update an environment</a>, the less often it will be done and the more out of sync your environments will become.</p>
<p>The <a href="/daily/2024/12/24/moving-changes">harder it is to update an environment</a>, the less often it will be done and the more out of sync your environments will become.</p>
<p>The more out of sync your environments are, the higher the chance there will be bugs or issues when changes are moved between environments.</p>

View file

@ -55,7 +55,7 @@ body:
format: full_html
processed: |
<p><a href="http://default/daily/2022/08/15/using-run-file-simplify-project-tasks">I've written a few earlier emails</a> about <code>run</code> files - a simple bash file that I add to my projects to simplify or combine common commands that I need to run often.</p>
<p><a href="/daily/2022/08/15/using-run-file-simplify-project-tasks">I've written a few earlier emails</a> about <code>run</code> files - a simple bash file that I add to my projects to simplify or combine common commands that I need to run often.</p>
<p>Recently, I've looked at a couple of alternatives to see how they compare.</p>

View file

@ -63,7 +63,7 @@ body:
Having consistent approaches makes projects more robust and easier to work on.
format: markdown
processed: |
<p>Yesterday, I wrote about some of my <a href="http://default/daily/2025/06/20/my-thoughts-action-pattern">thoughts about the Action pattern</a> that's become popular with PHP Developers.</p>
<p>Yesterday, I wrote about some of my <a href="/daily/2025/06/20/my-thoughts-action-pattern">thoughts about the Action pattern</a> that's become popular with PHP Developers.</p>
<p>I showed an example based on the <code>AddRandomCtaToDailyEmail</code> action class from my website.</p>
<p>But, how should these classes be named?</p>
<p>Should my example by <code>AddRandomCtaToDailyEmail</code> or <code>AddRandomCtaToDailyEmailAction</code>?</p>

View file

@ -73,7 +73,7 @@ body:
<p>If your CI pipeline passes, the commit is good can be deployed.</p>
<p>If it fails, the commit should not be deployed and you should get it passing again as quickly as possible as <a href="http://default/daily/2023/06/28/theres-no-value-in-a-broken-ci-pipeline">there's no value in a broken CI pipeline</a>.</p>
<p>If it fails, the commit should not be deployed and you should get it passing again as quickly as possible as <a href="/daily/2023/06/28/theres-no-value-in-a-broken-ci-pipeline">there's no value in a broken CI pipeline</a>.</p>
summary: null

View file

@ -61,7 +61,7 @@ body:
<p>Will you be migrating to Drupal 10, or something else?</p>
<p>If you need help, with <a href="http://default/drupal-upgrade">my Drupal 7 upgrade roadmap</a>, I'll create an individual plan to upgrade and enjoy easy upgrades to Drupal 11 and beyond!</p>
<p>If you need help, with <a href="/drupal-upgrade">my Drupal 7 upgrade roadmap</a>, I'll create an individual plan to upgrade and enjoy easy upgrades to Drupal 11 and beyond!</p>
summary: null

View file

@ -51,9 +51,9 @@ body:
<p>We discussed the work happening in Drupal and Drupal CMS to de-jargon Drupal, the Drupalisms working group.</p>
<p><a href="http://default/podcast/27-drupalisms">Listen to the episode here</a>.</p>
<p><a href="/podcast/27-drupalisms">Listen to the episode here</a>.</p>
<p>If you want to be a guest on the <a href="http://default/podcast">Beyond Blocks podcast</a>, reply and let me know.</p>
<p>If you want to be a guest on the <a href="/podcast">Beyond Blocks podcast</a>, reply and let me know.</p>
summary: null

View file

@ -69,7 +69,7 @@ body:
format: full_html
processed: |
<p>Since I posted about <a href="http://default/daily/2024/05/10/optimise-for-revertability">optimising for revertability</a>, I've received a few questions about how I avoid merge commits when working with Git.</p>
<p>Since I posted about <a href="/daily/2024/05/10/optimise-for-revertability">optimising for revertability</a>, I've received a few questions about how I avoid merge commits when working with Git.</p>
<p>This is an extract from my <code>.config/git/.config</code> file:</p>
@ -97,7 +97,7 @@ body:
<p>When working with online tools such as GitHub and GitLab, I avoid any options like <code>Squash and merge</code> or <code>Create a merge commit</code> and will use rebase options, although I've seen where different commit IDs have been generated when merged in the UI, which is why I prefer to do merges locally.</p>
<p>Or use <a href="http://default/daily/2023/06/17/avoid-git-merge-hell-with-trunk-based-development">trunk-based development</a> and don't work on topic branches at all.</p>
<p>Or use <a href="/daily/2023/06/17/avoid-git-merge-hell-with-trunk-based-development">trunk-based development</a> and don't work on topic branches at all.</p>
summary: null

View file

@ -53,7 +53,7 @@ body:
format: full_html
processed: |
<p>When you're working on a task - <a href="http://default/daily/2024/08/31/make-it-work-then-make-it-good">whether you're making it work or making it good</a>, you can commit your code changes as often as you like.</p>
<p>When you're working on a task - <a href="/daily/2024/08/31/make-it-work-then-make-it-good">whether you're making it work or making it good</a>, you can commit your code changes as often as you like.</p>
<p>You should definitely commit your changes every time you have a working iteration, even if it's not the complete or final version, or even if the code doesn't pass all the coding standards and static analysis checks.</p>

View file

@ -51,7 +51,7 @@ body:
format: full_html
processed: |
<p>As I said <a href="http://default/daily/2025/02/10/refactoring">in yesterday's email</a>, sometimes you change your mind whilst working on something.</p>
<p>As I said <a href="/daily/2025/02/10/refactoring">in yesterday's email</a>, sometimes you change your mind whilst working on something.</p>
<p>Maybe you change your approach and have a commit that supersedes an earlier one, fix a typo, or find a bug and need to revert a commit.</p>

View file

@ -37,6 +37,6 @@ path:
body:
- value: '<p>I use NixOS as the Linux distribution on my laptop and home server, and specifically the unstable channel.</p><p>This is the "rolling" version of NixOS that is continuously updated with the newest and latest packages, compared to the stable releases like 24.11 and 25.05 that are released twice a year.</p><p>I don''t necessarily do this to get the latest packages.</p><p>I do it to keep on top of configuration changes.</p><p>I run "nix flake update" usually once a week to download the latest updates.</p><p>If there are breaking changes or notices since I last updated, I can address them and do it iteratively rather than waiting to do them every six months.</p><p>Similar to application deployments, <a href="/daily/2023/05/14/releasing-small-changes-often-is-less-risky">I update early and often</a>.</p><p>One of the great things about NixOS is, if there is an application that breaks on the unstable branch, I can pin it to the stable release until it works again.</p><p>This means I get the benefits of both the rolling and stable approaches.</p><p>If you want to see my NixOS configuration, it''s <a href="https://code.oliverdavies.uk/opdavies/nix-config">publicly available on my Forgejo instance</a>.</p>'
format: basic_html
processed: '<p>I use NixOS as the Linux distribution on my laptop and home server, and specifically the unstable channel.</p><p>This is the "rolling" version of NixOS that is continuously updated with the newest and latest packages, compared to the stable releases like 24.11 and 25.05 that are released twice a year.</p><p>I don''t necessarily do this to get the latest packages.</p><p>I do it to keep on top of configuration changes.</p><p>I run "nix flake update" usually once a week to download the latest updates.</p><p>If there are breaking changes or notices since I last updated, I can address them and do it iteratively rather than waiting to do them every six months.</p><p>Similar to application deployments, <a href="http://default/daily/2023/05/14/releasing-small-changes-often-is-less-risky">I update early and often</a>.</p><p>One of the great things about NixOS is, if there is an application that breaks on the unstable branch, I can pin it to the stable release until it works again.</p><p>This means I get the benefits of both the rolling and stable approaches.</p><p>If you want to see my NixOS configuration, it''s <a href="https://code.oliverdavies.uk/opdavies/nix-config">publicly available on my Forgejo instance</a>.</p>'
processed: '<p>I use NixOS as the Linux distribution on my laptop and home server, and specifically the unstable channel.</p><p>This is the "rolling" version of NixOS that is continuously updated with the newest and latest packages, compared to the stable releases like 24.11 and 25.05 that are released twice a year.</p><p>I don''t necessarily do this to get the latest packages.</p><p>I do it to keep on top of configuration changes.</p><p>I run "nix flake update" usually once a week to download the latest updates.</p><p>If there are breaking changes or notices since I last updated, I can address them and do it iteratively rather than waiting to do them every six months.</p><p>Similar to application deployments, <a href="/daily/2023/05/14/releasing-small-changes-often-is-less-risky">I update early and often</a>.</p><p>One of the great things about NixOS is, if there is an application that breaks on the unstable branch, I can pin it to the stable release until it works again.</p><p>This means I get the benefits of both the rolling and stable approaches.</p><p>If you want to see my NixOS configuration, it''s <a href="https://code.oliverdavies.uk/opdavies/nix-config">publicly available on my Forgejo instance</a>.</p>'
summary: ''
field_daily_email_cta: { }

View file

@ -69,7 +69,7 @@ body:
<p>For example, <code>versa run</code> would need to run different commands for Drupal and Sculpin projects, <code>versa test</code> should support different test frameworks for the same language - e.g. PHPUnit, Pest and ParaTest for PHP - and the commands will need to be different in Docker Compose-based projects.</p>
<p>Currently, this logic is within my <a href="http://default/build-configs">Build Configs</a> project but can be moved to Versa.</p>
<p>Currently, this logic is within my <a href="/build-configs">Build Configs</a> project but can be moved to Versa.</p>
<p>This reduces the complexity within that codebase and means I can open-source it as it's a separate project.</p>

View file

@ -53,7 +53,7 @@ body:
<p>I wasn't George's mentor, but I met him at a hackday earlier this year and at a PHP meetup a few months later, so I was happy to have him on the podcast.</p>
<p><a href="http://default/podcast/20-george-gordon">Listen to the episode now</a>.</p>
<p><a href="/podcast/20-george-gordon">Listen to the episode now</a>.</p>
summary: null

View file

@ -38,5 +38,5 @@ path:
body:
- value: '<p>P.S. Do you need immediate access to an expert Drupal Developer? With my <a href="/subscription">Drupal development subscription</a>, make unlimited requests for a fixed monthly price in less time than posting to a job board!</p>'
format: basic_html
processed: '<p>P.S. Do you need immediate access to an expert Drupal Developer? With my <a href="http://default/subscription">Drupal development subscription</a>, make unlimited requests for a fixed monthly price in less time than posting to a job board!</p>'
processed: '<p>P.S. Do you need immediate access to an expert Drupal Developer? With my <a href="/subscription">Drupal development subscription</a>, make unlimited requests for a fixed monthly price in less time than posting to a job board!</p>'
summary: ''

View file

@ -37,6 +37,6 @@ path:
body:
- value: '<p>This email will be the first in my archive to be powered by Drupal and Tome.</p><p>I''m a long-time fan of static site generators and have used Sculpin for several years for my website, but it has slowed down recently - I think because of the number of pages it needs to generate for my email archive pages.</p><p>This email will be #821.</p><p>I''ve considered moving to Tome - a static site generator for Drupal - since <a href="/podcast/19-sam-mortenson">recording a podcast episode with Sam Mortenson</a> and, after porting across my theme and migrating the emails using the Feeds module, I''ve updated my Nginx configuration to serve the email archive section to HTML generated by Tome.</p><p>The main branch in <a href="https://code.oliverdavies.uk/opdavies/oliverdavies.uk/src/branch/main">my code repository</a> now includes the Tome commits and I''ll be working my way through <a href="https://code.oliverdavies.uk/opdavies/oliverdavies.uk/src/branch/main/todo.txt">my task list</a> as I continue <a href="/daily/2025/04/17/incrementally">migrating incrementally</a> and switching more sections to Tome.</p>'
format: basic_html
processed: '<p>This email will be the first in my archive to be powered by Drupal and Tome.</p><p>I''m a long-time fan of static site generators and have used Sculpin for several years for my website, but it has slowed down recently - I think because of the number of pages it needs to generate for my email archive pages.</p><p>This email will be #821.</p><p>I''ve considered moving to Tome - a static site generator for Drupal - since <a href="http://default/podcast/19-sam-mortenson">recording a podcast episode with Sam Mortenson</a> and, after porting across my theme and migrating the emails using the Feeds module, I''ve updated my Nginx configuration to serve the email archive section to HTML generated by Tome.</p><p>The main branch in <a href="https://code.oliverdavies.uk/opdavies/oliverdavies.uk/src/branch/main">my code repository</a> now includes the Tome commits and I''ll be working my way through <a href="https://code.oliverdavies.uk/opdavies/oliverdavies.uk/src/branch/main/todo.txt">my task list</a> as I continue <a href="http://default/daily/2025/04/17/incrementally">migrating incrementally</a> and switching more sections to Tome.</p>'
processed: '<p>This email will be the first in my archive to be powered by Drupal and Tome.</p><p>I''m a long-time fan of static site generators and have used Sculpin for several years for my website, but it has slowed down recently - I think because of the number of pages it needs to generate for my email archive pages.</p><p>This email will be #821.</p><p>I''ve considered moving to Tome - a static site generator for Drupal - since <a href="/podcast/19-sam-mortenson">recording a podcast episode with Sam Mortenson</a> and, after porting across my theme and migrating the emails using the Feeds module, I''ve updated my Nginx configuration to serve the email archive section to HTML generated by Tome.</p><p>The main branch in <a href="https://code.oliverdavies.uk/opdavies/oliverdavies.uk/src/branch/main">my code repository</a> now includes the Tome commits and I''ll be working my way through <a href="https://code.oliverdavies.uk/opdavies/oliverdavies.uk/src/branch/main/todo.txt">my task list</a> as I continue <a href="/daily/2025/04/17/incrementally">migrating incrementally</a> and switching more sections to Tome.</p>'
summary: ''
field_daily_email_cta: { }

View file

@ -65,7 +65,7 @@ body:
<p>Ideally, you also want everything to be reproducible with locked dependencies and generate the same outcome regardless of when the commands are run.</p>
<p>This is one of the main reasons I've <a href="http://default/daily/2024/11/11/could-nix-and-devenv-replace-docker-compose">started to use Nix and devenv for projects</a> - because they create environments that are both consistent and reproducible, reducing the chances of dependency mismatches and bugs creeping into my code.</p>
<p>This is one of the main reasons I've <a href="/daily/2024/11/11/could-nix-and-devenv-replace-docker-compose">started to use Nix and devenv for projects</a> - because they create environments that are both consistent and reproducible, reducing the chances of dependency mismatches and bugs creeping into my code.</p>
summary: null

View file

@ -69,7 +69,7 @@ body:
format: full_html
processed: |
<p>Before <a href="http://default/daily/2024/11/13/speaking-at-the-drupal-london-meetup">my remote talk for the Drupal London meetup</a>, I'm updating the usage statistics for <a href="https://www.drupal.org/project/override_node_options">the Override Node Options module</a> - one of the modules I maintain on Drupal.org.</p>
<p>Before <a href="/daily/2024/11/13/speaking-at-the-drupal-london-meetup">my remote talk for the Drupal London meetup</a>, I'm updating the usage statistics for <a href="https://www.drupal.org/project/override_node_options">the Override Node Options module</a> - one of the modules I maintain on Drupal.org.</p>
<p>In my slides for DrupalCamp Belgium, I showed the usage figures from October 2023, which showed 38,096 installations and it being the 173rd most installed module.</p>

View file

@ -83,7 +83,7 @@ body:
<p>I thought this was a great initiative in previous versions and I'm glad to see it again for Drupal 11, and it's great that it's being done with time before the Drupal 11 release as it gives maintainers the time to update their projects so as many modules as possible will be Drupal 11-compatible when it's released.</p>
<p>I look forward to getting more of these emails for my <a href="http://default/daily/2024/03/09/override-node-options-40624-drupal-websites">other contributed projects on Drupal.org</a>.</p>
<p>I look forward to getting more of these emails for my <a href="/daily/2024/03/09/override-node-options-40624-drupal-websites">other contributed projects on Drupal.org</a>.</p>
summary: null

View file

@ -57,9 +57,9 @@ body:
format: full_html
processed: |
<p><a href="http://default/daily/2024/08/16/what-are-err--req-and-res">Whilst mentoring at the School of Code Hackathon</a>, something the team and I discussed was documentation and documenting any decisions we made about the approaches they were taking, the techologies to use, etc.</p>
<p><a href="/daily/2024/08/16/what-are-err--req-and-res">Whilst mentoring at the School of Code Hackathon</a>, something the team and I discussed was documentation and documenting any decisions we made about the approaches they were taking, the techologies to use, etc.</p>
<p>We kept it simple by adding this to a README file, but I also mentioned <a href="http://default/daily/2022/09/23/adrs-technical-design-documents">ADRs and technical decision documents</a> and how they can be written in Markdown and stored alongside the code in the same repository.</p>
<p>We kept it simple by adding this to a README file, but I also mentioned <a href="/daily/2022/09/23/adrs-technical-design-documents">ADRs and technical decision documents</a> and how they can be written in Markdown and stored alongside the code in the same repository.</p>
<p>Another approach to documentation that I like is to create diagrams and flow charts.</p>

View file

@ -47,11 +47,11 @@ body:
format: full_html
processed: |
<p>In the most recent episode of the <a href="http://default/podcast">Beyond Blocks podcast</a>, I spoke with <a href="https://mortenson.coffee">Sam Mortenson</a> about Single File Components in Drupal as well as building static Drupal websites with Tome.</p>
<p>In the most recent episode of the <a href="/podcast">Beyond Blocks podcast</a>, I spoke with <a href="https://mortenson.coffee">Sam Mortenson</a> about Single File Components in Drupal as well as building static Drupal websites with Tome.</p>
<p>As a Drupal Specialist who works with other technologies including Vue.js, Symfony and Sculpin, it was great to discuss and learn more about both topics.</p>
<p><a href="http://default/podcast/19-sam-mortenson">Listen to the episode now</a>.</p>
<p><a href="/podcast/19-sam-mortenson">Listen to the episode now</a>.</p>
<p>Also, prior to releasing this episode, the total downloads for the podcast are almost at 1,000. Thank you to all the previous guests and everyone who listens to the podcast!</p>

View file

@ -49,7 +49,7 @@ body:
format: full_html
processed: |
<p><a href="http://default/daily/2024/10/19/phpunit-or-pest">Whether you prefer PHPUnit or Pest PHP</a>, or if you're coding in a different language, it's important to have automated tests - especially before you refactor any code.</p>
<p><a href="/daily/2024/10/19/phpunit-or-pest">Whether you prefer PHPUnit or Pest PHP</a>, or if you're coding in a different language, it's important to have automated tests - especially before you refactor any code.</p>
<p>Before you refactor, you want to have passing tests that you're confident cover all the required functionality.</p>

View file

@ -63,7 +63,7 @@ body:
<p>You specify the commit SHA you want to revert and Git will automatically try and revert that commit.</p>
<p>It creates its own commit message which includes the original commit message and <a href="http://default/daily/2024/05/20/referencing-other-commits-in-commit-messages">the reverted commit SHA</a>, so you can easily find or navigate to the original commit.</p>
<p>It creates its own commit message which includes the original commit message and <a href="/daily/2024/05/20/referencing-other-commits-in-commit-messages">the reverted commit SHA</a>, so you can easily find or navigate to the original commit.</p>
<p>For example:</p>

View file

@ -38,5 +38,5 @@ path:
body:
- value: '<p>P.S. Are you still using Drupal 7 and dont know whats involved to upgrade to Drupal 11? <a href="/call">Book a Drupal 7 upgrade consultation call</a> or <a href="/drupal-upgrade">an upgrade roadmap</a>.</p>'
format: basic_html
processed: '<p>P.S. Are you still using Drupal 7 and dont know whats involved to upgrade to Drupal 11? <a href="http://default/call">Book a Drupal 7 upgrade consultation call</a> or <a href="http://default/drupal-upgrade">an upgrade roadmap</a>.</p>'
processed: '<p>P.S. Are you still using Drupal 7 and dont know whats involved to upgrade to Drupal 11? <a href="/call">Book a Drupal 7 upgrade consultation call</a> or <a href="/drupal-upgrade">an upgrade roadmap</a>.</p>'
summary: ''

View file

@ -55,7 +55,7 @@ body:
format: full_html
processed: |
<p>I recently started <a href="http://default/daily/2025/04/07/nix-rst2pdf">using Nix to build my PDF presentation slides</a> that <a href="http://default/presentations/building-presenting-slide-decks-rst2pdf">I create with rst2pdf</a>.</p>
<p>I recently started <a href="/daily/2025/04/07/nix-rst2pdf">using Nix to build my PDF presentation slides</a> that <a href="/presentations/building-presenting-slide-decks-rst2pdf">I create with rst2pdf</a>.</p>
<p>I removed the custom build script that was generating the PDF files and moved that code into a Nix derivation.</p>

View file

@ -57,7 +57,7 @@ body:
processed: |
<p>As well as PHP, JavaScript, HTML, CSS, etc, I write a lot of Bash scripts.</p>
<p>From <a href="http://default/daily/2022/08/15/using-run-file-simplify-project-tasks">project-specific run files</a> to CI pipelines, Dockerfiles and deployment scripts, Bash is used a lot in the ops side of software development.</p>
<p>From <a href="/daily/2022/08/15/using-run-file-simplify-project-tasks">project-specific run files</a> to CI pipelines, Dockerfiles and deployment scripts, Bash is used a lot in the ops side of software development.</p>
<p>Today, though, I wrote <a href="https://github.com/opdavies/dotfiles.nix/blob/a1ef2d1402c9c607e7a3e4427ce125d0cabeddcd/lib/shared/scripts/export-video-list.nix#L12-L31">a small Bash script for my personal laptop</a>.</p>

View file

@ -51,7 +51,7 @@ body:
processed: |
<p>This week, I'm speaking at the newly-restarted PHP Berkshire meetup.</p>
<p>Organised by Humand Talent, the same people who now organise PHP Oxford (where I spoke in January), this time I'm <a href="http://default/presentations/building-static-websites-sculpin">speaking about Sculpin</a> - the PHP static site generator I use for my website and to publish my <a href="https://zet.oliverdavies.uk">new Zettlekasten notes</a>.</p>
<p>Organised by Humand Talent, the same people who now organise PHP Oxford (where I spoke in January), this time I'm <a href="/presentations/building-static-websites-sculpin">speaking about Sculpin</a> - the PHP static site generator I use for my website and to publish my <a href="https://zet.oliverdavies.uk">new Zettlekasten notes</a>.</p>
<p>I'm looking forward to discussing again why I like static site generators and what benefits they offer.</p>

View file

@ -53,7 +53,7 @@ body:
format: full_html
processed: |
<p>Yesterday, I said that <a href="http://default/daily/2024/07/08/back-to-sass-and-traditional-css">I'm working on a Sass project with no utility or atomic styles</a>.</p>
<p>Yesterday, I said that <a href="/daily/2024/07/08/back-to-sass-and-traditional-css">I'm working on a Sass project with no utility or atomic styles</a>.</p>
<p>But, the two aren't mutually exclusive.</p>

View file

@ -49,7 +49,7 @@ body:
format: full_html
processed: |
<p><a href="http://default/daily/2024/04/10/resurrecting-the-speakerdeck-field-module">In Wednesday's email</a>, I said I was resurrecting the Speakerdeck Field module, and the same version works on Drupal 8, 9, 10 and 11.</p>
<p><a href="/daily/2024/04/10/resurrecting-the-speakerdeck-field-module">In Wednesday's email</a>, I said I was resurrecting the Speakerdeck Field module, and the same version works on Drupal 8, 9, 10 and 11.</p>
<p>How do I know this?</p>

View file

@ -47,7 +47,7 @@ body:
processed: |
<p>On the 24th of April, I'll be attending a LocalGov Drupal Camp in Birmingham, UK.</p>
<p>As someone keen to get more involved and contribute more to the project, and who's <a href="http://default/daily/2024/03/25/newport-city-council-running-localgov-drupal">local council recently switched to LocalGov</a>, I'm looking forward to the chance to learn and contribute on the day and afterwards.</p>
<p>As someone keen to get more involved and contribute more to the project, and who's <a href="/daily/2024/03/25/newport-city-council-running-localgov-drupal">local council recently switched to LocalGov</a>, I'm looking forward to the chance to learn and contribute on the day and afterwards.</p>
<p>If you want to attend also, there are a few remaining tickets available and you can <a href="https://www.eventbrite.co.uk/e/localgov-drupal-camp-2024-tickets-847025314517">register on Eventbrite</a>.</p>

View file

@ -141,7 +141,7 @@ body:
format: full_html
processed: |
<p>In <a href="http://default/daily/2022/09/14/simpletest-drupal-test">Wednesday's email</a>, I showed how quick it is to get started writing automated tests for a new Drupal module, starting with a functional test.</p>
<p>In <a href="/daily/2022/09/14/simpletest-drupal-test">Wednesday's email</a>, I showed how quick it is to get started writing automated tests for a new Drupal module, starting with a functional test.</p>
<p>I prefer the outside-in style (or London approach) of test-driven development, where I start with a the highest-level test that I can for a task. If the task needs me to make a HTTP request, then Ill use a functional test. If not, Ill use a kernel (or integration) test.</p>

View file

@ -59,7 +59,7 @@ body:
<p>It's a metric that I like to check occasionally as I like to keep codebases lean and with the minimum amount of code.</p>
<p>I don't like to have features that aren't used or <a href="http://default/daily/2025/02/16/pre-optimise">pre-optimised code</a> for use cases that may not happen.</p>
<p>I don't like to have features that aren't used or <a href="/daily/2025/02/16/pre-optimise">pre-optimised code</a> for use cases that may not happen.</p>
<p>The more code there is in your application, the problems you could encounter.</p>

View file

@ -37,6 +37,6 @@ path:
body:
- value: '<p>Once you''ve <a href="/daily/2025/05/18/how-quickly-can-you-get-back-online">resolved an issue and restored service</a>, what lessons can be learned to ensure the same issue doesn''t happen again?</p><p>Could the issue have been caught or identified sooner, before it got to production?</p><p>Ideally, an issue would be identified in a local environment, in a CI pipeline or a staging environment.</p><p>Anything before production, but the sooner, the better.</p><p>Can you introduce more tools or automated checks?</p><p>PHP in particular has a lot of tools for linting, analysing and testing code, such as PHPStan and PHPUnit.</p><p>These can be run locally or automatically within a CI pipeline.</p><p>If the pipeline is passing, the code should be deployable.</p><p>But, if there is an issue, what needs to be added to the pipeline that would have identified it?</p><p>How can you iterate and make your development and deployment processes better and more robust?</p>'
format: basic_html
processed: '<p>Once you''ve <a href="http://default/daily/2025/05/18/how-quickly-can-you-get-back-online">resolved an issue and restored service</a>, what lessons can be learned to ensure the same issue doesn''t happen again?</p><p>Could the issue have been caught or identified sooner, before it got to production?</p><p>Ideally, an issue would be identified in a local environment, in a CI pipeline or a staging environment.</p><p>Anything before production, but the sooner, the better.</p><p>Can you introduce more tools or automated checks?</p><p>PHP in particular has a lot of tools for linting, analysing and testing code, such as PHPStan and PHPUnit.</p><p>These can be run locally or automatically within a CI pipeline.</p><p>If the pipeline is passing, the code should be deployable.</p><p>But, if there is an issue, what needs to be added to the pipeline that would have identified it?</p><p>How can you iterate and make your development and deployment processes better and more robust?</p>'
processed: '<p>Once you''ve <a href="/daily/2025/05/18/how-quickly-can-you-get-back-online">resolved an issue and restored service</a>, what lessons can be learned to ensure the same issue doesn''t happen again?</p><p>Could the issue have been caught or identified sooner, before it got to production?</p><p>Ideally, an issue would be identified in a local environment, in a CI pipeline or a staging environment.</p><p>Anything before production, but the sooner, the better.</p><p>Can you introduce more tools or automated checks?</p><p>PHP in particular has a lot of tools for linting, analysing and testing code, such as PHPStan and PHPUnit.</p><p>These can be run locally or automatically within a CI pipeline.</p><p>If the pipeline is passing, the code should be deployable.</p><p>But, if there is an issue, what needs to be added to the pipeline that would have identified it?</p><p>How can you iterate and make your development and deployment processes better and more robust?</p>'
summary: ''
field_daily_email_cta: { }

View file

@ -56,7 +56,7 @@ body:
format: full_html
processed: |
<p>Yesterday's email talked about <a href="http://default/daily/2022/10/28/why-write-framework-agnostic-packages">writing reusable, framework-agnostic packages</a> but didn't mention where those packages could be located.</p>
<p>Yesterday's email talked about <a href="/daily/2022/10/28/why-write-framework-agnostic-packages">writing reusable, framework-agnostic packages</a> but didn't mention where those packages could be located.</p>
<p>They could be kept within a private repository and still have the same benefits, such as re-usability for internal projects, but I like to open-source code as often as I can and make it available publicly to see and use.</p>

View file

@ -59,7 +59,7 @@ body:
processed: |
<p>Another reason I like static websites is that they're easy and quick to deploy.</p>
<p>Whether you use write each HTML file by hand or <a href="http://default/daily/2025/03/12/easy">use a static site generator</a>, a simple Web server like Caddy, Nginx or Apache can load and serve your website for everyone to see.</p>
<p>Whether you use write each HTML file by hand or <a href="/daily/2025/03/12/easy">use a static site generator</a>, a simple Web server like Caddy, Nginx or Apache can load and serve your website for everyone to see.</p>
<p>My Sculpin website generates an output_prod directory after I run <code>sculpin generate</code> with my deployable files.</p>

View file

@ -52,7 +52,7 @@ body:
format: full_html
processed: |
<p><a href="http://default/daily/2022/11/20/version-controlled-commented-out-code">Yesterday's email</a> talked about whether commented-out code should be present if your code is version-controlled, but how do you avoid committing it in the first place?</p>
<p><a href="/daily/2022/11/20/version-controlled-commented-out-code">Yesterday's email</a> talked about whether commented-out code should be present if your code is version-controlled, but how do you avoid committing it in the first place?</p>
<p>You could make sure that you remove everything manually before you stage and commit your changes, or I like to use <code>git add --patch</code> (or <code>git add -p</code>) to interactively stage my changes, allowing me to select which parts of files I want to include in my commit and ignore anything else. The <code>--patch</code> option also works for other commands, including <code>checkout</code> and <code>reset</code>.</p>

View file

@ -91,7 +91,7 @@ body:
[podcast]: /podcast/6-dan-leech-php-tui
format: markdown
processed: |
<p>An approach I like to use when writing code is value objects, and it was great to see a recent talk by Dan Leech (past guest on the <a href="http://default/podcast/6-dan-leech-php-tui">Beyond Blocks podcast</a>) about them at a recent PHP meetup.</p>
<p>An approach I like to use when writing code is value objects, and it was great to see a recent talk by Dan Leech (past guest on the <a href="/podcast/6-dan-leech-php-tui">Beyond Blocks podcast</a>) about them at a recent PHP meetup.</p>
<p>To quote from Dan's talk - "value objects are objects that represent a value".</p>
<p>They are simple classes that give a meaningful name to a value.</p>
<p>For example, I could write this value object to represent a railway station code:</p>

View file

@ -58,7 +58,7 @@ body:
format: full_html
processed: |
<p>Whilst writing <a href="http://default/daily/2024/06/07/not-invented-here">yesterday's email</a> about "not invented here", I started thinking about how Drupal's timeline (which was created 23 years ago) compares to some of the other similar or related projects.</p>
<p>Whilst writing <a href="/daily/2024/06/07/not-invented-here">yesterday's email</a> about "not invented here", I started thinking about how Drupal's timeline (which was created 23 years ago) compares to some of the other similar or related projects.</p>
<p>Here's a list of project release dates from ChatGPT, which seem correct to me at a glance:</p>

View file

@ -112,7 +112,7 @@ body:
<h2 id="concatination-and-nesting">Concatination and nesting</h2>
<p><a href="http://default/daily/2024/07/08/back-to-sass-and-traditional-css">Something I've avoided with Sass</a>, as well as newer versions of CSS, is the over-use of nesting styles, which makes it harder to find them when searching for the correct stylesheet.</p>
<p><a href="/daily/2024/07/08/back-to-sass-and-traditional-css">Something I've avoided with Sass</a>, as well as newer versions of CSS, is the over-use of nesting styles, which makes it harder to find them when searching for the correct stylesheet.</p>
<p>If there was this CSS:</p>
@ -131,7 +131,7 @@ body:
<h2 id="here%27s-the-thing">Here's the thing</h2>
<p>It's taken me a while to get back into this way of working with CSS, but it does remind me <a href="http://default/presentations/taking-flight-with-tailwind-css">why I prefer to use utility styles</a> for my own projects.</p>
<p>It's taken me a while to get back into this way of working with CSS, but it does remind me <a href="/presentations/taking-flight-with-tailwind-css">why I prefer to use utility styles</a> for my own projects.</p>
summary: null

View file

@ -56,7 +56,7 @@ body:
<p>Each tool has its configuration file with different settings and formats.</p>
<p>Rather than being too tightly coupled to a particular tool, I like to keep things as agnostic as possible and <a href="http://default/daily/2022/08/15/using-run-file-simplify-project-tasks">use a run file</a> with separate <code>ci:build</code> and <code>ci:deploy</code> tasks.</p>
<p>Rather than being too tightly coupled to a particular tool, I like to keep things as agnostic as possible and <a href="/daily/2022/08/15/using-run-file-simplify-project-tasks">use a run file</a> with separate <code>ci:build</code> and <code>ci:deploy</code> tasks.</p>
<p>This means that all the logic is within the run file rather than the CI tool-specific configuration file, so the file is shorter and cleaner; I can make changes to the CI tasks locally and quickly test changes and iterate, and also, as the logic is within the run file, I can easily switch to a different CI tool if needed without making changes to the tasks themselves.</p>

Some files were not shown because too many files have changed in this diff Show more