diff --git a/content/block_content.f451cc6b-1555-4bb2-ad3c-6d1bb4ee6bf5.yml b/content/block_content.f451cc6b-1555-4bb2-ad3c-6d1bb4ee6bf5.yml index 7fbcf43c6..2603609e5 100644 --- a/content/block_content.f451cc6b-1555-4bb2-ad3c-6d1bb4ee6bf5.yml +++ b/content/block_content.f451cc6b-1555-4bb2-ad3c-6d1bb4ee6bf5.yml @@ -25,7 +25,7 @@ body: - value: 'Not sure? [Browse the archive →](/archive)' format: markdown processed: | -

Not sure? Browse the archive →

+

Not sure? Browse the archive →

summary: '' field_text_alignment: - value: centre diff --git a/content/node.00497277-4b40-4d36-a473-8d8e1a187c18.yml b/content/node.00497277-4b40-4d36-a473-8d8e1a187c18.yml index 38c840cbf..31b56848e 100644 --- a/content/node.00497277-4b40-4d36-a473-8d8e1a187c18.yml +++ b/content/node.00497277-4b40-4d36-a473-8d8e1a187c18.yml @@ -52,7 +52,7 @@ body: format: full_html processed: | -

A side effect of using a tool to generate build configuration files with templates is the consistency that it introduces.

+

A side effect of using a tool to generate build configuration files with templates is the consistency that it introduces.

The majority of my projects use a PHP-FPM or PHP CLI container. In my Docker Compose file, the service was mostly named php but sometimes it was php-fpm. In the templated file, it's always named php.

diff --git a/content/node.0100be71-79ef-44ea-922e-e75fcc26ae16.yml b/content/node.0100be71-79ef-44ea-922e-e75fcc26ae16.yml index a8046c9d1..ceb0d2af1 100644 --- a/content/node.0100be71-79ef-44ea-922e-e75fcc26ae16.yml +++ b/content/node.0100be71-79ef-44ea-922e-e75fcc26ae16.yml @@ -69,13 +69,13 @@ body:

You want the same result on every time on every environment.

-

You want every environment - including local development environments to be as consistent as possible to minimise bugs and errors.

+

You want every environment - including local development environments to be as consistent as possible to minimise bugs and errors.

To do this, I automate things to make them as simple as possible.

-

I use run files with commands to import databases, perform updates and run pre-update and post-update tasks.

+

I use run files with commands to import databases, perform updates and run pre-update and post-update tasks.

-

I use tools like Nix and devenv to create identical and reproducible environments.

+

I use tools like Nix and devenv to create identical and reproducible environments.

The simpler and quicker is it, the more it can and will be done.

diff --git a/content/node.01893784-8f45-4466-8586-17df23e7e4b5.yml b/content/node.01893784-8f45-4466-8586-17df23e7e4b5.yml index a064c4e4f..12b7e8956 100644 --- a/content/node.01893784-8f45-4466-8586-17df23e7e4b5.yml +++ b/content/node.01893784-8f45-4466-8586-17df23e7e4b5.yml @@ -109,7 +109,7 @@ body:

This I think is a better approach and how I add PHPStan to existing codebases.

-

To learn more about static analysis and PHPStan, listen to episode 22 of the Beyond Blocks podcast with Dave Liddament.

+

To learn more about static analysis and PHPStan, listen to episode 22 of the Beyond Blocks podcast with Dave Liddament.

summary: null diff --git a/content/node.01d84025-8b37-4456-b7f0-bf659c3f5a2b.yml b/content/node.01d84025-8b37-4456-b7f0-bf659c3f5a2b.yml index 470797ad6..0c8694569 100644 --- a/content/node.01d84025-8b37-4456-b7f0-bf659c3f5a2b.yml +++ b/content/node.01d84025-8b37-4456-b7f0-bf659c3f5a2b.yml @@ -37,6 +37,6 @@ path: body: - value: '

If a module or library has been added to an application, it was done to serve a purpose.

It must add some required functionality that was asked for earlier in the application''s lifecycle.

It was needed then.

But it is still needed now?

Are the original requirements still valid?

Have they changed or are no longer needed?

If the code is no longer serving a purpose, it should be removed.

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.

Once the data has been imported and the site is live, the modules are often so longer needed.

As I said yesterday, 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.
 

' format: basic_html - processed: '

If a module or library has been added to an application, it was done to serve a purpose.

It must add some required functionality that was asked for earlier in the application''s lifecycle.

It was needed then.

But it is still needed now?

Are the original requirements still valid?

Have they changed or are no longer needed?

If the code is no longer serving a purpose, it should be removed.

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.

Once the data has been imported and the site is live, the modules are often so longer needed.

As I said yesterday, 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.
 

' + processed: '

If a module or library has been added to an application, it was done to serve a purpose.

It must add some required functionality that was asked for earlier in the application''s lifecycle.

It was needed then.

But it is still needed now?

Are the original requirements still valid?

Have they changed or are no longer needed?

If the code is no longer serving a purpose, it should be removed.

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.

Once the data has been imported and the site is live, the modules are often so longer needed.

As I said yesterday, 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.
 

' summary: '' field_daily_email_cta: { } diff --git a/content/node.0209ee07-9e17-4c85-ae5e-d14ae42bb22a.yml b/content/node.0209ee07-9e17-4c85-ae5e-d14ae42bb22a.yml index c2a6571ff..cf8005171 100644 --- a/content/node.0209ee07-9e17-4c85-ae5e-d14ae42bb22a.yml +++ b/content/node.0209ee07-9e17-4c85-ae5e-d14ae42bb22a.yml @@ -37,6 +37,6 @@ path: body: - value: "

There's nothing more frustrating for me than seeing an error I've seen before and not remembering how I fixed it last time.

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.

I wrote my first blog post on my website in 2010 to document my learning for myself and to share with others.

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.

These days, I just write plain text files using Nick Janetakis' notes program, which I've modified slightly by patching it to create daily notes instead of monthly ones. 

They're fast to write, easy to search and available offline if I'm traveling or away from my computer.

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.

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.

" format: basic_html - processed: "

There's nothing more frustrating for me than seeing an error I've seen before and not remembering how I fixed it last time.

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.

I wrote my first blog post on my website in 2010 to document my learning for myself and to share with others.

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.

These days, I just write plain text files using Nick Janetakis' notes program, which I've modified slightly by patching it to create daily notes instead of monthly ones. 

They're fast to write, easy to search and available offline if I'm traveling or away from my computer.

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.

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.

" + processed: "

There's nothing more frustrating for me than seeing an error I've seen before and not remembering how I fixed it last time.

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.

I wrote my first blog post on my website in 2010 to document my learning for myself and to share with others.

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.

These days, I just write plain text files using Nick Janetakis' notes program, which I've modified slightly by patching it to create daily notes instead of monthly ones. 

They're fast to write, easy to search and available offline if I'm traveling or away from my computer.

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.

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.

" summary: '' field_daily_email_cta: { } diff --git a/content/node.0231b26c-ac28-44e8-a2bf-cc7c86984e7e.yml b/content/node.0231b26c-ac28-44e8-a2bf-cc7c86984e7e.yml index 09137aa6d..fec0ead48 100644 --- a/content/node.0231b26c-ac28-44e8-a2bf-cc7c86984e7e.yml +++ b/content/node.0231b26c-ac28-44e8-a2bf-cc7c86984e7e.yml @@ -64,11 +64,11 @@ body:

The answer will be "it depends" based on the project or team, but I'm personally not a fan of squashing commits.

-

Even though I commit small changes often, I put quite a bit of effort into crafting commits and writing detailed commit messages 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.

+

Even though I commit small changes often, I put quite a bit of effort into crafting commits and writing detailed commit messages 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.

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.

-

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 git bisect would no longer work and a single commit couldn't be simply reverted if it contained a bug.

+

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 git bisect would no longer work and a single commit couldn't be simply reverted if it contained a bug.

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.

diff --git a/content/node.0300b4ea-e71b-4f9c-b4f2-f04f98e92d6c.yml b/content/node.0300b4ea-e71b-4f9c-b4f2-f04f98e92d6c.yml index 3d5c4d669..63a2e4f27 100644 --- a/content/node.0300b4ea-e71b-4f9c-b4f2-f04f98e92d6c.yml +++ b/content/node.0300b4ea-e71b-4f9c-b4f2-f04f98e92d6c.yml @@ -54,7 +54,7 @@ body: format: full_html processed: | -

Yesterday's email explained why your company should contribute to open-source software, but why should you contribute as an individual?

+

Yesterday's email explained why your company should contribute to open-source software, but why should you contribute as an individual?

Most of the same reasons apply, such as gaining experience and improved knowledge from contributing.

diff --git a/content/node.0316dfcf-b709-47e1-9622-9355b5ece6d9.yml b/content/node.0316dfcf-b709-47e1-9622-9355b5ece6d9.yml index a221e5be9..58e6e04fb 100644 --- a/content/node.0316dfcf-b709-47e1-9622-9355b5ece6d9.yml +++ b/content/node.0316dfcf-b709-47e1-9622-9355b5ece6d9.yml @@ -75,9 +75,9 @@ body:

To me, this indicates the deployment process is too complicated, possibly due to a lack of automation, or deployments aren't happening frequently enough.

-

Having a robust and passing CI pipeline that runs automated checks and tests is crucial to know the code is deployable.

+

Having a robust and passing CI pipeline that runs automated checks and tests is crucial to know the code is deployable.

-

Feature flags are a great way 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.

+

Feature flags are a great way 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.

Too much time between deployments is a smell.

diff --git a/content/node.0318e249-a9a8-476f-9bd4-432544369917.yml b/content/node.0318e249-a9a8-476f-9bd4-432544369917.yml index acd9ba8ce..854d3d49f 100644 --- a/content/node.0318e249-a9a8-476f-9bd4-432544369917.yml +++ b/content/node.0318e249-a9a8-476f-9bd4-432544369917.yml @@ -57,7 +57,7 @@ body: format: full_html processed: | -

Applying patch files 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.

+

Applying patch files 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.

Some software, such as dwm and st from suckless.org are released as minimal versions that you patch to add features to.

@@ -73,7 +73,7 @@ body:

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.

-

Sometimes, though, patching is the only option.

+

Sometimes, though, patching is the only option.

summary: null diff --git a/content/node.033f0b46-69f9-4ea0-9706-d930e67dd5d8.yml b/content/node.033f0b46-69f9-4ea0-9706-d930e67dd5d8.yml index ce18f6b93..f8ad040ad 100644 --- a/content/node.033f0b46-69f9-4ea0-9706-d930e67dd5d8.yml +++ b/content/node.033f0b46-69f9-4ea0-9706-d930e67dd5d8.yml @@ -67,7 +67,7 @@ body:

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).

-

I enjoyed learning Sculpin and took it as an opportunity to learn Twig before Drupal 8, which I spoke about in the first Sculpin talk I gave, at DrupalCamp North in July 2015.

+

I enjoyed learning Sculpin and took it as an opportunity to learn Twig before Drupal 8, which I spoke about in the first Sculpin talk I gave, at DrupalCamp North in July 2015.

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.

@@ -77,9 +77,9 @@ body:

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.

-

This makes it older than my dotfiles repository, which I started in July 2015.

+

This makes it older than my dotfiles repository, which I started in July 2015.

-

Similar to why I use Linux, 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.

+

Similar to why I use Linux, 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.

And I learned something new about Git at the same time.

diff --git a/content/node.037796b8-42d8-4ea4-abec-f8c8de0d97e8.yml b/content/node.037796b8-42d8-4ea4-abec-f8c8de0d97e8.yml index 3c426ac66..51d79a07a 100644 --- a/content/node.037796b8-42d8-4ea4-abec-f8c8de0d97e8.yml +++ b/content/node.037796b8-42d8-4ea4-abec-f8c8de0d97e8.yml @@ -44,7 +44,7 @@ body: format: full_html processed: | -

This week's episode of the Beyond Blocks podcast is live, where I speak with Panagiotis Moutsopoulos (vensires on Drupal.org) - Drupal Backend Developer at E-Sepia.

+

This week's episode of the Beyond Blocks podcast is live, where I speak with Panagiotis Moutsopoulos (vensires on Drupal.org) - Drupal Backend Developer at E-Sepia.

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.

diff --git a/content/node.03c0a713-f32d-445b-9397-add68fbf2fe5.yml b/content/node.03c0a713-f32d-445b-9397-add68fbf2fe5.yml index 77300187e..32d34d317 100644 --- a/content/node.03c0a713-f32d-445b-9397-add68fbf2fe5.yml +++ b/content/node.03c0a713-f32d-445b-9397-add68fbf2fe5.yml @@ -51,7 +51,7 @@ body: format: full_html processed: | -

As well as my laptop configuration, local development environments and production server, I've also been using Nix for something else recently.

+

As well as my laptop configuration, local development environments and production server, I've also been using Nix for something else recently.

Setting up and configuring a Homelab on an old laptop.

diff --git a/content/node.050a5113-59bc-461e-ac78-420e16055303.yml b/content/node.050a5113-59bc-461e-ac78-420e16055303.yml index b5cf9fdb6..9d1977fb9 100644 --- a/content/node.050a5113-59bc-461e-ac78-420e16055303.yml +++ b/content/node.050a5113-59bc-461e-ac78-420e16055303.yml @@ -48,13 +48,13 @@ body: format: full_html processed: | -

This week on the Beyond Blocks podcast, I'm joined by Dan Leech - a PHP Developer and open-source project creator.

+

This week on the Beyond Blocks podcast, I'm joined by Dan Leech - a PHP Developer and open-source project creator.

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.

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.

-

Listen to the episode now, and I'll be back with more in the New Year.

+

Listen to the episode now, and I'll be back with more in the New Year.

summary: null diff --git a/content/node.05232b81-d945-4112-99bf-d1adb2552428.yml b/content/node.05232b81-d945-4112-99bf-d1adb2552428.yml index 33b48b57f..4dc5e8a23 100644 --- a/content/node.05232b81-d945-4112-99bf-d1adb2552428.yml +++ b/content/node.05232b81-d945-4112-99bf-d1adb2552428.yml @@ -55,7 +55,7 @@ body:

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?

-

Drupal supports using SQLite, but, other than for my automated testing course, or when running automated tests, I've always used a MySQL or MariaDB database.

+

Drupal supports using SQLite, but, other than for my automated testing course, or when running automated tests, I've always used a MySQL or MariaDB database.

Maybe this is something to keep an eye on and potentially use more for some scenarios in the future.

diff --git a/content/node.066297b1-ab00-4769-afe1-d3831ed2a654.yml b/content/node.066297b1-ab00-4769-afe1-d3831ed2a654.yml index 92efcf458..a32b14b9a 100644 --- a/content/node.066297b1-ab00-4769-afe1-d3831ed2a654.yml +++ b/content/node.066297b1-ab00-4769-afe1-d3831ed2a654.yml @@ -93,7 +93,7 @@ body: format: full_html processed: | -

As well as writing comments first, when writing tests, I sometimes like to write my tests backwards and start by writing the assertions first.

+

As well as writing comments first, when writing tests, I sometimes like to write my tests backwards and start by writing the assertions first.

I know what I want to assert in the test, so it's an easy place to start.

diff --git a/content/node.079f2e09-0827-458e-91d3-6dd5b8b80c56.yml b/content/node.079f2e09-0827-458e-91d3-6dd5b8b80c56.yml index 9ae66c61b..4f8a83cbf 100644 --- a/content/node.079f2e09-0827-458e-91d3-6dd5b8b80c56.yml +++ b/content/node.079f2e09-0827-458e-91d3-6dd5b8b80c56.yml @@ -55,7 +55,7 @@ body: format: full_html processed: | -

It's shown in the examples of the conventional commits specification as part of the optional footer data.

+

It's shown in the examples of the conventional commits specification as part of the optional footer data.

But is it useful?

diff --git a/content/node.0843614b-645e-4d55-9e70-f960d504cadb.yml b/content/node.0843614b-645e-4d55-9e70-f960d504cadb.yml index 5afd30fdc..5abaabb69 100644 --- a/content/node.0843614b-645e-4d55-9e70-f960d504cadb.yml +++ b/content/node.0843614b-645e-4d55-9e70-f960d504cadb.yml @@ -54,9 +54,9 @@ body:

It was a great event with around 35 attendees and two other speakers as well as myself.

-

The latest version of my slides are online as well some updated resources.

+

The latest version of my slides are online as well some updated resources.

-

My next talk will be at the Norfolk Developers conference next month where I'll be presenting an updated version of Taking Flight with Tailwind CSS.

+

My next talk will be at the Norfolk Developers conference next month where I'll be presenting an updated version of Taking Flight with Tailwind CSS.

If you have a topic idea for a talk or would like me to speak at your meetup or conference, please get in touch.

diff --git a/content/node.09d6a39f-ac99-44fc-b660-4f976132d813.yml b/content/node.09d6a39f-ac99-44fc-b660-4f976132d813.yml index 09fb137c8..a03edab7e 100644 --- a/content/node.09d6a39f-ac99-44fc-b660-4f976132d813.yml +++ b/content/node.09d6a39f-ac99-44fc-b660-4f976132d813.yml @@ -79,7 +79,7 @@ body:

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.

-

Sam Mortenson, the creator of the Tome module discussed it on our episode of the Beyond Blocks podcast where we also talked about single file components.

+

Sam Mortenson, the creator of the Tome module discussed it on our episode of the Beyond Blocks podcast where we also talked about single file components.

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.

diff --git a/content/node.0a04ac23-4d64-40e8-8e94-ead3cab7129d.yml b/content/node.0a04ac23-4d64-40e8-8e94-ead3cab7129d.yml index d2894cf75..f549b2b7f 100644 --- a/content/node.0a04ac23-4d64-40e8-8e94-ead3cab7129d.yml +++ b/content/node.0a04ac23-4d64-40e8-8e94-ead3cab7129d.yml @@ -71,7 +71,7 @@ body:

"CI is the practice of merging all developers' working copies to a shared mainline several times a day"

-

I've written about this before and I think the term CI or CI/CD is one of the most misused or misleading in software development.

+

I've written about this before and I think the term CI or CI/CD is one of the most misused or misleading in software development.

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.

diff --git a/content/node.0a2a3238-42ea-46de-8140-94e74f381916.yml b/content/node.0a2a3238-42ea-46de-8140-94e74f381916.yml index ccb4f22dd..f0344afbd 100644 --- a/content/node.0a2a3238-42ea-46de-8140-94e74f381916.yml +++ b/content/node.0a2a3238-42ea-46de-8140-94e74f381916.yml @@ -53,7 +53,7 @@ body:

I was able to present talks on automated testing and Tailwind CSS, which were my 99th and 100th talks, respectively!

-

The sessions were streamed live, or the slides and previous recordings are on my website.

+

The sessions were streamed live, or the slides and previous recordings are on my website.

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.

diff --git a/content/node.0a4f05ae-4240-476b-bb57-bcf3d3a598a3.yml b/content/node.0a4f05ae-4240-476b-bb57-bcf3d3a598a3.yml index 977321640..13695f6d4 100644 --- a/content/node.0a4f05ae-4240-476b-bb57-bcf3d3a598a3.yml +++ b/content/node.0a4f05ae-4240-476b-bb57-bcf3d3a598a3.yml @@ -69,7 +69,7 @@ body: format: full_html processed: | -

If feature branches cause conflicts, what is the alternative?

+

If feature branches cause conflicts, what is the alternative?

Don't branch.

@@ -77,7 +77,7 @@ body:

But how can you avoid releasing changes before they are ready?

-

You can have a local branch with your changes that you don't push and rebase locally, but then you're not doing continuous integration and you're just as likely to get conflicts and have incompatible code.

+

You can have a local branch with your changes that you don't push and rebase locally, but then you're not doing continuous integration and you're just as likely to get conflicts and have incompatible code.

One of the main benefits of trunk-based development, where everything is on a single branch, is that everyone's work always works together.

@@ -97,7 +97,7 @@ body:

For Drupal, there is a Feature Toggle module and an extension that I wrote that make it easy to use and manage feature toggles by just logging into the admin UI and selecting the active toggles you want.

-

And, if an issue is discovered, it can also be easily disabled without needing to roll back to the previous version.

+

And, if an issue is discovered, it can also be easily disabled without needing to roll back to the previous version.

summary: null diff --git a/content/node.0ab79b3f-c48b-4e56-a50f-d39baf2df02e.yml b/content/node.0ab79b3f-c48b-4e56-a50f-d39baf2df02e.yml index 47abe79a9..b76e8a705 100644 --- a/content/node.0ab79b3f-c48b-4e56-a50f-d39baf2df02e.yml +++ b/content/node.0ab79b3f-c48b-4e56-a50f-d39baf2df02e.yml @@ -49,7 +49,7 @@ body: format: full_html processed: | -

Instead of using AI to autocomplete code or perform tasks within your Drupal website, I've seen people using AI as a virtual pair programming partner.

+

Instead of using AI to autocomplete code or perform tasks within your Drupal website, I've seen people using AI as a virtual pair programming partner.

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.

diff --git a/content/node.0c899647-4916-4ad6-bde0-5ae1f397cc13.yml b/content/node.0c899647-4916-4ad6-bde0-5ae1f397cc13.yml index f509eb0f0..667467430 100644 --- a/content/node.0c899647-4916-4ad6-bde0-5ae1f397cc13.yml +++ b/content/node.0c899647-4916-4ad6-bde0-5ae1f397cc13.yml @@ -74,9 +74,9 @@ body: format: full_html processed: | -

I've recently decided I'm going to open source Build Configs tool that I use to generate build configuration files for Drupal, Sculpin and Fractal projects.

+

I've recently decided I'm going to open source Build Configs tool that I use to generate build configuration files for Drupal, Sculpin and Fractal projects.

-

Inspired by Workspace and others, and based on previous versions of similar tools - most recently by TheAltF4Stream's project with the same name (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.

+

Inspired by Workspace and others, and based on previous versions of similar tools - most recently by TheAltF4Stream's project with the same name (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.

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.

diff --git a/content/node.0db2d25b-3e50-4f36-abe1-f84b938c21db.yml b/content/node.0db2d25b-3e50-4f36-abe1-f84b938c21db.yml index cd11ba1da..98c61a56e 100644 --- a/content/node.0db2d25b-3e50-4f36-abe1-f84b938c21db.yml +++ b/content/node.0db2d25b-3e50-4f36-abe1-f84b938c21db.yml @@ -59,7 +59,7 @@ body:

These services also add extra terminology, such as forks, syncing and pull or merge requests which aren't part of Git itself.

-

This can cause confusion, which is why I think it's important to learn Git itself instead of relying on external services or desktop apps.

+

This can cause confusion, which is why I think it's important to learn Git itself instead of relying on external services or desktop apps.

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.

diff --git a/content/node.0f327d3d-33ce-498a-9234-6c1fe9f51d6a.yml b/content/node.0f327d3d-33ce-498a-9234-6c1fe9f51d6a.yml index b68d937e2..ea5cd4a15 100644 --- a/content/node.0f327d3d-33ce-498a-9234-6c1fe9f51d6a.yml +++ b/content/node.0f327d3d-33ce-498a-9234-6c1fe9f51d6a.yml @@ -67,7 +67,7 @@ body:

Code is easy to write, but needs to be maintained as newer language or framework features are added or have breaking changes.

-

Something I've added recently to Build Configs was an option to use an inclusive or exclusive .gitignore file.

+

Something I've added recently to Build Configs was an option to use an inclusive or exclusive .gitignore file.

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.

diff --git a/content/node.0f349fae-6a04-42b4-979f-ed8428e97a2b.yml b/content/node.0f349fae-6a04-42b4-979f-ed8428e97a2b.yml index ccd25231f..eb724ed12 100644 --- a/content/node.0f349fae-6a04-42b4-979f-ed8428e97a2b.yml +++ b/content/node.0f349fae-6a04-42b4-979f-ed8428e97a2b.yml @@ -63,7 +63,7 @@ body: format: full_html processed: | -

I recently had my first podcast episode with two guests, where I discussed Drupal terminology and Drupalisms with Emma Horrell and Luke McCormick.

+

I recently had my first podcast episode with two guests, where I discussed Drupal terminology and Drupalisms with Emma Horrell and Luke McCormick.

It was a great episode, but there was something I needed to do before I could release it.

@@ -71,7 +71,7 @@ body:

The other 26 episodes only had a single guest per episode, and my podcast pages were built to only show the first guest name.

-

When building the pages for the first episode with Matt Glaman, I only needed to show a single guest name.

+

When building the pages for the first episode with Matt Glaman, I only needed to show a single guest name.

There was no need to show multiple guest names until I had an episode with multiple guests.

diff --git a/content/node.0f64feba-0a96-41e4-b8e3-10358e4c86c6.yml b/content/node.0f64feba-0a96-41e4-b8e3-10358e4c86c6.yml index 8934ea259..1ddf44817 100644 --- a/content/node.0f64feba-0a96-41e4-b8e3-10358e4c86c6.yml +++ b/content/node.0f64feba-0a96-41e4-b8e3-10358e4c86c6.yml @@ -69,7 +69,7 @@ body: format: full_html processed: | -

Last week, I asked whether you should include issue IDs in commit messages.

+

Last week, I asked whether you should include issue IDs in commit messages.

Another thing I like to reference in a commit message is the commit ID (or SHA) of a related commit.

diff --git a/content/node.0fb3ebe0-46c3-4e9c-9961-e62aa512fab3.yml b/content/node.0fb3ebe0-46c3-4e9c-9961-e62aa512fab3.yml index 9caa4e6bd..5fae974e3 100644 --- a/content/node.0fb3ebe0-46c3-4e9c-9961-e62aa512fab3.yml +++ b/content/node.0fb3ebe0-46c3-4e9c-9961-e62aa512fab3.yml @@ -70,7 +70,7 @@ body: format: full_html processed: | -

Note: The numbers within this post are taken from my Test-Driven Drupal talk, in which I also talk about this.

+

Note: The numbers within this post are taken from my Test-Driven Drupal talk, in which I also talk about this.

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.

diff --git a/content/node.10b3608a-50f6-4178-9ae2-d07f353a9c23.yml b/content/node.10b3608a-50f6-4178-9ae2-d07f353a9c23.yml index b24456b44..1e882d690 100644 --- a/content/node.10b3608a-50f6-4178-9ae2-d07f353a9c23.yml +++ b/content/node.10b3608a-50f6-4178-9ae2-d07f353a9c23.yml @@ -59,7 +59,7 @@ body: format: full_html processed: | -

I generally don't use aritrary classes with Tailwind CSS.

+

I generally don't use aritrary classes with Tailwind CSS.

But, they are powerful, and I do use them in some situations.

diff --git a/content/node.11b6429c-7f14-436c-a3cc-f5cfad7b63c0.yml b/content/node.11b6429c-7f14-436c-a3cc-f5cfad7b63c0.yml index 7bed46374..6f40f5893 100644 --- a/content/node.11b6429c-7f14-436c-a3cc-f5cfad7b63c0.yml +++ b/content/node.11b6429c-7f14-436c-a3cc-f5cfad7b63c0.yml @@ -62,7 +62,7 @@ body: processed: |

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.

-

I gave a conference talk about how to use Drupal as a backend application for a Vue.js frontend.

+

I gave a conference talk about how to use Drupal as a backend application for a Vue.js frontend.

Recently, though, I haven't heard much about it.

diff --git a/content/node.121756bd-8e3e-4ba4-a0eb-76178deebc60.yml b/content/node.121756bd-8e3e-4ba4-a0eb-76178deebc60.yml index 2a90957fe..e86e112c7 100644 --- a/content/node.121756bd-8e3e-4ba4-a0eb-76178deebc60.yml +++ b/content/node.121756bd-8e3e-4ba4-a0eb-76178deebc60.yml @@ -37,6 +37,6 @@ path: body: - value: "

As well as writing good commit messages, I've previously written about not squashing commits when merging.

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.

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.

If you're working in a pair or mob and creating temporary commits on a short-lived branch, that's a situation when squashing commits is OK - as long as it's done properly.

I wouldn't have a generic automatically generated message.

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.

I'd make sure the new message is used and not lost when merged - especially when using online tools.

Then I can squash any temporary commits and merge the final squashed version.

" format: basic_html - processed: "

As well as writing good commit messages, I've previously written about not squashing commits when merging.

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.

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.

If you're working in a pair or mob and creating temporary commits on a short-lived branch, that's a situation when squashing commits is OK - as long as it's done properly.

I wouldn't have a generic automatically generated message.

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.

I'd make sure the new message is used and not lost when merged - especially when using online tools.

Then I can squash any temporary commits and merge the final squashed version.

" + processed: "

As well as writing good commit messages, I've previously written about not squashing commits when merging.

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.

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.

If you're working in a pair or mob and creating temporary commits on a short-lived branch, that's a situation when squashing commits is OK - as long as it's done properly.

I wouldn't have a generic automatically generated message.

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.

I'd make sure the new message is used and not lost when merged - especially when using online tools.

Then I can squash any temporary commits and merge the final squashed version.

" summary: '' field_daily_email_cta: { } diff --git a/content/node.1254f835-445d-4a54-a831-2fc179b3d15c.yml b/content/node.1254f835-445d-4a54-a831-2fc179b3d15c.yml index d759c47d3..5caa2a776 100644 --- a/content/node.1254f835-445d-4a54-a831-2fc179b3d15c.yml +++ b/content/node.1254f835-445d-4a54-a831-2fc179b3d15c.yml @@ -55,7 +55,7 @@ body:

I also got to meet Jürgen at DrupalCon in Barcelona, as well as several other podcast guests, which was fantastic.

-

Listen to the episode now.

+

Listen to the episode now.

If you'd like to be a guest on the podcast or want to suggest a topic, reply and let me know!

diff --git a/content/node.12b405e6-2827-4279-b85a-7f06475a69a4.yml b/content/node.12b405e6-2827-4279-b85a-7f06475a69a4.yml index e638f00b6..486ef4337 100644 --- a/content/node.12b405e6-2827-4279-b85a-7f06475a69a4.yml +++ b/content/node.12b405e6-2827-4279-b85a-7f06475a69a4.yml @@ -58,7 +58,7 @@ body: format: full_html processed: | -

Yesterday, I wanted to make a breaking change to my build-configs project - changing the default database credentials that are used by Docker Compose.

+

Yesterday, I wanted to make a breaking change to my build-configs project - changing the default database credentials that are used by Docker Compose.

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.

diff --git a/content/node.13312da0-7cf4-4825-ac6e-eb35c673e63e.yml b/content/node.13312da0-7cf4-4825-ac6e-eb35c673e63e.yml index 2ff843b40..98ab3edd9 100644 --- a/content/node.13312da0-7cf4-4825-ac6e-eb35c673e63e.yml +++ b/content/node.13312da0-7cf4-4825-ac6e-eb35c673e63e.yml @@ -65,7 +65,7 @@ body:

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.

-

Are you interested in web components, too? Listen to the podcast episode with Mark Conroy.

+

Are you interested in web components, too? Listen to the podcast episode with Mark Conroy.

summary: null diff --git a/content/node.15089c84-d265-4024-981e-e3c1ca354659.yml b/content/node.15089c84-d265-4024-981e-e3c1ca354659.yml index feb5b90e4..d3a218c99 100644 --- a/content/node.15089c84-d265-4024-981e-e3c1ca354659.yml +++ b/content/node.15089c84-d265-4024-981e-e3c1ca354659.yml @@ -91,7 +91,7 @@ body: } } -

Note the DailyEmail class is a bundle class I've created that extends the regular Node class.

+

Note the DailyEmail class is a bundle class I've created that extends the regular Node class.

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.

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.

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.

diff --git a/content/node.1550e619-abd2-4efe-b941-fd4e42507d51.yml b/content/node.1550e619-abd2-4efe-b941-fd4e42507d51.yml index 4bd93d2a0..523945e7f 100644 --- a/content/node.1550e619-abd2-4efe-b941-fd4e42507d51.yml +++ b/content/node.1550e619-abd2-4efe-b941-fd4e42507d51.yml @@ -94,9 +94,9 @@ body: format: full_html processed: | -

As well as working with different versions of an API, I was able to use the same technique I wrote about yesterday to easily add a cacheable version of the API client.

+

As well as working with different versions of an API, I was able to use the same technique I wrote about yesterday to easily add a cacheable version of the API client.

-

As they all implement the same ApiClientInterface, 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 the Decorator design pattern).

+

As they all implement the same ApiClientInterface, 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 the Decorator design pattern).

Here's an example based on the code I wrote:

diff --git a/content/node.1579b5cf-889e-4a7b-98a7-59918359def9.yml b/content/node.1579b5cf-889e-4a7b-98a7-59918359def9.yml index 0bc610484..165027eb5 100644 --- a/content/node.1579b5cf-889e-4a7b-98a7-59918359def9.yml +++ b/content/node.1579b5cf-889e-4a7b-98a7-59918359def9.yml @@ -37,6 +37,6 @@ path: body: - value: '

I have recently migrated my daily email archive to Drupal and Tome.

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.

Similar to being able to extend Sculpin with PHP, I get the same benefit with Tome.

I can write the same PHP code and custom Drupal modules as I would with a non-Tome Drupal website.

To count the number of sent daily emails, I created a opd_daily_emails module with a token that generates the number of emails, and displays it on the page.

I can also write the same automated tests.

I have a functional test that confirms the token result is generated and rendered correctly using TokenTestTrait - supported by some kernel tests and a custom DailyEmailTestTrait that makes it easier to create daily email nodes within the tests.

I have all the power and flexibility of Drupal locally and the benefits of a static site when it''s deployed.

P.S. If you want to learn how to write automated tests in Drupal, subscribe to my free 10-day email course.

' format: basic_html - processed: '

I have recently migrated my daily email archive to Drupal and Tome.

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.

Similar to being able to extend Sculpin with PHP, I get the same benefit with Tome.

I can write the same PHP code and custom Drupal modules as I would with a non-Tome Drupal website.

To count the number of sent daily emails, I created a opd_daily_emails module with a token that generates the number of emails, and displays it on the page.

I can also write the same automated tests.

I have a functional test that confirms the token result is generated and rendered correctly using TokenTestTrait - supported by some kernel tests and a custom DailyEmailTestTrait that makes it easier to create daily email nodes within the tests.

I have all the power and flexibility of Drupal locally and the benefits of a static site when it''s deployed.

P.S. If you want to learn how to write automated tests in Drupal, subscribe to my free 10-day email course.

' + processed: '

I have recently migrated my daily email archive to Drupal and Tome.

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.

Similar to being able to extend Sculpin with PHP, I get the same benefit with Tome.

I can write the same PHP code and custom Drupal modules as I would with a non-Tome Drupal website.

To count the number of sent daily emails, I created a opd_daily_emails module with a token that generates the number of emails, and displays it on the page.

I can also write the same automated tests.

I have a functional test that confirms the token result is generated and rendered correctly using TokenTestTrait - supported by some kernel tests and a custom DailyEmailTestTrait that makes it easier to create daily email nodes within the tests.

I have all the power and flexibility of Drupal locally and the benefits of a static site when it''s deployed.

P.S. If you want to learn how to write automated tests in Drupal, subscribe to my free 10-day email course.

' summary: '' field_daily_email_cta: { } diff --git a/content/node.16846795-5fd0-4a67-a080-edfaa8e20cd8.yml b/content/node.16846795-5fd0-4a67-a080-edfaa8e20cd8.yml index a4504af7f..a55aa3979 100644 --- a/content/node.16846795-5fd0-4a67-a080-edfaa8e20cd8.yml +++ b/content/node.16846795-5fd0-4a67-a080-edfaa8e20cd8.yml @@ -57,7 +57,7 @@ body:
  • Panagiotis on Drupal.org (vensires)
  • E-Sepia
  • Panagiotis on LinkedIn
  • -
  • https://drupal.org.gr
  • +
  • https://drupal.org.gr
  • Frontend United
  • summary: '' diff --git a/content/node.16dc23db-86e4-4c5d-b479-3f92828dae12.yml b/content/node.16dc23db-86e4-4c5d-b479-3f92828dae12.yml index c6366925d..9b4a13b75 100644 --- a/content/node.16dc23db-86e4-4c5d-b479-3f92828dae12.yml +++ b/content/node.16dc23db-86e4-4c5d-b479-3f92828dae12.yml @@ -61,7 +61,7 @@ body:

    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.

    -

    I've moved my development projects from Docker to devenv, but I still have Docker installed and available.

    +

    I've moved my development projects from Docker to devenv, but I still have Docker installed and available.

    I knew it was easy to create a container image from a Nix-based setup, but the opposite is also true.

    diff --git a/content/node.16ed92b5-de67-44e4-b11a-7474081a00d2.yml b/content/node.16ed92b5-de67-44e4-b11a-7474081a00d2.yml index 70d3ceda1..64d04eb84 100644 --- a/content/node.16ed92b5-de67-44e4-b11a-7474081a00d2.yml +++ b/content/node.16ed92b5-de67-44e4-b11a-7474081a00d2.yml @@ -90,7 +90,7 @@ body:

    Want to learn more?

    -

    If you want to learn more about automated testing in Drupal, I have a talk about that.

    +

    If you want to learn more about automated testing in Drupal, I have a talk about that.

    summary: null diff --git a/content/node.173ca277-8287-4122-a23d-ddd4b66b08b2.yml b/content/node.173ca277-8287-4122-a23d-ddd4b66b08b2.yml index 3ecbe2df5..849f39104 100644 --- a/content/node.173ca277-8287-4122-a23d-ddd4b66b08b2.yml +++ b/content/node.173ca277-8287-4122-a23d-ddd4b66b08b2.yml @@ -68,9 +68,9 @@ body:

    No-one wants to work on it.

    But, what happens when it needs to change?

    How can you do it and be confident the change doesn't break the existing functionality?

    -

    Before you make any changes, identify the use cases of the current code and cover them by writing automated tests.

    +

    Before you make any changes, identify the use cases of the current code and cover them by writing automated tests.

    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.

    -

    If you need to test an existing Drupal website, use Drupal Test Traits.

    +

    If you need to test an existing Drupal website, use Drupal Test Traits.

    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.

    Hopefully, you'll have written tests for the new functionality, so the test suite will start to grow.

    summary: '' diff --git a/content/node.192c6112-5287-46c9-9fed-5260db08a41c.yml b/content/node.192c6112-5287-46c9-9fed-5260db08a41c.yml index 79acaffca..b4fe3fa6f 100644 --- a/content/node.192c6112-5287-46c9-9fed-5260db08a41c.yml +++ b/content/node.192c6112-5287-46c9-9fed-5260db08a41c.yml @@ -56,7 +56,7 @@ body:

    As Tailwind includes no components (other than the container) 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.

    -

    There are some examples of UIs that I've rebuilt and some websites that I show in my Taking Flight with Tailwind CSS talk.

    +

    There are some examples of UIs that I've rebuilt and some websites that I show in my Taking Flight with Tailwind CSS talk.

    If you take a look, you'll see what I mean.

    diff --git a/content/node.19a48fd0-5e10-496b-b08c-1ed47ad6b2a9.yml b/content/node.19a48fd0-5e10-496b-b08c-1ed47ad6b2a9.yml index 5c9f337cd..585a25169 100644 --- a/content/node.19a48fd0-5e10-496b-b08c-1ed47ad6b2a9.yml +++ b/content/node.19a48fd0-5e10-496b-b08c-1ed47ad6b2a9.yml @@ -57,7 +57,7 @@ body: format: full_html processed: | -

    In yesterday's email, I wrote about why readable variable names are important and why I use descriptive variable names in my code.

    +

    In yesterday's email, I wrote about why readable variable names are important and why I use descriptive variable names in my code.

    Given this pseudo-code:

    diff --git a/content/node.1a024983-b73b-4b2c-a350-db9152de27a9.yml b/content/node.1a024983-b73b-4b2c-a350-db9152de27a9.yml index 753b739e1..de9153e88 100644 --- a/content/node.1a024983-b73b-4b2c-a350-db9152de27a9.yml +++ b/content/node.1a024983-b73b-4b2c-a350-db9152de27a9.yml @@ -70,7 +70,7 @@ body:

    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.

    -

    I used to use Git Flow 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 wasn’t a major issue, it wouldn't have seemed professional.

    +

    I used to use Git Flow 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 wasn’t a major issue, it wouldn't have seemed professional.

    In a team environment, feature branches are intended to keep different changes and different people's work separate.

    diff --git a/content/node.1c0ccb4b-9b26-4078-94bb-31e98017e8f2.yml b/content/node.1c0ccb4b-9b26-4078-94bb-31e98017e8f2.yml index decf988d6..82316936e 100644 --- a/content/node.1c0ccb4b-9b26-4078-94bb-31e98017e8f2.yml +++ b/content/node.1c0ccb4b-9b26-4078-94bb-31e98017e8f2.yml @@ -46,7 +46,7 @@ body: processed: |

    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.

    -

    I'll be taking a short break from these emails to enjoy the conference, focus on my talk, and finish my free email course on automated testing in Drupal.

    +

    I'll be taking a short break from these emails to enjoy the conference, focus on my talk, and finish my free email course on automated testing in Drupal.

    summary: null diff --git a/content/node.1c57b2eb-1206-4833-afb0-a65ec3f432a0.yml b/content/node.1c57b2eb-1206-4833-afb0-a65ec3f432a0.yml index 62a842e49..3556cf4b9 100644 --- a/content/node.1c57b2eb-1206-4833-afb0-a65ec3f432a0.yml +++ b/content/node.1c57b2eb-1206-4833-afb0-a65ec3f432a0.yml @@ -59,7 +59,7 @@ body:

    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.

    -

    As well as organising our online meetups during COVID, I attended a lot of other online events, usually giving various talks or workshops, and whilst they were good for a while, I eventually started to get burned out by them.

    +

    As well as organising our online meetups during COVID, I attended a lot of other online events, usually giving various talks or workshops, and whilst they were good for a while, I eventually started to get burned out by them.

    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.

    diff --git a/content/node.1d61b9ee-e6de-4db6-8782-68eba42d357a.yml b/content/node.1d61b9ee-e6de-4db6-8782-68eba42d357a.yml index b141e28e5..e8f1e7ac4 100644 --- a/content/node.1d61b9ee-e6de-4db6-8782-68eba42d357a.yml +++ b/content/node.1d61b9ee-e6de-4db6-8782-68eba42d357a.yml @@ -80,7 +80,7 @@ body: format: full_html processed: | -

    Last month, I wrote an email explaining why I don't create branches.

    +

    Last month, I wrote an email explaining why I don't create branches.

    After sending that email, I received this question from a reader (shared with permission):

    @@ -98,7 +98,7 @@ body:

    Option 1: Worktrees

    -

    Whilst I don't create branches, I do use Git worktrees, which allows me to have multiple versions of the code checked out at the same time - similar to having multiple clones of a repository.

    +

    Whilst I don't create branches, I do use Git worktrees, which allows me to have multiple versions of the code checked out at the same time - similar to having multiple clones of a repository.

    Having multiple worktrees, you don't need to stash the code for your incomplete feature or worry about commits you haven't pushed yet.

    @@ -108,7 +108,7 @@ body:

    Option 2: Feature Flags

    -

    My preferred approach is to use feature flags, a.k.a. feature toggles.

    +

    My preferred approach is to use feature flags, a.k.a. feature toggles.

    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.

    diff --git a/content/node.1e59e156-0e2c-4f6d-a828-030d1322fde6.yml b/content/node.1e59e156-0e2c-4f6d-a828-030d1322fde6.yml index 72a70774b..90d15de6b 100644 --- a/content/node.1e59e156-0e2c-4f6d-a828-030d1322fde6.yml +++ b/content/node.1e59e156-0e2c-4f6d-a828-030d1322fde6.yml @@ -45,7 +45,7 @@ body: format: full_html processed: | -

    In today's episode of the Beyond Blocks podcast, I'm joined by Eirik Morland - the Developer of Violinist.

    +

    In today's episode of the Beyond Blocks podcast, I'm joined by Eirik Morland - the Developer of Violinist.

    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.

    diff --git a/content/node.1f3f5a8f-412f-4da1-8e7a-4303962079d1.yml b/content/node.1f3f5a8f-412f-4da1-8e7a-4303962079d1.yml index a487c638f..212231f76 100644 --- a/content/node.1f3f5a8f-412f-4da1-8e7a-4303962079d1.yml +++ b/content/node.1f3f5a8f-412f-4da1-8e7a-4303962079d1.yml @@ -57,7 +57,7 @@ body: format: full_html processed: | -

    In yesterday's email, I described how to set up a blank server with Ansible.

    +

    In yesterday's email, I described how to set up a blank server with Ansible.

    Now that we've done that, it needs to be configured.

    @@ -73,7 +73,7 @@ body:
    -

    Want to learn more about how I use Ansible? Register for my upcoming free email course.

    +

    Want to learn more about how I use Ansible? Register for my upcoming free email course.

    summary: null diff --git a/content/node.20010c04-2f30-4772-9041-6f7e836158f8.yml b/content/node.20010c04-2f30-4772-9041-6f7e836158f8.yml index 346be8c2e..17749fd14 100644 --- a/content/node.20010c04-2f30-4772-9041-6f7e836158f8.yml +++ b/content/node.20010c04-2f30-4772-9041-6f7e836158f8.yml @@ -55,7 +55,7 @@ body: format: full_html processed: | -

    Yesterday, I wrote about writing layers in your application code and the benefits of loosely coupled code.

    +

    Yesterday, I wrote about writing layers in your application code and the benefits of loosely coupled code.

    Something else you can do with this approach is to write framework-agnostic code.

    diff --git a/content/node.20b8e2be-b5ec-404d-853e-55cf19327558.yml b/content/node.20b8e2be-b5ec-404d-853e-55cf19327558.yml index 16ed11c41..a8c062f29 100644 --- a/content/node.20b8e2be-b5ec-404d-853e-55cf19327558.yml +++ b/content/node.20b8e2be-b5ec-404d-853e-55cf19327558.yml @@ -67,8 +67,8 @@ body: [4]: https://www.drupal.org/project/dtt format: markdown processed: | -

    I've given talks and workshops on automated testing in Drupal.

    -

    I created a free 10-day email course.

    +

    I've given talks and workshops on automated testing in Drupal.

    +

    I created a free 10-day email course.

    Something I haven't used until recently is Drupal Test Traits.

    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.

    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.

    diff --git a/content/node.20cde1b4-efdc-46a4-a6a4-4fd2264f617e.yml b/content/node.20cde1b4-efdc-46a4-a6a4-4fd2264f617e.yml index 1196de393..0e214a4ea 100644 --- a/content/node.20cde1b4-efdc-46a4-a6a4-4fd2264f617e.yml +++ b/content/node.20cde1b4-efdc-46a4-a6a4-4fd2264f617e.yml @@ -38,5 +38,5 @@ path: body: - value: '

    P.S. Do you want to contribute more to open source but don''t have the time? Sponsor me to do it for you!

    ' format: basic_html - processed: '

    P.S. Do you want to contribute more to open source but don''t have the time? Sponsor me to do it for you!

    ' + processed: '

    P.S. Do you want to contribute more to open source but don''t have the time? Sponsor me to do it for you!

    ' summary: '' diff --git a/content/node.216f7a7d-663b-42a6-b430-3817a1180dbd.yml b/content/node.216f7a7d-663b-42a6-b430-3817a1180dbd.yml index 752c54725..85a8d9e3e 100644 --- a/content/node.216f7a7d-663b-42a6-b430-3817a1180dbd.yml +++ b/content/node.216f7a7d-663b-42a6-b430-3817a1180dbd.yml @@ -51,7 +51,7 @@ body: processed: |

    At Saturday's hackathon that I mentioned in yesterday's email, most of the squads decided to try Tailwind CSS in their applications.

    -

    I've been using Tailwind since it was released, and first gave a Tailwind CSS talk in January 2018.

    +

    I've been using Tailwind since it was released, and first gave a Tailwind CSS talk in January 2018.

    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.

    diff --git a/content/node.225110fb-82d3-4056-a394-0612d80e37ec.yml b/content/node.225110fb-82d3-4056-a394-0612d80e37ec.yml index dd83e815f..cff73e798 100644 --- a/content/node.225110fb-82d3-4056-a394-0612d80e37ec.yml +++ b/content/node.225110fb-82d3-4056-a394-0612d80e37ec.yml @@ -53,13 +53,13 @@ body: format: full_html processed: | -

    As someone who develops with open-source software such as Drupal, Symfony, and Sculpin and uses Linux to host my applications and configure my laptop, I've recently started to explore creating a home lab and self-hosting services based on other open source software.

    +

    As someone who develops with open-source software such as Drupal, Symfony, and Sculpin and uses Linux to host my applications and configure my laptop, I've recently started to explore creating a home lab and self-hosting services based on other open source software.

    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.

    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.

    -

    I've removed proprietary note-taking applications in favour of plain text files and continued searching for free and open source alternatives to services I've used.

    +

    I've removed proprietary note-taking applications in favour of plain text files and continued searching for free and open source alternatives to services I've used.

    My ethos is to be open source first and to favour an open source solution if there is one.

    diff --git a/content/node.2258201f-7beb-4b2a-8a52-ea31c09de73f.yml b/content/node.2258201f-7beb-4b2a-8a52-ea31c09de73f.yml index 9f4923dbc..95c5d4d23 100644 --- a/content/node.2258201f-7beb-4b2a-8a52-ea31c09de73f.yml +++ b/content/node.2258201f-7beb-4b2a-8a52-ea31c09de73f.yml @@ -94,7 +94,7 @@ body:

    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.

    -

    Plus, I get to use new PHP features like promoted constructor properties if everything is named in the same format.

    +

    Plus, I get to use new PHP features like promoted constructor properties if everything is named in the same format.

    summary: null diff --git a/content/node.22cf1c29-6d70-49ea-87b4-0dd2bcdb9952.yml b/content/node.22cf1c29-6d70-49ea-87b4-0dd2bcdb9952.yml index 89f67de35..612837c58 100644 --- a/content/node.22cf1c29-6d70-49ea-87b4-0dd2bcdb9952.yml +++ b/content/node.22cf1c29-6d70-49ea-87b4-0dd2bcdb9952.yml @@ -85,7 +85,7 @@ body:

    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.

    -

    In my Deployments with Ansible and Ansistrano talk, I mention that there is a separate rollback role, but I don't think that I've ever used it.

    +

    In my Deployments with Ansible and Ansistrano talk, I mention that there is a separate rollback role, but I don't think that I've ever used it.

    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.

    diff --git a/content/node.22e50919-7f11-45ed-881e-31482670f416.yml b/content/node.22e50919-7f11-45ed-881e-31482670f416.yml index 1df80d5fe..c1ce37450 100644 --- a/content/node.22e50919-7f11-45ed-881e-31482670f416.yml +++ b/content/node.22e50919-7f11-45ed-881e-31482670f416.yml @@ -70,7 +70,7 @@ body:

    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.

    -

    Another way I use feature flags is within a multi-site Drupal application 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.

    +

    Another way I use feature flags is within a multi-site Drupal application 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.

    summary: null diff --git a/content/node.22f6723d-c781-4548-a2cf-3b642e91b4ad.yml b/content/node.22f6723d-c781-4548-a2cf-3b642e91b4ad.yml index de8c02fe0..9b5eef238 100644 --- a/content/node.22f6723d-c781-4548-a2cf-3b642e91b4ad.yml +++ b/content/node.22f6723d-c781-4548-a2cf-3b642e91b4ad.yml @@ -37,6 +37,6 @@ path: body: - value: '

    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.

    Unfortunately, there was an export issue with the episode that affected the sound quality.

    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.

    Listen to the episode here.

    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.

    ' format: basic_html - processed: '

    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.

    Unfortunately, there was an export issue with the episode that affected the sound quality.

    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.

    Listen to the episode here.

    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.

    ' + processed: '

    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.

    Unfortunately, there was an export issue with the episode that affected the sound quality.

    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.

    Listen to the episode here.

    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.

    ' summary: '' field_daily_email_cta: { } diff --git a/content/node.2365767c-117e-42d3-8657-09bae7d223c2.yml b/content/node.2365767c-117e-42d3-8657-09bae7d223c2.yml index a0d9df103..40c535911 100644 --- a/content/node.2365767c-117e-42d3-8657-09bae7d223c2.yml +++ b/content/node.2365767c-117e-42d3-8657-09bae7d223c2.yml @@ -75,7 +75,7 @@ body:

    I can also use direnv to achieve the same result by adding these lines to an .envrc file:

    use flake git+https://code.oliverdavies.uk/opdavies/dev-shells#php74
           use flake git+https://code.oliverdavies.uk/opdavies/dev-shells#tailwindcss
    -      

    For long-term projects, I would create and commit a specific flake.nix file to the code repository so the environment is reproducible and the packages are locked, but this works when I just need something quickly.

    +

    For long-term projects, I would create and commit a specific flake.nix file to the code repository so the environment is reproducible and the packages are locked, but this works when I just need something quickly.

    summary: '' field_daily_email_cta: - target_type: node diff --git a/content/node.251a41b5-0dfe-4c7b-abe4-9b28d0a52a22.yml b/content/node.251a41b5-0dfe-4c7b-abe4-9b28d0a52a22.yml index fb0d8b466..8e1bd2905 100644 --- a/content/node.251a41b5-0dfe-4c7b-abe4-9b28d0a52a22.yml +++ b/content/node.251a41b5-0dfe-4c7b-abe4-9b28d0a52a22.yml @@ -87,9 +87,9 @@ body:

    I use Sculpin for this website 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).

    -

    I used it to learn Twig before Drupal 8 was released, back in 2015.

    +

    I used it to learn Twig before Drupal 8 was released, back in 2015.

    -

    I've also given a talk on building websites with Sculpin which I may submit to some upcoming conferences.

    +

    I've also given a talk on building websites with Sculpin which I may submit to some upcoming conferences.

    summary: null diff --git a/content/node.266918e6-af3d-48f8-89d4-657ff2214626.yml b/content/node.266918e6-af3d-48f8-89d4-657ff2214626.yml index ffbaed40b..f5154065e 100644 --- a/content/node.266918e6-af3d-48f8-89d4-657ff2214626.yml +++ b/content/node.266918e6-af3d-48f8-89d4-657ff2214626.yml @@ -62,7 +62,7 @@ body:

    That could declare the modules and themes you want to include, without the additional overhead.

    -

    drupal distribution

    +

    drupal distribution

    summary: null diff --git a/content/node.26f6be13-6309-441d-977f-eb84684b8a2f.yml b/content/node.26f6be13-6309-441d-977f-eb84684b8a2f.yml index 08e7aaa64..61ad44f37 100644 --- a/content/node.26f6be13-6309-441d-977f-eb84684b8a2f.yml +++ b/content/node.26f6be13-6309-441d-977f-eb84684b8a2f.yml @@ -53,7 +53,7 @@ body: format: full_html processed: | -

    The harder it is to update an environment, the less often it will be done and the more out of sync your environments will become.

    +

    The harder it is to update an environment, the less often it will be done and the more out of sync your environments will become.

    The more out of sync your environments are, the higher the chance there will be bugs or issues when changes are moved between environments.

    diff --git a/content/node.27159a73-e3ac-4fa9-b18c-2f70157e31d7.yml b/content/node.27159a73-e3ac-4fa9-b18c-2f70157e31d7.yml index 44c4400d4..5902490a1 100644 --- a/content/node.27159a73-e3ac-4fa9-b18c-2f70157e31d7.yml +++ b/content/node.27159a73-e3ac-4fa9-b18c-2f70157e31d7.yml @@ -55,7 +55,7 @@ body: format: full_html processed: | -

    I've written a few earlier emails about run files - a simple bash file that I add to my projects to simplify or combine common commands that I need to run often.

    +

    I've written a few earlier emails about run files - a simple bash file that I add to my projects to simplify or combine common commands that I need to run often.

    Recently, I've looked at a couple of alternatives to see how they compare.

    diff --git a/content/node.2743d645-0679-4862-91b6-1f77f218a5fd.yml b/content/node.2743d645-0679-4862-91b6-1f77f218a5fd.yml index e2505a575..71e365c3f 100644 --- a/content/node.2743d645-0679-4862-91b6-1f77f218a5fd.yml +++ b/content/node.2743d645-0679-4862-91b6-1f77f218a5fd.yml @@ -63,7 +63,7 @@ body: Having consistent approaches makes projects more robust and easier to work on. format: markdown processed: | -

    Yesterday, I wrote about some of my thoughts about the Action pattern that's become popular with PHP Developers.

    +

    Yesterday, I wrote about some of my thoughts about the Action pattern that's become popular with PHP Developers.

    I showed an example based on the AddRandomCtaToDailyEmail action class from my website.

    But, how should these classes be named?

    Should my example by AddRandomCtaToDailyEmail or AddRandomCtaToDailyEmailAction?

    diff --git a/content/node.274408ed-379c-4eaf-914d-7f5599f513d3.yml b/content/node.274408ed-379c-4eaf-914d-7f5599f513d3.yml index ae899870f..10946517b 100644 --- a/content/node.274408ed-379c-4eaf-914d-7f5599f513d3.yml +++ b/content/node.274408ed-379c-4eaf-914d-7f5599f513d3.yml @@ -73,7 +73,7 @@ body:

    If your CI pipeline passes, the commit is good can be deployed.

    -

    If it fails, the commit should not be deployed and you should get it passing again as quickly as possible as there's no value in a broken CI pipeline.

    +

    If it fails, the commit should not be deployed and you should get it passing again as quickly as possible as there's no value in a broken CI pipeline.

    summary: null diff --git a/content/node.278813c0-1c8b-4558-bf13-3c2f03acaeb6.yml b/content/node.278813c0-1c8b-4558-bf13-3c2f03acaeb6.yml index ac2a99a57..b7e98e66f 100644 --- a/content/node.278813c0-1c8b-4558-bf13-3c2f03acaeb6.yml +++ b/content/node.278813c0-1c8b-4558-bf13-3c2f03acaeb6.yml @@ -61,7 +61,7 @@ body:

    Will you be migrating to Drupal 10, or something else?

    -

    If you need help, with my Drupal 7 upgrade roadmap, I'll create an individual plan to upgrade and enjoy easy upgrades to Drupal 11 and beyond!

    +

    If you need help, with my Drupal 7 upgrade roadmap, I'll create an individual plan to upgrade and enjoy easy upgrades to Drupal 11 and beyond!

    summary: null diff --git a/content/node.283e9379-f264-4191-8bbd-2cd8393c395b.yml b/content/node.283e9379-f264-4191-8bbd-2cd8393c395b.yml index 27c854ee5..9b04de700 100644 --- a/content/node.283e9379-f264-4191-8bbd-2cd8393c395b.yml +++ b/content/node.283e9379-f264-4191-8bbd-2cd8393c395b.yml @@ -51,9 +51,9 @@ body:

    We discussed the work happening in Drupal and Drupal CMS to de-jargon Drupal, the Drupalisms working group.

    -

    Listen to the episode here.

    +

    Listen to the episode here.

    -

    If you want to be a guest on the Beyond Blocks podcast, reply and let me know.

    +

    If you want to be a guest on the Beyond Blocks podcast, reply and let me know.

    summary: null diff --git a/content/node.2885a415-17fb-4374-8070-0be55407af6c.yml b/content/node.2885a415-17fb-4374-8070-0be55407af6c.yml index 931947a57..dc1c51cc5 100644 --- a/content/node.2885a415-17fb-4374-8070-0be55407af6c.yml +++ b/content/node.2885a415-17fb-4374-8070-0be55407af6c.yml @@ -69,7 +69,7 @@ body: format: full_html processed: | -

    Since I posted about optimising for revertability, I've received a few questions about how I avoid merge commits when working with Git.

    +

    Since I posted about optimising for revertability, I've received a few questions about how I avoid merge commits when working with Git.

    This is an extract from my .config/git/.config file:

    @@ -97,7 +97,7 @@ body:

    When working with online tools such as GitHub and GitLab, I avoid any options like Squash and merge or Create a merge commit 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.

    -

    Or use trunk-based development and don't work on topic branches at all.

    +

    Or use trunk-based development and don't work on topic branches at all.

    summary: null diff --git a/content/node.290e62f9-ffc1-4420-91f7-decda6410276.yml b/content/node.290e62f9-ffc1-4420-91f7-decda6410276.yml index 77242c34e..bdf3585e0 100644 --- a/content/node.290e62f9-ffc1-4420-91f7-decda6410276.yml +++ b/content/node.290e62f9-ffc1-4420-91f7-decda6410276.yml @@ -53,7 +53,7 @@ body: format: full_html processed: | -

    When you're working on a task - whether you're making it work or making it good, you can commit your code changes as often as you like.

    +

    When you're working on a task - whether you're making it work or making it good, you can commit your code changes as often as you like.

    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.

    diff --git a/content/node.2959438c-8c12-49c7-84a2-d9ea9bf338e6.yml b/content/node.2959438c-8c12-49c7-84a2-d9ea9bf338e6.yml index 2c7779daf..02c7db483 100644 --- a/content/node.2959438c-8c12-49c7-84a2-d9ea9bf338e6.yml +++ b/content/node.2959438c-8c12-49c7-84a2-d9ea9bf338e6.yml @@ -51,7 +51,7 @@ body: format: full_html processed: | -

    As I said in yesterday's email, sometimes you change your mind whilst working on something.

    +

    As I said in yesterday's email, sometimes you change your mind whilst working on something.

    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.

    diff --git a/content/node.298d7816-0b4a-449e-a78d-fcf973f24bf0.yml b/content/node.298d7816-0b4a-449e-a78d-fcf973f24bf0.yml index 88eead336..d01948e39 100644 --- a/content/node.298d7816-0b4a-449e-a78d-fcf973f24bf0.yml +++ b/content/node.298d7816-0b4a-449e-a78d-fcf973f24bf0.yml @@ -37,6 +37,6 @@ path: body: - value: '

    I use NixOS as the Linux distribution on my laptop and home server, and specifically the unstable channel.

    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.

    I don''t necessarily do this to get the latest packages.

    I do it to keep on top of configuration changes.

    I run "nix flake update" usually once a week to download the latest updates.

    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.

    Similar to application deployments, I update early and often.

    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.

    This means I get the benefits of both the rolling and stable approaches.

    If you want to see my NixOS configuration, it''s publicly available on my Forgejo instance.

    ' format: basic_html - processed: '

    I use NixOS as the Linux distribution on my laptop and home server, and specifically the unstable channel.

    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.

    I don''t necessarily do this to get the latest packages.

    I do it to keep on top of configuration changes.

    I run "nix flake update" usually once a week to download the latest updates.

    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.

    Similar to application deployments, I update early and often.

    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.

    This means I get the benefits of both the rolling and stable approaches.

    If you want to see my NixOS configuration, it''s publicly available on my Forgejo instance.

    ' + processed: '

    I use NixOS as the Linux distribution on my laptop and home server, and specifically the unstable channel.

    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.

    I don''t necessarily do this to get the latest packages.

    I do it to keep on top of configuration changes.

    I run "nix flake update" usually once a week to download the latest updates.

    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.

    Similar to application deployments, I update early and often.

    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.

    This means I get the benefits of both the rolling and stable approaches.

    If you want to see my NixOS configuration, it''s publicly available on my Forgejo instance.

    ' summary: '' field_daily_email_cta: { } diff --git a/content/node.29a700d5-082c-4f6b-bafd-f4c4e1486624.yml b/content/node.29a700d5-082c-4f6b-bafd-f4c4e1486624.yml index 2658e7ca4..20059b41f 100644 --- a/content/node.29a700d5-082c-4f6b-bafd-f4c4e1486624.yml +++ b/content/node.29a700d5-082c-4f6b-bafd-f4c4e1486624.yml @@ -69,7 +69,7 @@ body:

    For example, versa run would need to run different commands for Drupal and Sculpin projects, versa test 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.

    -

    Currently, this logic is within my Build Configs project but can be moved to Versa.

    +

    Currently, this logic is within my Build Configs project but can be moved to Versa.

    This reduces the complexity within that codebase and means I can open-source it as it's a separate project.

    diff --git a/content/node.29ab0d54-5f71-4615-b391-164735cada18.yml b/content/node.29ab0d54-5f71-4615-b391-164735cada18.yml index 56e841c6a..ca0ccb26d 100644 --- a/content/node.29ab0d54-5f71-4615-b391-164735cada18.yml +++ b/content/node.29ab0d54-5f71-4615-b391-164735cada18.yml @@ -53,7 +53,7 @@ body:

    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.

    -

    Listen to the episode now.

    +

    Listen to the episode now.

    summary: null diff --git a/content/node.2a6bc8bd-a1e0-4f62-8112-47c3107020c5.yml b/content/node.2a6bc8bd-a1e0-4f62-8112-47c3107020c5.yml index c775efe46..3caf9480e 100644 --- a/content/node.2a6bc8bd-a1e0-4f62-8112-47c3107020c5.yml +++ b/content/node.2a6bc8bd-a1e0-4f62-8112-47c3107020c5.yml @@ -38,5 +38,5 @@ path: body: - value: '

    P.S. Do you need immediate access to an expert Drupal Developer? With my Drupal development subscription, make unlimited requests for a fixed monthly price in less time than posting to a job board!

    ' format: basic_html - processed: '

    P.S. Do you need immediate access to an expert Drupal Developer? With my Drupal development subscription, make unlimited requests for a fixed monthly price in less time than posting to a job board!

    ' + processed: '

    P.S. Do you need immediate access to an expert Drupal Developer? With my Drupal development subscription, make unlimited requests for a fixed monthly price in less time than posting to a job board!

    ' summary: '' diff --git a/content/node.2a8afca0-9193-4e69-86bb-8d1d3639d6e1.yml b/content/node.2a8afca0-9193-4e69-86bb-8d1d3639d6e1.yml index 3a49e5137..58312c14f 100644 --- a/content/node.2a8afca0-9193-4e69-86bb-8d1d3639d6e1.yml +++ b/content/node.2a8afca0-9193-4e69-86bb-8d1d3639d6e1.yml @@ -37,6 +37,6 @@ path: body: - value: '

    This email will be the first in my archive to be powered by Drupal and Tome.

    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.

    This email will be #821.

    I''ve considered moving to Tome - a static site generator for Drupal - since recording a podcast episode with Sam Mortenson 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.

    The main branch in my code repository now includes the Tome commits and I''ll be working my way through my task list as I continue migrating incrementally and switching more sections to Tome.

    ' format: basic_html - processed: '

    This email will be the first in my archive to be powered by Drupal and Tome.

    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.

    This email will be #821.

    I''ve considered moving to Tome - a static site generator for Drupal - since recording a podcast episode with Sam Mortenson 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.

    The main branch in my code repository now includes the Tome commits and I''ll be working my way through my task list as I continue migrating incrementally and switching more sections to Tome.

    ' + processed: '

    This email will be the first in my archive to be powered by Drupal and Tome.

    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.

    This email will be #821.

    I''ve considered moving to Tome - a static site generator for Drupal - since recording a podcast episode with Sam Mortenson 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.

    The main branch in my code repository now includes the Tome commits and I''ll be working my way through my task list as I continue migrating incrementally and switching more sections to Tome.

    ' summary: '' field_daily_email_cta: { } diff --git a/content/node.2b55b7dd-2287-462d-a951-62603ce334bd.yml b/content/node.2b55b7dd-2287-462d-a951-62603ce334bd.yml index 1b9fafd51..013541d15 100644 --- a/content/node.2b55b7dd-2287-462d-a951-62603ce334bd.yml +++ b/content/node.2b55b7dd-2287-462d-a951-62603ce334bd.yml @@ -65,7 +65,7 @@ body:

    Ideally, you also want everything to be reproducible with locked dependencies and generate the same outcome regardless of when the commands are run.

    -

    This is one of the main reasons I've started to use Nix and devenv for projects - because they create environments that are both consistent and reproducible, reducing the chances of dependency mismatches and bugs creeping into my code.

    +

    This is one of the main reasons I've started to use Nix and devenv for projects - because they create environments that are both consistent and reproducible, reducing the chances of dependency mismatches and bugs creeping into my code.

    summary: null diff --git a/content/node.2c022817-6bf1-4a2f-809e-8895c72a0e03.yml b/content/node.2c022817-6bf1-4a2f-809e-8895c72a0e03.yml index b3639e3e3..5ee6aa1cc 100644 --- a/content/node.2c022817-6bf1-4a2f-809e-8895c72a0e03.yml +++ b/content/node.2c022817-6bf1-4a2f-809e-8895c72a0e03.yml @@ -69,7 +69,7 @@ body: format: full_html processed: | -

    Before my remote talk for the Drupal London meetup, I'm updating the usage statistics for the Override Node Options module - one of the modules I maintain on Drupal.org.

    +

    Before my remote talk for the Drupal London meetup, I'm updating the usage statistics for the Override Node Options module - one of the modules I maintain on Drupal.org.

    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.

    diff --git a/content/node.2c5bbb3d-d8f4-496c-ae72-b739f5b1a90c.yml b/content/node.2c5bbb3d-d8f4-496c-ae72-b739f5b1a90c.yml index 79555750c..7cafe9386 100644 --- a/content/node.2c5bbb3d-d8f4-496c-ae72-b739f5b1a90c.yml +++ b/content/node.2c5bbb3d-d8f4-496c-ae72-b739f5b1a90c.yml @@ -83,7 +83,7 @@ body:

    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.

    -

    I look forward to getting more of these emails for my other contributed projects on Drupal.org.

    +

    I look forward to getting more of these emails for my other contributed projects on Drupal.org.

    summary: null diff --git a/content/node.2d05cfa9-d5cf-41df-ba50-2c55b776f1f5.yml b/content/node.2d05cfa9-d5cf-41df-ba50-2c55b776f1f5.yml index e7de0cf15..6f9c70309 100644 --- a/content/node.2d05cfa9-d5cf-41df-ba50-2c55b776f1f5.yml +++ b/content/node.2d05cfa9-d5cf-41df-ba50-2c55b776f1f5.yml @@ -57,9 +57,9 @@ body: format: full_html processed: | -

    Whilst mentoring at the School of Code Hackathon, 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.

    +

    Whilst mentoring at the School of Code Hackathon, 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.

    -

    We kept it simple by adding this to a README file, but I also mentioned ADRs and technical decision documents and how they can be written in Markdown and stored alongside the code in the same repository.

    +

    We kept it simple by adding this to a README file, but I also mentioned ADRs and technical decision documents and how they can be written in Markdown and stored alongside the code in the same repository.

    Another approach to documentation that I like is to create diagrams and flow charts.

    diff --git a/content/node.2da2e369-297c-46bd-83e5-8fd16d4c85c1.yml b/content/node.2da2e369-297c-46bd-83e5-8fd16d4c85c1.yml index d3161a0d1..e9ceb9c79 100644 --- a/content/node.2da2e369-297c-46bd-83e5-8fd16d4c85c1.yml +++ b/content/node.2da2e369-297c-46bd-83e5-8fd16d4c85c1.yml @@ -47,11 +47,11 @@ body: format: full_html processed: | -

    In the most recent episode of the Beyond Blocks podcast, I spoke with Sam Mortenson about Single File Components in Drupal as well as building static Drupal websites with Tome.

    +

    In the most recent episode of the Beyond Blocks podcast, I spoke with Sam Mortenson about Single File Components in Drupal as well as building static Drupal websites with Tome.

    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.

    -

    Listen to the episode now.

    +

    Listen to the episode now.

    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!

    diff --git a/content/node.2e4827a4-0d9c-458c-86eb-d6b40f18d608.yml b/content/node.2e4827a4-0d9c-458c-86eb-d6b40f18d608.yml index ca113af13..8340f8867 100644 --- a/content/node.2e4827a4-0d9c-458c-86eb-d6b40f18d608.yml +++ b/content/node.2e4827a4-0d9c-458c-86eb-d6b40f18d608.yml @@ -49,7 +49,7 @@ body: format: full_html processed: | -

    Whether you prefer PHPUnit or Pest PHP, or if you're coding in a different language, it's important to have automated tests - especially before you refactor any code.

    +

    Whether you prefer PHPUnit or Pest PHP, or if you're coding in a different language, it's important to have automated tests - especially before you refactor any code.

    Before you refactor, you want to have passing tests that you're confident cover all the required functionality.

    diff --git a/content/node.2f07215e-0ea6-4afe-8c19-ed0ed81246d6.yml b/content/node.2f07215e-0ea6-4afe-8c19-ed0ed81246d6.yml index 259842e68..208bc77e9 100644 --- a/content/node.2f07215e-0ea6-4afe-8c19-ed0ed81246d6.yml +++ b/content/node.2f07215e-0ea6-4afe-8c19-ed0ed81246d6.yml @@ -63,7 +63,7 @@ body:

    You specify the commit SHA you want to revert and Git will automatically try and revert that commit.

    -

    It creates its own commit message which includes the original commit message and the reverted commit SHA, so you can easily find or navigate to the original commit.

    +

    It creates its own commit message which includes the original commit message and the reverted commit SHA, so you can easily find or navigate to the original commit.

    For example:

    diff --git a/content/node.3074e1e9-c691-4f73-a71c-cfe5920f884e.yml b/content/node.3074e1e9-c691-4f73-a71c-cfe5920f884e.yml index 635acffab..348991a55 100644 --- a/content/node.3074e1e9-c691-4f73-a71c-cfe5920f884e.yml +++ b/content/node.3074e1e9-c691-4f73-a71c-cfe5920f884e.yml @@ -38,5 +38,5 @@ path: body: - value: '

    P.S. Are you still using Drupal 7 and don’t know what’s involved to upgrade to Drupal 11? Book a Drupal 7 upgrade consultation call or an upgrade roadmap.

    ' format: basic_html - processed: '

    P.S. Are you still using Drupal 7 and don’t know what’s involved to upgrade to Drupal 11? Book a Drupal 7 upgrade consultation call or an upgrade roadmap.

    ' + processed: '

    P.S. Are you still using Drupal 7 and don’t know what’s involved to upgrade to Drupal 11? Book a Drupal 7 upgrade consultation call or an upgrade roadmap.

    ' summary: '' diff --git a/content/node.3373d8dc-7c1d-477f-8628-f3029228b9c4.yml b/content/node.3373d8dc-7c1d-477f-8628-f3029228b9c4.yml index d345eefc4..496451c4a 100644 --- a/content/node.3373d8dc-7c1d-477f-8628-f3029228b9c4.yml +++ b/content/node.3373d8dc-7c1d-477f-8628-f3029228b9c4.yml @@ -55,7 +55,7 @@ body: format: full_html processed: | -

    I recently started using Nix to build my PDF presentation slides that I create with rst2pdf.

    +

    I recently started using Nix to build my PDF presentation slides that I create with rst2pdf.

    I removed the custom build script that was generating the PDF files and moved that code into a Nix derivation.

    diff --git a/content/node.33bea7ca-ccf4-4865-bc17-314ce54b6988.yml b/content/node.33bea7ca-ccf4-4865-bc17-314ce54b6988.yml index 1586964f0..2389a9186 100644 --- a/content/node.33bea7ca-ccf4-4865-bc17-314ce54b6988.yml +++ b/content/node.33bea7ca-ccf4-4865-bc17-314ce54b6988.yml @@ -57,7 +57,7 @@ body: processed: |

    As well as PHP, JavaScript, HTML, CSS, etc, I write a lot of Bash scripts.

    -

    From project-specific run files to CI pipelines, Dockerfiles and deployment scripts, Bash is used a lot in the ops side of software development.

    +

    From project-specific run files to CI pipelines, Dockerfiles and deployment scripts, Bash is used a lot in the ops side of software development.

    Today, though, I wrote a small Bash script for my personal laptop.

    diff --git a/content/node.3422a295-b8a9-43a0-9a03-a54d77e52513.yml b/content/node.3422a295-b8a9-43a0-9a03-a54d77e52513.yml index f55ac86a0..0199c7f3f 100644 --- a/content/node.3422a295-b8a9-43a0-9a03-a54d77e52513.yml +++ b/content/node.3422a295-b8a9-43a0-9a03-a54d77e52513.yml @@ -51,7 +51,7 @@ body: processed: |

    This week, I'm speaking at the newly-restarted PHP Berkshire meetup.

    -

    Organised by Humand Talent, the same people who now organise PHP Oxford (where I spoke in January), this time I'm speaking about Sculpin - the PHP static site generator I use for my website and to publish my new Zettlekasten notes.

    +

    Organised by Humand Talent, the same people who now organise PHP Oxford (where I spoke in January), this time I'm speaking about Sculpin - the PHP static site generator I use for my website and to publish my new Zettlekasten notes.

    I'm looking forward to discussing again why I like static site generators and what benefits they offer.

    diff --git a/content/node.34be6fed-cd1a-4796-adb8-577340a359b4.yml b/content/node.34be6fed-cd1a-4796-adb8-577340a359b4.yml index b59a7fa18..06822f85e 100644 --- a/content/node.34be6fed-cd1a-4796-adb8-577340a359b4.yml +++ b/content/node.34be6fed-cd1a-4796-adb8-577340a359b4.yml @@ -53,7 +53,7 @@ body: format: full_html processed: | -

    Yesterday, I said that I'm working on a Sass project with no utility or atomic styles.

    +

    Yesterday, I said that I'm working on a Sass project with no utility or atomic styles.

    But, the two aren't mutually exclusive.

    diff --git a/content/node.358edef5-5436-46ca-a90c-4d691ea7c281.yml b/content/node.358edef5-5436-46ca-a90c-4d691ea7c281.yml index 3fe0b5d27..9ba6be7dd 100644 --- a/content/node.358edef5-5436-46ca-a90c-4d691ea7c281.yml +++ b/content/node.358edef5-5436-46ca-a90c-4d691ea7c281.yml @@ -49,7 +49,7 @@ body: format: full_html processed: | -

    In Wednesday's email, I said I was resurrecting the Speakerdeck Field module, and the same version works on Drupal 8, 9, 10 and 11.

    +

    In Wednesday's email, I said I was resurrecting the Speakerdeck Field module, and the same version works on Drupal 8, 9, 10 and 11.

    How do I know this?

    diff --git a/content/node.362530ad-9f84-49c4-a8cb-bea45c77c474.yml b/content/node.362530ad-9f84-49c4-a8cb-bea45c77c474.yml index 5d5c4a83d..631ef39f8 100644 --- a/content/node.362530ad-9f84-49c4-a8cb-bea45c77c474.yml +++ b/content/node.362530ad-9f84-49c4-a8cb-bea45c77c474.yml @@ -47,7 +47,7 @@ body: processed: |

    On the 24th of April, I'll be attending a LocalGov Drupal Camp in Birmingham, UK.

    -

    As someone keen to get more involved and contribute more to the project, and who's local council recently switched to LocalGov, I'm looking forward to the chance to learn and contribute on the day and afterwards.

    +

    As someone keen to get more involved and contribute more to the project, and who's local council recently switched to LocalGov, I'm looking forward to the chance to learn and contribute on the day and afterwards.

    If you want to attend also, there are a few remaining tickets available and you can register on Eventbrite.

    diff --git a/content/node.3681f8cd-22d5-4c2c-b03f-a751bc39753d.yml b/content/node.3681f8cd-22d5-4c2c-b03f-a751bc39753d.yml index 0c43997cb..45d47bb43 100644 --- a/content/node.3681f8cd-22d5-4c2c-b03f-a751bc39753d.yml +++ b/content/node.3681f8cd-22d5-4c2c-b03f-a751bc39753d.yml @@ -141,7 +141,7 @@ body: format: full_html processed: | -

    In Wednesday's email, I showed how quick it is to get started writing automated tests for a new Drupal module, starting with a functional test.

    +

    In Wednesday's email, I showed how quick it is to get started writing automated tests for a new Drupal module, starting with a functional test.

    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 I’ll use a functional test. If not, I’ll use a kernel (or integration) test.

    diff --git a/content/node.38522a11-5473-4584-a8f0-c9097a843c9b.yml b/content/node.38522a11-5473-4584-a8f0-c9097a843c9b.yml index 7faea145a..7ca61fd68 100644 --- a/content/node.38522a11-5473-4584-a8f0-c9097a843c9b.yml +++ b/content/node.38522a11-5473-4584-a8f0-c9097a843c9b.yml @@ -59,7 +59,7 @@ body:

    It's a metric that I like to check occasionally as I like to keep codebases lean and with the minimum amount of code.

    -

    I don't like to have features that aren't used or pre-optimised code for use cases that may not happen.

    +

    I don't like to have features that aren't used or pre-optimised code for use cases that may not happen.

    The more code there is in your application, the problems you could encounter.

    diff --git a/content/node.38535020-c00e-4720-8534-73346ff7cb0d.yml b/content/node.38535020-c00e-4720-8534-73346ff7cb0d.yml index 9d4f36612..b9e5c7457 100644 --- a/content/node.38535020-c00e-4720-8534-73346ff7cb0d.yml +++ b/content/node.38535020-c00e-4720-8534-73346ff7cb0d.yml @@ -37,6 +37,6 @@ path: body: - value: '

    Once you''ve resolved an issue and restored service, what lessons can be learned to ensure the same issue doesn''t happen again?

    Could the issue have been caught or identified sooner, before it got to production?

    Ideally, an issue would be identified in a local environment, in a CI pipeline or a staging environment.

    Anything before production, but the sooner, the better.

    Can you introduce more tools or automated checks?

    PHP in particular has a lot of tools for linting, analysing and testing code, such as PHPStan and PHPUnit.

    These can be run locally or automatically within a CI pipeline.

    If the pipeline is passing, the code should be deployable.

    But, if there is an issue, what needs to be added to the pipeline that would have identified it?

    How can you iterate and make your development and deployment processes better and more robust?

    ' format: basic_html - processed: '

    Once you''ve resolved an issue and restored service, what lessons can be learned to ensure the same issue doesn''t happen again?

    Could the issue have been caught or identified sooner, before it got to production?

    Ideally, an issue would be identified in a local environment, in a CI pipeline or a staging environment.

    Anything before production, but the sooner, the better.

    Can you introduce more tools or automated checks?

    PHP in particular has a lot of tools for linting, analysing and testing code, such as PHPStan and PHPUnit.

    These can be run locally or automatically within a CI pipeline.

    If the pipeline is passing, the code should be deployable.

    But, if there is an issue, what needs to be added to the pipeline that would have identified it?

    How can you iterate and make your development and deployment processes better and more robust?

    ' + processed: '

    Once you''ve resolved an issue and restored service, what lessons can be learned to ensure the same issue doesn''t happen again?

    Could the issue have been caught or identified sooner, before it got to production?

    Ideally, an issue would be identified in a local environment, in a CI pipeline or a staging environment.

    Anything before production, but the sooner, the better.

    Can you introduce more tools or automated checks?

    PHP in particular has a lot of tools for linting, analysing and testing code, such as PHPStan and PHPUnit.

    These can be run locally or automatically within a CI pipeline.

    If the pipeline is passing, the code should be deployable.

    But, if there is an issue, what needs to be added to the pipeline that would have identified it?

    How can you iterate and make your development and deployment processes better and more robust?

    ' summary: '' field_daily_email_cta: { } diff --git a/content/node.391f650b-0f52-43f6-b3f3-bd7fbca1c11e.yml b/content/node.391f650b-0f52-43f6-b3f3-bd7fbca1c11e.yml index 9421faa85..5405f6f05 100644 --- a/content/node.391f650b-0f52-43f6-b3f3-bd7fbca1c11e.yml +++ b/content/node.391f650b-0f52-43f6-b3f3-bd7fbca1c11e.yml @@ -56,7 +56,7 @@ body: format: full_html processed: | -

    Yesterday's email talked about writing reusable, framework-agnostic packages but didn't mention where those packages could be located.

    +

    Yesterday's email talked about writing reusable, framework-agnostic packages but didn't mention where those packages could be located.

    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.

    diff --git a/content/node.3a13004e-2245-425f-8080-0b98e161bcb0.yml b/content/node.3a13004e-2245-425f-8080-0b98e161bcb0.yml index bf35d7c34..03ed4c26b 100644 --- a/content/node.3a13004e-2245-425f-8080-0b98e161bcb0.yml +++ b/content/node.3a13004e-2245-425f-8080-0b98e161bcb0.yml @@ -59,7 +59,7 @@ body: processed: |

    Another reason I like static websites is that they're easy and quick to deploy.

    -

    Whether you use write each HTML file by hand or use a static site generator, a simple Web server like Caddy, Nginx or Apache can load and serve your website for everyone to see.

    +

    Whether you use write each HTML file by hand or use a static site generator, a simple Web server like Caddy, Nginx or Apache can load and serve your website for everyone to see.

    My Sculpin website generates an output_prod directory after I run sculpin generate with my deployable files.

    diff --git a/content/node.3bb4452f-5bd7-4cce-8ec8-d68610e00b92.yml b/content/node.3bb4452f-5bd7-4cce-8ec8-d68610e00b92.yml index 978013cda..4f3ed61bf 100644 --- a/content/node.3bb4452f-5bd7-4cce-8ec8-d68610e00b92.yml +++ b/content/node.3bb4452f-5bd7-4cce-8ec8-d68610e00b92.yml @@ -52,7 +52,7 @@ body: format: full_html processed: | -

    Yesterday's email 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?

    +

    Yesterday's email 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?

    You could make sure that you remove everything manually before you stage and commit your changes, or I like to use git add --patch (or git add -p) 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 --patch option also works for other commands, including checkout and reset.

    diff --git a/content/node.3c851569-9655-4936-aed7-6f965aa6b4d1.yml b/content/node.3c851569-9655-4936-aed7-6f965aa6b4d1.yml index d4fd91aa1..599dd3df6 100644 --- a/content/node.3c851569-9655-4936-aed7-6f965aa6b4d1.yml +++ b/content/node.3c851569-9655-4936-aed7-6f965aa6b4d1.yml @@ -91,7 +91,7 @@ body: [podcast]: /podcast/6-dan-leech-php-tui format: markdown processed: | -

    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 Beyond Blocks podcast) about them at a recent PHP meetup.

    +

    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 Beyond Blocks podcast) about them at a recent PHP meetup.

    To quote from Dan's talk - "value objects are objects that represent a value".

    They are simple classes that give a meaningful name to a value.

    For example, I could write this value object to represent a railway station code:

    diff --git a/content/node.3cb7e223-af31-471e-acef-d3d069852841.yml b/content/node.3cb7e223-af31-471e-acef-d3d069852841.yml index 8a8539b07..ec0bdf19a 100644 --- a/content/node.3cb7e223-af31-471e-acef-d3d069852841.yml +++ b/content/node.3cb7e223-af31-471e-acef-d3d069852841.yml @@ -58,7 +58,7 @@ body: format: full_html processed: | -

    Whilst writing yesterday's email 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.

    +

    Whilst writing yesterday's email 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.

    Here's a list of project release dates from ChatGPT, which seem correct to me at a glance:

    diff --git a/content/node.400a0b92-7c40-43b0-883d-5f199fb5471f.yml b/content/node.400a0b92-7c40-43b0-883d-5f199fb5471f.yml index 00b52e904..16e461c2d 100644 --- a/content/node.400a0b92-7c40-43b0-883d-5f199fb5471f.yml +++ b/content/node.400a0b92-7c40-43b0-883d-5f199fb5471f.yml @@ -112,7 +112,7 @@ body:

    Concatination and nesting

    -

    Something I've avoided with Sass, 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.

    +

    Something I've avoided with Sass, 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.

    If there was this CSS:

    @@ -131,7 +131,7 @@ body:

    Here's the thing

    -

    It's taken me a while to get back into this way of working with CSS, but it does remind me why I prefer to use utility styles for my own projects.

    +

    It's taken me a while to get back into this way of working with CSS, but it does remind me why I prefer to use utility styles for my own projects.

    summary: null diff --git a/content/node.41b8a70d-5df8-45f5-956a-c30b2f3e06de.yml b/content/node.41b8a70d-5df8-45f5-956a-c30b2f3e06de.yml index 2badfc702..1a0667b2d 100644 --- a/content/node.41b8a70d-5df8-45f5-956a-c30b2f3e06de.yml +++ b/content/node.41b8a70d-5df8-45f5-956a-c30b2f3e06de.yml @@ -56,7 +56,7 @@ body:

    Each tool has its configuration file with different settings and formats.

    -

    Rather than being too tightly coupled to a particular tool, I like to keep things as agnostic as possible and use a run file with separate ci:build and ci:deploy tasks.

    +

    Rather than being too tightly coupled to a particular tool, I like to keep things as agnostic as possible and use a run file with separate ci:build and ci:deploy tasks.

    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.

    diff --git a/content/node.42868f5d-12a8-4cfc-9811-f3f7ad7aac06.yml b/content/node.42868f5d-12a8-4cfc-9811-f3f7ad7aac06.yml index 86b46535f..7c7a934a4 100644 --- a/content/node.42868f5d-12a8-4cfc-9811-f3f7ad7aac06.yml +++ b/content/node.42868f5d-12a8-4cfc-9811-f3f7ad7aac06.yml @@ -55,7 +55,7 @@ body: format: full_html processed: | -

    A few days ago, I said that I still like to use RSS to consume a lot of online content.

    +

    A few days ago, I said that I still like to use RSS to consume a lot of online content.

    Unfortunately, a lot of websites either don't have RSS or Atom feeds, or they aren't easy to find without viewing the website's source code.

    diff --git a/content/node.42904e0f-f6d7-496e-8bce-72bd1e669e99.yml b/content/node.42904e0f-f6d7-496e-8bce-72bd1e669e99.yml index cc00d805d..725986d32 100644 --- a/content/node.42904e0f-f6d7-496e-8bce-72bd1e669e99.yml +++ b/content/node.42904e0f-f6d7-496e-8bce-72bd1e669e99.yml @@ -47,7 +47,7 @@ body: format: full_html processed: | -

    Yesterday, I asked if it's time to stop writing Sass.

    +

    Yesterday, I asked if it's time to stop writing Sass.

    If you still use Sass and are writing new styles with Sass, I'd like to know why.

    diff --git a/content/node.43311430-52e8-4fe6-8dd4-ab7d158adafa.yml b/content/node.43311430-52e8-4fe6-8dd4-ab7d158adafa.yml index 74ab13ca5..a0bc06094 100644 --- a/content/node.43311430-52e8-4fe6-8dd4-ab7d158adafa.yml +++ b/content/node.43311430-52e8-4fe6-8dd4-ab7d158adafa.yml @@ -149,7 +149,7 @@ body: } } -

    Note: the idea of using IteratorAggregate came from from Dan Leech and his talk at a local PHP meetup.

    +

    Note: the idea of using IteratorAggregate came from from Dan Leech and his talk at a local PHP meetup.

    Each contains an array of Guest objects that I can run methods like count() and first() on.

    Everything is typed so PHPStan can parse the code and provide as much assistance as possible.

    But, what if I wanted to make a generic Collection that could accept any type of item?

    diff --git a/content/node.43c6257e-4064-422d-8075-5ec55861c177.yml b/content/node.43c6257e-4064-422d-8075-5ec55861c177.yml index 7ef16743b..62c8e53e1 100644 --- a/content/node.43c6257e-4064-422d-8075-5ec55861c177.yml +++ b/content/node.43c6257e-4064-422d-8075-5ec55861c177.yml @@ -61,7 +61,7 @@ body: processed: |

    This week on the Beyond Blocks podcast, I'm joined by Mark Conroy - Director of Development at Annertech to discuss all things front-end development and building something useful in one day.

    -

    Listen now

    +

    Listen now

    Talking points

    diff --git a/content/node.43f35613-9c2f-46e9-b581-8253823fb7d8.yml b/content/node.43f35613-9c2f-46e9-b581-8253823fb7d8.yml index a2dcbb765..dbf7b8f8a 100644 --- a/content/node.43f35613-9c2f-46e9-b581-8253823fb7d8.yml +++ b/content/node.43f35613-9c2f-46e9-b581-8253823fb7d8.yml @@ -72,7 +72,7 @@ body: format: full_html processed: | -

    As part of my recent digital simplification, I've started hosting the episodes of the Beyond Blocks podcast myself.

    +

    As part of my recent digital simplification, I've started hosting the episodes of the Beyond Blocks podcast myself.

    I've always had the podcast pages on my website and used them as the primary pages to redirect people for information about the episodes.

    @@ -83,11 +83,11 @@ body:

    My website is built with Sculpin, so I was able to do this easily with Twig by adding the path to the MP3 file to each episode:

    <audio controls>
    -        <source src="http://default/files/bb/episodes/%7B%7B%20page.episode_filename%20%7D%7D" type="audio/mp3">
    +        <source src="/files/bb/episodes/%7B%7B%20page.episode_filename%20%7D%7D" type="audio/mp3">
           </audio>
           
    -

    This is already live. You can see it on any of the podcast episode pages.

    +

    This is already live. You can see it on any of the podcast episode pages.

    The other thing I'm using is the feed that publishes episodes to Spotify, iTunes, etc.

    diff --git a/content/node.4528246c-53df-4a2b-aba1-e72a45dc542d.yml b/content/node.4528246c-53df-4a2b-aba1-e72a45dc542d.yml index 7771c5253..cf2adc976 100644 --- a/content/node.4528246c-53df-4a2b-aba1-e72a45dc542d.yml +++ b/content/node.4528246c-53df-4a2b-aba1-e72a45dc542d.yml @@ -67,13 +67,13 @@ body:

    If one of those is your issue or module, I can write the tests you need.

    -

    After my first podcast episode with Mark Conroy, I did this for the Content Access by Path module, which now has tests and automated checks with GitLab CI - so they will be run for every future merge request.

    +

    After my first podcast episode with Mark Conroy, I did this for the Content Access by Path module, which now has tests and automated checks with GitLab CI - so they will be run for every future merge request.

    You can see me writing them on a previous live stream.

    If you need tests written or help writing them yourself, reply and get in touch.

    -

    If you want to sponsor my contribution time, you'll also get contribution credit for any issues or merge requests I work on during that time and, whilst it's been a while since my last live stream, you'd also be mentioned there as I work on these issues.

    +

    If you want to sponsor my contribution time, you'll also get contribution credit for any issues or merge requests I work on during that time and, whilst it's been a while since my last live stream, you'd also be mentioned there as I work on these issues.

    I have around a day a week available for sponsored contribution time.

    diff --git a/content/node.45636e82-61b1-4298-a28c-34f139b9a559.yml b/content/node.45636e82-61b1-4298-a28c-34f139b9a559.yml index 6d329970a..34e945eb5 100644 --- a/content/node.45636e82-61b1-4298-a28c-34f139b9a559.yml +++ b/content/node.45636e82-61b1-4298-a28c-34f139b9a559.yml @@ -37,6 +37,6 @@ path: body: - value: '

    In Drupal, there are different types of automated tests we can write.

    The most common I use are Functional, Kernel and Unit - which I explain about in my Test Driven Drupal talk.

    If I''m writing multiple of the same type, I''ll often create my own base test class that extends BrowserTestCase, KernelTestCase or whatever base class I need rather than extending it directly.

    This allows me to write custom helper functions and share behaviour between the tests.

    An example is the createDailyEmailNode method I wrote to simplify creating daily emails in my tests since migrating to Tome.

    But, what if you want to do this for different types of test?

    Enter, traits.

    Traits are a way of reusing code without inheritance - meaning without extending a base class.

    I can use a trait in my functional and kernel tests whilst both extend their required base classes.

    I did this with my createDailyEmailNode method so I could re-use it in both types of tests when counting the number of sent daily emails.

    To see this, you can look at the code on my Forgejo instance.

    P.S. If you want to learn how to write automated tests in Drupal, subscribe to my free 10-day email course.

    ' format: basic_html - processed: '

    In Drupal, there are different types of automated tests we can write.

    The most common I use are Functional, Kernel and Unit - which I explain about in my Test Driven Drupal talk.

    If I''m writing multiple of the same type, I''ll often create my own base test class that extends BrowserTestCase, KernelTestCase or whatever base class I need rather than extending it directly.

    This allows me to write custom helper functions and share behaviour between the tests.

    An example is the createDailyEmailNode method I wrote to simplify creating daily emails in my tests since migrating to Tome.

    But, what if you want to do this for different types of test?

    Enter, traits.

    Traits are a way of reusing code without inheritance - meaning without extending a base class.

    I can use a trait in my functional and kernel tests whilst both extend their required base classes.

    I did this with my createDailyEmailNode method so I could re-use it in both types of tests when counting the number of sent daily emails.

    To see this, you can look at the code on my Forgejo instance.

    P.S. If you want to learn how to write automated tests in Drupal, subscribe to my free 10-day email course.

    ' + processed: '

    In Drupal, there are different types of automated tests we can write.

    The most common I use are Functional, Kernel and Unit - which I explain about in my Test Driven Drupal talk.

    If I''m writing multiple of the same type, I''ll often create my own base test class that extends BrowserTestCase, KernelTestCase or whatever base class I need rather than extending it directly.

    This allows me to write custom helper functions and share behaviour between the tests.

    An example is the createDailyEmailNode method I wrote to simplify creating daily emails in my tests since migrating to Tome.

    But, what if you want to do this for different types of test?

    Enter, traits.

    Traits are a way of reusing code without inheritance - meaning without extending a base class.

    I can use a trait in my functional and kernel tests whilst both extend their required base classes.

    I did this with my createDailyEmailNode method so I could re-use it in both types of tests when counting the number of sent daily emails.

    To see this, you can look at the code on my Forgejo instance.

    P.S. If you want to learn how to write automated tests in Drupal, subscribe to my free 10-day email course.

    ' summary: '' field_daily_email_cta: { } diff --git a/content/node.4619464a-a90c-4ce6-854d-9decfb58c603.yml b/content/node.4619464a-a90c-4ce6-854d-9decfb58c603.yml index a08f7d0a2..c149bc5a0 100644 --- a/content/node.4619464a-a90c-4ce6-854d-9decfb58c603.yml +++ b/content/node.4619464a-a90c-4ce6-854d-9decfb58c603.yml @@ -59,7 +59,7 @@ body:

    Rector is one of those tools.

    -

    Yesterday I said I use it to create automatic updates to my Drupal module code, but it can be used for other PHP projects, too.

    +

    Yesterday I said I use it to create automatic updates to my Drupal module code, but it can be used for other PHP projects, too.

    If you're upgrading a PHP library and want to use promoted constructor properties, for example, Rector can do that for you - and a lot more.

    diff --git a/content/node.465a0fa7-eb20-4d3e-b30d-9d03187b13ca.yml b/content/node.465a0fa7-eb20-4d3e-b30d-9d03187b13ca.yml index 293aaa5e5..47f7dc78a 100644 --- a/content/node.465a0fa7-eb20-4d3e-b30d-9d03187b13ca.yml +++ b/content/node.465a0fa7-eb20-4d3e-b30d-9d03187b13ca.yml @@ -53,9 +53,9 @@ body: [2]: https://www.youtube.com/watch?v=FIKpNzEGQJY format: markdown processed: | -

    Last week, I wrote about giving things descriptive names with value objects in PHP (and other languages).

    +

    Last week, I wrote about giving things descriptive names with value objects in PHP (and other languages).

    I gave examples of value objects I've recently written to show how they make code descriptive and easier to understand.

    -

    Previous Beyond Blocks podcast guest, Dan Leech, gave a great talk about value objects at a local PHP user group.

    +

    Previous Beyond Blocks podcast guest, Dan Leech, gave a great talk about value objects at a local PHP user group.

    That talk is not online yet, but the video of the version from the Dutch PHP Conference has just been released.

    The slides are also online on Dan's website.

    I recommend watching the video and/or reviewing the slides, and start trying to use value objects in your code.

    diff --git a/content/node.465add9b-a2c7-48f1-84de-966fbbd20c27.yml b/content/node.465add9b-a2c7-48f1-84de-966fbbd20c27.yml index 456986283..07400a93d 100644 --- a/content/node.465add9b-a2c7-48f1-84de-966fbbd20c27.yml +++ b/content/node.465add9b-a2c7-48f1-84de-966fbbd20c27.yml @@ -56,7 +56,7 @@ body: format: full_html processed: | -

    Continuing yesterday's thought on strictness in PHP, today I want to talk about adding more strictness to PHPStan.

    +

    Continuing yesterday's thought on strictness in PHP, today I want to talk about adding more strictness to PHPStan.

    Adding the PHPStan Strict Rules extension makes PHPStan stricter by adding new, more opinionated rules.

    diff --git a/content/node.467e5ad9-cca4-4700-8727-3356e81182aa.yml b/content/node.467e5ad9-cca4-4700-8727-3356e81182aa.yml index f4d6e07c4..80769045e 100644 --- a/content/node.467e5ad9-cca4-4700-8727-3356e81182aa.yml +++ b/content/node.467e5ad9-cca4-4700-8727-3356e81182aa.yml @@ -49,7 +49,7 @@ body: format: full_html processed: | -

    One of the main uses for a CI pipeline is to build artifacts for your application, such as installing your dependencies using Composer or npm, or using build tools to perform tasks such as building your CSS and JavaScript assets.

    +

    One of the main uses for a CI pipeline is to build artifacts for your application, such as installing your dependencies using Composer or npm, or using build tools to perform tasks such as building your CSS and JavaScript assets.

    Performing these tasks in a CI pipeline means the resulting files can be ignored from your code repository and not committed - making your commits smaller and easier to review, and less likely for you to encounter merge conflicts.

    diff --git a/content/node.46b8861e-c2e4-49ef-8b79-fb14effaef6a.yml b/content/node.46b8861e-c2e4-49ef-8b79-fb14effaef6a.yml index 2315b86d8..9793ac0b1 100644 --- a/content/node.46b8861e-c2e4-49ef-8b79-fb14effaef6a.yml +++ b/content/node.46b8861e-c2e4-49ef-8b79-fb14effaef6a.yml @@ -61,7 +61,7 @@ body: format: full_html processed: | -

    It's been more than nine years since I started my dotfiles repository, which is a collection of configuration files for tools I use.

    +

    It's been more than nine years since I started my dotfiles repository, which is a collection of configuration files for tools I use.

    Originally containing my .gitconfig configuration file for Git, it now contains my configuration for Neovim, tmux, Git and a lot more.

    diff --git a/content/node.47578912-129e-4ee2-9392-a5e04f4592b4.yml b/content/node.47578912-129e-4ee2-9392-a5e04f4592b4.yml index 9459f2e51..bd112a204 100644 --- a/content/node.47578912-129e-4ee2-9392-a5e04f4592b4.yml +++ b/content/node.47578912-129e-4ee2-9392-a5e04f4592b4.yml @@ -56,7 +56,7 @@ body: format: full_html processed: | -

    Yesterday, I posted a screenshot from my automated testing in Drupal email course on Twitter as a sneak peek of what's included.

    +

    Yesterday, I posted a screenshot from my automated testing in Drupal email course on Twitter as a sneak peek of what's included.

    Here it is again:

    @@ -66,11 +66,11 @@ body:

    Screenshot of Drupal code in Neovim

    -

    Since July 2021, I've used Neovim as my daily driver for writing all my code, which I spoke about during my Working without Workspace talk.

    +

    Since July 2021, I've used Neovim as my daily driver for writing all my code, which I spoke about during my Working without Workspace talk.

    You can also see my NixOS-based dotfiles on GitHub which contains my Neovim configuration.

    -

    Register now to find out when the email course is live, or read the first lesson.

    +

    Register now to find out when the email course is live, or read the first lesson.

    summary: null diff --git a/content/node.48384c9b-ce41-4356-8364-6ce566eac315.yml b/content/node.48384c9b-ce41-4356-8364-6ce566eac315.yml index 44db26200..1d768b301 100644 --- a/content/node.48384c9b-ce41-4356-8364-6ce566eac315.yml +++ b/content/node.48384c9b-ce41-4356-8364-6ce566eac315.yml @@ -59,7 +59,7 @@ body: format: full_html processed: | -

    Last week, I recorded an episode of Beyond Blocks with Eirik Morland - the Developer of violinist.io, a tool for automating dependency updates in PHP projects.

    +

    Last week, I recorded an episode of Beyond Blocks with Eirik Morland - the Developer of violinist.io, a tool for automating dependency updates in PHP projects.

    Instead of a person manually running composer update in each project, tools like Violinist can do that for you and submit pull or merge requests to your project for you to review.

    diff --git a/content/node.494f1c44-47b9-48be-9240-5a9df560fdaf.yml b/content/node.494f1c44-47b9-48be-9240-5a9df560fdaf.yml index 4fd23844c..4b4d34bc7 100644 --- a/content/node.494f1c44-47b9-48be-9240-5a9df560fdaf.yml +++ b/content/node.494f1c44-47b9-48be-9240-5a9df560fdaf.yml @@ -54,7 +54,7 @@ body:

    Of course, it doesn't mean all of the contributed modules, themes and distributions will be supported or updated until then, but this will give additional time to plan and migrate the remaining Drupal 7 websites whilst still giving clarity by setting a final date that will not be extended again.

    -

    If you're still on Drupal 7 and need to learn more about upgrading to Drupal 10, book an advisory call or an upgrade roadmap for your Drupal 7 project.

    +

    If you're still on Drupal 7 and need to learn more about upgrading to Drupal 10, book an advisory call or an upgrade roadmap for your Drupal 7 project.

    summary: null diff --git a/content/node.49a59848-0bef-4184-b9d2-5bf539c6e14c.yml b/content/node.49a59848-0bef-4184-b9d2-5bf539c6e14c.yml index 8cbbbc595..d72d0e82d 100644 --- a/content/node.49a59848-0bef-4184-b9d2-5bf539c6e14c.yml +++ b/content/node.49a59848-0bef-4184-b9d2-5bf539c6e14c.yml @@ -53,7 +53,7 @@ body: format: full_html processed: | -

    As well as being easy to build and simple to deploy, static websites are easy to backup and, if needed, restore.

    +

    As well as being easy to build and simple to deploy, static websites are easy to backup and, if needed, restore.

    I backup several static websites from my server using rsync - the same command I use to deploy them.

    diff --git a/content/node.49ef1a05-b415-4537-b2c7-285827e27463.yml b/content/node.49ef1a05-b415-4537-b2c7-285827e27463.yml index d1e536888..328d217d0 100644 --- a/content/node.49ef1a05-b415-4537-b2c7-285827e27463.yml +++ b/content/node.49ef1a05-b415-4537-b2c7-285827e27463.yml @@ -55,7 +55,7 @@ body: format: full_html processed: | -

    As well as Nix managing packages and NixOS as your operating system, you can use Nix to manage your user configuration and dotfiles.

    +

    As well as Nix managing packages and NixOS as your operating system, you can use Nix to manage your user configuration and dotfiles.

    Enter, Home Manager.

    @@ -63,7 +63,7 @@ body:

    With it, you can install and configure programs for specific users and create and manage dotfiles such as .gitconfig, .tmux.conf and .zshrc instead of using a tool like Stow.

    -

    There's also the extra benefit that you can write these files in the Nix language and only focus on one configuration language.

    +

    There's also the extra benefit that you can write these files in the Nix language and only focus on one configuration language.

    Nix and Home Manager will create the desired output file in whatever the program wants, whether it's JSON, ini, YAML or something else.

    diff --git a/content/node.4a1294d7-248e-48f8-bfae-b49bbe1d19b4.yml b/content/node.4a1294d7-248e-48f8-bfae-b49bbe1d19b4.yml index 947901043..20175a7cc 100644 --- a/content/node.4a1294d7-248e-48f8-bfae-b49bbe1d19b4.yml +++ b/content/node.4a1294d7-248e-48f8-bfae-b49bbe1d19b4.yml @@ -71,7 +71,7 @@ body:

    If a comment describes the functionality, it can be refactored and extracted to a class, method or function - a.k.a. self-documenting code.

    -

    But, if you want something that will alert you if the functionality changes, look into automated testing.

    +

    But, if you want something that will alert you if the functionality changes, look into automated testing.

    If you have a passing test that suddenly starts to fail, you know the behaviour has changed.

    diff --git a/content/node.4ae8b0fe-2248-4e67-b68a-816c8539528a.yml b/content/node.4ae8b0fe-2248-4e67-b68a-816c8539528a.yml index 4c30596fa..bf74f96a0 100644 --- a/content/node.4ae8b0fe-2248-4e67-b68a-816c8539528a.yml +++ b/content/node.4ae8b0fe-2248-4e67-b68a-816c8539528a.yml @@ -53,7 +53,7 @@ body: processed: |

    After starting with jQuery in Drupal 6 and moving to full JavaScript frameworks like Vue, I've recently been using Stimulus when adding JavaScript to my projects.

    -

    After finding it via SymfonyCasts and Symfony UX (I can't remember if Ryan and I discussed it in our podcast episode), I like that it works on top of my existing HTML and Twig templates instead of having to rewrite or duplicate all the markup.

    +

    After finding it via SymfonyCasts and Symfony UX (I can't remember if Ryan and I discussed it in our podcast episode), I like that it works on top of my existing HTML and Twig templates instead of having to rewrite or duplicate all the markup.

    You enable and configure it with data attributes like data-controller and data-action in your HTML which refer to separate JavaScript classes and methods, so you have some structure and organisation compared to putting all the logic in Twig.

    diff --git a/content/node.4c1497cc-4638-40fc-b045-f342c4d3e5b3.yml b/content/node.4c1497cc-4638-40fc-b045-f342c4d3e5b3.yml index 06c232d25..6994c6256 100644 --- a/content/node.4c1497cc-4638-40fc-b045-f342c4d3e5b3.yml +++ b/content/node.4c1497cc-4638-40fc-b045-f342c4d3e5b3.yml @@ -241,7 +241,7 @@ body:

    In this lesson, we start from scratch and end with a working test suite.

    -

    If you like it, register for free and get the full course when it launches.

    +

    If you like it, register for free and get the full course when it launches.

    Creating a Drupal project

    @@ -428,7 +428,7 @@ body:

    From this, you can hopefully see that automated testing doesn't need to be difficult, and the configuration you've done here will work for the upcoming lessons, where you'll expand on what you've done and explore more that Drupal and PHPUnit have to offer.

    -

    I hope you enjoyed this sneak peek, and if you'd like to receive the course once it's complete, register here for free.

    +

    I hope you enjoyed this sneak peek, and if you'd like to receive the course once it's complete, register here for free.

    summary: null diff --git a/content/node.4d65036f-7cf3-4ec5-be30-d20f684b820a.yml b/content/node.4d65036f-7cf3-4ec5-be30-d20f684b820a.yml index d6aa0d1d4..87d496612 100644 --- a/content/node.4d65036f-7cf3-4ec5-be30-d20f684b820a.yml +++ b/content/node.4d65036f-7cf3-4ec5-be30-d20f684b820a.yml @@ -56,7 +56,7 @@ body: format: full_html processed: | -

    It's been almost five years since I gave the first version of my "Taking Flight with Tailwind CSS" talk at the Drupal Bristol meetup in January 2018.

    +

    It's been almost five years since I gave the first version of my "Taking Flight with Tailwind CSS" talk at the Drupal Bristol meetup in January 2018.

    It's a talk that I've updated every time I've given it, showing new rebuilt example UIs and the new features in the framework, as well as tweaking content like installation steps for different audiences.

    diff --git a/content/node.4d6d623b-afb2-4628-b716-2e6c3adac5cb.yml b/content/node.4d6d623b-afb2-4628-b716-2e6c3adac5cb.yml index ba7de8733..4c55517e4 100644 --- a/content/node.4d6d623b-afb2-4628-b716-2e6c3adac5cb.yml +++ b/content/node.4d6d623b-afb2-4628-b716-2e6c3adac5cb.yml @@ -47,7 +47,7 @@ body: format: full_html processed: | -

    In yesterday's email, I showed some of the usage numbers of the Override Node Options module and how the current numbers match those around a year ago.

    +

    In yesterday's email, I showed some of the usage numbers of the Override Node Options module and how the current numbers match those around a year ago.

    Whilst the overall numbers are similar, there are a lot less Drupal 7 installations of the module and around the same number more Drupal 8+ installations.

    diff --git a/content/node.4de8ccc0-035a-46b9-870d-6df54238eb65.yml b/content/node.4de8ccc0-035a-46b9-870d-6df54238eb65.yml index b91f27555..8aec753cf 100644 --- a/content/node.4de8ccc0-035a-46b9-870d-6df54238eb65.yml +++ b/content/node.4de8ccc0-035a-46b9-870d-6df54238eb65.yml @@ -65,7 +65,7 @@ body: format: full_html processed: | -

    As well as fetching API data, you can also use Astro to generate your own API endpoints.

    +

    As well as fetching API data, you can also use Astro to generate your own API endpoints.

    This is an example of an endpoint that I recently created as part of a demo application:

    diff --git a/content/node.4df98b71-9bff-4c1d-9636-5074e31a7ace.yml b/content/node.4df98b71-9bff-4c1d-9636-5074e31a7ace.yml index 0887f0f84..593fb6835 100644 --- a/content/node.4df98b71-9bff-4c1d-9636-5074e31a7ace.yml +++ b/content/node.4df98b71-9bff-4c1d-9636-5074e31a7ace.yml @@ -59,7 +59,7 @@ body: processed: |

    Another common Git issue I see is people using git add . to commit every change in every file they have locally.

    -

    Similar to committing with -m, this seems to be a common in Git tutorials, but can have consequences due to unexpected changes being staged and committed.

    +

    Similar to committing with -m, this seems to be a common in Git tutorials, but can have consequences due to unexpected changes being staged and committed.

    Maybe there are unrelated changes in the same file or other files have been changed that you don't want to commit yet.

    diff --git a/content/node.4e0d5cba-13d4-497e-a320-d1236df4dce2.yml b/content/node.4e0d5cba-13d4-497e-a320-d1236df4dce2.yml index 961807561..6302d8240 100644 --- a/content/node.4e0d5cba-13d4-497e-a320-d1236df4dce2.yml +++ b/content/node.4e0d5cba-13d4-497e-a320-d1236df4dce2.yml @@ -87,7 +87,7 @@ body:

    Here's the thing

    -

    This is why I've been experimenting with architectural testing. To ensure that modules only use their own code and to start enforcing layers within each module.

    +

    This is why I've been experimenting with architectural testing. To ensure that modules only use their own code and to start enforcing layers within each module.

    Then, if I had the same situation again, I'd know straight away that there was an issue and not have to wait for the bug to be deployed to production.

    diff --git a/content/node.4e66101d-e2bf-4eab-904d-67c15d0466b8.yml b/content/node.4e66101d-e2bf-4eab-904d-67c15d0466b8.yml index 217cc86fa..46ca784c1 100644 --- a/content/node.4e66101d-e2bf-4eab-904d-67c15d0466b8.yml +++ b/content/node.4e66101d-e2bf-4eab-904d-67c15d0466b8.yml @@ -86,7 +86,7 @@ body:

    Since then, I've learned various other related technologies, including Linux, and exclusively run Linux for my computers and servers.

    -

    I switched full-time to Neovim in 2021.

    +

    I switched full-time to Neovim in 2021.

    For the past couple of years, I've been using NixOS as my primary operating system.

    diff --git a/content/node.5017b3a0-ce88-4884-bace-c0550e729ab5.yml b/content/node.5017b3a0-ce88-4884-bace-c0550e729ab5.yml index bda954e79..cd0d89f4e 100644 --- a/content/node.5017b3a0-ce88-4884-bace-c0550e729ab5.yml +++ b/content/node.5017b3a0-ce88-4884-bace-c0550e729ab5.yml @@ -99,7 +99,7 @@ body:

    Here's the thing

    -

    In PHP, a common approach is to use the assert() function, as we saw in yesterday's email.

    +

    In PHP, a common approach is to use the assert() function, as we saw in yesterday's email.

    Then, write automated tests that don't test just the happy path but also the unhappy paths.

    diff --git a/content/node.50f6b3f3-e483-41b0-a44a-465109c160b7.yml b/content/node.50f6b3f3-e483-41b0-a44a-465109c160b7.yml index c74dd7c3c..93c02dc34 100644 --- a/content/node.50f6b3f3-e483-41b0-a44a-465109c160b7.yml +++ b/content/node.50f6b3f3-e483-41b0-a44a-465109c160b7.yml @@ -54,9 +54,9 @@ body: processed: |

    Today, after saying I wanted to get back into it, I did my first live coding stream in over two years.

    -

    I spent around an hour and a half working on Build Configs - a Symfony command line application I wrote to generate build configuration files.

    +

    I spent around an hour and a half working on Build Configs - a Symfony command line application I wrote to generate build configuration files.

    -

    To learn more about it, I gave a meetup talk about it recently.

    +

    To learn more about it, I gave a meetup talk about it recently.

    On stream, I explained what Build Configs is, added a --dry-run option that prevents any files from being created and started to look again at Behat to see how I might use it to test the app's functionality.

    diff --git a/content/node.52049b70-5092-41ea-a749-5fde0d95b39e.yml b/content/node.52049b70-5092-41ea-a749-5fde0d95b39e.yml index a5a2936aa..623b03c48 100644 --- a/content/node.52049b70-5092-41ea-a749-5fde0d95b39e.yml +++ b/content/node.52049b70-5092-41ea-a749-5fde0d95b39e.yml @@ -123,9 +123,9 @@ body: format: full_html processed: | -

    I recently said that I've been using devenv to run Drupal applications locally.

    +

    I recently said that I've been using devenv to run Drupal applications locally.

    -

    Here's the devenv.nix file I used for my recent talk for the Drupal London meetup:

    +

    Here's the devenv.nix file I used for my recent talk for the Drupal London meetup:

    { pkgs, ... }:
     
    diff --git a/content/node.526f1b74-c255-4dd3-ba7a-5d529545d01d.yml b/content/node.526f1b74-c255-4dd3-ba7a-5d529545d01d.yml
    index 9c17d5429..33050b839 100644
    --- a/content/node.526f1b74-c255-4dd3-ba7a-5d529545d01d.yml
    +++ b/content/node.526f1b74-c255-4dd3-ba7a-5d529545d01d.yml
    @@ -67,7 +67,7 @@ body:
                   
         format: full_html
         processed: |
    -      

    In my talk about automated testing and test-driven development, I speak about a custom module I wrote for a client's Drupal project.

    +

    In my talk about automated testing and test-driven development, I speak about a custom module I wrote for a client's Drupal project.

    It was to integrate with a third-party job application system that they would log into and enter information via a form (similar to Drupal's node forms) that they wanted to appear on the Drupal website.

    diff --git a/content/node.52d92e80-5970-4525-b4b6-b30562f5573c.yml b/content/node.52d92e80-5970-4525-b4b6-b30562f5573c.yml index 7bdb7fc90..b464bb591 100644 --- a/content/node.52d92e80-5970-4525-b4b6-b30562f5573c.yml +++ b/content/node.52d92e80-5970-4525-b4b6-b30562f5573c.yml @@ -67,7 +67,7 @@ body: [0]: /daily/2022/09/01/conventional-commits-changelogs format: markdown processed: | -

    Whilst I don't use the conventional commits approach to writing commit messages any more, I still think it's important to think about the type of change when a commit is made to a code repository.

    +

    Whilst I don't use the conventional commits approach to writing commit messages any more, I still think it's important to think about the type of change when a commit is made to a code repository.

    Are you adding a new feature?

    Are you fixing a bug?

    Are you refactoring some code?

    diff --git a/content/node.53a00f10-a301-4294-ad39-916b9bc2ecd7.yml b/content/node.53a00f10-a301-4294-ad39-916b9bc2ecd7.yml index 4c57699f2..f4cbe64a8 100644 --- a/content/node.53a00f10-a301-4294-ad39-916b9bc2ecd7.yml +++ b/content/node.53a00f10-a301-4294-ad39-916b9bc2ecd7.yml @@ -55,7 +55,7 @@ body: format: full_html processed: | -

    Once you've cleaned up and tided your commits, re-ordered them and squashed any commits together to combine them into logical changes, before you push them, you should also check if your commit messages still make sense.

    +

    Once you've cleaned up and tided your commits, re-ordered them and squashed any commits together to combine them into logical changes, before you push them, you should also check if your commit messages still make sense.

    Using short or generic commit messages is fine when spiking a solution in very short feedback loops, but when you push your changes, you want them to be as descriptive and meaningful as possible.

    @@ -67,7 +67,7 @@ body:

    Does it capture why the change is needed, any alternative approaches that we considered or tried, or any complications that were encountered?

    -

    If you're following a standard like conventional commits, have you correctly included the required information, such as the type, scope and any references, such as the task reference?

    +

    If you're following a standard like conventional commits, have you correctly included the required information, such as the type, scope and any references, such as the task reference?

    Having a Git log with detailed history is valuable when you need to review the changes in the future, but it also makes it more likely your changes will be approved and merged, whether you're working on a paid project or volunteering on an open-source project.

    diff --git a/content/node.53ad5789-5fd6-41e8-b748-ce9e0bff280b.yml b/content/node.53ad5789-5fd6-41e8-b748-ce9e0bff280b.yml index 34ab2e986..76d352ace 100644 --- a/content/node.53ad5789-5fd6-41e8-b748-ce9e0bff280b.yml +++ b/content/node.53ad5789-5fd6-41e8-b748-ce9e0bff280b.yml @@ -56,7 +56,7 @@ body: format: full_html processed: | -

    An argument against the contribution-first and open-source-first approach is that it takes longer than writing custom code.

    +

    An argument against the contribution-first and open-source-first approach is that it takes longer than writing custom code.

    I think that this is due to thinking that you need to cover all use cases within the code if it's open-sourced, whereas, in custom code, you only write the code you need.

    diff --git a/content/node.53d1af45-bb51-4e4a-a2b9-b732bc9dc8ea.yml b/content/node.53d1af45-bb51-4e4a-a2b9-b732bc9dc8ea.yml index f10e38cd6..0cff50abb 100644 --- a/content/node.53d1af45-bb51-4e4a-a2b9-b732bc9dc8ea.yml +++ b/content/node.53d1af45-bb51-4e4a-a2b9-b732bc9dc8ea.yml @@ -61,7 +61,7 @@ body: format: full_html processed: | -

    Yesterday, I wrote about some things I look for when evaluating open-source projects.

    +

    Yesterday, I wrote about some things I look for when evaluating open-source projects.

    One thing I said was "When was the most recent commit and release?".

    diff --git a/content/node.54a30090-50dd-4534-af69-bc7120297bf9.yml b/content/node.54a30090-50dd-4534-af69-bc7120297bf9.yml index 6dbb96399..93693a55a 100644 --- a/content/node.54a30090-50dd-4534-af69-bc7120297bf9.yml +++ b/content/node.54a30090-50dd-4534-af69-bc7120297bf9.yml @@ -59,7 +59,7 @@ body:

    I used it for automating infrastructure and deploying applications.

    -

    I gave a talk about it on several occasions, including remotely for the Ansible London meetup during COVID.

    +

    I gave a talk about it on several occasions, including remotely for the Ansible London meetup during COVID.

    I haven't had to use it recently but, today, I brought it back out of my toolkit.

    diff --git a/content/node.5563fb1b-a5a1-4372-84b9-b0be87acc501.yml b/content/node.5563fb1b-a5a1-4372-84b9-b0be87acc501.yml index a363d3426..525396714 100644 --- a/content/node.5563fb1b-a5a1-4372-84b9-b0be87acc501.yml +++ b/content/node.5563fb1b-a5a1-4372-84b9-b0be87acc501.yml @@ -111,7 +111,7 @@ body:

    I learned a lot during this conversation and have added visual regression testing to my testing toolbox for working on projects.

    -

    Listen to the episode

    +

    Listen to the episode

    summary: null diff --git a/content/node.557b60f7-1f31-40ec-b0c8-285df7a73dd9.yml b/content/node.557b60f7-1f31-40ec-b0c8-285df7a73dd9.yml index 5a673e3d0..7c49796e3 100644 --- a/content/node.557b60f7-1f31-40ec-b0c8-285df7a73dd9.yml +++ b/content/node.557b60f7-1f31-40ec-b0c8-285df7a73dd9.yml @@ -47,7 +47,7 @@ body: format: full_html processed: | -

    Whether you get a solution from AI, GitHub, Stack Overflow or somewhere else, don't blindly copy and paste it.

    +

    Whether you get a solution from AI, GitHub, Stack Overflow or somewhere else, don't blindly copy and paste it.

    Validate and verify it's the right solution.

    diff --git a/content/node.5652a68a-720a-4954-adfa-38b8e2890b8d.yml b/content/node.5652a68a-720a-4954-adfa-38b8e2890b8d.yml index d91e01a29..bac6f3887 100644 --- a/content/node.5652a68a-720a-4954-adfa-38b8e2890b8d.yml +++ b/content/node.5652a68a-720a-4954-adfa-38b8e2890b8d.yml @@ -146,7 +146,7 @@ body:

    Thanks to everyone who completed the survey for their feedback.

    -

    P.S. If you'd like your own software development training or coaching, including automated testing and test-driven development, I currently have availability for team coaching and private talks and workshops.

    +

    P.S. If you'd like your own software development training or coaching, including automated testing and test-driven development, I currently have availability for team coaching and private talks and workshops.

    summary: null diff --git a/content/node.56df3f74-7cd2-4229-98b7-a593d435ad70.yml b/content/node.56df3f74-7cd2-4229-98b7-a593d435ad70.yml index e2e3a78da..2943f59b4 100644 --- a/content/node.56df3f74-7cd2-4229-98b7-a593d435ad70.yml +++ b/content/node.56df3f74-7cd2-4229-98b7-a593d435ad70.yml @@ -57,7 +57,7 @@ body:

    Usually, this would involve using a different base Docker image, creating new configuration files, and changing things like the root directory for my project.

    -

    But, because I'd built this into Build Configs, I was able to change a few lines in one file, and when I re-generated the configuration files, this project was running Apache.

    +

    But, because I'd built this into Build Configs, I was able to change a few lines in one file, and when I re-generated the configuration files, this project was running Apache.

    This is an excellent example of why I built this tool: to save time and reduce duplication across my projects.

    diff --git a/content/node.56e62486-ed1c-4ce8-89e1-8c92cd8fe254.yml b/content/node.56e62486-ed1c-4ce8-89e1-8c92cd8fe254.yml index ad7627aa4..619606b24 100644 --- a/content/node.56e62486-ed1c-4ce8-89e1-8c92cd8fe254.yml +++ b/content/node.56e62486-ed1c-4ce8-89e1-8c92cd8fe254.yml @@ -51,11 +51,11 @@ body: processed: |

    Over the next few weeks, I'm going to create another email course, this time about building websites with the Sculpin static site generator.

    -

    I've been using Sculpin since 2015 when I used it to learn Twig before Drupal 8's release and I use it to generate my website.

    +

    I've been using Sculpin since 2015 when I used it to learn Twig before Drupal 8's release and I use it to generate my website.

    -

    I've recently been speaking about it at user groups like PHP South West, BrumPHP and PHP Berkshire.

    +

    I've recently been speaking about it at user groups like PHP South West, BrumPHP and PHP Berkshire.

    -

    Similar to my automated testing email course, this will send a lesson every day straight to your inbox and will show how to build a website with Sculpin from scratch.

    +

    Similar to my automated testing email course, this will send a lesson every day straight to your inbox and will show how to build a website with Sculpin from scratch.

    If you want to be added when it's ready or have questions, reply to this email and let me know.

    diff --git a/content/node.5715449a-bcad-41cd-bdb7-252d43b3ebcf.yml b/content/node.5715449a-bcad-41cd-bdb7-252d43b3ebcf.yml index c158a5bc5..af6406044 100644 --- a/content/node.5715449a-bcad-41cd-bdb7-252d43b3ebcf.yml +++ b/content/node.5715449a-bcad-41cd-bdb7-252d43b3ebcf.yml @@ -48,7 +48,7 @@ body: format: full_html processed: | -

    In my Taking Flight with Tailwind CSS talk, I've described Tailwind as a CSS utility class generator. You write a configuration file that Tailwind reads and generates the appropriate classes.

    +

    In my Taking Flight with Tailwind CSS talk, I've described Tailwind as a CSS utility class generator. You write a configuration file that Tailwind reads and generates the appropriate classes.

    Yesterday I mentioned the PHP South West user group website. It's a project that I worked on in November 2017 and uses Tailwind 0.5.

    diff --git a/content/node.57f28cf3-4474-4668-8222-c430cbe9b88b.yml b/content/node.57f28cf3-4474-4668-8222-c430cbe9b88b.yml index 0864b7ee9..aa0378b6e 100644 --- a/content/node.57f28cf3-4474-4668-8222-c430cbe9b88b.yml +++ b/content/node.57f28cf3-4474-4668-8222-c430cbe9b88b.yml @@ -55,11 +55,11 @@ body: format: full_html processed: | -

    Yesterday, I wrote about a bash script I've written to export a list of videos on my external hard drive.

    +

    Yesterday, I wrote about a bash script I've written to export a list of videos on my external hard drive.

    If you looked at the script on GitHub and you're familiar with bash scripting, you may have thought it looked a bit odd or missing some things.

    -

    That's because I wrote it with Nix - the tool I've been using for almost two years to manage my dotfiles and operating system configuration.

    +

    That's because I wrote it with Nix - the tool I've been using for almost two years to manage my dotfiles and operating system configuration.

    Using Nix for bash scripts has advantages, like automatically adding the shebang line, setting sensible defaults for error handling, and automatically running shellcheck when switching.

    diff --git a/content/node.57f698eb-511f-4cfb-95b0-a752efab60ea.yml b/content/node.57f698eb-511f-4cfb-95b0-a752efab60ea.yml index e6bfd74ad..45dda811f 100644 --- a/content/node.57f698eb-511f-4cfb-95b0-a752efab60ea.yml +++ b/content/node.57f698eb-511f-4cfb-95b0-a752efab60ea.yml @@ -49,11 +49,11 @@ body: format: full_html processed: | -

    My talks page on my website says I've presented 98 talks and workshops at different events since September 2012.

    +

    My talks page on my website says I've presented 98 talks and workshops at different events since September 2012.

    Next month, I'm giving two talks at DrupalCamp Ghent.

    -

    One on automated testing and test-driven development and another on Tailwind CSS.

    +

    One on automated testing and test-driven development and another on Tailwind CSS.

    This means that these will be my 99th and 100th presentations!

    diff --git a/content/node.597567b2-4065-4bea-890f-b8faef33f8c6.yml b/content/node.597567b2-4065-4bea-890f-b8faef33f8c6.yml index 1483541b0..9c8168bd9 100644 --- a/content/node.597567b2-4065-4bea-890f-b8faef33f8c6.yml +++ b/content/node.597567b2-4065-4bea-890f-b8faef33f8c6.yml @@ -61,7 +61,7 @@ body:

    The website itself is open-source and hosted on GitHub, and each page has an "Improve this page" link to edit that page and submit a pull request on GitHub.

    -

    The website is a basic Sculpin static site with a notes content type.

    +

    The website is a basic Sculpin static site with a notes content type.

    There is no styling yet, as I wanted to focus on deploying the MVP version, but I will add some styling and some additional features in the future.

    diff --git a/content/node.59ae3523-9dc9-4b61-8387-aaeb708385e6.yml b/content/node.59ae3523-9dc9-4b61-8387-aaeb708385e6.yml index 211738a20..0b0ccbba5 100644 --- a/content/node.59ae3523-9dc9-4b61-8387-aaeb708385e6.yml +++ b/content/node.59ae3523-9dc9-4b61-8387-aaeb708385e6.yml @@ -49,7 +49,7 @@ body: format: full_html processed: | -

    Whether you prefer strict code or not, use snake-case or camel-case for variable names or how you write your test methods, it is important to be consistent in how code is written.

    +

    Whether you prefer strict code or not, use snake-case or camel-case for variable names or how you write your test methods, it is important to be consistent in how code is written.

    If you're working in a file that uses snake-case variable names, you should do the same and follow the same conventions.

    diff --git a/content/node.59ff61dd-05ce-4ab5-8d8e-ebb88ea4a07e.yml b/content/node.59ff61dd-05ce-4ab5-8d8e-ebb88ea4a07e.yml index d22b8413b..699976ba8 100644 --- a/content/node.59ff61dd-05ce-4ab5-8d8e-ebb88ea4a07e.yml +++ b/content/node.59ff61dd-05ce-4ab5-8d8e-ebb88ea4a07e.yml @@ -52,7 +52,7 @@ body: format: full_html processed: | -

    In yesterday's email, I mentioned using several programming languages and frameworks.

    +

    In yesterday's email, I mentioned using several programming languages and frameworks.

    Drupal is my main specialism and the one I have the most experience and knowledge of, but you don't need to use only Drupal code.

    diff --git a/content/node.5c50152f-4832-4ccc-9751-31c5caeb7cc3.yml b/content/node.5c50152f-4832-4ccc-9751-31c5caeb7cc3.yml index 449c26192..3386484c2 100644 --- a/content/node.5c50152f-4832-4ccc-9751-31c5caeb7cc3.yml +++ b/content/node.5c50152f-4832-4ccc-9751-31c5caeb7cc3.yml @@ -53,7 +53,7 @@ body: format: full_html processed: | -

    All of my software development proposals and services include a bug-free guarantee.

    +

    All of my software development proposals and services include a bug-free guarantee.

    What does that mean?

    diff --git a/content/node.5c687659-3110-4757-b25f-ab28a7190da5.yml b/content/node.5c687659-3110-4757-b25f-ab28a7190da5.yml index 5e995500d..e93aeac38 100644 --- a/content/node.5c687659-3110-4757-b25f-ab28a7190da5.yml +++ b/content/node.5c687659-3110-4757-b25f-ab28a7190da5.yml @@ -64,7 +64,7 @@ body: processed: |

    I've just added the hundredth test to a client project I'm developing.

    -

    I'm following the outside-in approach, starting with functional tests and moving to kernel and unit tests where needed - meaning more functional tests and fewer unit tests - most of which cover some complex search functionality containing custom blocks, forms, endpoints for autocomplete lists, pattern matching and results pages, which is the core functionality of the project.

    +

    I'm following the outside-in approach, starting with functional tests and moving to kernel and unit tests where needed - meaning more functional tests and fewer unit tests - most of which cover some complex search functionality containing custom blocks, forms, endpoints for autocomplete lists, pattern matching and results pages, which is the core functionality of the project.

    Here's the breakdown of the different types of tests:

    diff --git a/content/node.5ca26ec2-4ea4-4d25-96ac-c3998c38c038.yml b/content/node.5ca26ec2-4ea4-4d25-96ac-c3998c38c038.yml index fab6b0932..5c7112727 100644 --- a/content/node.5ca26ec2-4ea4-4d25-96ac-c3998c38c038.yml +++ b/content/node.5ca26ec2-4ea4-4d25-96ac-c3998c38c038.yml @@ -47,13 +47,13 @@ body: format: full_html processed: | -

    Whilst starting to upgrade my automated testing email course to Drupal 11, I needed to update Drush and noticed the output was different.

    +

    Whilst starting to upgrade my automated testing email course to Drupal 11, I needed to update Drush and noticed the output was different.

    People replied to that post, saying Drush was now using Laravel Prompts.

    I've seen the conference talk where Jess Archer unveiled Laravel Prompts at Laracon EU, but wasn't aware it was being used by Drush.

    -

    It's great to see Laravel Prompts being used in other PHP projects, which was one of Jess' main objectives, and the Drupal ecosystem continuing to get off the island.

    +

    It's great to see Laravel Prompts being used in other PHP projects, which was one of Jess' main objectives, and the Drupal ecosystem continuing to get off the island.

    summary: null diff --git a/content/node.5cc109fc-0d43-4d3d-9523-b60e9b27198d.yml b/content/node.5cc109fc-0d43-4d3d-9523-b60e9b27198d.yml index 0cdf4c3fe..d5eb32e98 100644 --- a/content/node.5cc109fc-0d43-4d3d-9523-b60e9b27198d.yml +++ b/content/node.5cc109fc-0d43-4d3d-9523-b60e9b27198d.yml @@ -63,7 +63,7 @@ body:

    Rebuilding Talking Drupal with Tailwind

    -

    Usually when I give a Tailwind CSS talk at a conference or user group, I rebuild something familiar - maybe a page of their website - as an example and to explain some of the concepts and anything that was particularly interesting during the build. (I have a blog post that lists the ones that I've done before).

    +

    Usually when I give a Tailwind CSS talk at a conference or user group, I rebuild something familiar - maybe a page of their website - as an example and to explain some of the concepts and anything that was particularly interesting during the build. (I have a blog post that lists the ones that I've done before).

    After this podcast episode, I built a Tailwind version of the Talking Drupal homepage.

    @@ -73,7 +73,7 @@ body:

    The code repository is publicly viewable on my GitHub profile so people can look at the code and see some of the things that I talked about during the episode in practice and not just the resulting HTML a browser.

    -

    You can listen to the episode, and if you want any more information, the slides and video from my Taking Flight with Tailwind CSS talk are on my website.

    +

    You can listen to the episode, and if you want any more information, the slides and video from my Taking Flight with Tailwind CSS talk are on my website.

    summary: null diff --git a/content/node.5e44dd96-8baf-47dd-9aba-79887e8c3835.yml b/content/node.5e44dd96-8baf-47dd-9aba-79887e8c3835.yml index ae10c9c6a..7232d1b44 100644 --- a/content/node.5e44dd96-8baf-47dd-9aba-79887e8c3835.yml +++ b/content/node.5e44dd96-8baf-47dd-9aba-79887e8c3835.yml @@ -53,7 +53,7 @@ body: format: full_html processed: | -

    I recently received these kind words from Frank Landry, who recently completed my Drupal automated testing email course:

    +

    I recently received these kind words from Frank Landry, who recently completed my Drupal automated testing email course:

    The course was very informative.

    diff --git a/content/node.5e643127-50de-44fa-bd1f-70f69c72ee9f.yml b/content/node.5e643127-50de-44fa-bd1f-70f69c72ee9f.yml index f9425979a..6a02502bd 100644 --- a/content/node.5e643127-50de-44fa-bd1f-70f69c72ee9f.yml +++ b/content/node.5e643127-50de-44fa-bd1f-70f69c72ee9f.yml @@ -61,7 +61,7 @@ body:

    If you’re familiar with Drupal, you will have learned its language. You will be familiar with words like Views, Blocks and Paragraphs, and you will appreciate their respective features and functions. But for those new to Drupal, getting to grips with what words mean can mean a steep learning curve.

    -

    Drupalisms is something I've discussed on a few episodes of Beyond Blocks, including the most recent episode and the seonc with Eirik Morland.

    +

    Drupalisms is something I've discussed on a few episodes of Beyond Blocks, including the most recent episode and the seonc with Eirik Morland.

    I didn't realise there were BoF sessions about this at DrupalCon Lille last year, so I'm hoping there will be more next week in Barcelona.

    diff --git a/content/node.5e8f1843-5372-46c1-bb61-0ff493ca22ae.yml b/content/node.5e8f1843-5372-46c1-bb61-0ff493ca22ae.yml index 12c9cd8f0..82242b855 100644 --- a/content/node.5e8f1843-5372-46c1-bb61-0ff493ca22ae.yml +++ b/content/node.5e8f1843-5372-46c1-bb61-0ff493ca22ae.yml @@ -57,7 +57,7 @@ body:

    There's the inaugural DrupalCamp England in Cambridge in March that I'm planning to attend, and the Global Contribution Day event in London (and everywhere else).

    -

    I'm looking forward to the upcoming episodes of the Beyond Blocks podcast and finding time for more open source contributions and coding live streams again.

    +

    I'm looking forward to the upcoming episodes of the Beyond Blocks podcast and finding time for more open source contributions and coding live streams again.

    This is daily email #714, which means I'll get to 1,000 emails in October - which will be a huge milestone!

    diff --git a/content/node.6026652e-2f3a-492c-b1b2-e5a1ef8ceee6.yml b/content/node.6026652e-2f3a-492c-b1b2-e5a1ef8ceee6.yml index 016e379a7..105de592c 100644 --- a/content/node.6026652e-2f3a-492c-b1b2-e5a1ef8ceee6.yml +++ b/content/node.6026652e-2f3a-492c-b1b2-e5a1ef8ceee6.yml @@ -53,7 +53,7 @@ body:

    But, with recent native browser support added for some Sass features, such as CSS nesting and CSS custom properties (variables), people are considering moving from Sass to regular CSS.

    -

    Using regular CSS also makes it easier to onboard new Developers onto your project, which is particularly helpful in open-source projects, as Mark Conroy and I discussed on the Beyond Blocks podcast.

    +

    Using regular CSS also makes it easier to onboard new Developers onto your project, which is particularly helpful in open-source projects, as Mark Conroy and I discussed on the Beyond Blocks podcast.

    summary: null diff --git a/content/node.60d29f19-7871-4b8e-a2e5-3bf7edf17c00.yml b/content/node.60d29f19-7871-4b8e-a2e5-3bf7edf17c00.yml index 2bc4a6beb..67bfb2648 100644 --- a/content/node.60d29f19-7871-4b8e-a2e5-3bf7edf17c00.yml +++ b/content/node.60d29f19-7871-4b8e-a2e5-3bf7edf17c00.yml @@ -53,7 +53,7 @@ body: format: full_html processed: | -

    Continuing from my last few emails, as well as adding the new use case more easily and quicker, having automated tests also saved me from adding a regression into the code I was changing.

    +

    Continuing from my last few emails, as well as adding the new use case more easily and quicker, having automated tests also saved me from adding a regression into the code I was changing.

    I'd written a condition in the query to ensure only results that started with the search term.

    diff --git a/content/node.6118e44d-7b4b-465e-9e7d-d2268a2e2505.yml b/content/node.6118e44d-7b4b-465e-9e7d-d2268a2e2505.yml index 41e26ed42..0dfaf80ba 100644 --- a/content/node.6118e44d-7b4b-465e-9e7d-d2268a2e2505.yml +++ b/content/node.6118e44d-7b4b-465e-9e7d-d2268a2e2505.yml @@ -49,7 +49,7 @@ body: processed: |

    In the last Beyond Blocks podcast of 2024, I caught up with Mark Conroy to discuss open source sustainability and sponsorship, different ways to charge for development services and setting up your own agency.

    -

    Listen to the episode now.

    +

    Listen to the episode now.

    It was great to speak with Mark again, and I'm looking forward to speaking with the guests I have lined up to be on the podcast soon.

    diff --git a/content/node.614cb089-7e70-46ab-9f5f-dd08b529f3d0.yml b/content/node.614cb089-7e70-46ab-9f5f-dd08b529f3d0.yml index e76c9bc0a..0aa1af91c 100644 --- a/content/node.614cb089-7e70-46ab-9f5f-dd08b529f3d0.yml +++ b/content/node.614cb089-7e70-46ab-9f5f-dd08b529f3d0.yml @@ -63,7 +63,7 @@ body:

    I'm still on the fence about AI and when and how it should be used.

    -

    My experiences of using AI so far haven't been great, but I have seen some interesting implementation and use-cases for it.

    +

    My experiences of using AI so far haven't been great, but I have seen some interesting implementation and use-cases for it.

    I'm seeing AI being added everywhere - from my search results to suggesting social media comments and generating notes and issues within services I use.

    diff --git a/content/node.624faf57-efdb-444b-85b7-fbb680ed2b73.yml b/content/node.624faf57-efdb-444b-85b7-fbb680ed2b73.yml index 207bc3e09..04172db0b 100644 --- a/content/node.624faf57-efdb-444b-85b7-fbb680ed2b73.yml +++ b/content/node.624faf57-efdb-444b-85b7-fbb680ed2b73.yml @@ -78,7 +78,7 @@ body: processed: |

    This week on Beyond Blocks, I'mj oined by Ryan Szrama, CEO of Centarro, to discuss Drupal Commerce, Commerce Kickstart, Mario Kart and the dreaded cache_form table.

    -

    Listen to the episode now.

    +

    Listen to the episode now.

    Key points

    diff --git a/content/node.63d82a82-4f85-440b-85d6-8c6a0cd0b5d9.yml b/content/node.63d82a82-4f85-440b-85d6-8c6a0cd0b5d9.yml index 094b7263f..8792b17ec 100644 --- a/content/node.63d82a82-4f85-440b-85d6-8c6a0cd0b5d9.yml +++ b/content/node.63d82a82-4f85-440b-85d6-8c6a0cd0b5d9.yml @@ -53,7 +53,7 @@ body: format: full_html processed: | -

    Sometimes when tidying my commits or updating a local branch with remote changes, the order of commits changes - making them out of order in when running git log.

    +

    Sometimes when tidying my commits or updating a local branch with remote changes, the order of commits changes - making them out of order in when running git log.

    I want the commits in the log to be in the correct sequential order.

    diff --git a/content/node.65ad8d2c-a07d-4dbb-896d-0a3a66c0fe65.yml b/content/node.65ad8d2c-a07d-4dbb-896d-0a3a66c0fe65.yml index abe453831..16eedd618 100644 --- a/content/node.65ad8d2c-a07d-4dbb-896d-0a3a66c0fe65.yml +++ b/content/node.65ad8d2c-a07d-4dbb-896d-0a3a66c0fe65.yml @@ -51,7 +51,7 @@ body: format: full_html processed: | -

    As well as committing build artifacts, another common use for CI pipelines is for running automated checks.

    +

    As well as committing build artifacts, another common use for CI pipelines is for running automated checks.

    This could include code linting, static analysis, automated tests, checking for security vulnerabilities, and more.

    diff --git a/content/node.66485e91-b88c-4a7c-8472-e593b8496e82.yml b/content/node.66485e91-b88c-4a7c-8472-e593b8496e82.yml index ec804b38b..629b1621d 100644 --- a/content/node.66485e91-b88c-4a7c-8472-e593b8496e82.yml +++ b/content/node.66485e91-b88c-4a7c-8472-e593b8496e82.yml @@ -54,7 +54,7 @@ body:

    In this episode, Niklas and I discussed his first experience of DrupalCon, presenting a session on contribution for non-technical Drupalers, the German Drupal community, what the Splash Awards are and how to organise your own event.

    -

    Listen to the episode now.

    +

    Listen to the episode now.

    summary: null diff --git a/content/node.667d02f9-f672-4a0c-a9cd-e8111ed1d8bd.yml b/content/node.667d02f9-f672-4a0c-a9cd-e8111ed1d8bd.yml index 887a74770..70101ea3b 100644 --- a/content/node.667d02f9-f672-4a0c-a9cd-e8111ed1d8bd.yml +++ b/content/node.667d02f9-f672-4a0c-a9cd-e8111ed1d8bd.yml @@ -51,7 +51,7 @@ body: format: full_html processed: | -

    In yesterday's email, I mentioned my recent "minimum viable feature flag" tweet and that I think feature flags should be short-lived.

    +

    In yesterday's email, I mentioned my recent "minimum viable feature flag" tweet and that I think feature flags should be short-lived.

    But how do you know when a feature flag should be removed?

    diff --git a/content/node.67695589-8db1-45fd-9940-3295330f55cc.yml b/content/node.67695589-8db1-45fd-9940-3295330f55cc.yml index 30f47cd5b..d026b1c3d 100644 --- a/content/node.67695589-8db1-45fd-9940-3295330f55cc.yml +++ b/content/node.67695589-8db1-45fd-9940-3295330f55cc.yml @@ -37,6 +37,6 @@ path: body: - value: '

    If you''re working on a feature branch, or a temporary branch for pair or mob programming, what do you do if you accidentally commit a change to the wrong branch?

    Do you reset your changes, switch to the correct branch and re-create the same changes manually?

    You don''t need to.

    Git has a solution for this.

    Create the commit as you would on the correct branch and copy the commit SHA.

    Use git checkout or git switch to move to the correct branch and use git cherry-pick with the commit SHA.

    It will pluck the commit from the branch and re-apply the changes with the same commit message.

    Then, if you merge or rebase your temporary branch, Git will know the change has already been applied and skip that commit.

    No need to re-do the same changes again manually.

    ' format: basic_html - processed: '

    If you''re working on a feature branch, or a temporary branch for pair or mob programming, what do you do if you accidentally commit a change to the wrong branch?

    Do you reset your changes, switch to the correct branch and re-create the same changes manually?

    You don''t need to.

    Git has a solution for this.

    Create the commit as you would on the correct branch and copy the commit SHA.

    Use git checkout or git switch to move to the correct branch and use git cherry-pick with the commit SHA.

    It will pluck the commit from the branch and re-apply the changes with the same commit message.

    Then, if you merge or rebase your temporary branch, Git will know the change has already been applied and skip that commit.

    No need to re-do the same changes again manually.

    ' + processed: '

    If you''re working on a feature branch, or a temporary branch for pair or mob programming, what do you do if you accidentally commit a change to the wrong branch?

    Do you reset your changes, switch to the correct branch and re-create the same changes manually?

    You don''t need to.

    Git has a solution for this.

    Create the commit as you would on the correct branch and copy the commit SHA.

    Use git checkout or git switch to move to the correct branch and use git cherry-pick with the commit SHA.

    It will pluck the commit from the branch and re-apply the changes with the same commit message.

    Then, if you merge or rebase your temporary branch, Git will know the change has already been applied and skip that commit.

    No need to re-do the same changes again manually.

    ' summary: '' field_daily_email_cta: { } diff --git a/content/node.681c802d-45a6-409e-8dd1-3499184f7616.yml b/content/node.681c802d-45a6-409e-8dd1-3499184f7616.yml index dbf492c51..85a7f8b3a 100644 --- a/content/node.681c802d-45a6-409e-8dd1-3499184f7616.yml +++ b/content/node.681c802d-45a6-409e-8dd1-3499184f7616.yml @@ -77,7 +77,7 @@ body:

    This approach is based on the UNIX philosophy of a program doing one thing well, and chaining programs together when needed to solve a larger problem.

    -

    Then, if you need, you can extend the code in a custom module or add features by applying patches.

    +

    Then, if you need, you can extend the code in a custom module or add features by applying patches.

    summary: null diff --git a/content/node.6b13d2f6-78fe-4bd6-bbce-5592cb2ce9e1.yml b/content/node.6b13d2f6-78fe-4bd6-bbce-5592cb2ce9e1.yml index 7f9da4ef6..cac3b54dc 100644 --- a/content/node.6b13d2f6-78fe-4bd6-bbce-5592cb2ce9e1.yml +++ b/content/node.6b13d2f6-78fe-4bd6-bbce-5592cb2ce9e1.yml @@ -83,7 +83,7 @@ body: format: full_html processed: | -

    As well as being introduced to Astro in Simon's most recent Pro Tailwind workshop, something else that we discussed was implicit vs explicit coding, and coding defensively.

    +

    As well as being introduced to Astro in Simon's most recent Pro Tailwind workshop, something else that we discussed was implicit vs explicit coding, and coding defensively.

    For example, if you had this code:

    diff --git a/content/node.6c69f289-ca43-4731-9729-0341250e0591.yml b/content/node.6c69f289-ca43-4731-9729-0341250e0591.yml index 36d7f547e..72d39cf9e 100644 --- a/content/node.6c69f289-ca43-4731-9729-0341250e0591.yml +++ b/content/node.6c69f289-ca43-4731-9729-0341250e0591.yml @@ -77,7 +77,7 @@ body:

    I use Docker and Docker Compose on Linux, so there are slight changes compared to running PHP natively, so I wanted to make sure it still works.

    -

    I've added my latest setup to my Drupal Docker Example repository and plan to add it to my standard Build Configs setup for Drupal projects.

    +

    I've added my latest setup to my Drupal Docker Example repository and plan to add it to my standard Build Configs setup for Drupal projects.

    If you use Docker Compose on Linux, it may be useful for you.

    diff --git a/content/node.6cc053d6-5012-4cc7-81e8-43768a0886be.yml b/content/node.6cc053d6-5012-4cc7-81e8-43768a0886be.yml index c02502b8e..17347de97 100644 --- a/content/node.6cc053d6-5012-4cc7-81e8-43768a0886be.yml +++ b/content/node.6cc053d6-5012-4cc7-81e8-43768a0886be.yml @@ -53,7 +53,7 @@ body:

    Automated testing and test-driven development were game changers for me and enabled me to deliver better projects.

    -

    If you'd like to take the course and learn how to do automated testing in Drupal, you can register for free and get them direct to your inbox.

    +

    If you'd like to take the course and learn how to do automated testing in Drupal, you can register for free and get them direct to your inbox.

    summary: null diff --git a/content/node.6ccfb609-6371-462c-b91c-4aa22d23d248.yml b/content/node.6ccfb609-6371-462c-b91c-4aa22d23d248.yml index 9826c06e5..eadbe31e6 100644 --- a/content/node.6ccfb609-6371-462c-b91c-4aa22d23d248.yml +++ b/content/node.6ccfb609-6371-462c-b91c-4aa22d23d248.yml @@ -85,7 +85,7 @@ body: format: full_html processed: | -

    Yesterday, I wrote about Nix the package manager.

    +

    Yesterday, I wrote about Nix the package manager.

    To use it, you need to write code in the Nix language in .nix files.

    @@ -116,7 +116,7 @@ body: }
    -

    And this is how to configure processes in a devenv configuration, which is built with Nix:

    +

    And this is how to configure processes in a devenv configuration, which is built with Nix:

    processes = {
             tailwind.exec = ''
    diff --git a/content/node.6cecf88f-e9d9-4954-b64e-00246781b591.yml b/content/node.6cecf88f-e9d9-4954-b64e-00246781b591.yml
    index a4590423d..66dc4db38 100644
    --- a/content/node.6cecf88f-e9d9-4954-b64e-00246781b591.yml
    +++ b/content/node.6cecf88f-e9d9-4954-b64e-00246781b591.yml
    @@ -60,7 +60,7 @@ body:
     
           

    Having a set of standardised and configurable templates makes it much easier and quicker to start a new project, which I did when creating a Drupal Commerce Kickstart example at DrupalCon.

    -

    The slides are already online and I've created an example video where I go from nothing to a ready-to-work-on Drupal website in less than a minute!

    +

    The slides are already online and I've created an example video where I go from nothing to a ready-to-work-on Drupal website in less than a minute!

    If you have any questions, hit reply and let me know!

    diff --git a/content/node.6eeb79ee-eae2-41ea-ab7e-56f216daf636.yml b/content/node.6eeb79ee-eae2-41ea-ab7e-56f216daf636.yml index c94ddb07d..a30056ccc 100644 --- a/content/node.6eeb79ee-eae2-41ea-ab7e-56f216daf636.yml +++ b/content/node.6eeb79ee-eae2-41ea-ab7e-56f216daf636.yml @@ -55,7 +55,7 @@ body: format: full_html processed: | -

    Yesterday, I said not to use custom shell aliases and functions during presentations and group programming sessions to avoid confusion.

    +

    Yesterday, I said not to use custom shell aliases and functions during presentations and group programming sessions to avoid confusion.

    I use aliases, but they expand after I type them, the same as as snippet in an IDE or text editor.

    diff --git a/content/node.6fb0a429-0264-4308-9436-f1115d5b108b.yml b/content/node.6fb0a429-0264-4308-9436-f1115d5b108b.yml index 9f213d032..42f9110c3 100644 --- a/content/node.6fb0a429-0264-4308-9436-f1115d5b108b.yml +++ b/content/node.6fb0a429-0264-4308-9436-f1115d5b108b.yml @@ -87,7 +87,7 @@ body:

    I wanted to change this so each event would have links to its own slides, example code or demo.

    -

    I didn't want to change this yet for all presentations, only my Sculpin talk as it's the most recent and, if I like it, later apply it to the others.

    +

    I didn't want to change this yet for all presentations, only my Sculpin talk as it's the most recent and, if I like it, later apply it to the others.

    My website is built with Sculpin, so adding a feature flag was as simple as adding new: true to the YAML front matter at the top of the file for that presentation.

    diff --git a/content/node.6fe4adb6-aae8-4a74-ba6b-9bdcd58b05b5.yml b/content/node.6fe4adb6-aae8-4a74-ba6b-9bdcd58b05b5.yml index e2793c3f1..6a167272d 100644 --- a/content/node.6fe4adb6-aae8-4a74-ba6b-9bdcd58b05b5.yml +++ b/content/node.6fe4adb6-aae8-4a74-ba6b-9bdcd58b05b5.yml @@ -48,7 +48,7 @@ body: format: full_html processed: | -

    Previously when I gave my Taking Flight with Tailwind CSS talk, I created examples that relate to the event such as something related to that technology or event.

    +

    Previously when I gave my Taking Flight with Tailwind CSS talk, I created examples that relate to the event such as something related to that technology or event.

    The nor(DEV):con website already uses Tailwind CSS so I've been looking for other examples and have started to build some of the Bootstrap CSS components with Tailwind CSS.

    diff --git a/content/node.7064860b-42de-47c3-b5ac-3560d941fe0f.yml b/content/node.7064860b-42de-47c3-b5ac-3560d941fe0f.yml index daaf9beb6..a8e000db6 100644 --- a/content/node.7064860b-42de-47c3-b5ac-3560d941fe0f.yml +++ b/content/node.7064860b-42de-47c3-b5ac-3560d941fe0f.yml @@ -107,7 +107,7 @@ body: format: full_html processed: | -

    Today, whilst working on Versa, I was experimenting with different PHPStan levels.

    +

    Today, whilst working on Versa, I was experimenting with different PHPStan levels.

    Level 1 is the least strict level, and applies the fewest rules and returns the fewest results.

    diff --git a/content/node.70c71a01-1c5a-4b25-8706-d02a4284662e.yml b/content/node.70c71a01-1c5a-4b25-8706-d02a4284662e.yml index 22f0ce6e2..5e30cd851 100644 --- a/content/node.70c71a01-1c5a-4b25-8706-d02a4284662e.yml +++ b/content/node.70c71a01-1c5a-4b25-8706-d02a4284662e.yml @@ -129,7 +129,7 @@ body:

    This is a great example of how the PHP language continues to evolve and improve, and it's been a great way to make it easier to keep my code clean and with fewer bugs.

    -

    If you want a way to easily add readonly to properties or classes, take a look at Rector which can automate it for you.

    +

    If you want a way to easily add readonly to properties or classes, take a look at Rector which can automate it for you.

    summary: null diff --git a/content/node.7210b16f-71c2-44c4-9dc1-4264b243c618.yml b/content/node.7210b16f-71c2-44c4-9dc1-4264b243c618.yml index 0bb234892..3a0612ae8 100644 --- a/content/node.7210b16f-71c2-44c4-9dc1-4264b243c618.yml +++ b/content/node.7210b16f-71c2-44c4-9dc1-4264b243c618.yml @@ -80,7 +80,7 @@ body: format: full_html processed: | -

    Yesterday I showed how I'm using Nix to build my presentation slide decks with rst2pdf.

    +

    Yesterday I showed how I'm using Nix to build my presentation slide decks with rst2pdf.

    This allows me to run a simple command like nix build .#test-driven-drupal to build the slides for the given presentation.

    diff --git a/content/node.72aabaae-bf82-419b-a217-3b563126d9a9.yml b/content/node.72aabaae-bf82-419b-a217-3b563126d9a9.yml index 958b47eb4..d63a13796 100644 --- a/content/node.72aabaae-bf82-419b-a217-3b563126d9a9.yml +++ b/content/node.72aabaae-bf82-419b-a217-3b563126d9a9.yml @@ -37,6 +37,6 @@ path: body: - value: "

    Writing good commit messages is important.

    A good commit message doesn't just describe what changed, it captures why it was changed.

    It can detail other approaches that were considered or tried before deciding on the end solution.

    It can contain links to relevant issues, documentation pages, blog posts or videos.

    It can document any manual deployment steps, or follow-up actions that will be addressed in future commits.

    This all makes sense for permanent commits.

    But, sometimes you may make a temporary commit that won't always remain in the codebase.

    For example, if you're working in a pair or mob programming session, you want to be able to switch drivers as quickly and seamlessly as possible.

    In that situation, you just need a basic commit message to share the latest changes, so a quick wip commit is fine and it can be amended later.

    " format: full_html - processed: "

    Writing good commit messages is important.

    A good commit message doesn't just describe what changed, it captures why it was changed.

    It can detail other approaches that were considered or tried before deciding on the end solution.

    It can contain links to relevant issues, documentation pages, blog posts or videos.

    It can document any manual deployment steps, or follow-up actions that will be addressed in future commits.

    This all makes sense for permanent commits.

    But, sometimes you may make a temporary commit that won't always remain in the codebase.

    For example, if you're working in a pair or mob programming session, you want to be able to switch drivers as quickly and seamlessly as possible.

    In that situation, you just need a basic commit message to share the latest changes, so a quick wip commit is fine and it can be amended later.

    " + processed: "

    Writing good commit messages is important.

    A good commit message doesn't just describe what changed, it captures why it was changed.

    It can detail other approaches that were considered or tried before deciding on the end solution.

    It can contain links to relevant issues, documentation pages, blog posts or videos.

    It can document any manual deployment steps, or follow-up actions that will be addressed in future commits.

    This all makes sense for permanent commits.

    But, sometimes you may make a temporary commit that won't always remain in the codebase.

    For example, if you're working in a pair or mob programming session, you want to be able to switch drivers as quickly and seamlessly as possible.

    In that situation, you just need a basic commit message to share the latest changes, so a quick wip commit is fine and it can be amended later.

    " summary: '' field_daily_email_cta: { } diff --git a/content/node.731a0026-d287-452b-96d7-aeaa3f4bec48.yml b/content/node.731a0026-d287-452b-96d7-aeaa3f4bec48.yml index 17c14a6c7..63650bfb7 100644 --- a/content/node.731a0026-d287-452b-96d7-aeaa3f4bec48.yml +++ b/content/node.731a0026-d287-452b-96d7-aeaa3f4bec48.yml @@ -67,7 +67,7 @@ body:

    We are the home of quality software such as dwm, dmenu, st and plenty of other tools, with a focus on simplicity, clarity and frugality. Our philosophy is about keeping things simple, minimal and usable. We believe this should become the mainstream philosophy in the IT sector. Unfortunately, the tendency for complex, error-prone and slow software seems to be prevalent in the present-day software industry. We intend to prove the opposite with our software projects.

    -

    I've previously wondered what would be included in future versions of Drupal or Drupal CMS after usually needing to install the same modules on every new project.

    +

    I've previously wondered what would be included in future versions of Drupal or Drupal CMS after usually needing to install the same modules on every new project.

    But I was recently wondering what if more was removed from Drupal?

    diff --git a/content/node.736063cc-b727-46f4-9a12-3b344d919614.yml b/content/node.736063cc-b727-46f4-9a12-3b344d919614.yml index 2185ea33b..acb40f6c6 100644 --- a/content/node.736063cc-b727-46f4-9a12-3b344d919614.yml +++ b/content/node.736063cc-b727-46f4-9a12-3b344d919614.yml @@ -77,7 +77,7 @@ body:

    He gave several helpful mentoring sessions with our front end developer to support us to build this approach into our site.

    Open source sponsorship

    -

    Alternatively, if you want to increase your Drupal contribution, you can sponsor me to contribute on your behalf.

    +

    Alternatively, if you want to increase your Drupal contribution, you can sponsor me to contribute on your behalf.

    I'm a Drupal core contributor and maintain the Override Node Options module, Tailwind CSS starter kit theme and other smaller projects.

    You'll be mentioned on any relevant blog posts, live streams, issues and merge requests, and the contribution credits will be counted for your organisation on Drupal.org.

    Last updated: July 2025

    diff --git a/content/node.73a5b2aa-74a8-4fe1-878f-9f264b1c32c3.yml b/content/node.73a5b2aa-74a8-4fe1-878f-9f264b1c32c3.yml index b57d0dad2..c0e4751da 100644 --- a/content/node.73a5b2aa-74a8-4fe1-878f-9f264b1c32c3.yml +++ b/content/node.73a5b2aa-74a8-4fe1-878f-9f264b1c32c3.yml @@ -53,13 +53,13 @@ body: format: full_html processed: | -

    This week, I released the most recent episode of the Beyond Blocks podcast.

    +

    This week, I released the most recent episode of the Beyond Blocks podcast.

    My guest this week is Jochen Lillich - the Monospace Mentor, aka geewiz.

    Jochen and I discuss content creation, live streaming on Twitch and YouTube, infrastructure automation, Linux, mentoring and, of course, mechanical keyboards.

    -

    Listen to the episode now.

    +

    Listen to the episode now.

    I've been a fan of Jochen's content and Twitch streams for a long time, and it was great to meet him at DrupalCon Lille and have him on the podcast.

    diff --git a/content/node.73c4c40c-d5c3-462a-aba2-7ed0eb7fc1dc.yml b/content/node.73c4c40c-d5c3-462a-aba2-7ed0eb7fc1dc.yml index 696989db5..52f9add71 100644 --- a/content/node.73c4c40c-d5c3-462a-aba2-7ed0eb7fc1dc.yml +++ b/content/node.73c4c40c-d5c3-462a-aba2-7ed0eb7fc1dc.yml @@ -64,7 +64,7 @@ body:

    I've been a DDEV user, and I've also used most, if not all, of the other popular Drupal development environments.

    -

    These days, I use my own Docker Compose-based setup, but I feel having an official development environment would be an excellent move for the Drupal community and project - and for new Drupal users, evaluators and contributors in particular.

    +

    These days, I use my own Docker Compose-based setup, but I feel having an official development environment would be an excellent move for the Drupal community and project - and for new Drupal users, evaluators and contributors in particular.

    Anything that lowers the barrier to using or contributing to Drupal is a good thing and allows for more focused documentation and a simpler onboarding experience, similar to what other projects have - such as Laravel with Homestead, Valet and now, Sail.

    diff --git a/content/node.73dc2ac9-5e4c-4a24-984f-e6d04998323b.yml b/content/node.73dc2ac9-5e4c-4a24-984f-e6d04998323b.yml index 021847d28..cec81ef96 100644 --- a/content/node.73dc2ac9-5e4c-4a24-984f-e6d04998323b.yml +++ b/content/node.73dc2ac9-5e4c-4a24-984f-e6d04998323b.yml @@ -62,13 +62,13 @@ body: [3]: https://github.com/nix-community/nixvim format: markdown processed: | -

    I've been a full-time Neovim user since July 2021.

    +

    I've been a full-time Neovim user since July 2021.

    I've used Nix since September 2022, when I migrated my dotfiles from using Ansible to use Nix and Home Manager.

    My Neovim configuration has gone through several iterations to what it is today.

    I've used Nix for a while to install plugins for Neovim, but the configuration was all written in Lua files which were placed by Home Manager into the correct directory.

    Now, I've switched to using a project called NixVim.

    It enables configuring Neovim using the Nix language, which is converted to Lua code behind the scenes.

    -

    Doing this makes my configuration files more consistent and easier to maintain, and reduced the amount of code I needed for my Neovim configuration.

    +

    Doing this makes my configuration files more consistent and easier to maintain, and reduced the amount of code I needed for my Neovim configuration.

    Most of the configuration in Nix is equivalent to the options in Lua, but there are some great settings like plugins.lsp.enable and plugins.cmp.enable that make it easy to configure language servers and completion.

    I've also found a great episode about this on the Full Time Nix podcast that I'd recommend to find out more.

    If you're interested in Nix and/or Neovim, give NixVim a look.

    diff --git a/content/node.74447b1a-33da-45b7-aa4b-a35e2afb6803.yml b/content/node.74447b1a-33da-45b7-aa4b-a35e2afb6803.yml index fe372e01e..2e9b7a217 100644 --- a/content/node.74447b1a-33da-45b7-aa4b-a35e2afb6803.yml +++ b/content/node.74447b1a-33da-45b7-aa4b-a35e2afb6803.yml @@ -51,7 +51,7 @@ body: format: full_html processed: | -

    If you're working on a team or project that uses pull or merge requests, then writing commit messages with detailed descriptions using the message body and not just the subject line, will result in better pull requests.

    +

    If you're working on a team or project that uses pull or merge requests, then writing commit messages with detailed descriptions using the message body and not just the subject line, will result in better pull requests.

    Whatever text you put in the message body will be used as the description for your pull or merge request, as well as the subject line being used for the title.

    @@ -59,9 +59,9 @@ body:

    Pull or merge requests with more information and detail are more likely to be accepted and merged.

    -

    The text will also remain in the pull or merge request, even if someone squashes your commits and deletes the old messages.

    +

    The text will also remain in the pull or merge request, even if someone squashes your commits and deletes the old messages.

    -

    The issue then is, what if you move to a different Git hosting service?

    +

    The issue then is, what if you move to a different Git hosting service?

    summary: null diff --git a/content/node.74b360bb-61b3-4ed4-8942-1c21bdf630ef.yml b/content/node.74b360bb-61b3-4ed4-8942-1c21bdf630ef.yml index 75785c87e..455be0e9c 100644 --- a/content/node.74b360bb-61b3-4ed4-8942-1c21bdf630ef.yml +++ b/content/node.74b360bb-61b3-4ed4-8942-1c21bdf630ef.yml @@ -59,7 +59,7 @@ body:

    The time I spent writing the messages was wasted, and the information was lost.

    -

    I'd rather keep the original commits intact but, if you need to squash commits, please don't remove the previous messages as they could be useful in the future.

    +

    I'd rather keep the original commits intact but, if you need to squash commits, please don't remove the previous messages as they could be useful in the future.

    People can see the changes by viewing the commits, but the information within the commit messages are valuable, too.

    diff --git a/content/node.75787d98-31be-4b33-a434-15d5a43c07af.yml b/content/node.75787d98-31be-4b33-a434-15d5a43c07af.yml index 5970a7322..c604a8c9b 100644 --- a/content/node.75787d98-31be-4b33-a434-15d5a43c07af.yml +++ b/content/node.75787d98-31be-4b33-a434-15d5a43c07af.yml @@ -57,7 +57,7 @@ body: format: full_html processed: | -

    Static websites can be created by writing each file by hand or using a tool like a static site generator.

    +

    Static websites can be created by writing each file by hand or using a tool like a static site generator.

    But what if you've already got a dynamic website that you no longer need to be editable?

    @@ -65,9 +65,9 @@ body:

    If you no longer need to update the content via the admin UI, you could archive it by converting it to a static website.

    -

    Then you no longer need to maintain and update it, and simplify your hosting environment.

    +

    Then you no longer need to maintain and update it, and simplify your hosting environment.

    -

    You could use Tome, a static site generator for Drupal, or use command line tools like wget with options like --mirror to create a static version by crawling a live website.

    +

    You could use Tome, a static site generator for Drupal, or use command line tools like wget with options like --mirror to create a static version by crawling a live website.

    There are a few options on Drupal.org, which will also work with other CMSes and frameworks.

    diff --git a/content/node.759bb289-07cd-4103-bc90-107b7f13978d.yml b/content/node.759bb289-07cd-4103-bc90-107b7f13978d.yml index 199bdd46b..3a721255d 100644 --- a/content/node.759bb289-07cd-4103-bc90-107b7f13978d.yml +++ b/content/node.759bb289-07cd-4103-bc90-107b7f13978d.yml @@ -55,7 +55,7 @@ body: format: full_html processed: | -

    In yesterday's email, I mentioned some of the recent issues I've seen from AI tools.

    +

    In yesterday's email, I mentioned some of the recent issues I've seen from AI tools.

    I'm wary of any code generated by AI, as I've often found it to be incorrect.

    diff --git a/content/node.75f502ee-38a8-45af-b4a4-c5abd82a4082.yml b/content/node.75f502ee-38a8-45af-b4a4-c5abd82a4082.yml index 7a259865b..bf0a71bd6 100644 --- a/content/node.75f502ee-38a8-45af-b4a4-c5abd82a4082.yml +++ b/content/node.75f502ee-38a8-45af-b4a4-c5abd82a4082.yml @@ -111,6 +111,6 @@ body: }

    With this, to get the events for any presentation, I can do something like $presentation->getEvents() and this code will be used.

    I use the same approach in my podcast module. The code for my website is public if you want to see other examples of how I'm using this approach.

    -

    P.S. If you have questions about how to use this approach or other ways to improve your Drupal code, book a one-on-one consulting call with me and I'll help you get started.

    +

    P.S. If you have questions about how to use this approach or other ways to improve your Drupal code, book a one-on-one consulting call with me and I'll help you get started.

    summary: '' field_daily_email_cta: { } diff --git a/content/node.77377a19-7488-40de-a041-f488b3ae597c.yml b/content/node.77377a19-7488-40de-a041-f488b3ae597c.yml index 9a3a0b1bb..a7d5b821a 100644 --- a/content/node.77377a19-7488-40de-a041-f488b3ae597c.yml +++ b/content/node.77377a19-7488-40de-a041-f488b3ae597c.yml @@ -55,7 +55,7 @@ body:

    Since then, I've done great things with Drupal and met many great people at different events.

    -

    I've even started to interview some of them on my podcast.

    +

    I've even started to interview some of them on my podcast.

    Here's to the next 16 years, and I'm very excited so see where Drupal and PHP go.

    diff --git a/content/node.781bcd5b-be77-4514-bffc-aa56d829aaff.yml b/content/node.781bcd5b-be77-4514-bffc-aa56d829aaff.yml index a98f5c582..6fb9c434f 100644 --- a/content/node.781bcd5b-be77-4514-bffc-aa56d829aaff.yml +++ b/content/node.781bcd5b-be77-4514-bffc-aa56d829aaff.yml @@ -56,7 +56,7 @@ body: format: full_html processed: | -

    In a previous email, I wrote about commented-out code and whether it should remain in a codebase - especially if it's version controlled and there's a commit log of all changes.

    +

    In a previous email, I wrote about commented-out code and whether it should remain in a codebase - especially if it's version controlled and there's a commit log of all changes.

    But what about TODO comments that remind you to do something?

    diff --git a/content/node.78b682e0-a3be-4e49-990b-8fcc7083f6ca.yml b/content/node.78b682e0-a3be-4e49-990b-8fcc7083f6ca.yml index 07d492fd3..9a5692540 100644 --- a/content/node.78b682e0-a3be-4e49-990b-8fcc7083f6ca.yml +++ b/content/node.78b682e0-a3be-4e49-990b-8fcc7083f6ca.yml @@ -79,13 +79,13 @@ body:

    You should uncommit the changes and use git add -p to create a more focused commit.

    -

    This is why I don't squash commits.

    +

    This is why I don't squash commits.

    If people have made an effort to create good commits with good commit messages, I don't want them to be lost when the commits are merged.

    I want to keep the history of the changes intact and as it originally was.

    -

    I do sometimes need to tidy up my own commits, though, before I push them for anyone else to see.

    +

    I do sometimes need to tidy up my own commits, though, before I push them for anyone else to see.

    summary: null diff --git a/content/node.792953b8-b5f7-44dc-8e32-d70629bf06a4.yml b/content/node.792953b8-b5f7-44dc-8e32-d70629bf06a4.yml index 2f141971c..a8661821f 100644 --- a/content/node.792953b8-b5f7-44dc-8e32-d70629bf06a4.yml +++ b/content/node.792953b8-b5f7-44dc-8e32-d70629bf06a4.yml @@ -51,7 +51,7 @@ body: format: full_html processed: | -

    As well as having less code than you started with, another good type of change is one where there are tests accompanying the production code.

    +

    As well as having less code than you started with, another good type of change is one where there are tests accompanying the production code.

    Whether the tests were written after the code or before with a test-driven development approach, the main thing is that there are tests when the code is committed.

    diff --git a/content/node.7987b079-7f85-4303-ab3c-1338dbeaf171.yml b/content/node.7987b079-7f85-4303-ab3c-1338dbeaf171.yml index 9e91c9b78..a99d5281d 100644 --- a/content/node.7987b079-7f85-4303-ab3c-1338dbeaf171.yml +++ b/content/node.7987b079-7f85-4303-ab3c-1338dbeaf171.yml @@ -53,7 +53,7 @@ body: format: full_html processed: | -

    This week, I gave my Test Driven Drupal talk to the Drupal London user group.

    +

    This week, I gave my Test Driven Drupal talk to the Drupal London user group.

    The majority of the talk was the same as in previous versions, but I decided to live code the demo section this time instead of demonstrating with slides.

    @@ -65,7 +65,7 @@ body:

    When done well, I think live coding can be very impactful when it's done well.

    -

    It's something I want to get better at, and I plan to do more YouTube streams soon, such as refreshing my automated testing email course with some new examples, so subscribe on YouTube if you want to know when I next go live.

    +

    It's something I want to get better at, and I plan to do more YouTube streams soon, such as refreshing my automated testing email course with some new examples, so subscribe on YouTube if you want to know when I next go live.

    summary: null diff --git a/content/node.7989ae69-0f6d-4a7d-b560-d828f76cfba4.yml b/content/node.7989ae69-0f6d-4a7d-b560-d828f76cfba4.yml index cec9181a6..12ac726e0 100644 --- a/content/node.7989ae69-0f6d-4a7d-b560-d828f76cfba4.yml +++ b/content/node.7989ae69-0f6d-4a7d-b560-d828f76cfba4.yml @@ -55,7 +55,7 @@ body: format: full_html processed: | -

    Do some Developers skip writing tests for their personal projects because they think it's a chore?

    +

    Do some Developers skip writing tests for their personal projects because they think it's a chore?

    If they've written the code, so they then think it's too much work to write tests or need to move on to the next task?

    diff --git a/content/node.79fdad19-834d-463e-89f6-059c0865a034.yml b/content/node.79fdad19-834d-463e-89f6-059c0865a034.yml index 18211f619..96e075cdc 100644 --- a/content/node.79fdad19-834d-463e-89f6-059c0865a034.yml +++ b/content/node.79fdad19-834d-463e-89f6-059c0865a034.yml @@ -93,7 +93,7 @@ body: format: full_html processed: | -

    A great thing about Tailwind CSS plugins being written in JavaScript is that they can be tested using tools like Jest.

    +

    A great thing about Tailwind CSS plugins being written in JavaScript is that they can be tested using tools like Jest.

    Here's an example from https://github.com/opdavies/tailwindcss-plugin-jest-example (it may need updating to work with the latest Tailwind versions or to use the latest best practices):

    diff --git a/content/node.7b639ca0-4e69-4b39-8815-a9d3c712cf9d.yml b/content/node.7b639ca0-4e69-4b39-8815-a9d3c712cf9d.yml index 728fa254f..91bf9d2c2 100644 --- a/content/node.7b639ca0-4e69-4b39-8815-a9d3c712cf9d.yml +++ b/content/node.7b639ca0-4e69-4b39-8815-a9d3c712cf9d.yml @@ -62,7 +62,7 @@ body:

    Another main piece of automation I use is to create and manage the infrastructure my applications run in.

    -

    I've talked about it in my Deploying PHP applications with Ansible and Ansistrano talk, that before you can deploy an application, you need a server with the required packages installed to run it. You may also need a CDN endpoint, SSL certificate, DNS records, CORS policy, database server, container registry, object storage bucket or a number of various other things.

    +

    I've talked about it in my Deploying PHP applications with Ansible and Ansistrano talk, that before you can deploy an application, you need a server with the required packages installed to run it. You may also need a CDN endpoint, SSL certificate, DNS records, CORS policy, database server, container registry, object storage bucket or a number of various other things.

    Using automation tools like Terraform, Pulumi or Ansible, you can run a single command to create, update or destroy resources or your entire stack.

    diff --git a/content/node.7b840e91-b45a-4403-8b34-6b9b4dda2ebf.yml b/content/node.7b840e91-b45a-4403-8b34-6b9b4dda2ebf.yml index ecb4a4645..9b5ca01f8 100644 --- a/content/node.7b840e91-b45a-4403-8b34-6b9b4dda2ebf.yml +++ b/content/node.7b840e91-b45a-4403-8b34-6b9b4dda2ebf.yml @@ -52,7 +52,7 @@ body: processed: |

    I've been working on a project with a client, using Fractal for our component library. I've been working on it locally but yesterday I needed to make it public for the client to review the work I've done.

    -

    I recently added node support to my build configuration file generator and used that to generate and use a consistent set of configuration files for a Fractal project.

    +

    I recently added node support to my build configuration file generator and used that to generate and use a consistent set of configuration files for a Fractal project.

    I've used Terraform in some codebases to create and configure AWS resources like S3 buckets and Cloudfront distributions, so I was able to use that to create what I needed as well as adding the DNS record for a new subdomain to access Cloudfront.

    diff --git a/content/node.7e93586c-c6a0-410a-ae83-a1d50bc12743.yml b/content/node.7e93586c-c6a0-410a-ae83-a1d50bc12743.yml index 9f6ad8a1d..933f47959 100644 --- a/content/node.7e93586c-c6a0-410a-ae83-a1d50bc12743.yml +++ b/content/node.7e93586c-c6a0-410a-ae83-a1d50bc12743.yml @@ -59,7 +59,7 @@ body: format: full_html processed: | -

    In previous emails, I've written briefly about Nix. Over the next few days, I want to write more about it and explain the different components of the Nix ecosystem and how I use them.

    +

    In previous emails, I've written briefly about Nix. Over the next few days, I want to write more about it and explain the different components of the Nix ecosystem and how I use them.

    Firstly, Nix is a package manager, similar to apt on Ubuntu or homebrew on MacOS.

    @@ -71,7 +71,7 @@ body:

    You can have multiple versions of the same package installed at once.

    -

    And because Nix is reproducible, you can get exactly the same configuration over and over again.

    +

    And because Nix is reproducible, you can get exactly the same configuration over and over again.

    In another email, I'll write about NixOS, but you don't need to use it to use Nix the package manager.

    diff --git a/content/node.7f09e435-16da-4a6c-bffa-d297282760e9.yml b/content/node.7f09e435-16da-4a6c-bffa-d297282760e9.yml index 9afaddae9..d19de4f23 100644 --- a/content/node.7f09e435-16da-4a6c-bffa-d297282760e9.yml +++ b/content/node.7f09e435-16da-4a6c-bffa-d297282760e9.yml @@ -60,7 +60,7 @@ body:

    Alternatively, what if you were doing trunk-based development and/or continuous integration?

    What if you could make the small change, push it and have a CI pipeline automatically review it?

    The whole process could be completed in minutes.

    -

    No long wait for manual code review and once you finish that refactoring, you may find another.

    +

    No long wait for manual code review and once you finish that refactoring, you may find another.

    summary: '' field_daily_email_cta: - target_type: node diff --git a/content/node.7fce2f3b-7564-40a0-8dfc-741c66a3b993.yml b/content/node.7fce2f3b-7564-40a0-8dfc-741c66a3b993.yml index bde7d5579..27287d0cb 100644 --- a/content/node.7fce2f3b-7564-40a0-8dfc-741c66a3b993.yml +++ b/content/node.7fce2f3b-7564-40a0-8dfc-741c66a3b993.yml @@ -81,9 +81,9 @@ body:

    I was working in this way on a project when I released that I could use Tailwind for all of the styling instead of just adding small sprinklings of utilities here and there. I refactored everything and removed the other framework that I'd been using - leaving just Tailwind CSS.

    -

    With the exception of some legacy projects, now I use Tailwind CSS exclusively and have used it for a number of projects. I've given lunch and learn sessions to teams that I've worked on, presented a Tailwind CSS talk at a number of PHP, Drupal, WordPress, and JavaScript events, and maintain a starter-kit theme for using Tailwind in custom Drupal themes.

    +

    With the exception of some legacy projects, now I use Tailwind CSS exclusively and have used it for a number of projects. I've given lunch and learn sessions to teams that I've worked on, presented a Tailwind CSS talk at a number of PHP, Drupal, WordPress, and JavaScript events, and maintain a starter-kit theme for using Tailwind in custom Drupal themes.

    -

    I've also rebuilt a number of existing sites as examples and written some Tailwind CSS related blog posts.

    +

    I've also rebuilt a number of existing sites as examples and written some Tailwind CSS related blog posts.

    I'm looking forward to attending Simon's workshop tomorrow and quickly putting that knowledge to use in the next phase of a project that I'm currently working on.

    diff --git a/content/node.805363c0-2306-47f5-b9ba-57995ebe12b3.yml b/content/node.805363c0-2306-47f5-b9ba-57995ebe12b3.yml index ac0284d41..841f80bef 100644 --- a/content/node.805363c0-2306-47f5-b9ba-57995ebe12b3.yml +++ b/content/node.805363c0-2306-47f5-b9ba-57995ebe12b3.yml @@ -69,7 +69,7 @@ body:

    A requirement they mentioned was to make it themable, so they could later change colours of buttons and other elements based on the page type being viewed or if they added sub-sites in the future.

    -

    This is something I've done a lot with Tailwind CSS and, as it's the CSS framework I'm most familiar with, we decided to go with Tailwind CSS - and specifically the alpha version of Tailwind CSS v4.

    +

    This is something I've done a lot with Tailwind CSS and, as it's the CSS framework I'm most familiar with, we decided to go with Tailwind CSS - and specifically the alpha version of Tailwind CSS v4.

    Although it's still in an alpha phase, I've been experimenting with Tailwind v4 in personal projects and on some live streams and it seemed stable enough to use in production.

    diff --git a/content/node.81676cf3-0b30-4619-a922-12ff3e16ba76.yml b/content/node.81676cf3-0b30-4619-a922-12ff3e16ba76.yml index 35abb8c2e..c53bf22bd 100644 --- a/content/node.81676cf3-0b30-4619-a922-12ff3e16ba76.yml +++ b/content/node.81676cf3-0b30-4619-a922-12ff3e16ba76.yml @@ -82,7 +82,7 @@ body: }

    This is the same approach as upgrading incrementally from old versions of software to new versions or different software.

    Neither site knows about the other and they work independently.

    My Nginx configuration is managed within my NixOS configuration, so you can see the whole configuration for my website and how I've leveraged the Nix language to simplify the process of migrating new paths to Tome.

    format: full_html processed: |- -

    Following my daily email archive, I've recently switched the podcast pages on my website from Sculpin to Drupal/Tome.

    The recent episode with Luke McCormick was the first to be created in Drupal and served from static HTML generated by Tome, and I've since re-created the other podcast episodes and the podcast landing page.

    The next steps are to re-add the links on a podcast episode page to other episodes with the same guests, and to rebuild the podcast feed that's used to update players like Spotify and PocketCasts.

    Once I've finished this, I'll move on to my presentations pages as those are the ones that change next frequently.

    How am I doing this?

    A lot of the content is still served from HTML generated by Sculpin, which is stored in one directory on my server.

    The newer content, generated by Tome, is stored in another directory.

    In my Nginx configuration, I change the root value based on the URL, so depending on which page you're visiting, you'll get content from Sculpin or Tome.

    Here's part of that configuration:

    server {
    +      

    Following my daily email archive, I've recently switched the podcast pages on my website from Sculpin to Drupal/Tome.

    The recent episode with Luke McCormick was the first to be created in Drupal and served from static HTML generated by Tome, and I've since re-created the other podcast episodes and the podcast landing page.

    The next steps are to re-add the links on a podcast episode page to other episodes with the same guests, and to rebuild the podcast feed that's used to update players like Spotify and PocketCasts.

    Once I've finished this, I'll move on to my presentations pages as those are the ones that change next frequently.

    How am I doing this?

    A lot of the content is still served from HTML generated by Sculpin, which is stored in one directory on my server.

    The newer content, generated by Tome, is stored in another directory.

    In my Nginx configuration, I change the root value based on the URL, so depending on which page you're visiting, you'll get content from Sculpin or Tome.

    Here's part of that configuration:

    server {
             listen localhost:8095:
             server_name www.oliverdavies.uk:
             root /var/www/vhosts/website-sculpin;
    @@ -125,6 +125,6 @@ body:
               try_files $uri $uri.html $uri/index.html =404;
               root /var/www/vhosts/website-tome;
             }
    -      }

    This is the same approach as upgrading incrementally from old versions of software to new versions or different software.

    Neither site knows about the other and they work independently.

    My Nginx configuration is managed within my NixOS configuration, so you can see the whole configuration for my website and how I've leveraged the Nix language to simplify the process of migrating new paths to Tome.

    + }

    This is the same approach as upgrading incrementally from old versions of software to new versions or different software.

    Neither site knows about the other and they work independently.

    My Nginx configuration is managed within my NixOS configuration, so you can see the whole configuration for my website and how I've leveraged the Nix language to simplify the process of migrating new paths to Tome.

    summary: '' field_daily_email_cta: { } diff --git a/content/node.8174931b-97d3-457f-8822-00c905fe9e1d.yml b/content/node.8174931b-97d3-457f-8822-00c905fe9e1d.yml index fdbd937a5..880b20943 100644 --- a/content/node.8174931b-97d3-457f-8822-00c905fe9e1d.yml +++ b/content/node.8174931b-97d3-457f-8822-00c905fe9e1d.yml @@ -87,9 +87,9 @@ body:

    In some cases, you can't upgrade or repair them yourself.

    -

    Similar to having control and ownership of my own data, I like the ability to repair a keyboard myself or to add more memory or storage to my laptop.

    +

    Similar to having control and ownership of my own data, I like the ability to repair a keyboard myself or to add more memory or storage to my laptop.

    -

    As well as installing and running my own software, starting a homelab has also reignited my interest in hardware and being able to upgrade and repair my own devices.

    +

    As well as installing and running my own software, starting a homelab has also reignited my interest in hardware and being able to upgrade and repair my own devices.

    summary: null diff --git a/content/node.82839e74-b53c-4d18-af5d-024d8f09fb3f.yml b/content/node.82839e74-b53c-4d18-af5d-024d8f09fb3f.yml index 71ef6ccb4..d15d2cc11 100644 --- a/content/node.82839e74-b53c-4d18-af5d-024d8f09fb3f.yml +++ b/content/node.82839e74-b53c-4d18-af5d-024d8f09fb3f.yml @@ -55,7 +55,7 @@ body: format: full_html processed: | -

    Ansible is a tool for automating IT tasks. It's one of my preferred tools to use, and one that I've written about and presented talks on previously.

    +

    Ansible is a tool for automating IT tasks. It's one of my preferred tools to use, and one that I've written about and presented talks on previously.

    It's typically thought of as a tool for managing configuration on servers. For example. you have a new VPS that you want to use as a web server, so it needs Nginx, MySQL, PHP, etc to be installed - or whatever your application uses. You define the desired state and run Ansible, which will perform whatever tasks are needed to get to that state.

    @@ -69,7 +69,7 @@ body:
    -

    Want to learn more about how I use Ansible? Register for my upcoming free email course.

    +

    Want to learn more about how I use Ansible? Register for my upcoming free email course.

    summary: null diff --git a/content/node.8290cf4e-cbbc-415d-b185-cbaba90d42d1.yml b/content/node.8290cf4e-cbbc-415d-b185-cbaba90d42d1.yml index 05bbdb90a..e09de7446 100644 --- a/content/node.8290cf4e-cbbc-415d-b185-cbaba90d42d1.yml +++ b/content/node.8290cf4e-cbbc-415d-b185-cbaba90d42d1.yml @@ -53,7 +53,7 @@ body: format: full_html processed: | -

    Since patching ThePrimeagen's tmux-sessionizer script, I've started to think of more situations where patching would be useful.

    +

    Since patching ThePrimeagen's tmux-sessionizer script, I've started to think of more situations where patching would be useful.

    I've been using Nick Janetakis' notes script for creating and managing notes files and wanted it to generate daily files instead of monthly, which it did in a previous version.

    @@ -65,7 +65,7 @@ body:

    As someone who creates and maintains open source software, and develops applications with open source projects like Drupal, knowing how to use patches to fix and extend them can be very useful in some situations.

    -

    P.S. If you want to hear a conversation between Nick and myself about Docker, course creation and more, listen to the episode with Nick on the Beyond Blocks podcast.

    +

    P.S. If you want to hear a conversation between Nick and myself about Docker, course creation and more, listen to the episode with Nick on the Beyond Blocks podcast.

    summary: null diff --git a/content/node.8293455b-3322-4e45-a24a-2d64f77db033.yml b/content/node.8293455b-3322-4e45-a24a-2d64f77db033.yml index 0f6eb5851..ca5c51095 100644 --- a/content/node.8293455b-3322-4e45-a24a-2d64f77db033.yml +++ b/content/node.8293455b-3322-4e45-a24a-2d64f77db033.yml @@ -80,7 +80,7 @@ body:

    Since then, I've written and maintained a number of Drupal modules and themes, PHP libraries, npm packages, Ansible roles and Docker images - all of which are available on my GitHub and Drupal.org pages.

    -

    Just over a year ago, I switched to using Neovim full-time for my development and DevOps work, and last week, I wrote my first Neovim plugin, written in Lua.

    +

    Just over a year ago, I switched to using Neovim full-time for my development and DevOps work, and last week, I wrote my first Neovim plugin, written in Lua.

    I've used Lua to configure Neovim but this is the first time that I've written and open-sourced a standalone Neovim plugin.

    diff --git a/content/node.82af7a87-a737-49cd-84a0-872e820d9c91.yml b/content/node.82af7a87-a737-49cd-84a0-872e820d9c91.yml index a8f7aa7e5..fbc2f23a1 100644 --- a/content/node.82af7a87-a737-49cd-84a0-872e820d9c91.yml +++ b/content/node.82af7a87-a737-49cd-84a0-872e820d9c91.yml @@ -51,7 +51,7 @@ body: format: full_html processed: | -

    This week, I spoke with Mark Conroy for an upcoming episode of the Beyond Blocks podcast.

    +

    This week, I spoke with Mark Conroy for an upcoming episode of the Beyond Blocks podcast.

    We discussed his approach to removing front-end build tools from projects, including the LocalGov Drupal base theme.

    diff --git a/content/node.82f12dce-4db3-44d8-9eff-b24feb20d568.yml b/content/node.82f12dce-4db3-44d8-9eff-b24feb20d568.yml index 6e9b54bae..c686d6c60 100644 --- a/content/node.82f12dce-4db3-44d8-9eff-b24feb20d568.yml +++ b/content/node.82f12dce-4db3-44d8-9eff-b24feb20d568.yml @@ -74,7 +74,7 @@ body: format: full_html processed: | -

    Build Configs is a tool I wrote and recently gave a lightning talk about at the PHP South West meetup in Bristol, UK.

    +

    Build Configs is a tool I wrote and recently gave a lightning talk about at the PHP South West meetup in Bristol, UK.

    It's a command-line tool that creates customised per-project configuration files from a set of reusable templates.

    diff --git a/content/node.82f169a8-a9cf-4705-abaa-f8e29912aa9f.yml b/content/node.82f169a8-a9cf-4705-abaa-f8e29912aa9f.yml index da49575f0..c23ca37eb 100644 --- a/content/node.82f169a8-a9cf-4705-abaa-f8e29912aa9f.yml +++ b/content/node.82f169a8-a9cf-4705-abaa-f8e29912aa9f.yml @@ -55,7 +55,7 @@ body: format: full_html processed: | -

    Regardless of how many environments your application has, you need to be able to move changes between them reliably.

    +

    Regardless of how many environments your application has, you need to be able to move changes between them reliably.

    You don't want to configure each environment and make every change by hand.

    diff --git a/content/node.83443749-8720-4aa7-95b1-9c35e88f094f.yml b/content/node.83443749-8720-4aa7-95b1-9c35e88f094f.yml index 37c9b3c8e..59912a82b 100644 --- a/content/node.83443749-8720-4aa7-95b1-9c35e88f094f.yml +++ b/content/node.83443749-8720-4aa7-95b1-9c35e88f094f.yml @@ -57,11 +57,11 @@ body:

    There is no "Tailwind-looking website" as there is with component-level frameworks like Bootstrap and Bulma.

    -

    You can also see this in the other UIs I've rebuilt with Tailwind - some of which I show in my Taking Flight with Tailwind CSS talk.

    +

    You can also see this in the other UIs I've rebuilt with Tailwind - some of which I show in my Taking Flight with Tailwind CSS talk.

    I've created the Album and Pricing card examples so far, but may do more soon.

    -

    I've recently ported this website to be a Sculpin-powered website, so if you want to see another Sculpin example, you can take a look at the source code.

    +

    I've recently ported this website to be a Sculpin-powered website, so if you want to see another Sculpin example, you can take a look at the source code.

    summary: null diff --git a/content/node.84ede6fa-2682-4edf-8b22-ee603de0b8c7.yml b/content/node.84ede6fa-2682-4edf-8b22-ee603de0b8c7.yml index 16ecfde76..230e91172 100644 --- a/content/node.84ede6fa-2682-4edf-8b22-ee603de0b8c7.yml +++ b/content/node.84ede6fa-2682-4edf-8b22-ee603de0b8c7.yml @@ -69,7 +69,7 @@ body: format: full_html processed: | -

    Yesterday I wrote about how I used a patch file to customise a project in my Nix configuration.

    +

    Yesterday I wrote about how I used a patch file to customise a project in my Nix configuration.

    I'm familiar with patch files from my Drupal contributions, when we used to create and upload patch files and attach them to issues to contribute changes.

    diff --git a/content/node.871b8bdf-2856-4c27-be38-117dbec6dd94.yml b/content/node.871b8bdf-2856-4c27-be38-117dbec6dd94.yml index 0814fc026..49e2dbb7f 100644 --- a/content/node.871b8bdf-2856-4c27-be38-117dbec6dd94.yml +++ b/content/node.871b8bdf-2856-4c27-be38-117dbec6dd94.yml @@ -48,12 +48,12 @@ body: processed: |

    Perhaps you were looking for one of these pages:

    -

    If you were looking for something else, you can search for it.

    +

    If you were looking for something else, you can search for it.

    summary: '' field_seo_analysis: - status: '0' diff --git a/content/node.8766d230-d3d4-45fb-82a6-2dbaec0c775b.yml b/content/node.8766d230-d3d4-45fb-82a6-2dbaec0c775b.yml index f9eae0f16..1c9efec92 100644 --- a/content/node.8766d230-d3d4-45fb-82a6-2dbaec0c775b.yml +++ b/content/node.8766d230-d3d4-45fb-82a6-2dbaec0c775b.yml @@ -59,7 +59,7 @@ body: format: full_html processed: | -

    A few days ago, I asked why people are still using Git Flow in 2024.

    +

    A few days ago, I asked why people are still using Git Flow in 2024.

    I moved to trunk-based development two years ago and haven't looked back.

    diff --git a/content/node.8a0608f1-361e-4618-a9a8-8ec2e2d1397e.yml b/content/node.8a0608f1-361e-4618-a9a8-8ec2e2d1397e.yml index aaff8317a..d7a5c596f 100644 --- a/content/node.8a0608f1-361e-4618-a9a8-8ec2e2d1397e.yml +++ b/content/node.8a0608f1-361e-4618-a9a8-8ec2e2d1397e.yml @@ -89,7 +89,7 @@ body:

    Is that going to be at least another two weeks before it can be addressed?

    -

    Do you need to start using hotfixes and dealing with multiple branches and merge conflicts?

    +

    Do you need to start using hotfixes and dealing with multiple branches and merge conflicts?

    I suggest separating your planning and work schedules from your deployments.

    @@ -97,9 +97,9 @@ body:

    You want your feedback loop to be as small and quick as possible.

    -

    But, importantly, deploying code is different to releasing features.

    +

    But, importantly, deploying code is different to releasing features.

    -

    If you need to do manual testing, use feature flags to separate deploying the code from releasing the feature.

    +

    If you need to do manual testing, use feature flags to separate deploying the code from releasing the feature.

    Then, when it's ready to go live, you only need to enable the feature flag - no code deployment needed.

    diff --git a/content/node.8a88f79c-3593-4316-8308-8bbc9622d0ec.yml b/content/node.8a88f79c-3593-4316-8308-8bbc9622d0ec.yml index 074377fb7..90a83c160 100644 --- a/content/node.8a88f79c-3593-4316-8308-8bbc9622d0ec.yml +++ b/content/node.8a88f79c-3593-4316-8308-8bbc9622d0ec.yml @@ -73,11 +73,11 @@ body:

    If you're running your applications in Docker, you could use Ansible to pull the latest images and restart your applications.

    -

    For more information and examples, I've given a talk on Ansible at various PHP events, which covers some Ansible basics before moving on to deploying applications with Ansistrano.

    +

    For more information and examples, I've given a talk on Ansible at various PHP events, which covers some Ansible basics before moving on to deploying applications with Ansistrano.


    -

    Want to learn more about how I use Ansible? Register for my upcoming free email course.

    +

    Want to learn more about how I use Ansible? Register for my upcoming free email course.

    summary: null diff --git a/content/node.8b3f37aa-64aa-4d89-8593-52cbf781b713.yml b/content/node.8b3f37aa-64aa-4d89-8593-52cbf781b713.yml index 6076d713b..c7ce89fc1 100644 --- a/content/node.8b3f37aa-64aa-4d89-8593-52cbf781b713.yml +++ b/content/node.8b3f37aa-64aa-4d89-8593-52cbf781b713.yml @@ -70,7 +70,7 @@ body:

    What's the issue?

    -

    I agree with what Peter says and also encourage people to make small refactors to the code they're working on and follow the "Boy Scout rule".

    +

    I agree with what Peter says and also encourage people to make small refactors to the code they're working on and follow the "Boy Scout rule".

    The main blocker to this I've seen is Git workflows that require people to work in separate branches that need to be reviewed before being merged, as this slows down the process.

    diff --git a/content/node.8be3d8d9-4e73-49db-93a6-83349ac1af05.yml b/content/node.8be3d8d9-4e73-49db-93a6-83349ac1af05.yml index ce7fde99f..93149e799 100644 --- a/content/node.8be3d8d9-4e73-49db-93a6-83349ac1af05.yml +++ b/content/node.8be3d8d9-4e73-49db-93a6-83349ac1af05.yml @@ -77,7 +77,7 @@ body: processed: |

    Today, I posted a tweet with a screenshot of some code.

    -

    When previously working on the Versa CLI tool, I had a TODO comment saying "What if there are multiple languages?".

    +

    When previously working on the Versa CLI tool, I had a TODO comment saying "What if there are multiple languages?".

    Versa is a tool for standardising commands between different languages and frameworks, but some projects, like my personal website, use multiple languages.

    diff --git a/content/node.8c51f0d1-d7d3-4089-91bc-43b1f896f844.yml b/content/node.8c51f0d1-d7d3-4089-91bc-43b1f896f844.yml index c571837d9..d9c8746b0 100644 --- a/content/node.8c51f0d1-d7d3-4089-91bc-43b1f896f844.yml +++ b/content/node.8c51f0d1-d7d3-4089-91bc-43b1f896f844.yml @@ -57,10 +57,10 @@ body: [2]: https://code.oliverdavies.uk/opdavies format: markdown processed: | -

    Earlier this week, I wrote about using Nix to manage different versions of PHP.

    +

    Earlier this week, I wrote about using Nix to manage different versions of PHP.

    PHP 8.4, 8.3, 8.2 and 8.1 are all available in the current stable version of nixpkgs.

    You can only have one version installed globally, but you can have specific versions enabled for different projects.

    -

    You can create a shell.nix file or a Nix Flake like yesterday's example in each project directory and add or override the version of PHP or any other packages as needed.

    +

    You can create a shell.nix file or a Nix Flake like yesterday's example in each project directory and add or override the version of PHP or any other packages as needed.

    Each directory can have its own set of installed packages and configuration, and this works for everything in nixpkgs.

    Because flakes can have multiple inputs, including multiple versions of nixpkgs, you can mix and match between stable, unstable or pinned versions in the same flake.nix and decide which to use for each project.

    This provides a lot of flexibility and offers a lot of customisation so you can configure each project exactly how you need.

    diff --git a/content/node.8ee882f8-f25b-4ae7-9dc3-aedc78ee0998.yml b/content/node.8ee882f8-f25b-4ae7-9dc3-aedc78ee0998.yml index 58e9dca70..9d0d5f156 100644 --- a/content/node.8ee882f8-f25b-4ae7-9dc3-aedc78ee0998.yml +++ b/content/node.8ee882f8-f25b-4ae7-9dc3-aedc78ee0998.yml @@ -54,7 +54,7 @@ body: format: full_html processed: | -

    A couple of weeks ago, I wrote that using types adds context to code, making it easier to read and understand.

    +

    A couple of weeks ago, I wrote that using types adds context to code, making it easier to read and understand.

    Something else that also adds context is named arguments, which were introduced to PHP in version 8.0.0.

    diff --git a/content/node.8f2bed8f-56cb-4269-8e1d-082af6201775.yml b/content/node.8f2bed8f-56cb-4269-8e1d-082af6201775.yml index d442ba72e..eb7b6dc32 100644 --- a/content/node.8f2bed8f-56cb-4269-8e1d-082af6201775.yml +++ b/content/node.8f2bed8f-56cb-4269-8e1d-082af6201775.yml @@ -56,7 +56,7 @@ body:

    The majority of those files are the same with some slight configuration for each project - such as whether it uses web or docroot, or which paths are checked with static analysis or for coding standards issues.

    -

    I've given a talk called Working with Workspace - a tool that we used at an agency I worked at. It had two functions - to execute project tasks and to generate configuration files from templates.

    +

    I've given a talk called Working with Workspace - a tool that we used at an agency I worked at. It had two functions - to execute project tasks and to generate configuration files from templates.

    I use a justfile to execute tasks and commands but needed to write my own tool to generate the configuration files.

    diff --git a/content/node.90834219-4fa0-4db8-a34e-9a4e7b017359.yml b/content/node.90834219-4fa0-4db8-a34e-9a4e7b017359.yml index 1764db7bd..cb2565f30 100644 --- a/content/node.90834219-4fa0-4db8-a34e-9a4e7b017359.yml +++ b/content/node.90834219-4fa0-4db8-a34e-9a4e7b017359.yml @@ -51,9 +51,9 @@ body: processed: |

    A few months ago, I started doing some live coding sessions on YouTube again.

    -

    As well as writing automated tests for the Content Access by Path module, I started to re-learn Behat - a behavioural testing tool for PHP.

    +

    As well as writing automated tests for the Content Access by Path module, I started to re-learn Behat - a behavioural testing tool for PHP.

    -

    I've used Behat before but mainly use PHPUnit in Drupal to write my automated tests, so I thought I'd try it again in my Build Configs tool written in Symfony.

    +

    I've used Behat before but mainly use PHPUnit in Drupal to write my automated tests, so I thought I'd try it again in my Build Configs tool written in Symfony.

    In that stream, I was able to install it, do some research to refresh my memory, and get some initial tests running.

    diff --git a/content/node.90b4b442-bc96-4b9f-9e1b-70112f628de8.yml b/content/node.90b4b442-bc96-4b9f-9e1b-70112f628de8.yml index 2deecb9f7..6e11b079c 100644 --- a/content/node.90b4b442-bc96-4b9f-9e1b-70112f628de8.yml +++ b/content/node.90b4b442-bc96-4b9f-9e1b-70112f628de8.yml @@ -51,7 +51,7 @@ body: format: full_html processed: | -

    As well as there not being one right answer when developing software, things aren't always perfect.

    +

    As well as there not being one right answer when developing software, things aren't always perfect.

    You don't always need to strive for the "ideal" solution.

    diff --git a/content/node.91985c48-6ce5-4270-8f51-478299bb9284.yml b/content/node.91985c48-6ce5-4270-8f51-478299bb9284.yml index 0653c2e0b..3db729c19 100644 --- a/content/node.91985c48-6ce5-4270-8f51-478299bb9284.yml +++ b/content/node.91985c48-6ce5-4270-8f51-478299bb9284.yml @@ -97,7 +97,7 @@ body:

    The great thing about testing is that it gives you confidence that everything still works how you expect - not only when you wrote the code, but also in the future.

    -

    I've talked about this, and how to get started with automated testing in Drupal, in a presentation called TDD - Test-Driven Drupal. If you want to find out more, the slides and a video recording are embedded there.

    +

    I've talked about this, and how to get started with automated testing in Drupal, in a presentation called TDD - Test-Driven Drupal. If you want to find out more, the slides and a video recording are embedded there.

    summary: null diff --git a/content/node.94472cb5-7302-4b56-9fb8-ad96fe2971f8.yml b/content/node.94472cb5-7302-4b56-9fb8-ad96fe2971f8.yml index ff72ee1c5..7615dc486 100644 --- a/content/node.94472cb5-7302-4b56-9fb8-ad96fe2971f8.yml +++ b/content/node.94472cb5-7302-4b56-9fb8-ad96fe2971f8.yml @@ -155,7 +155,7 @@ body: } -

    Hopefully, this shows how quickly you can get tests running for a Drupal module. If you'd like to see more, the slides and video recording of my Test-Driven Drupal talk are online.

    +

    Hopefully, this shows how quickly you can get tests running for a Drupal module. If you'd like to see more, the slides and video recording of my Test-Driven Drupal talk are online.

    summary: null diff --git a/content/node.94a771d0-c280-408a-8ae7-c364cd573771.yml b/content/node.94a771d0-c280-408a-8ae7-c364cd573771.yml index cb85d6b6e..cbb739537 100644 --- a/content/node.94a771d0-c280-408a-8ae7-c364cd573771.yml +++ b/content/node.94a771d0-c280-408a-8ae7-c364cd573771.yml @@ -37,6 +37,6 @@ path: body: - value: '

    I''m happy to say that Gareth Alexander - Drupal CMS Accessibility Tools Track Lead - is the newest guest on the Beyond Blocks podcast.

    Gareth was a speaker at the recent DrupalCamp England event in Cambridge, where he spoke about Drupal CMS and Recipes - something I was keen to learn more about, so I was delighted to have him on the show.

    Listen to the episode here.

    If you want to be a guest on a future episode or suggest someone who should be, reply to this email and let me know. Any suggestions or recommendations welcomed!

    ' format: basic_html - processed: '

    I''m happy to say that Gareth Alexander - Drupal CMS Accessibility Tools Track Lead - is the newest guest on the Beyond Blocks podcast.

    Gareth was a speaker at the recent DrupalCamp England event in Cambridge, where he spoke about Drupal CMS and Recipes - something I was keen to learn more about, so I was delighted to have him on the show.

    Listen to the episode here.

    If you want to be a guest on a future episode or suggest someone who should be, reply to this email and let me know. Any suggestions or recommendations welcomed!

    ' + processed: '

    I''m happy to say that Gareth Alexander - Drupal CMS Accessibility Tools Track Lead - is the newest guest on the Beyond Blocks podcast.

    Gareth was a speaker at the recent DrupalCamp England event in Cambridge, where he spoke about Drupal CMS and Recipes - something I was keen to learn more about, so I was delighted to have him on the show.

    Listen to the episode here.

    If you want to be a guest on a future episode or suggest someone who should be, reply to this email and let me know. Any suggestions or recommendations welcomed!

    ' summary: '' field_daily_email_cta: { } diff --git a/content/node.960814d3-b3bd-4a5a-a541-906c1e121902.yml b/content/node.960814d3-b3bd-4a5a-a541-906c1e121902.yml index b4523a3cc..29aaff8b6 100644 --- a/content/node.960814d3-b3bd-4a5a-a541-906c1e121902.yml +++ b/content/node.960814d3-b3bd-4a5a-a541-906c1e121902.yml @@ -76,7 +76,7 @@ body: format: full_html processed: | -

    In one of the lessons in my free automated testing in Drupal email course, I explain how I create configuration that I need within my tests, such as adding a custom field:

    +

    In one of the lessons in my free automated testing in Drupal email course, I explain how I create configuration that I need within my tests, such as adding a custom field:

    But how do you know what to name the configuration files and what content to put in them?

    @@ -111,7 +111,7 @@ body:

    I still need to edit the files to remove the uuid and _core values, but this approach means less clicking in the Drupal UI which makes me more productive.

    -

    I used this approach when writing my SaaS code yesterday and it worked well.

    +

    I used this approach when writing my SaaS code yesterday and it worked well.

    summary: null diff --git a/content/node.97127b95-b383-490a-af5f-62e60aa11f0f.yml b/content/node.97127b95-b383-490a-af5f-62e60aa11f0f.yml index f636030fd..d0f30e418 100644 --- a/content/node.97127b95-b383-490a-af5f-62e60aa11f0f.yml +++ b/content/node.97127b95-b383-490a-af5f-62e60aa11f0f.yml @@ -57,11 +57,11 @@ body: format: full_html processed: | -

    As well as using free and open source software for my homelab, I develop software applications for clients using open source software, such as PHP, Drupal, Symfony and Sculpin.

    +

    As well as using free and open source software for my homelab, I develop software applications for clients using open source software, such as PHP, Drupal, Symfony and Sculpin.

    I also use open source software to do this.

    -

    I use NixOS as the operating system on my laptop.

    +

    I use NixOS as the operating system on my laptop.

    I use Alacritty as my terminal emulator and tmux as a terminal multiplexer to have different sessions, windows and tabs for each project.

    @@ -69,11 +69,11 @@ body:

    I use Git for source control and tools like PHPStan, PHPUnit and Pest to run checks on my code.

    -

    I use Nix and devenv to run the applications locally and host them on Linux servers running Nginx.

    +

    I use Nix and devenv to run the applications locally and host them on Linux servers running Nginx.

    I also use OBS, Kdenlive and GIMP to record and edit my content, which are all also open source projects.

    -

    I run an open source business, using open source tools and projects and contribute to and maintain my own open source software projects.

    +

    I run an open source business, using open source tools and projects and contribute to and maintain my own open source software projects.

    summary: null diff --git a/content/node.987bb32d-4dc3-49ff-bc30-2563ea769769.yml b/content/node.987bb32d-4dc3-49ff-bc30-2563ea769769.yml index dcde0d86a..bdecbd125 100644 --- a/content/node.987bb32d-4dc3-49ff-bc30-2563ea769769.yml +++ b/content/node.987bb32d-4dc3-49ff-bc30-2563ea769769.yml @@ -51,7 +51,7 @@ body: format: full_html processed: | -

    I recently installed an application called Gitea on my homelab.

    +

    I recently installed an application called Gitea on my homelab.

    It's a service for hosting and managing Git repositories, similar to GitHub, GitLab and Bitbucket, but I'm hosting it on my own hardware and I'm in full control of my data.

    diff --git a/content/node.98d20258-bdbe-4286-a2d2-36dc4722cac1.yml b/content/node.98d20258-bdbe-4286-a2d2-36dc4722cac1.yml index 7736d0305..0019a93d0 100644 --- a/content/node.98d20258-bdbe-4286-a2d2-36dc4722cac1.yml +++ b/content/node.98d20258-bdbe-4286-a2d2-36dc4722cac1.yml @@ -63,7 +63,7 @@ body:

    Reading the comments, it had the usual "re-inventing the wheel" and "just use inline styles" comments, which, to me, didn't seem very helpful and not the point of the post.

    -

    When I've given a talk on Tailwind CSS, I've acknowledged that people have common initial reactions and suggested people try it for a week or so and see how it works for them before making up their minds.

    +

    When I've given a talk on Tailwind CSS, I've acknowledged that people have common initial reactions and suggested people try it for a week or so and see how it works for them before making up their minds.

    Someone did after a conference and posted this on Twitter:

    diff --git a/content/node.99989cd7-1f79-4f8e-abf1-12b69bc7ee1c.yml b/content/node.99989cd7-1f79-4f8e-abf1-12b69bc7ee1c.yml index aa558502a..18882247a 100644 --- a/content/node.99989cd7-1f79-4f8e-abf1-12b69bc7ee1c.yml +++ b/content/node.99989cd7-1f79-4f8e-abf1-12b69bc7ee1c.yml @@ -57,7 +57,7 @@ body: format: full_html processed: | -

    A few days ago, I wrote about where Drupal used to be, and some of the things that Drupal predates - such as Git, GitHub and Composer.

    +

    A few days ago, I wrote about where Drupal used to be, and some of the things that Drupal predates - such as Git, GitHub and Composer.

    With Drupal 8, Drupal changed and switched from "not invented here" to "proudly found elsewhere" and started use and embrace third-party code.

    diff --git a/content/node.99c87aed-1bac-4f19-9ae2-15e2ccd9cd02.yml b/content/node.99c87aed-1bac-4f19-9ae2-15e2ccd9cd02.yml index 21daf38e0..41be54cd3 100644 --- a/content/node.99c87aed-1bac-4f19-9ae2-15e2ccd9cd02.yml +++ b/content/node.99c87aed-1bac-4f19-9ae2-15e2ccd9cd02.yml @@ -77,9 +77,9 @@ body: format: full_html processed: | -

    I recently switched to self hosting the MP3 files for the episodes of the Beyond Blocks podcast.

    +

    I recently switched to self hosting the MP3 files for the episodes of the Beyond Blocks podcast.

    -

    The first step was to upload the files, followed by updating the player on the episode pages to use the HTML audio element.

    +

    The first step was to upload the files, followed by updating the player on the episode pages to use the HTML audio element.

    As I didn't want the player to switch immediately, I wrapped the new code in a feature flag (or feature toggle) to keep the original player active.

    diff --git a/content/node.9aba3fab-cb0a-4ea1-a439-9ff419b23841.yml b/content/node.9aba3fab-cb0a-4ea1-a439-9ff419b23841.yml index a418d1519..c71ba5b8a 100644 --- a/content/node.9aba3fab-cb0a-4ea1-a439-9ff419b23841.yml +++ b/content/node.9aba3fab-cb0a-4ea1-a439-9ff419b23841.yml @@ -78,7 +78,7 @@ body:

    Here's the thing

    -

    As someone who works mainly on Drupal consulting and development projects, I'm pledging to commit a fixed percentage from my Drupal-related services and products to the Drupal Association, including my new team coaching service.

    +

    As someone who works mainly on Drupal consulting and development projects, I'm pledging to commit a fixed percentage from my Drupal-related services and products to the Drupal Association, including my new team coaching service.

    If the Association or Drupal weren't there, I wouldn't be able to provide those products and services, so it's in my interest to support the Drupal project and the Drupal Association. Maybe others will do the same.

    diff --git a/content/node.9b4c39a3-702f-486c-a79b-4d7b96a4f3f6.yml b/content/node.9b4c39a3-702f-486c-a79b-4d7b96a4f3f6.yml index b07e75dcd..9e8dbc2dd 100644 --- a/content/node.9b4c39a3-702f-486c-a79b-4d7b96a4f3f6.yml +++ b/content/node.9b4c39a3-702f-486c-a79b-4d7b96a4f3f6.yml @@ -38,5 +38,5 @@ path: body: - value: '

    P.S. Are you stuck on Drupal 7? Plan your upgrade to Drupal 11 or Drupal CMS now!

    ' format: basic_html - processed: '

    P.S. Are you stuck on Drupal 7? Plan your upgrade to Drupal 11 or Drupal CMS now!

    ' + processed: '

    P.S. Are you stuck on Drupal 7? Plan your upgrade to Drupal 11 or Drupal CMS now!

    ' summary: '' diff --git a/content/node.9b65d27f-65f6-4913-b142-a1a128ebf21f.yml b/content/node.9b65d27f-65f6-4913-b142-a1a128ebf21f.yml index 4e9d32b59..e3a61fa2c 100644 --- a/content/node.9b65d27f-65f6-4913-b142-a1a128ebf21f.yml +++ b/content/node.9b65d27f-65f6-4913-b142-a1a128ebf21f.yml @@ -51,7 +51,7 @@ body:

    We discussed what the Drupal Association is and what it does, how companies and individuals can contribute and support the Association, some recent and upcoming improvements to Drupal.org, Drupal 7's end-of-life, and more.

    -

    Listen now

    +

    Listen now

    This Friday, I'm releasing an episode with Ryan Weaver from SymfonyCasts.

    diff --git a/content/node.9cc91e25-0d1b-4a93-b367-7da047fce99e.yml b/content/node.9cc91e25-0d1b-4a93-b367-7da047fce99e.yml index 448374a37..883e29845 100644 --- a/content/node.9cc91e25-0d1b-4a93-b367-7da047fce99e.yml +++ b/content/node.9cc91e25-0d1b-4a93-b367-7da047fce99e.yml @@ -47,7 +47,7 @@ body: processed: |

    In the most recent episode of Beyond Blocks, I discuss LEGO, robotics, teaching kids to code and open-source software with Andy Hoang, who runs a company called "Beyond Blocks".

    -

    Listen to the episode here.

    +

    Listen to the episode here.

    Next week, Sam Mortenson and I discuss single file components in Drupal.

    diff --git a/content/node.9d63cfe9-dd20-4e58-955f-bd42a5026c8a.yml b/content/node.9d63cfe9-dd20-4e58-955f-bd42a5026c8a.yml index 9e752c025..ec95c18e2 100644 --- a/content/node.9d63cfe9-dd20-4e58-955f-bd42a5026c8a.yml +++ b/content/node.9d63cfe9-dd20-4e58-955f-bd42a5026c8a.yml @@ -105,7 +105,7 @@ body:

    I think these docblocks aren't needed and in my projects, would suggest they be removed.

    -

    Unless they're adding more information, such as PHPStan PHPDoc types, there's no need to repeat what the code already says.

    +

    Unless they're adding more information, such as PHPStan PHPDoc types, there's no need to repeat what the code already says.

    summary: null diff --git a/content/node.9dcd7b33-b2bc-41b1-9d17-f7536a670343.yml b/content/node.9dcd7b33-b2bc-41b1-9d17-f7536a670343.yml index c159743b4..0c58cd2a3 100644 --- a/content/node.9dcd7b33-b2bc-41b1-9d17-f7536a670343.yml +++ b/content/node.9dcd7b33-b2bc-41b1-9d17-f7536a670343.yml @@ -57,7 +57,7 @@ body:

    If you want to attend, RSVP on the meetup event page.

    -

    If you can't, check out my free Drupal testing email course or book a 1-on-1 consulting call and I'll get you started.

    +

    If you can't, check out my free Drupal testing email course or book a 1-on-1 consulting call and I'll get you started.

    summary: null diff --git a/content/node.9deec245-c96a-44f5-a54c-95f61611051d.yml b/content/node.9deec245-c96a-44f5-a54c-95f61611051d.yml index a0650a0c3..b392ce016 100644 --- a/content/node.9deec245-c96a-44f5-a54c-95f61611051d.yml +++ b/content/node.9deec245-c96a-44f5-a54c-95f61611051d.yml @@ -63,7 +63,7 @@ body: format: full_html processed: | -

    I recently started self-hosting the episodes for the Beyond Blocks podcast.

    +

    I recently started self-hosting the episodes for the Beyond Blocks podcast.

    Instead of hosting the episodes on a third party service, the MP3 files are hosted on my server and played using the HTML5 audio element.

    diff --git a/content/node.9ecc8bf3-5bf6-4713-9868-c6059db4d432.yml b/content/node.9ecc8bf3-5bf6-4713-9868-c6059db4d432.yml index 4ba7a2719..87bf9573e 100644 --- a/content/node.9ecc8bf3-5bf6-4713-9868-c6059db4d432.yml +++ b/content/node.9ecc8bf3-5bf6-4713-9868-c6059db4d432.yml @@ -55,7 +55,7 @@ body:

    It adds parallel testing to PHPUnit, so your tests will be run in parallel instead of sequentially.

    -

    For the example module in my automated testing in Drupal email course, using Paratest reduces the execution time from ~16 seconds to ~8 seconds.

    +

    For the example module in my automated testing in Drupal email course, using Paratest reduces the execution time from ~16 seconds to ~8 seconds.

    In a client project with 136 tests, it reduces the time from four and a half minutes to less than two minutes.

    diff --git a/content/node.9fcb0f0b-9dfd-4a51-b465-79541d63b17b.yml b/content/node.9fcb0f0b-9dfd-4a51-b465-79541d63b17b.yml index 5aaf9f29f..397f46e13 100644 --- a/content/node.9fcb0f0b-9dfd-4a51-b465-79541d63b17b.yml +++ b/content/node.9fcb0f0b-9dfd-4a51-b465-79541d63b17b.yml @@ -73,7 +73,7 @@ body:

    This type of approach is commonly called Git Flow or GitHub Flow.

    -

    It's something I've given presentations on in the past.

    +

    It's something I've given presentations on in the past.

    A common downfall is that different branches can conflict with each other - either due to a merge conflict where the same lines are changed in different branches, or incompatible code is written that works separately but not when merged together.

    @@ -85,9 +85,9 @@ body:

    Everyone works on a single branch and pulls and pushes changes regularly.

    -

    If you're doing continuous integration, that should be once a day as an absolute minimum.

    +

    If you're doing continuous integration, that should be once a day as an absolute minimum.

    -

    I do test-driven development and usually commit after each passing test.

    +

    I do test-driven development and usually commit after each passing test.

    If you work on a single branch and pull and push changes regularly, you're much less likely to get merge conflicts and Developers can focus on pushing code instead of fixing merge conflicts.

    diff --git a/content/node.9fe3fe14-044e-4dfa-bbcc-41dea612f05a.yml b/content/node.9fe3fe14-044e-4dfa-bbcc-41dea612f05a.yml index 078752d5c..3bbb94659 100644 --- a/content/node.9fe3fe14-044e-4dfa-bbcc-41dea612f05a.yml +++ b/content/node.9fe3fe14-044e-4dfa-bbcc-41dea612f05a.yml @@ -84,7 +84,7 @@ body:

    When you run it on your code, the errors you see will depend on what level you set.

    -

    In yesterday's email, the first example code block didn't generate an error until level 5 was used.

    +

    In yesterday's email, the first example code block didn't generate an error until level 5 was used.

    So, how do you know which level to use?

    diff --git a/content/node.a0631edf-ffac-4381-92b6-98e76e980131.yml b/content/node.a0631edf-ffac-4381-92b6-98e76e980131.yml index 31d486699..8b0ca8ece 100644 --- a/content/node.a0631edf-ffac-4381-92b6-98e76e980131.yml +++ b/content/node.a0631edf-ffac-4381-92b6-98e76e980131.yml @@ -47,7 +47,7 @@ body: format: full_html processed: | -

    This week's guest on Beyond Blocks is Ryan Weaver.

    +

    This week's guest on Beyond Blocks is Ryan Weaver.

    Ryan is a Symfony Developer, Symfony core team member and writer for SymfonyCasts.

    diff --git a/content/node.a1dc0ff4-ae77-4126-a499-1f39e9c08115.yml b/content/node.a1dc0ff4-ae77-4126-a499-1f39e9c08115.yml index 07fa9b532..18a6993df 100644 --- a/content/node.a1dc0ff4-ae77-4126-a499-1f39e9c08115.yml +++ b/content/node.a1dc0ff4-ae77-4126-a499-1f39e9c08115.yml @@ -50,7 +50,7 @@ body:

    We discussed focussing on delivering value, prioritising based on usefulness to users and stakeholders, Agile vs agile, and how they pivoted from a "big bang" approach to delivering rapid increments in smaller batches.

    -

    Listen to the episode now.

    +

    Listen to the episode now.

    summary: null diff --git a/content/node.a2dbc5b2-ae56-4583-bc9f-ec0f70601eae.yml b/content/node.a2dbc5b2-ae56-4583-bc9f-ec0f70601eae.yml index a1e6dd29d..c381f4e4d 100644 --- a/content/node.a2dbc5b2-ae56-4583-bc9f-ec0f70601eae.yml +++ b/content/node.a2dbc5b2-ae56-4583-bc9f-ec0f70601eae.yml @@ -57,7 +57,7 @@ body: format: full_html processed: | -

    Following last week's email on different ways to write .gitignore files, friend of the list, Daniel Harper, sent me this reply (shared with permission):

    +

    Following last week's email on different ways to write .gitignore files, friend of the list, Daniel Harper, sent me this reply (shared with permission):

    I had a debate once about this topic and we settled on ignore as the filename explicitly describes what it should be doing ie. It's not .gitallow 😆

    @@ -73,7 +73,7 @@ body:

    This would be clearer for people when they first open the file.

    -

    However, if you decide to use the allow approach instead, document it in an ADR or design document and why you decided to do it that way and provide context for people working on the codebase in the future.

    +

    However, if you decide to use the allow approach instead, document it in an ADR or design document and why you decided to do it that way and provide context for people working on the codebase in the future.

    summary: null diff --git a/content/node.a2dfa0ba-1a95-4b4c-9471-7f0274ae69bf.yml b/content/node.a2dfa0ba-1a95-4b4c-9471-7f0274ae69bf.yml index a03a26759..63d3f476b 100644 --- a/content/node.a2dfa0ba-1a95-4b4c-9471-7f0274ae69bf.yml +++ b/content/node.a2dfa0ba-1a95-4b4c-9471-7f0274ae69bf.yml @@ -49,13 +49,13 @@ body: format: full_html processed: | -

    As someone who has been using Tailwind CSS since before 1.0, I'm looking forward to the next major version - Tailwind CSS v4.

    +

    As someone who has been using Tailwind CSS since before 1.0, I'm looking forward to the next major version - Tailwind CSS v4.

    A main difference compared to previous versions is that it will be configured in CSS using CSS variables (aka custom properties).

    No more tailwind.config.js configuration files, just variables like --color-blue-100.

    -

    As I already use CSS variables in some situations, I like that it will make it easier to re-use them within Tailwind and give a more consistent experience.

    +

    As I already use CSS variables in some situations, I like that it will make it easier to re-use them within Tailwind and give a more consistent experience.

    As well as simple variables, such as colours and spacing, I'm interested to see how everything else will translate to the new configuration approach in Tailwind v4, as well as anything else new that will be included.

    diff --git a/content/node.a33ea357-381e-4171-9808-85c90c7602c7.yml b/content/node.a33ea357-381e-4171-9808-85c90c7602c7.yml index 70812cd69..c14fb4fa5 100644 --- a/content/node.a33ea357-381e-4171-9808-85c90c7602c7.yml +++ b/content/node.a33ea357-381e-4171-9808-85c90c7602c7.yml @@ -55,9 +55,9 @@ body: format: full_html processed: | -

    Over the last few days, I've written a few emails about static websites and static site generators before I speak about Sculpin at PHP Thames Valley.

    +

    Over the last few days, I've written a few emails about static websites and static site generators before I speak about Sculpin at PHP Thames Valley.

    -

    They are easy to build and deploy and cheap to host.

    +

    They are easy to build and deploy and cheap to host.

    As a PHP Developer, I use Sculpin as it uses Symfony components, is extendable by writing my own PHP code and uses Twig for templating.

    @@ -67,7 +67,7 @@ body:

    You build the website the same as you would locally and export the content and files to a static website - the same you would generate with a static site generator like Sculpin or writing the files by hand.

    -

    Sam Mortenson (the creator of Tome) and I discussed it on episode 19 of the Beyond Blocks podcast.

    +

    Sam Mortenson (the creator of Tome) and I discussed it on episode 19 of the Beyond Blocks podcast.

    So, if you like Drupal and the benefits of static sites, Tome may be a good solution for you.

    diff --git a/content/node.a47d5366-6212-48d7-98b0-5ccc2506052c.yml b/content/node.a47d5366-6212-48d7-98b0-5ccc2506052c.yml index fdc957f49..d21a8ecb5 100644 --- a/content/node.a47d5366-6212-48d7-98b0-5ccc2506052c.yml +++ b/content/node.a47d5366-6212-48d7-98b0-5ccc2506052c.yml @@ -73,11 +73,11 @@ body:

    I've been pleased to see Symfony features such as autowiring and autoconfiguration start to be used within Drupal, as well as discussions around using PHP attributes to replace annotations and docblocks.

    -

    Most recently, when writing my automated testing email course, I saw a number of aliases have been added to core's core.services.yml file, which means I can use the fully qualified class name as the service name without adding aliases to my own services files.

    +

    Most recently, when writing my automated testing email course, I saw a number of aliases have been added to core's core.services.yml file, which means I can use the fully qualified class name as the service name without adding aliases to my own services files.

    Drupal and Symfony are separate projects, and Drupal uses more than just Symfony components, but as someone who uses Drupal and Symfony, I'm happy to see them learning from and inspiring each other.

    -

    I'm looking forward to seeing the next thing - Twig components, maybe - in Drupal.

    +

    I'm looking forward to seeing the next thing - Twig components, maybe - in Drupal.

    summary: null diff --git a/content/node.a4efc095-f78d-45ae-854d-fc52c8afa41b.yml b/content/node.a4efc095-f78d-45ae-854d-fc52c8afa41b.yml index cf84dfbb8..59f22a9e8 100644 --- a/content/node.a4efc095-f78d-45ae-854d-fc52c8afa41b.yml +++ b/content/node.a4efc095-f78d-45ae-854d-fc52c8afa41b.yml @@ -73,7 +73,7 @@ body: public function it_returns_the_endpoint() -

    Annotations have started to be replaced in parts of Drupal since 10.2, so it's nice to be able to do it with tests, too.

    +

    Annotations have started to be replaced in parts of Drupal since 10.2, so it's nice to be able to do it with tests, too.

    Which do you prefer?

    diff --git a/content/node.a504768a-c5bf-4660-986d-07590f6ee816.yml b/content/node.a504768a-c5bf-4660-986d-07590f6ee816.yml index 0e5fd1c64..3b2525e6e 100644 --- a/content/node.a504768a-c5bf-4660-986d-07590f6ee816.yml +++ b/content/node.a504768a-c5bf-4660-986d-07590f6ee816.yml @@ -66,7 +66,7 @@ body:

    If you're starting a new project, try starting with an appropriate distribution instead of starting from scratch with a standard installation of Drupal core and save yourself time and effort.

    -

    Don't know if using a distribution could help for you? Book a 1-on-1 consulting call, and I'll help you out.

    +

    Don't know if using a distribution could help for you? Book a 1-on-1 consulting call, and I'll help you out.

    summary: null diff --git a/content/node.a520e72c-3fdf-476e-bdd7-0120e9e161ea.yml b/content/node.a520e72c-3fdf-476e-bdd7-0120e9e161ea.yml index e176558fd..f129a8cda 100644 --- a/content/node.a520e72c-3fdf-476e-bdd7-0120e9e161ea.yml +++ b/content/node.a520e72c-3fdf-476e-bdd7-0120e9e161ea.yml @@ -51,7 +51,7 @@ body: format: full_html processed: | -

    Now Drupal 10.3 has been released, and websites need to be updated to 10.3 before Drupal 11, it's time to start updating your Drupal 10 websites.

    +

    Now Drupal 10.3 has been released, and websites need to be updated to 10.3 before Drupal 11, it's time to start updating your Drupal 10 websites.

    Luckily, with Composer, upgrading is one simple command.

    @@ -61,7 +61,7 @@ body:

    If you want to only update Drupal core, then you'll need to run something like composer update drupal/core or composer update drupal/core-*, or something slightly different if you're using a distribution like Commerce Kickstart or LocalGov Drupal.

    -

    I think adopting Composer was one of the best decisions the Drupal project made - not only to include third-party code, such as Symfony components, but it also makes applications so much easier to update.

    +

    I think adopting Composer was one of the best decisions the Drupal project made - not only to include third-party code, such as Symfony components, but it also makes applications so much easier to update.

    summary: null diff --git a/content/node.a564cfaa-2b13-4739-af74-5fde2b75b1a0.yml b/content/node.a564cfaa-2b13-4739-af74-5fde2b75b1a0.yml index 3b316e46e..41863e599 100644 --- a/content/node.a564cfaa-2b13-4739-af74-5fde2b75b1a0.yml +++ b/content/node.a564cfaa-2b13-4739-af74-5fde2b75b1a0.yml @@ -49,7 +49,7 @@ body:

    We discuss Laravel Prompts which was released at Laracon US last year and added to Drush 13, but also about PHP, Laravel, Neovim, working in the terminal and bullet journaling.

    -

    Listen to the episode now.

    +

    Listen to the episode now.

    summary: null diff --git a/content/node.a76cc0ca-e585-42b5-8ec9-369b95da3eff.yml b/content/node.a76cc0ca-e585-42b5-8ec9-369b95da3eff.yml index 03526fcf3..c054ac91b 100644 --- a/content/node.a76cc0ca-e585-42b5-8ec9-369b95da3eff.yml +++ b/content/node.a76cc0ca-e585-42b5-8ec9-369b95da3eff.yml @@ -55,7 +55,7 @@ body: processed: |

    As well as my recent session at PHP South Wales, I've also been involved with a lot more mob programming recently with members of my team.

    -

    We recently added a new feature to our codebase that we completed over a couple of mob sessions - starting by describing the problem and some potential solutions within a technical design document before moving on to the implementation.

    +

    We recently added a new feature to our codebase that we completed over a couple of mob sessions - starting by describing the problem and some potential solutions within a technical design document before moving on to the implementation.

    I was already familiar with the existing code that we needed to extend, so had some ideas of how to approach parts of the solution which we discussed - but there were other parts that I hadn't thought of.

    diff --git a/content/node.a7fe5a85-3eaf-4c33-b0f5-54e67fbc09de.yml b/content/node.a7fe5a85-3eaf-4c33-b0f5-54e67fbc09de.yml index bcd84442c..4435b4f6c 100644 --- a/content/node.a7fe5a85-3eaf-4c33-b0f5-54e67fbc09de.yml +++ b/content/node.a7fe5a85-3eaf-4c33-b0f5-54e67fbc09de.yml @@ -58,7 +58,7 @@ body:

    A static HTML version of the site can be generated which can be uploaded to a web server - like with other static site generators - with the advantage that Astro includes no JavaScript by default.

    -

    As well as my personal website, I've been using Astro for some other mini-projects including building Bootstrap components with Tailwind, and I'm using it for the updated examples for my Tailwind CSS talk at nor(DEV):con in a couple of weeks time.

    +

    As well as my personal website, I've been using Astro for some other mini-projects including building Bootstrap components with Tailwind, and I'm using it for the updated examples for my Tailwind CSS talk at nor(DEV):con in a couple of weeks time.

    summary: null diff --git a/content/node.a8a1b0cc-8372-4285-a655-bdd1f77226d3.yml b/content/node.a8a1b0cc-8372-4285-a655-bdd1f77226d3.yml index 0ffc24abb..95df5a671 100644 --- a/content/node.a8a1b0cc-8372-4285-a655-bdd1f77226d3.yml +++ b/content/node.a8a1b0cc-8372-4285-a655-bdd1f77226d3.yml @@ -71,7 +71,7 @@ body:

    It's always nerve-racking contributing to a new projects, but let's see how it goes.

    -

    I'm thinking of it as a free code review.

    +

    I'm thinking of it as a free code review.

    If it goes well, I can see me contributing more packages in the future.

    diff --git a/content/node.a8e2e580-5b20-451d-80ef-7ee19aea62ec.yml b/content/node.a8e2e580-5b20-451d-80ef-7ee19aea62ec.yml index 9e7672a0c..6db4755d1 100644 --- a/content/node.a8e2e580-5b20-451d-80ef-7ee19aea62ec.yml +++ b/content/node.a8e2e580-5b20-451d-80ef-7ee19aea62ec.yml @@ -64,7 +64,7 @@ body: format: full_html processed: | -

    As I said in yesterday's email, I'm discussing with a team how to implement their new website design.

    +

    As I said in yesterday's email, I'm discussing with a team how to implement their new website design.

    Their website has been live for a couple of years, and now they want to refresh its look and feel.

    diff --git a/content/node.a8f06c67-81eb-471c-9081-0648c9400e27.yml b/content/node.a8f06c67-81eb-471c-9081-0648c9400e27.yml index 9110d6552..cda93a6e1 100644 --- a/content/node.a8f06c67-81eb-471c-9081-0648c9400e27.yml +++ b/content/node.a8f06c67-81eb-471c-9081-0648c9400e27.yml @@ -66,13 +66,13 @@ body:

    It could be a small refactor - renaming a variable or class name that makes some code easier to read or removing some commented-out code that isn't doing anything other than adding visual clutter.

    -

    It could be updating some documentation or writing a technical document; if you keep those in your version control repository, that would help you implement the following change or to make the documentation clearer for the next reader - whether that's you or someone else.

    +

    It could be updating some documentation or writing a technical document; if you keep those in your version control repository, that would help you implement the following change or to make the documentation clearer for the next reader - whether that's you or someone else.

    Committing something at least once a day creates a different mindset to "I'll write everything and push it when it's done".

    It makes you break up large tasks into multiple smaller ones and set mini-deadlines for yourself. I used to do the same when I commuted to work on a train and had a task for a freelance project to complete before I arrived. I used to think, "What can I start, finish and commit before I get there?" instead of leaving something incomplete.

    -

    You don't need to push your change to mainline. If you use the "Ship, Show, Ask" approach then you could commit to a temporary branch that you either merge yourself once you know it passes the checks, or to show or get feedback from other team members.

    +

    You don't need to push your change to mainline. If you use the "Ship, Show, Ask" approach then you could commit to a temporary branch that you either merge yourself once you know it passes the checks, or to show or get feedback from other team members.

    Practicing this becomes a habit, and if you're doing test-driven development and committing after every passing test or refactor, you'll find yourself pushing numerous changes a day.

    diff --git a/content/node.a96b6197-2490-4e22-8705-d372ee76664b.yml b/content/node.a96b6197-2490-4e22-8705-d372ee76664b.yml index cac1992bb..0bbcac182 100644 --- a/content/node.a96b6197-2490-4e22-8705-d372ee76664b.yml +++ b/content/node.a96b6197-2490-4e22-8705-d372ee76664b.yml @@ -56,13 +56,13 @@ body: processed: |

    As a solo Developer and Consultant, I rely a lot on automation to get my tasks done.

    -

    I use tools like Pulumi, Ansible and Terraform to automate creating and configuring infrastructure - recently creating new client GitHub repositories using a standard configuration with Pulumi.

    +

    I use tools like Pulumi, Ansible and Terraform to automate creating and configuring infrastructure - recently creating new client GitHub repositories using a standard configuration with Pulumi.

    I use Nix and Home Manager to automate my local development environment, install packages I need and create files like .gitconfig for my needs. These are reusable and stored in my dotfiles repository.

    For projects, I use tools like Docker, Docker Compose and Nix flakes for consistency.

    -

    I wrote a tool for generating configuration files for each project - reducing the time it takes me to set up, configure and maintain standard files for tools like Docker and Docker Compose that I always use. If I need to add a new feature or fix a bug in a configuration file, I can do that in my templated version and re-generate each project's files rather than making the same change manually.

    +

    I wrote a tool for generating configuration files for each project - reducing the time it takes me to set up, configure and maintain standard files for tools like Docker and Docker Compose that I always use. If I need to add a new feature or fix a bug in a configuration file, I can do that in my templated version and re-generate each project's files rather than making the same change manually.

    Today, I wrote a script that loops over all projects where I commit those files to GitHub, clones a fresh version of it, re-generates the files and pushes any new files or changes back to the repository. This means that any changes will be automatically applied and all of my projects will remain in sync.

    diff --git a/content/node.aa4b919c-76e4-43db-8962-2b2cacd33267.yml b/content/node.aa4b919c-76e4-43db-8962-2b2cacd33267.yml index ffa5a1665..68c254e42 100644 --- a/content/node.aa4b919c-76e4-43db-8962-2b2cacd33267.yml +++ b/content/node.aa4b919c-76e4-43db-8962-2b2cacd33267.yml @@ -78,7 +78,7 @@ body: format: full_html processed: | -

    In yesterday's email, I mentioned parallel testing and speeding up your tests by running them in parallel.

    +

    In yesterday's email, I mentioned parallel testing and speeding up your tests by running them in parallel.

    Something else I've been experimenting with recently in architectural testing with PHPat.

    @@ -86,7 +86,7 @@ body:

    Going forward, I'd like to ensure that each Drupal module only uses its own classes and is separated, as I recently had an issue where I deleted a class method in one module only to find it was used in a different module.

    -

    Here's what I have so far for my testing course codebase:

    +

    Here's what I have so far for my testing course codebase:

    final class ArchitectureTest {
     
    diff --git a/content/node.aba09cf2-f67c-4056-b503-5a53399e634b.yml b/content/node.aba09cf2-f67c-4056-b503-5a53399e634b.yml
    index 789deaa31..2a824d71c 100644
    --- a/content/node.aba09cf2-f67c-4056-b503-5a53399e634b.yml
    +++ b/content/node.aba09cf2-f67c-4056-b503-5a53399e634b.yml
    @@ -69,7 +69,7 @@ body:
                   
         format: full_html
         processed: |
    -      

    After Wednesday's email, someone said, "It sounds like you and I use git very differently." So, I wanted to explain what my typical Git workflow is.

    +

    After Wednesday's email, someone said, "It sounds like you and I use git very differently." So, I wanted to explain what my typical Git workflow is.

    I used to use Git Flow, but now, I almost never create a new branch when starting a new task.

    diff --git a/content/node.aba40c6c-363c-489a-b1d3-b0ac5a5890bf.yml b/content/node.aba40c6c-363c-489a-b1d3-b0ac5a5890bf.yml index 6b8de3269..fbcbbecb8 100644 --- a/content/node.aba40c6c-363c-489a-b1d3-b0ac5a5890bf.yml +++ b/content/node.aba40c6c-363c-489a-b1d3-b0ac5a5890bf.yml @@ -87,7 +87,7 @@ body:

    I'd recommend reading the article to get the full context.

    -

    Rules two and six suggest lengths for the subject line and body which is another reason why I rarely use -m when committing changes.

    +

    Rules two and six suggest lengths for the subject line and body which is another reason why I rarely use -m when committing changes.

    Whilst you can create multi-line commit messages on the command line, by opening it in my preferred editor (Neovim for me), I can see where the lines should end and be warned if I exceed them.

    diff --git a/content/node.abd5479c-e5d2-46ba-8687-0c5d37b31bfe.yml b/content/node.abd5479c-e5d2-46ba-8687-0c5d37b31bfe.yml index 61115be78..8c4387f95 100644 --- a/content/node.abd5479c-e5d2-46ba-8687-0c5d37b31bfe.yml +++ b/content/node.abd5479c-e5d2-46ba-8687-0c5d37b31bfe.yml @@ -52,7 +52,7 @@ body: format: full_html processed: | -

    Since July 2021, I've used Neovim full-time for my development work and writing.

    +

    Since July 2021, I've used Neovim full-time for my development work and writing.

    Whilst Vim and Neovim are minimal by default, its functionality can be extended by adding plugins.

    diff --git a/content/node.abf2eeeb-fcd3-4df9-9d3c-aae89244a4bf.yml b/content/node.abf2eeeb-fcd3-4df9-9d3c-aae89244a4bf.yml index 960b55593..6ef01610e 100644 --- a/content/node.abf2eeeb-fcd3-4df9-9d3c-aae89244a4bf.yml +++ b/content/node.abf2eeeb-fcd3-4df9-9d3c-aae89244a4bf.yml @@ -61,7 +61,7 @@ body: processed: |

    I've recently been helping my son to learn to code in Python.

    -

    I've also bought a portable scanner so I can scan documents and add them to Paperless which is running on my homelab.

    +

    I've also bought a portable scanner so I can scan documents and add them to Paperless which is running on my homelab.

    I've been explaining to my son why he needs to read the error messages to understand why something isn't working, such as a syntax error or an undefined variable.

    diff --git a/content/node.ac349786-bc86-465d-9374-a277d15a892c.yml b/content/node.ac349786-bc86-465d-9374-a277d15a892c.yml index 4ecf329c4..5e3e8b34d 100644 --- a/content/node.ac349786-bc86-465d-9374-a277d15a892c.yml +++ b/content/node.ac349786-bc86-465d-9374-a277d15a892c.yml @@ -52,7 +52,7 @@ body: processed: |

    Tonight I was lucky to speak at the first Bristol Software Development Meetup event, organised by South Wales Tech.

    -

    Following a great talk from Tom Vaughan, I gave an updated version of my Taking Flight with Tailwind CSS talk.

    +

    Following a great talk from Tom Vaughan, I gave an updated version of my Taking Flight with Tailwind CSS talk.

    It's a talk that I first gave in January 2018 and one that I need to continuously update so that it's up to date with the latest version of the framework. The last time I gave this talk was in February 2021 so there was quite a lot of new things to cover.

    diff --git a/content/node.add68937-4a3d-410d-a0d3-4510e3cb9e19.yml b/content/node.add68937-4a3d-410d-a0d3-4510e3cb9e19.yml index a5405d296..c1d21bd25 100644 --- a/content/node.add68937-4a3d-410d-a0d3-4510e3cb9e19.yml +++ b/content/node.add68937-4a3d-410d-a0d3-4510e3cb9e19.yml @@ -70,9 +70,9 @@ body: [1]: /presentations/deploying-php-ansible-ansistrano format: markdown processed: | -

    Yesterday, I wrote about infrastructure as code and mentioned some of the IaC tools that are available.

    +

    Yesterday, I wrote about infrastructure as code and mentioned some of the IaC tools that are available.

    I use Terraform to manage the DNS records for my websites, and use NixOS to configure my laptops and home server.

    -

    Before NixOS, I used Ansible to provision servers and deploy application code.

    +

    Before NixOS, I used Ansible to provision servers and deploy application code.

    Ansible is imperative, which means you need to declare each step that needs to be run.

    You need to say to install a package, like a web server.

    You need to say to create any required users or groups.

    diff --git a/content/node.af1271f1-d7b4-446b-8fb0-1d94eee5846f.yml b/content/node.af1271f1-d7b4-446b-8fb0-1d94eee5846f.yml index 093c314fe..47569e4a1 100644 --- a/content/node.af1271f1-d7b4-446b-8fb0-1d94eee5846f.yml +++ b/content/node.af1271f1-d7b4-446b-8fb0-1d94eee5846f.yml @@ -70,7 +70,7 @@ body: format: full_html processed: | -

    In yesterday's email, I mentioned the Private Message Queue module - a contributed Drupal module we wrote for a project as part of a contribution-first workflow.

    +

    In yesterday's email, I mentioned the Private Message Queue module - a contributed Drupal module we wrote for a project as part of a contribution-first workflow.

    In our experience, doing that and releasing Private Message Queue as its own open-source project encouraged more open-source contributions.

    diff --git a/content/node.b09dbe1e-6719-4dab-929f-acd50aa9cfc7.yml b/content/node.b09dbe1e-6719-4dab-929f-acd50aa9cfc7.yml index e79a9539b..9d8ea6ced 100644 --- a/content/node.b09dbe1e-6719-4dab-929f-acd50aa9cfc7.yml +++ b/content/node.b09dbe1e-6719-4dab-929f-acd50aa9cfc7.yml @@ -63,7 +63,7 @@ body:

    A common one is automated tests and test-driven development.

    -

    Tests aren't a line item that should be billed for separately and clients and customers just want their software to work.

    +

    Tests aren't a line item that should be billed for separately and clients and customers just want their software to work.

    Generally, they aren't concerned that there are automated tests or whether the tests were written before the code.

    @@ -73,7 +73,7 @@ body:

    Whether people know they're paying for me to write automated tests as part or not, I can work more effectively when I have tests and am doing test-driven development.

    -

    Both when writing the code, but also if it needs to be refactored or changed in the future.

    +

    Both when writing the code, but also if it needs to be refactored or changed in the future.

    summary: null diff --git a/content/node.b16f4c7f-2876-4165-8c38-a7ef0b9cbb13.yml b/content/node.b16f4c7f-2876-4165-8c38-a7ef0b9cbb13.yml index da2488148..ce7a139bc 100644 --- a/content/node.b16f4c7f-2876-4165-8c38-a7ef0b9cbb13.yml +++ b/content/node.b16f4c7f-2876-4165-8c38-a7ef0b9cbb13.yml @@ -51,7 +51,7 @@ body: format: full_html processed: | -

    Yesterday's email was about using Drupal Rector and the Automated Project Update bot to update contributed modules.

    +

    Yesterday's email was about using Drupal Rector and the Automated Project Update bot to update contributed modules.

    But what about custom modules within your application?

    diff --git a/content/node.b2e7fd1a-40f8-40fc-9304-54385e3dcb6d.yml b/content/node.b2e7fd1a-40f8-40fc-9304-54385e3dcb6d.yml index 9980d6947..7e21c672e 100644 --- a/content/node.b2e7fd1a-40f8-40fc-9304-54385e3dcb6d.yml +++ b/content/node.b2e7fd1a-40f8-40fc-9304-54385e3dcb6d.yml @@ -57,7 +57,7 @@ body: format: full_html processed: | -

    This week, I spoke with Dave Liddament to record an upcoming episode of the Beyond Blocks podcast.

    +

    This week, I spoke with Dave Liddament to record an upcoming episode of the Beyond Blocks podcast.

    In that conversion, we started to talk about conventions, specifically unwritten conventions used within projects.

    diff --git a/content/node.b38b290a-1ce1-481d-987b-9683245740da.yml b/content/node.b38b290a-1ce1-481d-987b-9683245740da.yml index 3cb8766d3..0b393dfb2 100644 --- a/content/node.b38b290a-1ce1-481d-987b-9683245740da.yml +++ b/content/node.b38b290a-1ce1-481d-987b-9683245740da.yml @@ -49,7 +49,7 @@ body:

    We discuss using PHPStan and static analysis in PHP projects as well as taking some trips down memory lane, including when we wrote the most recent PHP website with Tailwind CSS version 0.4. That is not a typo!

    -

    Listen to the episode now.

    +

    Listen to the episode now.

    summary: null diff --git a/content/node.b3a28a86-02c5-45ea-8a51-32508cd34b7d.yml b/content/node.b3a28a86-02c5-45ea-8a51-32508cd34b7d.yml index 63d331dda..ffbe2616a 100644 --- a/content/node.b3a28a86-02c5-45ea-8a51-32508cd34b7d.yml +++ b/content/node.b3a28a86-02c5-45ea-8a51-32508cd34b7d.yml @@ -67,7 +67,7 @@ body: Because I think that ADRs could be an excellent way to scale this project up to A) many people, B) many timezones.

    -

    I like this decision and have adopted and written about ADRs before.

    +

    I like this decision and have adopted and written about ADRs before.

    I also like that the documents are stored as markdown files in the repository, alongside the code, making it easy for everyone to view or change.

    diff --git a/content/node.b3d2cc06-7cbf-476e-9dc7-fa13ed17363f.yml b/content/node.b3d2cc06-7cbf-476e-9dc7-fa13ed17363f.yml index 68e380475..d86e08644 100644 --- a/content/node.b3d2cc06-7cbf-476e-9dc7-fa13ed17363f.yml +++ b/content/node.b3d2cc06-7cbf-476e-9dc7-fa13ed17363f.yml @@ -47,11 +47,11 @@ body: format: full_html processed: | -

    If you're trying to keep your code consistent, such as following the same coding style or following conventions such as find vs get or design systems such as repositories or builder classes, instead of relying on manual code review and taking the time of a colleague, you can leverage automation to run checks for you.

    +

    If you're trying to keep your code consistent, such as following the same coding style or following conventions such as find vs get or design systems such as repositories or builder classes, instead of relying on manual code review and taking the time of a colleague, you can leverage automation to run checks for you.

    You can run tools such as phpcs or eslint to enforce a coding style and use Git hooks or a CI pipeline to run them automatically or integrate them into your text editor or IDE so you can see and resolve issues as the code is being written.

    -

    You can use static analysis tools such as PHPStan to find potential bugs but also enforce conventions by writing custom rules for your project or using architectural testing tools such as PHPat.

    +

    You can use static analysis tools such as PHPStan to find potential bugs but also enforce conventions by writing custom rules for your project or using architectural testing tools such as PHPat.

    By automating checks, you'll have a consistent result every time and don't need to wait for someone else to find small issues you could have fixed quickly.

    diff --git a/content/node.b43ce1ab-0d83-463f-9421-d20aaacdd833.yml b/content/node.b43ce1ab-0d83-463f-9421-d20aaacdd833.yml index 08e1c358a..3b27a1708 100644 --- a/content/node.b43ce1ab-0d83-463f-9421-d20aaacdd833.yml +++ b/content/node.b43ce1ab-0d83-463f-9421-d20aaacdd833.yml @@ -59,7 +59,7 @@ body:

    With so many free and open source options - there are Drupal, WordPress, Symfony and Laravel just in the PHP ecosystem - why would people use custom or proprietary CMSes or frameworks?

    -

    One reason is vendor lock-in.

    +

    One reason is vendor lock-in.

    If someone is locked into your CMS, framework or hosting platform, it's difficult for them to move away.

    diff --git a/content/node.b43e4c29-4bcf-4cb9-9001-2a9f9f8ec993.yml b/content/node.b43e4c29-4bcf-4cb9-9001-2a9f9f8ec993.yml index d17c0db2c..d71cdca0c 100644 --- a/content/node.b43e4c29-4bcf-4cb9-9001-2a9f9f8ec993.yml +++ b/content/node.b43e4c29-4bcf-4cb9-9001-2a9f9f8ec993.yml @@ -66,7 +66,7 @@ body:

    There will be no further releases of Drupal 9 so you need to upgrade.

    -

    If you're stuck on Drupal 9, 8, or 7, get unstuck with a Drupal upgrade roadmap and get directions how to upgrade to Drupal 10.

    +

    If you're stuck on Drupal 9, 8, or 7, get unstuck with a Drupal upgrade roadmap and get directions how to upgrade to Drupal 10.

    summary: null diff --git a/content/node.b48769b5-0c48-4bee-a008-6a760db421de.yml b/content/node.b48769b5-0c48-4bee-a008-6a760db421de.yml index 5a421fbe0..d876e8d08 100644 --- a/content/node.b48769b5-0c48-4bee-a008-6a760db421de.yml +++ b/content/node.b48769b5-0c48-4bee-a008-6a760db421de.yml @@ -69,7 +69,7 @@ body: format: full_html processed: | -

    Whilst discussing de-jargoning Drupal and Drupalisms with Emma Horrell and Luke McCormick, I started thinking about pieces of jargon I come across regularly.

    +

    Whilst discussing de-jargoning Drupal and Drupalisms with Emma Horrell and Luke McCormick, I started thinking about pieces of jargon I come across regularly.

    Common ones are CI and CD.

    diff --git a/content/node.b51a5709-0942-4244-b857-16e5b43ff2fb.yml b/content/node.b51a5709-0942-4244-b857-16e5b43ff2fb.yml index ca3c90177..88412d443 100644 --- a/content/node.b51a5709-0942-4244-b857-16e5b43ff2fb.yml +++ b/content/node.b51a5709-0942-4244-b857-16e5b43ff2fb.yml @@ -51,7 +51,7 @@ body: format: full_html processed: | -

    Back in episode 11 of the Beyond Blocks podcast, my guest was Mark Conroy and we discussed various things including his Running Plan Generator and the Content Access By Path Drupal module.

    +

    Back in episode 11 of the Beyond Blocks podcast, my guest was Mark Conroy and we discussed various things including his Running Plan Generator and the Content Access By Path Drupal module.

    Written for the LocalGov Drupal distribution, as its name suggests, the module allows for setting permissions to maintain content based on its path.

    diff --git a/content/node.b54ead56-01d3-442f-9689-c422f5be5e27.yml b/content/node.b54ead56-01d3-442f-9689-c422f5be5e27.yml index 1ef268cb4..353cee22d 100644 --- a/content/node.b54ead56-01d3-442f-9689-c422f5be5e27.yml +++ b/content/node.b54ead56-01d3-442f-9689-c422f5be5e27.yml @@ -51,11 +51,11 @@ body: processed: |

    I attended the relaunched PHP Oxford user group meetup this evening, organised by Humand Talent.

    -

    I gave the short version of my talk on the Build Configs tool I've built and used to manage multiple projects' configuration files.

    +

    I gave the short version of my talk on the Build Configs tool I've built and used to manage multiple projects' configuration files.

    As it was a shorter talk, I didn't show the internals slides I did remotely for PHP Muninch on Tuesday evening.

    -

    However, if anyone wants to see the full slides that show some of the Build Configs code, they are online.

    +

    However, if anyone wants to see the full slides that show some of the Build Configs code, they are online.

    As well as the Drupal, Fractal, Drupal Commerce Kickstart and Drupal LocalGov examples on GitHub, I created Symfony and Laravel examples that are still unreleased in private repositories. I plan on reviewing those, making them public soon and continuing to iterate on and improve the Build Configs tool itself - making it more valuable to me and my customers and clients.

    diff --git a/content/node.b5b7cf41-fa32-4c63-a182-9b048c290f05.yml b/content/node.b5b7cf41-fa32-4c63-a182-9b048c290f05.yml index b849ad419..e4ea247eb 100644 --- a/content/node.b5b7cf41-fa32-4c63-a182-9b048c290f05.yml +++ b/content/node.b5b7cf41-fa32-4c63-a182-9b048c290f05.yml @@ -63,7 +63,7 @@ body: format: full_html processed: | -

    Something I mentioned during my podcast episode with Mike Karthauser is a quote I saw recently:

    +

    Something I mentioned during my podcast episode with Mike Karthauser is a quote I saw recently:

    Code is a liability, not an asset.

    diff --git a/content/node.b5e6b353-30b6-42d7-a8f1-ed202131a6f6.yml b/content/node.b5e6b353-30b6-42d7-a8f1-ed202131a6f6.yml index 03ef7dd45..ac6b3ec2d 100644 --- a/content/node.b5e6b353-30b6-42d7-a8f1-ed202131a6f6.yml +++ b/content/node.b5e6b353-30b6-42d7-a8f1-ed202131a6f6.yml @@ -61,7 +61,7 @@ body:

    This makes the code clearer and easier to read and understand, particularly if you aren't using types and need additional context.

    -

    Readability is important as people read more code than they write.

    +

    Readability is important as people read more code than they write.

    summary: null diff --git a/content/node.b61104ef-e514-4518-bec8-a10b1dcbaa4a.yml b/content/node.b61104ef-e514-4518-bec8-a10b1dcbaa4a.yml index a944c5c7b..0c1fac46d 100644 --- a/content/node.b61104ef-e514-4518-bec8-a10b1dcbaa4a.yml +++ b/content/node.b61104ef-e514-4518-bec8-a10b1dcbaa4a.yml @@ -53,9 +53,9 @@ body:

    This version makes the module compatible with Drupal 11 and, as there are no breaking changes, it's still compatible with Drupal 9 and 10.

    -

    It's great to see the module used on many Drupal 8+ websites and distributions such as LocalGov Drupal.

    +

    It's great to see the module used on many Drupal 8+ websites and distributions such as LocalGov Drupal.

    -

    Whilst the overall number of installations has been consistent, the number of Drupal 7 installations has decreased whilst the Drupal 8+ version installations have increased.

    +

    Whilst the overall number of installations has been consistent, the number of Drupal 7 installations has decreased whilst the Drupal 8+ version installations have increased.

    With a Drupal 11-compatible version now available, I hope it continues to increase.

    diff --git a/content/node.b66e30f0-28a1-459d-a0d2-193d1772ece1.yml b/content/node.b66e30f0-28a1-459d-a0d2-193d1772ece1.yml index 5e9f9b3db..cb9ecc7c6 100644 --- a/content/node.b66e30f0-28a1-459d-a0d2-193d1772ece1.yml +++ b/content/node.b66e30f0-28a1-459d-a0d2-193d1772ece1.yml @@ -54,7 +54,7 @@ body: format: full_html processed: | -

    The talk that I gave last week at PHP Stoke was Things to know about PHP - a talk that I was originally asked to give at the Swansea Software Development Meetup (SSDC) in January 2019, and this was the second time that I've been asked to give this talk at a PHP meetup.

    +

    The talk that I gave last week at PHP Stoke was Things to know about PHP - a talk that I was originally asked to give at the Swansea Software Development Meetup (SSDC) in January 2019, and this was the second time that I've been asked to give this talk at a PHP meetup.

    Originally to give a group of various Software Developers an introduction to PHP, I didn't want the talk to be focused just on the language itself and be a walkthough the PHP manual.

    diff --git a/content/node.b68d2c2d-2d78-43c5-b97c-3e57f0308b13.yml b/content/node.b68d2c2d-2d78-43c5-b97c-3e57f0308b13.yml index e6f541ae3..962099653 100644 --- a/content/node.b68d2c2d-2d78-43c5-b97c-3e57f0308b13.yml +++ b/content/node.b68d2c2d-2d78-43c5-b97c-3e57f0308b13.yml @@ -37,6 +37,6 @@ path: body: - value: '

    This week, I was excited to welcome Luke McCormick back to the Beyond Blocks podcast.

    We discussed his Simplify Drupal project and using AI tools, such as the Cursor editor, for web browsing.

    Luke recently gave a talk about this at the Stanford WebCamp conference, so it was great to discuss this further and learn how he''s been using AI in his development workflow.

    Listen to the episode here.

    I have a few new guests lined up, so expect more episodes of the Beyond Blocks podcast in the coming weeks.

    If you want to be a guest on a future episode, reply to this email and let me know.

    ' format: basic_html - processed: '

    This week, I was excited to welcome Luke McCormick back to the Beyond Blocks podcast.

    We discussed his Simplify Drupal project and using AI tools, such as the Cursor editor, for web browsing.

    Luke recently gave a talk about this at the Stanford WebCamp conference, so it was great to discuss this further and learn how he''s been using AI in his development workflow.

    Listen to the episode here.

    I have a few new guests lined up, so expect more episodes of the Beyond Blocks podcast in the coming weeks.

    If you want to be a guest on a future episode, reply to this email and let me know.

    ' + processed: '

    This week, I was excited to welcome Luke McCormick back to the Beyond Blocks podcast.

    We discussed his Simplify Drupal project and using AI tools, such as the Cursor editor, for web browsing.

    Luke recently gave a talk about this at the Stanford WebCamp conference, so it was great to discuss this further and learn how he''s been using AI in his development workflow.

    Listen to the episode here.

    I have a few new guests lined up, so expect more episodes of the Beyond Blocks podcast in the coming weeks.

    If you want to be a guest on a future episode, reply to this email and let me know.

    ' summary: '' field_daily_email_cta: { } diff --git a/content/node.b86c14c0-4dfe-485e-bc8a-d18215ac85a7.yml b/content/node.b86c14c0-4dfe-485e-bc8a-d18215ac85a7.yml index 528b6ce0a..a074053ed 100644 --- a/content/node.b86c14c0-4dfe-485e-bc8a-d18215ac85a7.yml +++ b/content/node.b86c14c0-4dfe-485e-bc8a-d18215ac85a7.yml @@ -49,7 +49,7 @@ body: format: full_html processed: | -

    Now CSS supports variables (aka custom properties) and Tailwind CSS v4 is configured using CSS instead of JavaScript, I've been making heavy use of CSS variables in my front-end code.

    +

    Now CSS supports variables (aka custom properties) and Tailwind CSS v4 is configured using CSS instead of JavaScript, I've been making heavy use of CSS variables in my front-end code.

    I still use Tailwind to do the heavy lifting, but I can use CSS variables to extract themeable classes with variables like --color-primary that can change value based on a data attribute or by something else.

    @@ -57,7 +57,7 @@ body:

    Tailwind has a arbitrary syntax to easily use CSS variables - e.g. bg-(--color-primary) - and you can define one-off variables with [--box-spacing:30px] or [--box-spacing:--spacing(3)] and using the standard arbitrary class syntax.

    -

    CSS variables aren't specific to Tailwind CSS, so if I wasn't using Tailwind in a codebase, I'd use the new native CSS features instead of a preprocessor like Sass.

    +

    CSS variables aren't specific to Tailwind CSS, so if I wasn't using Tailwind in a codebase, I'd use the new native CSS features instead of a preprocessor like Sass.

    summary: null diff --git a/content/node.b892433b-6318-4716-9bb8-fc13e6a55fbb.yml b/content/node.b892433b-6318-4716-9bb8-fc13e6a55fbb.yml index a963bbb91..5678ddd6f 100644 --- a/content/node.b892433b-6318-4716-9bb8-fc13e6a55fbb.yml +++ b/content/node.b892433b-6318-4716-9bb8-fc13e6a55fbb.yml @@ -61,7 +61,7 @@ body: format: full_html processed: | -

    In my recent pair programming session, building components with Tailwind CSS, we experienced another benefit of styling with utility classes.

    +

    In my recent pair programming session, building components with Tailwind CSS, we experienced another benefit of styling with utility classes.

    CSS usually has a global scope, but utility classes change it to a local scope.

    diff --git a/content/node.b89f02aa-5ed5-4e1f-a8b0-c5d98e6ee439.yml b/content/node.b89f02aa-5ed5-4e1f-a8b0-c5d98e6ee439.yml index e242496a1..d7eff8c61 100644 --- a/content/node.b89f02aa-5ed5-4e1f-a8b0-c5d98e6ee439.yml +++ b/content/node.b89f02aa-5ed5-4e1f-a8b0-c5d98e6ee439.yml @@ -66,7 +66,7 @@ body:

    You may have a lot of custom code that needs to be ported to Drupal 10 or a complex data structure that needs to be migrated, These things will take time, so it's best not to leave it until the last minute.

    -

    If you're stuck on Drupal 7, book an upgrade consultation call with me or purchase an upgrade roadmap for your project and I'll get you unstuck.

    +

    If you're stuck on Drupal 7, book an upgrade consultation call with me or purchase an upgrade roadmap for your project and I'll get you unstuck.

    summary: null diff --git a/content/node.ba4ccfb6-f00d-4fb2-8519-aa43356218f6.yml b/content/node.ba4ccfb6-f00d-4fb2-8519-aa43356218f6.yml index 7c23155da..a94d2d5ab 100644 --- a/content/node.ba4ccfb6-f00d-4fb2-8519-aa43356218f6.yml +++ b/content/node.ba4ccfb6-f00d-4fb2-8519-aa43356218f6.yml @@ -57,7 +57,7 @@ body: format: full_html processed: | -

    Over a year ago, I posted that I was switching to using Neovim full-time for my development work.

    +

    Over a year ago, I posted that I was switching to using Neovim full-time for my development work.

    I'd used Vim one file at a time on remote servers, and added Vim plugins in other IDEs and editors, so I was already familiar with a lot of the key bindings and motions before I decided to use it full-time.

    diff --git a/content/node.ba897799-0b8a-4c3d-b3f1-f3a0e4e2b25a.yml b/content/node.ba897799-0b8a-4c3d-b3f1-f3a0e4e2b25a.yml index 468c31e00..8fb7f54f7 100644 --- a/content/node.ba897799-0b8a-4c3d-b3f1-f3a0e4e2b25a.yml +++ b/content/node.ba897799-0b8a-4c3d-b3f1-f3a0e4e2b25a.yml @@ -51,7 +51,7 @@ body:

    I wrote it to generate configuration files, such as PHPUnit, PHPStan and PHPCS files, Dockerfiles, Docker Compose files and others, for personal and client projects - namely Drupal, Symfony and Sculpin projects - instead of writing them by hand every time and making them easier to maintain.

    -

    I've used it for my Docker examples on GitHub done live streams where I've re-explored Behat and given talks on the project, so it made sense to open-source it and release it publicly.

    +

    I've used it for my Docker examples on GitHub done live streams where I've re-explored Behat and given talks on the project, so it made sense to open-source it and release it publicly.

    There are still more I'd like to do with it, including improving documentation and adding examples, but if you'd like to contribute to it, contributions and pull requests are welcome.

    diff --git a/content/node.baa04acc-64aa-435e-b012-1af94d0b0cf1.yml b/content/node.baa04acc-64aa-435e-b012-1af94d0b0cf1.yml index 8f895269d..d5fb1ad0e 100644 --- a/content/node.baa04acc-64aa-435e-b012-1af94d0b0cf1.yml +++ b/content/node.baa04acc-64aa-435e-b012-1af94d0b0cf1.yml @@ -58,7 +58,7 @@ body: processed: |

    A few months ago, TJ DeVries (a Neovim core team member) coined the phrase "Personalised Development Environment" or PDE.

    -

    I've been using Neovim full-time since July 2021 - starting with no configuration to configuring it with Vimscript and later with Lua - setting options like line numbers and relative numbers, tabs and spaces, and indent and fold levels.

    +

    I've been using Neovim full-time since July 2021 - starting with no configuration to configuring it with Vimscript and later with Lua - setting options like line numbers and relative numbers, tabs and spaces, and indent and fold levels.

    I evaluated and installed some initial plugins to add functionality that I needed. Some of them I still use, and some I've replaced with alternative plugins or built-in solutions that have been included in newer versions of Neovim.

    diff --git a/content/node.baa99cce-a9bf-442d-8c24-ea0eb92fbb25.yml b/content/node.baa99cce-a9bf-442d-8c24-ea0eb92fbb25.yml index abaff29d4..dd449da29 100644 --- a/content/node.baa99cce-a9bf-442d-8c24-ea0eb92fbb25.yml +++ b/content/node.baa99cce-a9bf-442d-8c24-ea0eb92fbb25.yml @@ -51,7 +51,7 @@ body: format: full_html processed: | -

    Something I've said when speaking about Tailwind CSS and also during my recent consulting engagement, is that you can build dramatically different-looking UIs even though you're using the same class names.

    +

    Something I've said when speaking about Tailwind CSS and also during my recent consulting engagement, is that you can build dramatically different-looking UIs even though you're using the same class names.

    For example, I've rebuilt the Bartik theme, the Acquia hosting dashboard and various other UIs for talk demos - none of which look the same or are even similar.

    diff --git a/content/node.bc747939-87ef-409b-bb1e-48c94863579c.yml b/content/node.bc747939-87ef-409b-bb1e-48c94863579c.yml index 2fb491d77..01fb84afc 100644 --- a/content/node.bc747939-87ef-409b-bb1e-48c94863579c.yml +++ b/content/node.bc747939-87ef-409b-bb1e-48c94863579c.yml @@ -59,7 +59,7 @@ body: format: full_html processed: | -

    I previously wrote about how to change gray to grey in Tailwind CSS.

    +

    I previously wrote about how to change gray to grey in Tailwind CSS.

    So, instead of writing bg-gray-200, I could write bg-grey-200.

    diff --git a/content/node.bcfa962f-c9ea-4346-b10c-4317932097c7.yml b/content/node.bcfa962f-c9ea-4346-b10c-4317932097c7.yml index 6be752f3b..bbbb2ff38 100644 --- a/content/node.bcfa962f-c9ea-4346-b10c-4317932097c7.yml +++ b/content/node.bcfa962f-c9ea-4346-b10c-4317932097c7.yml @@ -71,7 +71,7 @@ body:

    Something I've been considering organising are online Drupal mob contribution sessions, where people can work on tasks together in a mob programming approach.

    -

    Not working on Drupal applications (although, I offer paid pair programming sessions), this would be for contributing to Drupal core, contrib projects, or initiatives like Starshot or LocalGov Drupal.

    +

    Not working on Drupal applications (although, I offer paid pair programming sessions), this would be for contributing to Drupal core, contrib projects, or initiatives like Starshot or LocalGov Drupal.

    If you have ideas or feedback, or if this is something you'd be interested in attending, reply and let me know!

    diff --git a/content/node.bd0ab1a7-853f-44dd-a29f-967b3808e132.yml b/content/node.bd0ab1a7-853f-44dd-a29f-967b3808e132.yml index 99119b8bb..83fa4c4aa 100644 --- a/content/node.bd0ab1a7-853f-44dd-a29f-967b3808e132.yml +++ b/content/node.bd0ab1a7-853f-44dd-a29f-967b3808e132.yml @@ -51,7 +51,7 @@ body:

    This talk will be on Sculpin - a static site generator written in PHP.

    -

    I first presented a Sculpin talk at DrupalCamp North in July 2015 while learning Twig before Drupal 8.

    +

    I first presented a Sculpin talk at DrupalCamp North in July 2015 while learning Twig before Drupal 8.

    If you'd like a sneak peek of the demo site I'm building, it's on GitHub, and I posted a screenshot on Twitter.

    diff --git a/content/node.be331d8c-cc1c-404d-9764-7304a5309c80.yml b/content/node.be331d8c-cc1c-404d-9764-7304a5309c80.yml index 255078308..332e312b4 100644 --- a/content/node.be331d8c-cc1c-404d-9764-7304a5309c80.yml +++ b/content/node.be331d8c-cc1c-404d-9764-7304a5309c80.yml @@ -47,11 +47,11 @@ body: format: full_html processed: | -

    In this week's episode of the Beyond Blocks podcast, I'm joined by Chris Ballard to discuss generative AI in PHP following his talk at PHP South West.

    +

    In this week's episode of the Beyond Blocks podcast, I'm joined by Chris Ballard to discuss generative AI in PHP following his talk at PHP South West.

    We also talked about attending and speaking at meetups and live coding, and I spoke about some of the AI-related content I saw presented at DrupalCon Barcelona.

    -

    Listen to the episode now.

    +

    Listen to the episode now.

    If you'd like to be a guest on the podcast or want to suggest a topic, reply and let me know!

    diff --git a/content/node.befd9d9c-edd5-483e-b378-b3867451769d.yml b/content/node.befd9d9c-edd5-483e-b378-b3867451769d.yml index b80ee55d6..e91b427ce 100644 --- a/content/node.befd9d9c-edd5-483e-b378-b3867451769d.yml +++ b/content/node.befd9d9c-edd5-483e-b378-b3867451769d.yml @@ -61,7 +61,7 @@ body: format: full_html processed: | -

    In April 2023, I wondered if we'd see a 7.100 release of Drupal.

    +

    In April 2023, I wondered if we'd see a 7.100 release of Drupal.

    I just noticed that we did.

    diff --git a/content/node.bf04ca43-aaa4-4877-a1df-80042934a312.yml b/content/node.bf04ca43-aaa4-4877-a1df-80042934a312.yml index f35a12476..f5cc72808 100644 --- a/content/node.bf04ca43-aaa4-4877-a1df-80042934a312.yml +++ b/content/node.bf04ca43-aaa4-4877-a1df-80042934a312.yml @@ -50,7 +50,7 @@ body: format: full_html processed: | -

    After sending yesterday's email, Dave Hall replied with a LinkedIn comment I liked and wanted to share (done with permission):

    +

    After sending yesterday's email, Dave Hall replied with a LinkedIn comment I liked and wanted to share (done with permission):

    In theory I can drive my car on the motorway, blind folded while not wearing a seat belt. It sounds really exciting and loads of fun. When something goes wrong it gets really messy.

    diff --git a/content/node.c027d77e-97c4-43eb-99cd-672dedcf8f14.yml b/content/node.c027d77e-97c4-43eb-99cd-672dedcf8f14.yml index f17642a8a..4c478ece3 100644 --- a/content/node.c027d77e-97c4-43eb-99cd-672dedcf8f14.yml +++ b/content/node.c027d77e-97c4-43eb-99cd-672dedcf8f14.yml @@ -51,7 +51,7 @@ body: format: full_html processed: | -

    I built my Build Configs tool because I only wanted to write a file once and re-use it instead of writing it over again or copying and pasting between projects.

    +

    I built my Build Configs tool because I only wanted to write a file once and re-use it instead of writing it over again or copying and pasting between projects.

    Having standardised templates for different languages and project types, I can easily set up new projects and get them running in a few minutes.

    diff --git a/content/node.c0cafc33-869f-42e0-9aba-1acb18fee883.yml b/content/node.c0cafc33-869f-42e0-9aba-1acb18fee883.yml index 54041044c..0af0bc378 100644 --- a/content/node.c0cafc33-869f-42e0-9aba-1acb18fee883.yml +++ b/content/node.c0cafc33-869f-42e0-9aba-1acb18fee883.yml @@ -58,12 +58,12 @@ body: format: markdown processed: |

    Automated testing is one of my favourite topics to teach and to speak and write about.

    -

    I write a lot about automated testing and other topics on my daily email list.

    -

    I created a free 10-day email course that covers the basics of automated testing in Drupal in a series of daily lessons.

    +

    I write a lot about automated testing and other topics on my daily email list.

    +

    I created a free 10-day email course that covers the basics of automated testing in Drupal in a series of daily lessons.

    I have spoken at DrupalCons and DrupalCamps about automated testing in Drupal.

    I also have videos and recordings of live streams where I've contributed tests to projects, including Drupal core.

    Hopefully, that gives you enough information to get started.

    -

    If you need more hands-on help, you can hire me for a 1-on-1 consulting call, pair programming session or a private talk or workshop to get you up and running.

    +

    If you need more hands-on help, you can hire me for a 1-on-1 consulting call, pair programming session or a private talk or workshop to get you up and running.

    summary: '' field_seo_analysis: - status: '0' diff --git a/content/node.c1064abb-f7f8-4e4d-bfb7-9842271b0938.yml b/content/node.c1064abb-f7f8-4e4d-bfb7-9842271b0938.yml index 20ec430de..f6c8d9747 100644 --- a/content/node.c1064abb-f7f8-4e4d-bfb7-9842271b0938.yml +++ b/content/node.c1064abb-f7f8-4e4d-bfb7-9842271b0938.yml @@ -55,7 +55,7 @@ body: format: full_html processed: | -

    As well as causing merge conflicts, feature branches slow the delivery of new features.

    +

    As well as causing merge conflicts, feature branches slow the delivery of new features.

    Someone needs to be responsible for merging the branches once they've been reviewed and approved, and any further merges into release branches.

    @@ -67,7 +67,7 @@ body:

    In a trunk-based environment, there's only one branch and everyone can commit and push to it.

    -

    And, if you're doing continuous delivery, any changes will be automatically deployed.

    +

    And, if you're doing continuous delivery, any changes will be automatically deployed.

    No more bottleneck.

    diff --git a/content/node.c1bc355c-4dfb-4ea0-a98e-9801871107f2.yml b/content/node.c1bc355c-4dfb-4ea0-a98e-9801871107f2.yml index 9f48dd8b1..fa50268c0 100644 --- a/content/node.c1bc355c-4dfb-4ea0-a98e-9801871107f2.yml +++ b/content/node.c1bc355c-4dfb-4ea0-a98e-9801871107f2.yml @@ -56,11 +56,11 @@ body: processed: |

    Tailwind CSS is based on the "utility-first" approach, where the majority of styling is done using utility CSS classes. You can still add additional custom styles if needed if there is something that can't be achieved with utilities or would be better placed in a custom CSS stylesheet.

    -

    Utility-last is the opposite approach, where a small number of utilities are used alongside other CSS styles or another framework. This is common when adding a utility-based framework like Tailwind CSS to an existing project and you want to use it for a new page or component whilst keeping the existing styles.

    +

    Utility-last is the opposite approach, where a small number of utilities are used alongside other CSS styles or another framework. This is common when adding a utility-based framework like Tailwind CSS to an existing project and you want to use it for a new page or component whilst keeping the existing styles.

    This is what I did when I started learning Tachyons, and later Tailwind CSS. My project already had styling from another CSS framework, I started using utility classes and over time refactored until only utilities were used and the other styles could be removed.

    -

    You could do the opposite too, and refactor groups of utilities into a CSS component, either by using Tailwind's @apply directive or writing a plugin.

    +

    You could do the opposite too, and refactor groups of utilities into a CSS component, either by using Tailwind's @apply directive or writing a plugin.

    If you did want to use Tailwind for a small number of utilities, by default, it will only generate classes that are used within HTML or template files, but it can also be configured to only use the core modules that you specify - preventing Developers from using unwanted utility based on the rules for that project.

    diff --git a/content/node.c1bf1868-5c9b-4ab9-8565-3e6340c8fb65.yml b/content/node.c1bf1868-5c9b-4ab9-8565-3e6340c8fb65.yml index bc6ad8fc5..647c3f8a4 100644 --- a/content/node.c1bf1868-5c9b-4ab9-8565-3e6340c8fb65.yml +++ b/content/node.c1bf1868-5c9b-4ab9-8565-3e6340c8fb65.yml @@ -54,7 +54,7 @@ body: format: full_html processed: | -

    In January, I wrote about using plain text files for to-do lists instead of larger and more complex project management tools.

    +

    In January, I wrote about using plain text files for to-do lists instead of larger and more complex project management tools.

    I found an example of this in the code repository for st, the simple terminal from suckless.org.

    diff --git a/content/node.c28c0731-5f76-4b55-8326-a584e385e8cb.yml b/content/node.c28c0731-5f76-4b55-8326-a584e385e8cb.yml index 507c35a47..ed33bd249 100644 --- a/content/node.c28c0731-5f76-4b55-8326-a584e385e8cb.yml +++ b/content/node.c28c0731-5f76-4b55-8326-a584e385e8cb.yml @@ -51,7 +51,7 @@ body: format: full_html processed: | -

    In my Test-Driven Drupal talk slides, I show a screenshot of a tweet from February 2012 by Tim Millwood asking if anyone wanted to maintain the Override Node Options module.

    +

    In my Test-Driven Drupal talk slides, I show a screenshot of a tweet from February 2012 by Tim Millwood asking if anyone wanted to maintain the Override Node Options module.

    I said yes and took over maintainership.

    diff --git a/content/node.c337a375-7fec-45d9-ad89-60ece71c2194.yml b/content/node.c337a375-7fec-45d9-ad89-60ece71c2194.yml index 599c5d059..54b4b288f 100644 --- a/content/node.c337a375-7fec-45d9-ad89-60ece71c2194.yml +++ b/content/node.c337a375-7fec-45d9-ad89-60ece71c2194.yml @@ -78,7 +78,7 @@ body: format: markdown processed: |

    Yesterday, I asked whether class names should include suffixes or be named a certain way in your application.

    -

    I said that consistency is key.

    +

    I said that consistency is key.

    But how do you enforce these rules to keep things consistent?

    It could be done manually in a code review or pair programming session, but it would be better if it could be automated.

    Similar to phpcs for code linting and automated tests that ensure functionality works as expected, architectural tests allow you to define and run your own architectural rules.

    diff --git a/content/node.c373d98a-0558-4f14-a58f-e253e43c3435.yml b/content/node.c373d98a-0558-4f14-a58f-e253e43c3435.yml index 902ba8298..93975677d 100644 --- a/content/node.c373d98a-0558-4f14-a58f-e253e43c3435.yml +++ b/content/node.c373d98a-0558-4f14-a58f-e253e43c3435.yml @@ -54,7 +54,7 @@ body: format: full_html processed: | -

    The answer to "Should Drupal 7 support be extended again?" might depend on who you ask.

    +

    The answer to "Should Drupal 7 support be extended again?" might depend on who you ask.

    If you ask a Developer or agency, the answer would likely be that it shouldn't be extended again, and D7 should be sunsetted.

    @@ -66,7 +66,7 @@ body:

    That would be messy (and costly) to fix, though!

    -

    P.S. Are you still using Drupal 7 and don’t know what’s involved to upgrade to Drupal 10? Book a Drupal 7 upgrade consultation call.

    +

    P.S. Are you still using Drupal 7 and don’t know what’s involved to upgrade to Drupal 10? Book a Drupal 7 upgrade consultation call.

    summary: null diff --git a/content/node.c6bc2e2d-1817-4856-9e5d-5a5136963485.yml b/content/node.c6bc2e2d-1817-4856-9e5d-5a5136963485.yml index b97ced758..8bc1940ce 100644 --- a/content/node.c6bc2e2d-1817-4856-9e5d-5a5136963485.yml +++ b/content/node.c6bc2e2d-1817-4856-9e5d-5a5136963485.yml @@ -58,13 +58,13 @@ body:

    PHP Stoke

    -

    The first PHP Stoke meetup will be held at Genr8 Smithfield Works on the 12th of January. I'll be presenting "Things you should know about PHP". It'll be great to be the first speaker at this new meetup.

    +

    The first PHP Stoke meetup will be held at Genr8 Smithfield Works on the 12th of January. I'll be presenting "Things you should know about PHP". It'll be great to be the first speaker at this new meetup.

    nor(DEV):con

    The Norfolk Developers conference is in Norwich on the 23rd and 24th of February.

    -

    I'll be presenting "Taking Flight about Tailwind CSS". It's been a while since I last gave this talk so I'm looking forward to updating it with the latest changes and new features in Tailwind CSS.

    +

    I'll be presenting "Taking Flight about Tailwind CSS". It's been a while since I last gave this talk so I'm looking forward to updating it with the latest changes and new features in Tailwind CSS.

    It'll be great to be speaking at these events and hopefully others in 2023.

    diff --git a/content/node.c72430aa-0c6d-4cf8-8a43-812d245ea73d.yml b/content/node.c72430aa-0c6d-4cf8-8a43-812d245ea73d.yml index 14b378eeb..907c66620 100644 --- a/content/node.c72430aa-0c6d-4cf8-8a43-812d245ea73d.yml +++ b/content/node.c72430aa-0c6d-4cf8-8a43-812d245ea73d.yml @@ -98,7 +98,7 @@ body: format: full_html processed: | -

    A few days ago, I mentioned a method that was over 150 lines long.

    +

    A few days ago, I mentioned a method that was over 150 lines long.

    It had too many responsibilities, nested conditions, no dependency injection and no tests.

    diff --git a/content/node.c74de3cf-5362-4d08-935a-a9d0d22fcb94.yml b/content/node.c74de3cf-5362-4d08-935a-a9d0d22fcb94.yml index 09832a908..00efb4dab 100644 --- a/content/node.c74de3cf-5362-4d08-935a-a9d0d22fcb94.yml +++ b/content/node.c74de3cf-5362-4d08-935a-a9d0d22fcb94.yml @@ -38,5 +38,5 @@ path: body: - value: '

    P.S. Do you need help or want another pair of eyes on your code? Book a 1-on-1 consulting call or an online pair programming session with a 100% money-back guarantee.,

    ' format: basic_html - processed: '

    P.S. Do you need help or want another pair of eyes on your code? Book a 1-on-1 consulting call or an online pair programming session with a 100% money-back guarantee.,

    ' + processed: '

    P.S. Do you need help or want another pair of eyes on your code? Book a 1-on-1 consulting call or an online pair programming session with a 100% money-back guarantee.,

    ' summary: '' diff --git a/content/node.c7ad84af-f5c8-4ff8-92cd-873528acc623.yml b/content/node.c7ad84af-f5c8-4ff8-92cd-873528acc623.yml index b85b7fba3..285a89cfc 100644 --- a/content/node.c7ad84af-f5c8-4ff8-92cd-873528acc623.yml +++ b/content/node.c7ad84af-f5c8-4ff8-92cd-873528acc623.yml @@ -61,15 +61,15 @@ body:

    I do this to avoid having contaminated commits that contain multiple changes. Each commit should be related to one change.

    -

    You can use git add -p to review, stage and commit parts of your changes, but as the uncommitted changes grow, you're less likely to do that and more likely to commit them at once with a generic commit message that offers no value when viewed in the commit log.

    +

    You can use git add -p to review, stage and commit parts of your changes, but as the uncommitted changes grow, you're less likely to do that and more likely to commit them at once with a generic commit message that offers no value when viewed in the commit log.

    You're more likely to create better and more valuable commits and write better commit messages if you break them into chunks and commit the changes as you make them.

    If you have extra files you don't want to commit, add them to a .gitignore file or .git/info/exclude so they're ignored.

    -

    If you have uncommitted changes that you want to hide for now but re-add later, git stash is your friend.

    +

    If you have uncommitted changes that you want to hide for now but re-add later, git stash is your friend.

    -

    If you want your changes to be completely separate, maybe git worktrees are for you.

    +

    If you want your changes to be completely separate, maybe git worktrees are for you.

    summary: null diff --git a/content/node.c7dd2a5b-3a7c-4ab0-8dc2-81f2d2cb8af1.yml b/content/node.c7dd2a5b-3a7c-4ab0-8dc2-81f2d2cb8af1.yml index 4fb8462ea..09c1f38f7 100644 --- a/content/node.c7dd2a5b-3a7c-4ab0-8dc2-81f2d2cb8af1.yml +++ b/content/node.c7dd2a5b-3a7c-4ab0-8dc2-81f2d2cb8af1.yml @@ -57,7 +57,7 @@ body: format: full_html processed: | -

    Yesterday, I shared some of the reasons why I like Drupal and why I use it for the majority of my projects. But, as I said, I don't use it exclusively and for some projects I used various different tools.

    +

    Yesterday, I shared some of the reasons why I like Drupal and why I use it for the majority of my projects. But, as I said, I don't use it exclusively and for some projects I used various different tools.

    Essentially, I always try to recommend and use the best tool for the job.

    @@ -73,7 +73,7 @@ body:

    There are situations though where a tool may be the best choice even though it's not the ideal fit based purely on the technical requirements. Maybe the client is already familiar with publishing content in Drupal, or an in-house development team is used to working with a certain tool or language. In that case, those things should be considered too.

    -

    Also, for me, having a chance to evaluate other technologies and explore what's happening outside of the Drupal ecosystem is a good opportunity. A lot of what I've learned about automated testing, for example, is from the wider PHP and JavaScript communities, as well as tools like Tailwind CSS and Illuminate Collections that I've been able to bring back into my other Drupal projects.

    +

    Also, for me, having a chance to evaluate other technologies and explore what's happening outside of the Drupal ecosystem is a good opportunity. A lot of what I've learned about automated testing, for example, is from the wider PHP and JavaScript communities, as well as tools like Tailwind CSS and Illuminate Collections that I've been able to bring back into my other Drupal projects.

    summary: null diff --git a/content/node.c7e013f4-a712-4566-9e6e-6a4b1f580e30.yml b/content/node.c7e013f4-a712-4566-9e6e-6a4b1f580e30.yml index add48fa7f..484c2cdda 100644 --- a/content/node.c7e013f4-a712-4566-9e6e-6a4b1f580e30.yml +++ b/content/node.c7e013f4-a712-4566-9e6e-6a4b1f580e30.yml @@ -77,7 +77,7 @@ body: [2]: https://code.oliverdavies.uk/opdavies/drupal-nix-flake-example format: markdown processed: | -

    If you're working on a simple PHP application, a simple development shell with PHP and Composer may be enough.

    +

    If you're working on a simple PHP application, a simple development shell with PHP and Composer may be enough.

    But what if you're building a more complex application, like a Drupal website?

    As well as PHP, it needs services like a database server.

    Installing mysql or mariadb isn't enough - it needs to be running so your application can connect to it.

    diff --git a/content/node.c87318b5-eb27-4eba-a3d4-a5328f362c9d.yml b/content/node.c87318b5-eb27-4eba-a3d4-a5328f362c9d.yml index a90bd2e73..919b5dbab 100644 --- a/content/node.c87318b5-eb27-4eba-a3d4-a5328f362c9d.yml +++ b/content/node.c87318b5-eb27-4eba-a3d4-a5328f362c9d.yml @@ -49,7 +49,7 @@ body: format: full_html processed: | -

    In yesterday's email, I wondered whether Drush should be added to Drupal core.

    +

    In yesterday's email, I wondered whether Drush should be added to Drupal core.

    I've used Drush for as long as I've used Drupal so, to me, it would be an obvious thing to consider.

    diff --git a/content/node.c8fd5532-9338-4ea0-933f-798ce5782931.yml b/content/node.c8fd5532-9338-4ea0-933f-798ce5782931.yml index cda012774..ff8da1543 100644 --- a/content/node.c8fd5532-9338-4ea0-933f-798ce5782931.yml +++ b/content/node.c8fd5532-9338-4ea0-933f-798ce5782931.yml @@ -65,7 +65,7 @@ body:

    Asking these questions and making these initial decisions upfront greatly reduces my implementation time as I only need to focus on delivering what I've already planned.

    -

    And I can capture these decisions in a README file or diagram, that's ideal.

    +

    And I can capture these decisions in a README file or diagram, that's ideal.

    summary: null diff --git a/content/node.c99cc7ef-20b0-4743-9638-61cb4beeb5ec.yml b/content/node.c99cc7ef-20b0-4743-9638-61cb4beeb5ec.yml index d0855d4d1..85bb70391 100644 --- a/content/node.c99cc7ef-20b0-4743-9638-61cb4beeb5ec.yml +++ b/content/node.c99cc7ef-20b0-4743-9638-61cb4beeb5ec.yml @@ -59,7 +59,7 @@ body: format: full_html processed: | -

    The other day, I posted about a script I'd written that found the longest commit message in a repository.

    +

    The other day, I posted about a script I'd written that found the longest commit message in a repository.

    As I couldn't find a native way to do this with Git, the script loops over each commit in the repository, calculates its length and stores the length and commit SHA in a file.

    diff --git a/content/node.c9c11eda-6318-4e7c-b108-a01feea60e45.yml b/content/node.c9c11eda-6318-4e7c-b108-a01feea60e45.yml index e56ecfe9b..d169ba358 100644 --- a/content/node.c9c11eda-6318-4e7c-b108-a01feea60e45.yml +++ b/content/node.c9c11eda-6318-4e7c-b108-a01feea60e45.yml @@ -45,7 +45,7 @@ body: format: full_html processed: | -

    The video of the most recent version of my Building static websites with PHP and Sculpin from February's PHP South West meetup has been released.

    +

    The video of the most recent version of my Building static websites with PHP and Sculpin from February's PHP South West meetup has been released.

    In the talk, I explain what Sculpin is and how it works before a live demo where I rebuild part of the PHPSW website (which I worked on originally).

    diff --git a/content/node.c9c4743b-a803-47b3-8405-f6aeb34a279b.yml b/content/node.c9c4743b-a803-47b3-8405-f6aeb34a279b.yml index dec6021ff..6dd4d05c6 100644 --- a/content/node.c9c4743b-a803-47b3-8405-f6aeb34a279b.yml +++ b/content/node.c9c4743b-a803-47b3-8405-f6aeb34a279b.yml @@ -59,7 +59,7 @@ body:

    Is it before you write any code, or is it something you can start later?

    -

    When starting versa, I was only scaffolding the console commands and running some basic commands such as "composer install" and "phpunit".

    +

    When starting versa, I was only scaffolding the console commands and running some basic commands such as "composer install" and "phpunit".

    At that point, there wasn't any business logic to test.

    diff --git a/content/node.c9ccd7f8-4727-49fa-9481-4507e7986fd9.yml b/content/node.c9ccd7f8-4727-49fa-9481-4507e7986fd9.yml index 53577fa2d..bf401f053 100644 --- a/content/node.c9ccd7f8-4727-49fa-9481-4507e7986fd9.yml +++ b/content/node.c9ccd7f8-4727-49fa-9481-4507e7986fd9.yml @@ -59,9 +59,9 @@ body: format: full_html processed: | -

    Yesterday, I wrote how to create dependency free Collection classes in PHP (thanks to Dan Leech).

    +

    Yesterday, I wrote how to create dependency free Collection classes in PHP (thanks to Dan Leech).

    -

    I said that I've written blog posts and given talks on using Collection classes.

    +

    I said that I've written blog posts and given talks on using Collection classes.

    But why do I like Collections and why may you want to use them instead of native arrays?

    diff --git a/content/node.ca145f06-f0f5-4538-978f-0af3f1c32d73.yml b/content/node.ca145f06-f0f5-4538-978f-0af3f1c32d73.yml index 416663809..e0d9d2f46 100644 --- a/content/node.ca145f06-f0f5-4538-978f-0af3f1c32d73.yml +++ b/content/node.ca145f06-f0f5-4538-978f-0af3f1c32d73.yml @@ -48,7 +48,7 @@ body: format: full_html processed: | -

    This week, I'm starting my own podcast - Beyond Blocks.

    +

    This week, I'm starting my own podcast - Beyond Blocks.

    I'll be interviewing different people in every week, focussing on Drupal and related software development topics.

    diff --git a/content/node.ca7093b6-288d-4326-b755-cc96e0c262dc.yml b/content/node.ca7093b6-288d-4326-b755-cc96e0c262dc.yml index 1006a7db8..2f95d9c72 100644 --- a/content/node.ca7093b6-288d-4326-b755-cc96e0c262dc.yml +++ b/content/node.ca7093b6-288d-4326-b755-cc96e0c262dc.yml @@ -65,7 +65,7 @@ body:

    I've found Peertube instances created by other YouTubers like lukesmithxyz and Veronica Explains.

    -

    Now my homelab is up and running and I'm self-hosting production services like this website and my Forgejo instance, I wanted to host my own Peertube instance to back up my videos and provide an alternative place for people to watch them.

    +

    Now my homelab is up and running and I'm self-hosting production services like this website and my Forgejo instance, I wanted to host my own Peertube instance to back up my videos and provide an alternative place for people to watch them.

    I'm using NixOS for my homelab, which has options for Peertube, so setting it up was easily.

    diff --git a/content/node.cbd099ee-0b05-402b-803d-9753a84a9e83.yml b/content/node.cbd099ee-0b05-402b-803d-9753a84a9e83.yml index ce820bc56..0f49f16c5 100644 --- a/content/node.cbd099ee-0b05-402b-803d-9753a84a9e83.yml +++ b/content/node.cbd099ee-0b05-402b-803d-9753a84a9e83.yml @@ -61,7 +61,7 @@ body: format: full_html processed: | -

    I recently had Ryan Szrama as a guest on the Beyond Blocks podcast.

    +

    I recently had Ryan Szrama as a guest on the Beyond Blocks podcast.

    Ryan is the CEO of Centarro - the company behind Drupal Commerce, the eCommerce platform built on the Drupal CMS.

    diff --git a/content/node.cbfe0f07-d0fc-46d0-950f-167a091e020d.yml b/content/node.cbfe0f07-d0fc-46d0-950f-167a091e020d.yml index aa7eb7693..d53c1991e 100644 --- a/content/node.cbfe0f07-d0fc-46d0-950f-167a091e020d.yml +++ b/content/node.cbfe0f07-d0fc-46d0-950f-167a091e020d.yml @@ -54,7 +54,7 @@ body: format: full_html processed: | -

    If you have multiple implementations of a service, as I mentioned in yesterday's email, you need to ensure they all provide the same functionality.

    +

    If you have multiple implementations of a service, as I mentioned in yesterday's email, you need to ensure they all provide the same functionality.

    You need to be able to run the same tests against each implementation and have them pass.

    diff --git a/content/node.cc44360f-4d47-4899-9f3b-d4a88c4f7eca.yml b/content/node.cc44360f-4d47-4899-9f3b-d4a88c4f7eca.yml index d0e0ae47f..efcfa151b 100644 --- a/content/node.cc44360f-4d47-4899-9f3b-d4a88c4f7eca.yml +++ b/content/node.cc44360f-4d47-4899-9f3b-d4a88c4f7eca.yml @@ -76,7 +76,7 @@ body: format: full_html processed: | -

    Because I do trunk-based development, I typically don't create branches in Git.

    +

    Because I do trunk-based development, I typically don't create branches in Git.

    If I do, I usually want to keep the commit messages, but there are some situations where I want to squash everything into a single commit with a simple message.

    diff --git a/content/node.cd3df6ff-471f-4b56-af7c-9b9a6588367e.yml b/content/node.cd3df6ff-471f-4b56-af7c-9b9a6588367e.yml index c38030b00..5c8da9a16 100644 --- a/content/node.cd3df6ff-471f-4b56-af7c-9b9a6588367e.yml +++ b/content/node.cd3df6ff-471f-4b56-af7c-9b9a6588367e.yml @@ -69,11 +69,11 @@ body: processed: |

    I'm a long-time Vim and tmux user.

    -

    I used them before I switched to using Neovim full time in July 2021.

    +

    I used them before I switched to using Neovim full time in July 2021.

    More recently, I've used a script that creates and attaches to tmux sessions based on the directories in my Code directory, making it easy to switch between projects.

    -

    It was based on others by Jess Archer and ThePrimeagen, although Prime recently created a new version of his as its own project, so I decided to switch to his version.

    +

    It was based on others by Jess Archer and ThePrimeagen, although Prime recently created a new version of his as its own project, so I decided to switch to his version.

    But there was one issue - the paths to search for directory names is hard-coded and don't match mine.

    diff --git a/content/node.cd57083c-1262-450a-aab2-b03fa36456d2.yml b/content/node.cd57083c-1262-450a-aab2-b03fa36456d2.yml index f0a0b773e..18e22ae8c 100644 --- a/content/node.cd57083c-1262-450a-aab2-b03fa36456d2.yml +++ b/content/node.cd57083c-1262-450a-aab2-b03fa36456d2.yml @@ -62,7 +62,7 @@ body:

    I'm proud that over a year of that time was spent working for the Drupal Association where I improved the Drupal.org websites and resolved issues that would have blocked the Drupal 8 release in 2015.

    -

    I'm also happy to have presented talks and workshops at events like DrupalCamps, Drupal Developer Days and twice at DrupalCon. I've also organised Drupal events such as the Drupal Bristol meetup and DrupalCamp Bristol conference.

    +

    I'm also happy to have presented talks and workshops at events like DrupalCamps, Drupal Developer Days and twice at DrupalCon. I've also organised Drupal events such as the Drupal Bristol meetup and DrupalCamp Bristol conference.

    I've had opportunities to contribute to open-source by having patches committed to Drupal core and maintaining modules and themes like Override Node Options and the Tailwind CSS starter kit. I've also mentored and helped others to get their first commits to Drupal core and open-source.

    diff --git a/content/node.cdfbc891-17fa-45e3-9ea6-b0b1bc6defd2.yml b/content/node.cdfbc891-17fa-45e3-9ea6-b0b1bc6defd2.yml index 1471d6189..86d993021 100644 --- a/content/node.cdfbc891-17fa-45e3-9ea6-b0b1bc6defd2.yml +++ b/content/node.cdfbc891-17fa-45e3-9ea6-b0b1bc6defd2.yml @@ -144,7 +144,7 @@ body:

    In the example, to pass arguments to the drush command, I'd have to type ARGS="cache:rebuild" make drush for them to get added and the command to work as expected.

    -

    An agency that I worked for created and open-sourced their own Makefile-like tool, written in PHP and built on Symfony Console. I gave a talk on it called Working with Workspace and used it on some of my own personal and client projects.

    +

    An agency that I worked for created and open-sourced their own Makefile-like tool, written in PHP and built on Symfony Console. I gave a talk on it called Working with Workspace and used it on some of my own personal and client projects.

    What I'm using now

    diff --git a/content/node.ce877341-4025-4610-89b6-f1f4c9bfe5af.yml b/content/node.ce877341-4025-4610-89b6-f1f4c9bfe5af.yml index c784fc502..05b884be1 100644 --- a/content/node.ce877341-4025-4610-89b6-f1f4c9bfe5af.yml +++ b/content/node.ce877341-4025-4610-89b6-f1f4c9bfe5af.yml @@ -65,7 +65,7 @@ body:

    It could be a suboptimal implementation.

    -

    I mention in my test-driven drupal talk when I wrote some code that worked locally but didn't work because of the hosting setup and I had to rewrite the code in a different and less optimal way.

    +

    I mention in my test-driven drupal talk when I wrote some code that worked locally but didn't work because of the hosting setup and I had to rewrite the code in a different and less optimal way.

    How do you build confidence around this code?

    diff --git a/content/node.ceb12b38-cafc-4b9e-90dc-a2d0236bd180.yml b/content/node.ceb12b38-cafc-4b9e-90dc-a2d0236bd180.yml index 2f257cd73..320406c83 100644 --- a/content/node.ceb12b38-cafc-4b9e-90dc-a2d0236bd180.yml +++ b/content/node.ceb12b38-cafc-4b9e-90dc-a2d0236bd180.yml @@ -59,7 +59,7 @@ body:

    I have keybindings in Neovim to run the current test, the previous test or the entire test file, which means I can easily run a test with a couple of key presses and without needing to change applications or to a different terminal.

    -

    I do the same when working on presentation slides, and need to compile the reStructuredText document into a PDF using rst2pdf.

    +

    I do the same when working on presentation slides, and need to compile the reStructuredText document into a PDF using rst2pdf.

    I also use watchers with entr - commands that watch for changes, such as a file being saved, and running a command. This means I can also have my tests run automatically whenever I change a file.

    diff --git a/content/node.d047a824-fbb1-40b0-8391-ceba0cc250f5.yml b/content/node.d047a824-fbb1-40b0-8391-ceba0cc250f5.yml index 8c475752f..3f1975205 100644 --- a/content/node.d047a824-fbb1-40b0-8391-ceba0cc250f5.yml +++ b/content/node.d047a824-fbb1-40b0-8391-ceba0cc250f5.yml @@ -59,7 +59,7 @@ body: format: full_html processed: | -

    One of my earliest daily emails was about run files - files that contain Bash functions that combine or simplify project-specific tasks.

    +

    One of my earliest daily emails was about run files - files that contain Bash functions that combine or simplify project-specific tasks.

    In Drupal projects, these could be to execute Composer or Drush commands, connect to the database, or run automated tests.

    diff --git a/content/node.d06d1e0c-2e71-4928-922f-c587f712a8e9.yml b/content/node.d06d1e0c-2e71-4928-922f-c587f712a8e9.yml index 75c177a93..fd7fb74ec 100644 --- a/content/node.d06d1e0c-2e71-4928-922f-c587f712a8e9.yml +++ b/content/node.d06d1e0c-2e71-4928-922f-c587f712a8e9.yml @@ -131,7 +131,7 @@ body:
    -

    Want to learn more about how I use Ansible? Register for my upcoming free email course.

    +

    Want to learn more about how I use Ansible? Register for my upcoming free email course.

    summary: null diff --git a/content/node.d0cabfc7-0a42-4d21-a028-eb1220bfece8.yml b/content/node.d0cabfc7-0a42-4d21-a028-eb1220bfece8.yml index 3bfe66eb1..c67ace61a 100644 --- a/content/node.d0cabfc7-0a42-4d21-a028-eb1220bfece8.yml +++ b/content/node.d0cabfc7-0a42-4d21-a028-eb1220bfece8.yml @@ -61,7 +61,7 @@ body: format: full_html processed: | -

    Yesterday, I mentioned the 50/72 rule when writing Git commit messages.

    +

    Yesterday, I mentioned the 50/72 rule when writing Git commit messages.

    The first line in the commit message is the subject line and should be no longer than 50 characters.

    @@ -73,7 +73,7 @@ body:

    The commit will work and not be rejected when pushing to your remote repository.

    -

    There are likely post-commit Git hooks to do this, but by default, things will work.

    +

    There are likely post-commit Git hooks to do this, but by default, things will work.

    A commit message to Drupal core today was 178 characters long, including the issue ID and contributors.

    diff --git a/content/node.d0cc3427-9501-4857-93e4-d2153b18ebe5.yml b/content/node.d0cc3427-9501-4857-93e4-d2153b18ebe5.yml index 61863905b..6edfe04c9 100644 --- a/content/node.d0cc3427-9501-4857-93e4-d2153b18ebe5.yml +++ b/content/node.d0cc3427-9501-4857-93e4-d2153b18ebe5.yml @@ -60,7 +60,7 @@ body:
  • The Violinist Teams module
  • Behat
  • Feature Flags
  • -
  • Deployments vs releases
  • +
  • Deployments vs releases
  • summary: '' field_episode_number: diff --git a/content/node.d1633911-dff9-4079-a0cb-5efe70d9a1fb.yml b/content/node.d1633911-dff9-4079-a0cb-5efe70d9a1fb.yml index a42bf7f55..2dc5e8d00 100644 --- a/content/node.d1633911-dff9-4079-a0cb-5efe70d9a1fb.yml +++ b/content/node.d1633911-dff9-4079-a0cb-5efe70d9a1fb.yml @@ -58,7 +58,7 @@ body:

    Thank you, Matt, for being the first guest on the Beyond Blocks podcast.

    -

    I have other guests booked for this week, so the episode with Matt will be published soon.

    +

    I have other guests booked for this week, so the episode with Matt will be published soon.

    summary: null diff --git a/content/node.d344a28e-aa79-4533-8eac-f112926fe811.yml b/content/node.d344a28e-aa79-4533-8eac-f112926fe811.yml index 283033b6a..850058b7e 100644 --- a/content/node.d344a28e-aa79-4533-8eac-f112926fe811.yml +++ b/content/node.d344a28e-aa79-4533-8eac-f112926fe811.yml @@ -57,7 +57,7 @@ body: format: full_html processed: | -

    I like the Sculpin static site generator - a tool I've used for various personal and client projects where a full content management system like Drupal isn't need.

    +

    I like the Sculpin static site generator - a tool I've used for various personal and client projects where a full content management system like Drupal isn't need.

    It's written in PHP and uses several Symfony components, including Twig for templating.

    diff --git a/content/node.d411d43b-7c61-4fa1-b41b-4e7ec5eb862c.yml b/content/node.d411d43b-7c61-4fa1-b41b-4e7ec5eb862c.yml index 0bf36bc07..28ba58afb 100644 --- a/content/node.d411d43b-7c61-4fa1-b41b-4e7ec5eb862c.yml +++ b/content/node.d411d43b-7c61-4fa1-b41b-4e7ec5eb862c.yml @@ -52,14 +52,14 @@ body: format: full_html processed: | -

    I recently spoke with Mark Conroy, Director of Development at Annertech, on the Beyond Blocks podcast. +

    I recently spoke with Mark Conroy, Director of Development at Annertech, on the Beyond Blocks podcast. We discussed building something useful in a day and building design systems with web components.

    Inspired by that conversation, I spent this afternoon experimenting with web components and seeing how I could use them within a design system we're building, as I think they can solve a particular need we have.

    Following that, I thought I'd see how I could build my own design system and decided to do it with Symfony and see what I could achieve within a few hours.

    -

    It was a great opportunity to take Symfony 7 for a spin and explore and test some things that Ryan Weaver and I discussed in our episode, such as Symfony UX and Twig components.

    +

    It was a great opportunity to take Symfony 7 for a spin and explore and test some things that Ryan Weaver and I discussed in our episode, such as Symfony UX and Twig components.

    Each component is a Twig component with its own PHP class and Twig template, which is rendered when I visit its URL, and I can use the HTML-like <twig:Logo /> syntax to include child components.

    diff --git a/content/node.d473b252-b668-40bc-b744-68ea259702fc.yml b/content/node.d473b252-b668-40bc-b744-68ea259702fc.yml index df1330aee..efd30a130 100644 --- a/content/node.d473b252-b668-40bc-b744-68ea259702fc.yml +++ b/content/node.d473b252-b668-40bc-b744-68ea259702fc.yml @@ -58,7 +58,7 @@ body:
  • Ed Crompton on Drupal.org
  • 'Oxfam country sites: From big bang to small batch delivery'
  • Oxfam.org
  • -
  • https://cambodia.oxfam.org
  • +
  • https://cambodia.oxfam.org
  • Pattern Lab
  • Fractal
  • Twig
  • diff --git a/content/node.d4e3757c-36f7-45f7-a679-6292e8300200.yml b/content/node.d4e3757c-36f7-45f7-a679-6292e8300200.yml index bdf7104ec..bb1324331 100644 --- a/content/node.d4e3757c-36f7-45f7-a679-6292e8300200.yml +++ b/content/node.d4e3757c-36f7-45f7-a679-6292e8300200.yml @@ -53,7 +53,7 @@ body: format: full_html processed: | -

    Last month, I released the Beyond Blocks podcast episode where I spoke with Mark Conroy.

    +

    Last month, I released the Beyond Blocks podcast episode where I spoke with Mark Conroy.

    We spoke about a number of things, including the 'Content Access by Path' Drupal module he wrote, and I promised I'd write some automated tests for it as there weren't any at the time.

    diff --git a/content/node.d5d658e0-0785-4d47-a171-d736073375ae.yml b/content/node.d5d658e0-0785-4d47-a171-d736073375ae.yml index 473dbb167..52934d3a5 100644 --- a/content/node.d5d658e0-0785-4d47-a171-d736073375ae.yml +++ b/content/node.d5d658e0-0785-4d47-a171-d736073375ae.yml @@ -60,15 +60,15 @@ body:
  • Jürgen on Drupal.org
  • The ECA module
  • The BPMN.iO module
  • -
  • Drupal Events, Conditions and Actions with Jürgen Haas
  • +
  • Drupal Events, Conditions and Actions with Jürgen Haas
  • Drupal Remote Dashboard
  • Drupal Recipes
  • -
  • Discussing Drupal CMS Recipes with Gareth Alexander
  • +
  • Discussing Drupal CMS Recipes with Gareth Alexander
  • Drupal CMS
  • -
  • Discussing Drupalisms with Emma Horrell and Luke McCormick
  • +
  • Discussing Drupalisms with Emma Horrell and Luke McCormick
  • Model Context Protocol
  • The Model Context Protocol module
  • -
  • Using AI tools for web coding with Luke McCormick
  • +
  • Using AI tools for web coding with Luke McCormick
  • summary: '' field_episode_number: diff --git a/content/node.d613376e-133d-4730-86f1-70661d24c7ff.yml b/content/node.d613376e-133d-4730-86f1-70661d24c7ff.yml index 3e14c64ff..e92aaba07 100644 --- a/content/node.d613376e-133d-4730-86f1-70661d24c7ff.yml +++ b/content/node.d613376e-133d-4730-86f1-70661d24c7ff.yml @@ -51,11 +51,11 @@ body: format: full_html processed: | -

    Yesterday I explained that Nix, or specifically NixOS, can be used to manage your entire operating system in a declarative and reproducible way.

    +

    Yesterday I explained that Nix, or specifically NixOS, can be used to manage your entire operating system in a declarative and reproducible way.

    My initial experience was running it on my laptop as a replacement for another Linux distribution, which I use to configure everything about my laptop and development environment, including my i3 window manager, Neovim and tmux configurations.

    -

    I recently also started to use it on a new VPS to host several static websites, including this one and various examples I've created as demos or for presentations.

    +

    I recently also started to use it on a new VPS to host several static websites, including this one and various examples I've created as demos or for presentations.

    Similarly to my laptop, I was able to declaratively install any required utilities, enable the Nginx web server, open firewall ports, add my virtual hosts and create and apply the required SSL certificates.

    diff --git a/content/node.d6363924-78ee-4086-8cf0-41e07c030fd4.yml b/content/node.d6363924-78ee-4086-8cf0-41e07c030fd4.yml index 61069231e..ef1d219ef 100644 --- a/content/node.d6363924-78ee-4086-8cf0-41e07c030fd4.yml +++ b/content/node.d6363924-78ee-4086-8cf0-41e07c030fd4.yml @@ -146,7 +146,7 @@ body: format: full_html processed: | -

    Static site generators like Sculpin don't have a database like Drupal.

    +

    Static site generators like Sculpin don't have a database like Drupal.

    The files are the database.

    @@ -156,7 +156,7 @@ body:

    It's very easy and fast for me to find an old daily email, blog post or article I've written when I need to.

    -

    This is also why I use rst2pdf for my presentation slides and write them in reStructured text. It's very fast to find and re-use content.

    +

    This is also why I use rst2pdf for my presentation slides and write them in reStructured text. It's very fast to find and re-use content.

    Counting my presentations

    @@ -251,7 +251,7 @@ body: 104
    -

    This isn't how I'm calculating this on my website (I'm using a custom Twig extension in Sculpin for that), but this is an example of how multiple command line utilities can work together to perform a task - made possible using the static files from my website.

    +

    This isn't how I'm calculating this on my website (I'm using a custom Twig extension in Sculpin for that), but this is an example of how multiple command line utilities can work together to perform a task - made possible using the static files from my website.

    summary: null diff --git a/content/node.d64f0811-a486-4194-99e8-67d21263cb7f.yml b/content/node.d64f0811-a486-4194-99e8-67d21263cb7f.yml index 6bdf1fde9..614f60c0e 100644 --- a/content/node.d64f0811-a486-4194-99e8-67d21263cb7f.yml +++ b/content/node.d64f0811-a486-4194-99e8-67d21263cb7f.yml @@ -53,7 +53,7 @@ body: format: full_html processed: | -

    With Drupal 10.3 released, Drupal 11 will be the next major version.

    +

    With Drupal 10.3 released, Drupal 11 will be the next major version.

    There will be a Drupal 10.4, which will be the first minor maintenance version and supported until Drupal 12's release in 2026.

    diff --git a/content/node.d6c8fb91-1f7d-4931-84e3-e7257a79daf2.yml b/content/node.d6c8fb91-1f7d-4931-84e3-e7257a79daf2.yml index 672f76019..9e9d1bfe9 100644 --- a/content/node.d6c8fb91-1f7d-4931-84e3-e7257a79daf2.yml +++ b/content/node.d6c8fb91-1f7d-4931-84e3-e7257a79daf2.yml @@ -58,7 +58,7 @@ body: format: full_html processed: | -

    As well as configuring servers, you can use Ansible to configure your own local machine and development environment.

    +

    As well as configuring servers, you can use Ansible to configure your own local machine and development environment.

    The change that you need to make is within the hosts.ini file:

    @@ -75,7 +75,7 @@ body:
    -

    Want to learn more about how I use Ansible? Register for my upcoming free email course.

    +

    Want to learn more about how I use Ansible? Register for my upcoming free email course.

    summary: null diff --git a/content/node.d753217f-2d8f-431d-850c-d54597b46b76.yml b/content/node.d753217f-2d8f-431d-850c-d54597b46b76.yml index dfca10a99..7846011dc 100644 --- a/content/node.d753217f-2d8f-431d-850c-d54597b46b76.yml +++ b/content/node.d753217f-2d8f-431d-850c-d54597b46b76.yml @@ -63,7 +63,7 @@ body: format: full_html processed: | -

    In the majority of my flake.nix files, such as the one I've been experimenting with for Drupal projects, I use nixpkgs-unstable as my primary input.

    +

    In the majority of my flake.nix files, such as the one I've been experimenting with for Drupal projects, I use nixpkgs-unstable as my primary input.

    The nixpkgs package manager has two major releases a year, in May and November, which would be 24.05 and 24.11 for 2024 respectively.

    diff --git a/content/node.d7a77497-05c5-4a42-8ecc-e0f171bb8097.yml b/content/node.d7a77497-05c5-4a42-8ecc-e0f171bb8097.yml index 08df865db..5c013cd48 100644 --- a/content/node.d7a77497-05c5-4a42-8ecc-e0f171bb8097.yml +++ b/content/node.d7a77497-05c5-4a42-8ecc-e0f171bb8097.yml @@ -85,7 +85,7 @@ body:

    Then you can recreate any data, such as users or content, that you need or seed the database with standard data.

    -

    For Drupal, I've been using the Default Content module for this, which has been working very well.

    +

    For Drupal, I've been using the Default Content module for this, which has been working very well.

    If I can, I much prefer the install approach rather than importing.

    diff --git a/content/node.d7c36fee-2434-4c3c-95d3-df1303603a35.yml b/content/node.d7c36fee-2434-4c3c-95d3-df1303603a35.yml index 4e466119f..5f511f01d 100644 --- a/content/node.d7c36fee-2434-4c3c-95d3-df1303603a35.yml +++ b/content/node.d7c36fee-2434-4c3c-95d3-df1303603a35.yml @@ -49,13 +49,13 @@ body: format: full_html processed: | -

    Today, Beyond Blocks - the podcast I started last year and has 20 published episodes - passed 1,000 total downloads.

    +

    Today, Beyond Blocks - the podcast I started last year and has 20 published episodes - passed 1,000 total downloads.

    I've had some great guests on the show and discussed some interesting topics so far and I have others recorded and guests lined up for future episodes.

    This week's episode will be with Eirik Morland again - the first returning guest - where we discuss the improvements and changes that have been made to Violinist.io since we spoke in January.

    -

    The first episode with Erik is here if you want to listen to it beforehand.

    +

    The first episode with Erik is here if you want to listen to it beforehand.

    Thanks to all the guests and listeners of the podcast, and if you'd like to be a guest or suggest a topic, reply and let me know.

    diff --git a/content/node.d9a46ea6-4cd5-45a9-9871-5c48d32e1cdb.yml b/content/node.d9a46ea6-4cd5-45a9-9871-5c48d32e1cdb.yml index 0b6bc70b5..4da794c38 100644 --- a/content/node.d9a46ea6-4cd5-45a9-9871-5c48d32e1cdb.yml +++ b/content/node.d9a46ea6-4cd5-45a9-9871-5c48d32e1cdb.yml @@ -52,7 +52,7 @@ body: format: full_html processed: | -

    In yesterday's email, I described the different types of tests available in Drupal and how to determine which test I should use.

    +

    In yesterday's email, I described the different types of tests available in Drupal and how to determine which test I should use.

    I start with functional tests and move to kernel or unit tests when needed, so I usually have more functional tests, some kernel tests and a few unit tests.

    diff --git a/content/node.d9c346b8-279b-4432-9d3a-539a576da4e2.yml b/content/node.d9c346b8-279b-4432-9d3a-539a576da4e2.yml index ec7a0247d..8da65a5d7 100644 --- a/content/node.d9c346b8-279b-4432-9d3a-539a576da4e2.yml +++ b/content/node.d9c346b8-279b-4432-9d3a-539a576da4e2.yml @@ -87,11 +87,11 @@ body:

    Rather than a single string, you could have a file of variables that you want to encrypt. You can do this by running ansible-vault encrypt vault.yml and include it as before. Again, you'll be prompted by Ansible so that it can decrypt and use the values.

    -

    For an example of how I'm using Ansible Vault, see the Dransible repository on GitHub or my Deploying PHP applications with Ansible, Ansible Vault and Ansistrano talk.

    +

    For an example of how I'm using Ansible Vault, see the Dransible repository on GitHub or my Deploying PHP applications with Ansible, Ansible Vault and Ansistrano talk.


    -

    Want to learn more about how I use Ansible? Register for my upcoming free email course.

    +

    Want to learn more about how I use Ansible? Register for my upcoming free email course.

    summary: null diff --git a/content/node.dab13df7-2835-407a-90c5-f5574585718b.yml b/content/node.dab13df7-2835-407a-90c5-f5574585718b.yml index fbb8041c8..4b5144b64 100644 --- a/content/node.dab13df7-2835-407a-90c5-f5574585718b.yml +++ b/content/node.dab13df7-2835-407a-90c5-f5574585718b.yml @@ -55,9 +55,9 @@ body:

    I've recently been doing diagram-driven development, where I start with a diagram and build a flow chart of the functionality, what pieces I'll need and what the information flow or user journey looks like.

    -

    I've been using Mermaid, so the diagrams are easy and quick to create, are version-controlled and a stored in the same code repository.

    +

    I've been using Mermaid, so the diagrams are easy and quick to create, are version-controlled and a stored in the same code repository.

    -

    You can see an example in the Build Configs repository, which is now public and open-source.

    +

    You can see an example in the Build Configs repository, which is now public and open-source.

    Similar to writing the README first, creating a diagram upfront helps me clarify what I'm going to build and how I'm going to do it.

    diff --git a/content/node.dbb959b1-390d-45e8-b080-097a313545d8.yml b/content/node.dbb959b1-390d-45e8-b080-097a313545d8.yml index 0acd2165b..d205dd574 100644 --- a/content/node.dbb959b1-390d-45e8-b080-097a313545d8.yml +++ b/content/node.dbb959b1-390d-45e8-b080-097a313545d8.yml @@ -51,7 +51,7 @@ body:

    Released in January 2011, Drupal 7 will be 14 years old in January and will have outlived Drupal 8 and 9 which are already unsupported.

    -

    There are a lot of Drupal 7 sites still in production, but it's been interesting to see usage numbers for the Override Node Options module decrease for Drupal 7 and increase for Drupal 8+ over the last year.

    +

    There are a lot of Drupal 7 sites still in production, but it's been interesting to see usage numbers for the Override Node Options module decrease for Drupal 7 and increase for Drupal 8+ over the last year.

    I'm excited to see Drupal usage continue to move towards the newer versions so everyone can benefit from the new features and improvements in Drupal 10 and 11 and the new Drupal CMS project.

    diff --git a/content/node.dcaa735c-9ed7-4894-a7bd-ed8931cdd75e.yml b/content/node.dcaa735c-9ed7-4894-a7bd-ed8931cdd75e.yml index 0e9d52367..6e1f42c40 100644 --- a/content/node.dcaa735c-9ed7-4894-a7bd-ed8931cdd75e.yml +++ b/content/node.dcaa735c-9ed7-4894-a7bd-ed8931cdd75e.yml @@ -51,7 +51,7 @@ body: format: full_html processed: | -

    I recently recorded an episode of Beyond Blocks with Yuri Gerasymov, who runs Diffy.

    +

    I recently recorded an episode of Beyond Blocks with Yuri Gerasymov, who runs Diffy.

    He and I discussed visual regression testing, why you'd use it, and some features Diffy offers.

    diff --git a/content/node.dd462165-113a-4b0e-b566-a242cfd475dd.yml b/content/node.dd462165-113a-4b0e-b566-a242cfd475dd.yml index b0770dfc5..5feaa3d3a 100644 --- a/content/node.dd462165-113a-4b0e-b566-a242cfd475dd.yml +++ b/content/node.dd462165-113a-4b0e-b566-a242cfd475dd.yml @@ -49,7 +49,7 @@ body:

    I'm a long-time consumer of Nick's content via his blog, YouTube channel and courses, so it was great to discuss Docker, content creation and more with him.

    -

    Listen to the episode

    +

    Listen to the episode

    summary: null diff --git a/content/node.dea5d550-6603-412d-b1a6-eec70c353b96.yml b/content/node.dea5d550-6603-412d-b1a6-eec70c353b96.yml index 4a83a01df..1554cc37e 100644 --- a/content/node.dea5d550-6603-412d-b1a6-eec70c353b96.yml +++ b/content/node.dea5d550-6603-412d-b1a6-eec70c353b96.yml @@ -52,13 +52,13 @@ body: format: full_html processed: | -

    After writing about using text files for my personal wiki, I've found others who do the same.

    +

    After writing about using text files for my personal wiki, I've found others who do the same.

    Do you know anyone else who uses plain text files for their notes?

    diff --git a/content/node.deaafd9d-8951-41fb-bc84-745a611f3b1b.yml b/content/node.deaafd9d-8951-41fb-bc84-745a611f3b1b.yml index 1de8f58e4..8029de3a2 100644 --- a/content/node.deaafd9d-8951-41fb-bc84-745a611f3b1b.yml +++ b/content/node.deaafd9d-8951-41fb-bc84-745a611f3b1b.yml @@ -47,7 +47,7 @@ body: format: full_html processed: | -

    As well as my consulting and development work, and educational content such as my automated testing email course, I'd like to release something as a project people can use or a SaaS product for people to purchase.

    +

    As well as my consulting and development work, and educational content such as my automated testing email course, I'd like to release something as a project people can use or a SaaS product for people to purchase.

    One of my original ideas was to build a website for speakers to upload and manage their presentations, but I found Symposium.

    diff --git a/content/node.dec2b9a9-a942-420c-ad1c-a41ab979ba6b.yml b/content/node.dec2b9a9-a942-420c-ad1c-a41ab979ba6b.yml index 7cff0bbee..a5284c5e0 100644 --- a/content/node.dec2b9a9-a942-420c-ad1c-a41ab979ba6b.yml +++ b/content/node.dec2b9a9-a942-420c-ad1c-a41ab979ba6b.yml @@ -73,7 +73,7 @@ body: format: full_html processed: | -

    The first conference talk I gave was at DrupalCamp London 2014.

    +

    The first conference talk I gave was at DrupalCamp London 2014.

    The talk was about Git Flow - a popular branching scheme I was using to manage a project, where there are different branches for development and production versions of the software and separate branches for features, releases and hotfixes.

    diff --git a/content/node.dfe87217-dc3b-413c-9e42-912386be5d5f.yml b/content/node.dfe87217-dc3b-413c-9e42-912386be5d5f.yml index 0dca0b693..027c23911 100644 --- a/content/node.dfe87217-dc3b-413c-9e42-912386be5d5f.yml +++ b/content/node.dfe87217-dc3b-413c-9e42-912386be5d5f.yml @@ -47,7 +47,7 @@ body: format: full_html processed: | -

    In yesterday's email, I mentioned that I use watch commands such as nodemon, watchexec and entr whilst developing to run commands automatically when I change code.

    +

    In yesterday's email, I mentioned that I use watch commands such as nodemon, watchexec and entr whilst developing to run commands automatically when I change code.

    For example, running find web/modules/custom | entr ./run test will re-run my test suite when any custom module changes.

    diff --git a/content/node.e00e0cdc-8668-4ca5-86e0-1219332907c0.yml b/content/node.e00e0cdc-8668-4ca5-86e0-1219332907c0.yml index e9a7998f7..a81ef7450 100644 --- a/content/node.e00e0cdc-8668-4ca5-86e0-1219332907c0.yml +++ b/content/node.e00e0cdc-8668-4ca5-86e0-1219332907c0.yml @@ -73,7 +73,7 @@ body:

    A fixed release schedule makes it easier for users and Developers to plan their updates and prepare to upgrade to the major version.

    -

    As Ryan said on a recent episode of Beyond Blocks, "It takes the drama out of open-source".

    +

    As Ryan said on a recent episode of Beyond Blocks, "It takes the drama out of open-source".

    summary: null diff --git a/content/node.e11ce42f-0d2e-4afb-9017-521fde9521a2.yml b/content/node.e11ce42f-0d2e-4afb-9017-521fde9521a2.yml index 332ea6941..8f1db9fab 100644 --- a/content/node.e11ce42f-0d2e-4afb-9017-521fde9521a2.yml +++ b/content/node.e11ce42f-0d2e-4afb-9017-521fde9521a2.yml @@ -78,7 +78,7 @@ body:

    Hit reply and let me know what you think.

    -

    P.S. Are you still using Drupal 7 and don’t know what’s involved to upgrade to Drupal 10? Book a Drupal 7 upgrade consultation call.

    +

    P.S. Are you still using Drupal 7 and don’t know what’s involved to upgrade to Drupal 10? Book a Drupal 7 upgrade consultation call.

    summary: null diff --git a/content/node.e169a4e6-9ebe-437b-90e7-e53f9d559a7f.yml b/content/node.e169a4e6-9ebe-437b-90e7-e53f9d559a7f.yml index 159178455..14e7894b8 100644 --- a/content/node.e169a4e6-9ebe-437b-90e7-e53f9d559a7f.yml +++ b/content/node.e169a4e6-9ebe-437b-90e7-e53f9d559a7f.yml @@ -60,7 +60,7 @@ body: processed: |

    How many TODO comments do you have in your codebase?

    -

    After posting the grep command from the st repository, I decided to check a project I'm working on.

    +

    After posting the grep command from the st repository, I decided to check a project I'm working on.

    Here's the command I ran:

    diff --git a/content/node.e179e840-bd5c-45b3-8bae-2b3706861bb3.yml b/content/node.e179e840-bd5c-45b3-8bae-2b3706861bb3.yml index dc4c1a231..8a4def6af 100644 --- a/content/node.e179e840-bd5c-45b3-8bae-2b3706861bb3.yml +++ b/content/node.e179e840-bd5c-45b3-8bae-2b3706861bb3.yml @@ -57,7 +57,7 @@ body: processed: |

    I'm aware of the ongoing changes to the issue queues on Drupal.org, I haven't contributed or committed as much recently, so I haven't had to use the new approaches, such as issue forks and GitLab merge requests.

    -

    Yesterday, though, I was able to do that whilst submitting the tests I wrote to the Content Access by Path module.

    +

    Yesterday, though, I was able to do that whilst submitting the tests I wrote to the Content Access by Path module.

    I've made many contributions to projects on Drupal.org, including Drupal core and Drupal.org itself, so I'm very familiar with how the issue queues and the patch workflow work.

    diff --git a/content/node.e2679ec1-9cf5-483f-86e0-f176db3daae4.yml b/content/node.e2679ec1-9cf5-483f-86e0-f176db3daae4.yml index 0220a2b80..22b28c6f8 100644 --- a/content/node.e2679ec1-9cf5-483f-86e0-f176db3daae4.yml +++ b/content/node.e2679ec1-9cf5-483f-86e0-f176db3daae4.yml @@ -55,9 +55,9 @@ body: format: full_html processed: | -

    I've been speaking about and advocating for Tailwind CSS and utility-first CSS for a long time.

    +

    I've been speaking about and advocating for Tailwind CSS and utility-first CSS for a long time.

    -

    In my slide deck, I show screenshots of websites that are all built with Tailwind CSS - including some rebuilds of existing websites.

    +

    In my slide deck, I show screenshots of websites that are all built with Tailwind CSS - including some rebuilds of existing websites.

    I do this to show that the same approach and framework can be used to create different-looking designs because the classes are atomic and can be reused and combined as needed.

    diff --git a/content/node.e3f6c728-7855-4804-8614-e2a0c08c368f.yml b/content/node.e3f6c728-7855-4804-8614-e2a0c08c368f.yml index a4b296004..76b3fd41e 100644 --- a/content/node.e3f6c728-7855-4804-8614-e2a0c08c368f.yml +++ b/content/node.e3f6c728-7855-4804-8614-e2a0c08c368f.yml @@ -38,5 +38,5 @@ path: body: - value: '

    P.S. Do you want to learn about automated testing in Drupal? Take my free 10-day email course and get daily lessons straight to your inbox.

    ' format: basic_html - processed: '

    P.S. Do you want to learn about automated testing in Drupal? Take my free 10-day email course and get daily lessons straight to your inbox.

    ' + processed: '

    P.S. Do you want to learn about automated testing in Drupal? Take my free 10-day email course and get daily lessons straight to your inbox.

    ' summary: '' diff --git a/content/node.e7cc391d-fde3-4db8-9f1b-5a4b460cca29.yml b/content/node.e7cc391d-fde3-4db8-9f1b-5a4b460cca29.yml index 1ea5a0b58..d3b62b3b8 100644 --- a/content/node.e7cc391d-fde3-4db8-9f1b-5a4b460cca29.yml +++ b/content/node.e7cc391d-fde3-4db8-9f1b-5a4b460cca29.yml @@ -55,11 +55,11 @@ body: format: full_html processed: | -

    Yesterday, I showed some of the Nix programming language and how to use it to perform tasks such as installing and configuring packages.

    +

    Yesterday, I showed some of the Nix programming language and how to use it to perform tasks such as installing and configuring packages.

    I like this declarative approach as you know everything installed on your system and its configuration.

    -

    There are no random or leftover packages or configuration files.

    +

    There are no random or leftover packages or configuration files.

    The Nix package manager can be installed on Linux or macOS, but you can also use Nix to configure your whole operating system in a declarative way thanks to NixOS.

    diff --git a/content/node.e88b4449-20b6-4165-880b-6d34b9579781.yml b/content/node.e88b4449-20b6-4165-880b-6d34b9579781.yml index 6489f3163..8e2515caa 100644 --- a/content/node.e88b4449-20b6-4165-880b-6d34b9579781.yml +++ b/content/node.e88b4449-20b6-4165-880b-6d34b9579781.yml @@ -61,13 +61,13 @@ body:

    The front-end application would retrieve the data from Drupal via the API and generate the appropriate HTML.

    -

    It's an approach I've used in the past and spoken about at conferences, but it comes with pros and cons.

    +

    It's an approach I've used in the past and spoken about at conferences, but it comes with pros and cons.

    In theory, as the Drupal (or back-end application) and front-end are completely separate, there can be two separate and independent teams working on them.

    This adds overhead and complexity and I've found that one team will commonly be blocking the other instead of both being able to work in parallel.

    -

    As I said yesterday, previewing content in Drupal can be an issue - particularly with a decoupled approach which needs a front-end to be rebuilt before the changes can be seen.

    +

    As I said yesterday, previewing content in Drupal can be an issue - particularly with a decoupled approach which needs a front-end to be rebuilt before the changes can be seen.

    If you have a separate front-end, you'll need to create everything from scratch, such as writing accessible HTML markup and othe standard features that would normally be provided by Drupal and, because you've got two separate front-end and back-end applications, you've got twice the amount of maintenance.

    diff --git a/content/node.e8baa6f7-3c40-4a5e-a7a5-bbb9c8070feb.yml b/content/node.e8baa6f7-3c40-4a5e-a7a5-bbb9c8070feb.yml index 5a556bd6a..648ae6699 100644 --- a/content/node.e8baa6f7-3c40-4a5e-a7a5-bbb9c8070feb.yml +++ b/content/node.e8baa6f7-3c40-4a5e-a7a5-bbb9c8070feb.yml @@ -49,9 +49,9 @@ body: [2]: /podcast/31-modeler-api format: markdown processed: | -

    I recently got to speak again with Jürgen Haas who was my guest on episode 23 of the Beyond Blocks podcast where we discussed the Events, Conditions, Actions (ECA) module.

    +

    I recently got to speak again with Jürgen Haas who was my guest on episode 23 of the Beyond Blocks podcast where we discussed the Events, Conditions, Actions (ECA) module.

    This time, we discussed some of the updates to ECA since we last spoke, but mostly about the new Modeler API module.

    -

    Listen to the episode here.

    +

    Listen to the episode here.

    It was another very interesting conversation and thanks to Jürgen for being on the show again.

    summary: '' field_daily_email_cta: diff --git a/content/node.ea06edab-74a5-42d4-add9-d4dce3d0f792.yml b/content/node.ea06edab-74a5-42d4-add9-d4dce3d0f792.yml index 9d16a382c..d227933e2 100644 --- a/content/node.ea06edab-74a5-42d4-add9-d4dce3d0f792.yml +++ b/content/node.ea06edab-74a5-42d4-add9-d4dce3d0f792.yml @@ -55,7 +55,7 @@ body: format: full_html processed: | -

    Once you have working code, you can refactor it to make it better.

    +

    Once you have working code, you can refactor it to make it better.

    You can rename variables, extract new functions or classes, ensure the code is styled and formatted correctly - anything to make the code easier to read, understand or maintain.

    diff --git a/content/node.eb1fecb1-6d0c-413a-b546-2c2fcf320d94.yml b/content/node.eb1fecb1-6d0c-413a-b546-2c2fcf320d94.yml index 25e65dcae..92f3972d4 100644 --- a/content/node.eb1fecb1-6d0c-413a-b546-2c2fcf320d94.yml +++ b/content/node.eb1fecb1-6d0c-413a-b546-2c2fcf320d94.yml @@ -53,7 +53,7 @@ body: format: full_html processed: | -

    I write and advocate for others to write detailed Git commit messages within the subject body to provide context and information about why the commit was needed, what other options were considered, any consequences or knock-on effects there could be, or even code snippets or pseudo code.

    +

    I write and advocate for others to write detailed Git commit messages within the subject body to provide context and information about why the commit was needed, what other options were considered, any consequences or knock-on effects there could be, or even code snippets or pseudo code.

    Recently, I was curious to know which commit in a repository has the longest commit message, what code has changed in that commit, and who wrote it.

    diff --git a/content/node.ebcaf7c3-e103-448b-aa74-6bb469be0c2d.yml b/content/node.ebcaf7c3-e103-448b-aa74-6bb469be0c2d.yml index c2bc639c8..906e00db0 100644 --- a/content/node.ebcaf7c3-e103-448b-aa74-6bb469be0c2d.yml +++ b/content/node.ebcaf7c3-e103-448b-aa74-6bb469be0c2d.yml @@ -143,7 +143,7 @@ body:

    The downside is that, if everyone isn't using NixOS which handles services, I need to configure the database server for each project, running commands like mysql_install_db and mysqld before creating the database and user to put in the settings.php file.

    -

    It's not complicated but devenv is a great option if you want something more fully featured and opinionated that does more out of the box.

    +

    It's not complicated but devenv is a great option if you want something more fully featured and opinionated that does more out of the box.

    Once the database server is running and Drupal is installed, I can run drush runserver to run the website - no need for Apache, Caddy or Nginx.

    diff --git a/content/node.ebf479a8-f93c-4972-ae90-8b59a0ca8081.yml b/content/node.ebf479a8-f93c-4972-ae90-8b59a0ca8081.yml index d82804719..e2b632d24 100644 --- a/content/node.ebf479a8-f93c-4972-ae90-8b59a0ca8081.yml +++ b/content/node.ebf479a8-f93c-4972-ae90-8b59a0ca8081.yml @@ -55,7 +55,7 @@ body:

    After explaining how to write them, he showed some examples of custom rules - one of which was ensuring a Person class couldn't be created outside of a PersonRepository class.

    -

    This seemed straightforward so I thought about how I could do something similar within my Drupal automated testing email course to check my Drupal code.

    +

    This seemed straightforward so I thought about how I could do something similar within my Drupal automated testing email course to check my Drupal code.

    Similar to Ondřej's example, I wondered if I could enforce that no post nodes should be created outside of the PostBuilder class by searching for any code like Node::create(['type' => 'post']).

    diff --git a/content/node.ec354679-9830-4361-b0eb-16e976e888ce.yml b/content/node.ec354679-9830-4361-b0eb-16e976e888ce.yml index 69115834d..4e5d229eb 100644 --- a/content/node.ec354679-9830-4361-b0eb-16e976e888ce.yml +++ b/content/node.ec354679-9830-4361-b0eb-16e976e888ce.yml @@ -55,11 +55,11 @@ body: format: full_html processed: | -

    A few months ago, Beyond Blocks podcast guest Dan Leech give another talk at the PHP South West user group.

    +

    A few months ago, Beyond Blocks podcast guest Dan Leech give another talk at the PHP South West user group.

    This talk was about building an expression language from scratch, but in one part of the talk, Dan showed how he creates Collection classes.

    -

    I use Collection classes a lot, have given talks about them and wrote a Collections module for Drupal 7.

    +

    I use Collection classes a lot, have given talks about them and wrote a Collections module for Drupal 7.

    In Dan's talk, instead of using a Collection from Laravel or Doctrine, he created his own.

    diff --git a/content/node.ec55d813-d412-4cfd-8ca1-1b3a7ac5ac3d.yml b/content/node.ec55d813-d412-4cfd-8ca1-1b3a7ac5ac3d.yml index 21d0d4a5a..6c15e7167 100644 --- a/content/node.ec55d813-d412-4cfd-8ca1-1b3a7ac5ac3d.yml +++ b/content/node.ec55d813-d412-4cfd-8ca1-1b3a7ac5ac3d.yml @@ -78,11 +78,11 @@ body: [1]: /daily/2025/06/24/php-and-nix-shells format: markdown processed: | -

    Yesterday, I wrote about using Nix to create shells for different versions of PHP.

    +

    Yesterday, I wrote about using Nix to create shells for different versions of PHP.

    The current stable version of Nix has PHP 8.4.8, 8.3.22, 8.2.28 and 8.1.32, but what if you need an older version?

    If it has been in nixpkgs previously, it can still be accessed.

    Nix allows you to create different channels to install different versions of the nixpkgs repository and access different sets of packages.

    -

    With flakes, different versions of nixpkgs can be used as inputs to add multiple releases, such as stable and unstable, or older releases or even a specific Git commit.

    +

    With flakes, different versions of nixpkgs can be used as inputs to add multiple releases, such as stable and unstable, or older releases or even a specific Git commit.

    For example, if I needed to use PHP 7.4 - which is not available in the current release - I could use this flake.nix file:

    {
             inputs = {
    diff --git a/content/node.ec60eda5-4095-465e-a7f7-7bcf1f5bad8a.yml b/content/node.ec60eda5-4095-465e-a7f7-7bcf1f5bad8a.yml
    index 7ccf5520f..d6a2ab5df 100644
    --- a/content/node.ec60eda5-4095-465e-a7f7-7bcf1f5bad8a.yml
    +++ b/content/node.ec60eda5-4095-465e-a7f7-7bcf1f5bad8a.yml
    @@ -71,13 +71,13 @@ body:
     
           

    Particularly if you're doing trunk-based development and everyone works on the same branch.

    -

    This also causes additional upstream commits, because the pipeline has committed a change. If you don't remember to pull those commits, you can end up in a tricky situation.

    +

    This also causes additional upstream commits, because the pipeline has committed a change. If you don't remember to pull those commits, you can end up in a tricky situation.

    I'm also not a fan of having a lot of php-cs-fixer fixes or prettier fixes commits. I'd prefer the commits be correct when they're pushed, if possible, which is why I usually do micro commits locally and tidy things before pushing them.

    -

    If you're working on a topic branch and creating a pull or merge request, you can squash commits when merging, but I'm not a fan of squashing commits, either.

    +

    If you're working on a topic branch and creating a pull or merge request, you can squash commits when merging, but I'm not a fan of squashing commits, either.

    -

    Instead of relying on a CI pipeline to run code formatting, make it easy to run those tasks locally.

    +

    Instead of relying on a CI pipeline to run code formatting, make it easy to run those tasks locally.

    summary: null diff --git a/content/node.ed66b8e2-8b3c-4be4-8cde-eabdfce17709.yml b/content/node.ed66b8e2-8b3c-4be4-8cde-eabdfce17709.yml index 328bf3af5..c311ffc6b 100644 --- a/content/node.ed66b8e2-8b3c-4be4-8cde-eabdfce17709.yml +++ b/content/node.ed66b8e2-8b3c-4be4-8cde-eabdfce17709.yml @@ -50,7 +50,7 @@ body: processed: |

    I’m happy to have had a conference talk proposal accepted for what will be my first in-person conference since DrupalCamp London in February 2020.

    -

    I’ll be giving my "Taking Flight with Tailwind CSS" talk for the first time since February 2021, and in front of an in-person audience since June 2019.

    +

    I’ll be giving my "Taking Flight with Tailwind CSS" talk for the first time since February 2021, and in front of an in-person audience since June 2019.

    The talk itself will need some updating. The last time I gave it, Tailwind CSS was on version 2.0.3. It’s now on version 3.2.2 and includes features like the just-in-time engine, arbitrary values and variants, container queries, and a load of new utility classes.

    diff --git a/content/node.ed7dc940-2eb3-48e1-8c38-fc9c812db5ef.yml b/content/node.ed7dc940-2eb3-48e1-8c38-fc9c812db5ef.yml index 34d219bbd..65c1d68c6 100644 --- a/content/node.ed7dc940-2eb3-48e1-8c38-fc9c812db5ef.yml +++ b/content/node.ed7dc940-2eb3-48e1-8c38-fc9c812db5ef.yml @@ -51,13 +51,13 @@ body: processed: |

    Tomorrow is the first day of cohort 17 of School of Code - a free 16-week software development bootcamp - and I'm happy to be mentoring a student again for my third time.

    -

    I also mentored the winning team at a hack day event in January and spoke at the TechConnect meetup last year.

    +

    I also mentored the winning team at a hack day event in January and spoke at the TechConnect meetup last year.

    Last week, I spoke with George Gordon - a recent School of Code graduate who I met at the hack day and later at another meetup I was speaking at.

    We discussed his experience with coding bootcamps, getting into the software industry and involved with community events and how he found his first Developer job!

    -

    It will be released soon on the Beyond Blocks podcast page.

    +

    It will be released soon on the Beyond Blocks podcast page.

    summary: null diff --git a/content/node.edd8befd-440a-479a-9759-c8f90b4a2528.yml b/content/node.edd8befd-440a-479a-9759-c8f90b4a2528.yml index b5b835571..b7be110f9 100644 --- a/content/node.edd8befd-440a-479a-9759-c8f90b4a2528.yml +++ b/content/node.edd8befd-440a-479a-9759-c8f90b4a2528.yml @@ -50,7 +50,7 @@ body: processed: |

    Last week, I was at the Norfolk Developer's Conference, aka nor(DEV):con - my first in-person conference since DrupalCamp London in February 2020.

    -

    I've been excited about this conference since I received the acceptance email in November, inviting me to give my Taking Flight with Tailwind CSS talk.

    +

    I've been excited about this conference since I received the acceptance email in November, inviting me to give my Taking Flight with Tailwind CSS talk.

    The talk itself went well and included some changes following the Bristol Software Development meetup last month. The last time I gave this talk prior to that was remotely for Nashville PHP in February 2021 and a lot of new things have been added to Tailwind CSS since then for me to include.

    diff --git a/content/node.ee0cdd20-86c9-4ff6-8129-7367e5d9ce2d.yml b/content/node.ee0cdd20-86c9-4ff6-8129-7367e5d9ce2d.yml index 8fa9d3373..52577ae8a 100644 --- a/content/node.ee0cdd20-86c9-4ff6-8129-7367e5d9ce2d.yml +++ b/content/node.ee0cdd20-86c9-4ff6-8129-7367e5d9ce2d.yml @@ -49,7 +49,7 @@ body: format: full_html processed: | -

    If you've experienced issues or are worried about deploying changes to production, on a Friday or another day, when did you last deploy something?

    +

    If you've experienced issues or are worried about deploying changes to production, on a Friday or another day, when did you last deploy something?

    Can you make deployments smaller and more frequent?

    diff --git a/content/node.ef157ce9-4fc5-4441-8592-989b1fcd61b8.yml b/content/node.ef157ce9-4fc5-4441-8592-989b1fcd61b8.yml index 0e1f2f0f5..37343d74e 100644 --- a/content/node.ef157ce9-4fc5-4441-8592-989b1fcd61b8.yml +++ b/content/node.ef157ce9-4fc5-4441-8592-989b1fcd61b8.yml @@ -54,7 +54,7 @@ body: format: full_html processed: | -

    An important thing when using a tool like git bisect as well as reviewing pull/merge requests and commits is to have small (aka "atomic") commits.

    +

    An important thing when using a tool like git bisect as well as reviewing pull/merge requests and commits is to have small (aka "atomic") commits.

    Commits with small changes make them easier to review and, if needed, to revert and debug with bisect. If a commit has ten new or changed lines, it's much easier to see and fix a bug than if the commit had a hundred lines.

    @@ -66,7 +66,7 @@ body:

    As well as the short one-line subject, you can add as much detail as you need to the body of the message about the change that's being committed, why it's needed, what other approaches were considered or tried, as well as links to supporting documentation such as ADRs, technical design documents or diagrams.

    -

    Having as much information as possible makes it much easier when someone needs to review or fix a specific commit. I like to use the conventional commits specification, though the main objective is to have all of the information documented so it's available in the future.

    +

    Having as much information as possible makes it much easier when someone needs to review or fix a specific commit. I like to use the conventional commits specification, though the main objective is to have all of the information documented so it's available in the future.

    summary: null diff --git a/content/node.f076aa19-9261-4d21-8fbc-f330d9d4e87a.yml b/content/node.f076aa19-9261-4d21-8fbc-f330d9d4e87a.yml index 98b1eca4b..42b452a08 100644 --- a/content/node.f076aa19-9261-4d21-8fbc-f330d9d4e87a.yml +++ b/content/node.f076aa19-9261-4d21-8fbc-f330d9d4e87a.yml @@ -50,7 +50,7 @@ body: format: full_html processed: | -

    After previously looking at the LocalGov Drupal distribution, today I added a LocalGov Drupal example to my Docker Examples repository.

    +

    After previously looking at the LocalGov Drupal distribution, today I added a LocalGov Drupal example to my Docker Examples repository.

    Based on the Drupal 10 example, the LocalGov Drupal example used Composer's create-project command to scaffold the project plus some additional configuration files such as the Dockerfile, docker-compose.yaml and a justfile.

    diff --git a/content/node.f0fe2425-0fca-41a3-8ca8-67953798b7a5.yml b/content/node.f0fe2425-0fca-41a3-8ca8-67953798b7a5.yml index 73a8a41bd..863ed7602 100644 --- a/content/node.f0fe2425-0fca-41a3-8ca8-67953798b7a5.yml +++ b/content/node.f0fe2425-0fca-41a3-8ca8-67953798b7a5.yml @@ -51,13 +51,13 @@ body: processed: |

    Instead of using tools like Docker or nvm to manage dependencies for your projects, you can use Nix instead.

    -

    Creating a Nix shell or flake for each project with its dependencies will install everything without needing containers and with the benefit of everything being locked to specific versions, making environments reproducible.

    +

    Creating a Nix shell or flake for each project with its dependencies will install everything without needing containers and with the benefit of everything being locked to specific versions, making environments reproducible.

    If you need a specific version of PHP or node for a project, it will be available and different versions can be used for other projects.

    And if you need services like MySQL and you're not using NixOS, you can also use devenv to manage services, tasks and processes for each project.

    -

    For me, Nix and devenv have replaced Docker and Docker Compose on my development projects.

    +

    For me, Nix and devenv have replaced Docker and Docker Compose on my development projects.

    summary: null diff --git a/content/node.f2220fec-35de-40a7-be72-9b3b643e15df.yml b/content/node.f2220fec-35de-40a7-be72-9b3b643e15df.yml index 30e177047..152be2c6a 100644 --- a/content/node.f2220fec-35de-40a7-be72-9b3b643e15df.yml +++ b/content/node.f2220fec-35de-40a7-be72-9b3b643e15df.yml @@ -53,7 +53,7 @@ body: format: full_html processed: | -

    In yesterday's email, I showed how I've been using Nix and flake files to build reproducible and shareable development environments for Drupal applications.

    +

    In yesterday's email, I showed how I've been using Nix and flake files to build reproducible and shareable development environments for Drupal applications.

    The reason it's reproducible is the flake.lock file.

    diff --git a/content/node.f229a8b2-9561-4e7d-ad3f-de8acd5a78a3.yml b/content/node.f229a8b2-9561-4e7d-ad3f-de8acd5a78a3.yml index 35f2d22ef..15af89677 100644 --- a/content/node.f229a8b2-9561-4e7d-ad3f-de8acd5a78a3.yml +++ b/content/node.f229a8b2-9561-4e7d-ad3f-de8acd5a78a3.yml @@ -53,7 +53,7 @@ body: format: full_html processed: | -

    In February, I spoke at the PHP South West meetup about Sculpin - a static site generator written in PHP.

    +

    In February, I spoke at the PHP South West meetup about Sculpin - a static site generator written in PHP.

    Sculpin uses Twig, HTML and Markdown to generate static HTML files that you can upload to any web server.

    diff --git a/content/node.f245814b-3957-4c84-82fb-47134c3edd24.yml b/content/node.f245814b-3957-4c84-82fb-47134c3edd24.yml index 9306a0f95..630533548 100644 --- a/content/node.f245814b-3957-4c84-82fb-47134c3edd24.yml +++ b/content/node.f245814b-3957-4c84-82fb-47134c3edd24.yml @@ -51,7 +51,7 @@ body:

    I was originally going to attend in person, but after injuring my foot last week, I can't travel so will have to join remotely.

    -

    I'm going to be giving a talk and demo of automated testing and test-driven development with Drupal as well as some Q&A and pair programming, if time allows and we're able to do so remotely.

    +

    I'm going to be giving a talk and demo of automated testing and test-driven development with Drupal as well as some Q&A and pair programming, if time allows and we're able to do so remotely.

    RSVPs are still open for the event and hopefully I'll get to attend Drupal London in person in the future.

    diff --git a/content/node.f3e4ac1a-f18d-4047-ab65-cdd7f6b31c7a.yml b/content/node.f3e4ac1a-f18d-4047-ab65-cdd7f6b31c7a.yml index 6bc18cdbc..55fa73cf7 100644 --- a/content/node.f3e4ac1a-f18d-4047-ab65-cdd7f6b31c7a.yml +++ b/content/node.f3e4ac1a-f18d-4047-ab65-cdd7f6b31c7a.yml @@ -53,7 +53,7 @@ body: format: full_html processed: | -

    A few days ago, I asked how many pre-production environments you have for your software application.

    +

    A few days ago, I asked how many pre-production environments you have for your software application.

    But did you include each Developer's local environment?

    @@ -63,7 +63,7 @@ body:

    Each Developer's local or development site is an environment too.

    -

    They also need to be easily updatable and consistent with the other environments, but they are often overlooked or forgotten.

    +

    They also need to be easily updatable and consistent with the other environments, but they are often overlooked or forgotten.

    When was the last time you or your Developers updated your local environment?

    diff --git a/content/node.f3e69f27-6b57-434e-a50a-308e99838872.yml b/content/node.f3e69f27-6b57-434e-a50a-308e99838872.yml index 313ad6b1d..822e47c99 100644 --- a/content/node.f3e69f27-6b57-434e-a50a-308e99838872.yml +++ b/content/node.f3e69f27-6b57-434e-a50a-308e99838872.yml @@ -217,7 +217,7 @@ body:

    Each talk is its own derivation, so I can run nix run .#test-driven-drupal and it will generate the appropriate PDF file for me to present or share.

    -

    The source code is available at https://code.oliverdavies.uk/opdavies/talks if you want to see how I use rst2pdf to create my presentations and I've even given a presentation about how I create presentations.

    +

    The source code is available at https://code.oliverdavies.uk/opdavies/talks if you want to see how I use rst2pdf to create my presentations and I've even given a presentation about how I create presentations.

    summary: null diff --git a/content/node.f451e001-95a4-4c6c-94e0-cdbcda175b7b.yml b/content/node.f451e001-95a4-4c6c-94e0-cdbcda175b7b.yml index 4c6530b8c..ceb972f42 100644 --- a/content/node.f451e001-95a4-4c6c-94e0-cdbcda175b7b.yml +++ b/content/node.f451e001-95a4-4c6c-94e0-cdbcda175b7b.yml @@ -50,7 +50,7 @@ body: format: full_html processed: | -

    Today, I released the first episode of the "Beyond Blocks" podcast.

    +

    Today, I released the first episode of the "Beyond Blocks" podcast.

    I spoke with Matt Glaman - Principal Software Engineer at Acquia and author of Retrofit.

    @@ -58,7 +58,7 @@ body:

    I've been aware of Matt and his work for some time, including his work on Drupal Commerce, so it was great to speak with him and for him to be the first guest on the podcast.

    -

    Future episodes will be published online weekly, so feel free to subscribe and let me know if you have feedback, suggestions for future guests and topics, or want to be a guest.

    +

    Future episodes will be published online weekly, so feel free to subscribe and let me know if you have feedback, suggestions for future guests and topics, or want to be a guest.

    summary: null diff --git a/content/node.f4bd3e6c-94cf-4c81-bf3a-63aa743a6639.yml b/content/node.f4bd3e6c-94cf-4c81-bf3a-63aa743a6639.yml index fd5ed0c56..e98f4fd3f 100644 --- a/content/node.f4bd3e6c-94cf-4c81-bf3a-63aa743a6639.yml +++ b/content/node.f4bd3e6c-94cf-4c81-bf3a-63aa743a6639.yml @@ -69,7 +69,7 @@ body: processed: |

    Today, I've been watching the new Upgrading & What's in Symfony 7 video course on SymfonyCasts.

    -

    The first video - recent podcast guest Ryan Weaver - explains how Symfony's release cycle works.

    +

    The first video - recent podcast guest Ryan Weaver - explains how Symfony's release cycle works.

    New feature releases that contain new features are every six months.

    diff --git a/content/node.f4ef1ee9-e2f9-42ff-a210-f0e2ce9aab72.yml b/content/node.f4ef1ee9-e2f9-42ff-a210-f0e2ce9aab72.yml index f1b4f9231..6e8099bb9 100644 --- a/content/node.f4ef1ee9-e2f9-42ff-a210-f0e2ce9aab72.yml +++ b/content/node.f4ef1ee9-e2f9-42ff-a210-f0e2ce9aab72.yml @@ -52,7 +52,7 @@ body: format: full_html processed: | -

    Yesterday's email introduced the different levels that PHPStan offers and which you may want to use on your codebase.

    +

    Yesterday's email introduced the different levels that PHPStan offers and which you may want to use on your codebase.

    In the same way as having a single test is better than none, even if you run PHPStan at the lowest level, it's better than not running it at all.

    @@ -62,7 +62,7 @@ body:

    Basic checks, unknown classes, unknown functions, unknown methods called on $this, wrong number of arguments passed to those methods and functions, always undefined variables

    -

    P.S. If you want to utilise PHPStan and static analysis on your development team and get fewer bugs, I have availability for team coaching. I'll show you how!

    +

    P.S. If you want to utilise PHPStan and static analysis on your development team and get fewer bugs, I have availability for team coaching. I'll show you how!

    summary: null diff --git a/content/node.f86b9901-80da-4765-aa94-3bf6025efde5.yml b/content/node.f86b9901-80da-4765-aa94-3bf6025efde5.yml index 3ad4e6d4f..f0564fff5 100644 --- a/content/node.f86b9901-80da-4765-aa94-3bf6025efde5.yml +++ b/content/node.f86b9901-80da-4765-aa94-3bf6025efde5.yml @@ -65,9 +65,9 @@ body:

    I've also switched back to Nginx which was also easy to migrate my configuration and redirects using the Nix language and NixOS configuration options.

    -

    My website is a static website, mostly generated by Sculpin but there are some pages generated by Tome - a static site generator for Drupal.

    +

    My website is a static website, mostly generated by Sculpin but there are some pages generated by Tome - a static site generator for Drupal.

    -

    I'm migrating my email list archive and daily pages first and will later move my presentations, podcast episodes and old blog posts, but I'm doing it incrementally based on the path so I can do pieces as I can around client work.

    +

    I'm migrating my email list archive and daily pages first and will later move my presentations, podcast episodes and old blog posts, but I'm doing it incrementally based on the path so I can do pieces as I can around client work.

    If you like, you can see my NixOS configuration that includes my laptop and homelab and my Tome repository and keep track as I migrate things across.

    diff --git a/content/node.fa30b239-baa9-46ec-9ea2-4914280dd13b.yml b/content/node.fa30b239-baa9-46ec-9ea2-4914280dd13b.yml index d60425ce6..9e6a3b354 100644 --- a/content/node.fa30b239-baa9-46ec-9ea2-4914280dd13b.yml +++ b/content/node.fa30b239-baa9-46ec-9ea2-4914280dd13b.yml @@ -47,13 +47,13 @@ body: format: full_html processed: | -

    This week, I spoke with Eirik Morland again on the Beyond Blocks podcast about recent improvements to violinist.io, such as team/multi-user subscriptions.

    +

    This week, I spoke with Eirik Morland again on the Beyond Blocks podcast about recent improvements to violinist.io, such as team/multi-user subscriptions.

    -

    Listen to the episode now.

    +

    Listen to the episode now.

    I was great to speak to Eirik again and for him to be the first returning guest on the podcast.

    -

    Listen to the first episode with Eirik.

    +

    Listen to the first episode with Eirik.

    summary: null diff --git a/content/node.fa7b57ee-9af5-49ce-9522-66d54642e219.yml b/content/node.fa7b57ee-9af5-49ce-9522-66d54642e219.yml index edc3442aa..ddce29532 100644 --- a/content/node.fa7b57ee-9af5-49ce-9522-66d54642e219.yml +++ b/content/node.fa7b57ee-9af5-49ce-9522-66d54642e219.yml @@ -53,7 +53,7 @@ body: format: full_html processed: | -

    Technical debt is usually referred to negatively, but technical debt isn't always bad.

    +

    Technical debt is usually referred to negatively, but technical debt isn't always bad.

    The key thing is to know when and why you're taking on technical debt and when it will be addressed.

    diff --git a/content/node.faff03ba-71b2-4b4b-a107-9e7f499eeefd.yml b/content/node.faff03ba-71b2-4b4b-a107-9e7f499eeefd.yml index 917afe706..e5ec68b31 100644 --- a/content/node.faff03ba-71b2-4b4b-a107-9e7f499eeefd.yml +++ b/content/node.faff03ba-71b2-4b4b-a107-9e7f499eeefd.yml @@ -53,7 +53,7 @@ body:

    If you include colleagues' code, logs and CI pipeline output, open-source software, books, courses, tutorials, examples, videos, live streams, meetup and conference talks and blog posts (just to think of some), you definitely read more code than you write.

    -

    Which is why it's important to optimise for readability.

    +

    Which is why it's important to optimise for readability.

    summary: null diff --git a/content/node.fb679f64-e559-4319-9a36-b508bc870415.yml b/content/node.fb679f64-e559-4319-9a36-b508bc870415.yml index b75623077..ce0f77a5e 100644 --- a/content/node.fb679f64-e559-4319-9a36-b508bc870415.yml +++ b/content/node.fb679f64-e559-4319-9a36-b508bc870415.yml @@ -59,7 +59,7 @@ body:

    Most of the time, changes can be made within custom code that won't be overwritten and accidentally lost.

    -

    But in cases where the source code needs to be changed, you can patch files instead.

    +

    But in cases where the source code needs to be changed, you can patch files instead.

    You can commit the patch file to your project to save the changes, but you're responsible for maintaining it and ensuring it applies to any future updates of the code.

    diff --git a/content/node.fb85bcd0-833b-4e23-bab7-4e9ae86075df.yml b/content/node.fb85bcd0-833b-4e23-bab7-4e9ae86075df.yml index 06fb85975..13f486ff5 100644 --- a/content/node.fb85bcd0-833b-4e23-bab7-4e9ae86075df.yml +++ b/content/node.fb85bcd0-833b-4e23-bab7-4e9ae86075df.yml @@ -45,7 +45,7 @@ body: format: full_html processed: | -

    Last week, Mike Karthauser - Senior Software Developer at Huboo - joined me on the Beyond Blocks podcast.

    +

    Last week, Mike Karthauser - Senior Software Developer at Huboo - joined me on the Beyond Blocks podcast.

    Mike also gave a talk recently at the PHP South West meetup on "Testing Legacy" which explained how he works with and tests legacy applications.

    diff --git a/content/node.fe080d63-d163-4e3f-9efc-4ec3c8f9c03c.yml b/content/node.fe080d63-d163-4e3f-9efc-4ec3c8f9c03c.yml index 1ee187fed..be71f62db 100644 --- a/content/node.fe080d63-d163-4e3f-9efc-4ec3c8f9c03c.yml +++ b/content/node.fe080d63-d163-4e3f-9efc-4ec3c8f9c03c.yml @@ -78,7 +78,7 @@ body: format: full_html processed: | -

    After writing about making notes in text files, I came across a video by Nick Janetakis (previous Beyond Blocks podcast guest), showing a simple Bash application he'd written to manage his own plain text notes.

    +

    After writing about making notes in text files, I came across a video by Nick Janetakis (previous Beyond Blocks podcast guest), showing a simple Bash application he'd written to manage his own plain text notes.

    I thought I'd try it, but it wasn't available in the nixpkgs store so I wasn't able to install it.

    diff --git a/content/node.fe168e9f-37bf-4cb4-b42d-1db79938223b.yml b/content/node.fe168e9f-37bf-4cb4-b42d-1db79938223b.yml index 3019a93d9..ef381f760 100644 --- a/content/node.fe168e9f-37bf-4cb4-b42d-1db79938223b.yml +++ b/content/node.fe168e9f-37bf-4cb4-b42d-1db79938223b.yml @@ -51,9 +51,9 @@ body: processed: |

    Today, I met my new mentee from the Drupal Career Online program.

    -

    As well as mentoring at events like DrupalCamps and DrupalCons, I enjoy mentoring and working with new Developers going through bootcamps and training programmes like Drupal Career Online, some who are experienced Developers who are learning a new skill, and some who are learning how to code and are taking their first steps into programming.

    +

    As well as mentoring at events like DrupalCamps and DrupalCons, I enjoy mentoring and working with new Developers going through bootcamps and training programmes like Drupal Career Online, some who are experienced Developers who are learning a new skill, and some who are learning how to code and are taking their first steps into programming.

    -

    I've talked about how I got started programming, but as self-taught Developer, it would have been great to have had a mentor to ask questions of, to help me get me started, and to make sure that I was going down the right track and learning the correct things.

    +

    I've talked about how I got started programming, but as self-taught Developer, it would have been great to have had a mentor to ask questions of, to help me get me started, and to make sure that I was going down the right track and learning the correct things.

    Maybe this is more applicable these days with more people learning and working from home since COVID-19?

    diff --git a/content/node.fe407991-a896-410c-9223-51a7ad43d4d2.yml b/content/node.fe407991-a896-410c-9223-51a7ad43d4d2.yml index f03ccce3c..bf9a700c1 100644 --- a/content/node.fe407991-a896-410c-9223-51a7ad43d4d2.yml +++ b/content/node.fe407991-a896-410c-9223-51a7ad43d4d2.yml @@ -55,7 +55,7 @@ body: format: full_html processed: | -

    In yesterday's email where I wrote about git stash, I mentioned the -p or --patch options.

    +

    In yesterday's email where I wrote about git stash, I mentioned the -p or --patch options.

    When stashing changes, this allows you to interactively select which changes you want to stash and what you don't.

    diff --git a/content/node.fe51bb0f-fbce-4823-be30-c4b3aa4a296c.yml b/content/node.fe51bb0f-fbce-4823-be30-c4b3aa4a296c.yml index f2fbe6a27..e950dd185 100644 --- a/content/node.fe51bb0f-fbce-4823-be30-c4b3aa4a296c.yml +++ b/content/node.fe51bb0f-fbce-4823-be30-c4b3aa4a296c.yml @@ -65,7 +65,7 @@ body:

    Dependencies should be installed with a package manager that generates a lock file like composer.lock or package-lock.json, so use these versions instead of installing versions globally that may be different.

    -

    For PHP or nodejs, I'd suggest using Docker or Nix, which has its own lock file, to make your environment as reproducible and consistent as possible.

    +

    For PHP or nodejs, I'd suggest using Docker or Nix, which has its own lock file, to make your environment as reproducible and consistent as possible.

    summary: null diff --git a/content/node.fe815eab-027d-49db-afd1-e4a21387b2fe.yml b/content/node.fe815eab-027d-49db-afd1-e4a21387b2fe.yml index c881118c3..8e0975529 100644 --- a/content/node.fe815eab-027d-49db-afd1-e4a21387b2fe.yml +++ b/content/node.fe815eab-027d-49db-afd1-e4a21387b2fe.yml @@ -81,7 +81,7 @@ body:

    Having automated tests, using tools like static analysis, and minimising technical debt helps to minimise this, as does having written technical design documents, ADRs or flow charts to ensure consistency and to document the "why" for future Developers.

    -

    P.S. Is your New Year's resolution to deliver better software faster? I have availability for team coaching starting in January 2024 and can help you avoid issues like this in your applications.

    +

    P.S. Is your New Year's resolution to deliver better software faster? I have availability for team coaching starting in January 2024 and can help you avoid issues like this in your applications.

    summary: null diff --git a/content/node.ffa93a1b-f239-4c0a-9f34-50cd6532f353.yml b/content/node.ffa93a1b-f239-4c0a-9f34-50cd6532f353.yml index f3a451b0d..4a29adccb 100644 --- a/content/node.ffa93a1b-f239-4c0a-9f34-50cd6532f353.yml +++ b/content/node.ffa93a1b-f239-4c0a-9f34-50cd6532f353.yml @@ -51,7 +51,7 @@ body: format: full_html processed: | -

    Before fixing yesterday's bug, because I'd written automated tests, I ran them to ensure they were all passing.

    +

    Before fixing yesterday's bug, because I'd written automated tests, I ran them to ensure they were all passing.

    Then, I was able to focus solely on adding the new use case - starting with a failing test to replicate the issue and then getting it to pass.