From c6fa8493df2a2e9d96293a0a86ac137f8527ea7d Mon Sep 17 00:00:00 2001 From: Oliver Davies Date: Thu, 17 Apr 2025 00:48:23 +0100 Subject: [PATCH] Move redirects to a Nix list Move redirects to a Nix list and generate them using a `for` loop for better maintainability. --- .../www.oliverdavies.uk-redirects.caddy | 774 ----- .../vhosts/www.oliverdavies.uk-redirects.nix | 3066 +++++++++++++++++ .../caddy/vhosts/www.oliverdavies.uk.nix | 19 +- 3 files changed, 3083 insertions(+), 776 deletions(-) delete mode 100644 hosts/hetznix/services/caddy/vhosts/www.oliverdavies.uk-redirects.caddy create mode 100644 hosts/hetznix/services/caddy/vhosts/www.oliverdavies.uk-redirects.nix diff --git a/hosts/hetznix/services/caddy/vhosts/www.oliverdavies.uk-redirects.caddy b/hosts/hetznix/services/caddy/vhosts/www.oliverdavies.uk-redirects.caddy deleted file mode 100644 index fc7212df..00000000 --- a/hosts/hetznix/services/caddy/vhosts/www.oliverdavies.uk-redirects.caddy +++ /dev/null @@ -1,774 +0,0 @@ -@articles path_regexp ^/articles/(.*)$ -@talks path_regexp ^/talks/(.*)$ -@talks-archive path_regexp ^/talks/archive/(.*)$ - -redir @articles /blog/{re.1} permanent -redir @talks-archive /presentations/{re.1} permanent -redir @talks /presentations/{re.1} permanent - -redir /10-useful-drupal-6-modules-i-use-every-project /blog/10-useful-drupal-6-modules permanent -redir /2010/04/05/styling-drupal-6s-taxonomy-lists-with-php-css-and-jquery /blog/style-drupal-6s-taxonomy-lists-php-css-jquery permanent -redir /2010/04/28/using-imagecache-and-imagecrop-for-my-portfolio /blog/using-imagecache-imagecrop-my-portfolio permanent -redir /2010/05/29/importing-images-using-the-imagefieldimport-module /blog/quickly-import-multiples-images-using-imagefieldimport-module permanent -redir /2010/06/23/creating-a-block-of-social-media-icons-using-cck-views-and-nodequeue /blog/create-block-social-media-icons-using-cck-views-nodequeue permanent -redir /2010/07/05/thanks /blog/thanks permanent -redir /2010/08/17/create-a-better-photo-gallery-in-drupal-part-2 /blog/create-better-photo-gallery-drupal-part-2 permanent -redir /2014/05/21/git-format-patch /blog/git-format-patch-your-friend permanent -redir /2PxmyqP /articles/examples-of-laravel-collections-in-drupal permanent -redir /39CoG /articles/drupalcamp-london-testing-workshop permanent -redir /3eGQr https://github.com/howToCodeWell/howToCodeWellFM/blob/c927e0b3589f1d7375002f7fd70f0bfc9fc90449/composer.json#L17 permanent -redir /6UhLN https://github.com/opdavies/sculpin-twig-markdown-bundle/pull/1 permanent -redir /6i3YZ https://www.youtube.com/watch?v=vUK5sEbd-dk permanent -redir /9rv0Z https://www.drupal.org/project/override_node_options/issues/3109852 permanent -redir /BhMZi https://git.drupalcode.org/search?utf8=%E2%9C%93&snippets=&scope=&repository_ref=8.x-1.x&search=baz&project_id=23203 permanent -redir /NBi5h https://git.drupalcode.org/search?utf8=%E2%9C%93&search=bar&group_id=&project_id=23203&search_code=true&repository_ref=8.x-1.x&nav_source=navbar permanent -redir /P5KQ5 https://www.npmjs.com/package/tailwindcss-skip-link permanent -redir /S8ZDA /articles/rebuilding-bartik-with-vuejs-tailwind-css-part-2 permanent -redir /Wh48P https://github.com/opdavies/oliverdavies.uk/blob/master/source/_partials/talk/video.html.twig permanent -redir /XbzS2 https://github.com/opdavies/gmail-filter-builder permanent -redir /YK1VH /articles/psr4-autoloading-test-cases-drupal-7 permanent -redir /YilTZ$ https://drupalcamp.london/tickets/training permanent -redir /about / permanent -redir /about/cv /cv permanent -redir /about/speaker /speaker permanent -redir /about/speaker-information /speaker-information permanent -redir /acquia-certifications https://certification.acquia.com/registry?fname=Oliver&lname=Davies&city=&state=&country=United+Kingdom&org=&exam=All permanent -redir /acquia-certified https://certification.acquia.com/?fname=Oliver&lname=Davies permanent -redir /ansible https://galaxy.ansible.com/opdavies permanent -redir /ansible-molecule /articles/test-driven-ansible-role-development-molecule permanent -redir /ansistrano-code https://github.com/opdavies/dransible permanent -redir /ansistrano-demo https://www.youtube.com/watch?v=PLS4ET7FAcU permanent -redir /ansistrano-slides /talks/deploying-php-ansible-ansistrano permanent -redir /archive/2022-08-28/how-started-programming /daily/2022-08-28/how-started-programming permanent -redir /archive/2022/08/20/return-to-offline-meetups-conferences /daily/2022/08/20/return-to-offline-meetups-conferences permanent -redir /archive/2022/08/23/git-gui-command-line /daily/2022/08/23/git-gui-command-line permanent -redir /archive/2022/08/25/why-i-work-in-neovim /daily/2022/08/25/why-i-work-in-neovim permanent -redir /archive/2022/08/26/always-be-learning /daily/2022/08/26/always-be-learning permanent -redir /archive/2022/08/27/giving-back /daily/2022/08/27/giving-back permanent -redir /archive/2022/08/29/why-like-drupal /daily/2022/08/29/why-like-drupal permanent -redir /archive/2022/08/30/why-dont-only-use-drupal /daily/2022/08/30/why-dont-only-use-drupal permanent -redir /archive/2022/08/31/monorepo-or-not /daily/2022/08/31/monorepo-or-not permanent -redir /archive/2022/09/01/conventional-commits-changelogs /daily/2022/09/01/conventional-commits-changelogs permanent -redir /archive/2022/09/02/automating-all-the-things-with-ansible /daily/2022/09/02/automating-all-the-things-with-ansible permanent -redir /archive/2022/09/04/using-ansible-for-server-configuration /daily/2022/09/04/using-ansible-for-server-configuration permanent -redir /archive/2022/09/05/using-ansible-for-local-configuration /daily/2022/09/05/using-ansible-for-local-configuration permanent -redir /archive/2022/09/06/deploying-applications-with-ansible /daily/2022/09/06/deploying-applications-with-ansible permanent -redir /archive/2022/09/07/my-tailwind-css-origin-story /daily/2022/09/07/my-tailwind-css-origin-story permanent -redir /archive/2022/09/08/keeping-secrets-with-ansible-vault /daily/2022/09/08/keeping-secrets-with-ansible-vault permanent -redir /archive/2022/09/09/refactoring-tailwind-component /daily/2022/09/09/refactoring-tailwind-component permanent -redir /archive/2022/09/10/automating-ansible-deployments-ci /daily/2022/09/10/automating-ansible-deployments-ci permanent -redir /archive/2022/09/11/custom-styles-tailwind-css-apply-theme-custom-plugins /daily/2022/09/11/custom-styles-tailwind-css-apply-theme-custom-plugins permanent -redir /archive/2022/09/12/month-/daily-emails daily/2022/09/12/month-daily-emails permanent -redir /archive/2022/09/14/simpletest-drupal-test /daily/2022/09/14/simpletest-drupal-test permanent -redir /archive/2022/09/16/why-mostly-write-functional-and-integration-tests /daily/2022/09/16/why-mostly-write-functional-and-integration-tests permanent -redir /archive/2022/09/17/thoughts-automated-code-formatting /daily/2022/09/17/thoughts-automated-code-formatting permanent -redir /archive/2022/09/19/useful-git-configuration /daily/2022/09/19/useful-git-configuration permanent -redir /archive/2022/09/20/why-like-trunk-based-development /daily/2022/09/20/why-like-trunk-based-development permanent -redir /archive/2022/09/21/being-drupal-contribution-mentor /daily/2022/09/21/being-drupal-contribution-mentor permanent -redir /archive/2022/09/22/releasing-drupal-module-template /daily/2022/09/22/releasing-drupal-module-template permanent -redir /archive/2022/09/23/adrs-technical-design-documents /daily/2022/09/23/adrs-technical-design-documents permanent -redir /archive/2022/09/25/using-component-library-for-front-end-development /daily/2022/09/25/using-component-library-for-front-end-development permanent -redir /archive/2022/09/26/experimenting-with-the-nix-package-manager /daily/2022/09/26/experimenting-with-the-nix-package-manager permanent -redir /archive/2022/09/27/mentoring-with-drupal-career-online /daily/2022/09/27/mentoring-with-drupal-career-online permanent -redir /archive/2022/09/28/mob-programming-php-south-wales /daily/2022/09/28/mob-programming-php-south-wales permanent -redir /archive/2022/09/30/store-wars-vuejs /daily/2022/09/30/store-wars-vuejs permanent -redir /archive/2022/10/12/overcoming-deployment-anxiety /daily/2022/10/12/overcoming-deployment-anxiety permanent -redir /archive/2022/10/17/14-years-drupalorg /daily/2022/10/17/14-years-drupalorg permanent -redir /archive/2022/10/18/pair-mob-programming /daily/2022/10/18/pair-mob-programming permanent -redir /archive/2022/10/20/cherry-picking-commits-is-an-anti-pattern /daily/2022/10/20/cherry-picking-commits-is-an-anti-pattern permanent -redir /archive/2022/10/20/run-vs-task-runners/? /archive/2022/10/19/run-vs-task-runners permanent -redir /archive/2022/10/21/automated-testing-and-test-driven-development-are-not-the-same /daily/2022/10/21/automated-testing-and-test-driven-development-are-not-the-same permanent -redir /archive/2022/10/24/looking-at-localgov-drupal /daily/2022/10/24/looking-at-localgov-drupal permanent -redir /archive/2022/10/25/what-are-drupal-distributions /daily/2022/10/25/what-are-drupal-distributions permanent -redir /archive/2022/10/26/neovim-as-a-personalised-development-environment /daily/2022/10/26/neovim-as-a-personalised-development-environment permanent -redir /archive/2022/10/27/getting-back-into-live-streaming /daily/2022/10/27/getting-back-into-live-streaming permanent -redir /archive/2022/10/28/why-write-framework-agnostic-packages /daily/2022/10/28/why-write-framework-agnostic-packages permanent -redir /archive/2022/10/29/the-open-source-first-development-workflow /daily/2022/10/29/the-open-source-first-development-workflow permanent -redir /archive/2022/10/30/refactoring-one-large-test-into-multiple-smaller-tests /daily/2022/10/30/refactoring-one-large-test-into-multiple-smaller-tests permanent -redir /archive/2022/11/08/are-sprints-incompatible-with-continuous-deployment /daily/2022/11/08/are-sprints-incompatible-with-continuous-deployment permanent -redir /archive/2022/11/09/your-conference-talk-has-been-accepted /daily/2022/11/09/your-conference-talk-has-been-accepted permanent -redir /archive/2022/11/12/building-a-minimum-viable-product-and-managing-technical-debt /daily/2022/11/12/building-a-minimum-viable-product-and-managing-technical-debt permanent -redir /archive/2022/11/12/creating-small-proof-of-concept-application-afternoon /daily/2022/11/12/creating-small-proof-of-concept-application-afternoon permanent -redir /archive/2022/11/13/how-i-manage-multiple-drupal-websites-using-the-same-codebase /daily/2022/11/13/how-i-manage-multiple-drupal-websites-using-the-same-codebase permanent -redir /archive/2022/11/14/camel-case-or-snake-case-for-test-methods /daily/2022/11/14/camel-case-or-snake-case-for-test-methods permanent -redir /archive/2022/11/15/writing-good-automated-test-names /daily/2022/11/15/writing-good-automated-test-names permanent -redir /archive/2022/11/16/why-don't-you-write-automated-tests /daily/2022/11/16/why-don't-you-write-automated-tests permanent -redir /archive/2022/11/17/agnostic-ci-pipelines-with-run-files /daily/2022/11/17/agnostic-ci-pipelines-with-run-files permanent -redir /archive/2022/11/18/one-test-a-day-keeps-bugs-away /daily/2022/11/18/one-test-a-day-keeps-bugs-away permanent -redir /archive/2022/11/19/are-missing-tests-a-blocker-to-refactoring /daily/2022/11/19/are-missing-tests-a-blocker-to-refactoring permanent -redir /archive/2022/11/20/version-controlled-commented-out-code /daily/2022/11/20/version-controlled-commented-out-code permanent -redir /archive/2022/11/21/git-tricks-to-avoid-committing-commented-out-and-other-unneeded-code /daily/2022/11/21/git-tricks-to-avoid-committing-commented-out-and-other-unneeded-code permanent -redir /archive/2022/11/22/tldr /daily/2022/11/22/tldr permanent -redir /archive/2022/11/23/do-you-need-to-branch /daily/2022/11/23/do-you-need-to-branch permanent -redir /archive/2022/11/24/doing-the-simplest-possible-thing /daily/2022/11/24/doing-the-simplest-possible-thing permanent -redir /archive/2022/11/25/plan-then-code /daily/2022/11/25/plan-then-code permanent -redir /archive/2022/11/30/ship-show-or-ask /daily/2022/11/30/ship-show-or-ask permanent -redir /archive/2022/12/01/writing-readable-code /daily/2022/12/01/writing-readable-code permanent -redir /archive/2022/12/02/commit-and-push-something-every-day /daily/2022/12/02/commit-and-push-something-every-day permanent -redir /archive/2022/12/03/what-to-do-with-todo-comments /daily/2022/12/03/what-to-do-with-todo-comments permanent -redir /archive/2022/12/04/writing-why-first-user-stories /daily/2022/12/04/writing-why-first-user-stories permanent -redir /archive/2022/12/05/outcomes-or-output /daily/2022/12/05/outcomes-or-output permanent -redir /archive/2022/12/06/should-you-comment-your-code /daily/2022/12/06/should-you-comment-your-code permanent -redir /archive/2022/12/07/separating-releases-from-deployments-with-feature-flags /daily/2022/12/07/separating-releases-from-deployments-with-feature-flags permanent -redir /archive/2022/12/08/the-decorator-design-pattern /daily/2022/12/08/the-decorator-design-pattern permanent -redir /archive/2022/12/09/how-and-why-i-started-using-postcss /daily/2022/12/09/how-and-why-i-started-using-postcss permanent -redir /archive/2022/12/10/managing-databases-with-neovim-and-docker /daily/2022/12/10/managing-databases-with-neovim-and-docker permanent -redir /archive/2022/12/15/happy-drupal-10-release-day /daily/2022/12/15/happy-drupal-10-release-day permanent -redir /archive/2022/12/20/automating-all-the-things,-including-infrastructure /daily/2022/12/20/automating-all-the-things,-including-infrastructure permanent -redir /archive/2022/12/21/duck-typing /daily/2022/12/21/duck-typing permanent -redir /archive/2022/12/22/the-boy-scout-rule /daily/2022/12/22/the-boy-scout-rule permanent -redir /archive/2022/12/23/speaking-at-php-stoke-and-nordevcon /daily/2022/12/23/speaking-at-php-stoke-and-nordevcon permanent -redir /archive/2022/12/28/debugging-gitignore-rules /daily/2022/12/28/debugging-gitignore-rules permanent -redir /archive/2022/12/29/what-is-the-cost-of-a-bug /daily/2022/12/29/what-is-the-cost-of-a-bug permanent -redir /archive/2022/12/30/tests-are-living-documentation /daily/2022/12/30/tests-are-living-documentation permanent -redir /archive/2022/12/31/just-start-writing /daily/2022/12/31/just-start-writing permanent -redir /archive/2023/01/01/types-and-static-analysis-saved-me-today /daily/2023/01/01/types-and-static-analysis-saved-me-today permanent -redir /archive/2023/01/02/dont-use-arbitrary-values-in-tailwind-css /daily/2023/01/02/dont-use-arbitrary-values-in-tailwind-css permanent -redir /archive/2023/01/03/tailwind-css-extensibility-is-one-of-its-best-features /daily/2023/01/03/tailwind-css-extensibility-is-one-of-its-best-features permanent -redir /archive/2023/01/04/testable-tailwind-css-plugins /daily/2023/01/04/testable-tailwind-css-plugins permanent -redir /archive/2023/01/05/adding-tailwind-to-an-existing-project /daily/2023/01/05/adding-tailwind-to-an-existing-project permanent -redir /archive/2023/01/06/utility-first-or-utility-last /daily/2023/01/06/utility-first-or-utility-last permanent -redir /archive/2023/01/07/reducing-utility-class-duplication /daily/2023/01/07/reducing-utility-class-duplication permanent -redir /archive/2023/01/16/back-after-php-stoke /daily/2023/01/16/back-after-php-stoke permanent -redir /archive/2023/01/17/things-to-know-about-php /daily/2023/01/17/things-to-know-about-php permanent -redir /archive/2023/01/18/drupal-turns-22 /daily/2023/01/18/drupal-turns-22 permanent -redir /archive/2023/01/19/long-term-maintainability-with-utility-classes-and-tailwind-css /daily/2023/01/19/long-term-maintainability-with-utility-classes-and-tailwind-css permanent -redir /archive/2023/01/20/tailwinds-classes-are-your-classes /daily/2023/01/20/tailwinds-classes-are-your-classes permanent -redir /archive/2023/01/21/tailwind-not-just-translating-css-to-utility-classes /daily/2023/01/21/tailwind-not-just-translating-css-to-utility-classes permanent -redir /archive/2023/01/22/building-bootstrap-css-examples-with-tailwind /daily/2023/01/22/building-bootstrap-css-examples-with-tailwind permanent -redir /archive/2023/01/23/debugging-with-git-bisect /daily/2023/01/23/debugging-with-git-bisect permanent -redir /archive/2023/01/24/small-commits-and-good-commit-messges /daily/2023/01/24/small-commits-and-good-commit-messges permanent -redir /archive/2023/01/25/to-squash-or-not-to-squash /daily/2023/01/25/to-squash-or-not-to-squash permanent -redir /archive/2023/02/07/astro-as-a-static-site-generator /daily/2023/02/07/astro-as-a-static-site-generator permanent -redir /archive/2023/02/08/fetching-api-data-with-astro /daily/2023/02/08/fetching-api-data-with-astro permanent -redir /archive/2023/02/09/creating-api-endpoints-with-astro /daily/2023/02/09/creating-api-endpoints-with-astro permanent -redir /archive/2023/02/16/tailwind-css-at-the-bristol-software-development-meetup /daily/2023/02/16/tailwind-css-at-the-bristol-software-development-meetup permanent -redir /archive/2023/02/17/upgrading-my-drupal-example-project-to-drupal-10 /daily/2023/02/17/upgrading-my-drupal-example-project-to-drupal-10 permanent -redir /archive/2023/02/18/drupal-10-version-of-override-node-options /daily/2023/02/18/drupal-10-version-of-override-node-options permanent -redir /archive/2023/02/19/clients-dont-care-which-design-pattern-you-use /daily/2023/02/19/clients-dont-care-which-design-pattern-you-use permanent -redir /archive/2023/02/20/tailwind-why-i-prefer-to-extract-html-components /daily/2023/02/20/tailwind-why-i-prefer-to-extract-html-components permanent -redir /archive/2023/03/01/tailwind-css-at-the-norfolk-developer-conference /daily/2023/03/01/tailwind-css-at-the-norfolk-developer-conference permanent -redir /archive/2023/03/02/busy-working-on-client-projects /daily/2023/03/02/busy-working-on-client-projects permanent -redir /archive/2023/03/03/adding-a-localgov-drupal-example /daily/2023/03/03/adding-a-localgov-drupal-example permanent -redir /archive/2023/03/04/why-i-built-a-tool-to-generate-configuration-files /daily/2023/03/04/why-i-built-a-tool-to-generate-configuration-files permanent -redir /archive/2023/03/05/mentoring-for-school-of-code /daily/2023/03/05/mentoring-for-school-of-code permanent -redir /archive/2023/03/08/automating-infrastructure-with-iac /daily/2023/03/08/automating-infrastructure-with-iac permanent -redir /archive/2023/03/09/in-what-language-should-i-write-my-automation /daily/2023/03/09/in-what-language-should-i-write-my-automation permanent -redir /archive/2023/03/13/what-problem-am-i-trying-to-solve /daily/2023/03/13/what-problem-am-i-trying-to-solve permanent -redir /archive/2023/03/14/automating-all-the-things /daily/2023/03/14/automating-all-the-things permanent -redir /archive/2023/03/15/the-benefits-of-automation /daily/2023/03/15/the-benefits-of-automation permanent -redir /archive/2023/03/21/there-isnt-a-tailwind-looking-site /daily/2023/03/21/there-isnt-a-tailwind-looking-site permanent -redir /archive/2023/03/22/with-utility-styles-your-css-stops-growing /daily/2023/03/22/with-utility-styles-your-css-stops-growing permanent -redir /archive/2023/03/27/software-development-solving-problems-and-adding-value /daily/2023/03/27/software-development-solving-problems-and-adding-value permanent -redir /archive/2023/04/07/speaking-at-php-london /daily/2023/04/07/speaking-at-php-london permanent -redir /archive/2023/04/08/why-i-use-tmux /daily/2023/04/08/why-i-use-tmux permanent -redir /archive/2023/04/09/nix-nixos-home-manager-and-wsl2 /daily/2023/04/09/nix-nixos-home-manager-and-wsl2 permanent -redir /archive/2023/04/10/how-i-use-neovim-for-writing-php /daily/2023/04/10/how-i-use-neovim-for-writing-php permanent -redir /archive/2023/04/11/just-vs-make /daily/2023/04/11/just-vs-make permanent -redir /archive/2023/04/12/cleaner-php-code-with-promoted-constructor-properties /daily/2023/04/12/cleaner-php-code-with-promoted-constructor-properties permanent -redir /archive/2023/04/13/immutable-read-only-properties-in-php-8-1 /daily/2023/04/13/immutable-read-only-properties-in-php-8-1 permanent -redir /archive/2023/04/14/data-transfer-objects-and-value-objects /daily/2023/04/14/data-transfer-objects-and-value-objects permanent -redir /archive/2023/04/15/automatically-running-commands-with-nodemon /daily/2023/04/15/automatically-running-commands-with-nodemon permanent -redir /archive/2023/04/16/refactoring-with-readonly-classes-in-php-8-2 /daily/2023/04/16/refactoring-with-readonly-classes-in-php-8-2 permanent -redir /archive/2023/04/17/introducing-feature-flags-to-build-configs /daily/2023/04/17/introducing-feature-flags-to-build-configs permanent -redir /archive/2023/04/18/consistency-is-key /daily/2023/04/18/consistency-is-key permanent -redir /archive/2023/04/19/camel-case-or-snake-case-for-drupal-code /daily/2023/04/19/camel-case-or-snake-case-for-drupal-code permanent -redir /archive/2023/04/20/micro-refactorings /daily/2023/04/20/micro-refactorings permanent -redir /archive/2023/04/21/making-my-drupal-module-template-drupal-10-compatible /daily/2023/04/21/making-my-drupal-module-template-drupal-10-compatible permanent -redir /archive/2023/04/22/build-configs-as-a-service /daily/2023/04/22/build-configs-as-a-service permanent -redir /archive/2023/04/23/laravel-pipelines /daily/2023/04/23/laravel-pipelines permanent -redir /archive/2023/04/24/ci-pipelines-should-start-locally /daily/2023/04/24/ci-pipelines-should-start-locally permanent -redir /archive/2023/04/25/shortening-the-feedback-loop-even-more /daily/2023/04/25/shortening-the-feedback-loop-even-more permanent -redir /archive/2023/04/26/tdd-structure-a-new-test-by-writing-comments-first /daily/2023/04/26/tdd-structure-a-new-test-by-writing-comments-first permanent -redir /archive/2023/04/27/tdd-write-the-test-backwards /daily/2023/04/27/tdd-write-the-test-backwards permanent -redir /archive/2023/04/30/will-we-see-drupal-7-100 /daily/2023/04/30/will-we-see-drupal-7-100 permanent -redir /archive/2023/05/01/should-drupal-7-support-be-extended-again /daily/2023/05/01/should-drupal-7-support-be-extended-again permanent -redir /archive/2023/05/02/does-it-depend-on-who-you-ask /daily/2023/05/02/does-it-depend-on-who-you-ask permanent -redir /archive/2023/05/03/just-because-core-is-supported /daily/2023/05/03/just-because-core-is-supported permanent -redir /archive/2023/05/04/speaking-at-the-symfony-uk-meetup-london /daily/2023/05/04/speaking-at-the-symfony-uk-meetup-london permanent -redir /archive/2023/05/05/getting-to-green /daily/2023/05/05/getting-to-green permanent -redir /archive/2023/05/06/why-its-important-to-see-the-test-fail /daily/2023/05/06/why-its-important-to-see-the-test-fail permanent -redir /archive/2023/05/07/you-dont-need-to-think-about-what-to-do-next /daily/2023/05/07/you-dont-need-to-think-about-what-to-do-next permanent -redir /archive/2023/05/08/only-write-enough-code-to-get-a-failing-test /daily/2023/05/08/only-write-enough-code-to-get-a-failing-test permanent -redir /archive/2023/05/09/the-single-responsibility-principle /daily/2023/05/09/the-single-responsibility-principle permanent -redir /archive/2023/05/10/tailwind-css-makes-change-easier /daily/2023/05/10/tailwind-css-makes-change-easier permanent -redir /archive/2023/05/11/why-i-like-pair-and-mob-programming /daily/2023/05/11/why-i-like-pair-and-mob-programming permanent -redir /archive/2023/05/12/always-listen-to-the-mob /daily/2023/05/12/always-listen-to-the-mob permanent -redir /archive/2023/05/13/when-you-do-things-right /daily/2023/05/13/when-you-do-things-right permanent -redir /archive/2023/05/14/releasing-small-changes-often-is-less-risky /daily/2023/05/14/releasing-small-changes-often-is-less-risky permanent -redir /archive/2023/05/15/is-the-drupal-release-cycle-too-fast /daily/2023/05/15/is-the-drupal-release-cycle-too-fast permanent -redir /archive/2023/05/16/mastering-your-tools-improves-productivity /daily/2023/05/16/mastering-your-tools-improves-productivity permanent -redir /archive/2023/05/17/what-is-deprecated-code /daily/2023/05/17/what-is-deprecated-code permanent -redir /archive/2023/05/18/why-is-backward-compatibility-important /daily/2023/05/18/why-is-backward-compatibility-important permanent -redir /archive/2023/05/19/semantic-versioning /daily/2023/05/19/semantic-versioning permanent -redir /archive/2023/05/20/a-minor-breaking-change /daily/2023/05/20/a-minor-breaking-change permanent -redir /archive/2023/05/21/drupal-9-almost-end-of-life-already /daily/2023/05/21/drupal-9-almost-end-of-life-already permanent -redir /archive/2023/06/05/how-long-should-a-feature-flag-live /daily/2023/06/05/how-long-should-a-feature-flag-live permanent -redir /archive/2023/06/06/drupal-7-end-of-life-extended /daily/2023/06/06/drupal-7-end-of-life-extended permanent -redir /archive/2023/06/07/what-does-the-drupal-7-eol-extension-mean-to-you /daily/2023/06/07/what-does-the-drupal-7-eol-extension-mean-to-you permanent -redir /archive/2023/06/08/write-less-drupal-code /daily/2023/06/08/write-less-drupal-code permanent -redir /archive/2023/06/09/drupal-is-built-by-people /daily/2023/06/09/drupal-is-built-by-people permanent -redir /archive/2023/06/10/how-do-you-know-when-to-remove-a-feature-flag /daily/2023/06/10/how-do-you-know-when-to-remove-a-feature-flag permanent -redir /archive/2023/06/11/failing-fast /daily/2023/06/11/failing-fast permanent -redir /archive/2023/06/12/feature-flags-in-a-multi-tenancy-application /daily/2023/06/12/feature-flags-in-a-multi-tenancy-application permanent -redir /archive/2023/06/13/should-you-feature-flag-everything /daily/2023/06/13/should-you-feature-flag-everything permanent -redir /archive/2023/06/14/what-if-there-was-no-open-source-software /daily/2023/06/14/what-if-there-was-no-open-source-software permanent -redir /archive/2023/06/15/done-is-better-than-perfect /daily/2023/06/15/done-is-better-than-perfect permanent -redir /archive/2023/06/16/make-the-easy-change /daily/2023/06/16/make-the-easy-change permanent -redir /archive/2023/06/17/avoid-git-merge-hell-with-trunk-based-development /daily/2023/06/17/avoid-git-merge-hell-with-trunk-based-development permanent -redir /archive/2023/06/18/are-you-doing-ci-cd /daily/2023/06/18/are-you-doing-ci-cd permanent -redir /archive/2023/06/19/should-you-upgrade-from-drupal-7-to-drupal-10 /daily/2023/06/19/should-you-upgrade-from-drupal-7-to-drupal-10 permanent -redir /archive/2023/06/20/should-you-deploy-on-a-friday /daily/2023/06/20/should-you-deploy-on-a-friday permanent -redir /archive/2023/06/21/deployments-or-releases /daily/2023/06/21/deployments-or-releases permanent -redir /archive/2023/06/22/fail-to-lear /daily/2023/06/22/fail-to-lear permanent -redir /archive/2023/06/23/why-keep-a-changelog /daily/2023/06/23/why-keep-a-changelog permanent -redir /archive/2023/06/24/credited-on-200-fixed-issues /daily/2023/06/24/credited-on-200-fixed-issues permanent -redir /archive/2023/06/25/do-you-need-permission-test-driven-development /daily/2023/06/25/do-you-need-permission-test-driven-development permanent -redir /archive/2023/06/26/is-any-code-without-tests-legacy /daily/2023/06/26/is-any-code-without-tests-legacy permanent -redir /archive/2023/06/27/ci-pipeline-additional-team-member /daily/2023/06/27/ci-pipeline-additional-team-member permanent -redir /archive/2023/06/28/theres-no-value-in-a-broken-ci-pipeline /daily/2023/06/28/theres-no-value-in-a-broken-ci-pipeline permanent -redir /archive/2023/06/29/tests-wont-tell-you-if-your-code-works /daily/2023/06/29/tests-wont-tell-you-if-your-code-works permanent -redir /archive/2023/06/30/how-did-you-learn-automated-testing /daily/2023/06/30/how-did-you-learn-automated-testing permanent -redir /archive/2023/07/01/once-you-start-writing-tests-you-cant-stop /daily/2023/07/01/once-you-start-writing-tests-you-cant-stop permanent -redir /archive/2023/07/02/docker-or-nix /daily/2023/07/02/docker-or-nix permanent -redir /archive/2023/07/03/why-write-custom-assertions-in-your-tests /daily/2023/07/03/why-write-custom-assertions-in-your-tests permanent -redir /archive/2023/07/04/think-smaller-with-tdd /daily/2023/07/04/think-smaller-with-tdd permanent -redir /archive/2023/07/05/services-vs-actions /daily/2023/07/05/services-vs-actions permanent -redir /archive/2023/07/06/automated-testing-is-more-than-just-unit-testing /daily/2023/07/06/automated-testing-is-more-than-just-unit-testing permanent -redir /archive/2023/07/15/test-driven-development-makes-you-more-productive /daily/2023/07/15/test-driven-development-makes-you-more-productive permanent -redir /archive/2023/07/16/when-writing-a-failing-test-youre-designing-your-code /daily/2023/07/16/when-writing-a-failing-test-youre-designing-your-code permanent -redir /archive/2023/07/17/too-many-choices /daily/2023/07/17/too-many-choices permanent -redir /archive/2023/07/18/tdd-as-a-concept-is-simple-but-tdd-is-difficult /daily/2023/07/18/tdd-as-a-concept-is-simple-but-tdd-is-difficult permanent -redir /archive/2023/07/19/tdd-is-like-clicker-training /daily/2023/07/19/tdd-is-like-clicker-training permanent -redir /archive/2023/07/20/tests-as-communication /daily/2023/07/20/tests-as-communication permanent -redir /archive/2023/07/21/comments-as-communication /daily/2023/07/21/comments-as-communication permanent -redir /archive/2023/07/22/more-code-more-problems /daily/2023/07/22/more-code-more-problems permanent -redir /archive/2023/07/23/tomorrow-is-easier-if-todays-code-is-simpler /daily/2023/07/23/tomorrow-is-easier-if-todays-code-is-simpler permanent -redir /archive/2023/07/24/testing-is-all-about-confidence /daily/2023/07/24/testing-is-all-about-confidence permanent -redir /archive/2023/07/25/working-backwards /daily/2023/07/25/working-backwards permanent -redir /archive/2023/07/26/prove-the-concept /daily/2023/07/26/prove-the-concept permanent -redir /archive/2023/07/27/stick-to-conventions /daily/2023/07/27/stick-to-conventions permanent -redir /archive/2023/07/28/generic-commit-messages /daily/2023/07/28/generic-commit-messages permanent -redir /archive/2023/07/29/should-i-wait-to-upgrade-from-drupal-7 /daily/2023/07/29/should-i-wait-to-upgrade-from-drupal-7 permanent -redir /archive/2023/07/30/commit-often-deploy-often /daily/2023/07/30/commit-often-deploy-often permanent -redir /archive/2023/07/31/upgrading-from-drupal-9-is-easier /daily/2023/07/31/upgrading-from-drupal-9-is-easier permanent -redir /archive/2023/08/01/maintaining-a-module-used-on-35000-drupal-websites /daily/2023/08/01/maintaining-a-module-used-on-35000-drupal-websites permanent -redir /archive/2023/08/02/a-crash-course-into-drupal-testing /daily/2023/08/02/a-crash-course-into-drupal-testing permanent -redir /archive/2023/08/03/what-problem-are-we-trying-to-solve /daily/2023/08/03/what-problem-are-we-trying-to-solve permanent -redir /archive/2023/08/04/laravel-prompts /daily/2023/08/04/laravel-prompts permanent -redir /archive/2023/08/05/use-drupal-to-own-your-content /daily/2023/08/05/use-drupal-to-own-your-content permanent -redir /archive/2023/08/06/yagni /daily/2023/08/06/yagni permanent -redir /archive/2023/08/07/tests-make-upgrades-less-risky /daily/2023/08/07/tests-make-upgrades-less-risky permanent -redir /archive/2023/08/08/8-years-of-dotfiles /daily/2023/08/08/8-years-of-dotfiles permanent -redir /archive/2023/08/09/vim-is-my-lightsaber /daily/2023/08/09/vim-is-my-lightsaber permanent -redir /archive/2023/08/10/testing-fixed-prices-and-bug-free-guarantees /daily/2023/08/10/testing-fixed-prices-and-bug-free-guarantees permanent -redir /archive/2023/08/11/everyone-tests-their-code /daily/2023/08/11/everyone-tests-their-code permanent -redir /archive/2023/08/12/does-not-writing-tests-actually-save-time /daily/2023/08/12/does-not-writing-tests-actually-save-time permanent -redir /archive/2023/08/13/dont-estimate-separately-for-testing /daily/2023/08/13/dont-estimate-separately-for-testing permanent -redir /archive/2023/08/14/why-keep-a-dotfiles-repository /daily/2023/08/14/why-keep-a-dotfiles-repository permanent -redir /archive/2023/08/15/writing-test-and-implementation-code-are-the-same-task /daily/2023/08/15/writing-test-and-implementation-code-are-the-same-task permanent -redir /archive/2023/08/16/writing-tests-in-your-own-time /daily/2023/08/16/writing-tests-in-your-own-time permanent -redir /archive/2023/08/17/writing-custom-assertions-in-your-tests /daily/2023/08/17/writing-custom-assertions-in-your-tests permanent -redir /archive/2023/08/18/types-vs-tests /daily/2023/08/18/types-vs-tests permanent -redir /archive/2023/08/19/asserting-all-the-things /daily/2023/08/19/asserting-all-the-things permanent -redir /archive/2023/08/20/php-types-and-assertions /daily/2023/08/20/php-types-and-assertions permanent -redir /archive/2023/08/21/which-part-of-the-ci-pipeline-has-the-most-value /daily/2023/08/21/which-part-of-the-ci-pipeline-has-the-most-value permanent -redir /archive/2023/08/22/deployments-with-your-ci-pipeline /daily/2023/08/22/deployments-with-your-ci-pipeline permanent -redir /archive/2023/08/23/dont-use-third-party-services-directly /daily/2023/08/23/dont-use-third-party-services-directly permanent -redir /archive/2023/08/24/testing-multiple-implementations-with-contract-tests /daily/2023/08/24/testing-multiple-implementations-with-contract-tests permanent -redir /archive/2023/08/25/start-with-a-vague-test /daily/2023/08/25/start-with-a-vague-test permanent -redir /archive/2023/08/26/work-in-small-chunks /daily/2023/08/26/work-in-small-chunks permanent -redir /archive/2023/08/27/pull-requests-are-great-for-open-source /daily/2023/08/27/pull-requests-are-great-for-open-source permanent -redir /archive/2023/08/28/pair-and-mob-programming-are-continuous-code-review /daily/2023/08/28/pair-and-mob-programming-are-continuous-code-review permanent -redir /archive/2023/08/29/ci-pipelines-are-an-automated-code-review /daily/2023/08/29/ci-pipelines-are-an-automated-code-review permanent -redir /archive/2023/08/30/tdd-and-unexpected-errors /daily/2023/08/30/tdd-and-unexpected-errors permanent -redir /archive/2023/08/31/code-review-discourages-small-refactorings /daily/2023/08/31/code-review-discourages-small-refactorings permanent -redir /archive/2023/09/01/non-blocking-code-reviews /daily/2023/09/01/non-blocking-code-reviews permanent -redir /archive/2023/09/02/planning-first-or-reviewing-last /daily/2023/09/02/planning-first-or-reviewing-last permanent -redir /archive/2023/09/03/including-time-for-tests-in-estimates /daily/2023/09/03/including-time-for-tests-in-estimates permanent -redir /archive/2023/09/04/charging-more-not-to-write-tests /daily/2023/09/04/charging-more-not-to-write-tests permanent -redir /archive/2023/09/05/spring-clean-before-upgrading /daily/2023/09/05/spring-clean-before-upgrading permanent -redir /archive/2023/09/06/verbosity-over-abstraction /daily/2023/09/06/verbosity-over-abstraction permanent -redir /archive/2023/09/07/what-s-the-simplest-test-to-begin-with /daily/2023/09/07/what-s-the-simplest-test-to-begin-with permanent -redir /archive/2023/09/08/do-you-proactively-refactor-your-code /daily/2023/09/08/do-you-proactively-refactor-your-code permanent -redir /archive/2023/09/09/a-lack-of-tests-discourages-refactoring /daily/2023/09/09/a-lack-of-tests-discourages-refactoring permanent -redir /archive/2023/09/10/code-is-read-more-than-it-s-written /daily/2023/09/10/code-is-read-more-than-it-s-written permanent -redir /archive/2023/09/11/dont-use-else /daily/2023/09/11/dont-use-else permanent -redir /archive/2023/09/12/dont-inject-too-many-dependencies /daily/2023/09/12/dont-inject-too-many-dependencies permanent -redir /archive/2023/09/13/which-type-of-test-should-i-use /daily/2023/09/13/which-type-of-test-should-i-use permanent -redir /archive/2023/09/14/outside-in-or-inside-out /daily/2023/09/14/outside-in-or-inside-out permanent -redir /archive/2023/09/15/types-or-no-types /daily/2023/09/15/types-or-no-types permanent -redir /archive/2023/09/16/how-not-to-break-36-000-websites /daily/2023/09/16/how-not-to-break-36-000-websites permanent -redir /archive/2023/09/17/how-much-refactoring-should-i-be-doing /daily/2023/09/17/how-much-refactoring-should-i-be-doing permanent -redir /archive/2023/09/18/increasing-test-coverage-with-regression-tests /daily/2023/09/18/increasing-test-coverage-with-regression-tests permanent -redir /archive/2023/09/19/stop-writing-tests /daily/2023/09/19/stop-writing-tests permanent -redir /archive/2023/09/20/why-i-prefer-types /daily/2023/09/20/why-i-prefer-types permanent -redir /archive/2023/09/21/buggy-software-causes-reputational-damage /daily/2023/09/21/buggy-software-causes-reputational-damage permanent -redir /archive/2023/09/22/documentation-and-comments-get-stale /daily/2023/09/22/documentation-and-comments-get-stale permanent -redir /archive/2023/09/23/not-everyone-writes-automated-tests /daily/2023/09/23/not-everyone-writes-automated-tests permanent -redir /archive/2023/09/24/test-to-save-your-job /daily/2023/09/24/test-to-save-your-job permanent -redir /archive/2023/09/25/should-you-use-a-staging-environment /daily/2023/09/25/should-you-use-a-staging-environment permanent -redir /archive/2023/09/26/which-branch-should-be-in-which-environment /daily/2023/09/26/which-branch-should-be-in-which-environment permanent -redir /archive/2023/09/27/separating-environments-with-feature-flags /daily/2023/09/27/separating-environments-with-feature-flags permanent -redir /archive/2023/09/28/feature-flags-enable-continuous-integration /daily/2023/09/28/feature-flags-enable-continuous-integration permanent -redir /archive/2023/09/29/92-changed-files-with-885-additions-and-156-deletions /daily/2023/09/29/92-changed-files-with-885-additions-and-156-deletions permanent -redir /archive/2023/09/30/automated-testing-offers-repeatability /daily/2023/09/30/automated-testing-offers-repeatability permanent -redir /archive/2023/10/01/tdd--repeat-and-refactor /daily/2023/10/01/tdd--repeat-and-refactor permanent -redir /archive/2023/10/02/only-comment-what-needs-to-be-commented /daily/2023/10/02/only-comment-what-needs-to-be-commented permanent -redir /archive/2023/10/03/there-is-no-perfect-solution /daily/2023/10/03/there-is-no-perfect-solution permanent -redir /archive/2023/10/04/the-best-solution-is-the-one-that-gets-the-tests-to-pass /daily/2023/10/04/the-best-solution-is-the-one-that-gets-the-tests-to-pass permanent -redir /archive/2023/10/05/some-solutions-are-good-enough /daily/2023/10/05/some-solutions-are-good-enough permanent -redir /archive/2023/10/06/software-development-is-like-going-to-the-dentist /daily/2023/10/06/software-development-is-like-going-to-the-dentist permanent -redir /archive/2023/10/07/a-breakdown-of-tests-from-a-current-project /daily/2023/10/07/a-breakdown-of-tests-from-a-current-project permanent -redir /archive/2023/10/08/is-test-driven-development-difficult /daily/2023/10/08/is-test-driven-development-difficult permanent -redir /archive/2023/10/09/spotting-new-things-in-drupal-10-1 /daily/2023/10/09/spotting-new-things-in-drupal-10-1 permanent -redir /archive/2023/10/10/why-use-composer-to-manage-drupal-dependencies /daily/2023/10/10/why-use-composer-to-manage-drupal-dependencies permanent -redir /archive/2023/10/11/do-you-need-that-module /daily/2023/10/11/do-you-need-that-module permanent -redir /archive/2023/10/12/business-logic-in-template-files /daily/2023/10/12/business-logic-in-template-files permanent -redir /archive/2023/10/13/writing-tests-is-an-investment /daily/2023/10/13/writing-tests-is-an-investment permanent -redir /archive/2023/10/14/do-you-need-to-write-tests-for-small-or-short-lived-projects /daily/2023/10/14/do-you-need-to-write-tests-for-small-or-short-lived-projects permanent -redir /archive/2023/10/15/off-to-drupalcon /daily/2023/10/15/off-to-drupalcon permanent -redir /archive/2023/10/23/when-should-run-your-tests /daily/2023/10/23/when-should-run-your-tests permanent -redir /archive/2023/10/24/how-to-test-code-you-didnt-write /daily/2023/10/24/how-to-test-code-you-didnt-write permanent -redir /archive/2023/10/25/automated-tests-prevent-regressions-when-upgrading /daily/2023/10/25/automated-tests-prevent-regressions-when-upgrading permanent -redir /archive/2023/10/26/is-decoupled-drupal-still-a-thing /daily/2023/10/26/is-decoupled-drupal-still-a-thing permanent -redir /archive/2023/10/27/work-with-me-and-support-the-drupal-association /daily/2023/10/27/work-with-me-and-support-the-drupal-association permanent -redir /archive/2023/10/28/can-you-move-faster-without-tests /daily/2023/10/28/can-you-move-faster-without-tests permanent -redir /archive/2023/10/29/i-can-drive-my-car-blindfolded-but-is-it-a-good-idea /daily/2023/10/29/i-can-drive-my-car-blindfolded-but-is-it-a-good-idea permanent -redir /archive/2023/10/30/is-drupal-a-cms-or-a-framework /daily/2023/10/30/is-drupal-a-cms-or-a-framework permanent -redir /archive/2023/10/31/one-official-drupal-development-environment /daily/2023/10/31/one-official-drupal-development-environment permanent -redir /archive/2023/11/01/drupal-9-is-now-end-of-life /daily/2023/11/01/drupal-9-is-now-end-of-life permanent -redir /archive/2023/11/02/is-code-coverage-an-objective-or-guideline /daily/2023/11/02/is-code-coverage-an-objective-or-guideline permanent -redir /archive/2023/11/03/why-your-company-should-contribute-to-open-source-software /daily/2023/11/03/why-your-company-should-contribute-to-open-source-software permanent -redir /archive/2023/11/04/why-you-should-contribute-to-open-source-software /daily/2023/11/04/why-you-should-contribute-to-open-source-software permanent -redir /archive/2023/11/05/i-m-starting-a-podcast /daily/2023/11/05/i-m-starting-a-podcast permanent -redir /archive/2023/11/06/the-first-beyond-blocks-podcast-episode-is-recorded /daily/2023/11/06/the-first-beyond-blocks-podcast-episode-is-recorded permanent -redir /archive/2023/11/07/it-depends /daily/2023/11/07/it-depends permanent -redir /archive/2023/11/08/building-build-configs /daily/2023/11/08/building-build-configs permanent -redir /archive/2023/11/09/readme-driven-development /daily/2023/11/09/readme-driven-development permanent -redir /archive/2023/11/10/retrofit-with-matt-glaman /daily/2023/11/10/retrofit-with-matt-glaman permanent -redir /archive/2023/11/11/work-in-small-batches /daily/2023/11/11/work-in-small-batches permanent -redir /archive/2023/11/12/drupal-gives-you-so-much-out-of-the-box /daily/2023/11/12/drupal-gives-you-so-much-out-of-the-box permanent -redir /archive/2023/11/13/phpunit-does-more-than-unit-testing /daily/2023/11/13/phpunit-does-more-than-unit-testing permanent -redir /archive/2023/11/14/why-i-prefer-integration-tests-to-unit-tests /daily/2023/11/14/why-i-prefer-integration-tests-to-unit-tests permanent -redir /archive/2023/11/15/dont-pre-optimise-and-over-customise /daily/2023/11/15/dont-pre-optimise-and-over-customise permanent -redir /archive/2023/11/16/avoiding-over-mocking /daily/2023/11/16/avoiding-over-mocking permanent -redir /archive/2023/11/17/drupal-s-alternate-realities /daily/2023/11/17/drupal-s-alternate-realities permanent -redir /archive/2023/11/18/writing-good-test-names /daily/2023/11/18/writing-good-test-names permanent -redir /archive/2023/11/19/why-ive-standardised-on-run-scripts /daily/2023/11/19/why-ive-standardised-on-run-scripts permanent -redir /archive/2023/11/20/whatll-be-in-drupal-11 /daily/2023/11/20/whatll-be-in-drupal-11 permanent -redir /archive/2023/11/21/why-i-built-build-configs /daily/2023/11/21/why-i-built-build-configs permanent -redir /archive/2023/11/22/frequency-reduces-difficulty /daily/2023/11/22/frequency-reduces-difficulty permanent -redir /archive/2023/11/23/partial-mocking /daily/2023/11/23/partial-mocking permanent -redir /archive/2023/11/24/are-conventional-commits-worth-it /daily/2023/11/24/are-conventional-commits-worth-it permanent -redir /archive/2023/11/25/community-engagement-for-non-technical-drupal-enthusiasts /daily/2023/11/25/community-engagement-for-non-technical-drupal-enthusiasts permanent -redir /archive/2023/11/26/to-docblock-or-not-to-docblock /daily/2023/11/26/to-docblock-or-not-to-docblock permanent -redir /archive/2023/11/27/finding-the-best-test-base /daily/2023/11/27/finding-the-best-test-base permanent -redir /archive/2023/11/28/which-phpstan-level-should-you-use /daily/2023/11/28/which-phpstan-level-should-you-use permanent -redir /archive/2023/11/29/the-lowest-level-is-better-than-no-level /daily/2023/11/29/the-lowest-level-is-better-than-no-level permanent -redir /archive/2023/11/30/are-bugs-good-for-users /daily/2023/11/30/are-bugs-good-for-users permanent -redir /archive/2023/12/01/the-contribution-first-workflow /daily/2023/12/01/the-contribution-first-workflow permanent -redir /archive/2023/12/04/writing-contrib-modules-as-glue-between-your-custom-code /daily/2023/12/04/writing-contrib-modules-as-glue-between-your-custom-code permanent -redir /archive/2023/12/05/open-source-encourages-open-source /daily/2023/12/05/open-source-encourages-open-source permanent -redir /archive/2023/12/06/open-source-first-doesnt-mean-you-need-to-cover-every-use-case /daily/2023/12/06/open-source-first-doesnt-mean-you-need-to-cover-every-use-case permanent -redir /archive/2023/12/07/a-drupal-case-study-from-oxfam /daily/2023/12/07/a-drupal-case-study-from-oxfam permanent -redir /archive/2023/12/08/dont-just-rewrite /daily/2023/12/08/dont-just-rewrite permanent -redir /archive/2023/12/09/rebuild-or-iterate /daily/2023/12/09/rebuild-or-iterate permanent -redir /archive/2023/12/10/suffixing-names /daily/2023/12/10/suffixing-names permanent -redir /archive/2023/12/11/custom-coding-standards-and-conventions /daily/2023/12/11/custom-coding-standards-and-conventions permanent -redir /archive/2023/12/12/drupalcon-session-survey-results /daily/2023/12/12/drupalcon-session-survey-results permanent -redir /archive/2023/12/13/reviving-an-old-php-project /daily/2023/12/13/reviving-an-old-php-project permanent -redir /archive/2023/12/14/save-time-and-effort-with-drupal-distributions /daily/2023/12/14/save-time-and-effort-with-drupal-distributions permanent -redir /archive/2023/12/15/building-your-own-in-house-drupal-distribution /daily/2023/12/15/building-your-own-in-house-drupal-distribution permanent -redir /archive/2023/12/16/adding-snapshot-tests-to-build-configs /daily/2023/12/16/adding-snapshot-tests-to-build-configs permanent -redir /archive/2023/12/17/fail-fast-fix-fast /daily/2023/12/17/fail-fast-fix-fast permanent -redir /archive/2023/12/18/static-analysis-on-tests /daily/2023/12/18/static-analysis-on-tests permanent -redir /archive/2023/12/19/php-tui-dan-leech /daily/2023/12/19/php-tui-dan-leech permanent -redir /archive/2023/12/20/hover-focus-hocus /daily/2023/12/20/hover-focus-hocus permanent -redir /archive/2023/12/21/new-year-coaching /daily/2023/12/21/new-year-coaching permanent -redir /archive/2023/12/22/best-language-cms-or-framework /daily/2023/12/22/best-language-cms-or-framework permanent -redir /archive/2023/12/23/using-a-whole-framework-or-part-of-it /daily/2023/12/23/using-a-whole-framework-or-part-of-it permanent -redir /archive/2023/12/24/this-should-never-happen /daily/2023/12/24/this-should-never-happen permanent -redir /archive/2023/12/25/zero-to-test /daily/2023/12/25/zero-to-test permanent -redir /archive/2023/12/26/good-code-is-not-about-being-easy-to-write /daily/2023/12/26/good-code-is-not-about-being-easy-to-write permanent -redir /archive/2023/12/27/writing-new-code-is-quick-to-begin-with /daily/2023/12/27/writing-new-code-is-quick-to-begin-with permanent -redir /archive/2023/12/28/pride-and-productivity /daily/2023/12/28/pride-and-productivity permanent -redir /archive/2023/12/29/decide-automate-document /daily/2023/12/29/decide-automate-document permanent -redir /archive/2023/12/30/weve-always-done-it-this-way /daily/2023/12/30/weve-always-done-it-this-way permanent -redir /archive/2023/12/31/just /daily/2023/12/31/just permanent -redir /archive/2024/03/03/centarro-and-drupal-commerce-with-ryan-szrama /daily/2024/03/03/centarro-and-drupal-commerce-with-ryan-szrama permanent -redir /atNOQ https://youtu.be/r41dkD2EOo8 permanent -redir /automatically-updating-talk-created-date https://gist.github.com/opdavies/4e75e1753d8603113f07f8264bb783d6 permanent -redir /blog.xml /rss.xml permanent -redir /blog/10-useful-drupal-6-modules /blog/useful-drupal-6-modules permanent -redir /blog/10-years-working-full-time-drupal /blog/10-years-working-full-time-drupal-php permanent -redir /blog/2010/04/05/style-drupal-6s-taxonomy-lists-php-css-and-jquery /blog/style-drupal-6s-taxonomy-lists-php-css-and-jquery permanent -redir /blog/2010/04/05/styling-drupal-6s-taxonomy-lists-with-php-css-and-jquery /blog/style-drupal-6s-taxonomy-lists-php-css-jquery permanent -redir /blog/2010/04/28/using-imagecache-and-imagecrop-my-portfolio /blog/using-imagecache-and-imagecrop-my-portfolio permanent -redir /blog/2010/05/06/conditional-email-addresses-webform /blog/conditional-email-addresses-webform permanent -redir /blog/2010/05/10/quickly-create-zen-subthemes-using-zenophile /blog/quickly-create-zen-subthemes-using-zenophile permanent -redir /blog/2010/05/25/create-slideshow-multiple-images-using-fancy-slide /blog/create-slideshow-multiple-images-using-fancy-slide permanent -redir /blog/2010/05/29/quickly-import-multiples-images-using-imagefieldimport-module /blog/quickly-import-multiples-images-using-imagefieldimport-module permanent -redir /blog/2010/06/02/improve-jpg-quality-imagecache-and-imageapi /blog/improve-jpg-quality-imagecache-and-imageapi permanent -redir /blog/2010/06/23/create-block-social-media-icons-using-cck-views-and-nodequeue /blog/create-block-social-media-icons-using-cck-views-and-nodequeue permanent -redir /blog/2010/06/25/10-useful-drupal-6-modules /blog/10-useful-drupal-6-modules permanent -redir /blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views /blog/create-flickr-photo-gallery-using-feeds-cck-and-views permanent -redir /blog/2010/07/01/change-content-type-multiple-nodes-using-sql /blog/change-content-type-multiple-nodes-using-sql permanent -redir /blog/2010/07/02/create-virtual-hosts-mac-os-x-using-virtualhostx /blog/create-virtual-hosts-mac-os-x-using-virtualhostx permanent -redir /blog/2010/07/07/add-taxonomy-term-multiple-nodes-using-sql /blog/add-taxonomy-term-multiple-nodes-using-sql permanent -redir /blog/2010/07/07/quickly-adding-taxonomy-term-multiple-nodes-using-sql /blog/add-taxonomy-term-multiple-nodes-using-sql permanent -redir /blog/2010/07/12/overview-teleport-module /blog/review-teleport-module permanent -redir /blog/2010/07/12/review-teleport-module /blog/review-teleport-module permanent -redir /blog/2010/08/10/review-adminhover-module /blog/review-adminhover-module permanent -redir /blog/2010/08/11/create-better-photo-gallery-drupal-part-1 /blog/create-better-photo-gallery-drupal-part-1 permanent -redir /blog/2010/08/11/how-create-better-photo-gallery-drupal-part-1 /blog/create-better-photo-gallery-drupal-part-1 permanent -redir /blog/2010/08/17/create-better-photo-gallery-drupal-part-2 /blog/create-better-photo-gallery-drupal-part-2 permanent -redir /blog/2010/08/20/review-image-caption-module /blog/review-image-caption-module permanent -redir /blog/2010/09/26/south-wales-drupal-user-group /blog/south-wales-drupal-user-group permanent -redir /blog/2010/10/10/create-and-apply-patches /blog/create-and-apply-patches permanent -redir /blog/2010/10/13/create-better-photo-gallery-drupal-part-3 /blog/create-better-photo-gallery-drupal-part-3 permanent -redir /blog/2010/10/22/create-better-photo-gallery-drupal-part-21 /blog/create-better-photo-gallery-drupal-part-21 permanent -redir /blog/2010/11/04/use-regular-expressions-search-and-replace-coda-or-textmate /blog/use-regular-expressions-search-and-replace-coda-or-textmate permanent -redir /blog/2011/02/14/easily-embed-typekit-fonts-your-drupal-website /blog/easily-embed-typekit-fonts-your-drupal-website permanent -redir /blog/2011/03/15/display-number-facebook-fans-php /blog/display-number-facebook-fans-php permanent -redir /blog/2011/03/31/proctor-stevenson /blog/proctor-stevenson permanent -redir /blog/2011/05/20/proctors-hosting-next-drupal-meetup /blog/proctors-hosting-next-drupal-meetup permanent -redir /blog/2011/05/23/imagefield-import-archive /blog/imagefield-import-archive permanent -redir /blog/2011/08/28/create-multigroups-drupal-7-using-field-collections /blog/create-multigroups-drupal-7-using-field-collections permanent -redir /blog/2011/10/19/install-and-configure-subversion-svn-server-ubuntu /blog/install-and-configure-subversion-svn-server-ubuntu permanent -redir /blog/2011/10/install-and-configure-subversion-svn-server-ubuntu /blog/how-install-configure-subversion-svn-server-ubuntu permanent -redir /blog/2012/01/04/site-upgraded-drupal-7 /blog/site-upgraded-drupal-7 permanent -redir /blog/2012/02/01/use-authorize-keys-create-passwordless-ssh-connection /blog/use-authorized-keys-create-passwordless-ssh-connection permanent -redir /blog/2012/04/16/create-omega-subtheme-less-css-preprocessor-using-omega-tools-and-drush /blog/create-omega-subtheme-less-css-preprocessor-using-omega-tools-and-drush permanent -redir /blog/2012/04/17/installing-nagios-centos /blog/installing-nagios-centos permanent -redir /blog/2012/04/19/adding-custom-theme-templates-drupal-7 /blog/adding-custom-theme-templates-drupal-7 permanent -redir /blog/2012/04/adding-custom-theme-templates-drupal-7 /blog/adding-custom-theme-templates-drupal-7 permanent -redir /blog/2012/05/23/add-date-popup-calendar-custom-form /blog/add-date-popup-calendar-custom-form permanent -redir /blog/2012/05/23/checkout-specific-revision-svn-command-line /blog/checkout-specific-revision-svn-command-line permanent -redir /blog/2012/05/23/forward-one-domain-another-using-mod-rewrite-and-htaccess /blog/forward-one-domain-another-using-mod-rewrite-and-htaccess permanent -redir /blog/2012/05/23/forward-one-domain-another-using-modrewrite-and-htaccess /blog/forward-one-domain-another-using-modrewrite-htaccess permanent -redir /blog/2012/05/23/prevent-apache-displaying-text-files-within-web-browser /blog/prevent-apache-displaying-text-files-within-web-browser permanent -redir /blog/2012/05/23/writing-info-file-drupal-7-theme /blog/writing-info-file-drupal-7-theme permanent -redir /blog/2012/05/24/dividing-drupals-process-and-preprocess-functions-separate-files /blog/dividing-drupals-process-and-preprocess-functions-separate-files permanent -redir /blog/2012/05/forward-one-domain-another-using-modrewrite-and-htaccess /blog/forward-one-domain-another-using-modrewrite-htaccess permanent -redir /blog/2012/07/12/my-new-drupal-modules /blog/my-new-drupal-modules permanent -redir /blog/2012/07/14/install-nomensa-media-player-drupal /blog/install-nomensa-media-player-drupal permanent -redir /blog/2012/07/27/writing-article-linux-journal /blog/writing-article-linux-journal permanent -redir /blog/2012/07/install-and-configure-nomensa-accessible-media-player-drupal /blog/install-configure-nomensa-accessible-media-player-drupal permanent -redir /blog/2012/07/nomensa-accessible-media-player-drupal /blog/install-configure-nomensa-accessible-media-player-drupal permanent -redir /blog/2012/08/18/display-custom-menu-drupal-7-theme-template-file /blog/display-custom-menu-drupal-7-theme-template-file permanent -redir /blog/2012/09/06/reflections-speaking-unifieddiff /blog/reflections-speaking-unifieddiff permanent -redir /blog/2012/10/25/my-sublime-text-2-settings /blog/my-sublime-text-2-settings permanent -redir /blog/2012/11/15/accessible-bristol-site-launched /blog/accessible-bristol-site-launched permanent -redir /blog/2012/11/17/open-sublime-text-2-mac-os-x-command-line /blog/open-sublime-text-2-mac-os-x-command-line permanent -redir /blog/2012/12/06/use-sass-and-compass-drupal-7-using-sassy /blog/use-sass-and-compass-drupal-7-using-sassy permanent -redir /blog/2012/12/use-sass-and-compass-drupal-7-using-sassy /blog/use-sass-and-compass-drupal-7-using-sassy permanent -redir /blog/2013/01/09/checking-if-user-logged-drupal-right-way /blog/checking-if-user-logged-drupal-right-way permanent -redir /blog/2013/02/16/creating-and-using-custom-tokens-drupal-7 /blog/creating-and-using-custom-tokens-drupal-7 permanent -redir /blog/2013/02/creating-and-using-custom-tokens-drupal-7 /blog/creating-using-custom-tokens-drupal-7 permanent -redir /blog/2013/03/02/quickest-way-install-sublime-text-2-ubuntu /blog/quickest-way-install-sublime-text-2-ubuntu permanent -redir /blog/2013/04/20/leaving-nomensa-joining-precedent /blog/leaving-nomensa-joining-precedent permanent -redir /blog/2013/04/27/display-git-branch-or-tag-names-your-bash-prompt /blog/display-git-branch-or-tag-names-your-bash-prompt permanent -redir /blog/2013/04/display-git-branch-or-tag-names-your-bash-prompt /blog/display-git-branch-or-tag-names-your-bash-prompt permanent -redir /blog/2013/06/13/some-useful-links-using-simpletest-drupal /blog/some-useful-links-using-simpletest-drupal permanent -redir /blog/2013/07/17/creating-local-and-staging-sites-drupals-domain-module-enabled /blog/creating-local-and-staging-sites-drupals-domain-module-enabled permanent -redir /blog/2013/07/26/going-drupalcon /blog/going-drupalcon permanent -redir /blog/2013/09/06/create-a-zen-sub-theme-using-drush /blog/create-a-zen-sub-theme-using-drush permanent -redir /blog/2013/09/create-zen-sub-theme-using-drush /blog/create-zen-sub-theme-using-drush permanent -redir /blog/2013/11/19/dont-bootstrap-drupal-use-drush /blog/dont-bootstrap-drupal-use-drush permanent -redir /blog/2013/11/27/useful-vagrant-commands /blog/useful-vagrant-commands permanent -redir /blog/2013/11/dont-bootstrap-drupal-use-drush /blog/dont-bootstrap-drupal-use-drush permanent -redir /blog/2013/12/24/quickly-apply-patches-using-git-and-curl-or-wget /blog/quickly-apply-patches-using-git-and-curl-or-wget permanent -redir /blog/2013/12/31/download-different-versions-drupal-drush /blog/download-different-versions-drupal-drush permanent -redir /blog/2013/12/quickly-apply-patches-using-git-and-curl-or-wget /blog/quickly-apply-patches-using-git-curl-or-wget permanent -redir /blog/2014/01/15/some-useful-git-aliases /blog/some-useful-git-aliases permanent -redir /blog/2014/02/09/drupalcamp-london-2014 /blog/drupalcamp-london-2014 permanent -redir /blog/2014/03/03/what-git-flow /blog/what-git-flow permanent -redir /blog/2014/05/03/drupal-association /blog/drupal-association permanent -redir /blog/2014/05/06/thanks /blog/thanks permanent -redir /blog/2014/05/21/git-format-patch /blog/git-format-patch permanent -redir /blog/2014/07/02/drush-make-drupalbristol /blog/drush-make-drupalbristol permanent -redir /blog/2014/10/06/fix-vagrant-loading-wrong-virtual-machine /blog/fix-vagrant-loading-wrong-virtual-machine permanent -redir /blog/2014/10/21/updating-features-and-adding-components-using-drush /blog/updating-features-and-adding-components-using-drush permanent -redir /blog/2014/11/18/include-css-fonts-using-sass-each-loop /blog/include-css-fonts-using-sass-each-loop permanent -redir /blog/2014/11/20/using-remote-files-when-developing-locally-with-stage-file-proxy-module /blog/using-remote-files-when-developing-locally-with-stage-file-proxy-module permanent -redir /blog/2014/11/27/pantheon-settings-files /blog/pantheon-settings-files permanent -redir /blog/2014/12/20/include-local-drupal-settings-file-environment-configuration-and-overrides /blog/include-local-drupal-settings-file-environment-configuration-and-overrides permanent -redir /blog/2015/04/03/how-to-define-a-minimum-drupal-core-version /blog/how-to-define-a-minimum-drupal-core-version permanent -redir /blog/2015/06/18/updating-forked-repositories-on-github /blog/updating-forked-repositories-on-github permanent -redir /blog/2015/07/19/sculpin-twig-resources /blog/sculpin-twig-resources permanent -redir /blog/2015/07/21/automating-sculpin-jenkins /blog/automating-sculpin-jenkins permanent -redir /blog/2015/12/22/programmatically-load-an-entityform-in-drupal-7 /blog/programmatically-load-an-entityform-in-drupal-7 permanent -redir /blog/2016/02/15/announcing-the-drupal-vm-generator /blog/announcing-the-drupal-vm-generator permanent -redir /blog/2016/05/03/simplifying-drupal-migrations-with-xautoload /blog/simplifying-drupal-migrations-with-xautoload permanent -redir /blog/2016/07/15/building-gmail-filters-with-php /blog/building-gmail-filters-with-php permanent -redir /blog/2016/12/30/drupal-vm-generator-291-released /blog/drupal-vm-generator-291-released permanent -redir /blog/2017/01/07/easier-sculpin-commands-with-composer-and-npm-scripts /blog/easier-sculpin-commands-with-composer-and-npm-scripts permanent -redir /blog/2017/01/31/nginx-redirects-with-query-string-arguments /blog/nginx-redirects-with-query-string-arguments permanent -redir /blog/2017/05/05/fixing-drupal-simpletest-docker /blog/2017/05/05/fixing-drupal-simpletest-issues-inside-docker-containers permanent -redir /blog/2017/05/05/fixing-drupal-simpletest-issues-inside-docker-containers /blog/fixing-drupal-simpletest-issues-inside-docker-containers permanent -redir /blog/2017/05/20/turning-drupal-module-into-feature /blog/turning-your-custom-drupal-module-feature permanent -redir /blog/2017/06/09/introducing-the-drupal-meetups-twitterbot /blog/introducing-the-drupal-meetups-twitterbot permanent -redir /blog/2017/07/13/publishing-sculpin-sites-with-github-pages /blog/publishing-sculpin-sites-github-pages permanent -redir /blog/2017/11/07/tdd-test-driven-drupal /blog/tdd-test-driven-drupal permanent -redir /blog/2017/11/07/writing-drupal-module-test-driven-development-tdd /blog/2017/11/07/tdd-test-driven-drupal permanent -redir /blog/2018/01/30/drupalcamp-bristol-2018 /blog/drupalcamp-bristol-2018 permanent -redir /blog/2018/02/05/using-tailwind-css-in-your-drupal-theme /blog/using-tailwind-css-in-your-drupal-theme permanent -redir /blog/2018/02/27/looking-forward-to-drupalcamp-london /blog/looking-forward-to-drupalcamp-london permanent -redir /blog/2018/02/27/queuing-private-messages-in-drupal-8 /blog/queuing-private-messages-in-drupal-8 permanent -redir /blog/2018/02/28/building-the-new-phpsw-website /blog/building-the-new-phpsw-website permanent -redir /blog/2018/03/02/yay-the-mediacurrent-contrib-half-hour-is-back /blog/yay-the-mediacurrent-contrib-half-hour-is-back permanent -redir /blog/2018/03/04/tweets-from-drupalcamp-london /blog/tweets-from-drupalcamp-london permanent -redir /blog/2018/04/23/back-to-the-future-git-diff-apply /blog/back-future-gits-diff-apply-commands permanent -redir /blog/2018/05/06/creating-a-custom-phpunit-command-for-docksal /blog/creating-a-custom-phpunit-command-for-docksal permanent -redir /blog/add-date-popup-calendar-custom-form /blog/how-add-date-popup-calendar-custom-form permanent -redir /blog/adding-methods-decorating-entity-metadata-wrapper /blog/decorating-entity-metadata-wrapper-add-refactor-methods permanent -redir /blog/announcing-drupal-vm-generator /blog/announcing-the-drupal-vm-generator permanent -redir /blog/announcing-the-drupal-vm-config-generator /blog/announcing-the-drupal-vm-generator permanent -redir /blog/back-to-the-future-git-diff-apply /blog/back-future-gits-diff-apply-commands permanent -redir /blog/building-gmail-filters-in-php /blog/building-gmail-filters-php permanent -redir /blog/building-new-phpsw-website /blog/building-the-new-phpsw-website permanent -redir /blog/building-presentation-slides-reveal-js-tailwind-css /blog/building-presentation-slides-rst2pdf permanent -redir /blog/building-speaker-leaderboard-php-south-wales-using-drupal-symfony /blog/building-speaker-leaderboard-php-south-wales-drupal-symfony permanent -redir /blog/create-and-apply-patches /blog/how-create-apply-patches permanent -redir /blog/create-flickr-photo-gallery-using-feeds-cck-and-views /blog/create-flickr-photo-gallery-using-feeds-cck-views permanent -redir /blog/creating-and-using-custom-tokens-drupal-7 /blog/creating-using-custom-tokens-drupal-7 permanent -redir /blog/creating-custom-docksal-commands /blog/creating-custom-phpunit-command-docksal permanent -redir /blog/debugging-drupal-commerce-promotions-illiminate-collections /blog/debugging-drupal-commerce-illuminate-collections permanent -redir /blog/decorating-entity-metadata-wrapper-add-add-refactor-methods /blog/decorating-entity-metadata-wrapper-add-refactor-methods permanent -redir /blog/dev-book-club-refactoring-chapter-1 /blog/dev-book-club-notes-refactoring-chapter-1 permanent -redir /blog/dividing-drupals-process-preprocess-functions-separate-files /blog/dividing-drupals-process-and-preprocess-functions-separate-files permanent -redir /blog/drupal-8-commerce-fixing-no-such-customer-error-(on-)?checkout /blog/drupal-8-commerce-fixing-no-such-customer-error-checkout permanent -redir /blog/drupal-vm-generator-291-released /blog/drupal-vm-generator-updates permanent -redir /blog/drupalcamp-london-2019-tickets /blog/drupalcamp-london-2019-tickets-available-call-sessions permanent -redir /blog/drush-make-drupalbristol /talks/drush-make-drupalbristol permanent -redir /blog/easier-git-repository-cloning-with-insteadof /blog/easier-git-repository-cloning-insteadof permanent -redir /blog/easier-sculpin-commands-with-composer-and-npm-scripts /blog/easier-sculpin-commands-composer-npm-scripts permanent -redir /blog/editing-meetup-videos-kdenlive /blog/editing-meetup-videos-linux-kdenlive permanent -redir /blog/examples-of-laravel-collections-in-drupal /blog/using-laravel-collections-drupal permanent -redir /blog/experimenting-with-events-in-drupal-8 /blog/experimenting-events-drupal-8 permanent -redir /blog/fix-vagrant-loading-wrong-virtual-machine /blog/how-fix-vagrant-loading-wrong-virtual-machine permanent -redir /blog/fixing-drupal-simpletest-docker /blog/fixing-drupal-simpletest-issues-inside-docker-containers permanent -redir /blog/forward-one-domain-another-using-modrewrite-and-htaccess /blog/forward-one-domain-another-using-modrewrite-htaccess permanent -redir /blog/forward-one-domain-another-using-modrewrite-and-htaccess /blog/forward-one-domain-another-using-modrewrite-htaccess permanent -redir /blog/git-format-patch /blog/git-format-patch-your-friend permanent -redir /blog/how-easily-embed-typekit-fonts-your-drupal-website /blog/easily-embed-typekit-fonts-your-drupal-website permanent -redir /blog/how-split-new-drupal-contrib-project-within-another-repository /blog/splitting-new-drupal-project-from-repo permanent -redir /blog/how-style-drupal-6s-taxonomy-lists-php-css-and-jquery /blog/style-drupal-6s-taxonomy-lists-php-css-jquery permanent -redir /blog/include-local-drupal-settings-file-environment-configuration-overrides /blog/include-local-drupal-settings-file-environment-configuration-and-overrides permanent -redir /blog/install-and-configure-subversion-svn-server-ubuntu /blog/how-install-configure-subversion-svn-server-ubuntu permanent -redir /blog/live-blogging-symfonylive-london /blog/live-blogging-symfonylive-london-2019 permanent -redir /blog/minimum-core-version /blog/how-define-minimum-drupal-core-version permanent -redir /blog/nginx-redirects-with-query-string-arguments /blog/nginx-redirects-query-string-arguments permanent -redir /blog/null-users-and-system-users-in-drupal /blog/null-users-system-users-drupal permanent -redir /blog/overridding-phpcs-configuration-drupal-ci /blog/overriding-phpcs-configuration-drupal-ci permanent -redir /blog/pantheon-settings-files /blog/include-environment-specific-settings-files-pantheon permanent -redir /blog/pdfpc-pdf-presenter-console-notes /blog/presenting-pdf-slides-using-pdfpc-pdf-presenter-console permanent -redir /blog/php-apps-subdirectory-nginx /blog/how-put-your-php-application-subdirectory-another-site-nginx permanent -redir /blog/presenting-tailwind-css-ansible-cms-philly /blog/presenting-on-tailwind-css-and-ansible-at-cms-philly permanent -redir /blog/programmatically-load-(an-)?entityform-(in-)?drupal-7 /blog/entityform permanent -redir /blog/published-my-first-docker-images-docker-hub /blog/published-my-first-docker-images-docker-hub-adr-tools-sculpin-rst2pdf permanent -redir /blog/publishing-sculpin-sites-(with-)?github-pages /blog/publishing-sculpin-sites-github-pages permanent -redir /blog/queuing-private-messages-in-drupal-8 /blog/queuing-private-messages-drupal-8 permanent -redir /blog/quick-project-switching-in-phpstorm /blog/quick-project-switching-phpstorm permanent -redir /blog/quickly-apply-patches-using-git-and-curl-or-wget /blog/quickly-apply-patches-using-git-curl-or-wget permanent -redir /blog/rebuilding-bartik-with-vuejs-tailwind-css /blog/rebuilding-bartik-drupals-default-theme-vuejs-tailwind-css permanent -redir /blog/rebuilding-bartik-with-vuejs-tailwind-css-part-2 /blog/rebuilding-bartik-drupals-default-theme-vuejs-tailwind-css-part-2 permanent -redir /blog/rebuilding-uis-tailwind-css /blog/uis-ive-rebuilt-tailwind-css permanent -redir /blog/restructuring-my-tailwindjs-config-files /blog/restructuring-my-tailwindjs-configuration-files permanent -redir /blog/retrieving-profile-data-user-using-entity-metadata-wrapper /blog/cleanly-retrieving-user-profile-data-using-entity-metadata-wrapper permanent -redir /blog/running-drupal-with-symfony-local-server /blog/running-drupal-88-symfony-local-server permanent -redir /blog/running-phpunit-tests-docksal-phpstorm /blog/how-run-drupal-8-phpunit-tests-within-docksal-phpstorm permanent -redir /blog/simplifying-drupal-migrations-with-xautoload /blog/simplifying-drupal-migrations-xautoload permanent -redir /blog/speaking-drupalcon-barcelona-2020 /blog/speaking-drupalcon-europe-2020 permanent -redir /blog/speaking-during-lockdown /blog/speaking-remotely-during-covid-19 permanent -redir /blog/speaking-remotely-during-lockdown /blog/speaking-remotely-during-covid-19 permanent -redir /blog/style-drupal-6s-taxonomy-lists-php-css-jquery /blog/style-drupal-6s-taxonomy-lists-php-css-and-jquery permanent -redir /blog/survey-results-my-drupalcon-europe-session /blog/survey-results-my-drupalcon-europe-session-test-driven-drupal permanent -redir /blog/system-users-null-users /blog/null-users-and-system-users-in-drupal permanent -redir /blog/test-driven-drupal-gitstore-leanpub /blog/test-driven-drupal-on-gitstore-leanpub permanent -redir /blog/test-driven-drupal-presentation-drupalcon-europe-0 /blog/test-driven-drupal-presentation-drupalcon-europe permanent -redir /blog/test-driven-drupal-session-drupalcon-europe /blog/test-driven-drupal-presentation-drupalcon-europe permanent -redir /blog/test-driven-drupal-session-video-drupalcon-europe /blog/test-driven-drupal-presentation-drupalcon-europe permanent -redir /blog/testing-tailwind-css-plugins-with-jest /blog/testing-tailwind-css-plugins-jest permanent -redir /blog/testing-tailwindcss-plugins-with-jest /blog/testing-tailwind-css-plugins-jest permanent -redir /blog/tweets-from-drupalcamp-london /blog/tweets-drupalcamp-london permanent -redir /blog/updating-features-and-adding-components-using-drush /blog/updating-features-adding-components-using-drush permanent -redir /blog/updating-forked-repositories-github /blog/updating-forked-github-repos permanent -redir /blog/use-regular-expressions-search-and-replace-coda-or-textmate /blog/use-regular-expressions-search-replace-coda-or-textmate permanent -redir /blog/using-environment-variables-settings-docksal /blog/how-use-environment-variables-your-drupal-settings-docksal permanent -redir /blog/using-psr-4-autoloading-your-drupal-7-test-cases /blog/psr4-autoloading-test-cases-drupal-7 permanent -redir /blog/using-tailwind-css-in-your-drupal-theme /blog/using-tailwind-css-your-drupal-theme permanent -redir /blog/using-the-pcss-extension-postcss-webpack-encore /blog/using-pcss-extension-postcss-webpack-encore permanent -redir /blog/weeknotes-june-5th /blog/weeknotes-2021-06-05 permanent -redir /blog/writing-drupal-module-test-driven-development-tdd /blog/writing-new-drupal-8-module-using-test-driven-development-tdd permanent -redir /book /test-driven-drupal permanent -redir /calendars? https://savvycal.com/opdavies permanent -redir /cms-philly /articles/presenting-on-tailwind-css-and-ansible-at-cms-philly permanent -redir /code-enigma-interview https://blog.codeenigma.com/interview-with-a-drupal-expert-9fcd8e0fad28 permanent -redir /consulting / permanent -redir /contrib-half-hour https://www.youtube.com/playlist?list=PLu-MxhbnjI9rHroPvZO5LEUhr58Yl0j_F permanent -redir /cv /cv.txt permanent -redir /d0P5z /talks/drupal-8-php-libraries-drupalorg-api permanent -redir /d7 /drupal7 permanent -redir /dcbristol-cfp https://www.papercall.io/drupalcamp-bristol-2019 permanent -redir /dcbristol17-videos https://www.youtube.com/playlist?list=PLOwPvExSyLLngtd6R4PUD9MCXa6QL_obA permanent -redir /dcbristol19-announced /articles/drupalcamp-bristol-2019-speakers-sessions-announced permanent -redir /dclondon-sat https://drupalcamp.london/schedule/saturday permanent -redir /dclondon-sun https://drupalcamp.london/schedule/sunday permanent -redir /dclondon20 /articles/drupalcamp-london-testing-workshop permanent -redir /ddev-phpunit-command /blog/creating-custom-phpunit-command-ddev permanent -redir /deploying-php-ansible /talks/deploying-php-ansible-ansistrano permanent -redir /dks7E https://www.youtube.com/watch?v=PLS4ET7FAcU permanent -redir /do-library https://github.com/opdavies/drupalorg-api-php permanent -redir /do-projects https://github.com/opdavies/drupal-module-drupalorg-projects permanent -redir /docksal-phpunit-phpstorm /articles/running-phpunit-tests-docksal-phpstorm permanent -redir /docksal-posts /articles/tags/docksal permanent -redir /dransible https://github.com/opdavies/dransible permanent -redir /dransible-drupal-9 /blog/upgrading-dransible-project-drupal-9 permanent -redir /drupal-bristol-march-19 https://docs.google.com/presentation/d/1pk9LIN-hHX73kvDdo-lzgmKlAeH33_K_uvI0t7A-rvY/edit?usp=sharing permanent -redir /drupal-consultant /drupal-consulting permanent -redir /drupal-consulting / permanent -redir /drupal-core-live-stream https://www.youtube.com/watch?v=OK4FWwh1gQU permanent -redir /drupal-core-testing-gate https://www.drupal.org/core/gates#testing permanent -redir /drupal-first-time-issues https://www.drupal.org/project/issues/search?text=&projects=&assigned=&submitted=&project_issue_followers=&status%5B%5D=Open&issue_tags_op=%3D&issue_tags=Novice permanent -redir /drupal-forum-post http://www.webmaster-forums.net/webmasters-corner/developing-my-website-using-php-and-mysql#comment-1231537 permanent -redir /drupal-marketplace-uk https://www.drupal.org/drupal-services?offices%5B%5D=24460 permanent -redir /drupal-meetups-twitterbot /articles/introducing-the-drupal-meetups-twitterbot permanent -redir /drupal-novice-issues https://www.drupal.org/project/issues/search?text=&projects=&assigned=&submitted=&project_issue_followers=&status%5B%5D=Open&issue_tags_op=%3D&issue_tags=Novice permanent -redir /drupal-php-developer /drupal-consultant permanent -redir /drupal-php-developer-consultant-uk /drupal-php-developer permanent -redir /drupal-tailwind-demo https://www.youtube.com/watch?v=1eM-Gw6GI4g permanent -redir /drupal-tailwindcss https://www.drupal.org/project/tailwindcss permanent -redir /drupal-vuejs /talks/decoupling-drupal-vuejs/ permanent -redir /drupal7 /drupal-upgrade permanent -redir /drupalcamp-london-2019-tickets /articles/drupalcamp-london-2019-tickets permanent -redir /drupalcamp-nyc-training https://www.youtube.com/watch?v=3M9c4UUzKm0 permanent -redir /drupalorg https://www.drupal.org/u/opdavies permanent -redir /drupalorg-project-issues https://www.drupal.org/project/issues/search?projects=Override+Node+Options%2C+Tailwind+CSS+Starter+Kit%2C+Block+ARIA+Landmark+Roles%2C+Copyright+Block+module%2C+System+User%2C+Null+User%2C+Collection+class%2C+Pathauto+Menu+Link%2C+Webform+ARIA&project_issue_followers=&status%5B%5D=1&status%5B%5D=13&status%5B%5D=8&status%5B%5D=14&status%5B%5D=15&issue_tags_op=%3D permanent -redir /drupalversary https://github.com/opdavies/drupal-module-drupalversary permanent -redir /elewant https://elewant.com/shepherd/admire/opdavies permanent -redir /feed /rss.xml permanent -redir /first-drupal-core-issue https://www.drupal.org/project/drupal/issues/753898 permanent -redir /first-npm-package https://www.npmjs.com/package/tailwindcss-vuejs permanent -redir /freeagent https://opdavies.freeagent.com permanent -redir /git-flow /talks/git-flow permanent -redir /gitlab https://gitlab.com/opdavies permanent -redir /gitstore https://enjoy.gitstore.app/maintainers/opdavies permanent -redir /gmail-filters https://gitlab.com/opdavies/gmail-filters permanent -redir /images/me-precedent.jpg /sites/default/files/images/social-avatar.jpg permanent -redir /inviqa-tailwind-demo https://play.tailwindcss.com/Yfmw8O5UNN permanent -redir /inviqa-tailwind-notes https://gist.github.com/opdavies/e6f0f4938506a6859acf1aca8b4e1a74 permanent -redir /join-php-south-wales-slack https://join.slack.com/t/phpsouthwales/shared_invite/zt-4vuetc43-AvtEK1WqNzp5k1w4yWKOJA permanent -redir /jy6rW https://www.meetup.com/PHP-South-Wales/events/264731393 permanent -redir /kB6Jd /articles/running-drupal-with-symfony-local-server/ permanent -redir /kmDRA https://www.bbc.co.uk/news/uk-46561779 permanent -redir /leeds-php-drupal-9 https://www.meetup.com/leedsphp/events/272504993 permanent -redir /live https://www.youtube.com/channel/UCkeK0qF9HHUPQH_fvn4ghqQ permanent -redir /npm https://www.npmjs.com/~opdavies permanent -redir /oFlkS /articles/test-driven-drupal-on-gitstore-leanpub permanent -redir /oliver-davies-uk-based-drupal-symfony-developer /oliver-davies-uk-based-drupal-php-developer permanent -redir /pair-programming /pair permanent -redir /pair-with-me /pair permanent -redir /pairing /pair permanent -redir /php-ansible /talks/deploying-php-ansible-ansistrano permanent -redir /presentations/building-presenting-slide-decks-rst2pdf /presentations/rst2pdf permanent -redir /presentations/building-static-websites-sculpin /presentations/sculpin permanent -redir /qSHAl /articles/published-my-first-npm-package/ permanent -redir /qT1Rb https://github.com/opdavies/drupal-meetups-twitterbot permanent -redir /rebuilding-acquia https://rebuilding-acquia.oliverdavies.uk permanent -redir /rebuilding-bartik /articles/rebuilding-bartik-with-vuejs-tailwind-css permanent -redir /rebuilding-bristol-js https://github.com/opdavies/rebuilding-bristol-js permanent -redir /rebuilding-pantheon https://play.tailwindcss.com/LND98XihGI?layout=horizontal permanent -redir /rebuilding-platformsh https://rebuilding-platformsh.oliverdavies.uk permanent -redir /rebuilding-symfony https://github.com/opdavies/rebuilding-symfony permanent -redir /rk29B https://www.meetup.com/PHP-South-Wales/events/268422525 permanent -redir /roadmap /drupal-upgrade permanent -redir /rss /rss.xml permanent -redir /rst2pdf /talks/building-presenting-slide-decks-rst2pdf permanent -redir /s9MjJ https://symfonycasts.com/screencast/symfony permanent -redir /sculpin /talks/building-static-websites-sculpin permanent -redir /sculpin-encore-versioning https://github.com/opdavies/oliverdavies.uk/commit/d192b04aefa6e7a21bfc1f2e0fe0a16111e0e8a2 permanent -redir /sites/default/files/images/social-avatar.jpg /images/social-avatar.jpg permanent -redir /skills https://opdavies-skills-tailwindcss.netlify.com/ permanent -redir /slides-drupal-9 https://slides-upgrading-to-drupal-9.oliverdavies.uk permanent -redir /slides-upgrading-to-drupal-9 https://slides-upgrading-to-drupal-9.oliverdavies.uk permanent -redir /slides-upgrading-to-drupal-9/index.html https://slides-upgrading-to-drupal-9.oliverdavies.uk permanent -redir /slides-working-with-workspace https://slides-working-with-workspace.oliverdavies.uk permanent -redir /speaker /press permanent -redir /speaker-info /speaker permanent -redir /speaker-information /speaker permanent -redir /speaking-videos https://www.youtube.com/playlist?list=PLHn41Ay7w7kfAzczswrANch5oHAPZBlvu permanent -redir /stream https://www.youtube.com/channel/UCkeK0qF9HHUPQH_fvn4ghqQ/live permanent -redir /subscription / permanent -redir /swap-markdown-parser https://github.com/opdavies/sculpin-twig-markdown-bundle-example/tree/swap-markdown-parser permanent -redir /symfony https://connect.symfony.com/profile/opdavies permanent -redir /symfony-server /articles/running-drupal-with-symfony-local-server permanent -redir /symfonylive /articles/live-blogging-symfonylive-london permanent -redir /symposium https://symposiumapp.com/u/opdavies permanent -redir /tailwind-css-talk /talks/taking-flight-tailwind-css permanent -redir /tailwind-repos https://github.com/opdavies?utf8=%e2%9c%93&tab=repositories&q=tailwindcss permanent -redir /tailwind-talk /talks/taking-flight-with-tailwind-css permanent -redir /tailwindcss-demo http://tailwindcss-demo.oliverdavies.uk/ permanent -redir /talks /presentations permanent -redir /talks-offer-tweet https://twitter.com/opdavies/status/1250870367712935938 permanent -redir /talks/2012/09/05/what-is-this-drupal-thing-unified-diff /talks/what-is-this-drupal-thing permanent -redir /talks/2013/07/10/drupal-ldap-swdug /talks/drupal-ldap permanent -redir /talks/2014/03/01/git-flow-drupalcamp-london-2014 /talks/git-flow permanent -redir /talks/2014/07/02/drush-make-drupalbristol-drupal-bristol /talks/drush-make-drupalbristol permanent -redir /talks/2014/08/19/drupal-association-swdug /talks/drupal-association permanent -redir /talks/2015/01/18/drupalorg-2015-drupalcamp-brighton-2015 /talks/drupalorg-in-2015-whats-coming-next permanent -redir /talks/2015/02/28/drupalorg-2015-drupalcamp-london-2015 /talks/drupalorg-in-2015-whats-coming-next permanent -redir /talks/2015/04/08/drupal-8-phpsw /talks/drupal-8 permanent -redir /talks/2015/07/25/test-drive-twig-with-sculpin-drupalcamp-north-2015 /talks/test-drive-twig-with-sculpin permanent -redir /talks/2015/08/25/dancing-for-drupal-umbristol /talks/dancing-for-drupal permanent -redir /talks/2015/10/14/sculpin-phpsw /talks/sculpin permanent -redir /talks/2016/03/05/drupal-8-module-development-drupalcamp-london-2016 /talks/getting-started-with-drupal-8-module-development permanent -redir /talks/2016/03/09/drupal-vm-generator-nwdug /talks/drupal-vm-generator permanent -redir /talks/2016/04/02/drupal-vm-generator-drupal-bristol /talks/drupal-vm-generator permanent -redir /talks/2016/06/11/drupal-8-rejoining-the-herd-php-south-coast-2016 /talks/drupal-8-rejoining-the-herd permanent -redir /talks/2016/07/23/drupal-vm-meet-symfony-console-drupalcamp-bristol-2016 /talks/drupal-vm-meet-symfony-console permanent -redir /talks/2016/11/09/drupal-development-with-composer-phpsw /talks/drupal-development-with-composer permanent -redir /talks/2016/11/17/goodbye-drush-make-hello-composer-drupal-bristol /talks/goodbye-drush-make-hello-composer permanent -redir /talks/2017/01/18/getting-your-data-into-drupal-8-drupal-bristol /talks/getting-your-data-into-drupal-8 permanent -redir /talks/2017/03/04/getting-your-data-into-drupal-8-drupalcamp-london-2017 /talks/getting-your-data-into-drupal-8 permanent -redir /talks/ansible-ansistrano https://www.oliverdavies.uk/talks/deploying-php-ansible-ansistrano permanent -redir /talks/deploying-php-applications-fabric /talks/deploying-php-fabric permanent -redir /talks/deploying-php-applications-with-fabric /talks/deploying-php-fabric permanent -redir /talks/drupal-vm-generator-2 /talks/drupal-vm-generator permanent -redir /talks/drupalorg-2015-2 /talks/drupalorg-2015 permanent -redir /talks/drupalorg-in-2015-whats-coming-next /talks/drupalorg-2015 permanent -redir /talks/getting-started-with-drupal-8-module-development /drupal-8-module-development permanent -redir /talks/having-fun-drupal-8-php-libraries-drupalorg-api /talks/drupal-8-php-libraries-drupalorg-api permanent -redir /talks/never-commit-master-introduction-git-flow /talks/git-flow permanent -redir /talks/sculpin /talks/building-static-websites-sculpin permanent -redir /talks/tailwind /talks/taking-flight-with-tailwind-css/ permanent -redir /talks/taking-flight-tailwind-css /talks/taking-flight-with-tailwind-css permanent -redir /talks/using-laravel-collections-outside-laravel /talks/using-illuminate-collections-outside-laravel permanent -redir /talks/working-workspace /talks/working-with-workspace permanent -redir /tdd-blog https://github.com/opdavies/drupal-module-tdd-blog permanent -redir /tdd-test-driven-drupal /talks/tdd-test-driven-drupal/ permanent -redir /team-coaching / permanent -redir /test-driven-drupal-book /test-driven-drupal permanent -redir /testing-drupal https://www.oliverdavies.uk/talks/tdd-test-driven-drupal permanent -redir /testing-drupal-intro https://inviqa.com/blog/drupal-automated-testing-introduction permanent -redir /testing-tailwind-plugins /articles/testing-tailwindcss-plugins-with-jest permanent -redir /testing-workshop https://github.com/opdavies/workshop-drupal-automated-testing permanent -redir /testing-workshop-code https://github.com/opdavies/workshop-drupal-automated-testing-code permanent -redir /todoist-filters https://gist.github.com/opdavies/6709fbdac5c3babbd94137bcc8b8e3c2 permanent -redir /twitter-tweaks https://github.com/opdavies/chrome-extension-twitter-tweaks permanent -redir /upgrading-to-drupal-9 /talks/upgrading-your-site-drupal-9 permanent -redir /uxbjV https://www.drupal.org/project/copyright_block permanent -redir /vyTEF https://www.npmjs.com/package/tailwindcss-vuejs permanent -redir /webpack-encore-pcss-regex https://regexr.com/51iaf permanent -redir /wordcamp-bristol-tailwindcss https://2019.bristol.wordcamp.org/session/taking-flight-with-tailwind-css permanent -redir /wordpress-tailwind https://github.com/opdavies/wordcamp-bristol-2019 permanent -redir /work /drupal-php-developer permanent -redir /working-with-workspace /talks/working-with-workspace permanent -redir /workshop-drupal-testing https://github.com/opdavies/workshop-drupal-automated-testing permanent -redir /workspace-demo https://github.com/opdavies/working-with-workspace-demo permanent -redir /wp-tailwind https://wp-tailwind.oliverdavies.uk permanent -redir /wp-tailwind-repo https://github.com/opdavies/wordcamp-bristol-2019 permanent -redir /wp-tailwind-starter https://github.com/opdavies/wordpress-tailwindcss-startker-kit permanent -redir /wp-tailwind-static https://wp-tailwind.oliverdavies.uk permanent -redir /yXhoS /talks/things-you-should-know-about-php permanent diff --git a/hosts/hetznix/services/caddy/vhosts/www.oliverdavies.uk-redirects.nix b/hosts/hetznix/services/caddy/vhosts/www.oliverdavies.uk-redirects.nix new file mode 100644 index 00000000..7d546067 --- /dev/null +++ b/hosts/hetznix/services/caddy/vhosts/www.oliverdavies.uk-redirects.nix @@ -0,0 +1,3066 @@ +[ + { + from = "/10-useful-drupal-6-modules-i-use-every-project"; + to = "/blog/10-useful-drupal-6-modules"; + } + { + from = "/2010/04/05/styling-drupal-6s-taxonomy-lists-with-php-css-and-jquery"; + to = "/blog/style-drupal-6s-taxonomy-lists-php-css-jquery"; + } + { + from = "/2010/04/28/using-imagecache-and-imagecrop-for-my-portfolio"; + to = "/blog/using-imagecache-imagecrop-my-portfolio"; + } + { + from = "/2010/05/29/importing-images-using-the-imagefieldimport-module"; + to = "/blog/quickly-import-multiples-images-using-imagefieldimport-module"; + } + { + from = "/2010/06/23/creating-a-block-of-social-media-icons-using-cck-views-and-nodequeue"; + to = "/blog/create-block-social-media-icons-using-cck-views-nodequeue"; + } + { + from = "/2010/07/05/thanks"; + to = "/blog/thanks"; + } + { + from = "/2010/08/17/create-a-better-photo-gallery-in-drupal-part-2"; + to = "/blog/create-better-photo-gallery-drupal-part-2"; + } + { + from = "/2014/05/21/git-format-patch"; + to = "/blog/git-format-patch-your-friend"; + } + { + from = "/2PxmyqP"; + to = "/articles/examples-of-laravel-collections-in-drupal"; + } + { + from = "/39CoG"; + to = "/articles/drupalcamp-london-testing-workshop"; + } + { + from = "/3eGQr"; + to = "https://github.com/howToCodeWell/howToCodeWellFM/blob/c927e0b3589f1d7375002f7fd70f0bfc9fc90449/composer.json#L17"; + } + { + from = "/6UhLN"; + to = "https://github.com/opdavies/sculpin-twig-markdown-bundle/pull/1"; + } + { + from = "/6i3YZ"; + to = "https://www.youtube.com/watch?v=vUK5sEbd-dk"; + } + { + from = "/9rv0Z"; + to = "https://www.drupal.org/project/override_node_options/issues/3109852"; + } + { + from = "/BhMZi"; + to = "https://git.drupalcode.org/search?utf8=%E2%9C%93&snippets=&scope=&repository_ref=8.x-1.x&search=baz&project_id=23203"; + } + { + from = "/NBi5h"; + to = "https://git.drupalcode.org/search?utf8=%E2%9C%93&search=bar&group_id=&project_id=23203&search_code=true&repository_ref=8.x-1.x&nav_source=navbar"; + } + { + from = "/P5KQ5"; + to = "https://www.npmjs.com/package/tailwindcss-skip-link"; + } + { + from = "/S8ZDA"; + to = "/articles/rebuilding-bartik-with-vuejs-tailwind-css-part-2"; + } + { + from = "/Wh48P"; + to = "https://github.com/opdavies/oliverdavies.uk/blob/master/source/_partials/talk/video.html.twig"; + } + { + from = "/XbzS2"; + to = "https://github.com/opdavies/gmail-filter-builder"; + } + { + from = "/YK1VH"; + to = "/articles/psr4-autoloading-test-cases-drupal-7"; + } + { + from = "/YilTZ$"; + to = "https://drupalcamp.london/tickets/training"; + } + { + from = "/about"; + to = "/"; + } + { + from = "/about/cv"; + to = "/cv"; + } + { + from = "/about/speaker"; + to = "/speaker"; + } + { + from = "/about/speaker-information"; + to = "/speaker-information"; + } + { + from = "/acquia-certifications"; + to = "https://certification.acquia.com/registry?fname=Oliver&lname=Davies&city=&state=&country=United+Kingdom&org=&exam=All"; + } + { + from = "/acquia-certified"; + to = "https://certification.acquia.com/?fname=Oliver&lname=Davies"; + } + { + from = "/ansible"; + to = "https://galaxy.ansible.com/opdavies"; + } + { + from = "/ansible-molecule"; + to = "/articles/test-driven-ansible-role-development-molecule"; + } + { + from = "/ansistrano-code"; + to = "https://github.com/opdavies/dransible"; + } + { + from = "/ansistrano-demo"; + to = "https://www.youtube.com/watch?v=PLS4ET7FAcU"; + } + { + from = "/ansistrano-slides"; + to = "/talks/deploying-php-ansible-ansistrano"; + } + { + from = "/archive/2022-08-28/how-started-programming"; + to = "/daily/2022-08-28/how-started-programming"; + } + { + from = "/archive/2022/08/20/return-to-offline-meetups-conferences"; + to = "/daily/2022/08/20/return-to-offline-meetups-conferences"; + } + { + from = "/archive/2022/08/23/git-gui-command-line"; + to = "/daily/2022/08/23/git-gui-command-line"; + } + { + from = "/archive/2022/08/25/why-i-work-in-neovim"; + to = "/daily/2022/08/25/why-i-work-in-neovim"; + } + { + from = "/archive/2022/08/26/always-be-learning"; + to = "/daily/2022/08/26/always-be-learning"; + } + { + from = "/archive/2022/08/27/giving-back"; + to = "/daily/2022/08/27/giving-back"; + } + { + from = "/archive/2022/08/29/why-like-drupal"; + to = "/daily/2022/08/29/why-like-drupal"; + } + { + from = "/archive/2022/08/30/why-dont-only-use-drupal"; + to = "/daily/2022/08/30/why-dont-only-use-drupal"; + } + { + from = "/archive/2022/08/31/monorepo-or-not"; + to = "/daily/2022/08/31/monorepo-or-not"; + } + { + from = "/archive/2022/09/01/conventional-commits-changelogs"; + to = "/daily/2022/09/01/conventional-commits-changelogs"; + } + { + from = "/archive/2022/09/02/automating-all-the-things-with-ansible"; + to = "/daily/2022/09/02/automating-all-the-things-with-ansible"; + } + { + from = "/archive/2022/09/04/using-ansible-for-server-configuration"; + to = "/daily/2022/09/04/using-ansible-for-server-configuration"; + } + { + from = "/archive/2022/09/05/using-ansible-for-local-configuration"; + to = "/daily/2022/09/05/using-ansible-for-local-configuration"; + } + { + from = "/archive/2022/09/06/deploying-applications-with-ansible"; + to = "/daily/2022/09/06/deploying-applications-with-ansible"; + } + { + from = "/archive/2022/09/07/my-tailwind-css-origin-story"; + to = "/daily/2022/09/07/my-tailwind-css-origin-story"; + } + { + from = "/archive/2022/09/08/keeping-secrets-with-ansible-vault"; + to = "/daily/2022/09/08/keeping-secrets-with-ansible-vault"; + } + { + from = "/archive/2022/09/09/refactoring-tailwind-component"; + to = "/daily/2022/09/09/refactoring-tailwind-component"; + } + { + from = "/archive/2022/09/10/automating-ansible-deployments-ci"; + to = "/daily/2022/09/10/automating-ansible-deployments-ci"; + } + { + from = "/archive/2022/09/11/custom-styles-tailwind-css-apply-theme-custom-plugins"; + to = "/daily/2022/09/11/custom-styles-tailwind-css-apply-theme-custom-plugins"; + } + { + from = "/archive/2022/09/12/month-/daily-emails"; + to = "daily/2022/09/12/month-daily-emails"; + } + { + from = "/archive/2022/09/14/simpletest-drupal-test"; + to = "/daily/2022/09/14/simpletest-drupal-test"; + } + { + from = "/archive/2022/09/16/why-mostly-write-functional-and-integration-tests"; + to = "/daily/2022/09/16/why-mostly-write-functional-and-integration-tests"; + } + { + from = "/archive/2022/09/17/thoughts-automated-code-formatting"; + to = "/daily/2022/09/17/thoughts-automated-code-formatting"; + } + { + from = "/archive/2022/09/19/useful-git-configuration"; + to = "/daily/2022/09/19/useful-git-configuration"; + } + { + from = "/archive/2022/09/20/why-like-trunk-based-development"; + to = "/daily/2022/09/20/why-like-trunk-based-development"; + } + { + from = "/archive/2022/09/21/being-drupal-contribution-mentor"; + to = "/daily/2022/09/21/being-drupal-contribution-mentor"; + } + { + from = "/archive/2022/09/22/releasing-drupal-module-template"; + to = "/daily/2022/09/22/releasing-drupal-module-template"; + } + { + from = "/archive/2022/09/23/adrs-technical-design-documents"; + to = "/daily/2022/09/23/adrs-technical-design-documents"; + } + { + from = "/archive/2022/09/25/using-component-library-for-front-end-development"; + to = "/daily/2022/09/25/using-component-library-for-front-end-development"; + } + { + from = "/archive/2022/09/26/experimenting-with-the-nix-package-manager"; + to = "/daily/2022/09/26/experimenting-with-the-nix-package-manager"; + } + { + from = "/archive/2022/09/27/mentoring-with-drupal-career-online"; + to = "/daily/2022/09/27/mentoring-with-drupal-career-online"; + } + { + from = "/archive/2022/09/28/mob-programming-php-south-wales"; + to = "/daily/2022/09/28/mob-programming-php-south-wales"; + } + { + from = "/archive/2022/09/30/store-wars-vuejs"; + to = "/daily/2022/09/30/store-wars-vuejs"; + } + { + from = "/archive/2022/10/12/overcoming-deployment-anxiety"; + to = "/daily/2022/10/12/overcoming-deployment-anxiety"; + } + { + from = "/archive/2022/10/17/14-years-drupalorg"; + to = "/daily/2022/10/17/14-years-drupalorg"; + } + { + from = "/archive/2022/10/18/pair-mob-programming"; + to = "/daily/2022/10/18/pair-mob-programming"; + } + { + from = "/archive/2022/10/20/cherry-picking-commits-is-an-anti-pattern"; + to = "/daily/2022/10/20/cherry-picking-commits-is-an-anti-pattern"; + } + { + from = "/archive/2022/10/20/run-vs-task-runners/?"; + to = "/archive/2022/10/19/run-vs-task-runners"; + } + { + from = "/archive/2022/10/21/automated-testing-and-test-driven-development-are-not-the-same"; + to = "/daily/2022/10/21/automated-testing-and-test-driven-development-are-not-the-same"; + } + { + from = "/archive/2022/10/24/looking-at-localgov-drupal"; + to = "/daily/2022/10/24/looking-at-localgov-drupal"; + } + { + from = "/archive/2022/10/25/what-are-drupal-distributions"; + to = "/daily/2022/10/25/what-are-drupal-distributions"; + } + { + from = "/archive/2022/10/26/neovim-as-a-personalised-development-environment"; + to = "/daily/2022/10/26/neovim-as-a-personalised-development-environment"; + } + { + from = "/archive/2022/10/27/getting-back-into-live-streaming"; + to = "/daily/2022/10/27/getting-back-into-live-streaming"; + } + { + from = "/archive/2022/10/28/why-write-framework-agnostic-packages"; + to = "/daily/2022/10/28/why-write-framework-agnostic-packages"; + } + { + from = "/archive/2022/10/29/the-open-source-first-development-workflow"; + to = "/daily/2022/10/29/the-open-source-first-development-workflow"; + } + { + from = "/archive/2022/10/30/refactoring-one-large-test-into-multiple-smaller-tests"; + to = "/daily/2022/10/30/refactoring-one-large-test-into-multiple-smaller-tests"; + } + { + from = "/archive/2022/11/08/are-sprints-incompatible-with-continuous-deployment"; + to = "/daily/2022/11/08/are-sprints-incompatible-with-continuous-deployment"; + } + { + from = "/archive/2022/11/09/your-conference-talk-has-been-accepted"; + to = "/daily/2022/11/09/your-conference-talk-has-been-accepted"; + } + { + from = "/archive/2022/11/12/building-a-minimum-viable-product-and-managing-technical-debt"; + to = "/daily/2022/11/12/building-a-minimum-viable-product-and-managing-technical-debt"; + } + { + from = "/archive/2022/11/12/creating-small-proof-of-concept-application-afternoon"; + to = "/daily/2022/11/12/creating-small-proof-of-concept-application-afternoon"; + } + { + from = "/archive/2022/11/13/how-i-manage-multiple-drupal-websites-using-the-same-codebase"; + to = "/daily/2022/11/13/how-i-manage-multiple-drupal-websites-using-the-same-codebase"; + } + { + from = "/archive/2022/11/14/camel-case-or-snake-case-for-test-methods"; + to = "/daily/2022/11/14/camel-case-or-snake-case-for-test-methods"; + } + { + from = "/archive/2022/11/15/writing-good-automated-test-names"; + to = "/daily/2022/11/15/writing-good-automated-test-names"; + } + { + from = "/archive/2022/11/16/why-don't-you-write-automated-tests"; + to = "/daily/2022/11/16/why-don't-you-write-automated-tests"; + } + { + from = "/archive/2022/11/17/agnostic-ci-pipelines-with-run-files"; + to = "/daily/2022/11/17/agnostic-ci-pipelines-with-run-files"; + } + { + from = "/archive/2022/11/18/one-test-a-day-keeps-bugs-away"; + to = "/daily/2022/11/18/one-test-a-day-keeps-bugs-away"; + } + { + from = "/archive/2022/11/19/are-missing-tests-a-blocker-to-refactoring"; + to = "/daily/2022/11/19/are-missing-tests-a-blocker-to-refactoring"; + } + { + from = "/archive/2022/11/20/version-controlled-commented-out-code"; + to = "/daily/2022/11/20/version-controlled-commented-out-code"; + } + { + from = "/archive/2022/11/21/git-tricks-to-avoid-committing-commented-out-and-other-unneeded-code"; + to = "/daily/2022/11/21/git-tricks-to-avoid-committing-commented-out-and-other-unneeded-code"; + } + { + from = "/archive/2022/11/22/tldr"; + to = "/daily/2022/11/22/tldr"; + } + { + from = "/archive/2022/11/23/do-you-need-to-branch"; + to = "/daily/2022/11/23/do-you-need-to-branch"; + } + { + from = "/archive/2022/11/24/doing-the-simplest-possible-thing"; + to = "/daily/2022/11/24/doing-the-simplest-possible-thing"; + } + { + from = "/archive/2022/11/25/plan-then-code"; + to = "/daily/2022/11/25/plan-then-code"; + } + { + from = "/archive/2022/11/30/ship-show-or-ask"; + to = "/daily/2022/11/30/ship-show-or-ask"; + } + { + from = "/archive/2022/12/01/writing-readable-code"; + to = "/daily/2022/12/01/writing-readable-code"; + } + { + from = "/archive/2022/12/02/commit-and-push-something-every-day"; + to = "/daily/2022/12/02/commit-and-push-something-every-day"; + } + { + from = "/archive/2022/12/03/what-to-do-with-todo-comments"; + to = "/daily/2022/12/03/what-to-do-with-todo-comments"; + } + { + from = "/archive/2022/12/04/writing-why-first-user-stories"; + to = "/daily/2022/12/04/writing-why-first-user-stories"; + } + { + from = "/archive/2022/12/05/outcomes-or-output"; + to = "/daily/2022/12/05/outcomes-or-output"; + } + { + from = "/archive/2022/12/06/should-you-comment-your-code"; + to = "/daily/2022/12/06/should-you-comment-your-code"; + } + { + from = "/archive/2022/12/07/separating-releases-from-deployments-with-feature-flags"; + to = "/daily/2022/12/07/separating-releases-from-deployments-with-feature-flags"; + } + { + from = "/archive/2022/12/08/the-decorator-design-pattern"; + to = "/daily/2022/12/08/the-decorator-design-pattern"; + } + { + from = "/archive/2022/12/09/how-and-why-i-started-using-postcss"; + to = "/daily/2022/12/09/how-and-why-i-started-using-postcss"; + } + { + from = "/archive/2022/12/10/managing-databases-with-neovim-and-docker"; + to = "/daily/2022/12/10/managing-databases-with-neovim-and-docker"; + } + { + from = "/archive/2022/12/15/happy-drupal-10-release-day"; + to = "/daily/2022/12/15/happy-drupal-10-release-day"; + } + { + from = "/archive/2022/12/20/automating-all-the-things,-including-infrastructure"; + to = "/daily/2022/12/20/automating-all-the-things,-including-infrastructure"; + } + { + from = "/archive/2022/12/21/duck-typing"; + to = "/daily/2022/12/21/duck-typing"; + } + { + from = "/archive/2022/12/22/the-boy-scout-rule"; + to = "/daily/2022/12/22/the-boy-scout-rule"; + } + { + from = "/archive/2022/12/23/speaking-at-php-stoke-and-nordevcon"; + to = "/daily/2022/12/23/speaking-at-php-stoke-and-nordevcon"; + } + { + from = "/archive/2022/12/28/debugging-gitignore-rules"; + to = "/daily/2022/12/28/debugging-gitignore-rules"; + } + { + from = "/archive/2022/12/29/what-is-the-cost-of-a-bug"; + to = "/daily/2022/12/29/what-is-the-cost-of-a-bug"; + } + { + from = "/archive/2022/12/30/tests-are-living-documentation"; + to = "/daily/2022/12/30/tests-are-living-documentation"; + } + { + from = "/archive/2022/12/31/just-start-writing"; + to = "/daily/2022/12/31/just-start-writing"; + } + { + from = "/archive/2023/01/01/types-and-static-analysis-saved-me-today"; + to = "/daily/2023/01/01/types-and-static-analysis-saved-me-today"; + } + { + from = "/archive/2023/01/02/dont-use-arbitrary-values-in-tailwind-css"; + to = "/daily/2023/01/02/dont-use-arbitrary-values-in-tailwind-css"; + } + { + from = "/archive/2023/01/03/tailwind-css-extensibility-is-one-of-its-best-features"; + to = "/daily/2023/01/03/tailwind-css-extensibility-is-one-of-its-best-features"; + } + { + from = "/archive/2023/01/04/testable-tailwind-css-plugins"; + to = "/daily/2023/01/04/testable-tailwind-css-plugins"; + } + { + from = "/archive/2023/01/05/adding-tailwind-to-an-existing-project"; + to = "/daily/2023/01/05/adding-tailwind-to-an-existing-project"; + } + { + from = "/archive/2023/01/06/utility-first-or-utility-last"; + to = "/daily/2023/01/06/utility-first-or-utility-last"; + } + { + from = "/archive/2023/01/07/reducing-utility-class-duplication"; + to = "/daily/2023/01/07/reducing-utility-class-duplication"; + } + { + from = "/archive/2023/01/16/back-after-php-stoke"; + to = "/daily/2023/01/16/back-after-php-stoke"; + } + { + from = "/archive/2023/01/17/things-to-know-about-php"; + to = "/daily/2023/01/17/things-to-know-about-php"; + } + { + from = "/archive/2023/01/18/drupal-turns-22"; + to = "/daily/2023/01/18/drupal-turns-22"; + } + { + from = "/archive/2023/01/19/long-term-maintainability-with-utility-classes-and-tailwind-css"; + to = "/daily/2023/01/19/long-term-maintainability-with-utility-classes-and-tailwind-css"; + } + { + from = "/archive/2023/01/20/tailwinds-classes-are-your-classes"; + to = "/daily/2023/01/20/tailwinds-classes-are-your-classes"; + } + { + from = "/archive/2023/01/21/tailwind-not-just-translating-css-to-utility-classes"; + to = "/daily/2023/01/21/tailwind-not-just-translating-css-to-utility-classes"; + } + { + from = "/archive/2023/01/22/building-bootstrap-css-examples-with-tailwind"; + to = "/daily/2023/01/22/building-bootstrap-css-examples-with-tailwind"; + } + { + from = "/archive/2023/01/23/debugging-with-git-bisect"; + to = "/daily/2023/01/23/debugging-with-git-bisect"; + } + { + from = "/archive/2023/01/24/small-commits-and-good-commit-messges"; + to = "/daily/2023/01/24/small-commits-and-good-commit-messges"; + } + { + from = "/archive/2023/01/25/to-squash-or-not-to-squash"; + to = "/daily/2023/01/25/to-squash-or-not-to-squash"; + } + { + from = "/archive/2023/02/07/astro-as-a-static-site-generator"; + to = "/daily/2023/02/07/astro-as-a-static-site-generator"; + } + { + from = "/archive/2023/02/08/fetching-api-data-with-astro"; + to = "/daily/2023/02/08/fetching-api-data-with-astro"; + } + { + from = "/archive/2023/02/09/creating-api-endpoints-with-astro"; + to = "/daily/2023/02/09/creating-api-endpoints-with-astro"; + } + { + from = "/archive/2023/02/16/tailwind-css-at-the-bristol-software-development-meetup"; + to = "/daily/2023/02/16/tailwind-css-at-the-bristol-software-development-meetup"; + } + { + from = "/archive/2023/02/17/upgrading-my-drupal-example-project-to-drupal-10"; + to = "/daily/2023/02/17/upgrading-my-drupal-example-project-to-drupal-10"; + } + { + from = "/archive/2023/02/18/drupal-10-version-of-override-node-options"; + to = "/daily/2023/02/18/drupal-10-version-of-override-node-options"; + } + { + from = "/archive/2023/02/19/clients-dont-care-which-design-pattern-you-use"; + to = "/daily/2023/02/19/clients-dont-care-which-design-pattern-you-use"; + } + { + from = "/archive/2023/02/20/tailwind-why-i-prefer-to-extract-html-components"; + to = "/daily/2023/02/20/tailwind-why-i-prefer-to-extract-html-components"; + } + { + from = "/archive/2023/03/01/tailwind-css-at-the-norfolk-developer-conference"; + to = "/daily/2023/03/01/tailwind-css-at-the-norfolk-developer-conference"; + } + { + from = "/archive/2023/03/02/busy-working-on-client-projects"; + to = "/daily/2023/03/02/busy-working-on-client-projects"; + } + { + from = "/archive/2023/03/03/adding-a-localgov-drupal-example"; + to = "/daily/2023/03/03/adding-a-localgov-drupal-example"; + } + { + from = "/archive/2023/03/04/why-i-built-a-tool-to-generate-configuration-files"; + to = "/daily/2023/03/04/why-i-built-a-tool-to-generate-configuration-files"; + } + { + from = "/archive/2023/03/05/mentoring-for-school-of-code"; + to = "/daily/2023/03/05/mentoring-for-school-of-code"; + } + { + from = "/archive/2023/03/08/automating-infrastructure-with-iac"; + to = "/daily/2023/03/08/automating-infrastructure-with-iac"; + } + { + from = "/archive/2023/03/09/in-what-language-should-i-write-my-automation"; + to = "/daily/2023/03/09/in-what-language-should-i-write-my-automation"; + } + { + from = "/archive/2023/03/13/what-problem-am-i-trying-to-solve"; + to = "/daily/2023/03/13/what-problem-am-i-trying-to-solve"; + } + { + from = "/archive/2023/03/14/automating-all-the-things"; + to = "/daily/2023/03/14/automating-all-the-things"; + } + { + from = "/archive/2023/03/15/the-benefits-of-automation"; + to = "/daily/2023/03/15/the-benefits-of-automation"; + } + { + from = "/archive/2023/03/21/there-isnt-a-tailwind-looking-site"; + to = "/daily/2023/03/21/there-isnt-a-tailwind-looking-site"; + } + { + from = "/archive/2023/03/22/with-utility-styles-your-css-stops-growing"; + to = "/daily/2023/03/22/with-utility-styles-your-css-stops-growing"; + } + { + from = "/archive/2023/03/27/software-development-solving-problems-and-adding-value"; + to = "/daily/2023/03/27/software-development-solving-problems-and-adding-value"; + } + { + from = "/archive/2023/04/07/speaking-at-php-london"; + to = "/daily/2023/04/07/speaking-at-php-london"; + } + { + from = "/archive/2023/04/08/why-i-use-tmux"; + to = "/daily/2023/04/08/why-i-use-tmux"; + } + { + from = "/archive/2023/04/09/nix-nixos-home-manager-and-wsl2"; + to = "/daily/2023/04/09/nix-nixos-home-manager-and-wsl2"; + } + { + from = "/archive/2023/04/10/how-i-use-neovim-for-writing-php"; + to = "/daily/2023/04/10/how-i-use-neovim-for-writing-php"; + } + { + from = "/archive/2023/04/11/just-vs-make"; + to = "/daily/2023/04/11/just-vs-make"; + } + { + from = "/archive/2023/04/12/cleaner-php-code-with-promoted-constructor-properties"; + to = "/daily/2023/04/12/cleaner-php-code-with-promoted-constructor-properties"; + } + { + from = "/archive/2023/04/13/immutable-read-only-properties-in-php-8-1"; + to = "/daily/2023/04/13/immutable-read-only-properties-in-php-8-1"; + } + { + from = "/archive/2023/04/14/data-transfer-objects-and-value-objects"; + to = "/daily/2023/04/14/data-transfer-objects-and-value-objects"; + } + { + from = "/archive/2023/04/15/automatically-running-commands-with-nodemon"; + to = "/daily/2023/04/15/automatically-running-commands-with-nodemon"; + } + { + from = "/archive/2023/04/16/refactoring-with-readonly-classes-in-php-8-2"; + to = "/daily/2023/04/16/refactoring-with-readonly-classes-in-php-8-2"; + } + { + from = "/archive/2023/04/17/introducing-feature-flags-to-build-configs"; + to = "/daily/2023/04/17/introducing-feature-flags-to-build-configs"; + } + { + from = "/archive/2023/04/18/consistency-is-key"; + to = "/daily/2023/04/18/consistency-is-key"; + } + { + from = "/archive/2023/04/19/camel-case-or-snake-case-for-drupal-code"; + to = "/daily/2023/04/19/camel-case-or-snake-case-for-drupal-code"; + } + { + from = "/archive/2023/04/20/micro-refactorings"; + to = "/daily/2023/04/20/micro-refactorings"; + } + { + from = "/archive/2023/04/21/making-my-drupal-module-template-drupal-10-compatible"; + to = "/daily/2023/04/21/making-my-drupal-module-template-drupal-10-compatible"; + } + { + from = "/archive/2023/04/22/build-configs-as-a-service"; + to = "/daily/2023/04/22/build-configs-as-a-service"; + } + { + from = "/archive/2023/04/23/laravel-pipelines"; + to = "/daily/2023/04/23/laravel-pipelines"; + } + { + from = "/archive/2023/04/24/ci-pipelines-should-start-locally"; + to = "/daily/2023/04/24/ci-pipelines-should-start-locally"; + } + { + from = "/archive/2023/04/25/shortening-the-feedback-loop-even-more"; + to = "/daily/2023/04/25/shortening-the-feedback-loop-even-more"; + } + { + from = "/archive/2023/04/26/tdd-structure-a-new-test-by-writing-comments-first"; + to = "/daily/2023/04/26/tdd-structure-a-new-test-by-writing-comments-first"; + } + { + from = "/archive/2023/04/27/tdd-write-the-test-backwards"; + to = "/daily/2023/04/27/tdd-write-the-test-backwards"; + } + { + from = "/archive/2023/04/30/will-we-see-drupal-7-100"; + to = "/daily/2023/04/30/will-we-see-drupal-7-100"; + } + { + from = "/archive/2023/05/01/should-drupal-7-support-be-extended-again"; + to = "/daily/2023/05/01/should-drupal-7-support-be-extended-again"; + } + { + from = "/archive/2023/05/02/does-it-depend-on-who-you-ask"; + to = "/daily/2023/05/02/does-it-depend-on-who-you-ask"; + } + { + from = "/archive/2023/05/03/just-because-core-is-supported"; + to = "/daily/2023/05/03/just-because-core-is-supported"; + } + { + from = "/archive/2023/05/04/speaking-at-the-symfony-uk-meetup-london"; + to = "/daily/2023/05/04/speaking-at-the-symfony-uk-meetup-london"; + } + { + from = "/archive/2023/05/05/getting-to-green"; + to = "/daily/2023/05/05/getting-to-green"; + } + { + from = "/archive/2023/05/06/why-its-important-to-see-the-test-fail"; + to = "/daily/2023/05/06/why-its-important-to-see-the-test-fail"; + } + { + from = "/archive/2023/05/07/you-dont-need-to-think-about-what-to-do-next"; + to = "/daily/2023/05/07/you-dont-need-to-think-about-what-to-do-next"; + } + { + from = "/archive/2023/05/08/only-write-enough-code-to-get-a-failing-test"; + to = "/daily/2023/05/08/only-write-enough-code-to-get-a-failing-test"; + } + { + from = "/archive/2023/05/09/the-single-responsibility-principle"; + to = "/daily/2023/05/09/the-single-responsibility-principle"; + } + { + from = "/archive/2023/05/10/tailwind-css-makes-change-easier"; + to = "/daily/2023/05/10/tailwind-css-makes-change-easier"; + } + { + from = "/archive/2023/05/11/why-i-like-pair-and-mob-programming"; + to = "/daily/2023/05/11/why-i-like-pair-and-mob-programming"; + } + { + from = "/archive/2023/05/12/always-listen-to-the-mob"; + to = "/daily/2023/05/12/always-listen-to-the-mob"; + } + { + from = "/archive/2023/05/13/when-you-do-things-right"; + to = "/daily/2023/05/13/when-you-do-things-right"; + } + { + from = "/archive/2023/05/14/releasing-small-changes-often-is-less-risky"; + to = "/daily/2023/05/14/releasing-small-changes-often-is-less-risky"; + } + { + from = "/archive/2023/05/15/is-the-drupal-release-cycle-too-fast"; + to = "/daily/2023/05/15/is-the-drupal-release-cycle-too-fast"; + } + { + from = "/archive/2023/05/16/mastering-your-tools-improves-productivity"; + to = "/daily/2023/05/16/mastering-your-tools-improves-productivity"; + } + { + from = "/archive/2023/05/17/what-is-deprecated-code"; + to = "/daily/2023/05/17/what-is-deprecated-code"; + } + { + from = "/archive/2023/05/18/why-is-backward-compatibility-important"; + to = "/daily/2023/05/18/why-is-backward-compatibility-important"; + } + { + from = "/archive/2023/05/19/semantic-versioning"; + to = "/daily/2023/05/19/semantic-versioning"; + } + { + from = "/archive/2023/05/20/a-minor-breaking-change"; + to = "/daily/2023/05/20/a-minor-breaking-change"; + } + { + from = "/archive/2023/05/21/drupal-9-almost-end-of-life-already"; + to = "/daily/2023/05/21/drupal-9-almost-end-of-life-already"; + } + { + from = "/archive/2023/06/05/how-long-should-a-feature-flag-live"; + to = "/daily/2023/06/05/how-long-should-a-feature-flag-live"; + } + { + from = "/archive/2023/06/06/drupal-7-end-of-life-extended"; + to = "/daily/2023/06/06/drupal-7-end-of-life-extended"; + } + { + from = "/archive/2023/06/07/what-does-the-drupal-7-eol-extension-mean-to-you"; + to = "/daily/2023/06/07/what-does-the-drupal-7-eol-extension-mean-to-you"; + } + { + from = "/archive/2023/06/08/write-less-drupal-code"; + to = "/daily/2023/06/08/write-less-drupal-code"; + } + { + from = "/archive/2023/06/09/drupal-is-built-by-people"; + to = "/daily/2023/06/09/drupal-is-built-by-people"; + } + { + from = "/archive/2023/06/10/how-do-you-know-when-to-remove-a-feature-flag"; + to = "/daily/2023/06/10/how-do-you-know-when-to-remove-a-feature-flag"; + } + { + from = "/archive/2023/06/11/failing-fast"; + to = "/daily/2023/06/11/failing-fast"; + } + { + from = "/archive/2023/06/12/feature-flags-in-a-multi-tenancy-application"; + to = "/daily/2023/06/12/feature-flags-in-a-multi-tenancy-application"; + } + { + from = "/archive/2023/06/13/should-you-feature-flag-everything"; + to = "/daily/2023/06/13/should-you-feature-flag-everything"; + } + { + from = "/archive/2023/06/14/what-if-there-was-no-open-source-software"; + to = "/daily/2023/06/14/what-if-there-was-no-open-source-software"; + } + { + from = "/archive/2023/06/15/done-is-better-than-perfect"; + to = "/daily/2023/06/15/done-is-better-than-perfect"; + } + { + from = "/archive/2023/06/16/make-the-easy-change"; + to = "/daily/2023/06/16/make-the-easy-change"; + } + { + from = "/archive/2023/06/17/avoid-git-merge-hell-with-trunk-based-development"; + to = "/daily/2023/06/17/avoid-git-merge-hell-with-trunk-based-development"; + } + { + from = "/archive/2023/06/18/are-you-doing-ci-cd"; + to = "/daily/2023/06/18/are-you-doing-ci-cd"; + } + { + from = "/archive/2023/06/19/should-you-upgrade-from-drupal-7-to-drupal-10"; + to = "/daily/2023/06/19/should-you-upgrade-from-drupal-7-to-drupal-10"; + } + { + from = "/archive/2023/06/20/should-you-deploy-on-a-friday"; + to = "/daily/2023/06/20/should-you-deploy-on-a-friday"; + } + { + from = "/archive/2023/06/21/deployments-or-releases"; + to = "/daily/2023/06/21/deployments-or-releases"; + } + { + from = "/archive/2023/06/22/fail-to-lear"; + to = "/daily/2023/06/22/fail-to-lear"; + } + { + from = "/archive/2023/06/23/why-keep-a-changelog"; + to = "/daily/2023/06/23/why-keep-a-changelog"; + } + { + from = "/archive/2023/06/24/credited-on-200-fixed-issues"; + to = "/daily/2023/06/24/credited-on-200-fixed-issues"; + } + { + from = "/archive/2023/06/25/do-you-need-permission-test-driven-development"; + to = "/daily/2023/06/25/do-you-need-permission-test-driven-development"; + } + { + from = "/archive/2023/06/26/is-any-code-without-tests-legacy"; + to = "/daily/2023/06/26/is-any-code-without-tests-legacy"; + } + { + from = "/archive/2023/06/27/ci-pipeline-additional-team-member"; + to = "/daily/2023/06/27/ci-pipeline-additional-team-member"; + } + { + from = "/archive/2023/06/28/theres-no-value-in-a-broken-ci-pipeline"; + to = "/daily/2023/06/28/theres-no-value-in-a-broken-ci-pipeline"; + } + { + from = "/archive/2023/06/29/tests-wont-tell-you-if-your-code-works"; + to = "/daily/2023/06/29/tests-wont-tell-you-if-your-code-works"; + } + { + from = "/archive/2023/06/30/how-did-you-learn-automated-testing"; + to = "/daily/2023/06/30/how-did-you-learn-automated-testing"; + } + { + from = "/archive/2023/07/01/once-you-start-writing-tests-you-cant-stop"; + to = "/daily/2023/07/01/once-you-start-writing-tests-you-cant-stop"; + } + { + from = "/archive/2023/07/02/docker-or-nix"; + to = "/daily/2023/07/02/docker-or-nix"; + } + { + from = "/archive/2023/07/03/why-write-custom-assertions-in-your-tests"; + to = "/daily/2023/07/03/why-write-custom-assertions-in-your-tests"; + } + { + from = "/archive/2023/07/04/think-smaller-with-tdd"; + to = "/daily/2023/07/04/think-smaller-with-tdd"; + } + { + from = "/archive/2023/07/05/services-vs-actions"; + to = "/daily/2023/07/05/services-vs-actions"; + } + { + from = "/archive/2023/07/06/automated-testing-is-more-than-just-unit-testing"; + to = "/daily/2023/07/06/automated-testing-is-more-than-just-unit-testing"; + } + { + from = "/archive/2023/07/15/test-driven-development-makes-you-more-productive"; + to = "/daily/2023/07/15/test-driven-development-makes-you-more-productive"; + } + { + from = "/archive/2023/07/16/when-writing-a-failing-test-youre-designing-your-code"; + to = "/daily/2023/07/16/when-writing-a-failing-test-youre-designing-your-code"; + } + { + from = "/archive/2023/07/17/too-many-choices"; + to = "/daily/2023/07/17/too-many-choices"; + } + { + from = "/archive/2023/07/18/tdd-as-a-concept-is-simple-but-tdd-is-difficult"; + to = "/daily/2023/07/18/tdd-as-a-concept-is-simple-but-tdd-is-difficult"; + } + { + from = "/archive/2023/07/19/tdd-is-like-clicker-training"; + to = "/daily/2023/07/19/tdd-is-like-clicker-training"; + } + { + from = "/archive/2023/07/20/tests-as-communication"; + to = "/daily/2023/07/20/tests-as-communication"; + } + { + from = "/archive/2023/07/21/comments-as-communication"; + to = "/daily/2023/07/21/comments-as-communication"; + } + { + from = "/archive/2023/07/22/more-code-more-problems"; + to = "/daily/2023/07/22/more-code-more-problems"; + } + { + from = "/archive/2023/07/23/tomorrow-is-easier-if-todays-code-is-simpler"; + to = "/daily/2023/07/23/tomorrow-is-easier-if-todays-code-is-simpler"; + } + { + from = "/archive/2023/07/24/testing-is-all-about-confidence"; + to = "/daily/2023/07/24/testing-is-all-about-confidence"; + } + { + from = "/archive/2023/07/25/working-backwards"; + to = "/daily/2023/07/25/working-backwards"; + } + { + from = "/archive/2023/07/26/prove-the-concept"; + to = "/daily/2023/07/26/prove-the-concept"; + } + { + from = "/archive/2023/07/27/stick-to-conventions"; + to = "/daily/2023/07/27/stick-to-conventions"; + } + { + from = "/archive/2023/07/28/generic-commit-messages"; + to = "/daily/2023/07/28/generic-commit-messages"; + } + { + from = "/archive/2023/07/29/should-i-wait-to-upgrade-from-drupal-7"; + to = "/daily/2023/07/29/should-i-wait-to-upgrade-from-drupal-7"; + } + { + from = "/archive/2023/07/30/commit-often-deploy-often"; + to = "/daily/2023/07/30/commit-often-deploy-often"; + } + { + from = "/archive/2023/07/31/upgrading-from-drupal-9-is-easier"; + to = "/daily/2023/07/31/upgrading-from-drupal-9-is-easier"; + } + { + from = "/archive/2023/08/01/maintaining-a-module-used-on-35000-drupal-websites"; + to = "/daily/2023/08/01/maintaining-a-module-used-on-35000-drupal-websites"; + } + { + from = "/archive/2023/08/02/a-crash-course-into-drupal-testing"; + to = "/daily/2023/08/02/a-crash-course-into-drupal-testing"; + } + { + from = "/archive/2023/08/03/what-problem-are-we-trying-to-solve"; + to = "/daily/2023/08/03/what-problem-are-we-trying-to-solve"; + } + { + from = "/archive/2023/08/04/laravel-prompts"; + to = "/daily/2023/08/04/laravel-prompts"; + } + { + from = "/archive/2023/08/05/use-drupal-to-own-your-content"; + to = "/daily/2023/08/05/use-drupal-to-own-your-content"; + } + { + from = "/archive/2023/08/06/yagni"; + to = "/daily/2023/08/06/yagni"; + } + { + from = "/archive/2023/08/07/tests-make-upgrades-less-risky"; + to = "/daily/2023/08/07/tests-make-upgrades-less-risky"; + } + { + from = "/archive/2023/08/08/8-years-of-dotfiles"; + to = "/daily/2023/08/08/8-years-of-dotfiles"; + } + { + from = "/archive/2023/08/09/vim-is-my-lightsaber"; + to = "/daily/2023/08/09/vim-is-my-lightsaber"; + } + { + from = "/archive/2023/08/10/testing-fixed-prices-and-bug-free-guarantees"; + to = "/daily/2023/08/10/testing-fixed-prices-and-bug-free-guarantees"; + } + { + from = "/archive/2023/08/11/everyone-tests-their-code"; + to = "/daily/2023/08/11/everyone-tests-their-code"; + } + { + from = "/archive/2023/08/12/does-not-writing-tests-actually-save-time"; + to = "/daily/2023/08/12/does-not-writing-tests-actually-save-time"; + } + { + from = "/archive/2023/08/13/dont-estimate-separately-for-testing"; + to = "/daily/2023/08/13/dont-estimate-separately-for-testing"; + } + { + from = "/archive/2023/08/14/why-keep-a-dotfiles-repository"; + to = "/daily/2023/08/14/why-keep-a-dotfiles-repository"; + } + { + from = "/archive/2023/08/15/writing-test-and-implementation-code-are-the-same-task"; + to = "/daily/2023/08/15/writing-test-and-implementation-code-are-the-same-task"; + } + { + from = "/archive/2023/08/16/writing-tests-in-your-own-time"; + to = "/daily/2023/08/16/writing-tests-in-your-own-time"; + } + { + from = "/archive/2023/08/17/writing-custom-assertions-in-your-tests"; + to = "/daily/2023/08/17/writing-custom-assertions-in-your-tests"; + } + { + from = "/archive/2023/08/18/types-vs-tests"; + to = "/daily/2023/08/18/types-vs-tests"; + } + { + from = "/archive/2023/08/19/asserting-all-the-things"; + to = "/daily/2023/08/19/asserting-all-the-things"; + } + { + from = "/archive/2023/08/20/php-types-and-assertions"; + to = "/daily/2023/08/20/php-types-and-assertions"; + } + { + from = "/archive/2023/08/21/which-part-of-the-ci-pipeline-has-the-most-value"; + to = "/daily/2023/08/21/which-part-of-the-ci-pipeline-has-the-most-value"; + } + { + from = "/archive/2023/08/22/deployments-with-your-ci-pipeline"; + to = "/daily/2023/08/22/deployments-with-your-ci-pipeline"; + } + { + from = "/archive/2023/08/23/dont-use-third-party-services-directly"; + to = "/daily/2023/08/23/dont-use-third-party-services-directly"; + } + { + from = "/archive/2023/08/24/testing-multiple-implementations-with-contract-tests"; + to = "/daily/2023/08/24/testing-multiple-implementations-with-contract-tests"; + } + { + from = "/archive/2023/08/25/start-with-a-vague-test"; + to = "/daily/2023/08/25/start-with-a-vague-test"; + } + { + from = "/archive/2023/08/26/work-in-small-chunks"; + to = "/daily/2023/08/26/work-in-small-chunks"; + } + { + from = "/archive/2023/08/27/pull-requests-are-great-for-open-source"; + to = "/daily/2023/08/27/pull-requests-are-great-for-open-source"; + } + { + from = "/archive/2023/08/28/pair-and-mob-programming-are-continuous-code-review"; + to = "/daily/2023/08/28/pair-and-mob-programming-are-continuous-code-review"; + } + { + from = "/archive/2023/08/29/ci-pipelines-are-an-automated-code-review"; + to = "/daily/2023/08/29/ci-pipelines-are-an-automated-code-review"; + } + { + from = "/archive/2023/08/30/tdd-and-unexpected-errors"; + to = "/daily/2023/08/30/tdd-and-unexpected-errors"; + } + { + from = "/archive/2023/08/31/code-review-discourages-small-refactorings"; + to = "/daily/2023/08/31/code-review-discourages-small-refactorings"; + } + { + from = "/archive/2023/09/01/non-blocking-code-reviews"; + to = "/daily/2023/09/01/non-blocking-code-reviews"; + } + { + from = "/archive/2023/09/02/planning-first-or-reviewing-last"; + to = "/daily/2023/09/02/planning-first-or-reviewing-last"; + } + { + from = "/archive/2023/09/03/including-time-for-tests-in-estimates"; + to = "/daily/2023/09/03/including-time-for-tests-in-estimates"; + } + { + from = "/archive/2023/09/04/charging-more-not-to-write-tests"; + to = "/daily/2023/09/04/charging-more-not-to-write-tests"; + } + { + from = "/archive/2023/09/05/spring-clean-before-upgrading"; + to = "/daily/2023/09/05/spring-clean-before-upgrading"; + } + { + from = "/archive/2023/09/06/verbosity-over-abstraction"; + to = "/daily/2023/09/06/verbosity-over-abstraction"; + } + { + from = "/archive/2023/09/07/what-s-the-simplest-test-to-begin-with"; + to = "/daily/2023/09/07/what-s-the-simplest-test-to-begin-with"; + } + { + from = "/archive/2023/09/08/do-you-proactively-refactor-your-code"; + to = "/daily/2023/09/08/do-you-proactively-refactor-your-code"; + } + { + from = "/archive/2023/09/09/a-lack-of-tests-discourages-refactoring"; + to = "/daily/2023/09/09/a-lack-of-tests-discourages-refactoring"; + } + { + from = "/archive/2023/09/10/code-is-read-more-than-it-s-written"; + to = "/daily/2023/09/10/code-is-read-more-than-it-s-written"; + } + { + from = "/archive/2023/09/11/dont-use-else"; + to = "/daily/2023/09/11/dont-use-else"; + } + { + from = "/archive/2023/09/12/dont-inject-too-many-dependencies"; + to = "/daily/2023/09/12/dont-inject-too-many-dependencies"; + } + { + from = "/archive/2023/09/13/which-type-of-test-should-i-use"; + to = "/daily/2023/09/13/which-type-of-test-should-i-use"; + } + { + from = "/archive/2023/09/14/outside-in-or-inside-out"; + to = "/daily/2023/09/14/outside-in-or-inside-out"; + } + { + from = "/archive/2023/09/15/types-or-no-types"; + to = "/daily/2023/09/15/types-or-no-types"; + } + { + from = "/archive/2023/09/16/how-not-to-break-36-000-websites"; + to = "/daily/2023/09/16/how-not-to-break-36-000-websites"; + } + { + from = "/archive/2023/09/17/how-much-refactoring-should-i-be-doing"; + to = "/daily/2023/09/17/how-much-refactoring-should-i-be-doing"; + } + { + from = "/archive/2023/09/18/increasing-test-coverage-with-regression-tests"; + to = "/daily/2023/09/18/increasing-test-coverage-with-regression-tests"; + } + { + from = "/archive/2023/09/19/stop-writing-tests"; + to = "/daily/2023/09/19/stop-writing-tests"; + } + { + from = "/archive/2023/09/20/why-i-prefer-types"; + to = "/daily/2023/09/20/why-i-prefer-types"; + } + { + from = "/archive/2023/09/21/buggy-software-causes-reputational-damage"; + to = "/daily/2023/09/21/buggy-software-causes-reputational-damage"; + } + { + from = "/archive/2023/09/22/documentation-and-comments-get-stale"; + to = "/daily/2023/09/22/documentation-and-comments-get-stale"; + } + { + from = "/archive/2023/09/23/not-everyone-writes-automated-tests"; + to = "/daily/2023/09/23/not-everyone-writes-automated-tests"; + } + { + from = "/archive/2023/09/24/test-to-save-your-job"; + to = "/daily/2023/09/24/test-to-save-your-job"; + } + { + from = "/archive/2023/09/25/should-you-use-a-staging-environment"; + to = "/daily/2023/09/25/should-you-use-a-staging-environment"; + } + { + from = "/archive/2023/09/26/which-branch-should-be-in-which-environment"; + to = "/daily/2023/09/26/which-branch-should-be-in-which-environment"; + } + { + from = "/archive/2023/09/27/separating-environments-with-feature-flags"; + to = "/daily/2023/09/27/separating-environments-with-feature-flags"; + } + { + from = "/archive/2023/09/28/feature-flags-enable-continuous-integration"; + to = "/daily/2023/09/28/feature-flags-enable-continuous-integration"; + } + { + from = "/archive/2023/09/29/92-changed-files-with-885-additions-and-156-deletions"; + to = "/daily/2023/09/29/92-changed-files-with-885-additions-and-156-deletions"; + } + { + from = "/archive/2023/09/30/automated-testing-offers-repeatability"; + to = "/daily/2023/09/30/automated-testing-offers-repeatability"; + } + { + from = "/archive/2023/10/01/tdd--repeat-and-refactor"; + to = "/daily/2023/10/01/tdd--repeat-and-refactor"; + } + { + from = "/archive/2023/10/02/only-comment-what-needs-to-be-commented"; + to = "/daily/2023/10/02/only-comment-what-needs-to-be-commented"; + } + { + from = "/archive/2023/10/03/there-is-no-perfect-solution"; + to = "/daily/2023/10/03/there-is-no-perfect-solution"; + } + { + from = "/archive/2023/10/04/the-best-solution-is-the-one-that-gets-the-tests-to-pass"; + to = "/daily/2023/10/04/the-best-solution-is-the-one-that-gets-the-tests-to-pass"; + } + { + from = "/archive/2023/10/05/some-solutions-are-good-enough"; + to = "/daily/2023/10/05/some-solutions-are-good-enough"; + } + { + from = "/archive/2023/10/06/software-development-is-like-going-to-the-dentist"; + to = "/daily/2023/10/06/software-development-is-like-going-to-the-dentist"; + } + { + from = "/archive/2023/10/07/a-breakdown-of-tests-from-a-current-project"; + to = "/daily/2023/10/07/a-breakdown-of-tests-from-a-current-project"; + } + { + from = "/archive/2023/10/08/is-test-driven-development-difficult"; + to = "/daily/2023/10/08/is-test-driven-development-difficult"; + } + { + from = "/archive/2023/10/09/spotting-new-things-in-drupal-10-1"; + to = "/daily/2023/10/09/spotting-new-things-in-drupal-10-1"; + } + { + from = "/archive/2023/10/10/why-use-composer-to-manage-drupal-dependencies"; + to = "/daily/2023/10/10/why-use-composer-to-manage-drupal-dependencies"; + } + { + from = "/archive/2023/10/11/do-you-need-that-module"; + to = "/daily/2023/10/11/do-you-need-that-module"; + } + { + from = "/archive/2023/10/12/business-logic-in-template-files"; + to = "/daily/2023/10/12/business-logic-in-template-files"; + } + { + from = "/archive/2023/10/13/writing-tests-is-an-investment"; + to = "/daily/2023/10/13/writing-tests-is-an-investment"; + } + { + from = "/archive/2023/10/14/do-you-need-to-write-tests-for-small-or-short-lived-projects"; + to = "/daily/2023/10/14/do-you-need-to-write-tests-for-small-or-short-lived-projects"; + } + { + from = "/archive/2023/10/15/off-to-drupalcon"; + to = "/daily/2023/10/15/off-to-drupalcon"; + } + { + from = "/archive/2023/10/23/when-should-run-your-tests"; + to = "/daily/2023/10/23/when-should-run-your-tests"; + } + { + from = "/archive/2023/10/24/how-to-test-code-you-didnt-write"; + to = "/daily/2023/10/24/how-to-test-code-you-didnt-write"; + } + { + from = "/archive/2023/10/25/automated-tests-prevent-regressions-when-upgrading"; + to = "/daily/2023/10/25/automated-tests-prevent-regressions-when-upgrading"; + } + { + from = "/archive/2023/10/26/is-decoupled-drupal-still-a-thing"; + to = "/daily/2023/10/26/is-decoupled-drupal-still-a-thing"; + } + { + from = "/archive/2023/10/27/work-with-me-and-support-the-drupal-association"; + to = "/daily/2023/10/27/work-with-me-and-support-the-drupal-association"; + } + { + from = "/archive/2023/10/28/can-you-move-faster-without-tests"; + to = "/daily/2023/10/28/can-you-move-faster-without-tests"; + } + { + from = "/archive/2023/10/29/i-can-drive-my-car-blindfolded-but-is-it-a-good-idea"; + to = "/daily/2023/10/29/i-can-drive-my-car-blindfolded-but-is-it-a-good-idea"; + } + { + from = "/archive/2023/10/30/is-drupal-a-cms-or-a-framework"; + to = "/daily/2023/10/30/is-drupal-a-cms-or-a-framework"; + } + { + from = "/archive/2023/10/31/one-official-drupal-development-environment"; + to = "/daily/2023/10/31/one-official-drupal-development-environment"; + } + { + from = "/archive/2023/11/01/drupal-9-is-now-end-of-life"; + to = "/daily/2023/11/01/drupal-9-is-now-end-of-life"; + } + { + from = "/archive/2023/11/02/is-code-coverage-an-objective-or-guideline"; + to = "/daily/2023/11/02/is-code-coverage-an-objective-or-guideline"; + } + { + from = "/archive/2023/11/03/why-your-company-should-contribute-to-open-source-software"; + to = "/daily/2023/11/03/why-your-company-should-contribute-to-open-source-software"; + } + { + from = "/archive/2023/11/04/why-you-should-contribute-to-open-source-software"; + to = "/daily/2023/11/04/why-you-should-contribute-to-open-source-software"; + } + { + from = "/archive/2023/11/05/i-m-starting-a-podcast"; + to = "/daily/2023/11/05/i-m-starting-a-podcast"; + } + { + from = "/archive/2023/11/06/the-first-beyond-blocks-podcast-episode-is-recorded"; + to = "/daily/2023/11/06/the-first-beyond-blocks-podcast-episode-is-recorded"; + } + { + from = "/archive/2023/11/07/it-depends"; + to = "/daily/2023/11/07/it-depends"; + } + { + from = "/archive/2023/11/08/building-build-configs"; + to = "/daily/2023/11/08/building-build-configs"; + } + { + from = "/archive/2023/11/09/readme-driven-development"; + to = "/daily/2023/11/09/readme-driven-development"; + } + { + from = "/archive/2023/11/10/retrofit-with-matt-glaman"; + to = "/daily/2023/11/10/retrofit-with-matt-glaman"; + } + { + from = "/archive/2023/11/11/work-in-small-batches"; + to = "/daily/2023/11/11/work-in-small-batches"; + } + { + from = "/archive/2023/11/12/drupal-gives-you-so-much-out-of-the-box"; + to = "/daily/2023/11/12/drupal-gives-you-so-much-out-of-the-box"; + } + { + from = "/archive/2023/11/13/phpunit-does-more-than-unit-testing"; + to = "/daily/2023/11/13/phpunit-does-more-than-unit-testing"; + } + { + from = "/archive/2023/11/14/why-i-prefer-integration-tests-to-unit-tests"; + to = "/daily/2023/11/14/why-i-prefer-integration-tests-to-unit-tests"; + } + { + from = "/archive/2023/11/15/dont-pre-optimise-and-over-customise"; + to = "/daily/2023/11/15/dont-pre-optimise-and-over-customise"; + } + { + from = "/archive/2023/11/16/avoiding-over-mocking"; + to = "/daily/2023/11/16/avoiding-over-mocking"; + } + { + from = "/archive/2023/11/17/drupal-s-alternate-realities"; + to = "/daily/2023/11/17/drupal-s-alternate-realities"; + } + { + from = "/archive/2023/11/18/writing-good-test-names"; + to = "/daily/2023/11/18/writing-good-test-names"; + } + { + from = "/archive/2023/11/19/why-ive-standardised-on-run-scripts"; + to = "/daily/2023/11/19/why-ive-standardised-on-run-scripts"; + } + { + from = "/archive/2023/11/20/whatll-be-in-drupal-11"; + to = "/daily/2023/11/20/whatll-be-in-drupal-11"; + } + { + from = "/archive/2023/11/21/why-i-built-build-configs"; + to = "/daily/2023/11/21/why-i-built-build-configs"; + } + { + from = "/archive/2023/11/22/frequency-reduces-difficulty"; + to = "/daily/2023/11/22/frequency-reduces-difficulty"; + } + { + from = "/archive/2023/11/23/partial-mocking"; + to = "/daily/2023/11/23/partial-mocking"; + } + { + from = "/archive/2023/11/24/are-conventional-commits-worth-it"; + to = "/daily/2023/11/24/are-conventional-commits-worth-it"; + } + { + from = "/archive/2023/11/25/community-engagement-for-non-technical-drupal-enthusiasts"; + to = "/daily/2023/11/25/community-engagement-for-non-technical-drupal-enthusiasts"; + } + { + from = "/archive/2023/11/26/to-docblock-or-not-to-docblock"; + to = "/daily/2023/11/26/to-docblock-or-not-to-docblock"; + } + { + from = "/archive/2023/11/27/finding-the-best-test-base"; + to = "/daily/2023/11/27/finding-the-best-test-base"; + } + { + from = "/archive/2023/11/28/which-phpstan-level-should-you-use"; + to = "/daily/2023/11/28/which-phpstan-level-should-you-use"; + } + { + from = "/archive/2023/11/29/the-lowest-level-is-better-than-no-level"; + to = "/daily/2023/11/29/the-lowest-level-is-better-than-no-level"; + } + { + from = "/archive/2023/11/30/are-bugs-good-for-users"; + to = "/daily/2023/11/30/are-bugs-good-for-users"; + } + { + from = "/archive/2023/12/01/the-contribution-first-workflow"; + to = "/daily/2023/12/01/the-contribution-first-workflow"; + } + { + from = "/archive/2023/12/04/writing-contrib-modules-as-glue-between-your-custom-code"; + to = "/daily/2023/12/04/writing-contrib-modules-as-glue-between-your-custom-code"; + } + { + from = "/archive/2023/12/05/open-source-encourages-open-source"; + to = "/daily/2023/12/05/open-source-encourages-open-source"; + } + { + from = "/archive/2023/12/06/open-source-first-doesnt-mean-you-need-to-cover-every-use-case"; + to = "/daily/2023/12/06/open-source-first-doesnt-mean-you-need-to-cover-every-use-case"; + } + { + from = "/archive/2023/12/07/a-drupal-case-study-from-oxfam"; + to = "/daily/2023/12/07/a-drupal-case-study-from-oxfam"; + } + { + from = "/archive/2023/12/08/dont-just-rewrite"; + to = "/daily/2023/12/08/dont-just-rewrite"; + } + { + from = "/archive/2023/12/09/rebuild-or-iterate"; + to = "/daily/2023/12/09/rebuild-or-iterate"; + } + { + from = "/archive/2023/12/10/suffixing-names"; + to = "/daily/2023/12/10/suffixing-names"; + } + { + from = "/archive/2023/12/11/custom-coding-standards-and-conventions"; + to = "/daily/2023/12/11/custom-coding-standards-and-conventions"; + } + { + from = "/archive/2023/12/12/drupalcon-session-survey-results"; + to = "/daily/2023/12/12/drupalcon-session-survey-results"; + } + { + from = "/archive/2023/12/13/reviving-an-old-php-project"; + to = "/daily/2023/12/13/reviving-an-old-php-project"; + } + { + from = "/archive/2023/12/14/save-time-and-effort-with-drupal-distributions"; + to = "/daily/2023/12/14/save-time-and-effort-with-drupal-distributions"; + } + { + from = "/archive/2023/12/15/building-your-own-in-house-drupal-distribution"; + to = "/daily/2023/12/15/building-your-own-in-house-drupal-distribution"; + } + { + from = "/archive/2023/12/16/adding-snapshot-tests-to-build-configs"; + to = "/daily/2023/12/16/adding-snapshot-tests-to-build-configs"; + } + { + from = "/archive/2023/12/17/fail-fast-fix-fast"; + to = "/daily/2023/12/17/fail-fast-fix-fast"; + } + { + from = "/archive/2023/12/18/static-analysis-on-tests"; + to = "/daily/2023/12/18/static-analysis-on-tests"; + } + { + from = "/archive/2023/12/19/php-tui-dan-leech"; + to = "/daily/2023/12/19/php-tui-dan-leech"; + } + { + from = "/archive/2023/12/20/hover-focus-hocus"; + to = "/daily/2023/12/20/hover-focus-hocus"; + } + { + from = "/archive/2023/12/21/new-year-coaching"; + to = "/daily/2023/12/21/new-year-coaching"; + } + { + from = "/archive/2023/12/22/best-language-cms-or-framework"; + to = "/daily/2023/12/22/best-language-cms-or-framework"; + } + { + from = "/archive/2023/12/23/using-a-whole-framework-or-part-of-it"; + to = "/daily/2023/12/23/using-a-whole-framework-or-part-of-it"; + } + { + from = "/archive/2023/12/24/this-should-never-happen"; + to = "/daily/2023/12/24/this-should-never-happen"; + } + { + from = "/archive/2023/12/25/zero-to-test"; + to = "/daily/2023/12/25/zero-to-test"; + } + { + from = "/archive/2023/12/26/good-code-is-not-about-being-easy-to-write"; + to = "/daily/2023/12/26/good-code-is-not-about-being-easy-to-write"; + } + { + from = "/archive/2023/12/27/writing-new-code-is-quick-to-begin-with"; + to = "/daily/2023/12/27/writing-new-code-is-quick-to-begin-with"; + } + { + from = "/archive/2023/12/28/pride-and-productivity"; + to = "/daily/2023/12/28/pride-and-productivity"; + } + { + from = "/archive/2023/12/29/decide-automate-document"; + to = "/daily/2023/12/29/decide-automate-document"; + } + { + from = "/archive/2023/12/30/weve-always-done-it-this-way"; + to = "/daily/2023/12/30/weve-always-done-it-this-way"; + } + { + from = "/archive/2023/12/31/just"; + to = "/daily/2023/12/31/just"; + } + { + from = "/archive/2024/03/03/centarro-and-drupal-commerce-with-ryan-szrama"; + to = "/daily/2024/03/03/centarro-and-drupal-commerce-with-ryan-szrama"; + } + { + from = "/atNOQ"; + to = "https://youtu.be/r41dkD2EOo8"; + } + { + from = "/automatically-updating-talk-created-date"; + to = "https://gist.github.com/opdavies/4e75e1753d8603113f07f8264bb783d6"; + } + { + from = "/blog.xml"; + to = "/rss.xml"; + } + { + from = "/blog/10-useful-drupal-6-modules"; + to = "/blog/useful-drupal-6-modules"; + } + { + from = "/blog/10-years-working-full-time-drupal"; + to = "/blog/10-years-working-full-time-drupal-php"; + } + { + from = "/blog/2010/04/05/style-drupal-6s-taxonomy-lists-php-css-and-jquery"; + to = "/blog/style-drupal-6s-taxonomy-lists-php-css-and-jquery"; + } + { + from = "/blog/2010/04/05/styling-drupal-6s-taxonomy-lists-with-php-css-and-jquery"; + to = "/blog/style-drupal-6s-taxonomy-lists-php-css-jquery"; + } + { + from = "/blog/2010/04/28/using-imagecache-and-imagecrop-my-portfolio"; + to = "/blog/using-imagecache-and-imagecrop-my-portfolio"; + } + { + from = "/blog/2010/05/06/conditional-email-addresses-webform"; + to = "/blog/conditional-email-addresses-webform"; + } + { + from = "/blog/2010/05/10/quickly-create-zen-subthemes-using-zenophile"; + to = "/blog/quickly-create-zen-subthemes-using-zenophile"; + } + { + from = "/blog/2010/05/25/create-slideshow-multiple-images-using-fancy-slide"; + to = "/blog/create-slideshow-multiple-images-using-fancy-slide"; + } + { + from = "/blog/2010/05/29/quickly-import-multiples-images-using-imagefieldimport-module"; + to = "/blog/quickly-import-multiples-images-using-imagefieldimport-module"; + } + { + from = "/blog/2010/06/02/improve-jpg-quality-imagecache-and-imageapi"; + to = "/blog/improve-jpg-quality-imagecache-and-imageapi"; + } + { + from = "/blog/2010/06/23/create-block-social-media-icons-using-cck-views-and-nodequeue"; + to = "/blog/create-block-social-media-icons-using-cck-views-and-nodequeue"; + } + { + from = "/blog/2010/06/25/10-useful-drupal-6-modules"; + to = "/blog/10-useful-drupal-6-modules"; + } + { + from = "/blog/2010/06/28/create-flickr-photo-gallery-using-feeds-cck-and-views"; + to = "/blog/create-flickr-photo-gallery-using-feeds-cck-and-views"; + } + { + from = "/blog/2010/07/01/change-content-type-multiple-nodes-using-sql"; + to = "/blog/change-content-type-multiple-nodes-using-sql"; + } + { + from = "/blog/2010/07/02/create-virtual-hosts-mac-os-x-using-virtualhostx"; + to = "/blog/create-virtual-hosts-mac-os-x-using-virtualhostx"; + } + { + from = "/blog/2010/07/07/add-taxonomy-term-multiple-nodes-using-sql"; + to = "/blog/add-taxonomy-term-multiple-nodes-using-sql"; + } + { + from = "/blog/2010/07/07/quickly-adding-taxonomy-term-multiple-nodes-using-sql"; + to = "/blog/add-taxonomy-term-multiple-nodes-using-sql"; + } + { + from = "/blog/2010/07/12/overview-teleport-module"; + to = "/blog/review-teleport-module"; + } + { + from = "/blog/2010/07/12/review-teleport-module"; + to = "/blog/review-teleport-module"; + } + { + from = "/blog/2010/08/10/review-adminhover-module"; + to = "/blog/review-adminhover-module"; + } + { + from = "/blog/2010/08/11/create-better-photo-gallery-drupal-part-1"; + to = "/blog/create-better-photo-gallery-drupal-part-1"; + } + { + from = "/blog/2010/08/11/how-create-better-photo-gallery-drupal-part-1"; + to = "/blog/create-better-photo-gallery-drupal-part-1"; + } + { + from = "/blog/2010/08/17/create-better-photo-gallery-drupal-part-2"; + to = "/blog/create-better-photo-gallery-drupal-part-2"; + } + { + from = "/blog/2010/08/20/review-image-caption-module"; + to = "/blog/review-image-caption-module"; + } + { + from = "/blog/2010/09/26/south-wales-drupal-user-group"; + to = "/blog/south-wales-drupal-user-group"; + } + { + from = "/blog/2010/10/10/create-and-apply-patches"; + to = "/blog/create-and-apply-patches"; + } + { + from = "/blog/2010/10/13/create-better-photo-gallery-drupal-part-3"; + to = "/blog/create-better-photo-gallery-drupal-part-3"; + } + { + from = "/blog/2010/10/22/create-better-photo-gallery-drupal-part-21"; + to = "/blog/create-better-photo-gallery-drupal-part-21"; + } + { + from = "/blog/2010/11/04/use-regular-expressions-search-and-replace-coda-or-textmate"; + to = "/blog/use-regular-expressions-search-and-replace-coda-or-textmate"; + } + { + from = "/blog/2011/02/14/easily-embed-typekit-fonts-your-drupal-website"; + to = "/blog/easily-embed-typekit-fonts-your-drupal-website"; + } + { + from = "/blog/2011/03/15/display-number-facebook-fans-php"; + to = "/blog/display-number-facebook-fans-php"; + } + { + from = "/blog/2011/03/31/proctor-stevenson"; + to = "/blog/proctor-stevenson"; + } + { + from = "/blog/2011/05/20/proctors-hosting-next-drupal-meetup"; + to = "/blog/proctors-hosting-next-drupal-meetup"; + } + { + from = "/blog/2011/05/23/imagefield-import-archive"; + to = "/blog/imagefield-import-archive"; + } + { + from = "/blog/2011/08/28/create-multigroups-drupal-7-using-field-collections"; + to = "/blog/create-multigroups-drupal-7-using-field-collections"; + } + { + from = "/blog/2011/10/19/install-and-configure-subversion-svn-server-ubuntu"; + to = "/blog/install-and-configure-subversion-svn-server-ubuntu"; + } + { + from = "/blog/2011/10/install-and-configure-subversion-svn-server-ubuntu"; + to = "/blog/how-install-configure-subversion-svn-server-ubuntu"; + } + { + from = "/blog/2012/01/04/site-upgraded-drupal-7"; + to = "/blog/site-upgraded-drupal-7"; + } + { + from = "/blog/2012/02/01/use-authorize-keys-create-passwordless-ssh-connection"; + to = "/blog/use-authorized-keys-create-passwordless-ssh-connection"; + } + { + from = "/blog/2012/04/16/create-omega-subtheme-less-css-preprocessor-using-omega-tools-and-drush"; + to = "/blog/create-omega-subtheme-less-css-preprocessor-using-omega-tools-and-drush"; + } + { + from = "/blog/2012/04/17/installing-nagios-centos"; + to = "/blog/installing-nagios-centos"; + } + { + from = "/blog/2012/04/19/adding-custom-theme-templates-drupal-7"; + to = "/blog/adding-custom-theme-templates-drupal-7"; + } + { + from = "/blog/2012/04/adding-custom-theme-templates-drupal-7"; + to = "/blog/adding-custom-theme-templates-drupal-7"; + } + { + from = "/blog/2012/05/23/add-date-popup-calendar-custom-form"; + to = "/blog/add-date-popup-calendar-custom-form"; + } + { + from = "/blog/2012/05/23/checkout-specific-revision-svn-command-line"; + to = "/blog/checkout-specific-revision-svn-command-line"; + } + { + from = "/blog/2012/05/23/forward-one-domain-another-using-mod-rewrite-and-htaccess"; + to = "/blog/forward-one-domain-another-using-mod-rewrite-and-htaccess"; + } + { + from = "/blog/2012/05/23/forward-one-domain-another-using-modrewrite-and-htaccess"; + to = "/blog/forward-one-domain-another-using-modrewrite-htaccess"; + } + { + from = "/blog/2012/05/23/prevent-apache-displaying-text-files-within-web-browser"; + to = "/blog/prevent-apache-displaying-text-files-within-web-browser"; + } + { + from = "/blog/2012/05/23/writing-info-file-drupal-7-theme"; + to = "/blog/writing-info-file-drupal-7-theme"; + } + { + from = "/blog/2012/05/24/dividing-drupals-process-and-preprocess-functions-separate-files"; + to = "/blog/dividing-drupals-process-and-preprocess-functions-separate-files"; + } + { + from = "/blog/2012/05/forward-one-domain-another-using-modrewrite-and-htaccess"; + to = "/blog/forward-one-domain-another-using-modrewrite-htaccess"; + } + { + from = "/blog/2012/07/12/my-new-drupal-modules"; + to = "/blog/my-new-drupal-modules"; + } + { + from = "/blog/2012/07/14/install-nomensa-media-player-drupal"; + to = "/blog/install-nomensa-media-player-drupal"; + } + { + from = "/blog/2012/07/27/writing-article-linux-journal"; + to = "/blog/writing-article-linux-journal"; + } + { + from = "/blog/2012/07/install-and-configure-nomensa-accessible-media-player-drupal"; + to = "/blog/install-configure-nomensa-accessible-media-player-drupal"; + } + { + from = "/blog/2012/07/nomensa-accessible-media-player-drupal"; + to = "/blog/install-configure-nomensa-accessible-media-player-drupal"; + } + { + from = "/blog/2012/08/18/display-custom-menu-drupal-7-theme-template-file"; + to = "/blog/display-custom-menu-drupal-7-theme-template-file"; + } + { + from = "/blog/2012/09/06/reflections-speaking-unifieddiff"; + to = "/blog/reflections-speaking-unifieddiff"; + } + { + from = "/blog/2012/10/25/my-sublime-text-2-settings"; + to = "/blog/my-sublime-text-2-settings"; + } + { + from = "/blog/2012/11/15/accessible-bristol-site-launched"; + to = "/blog/accessible-bristol-site-launched"; + } + { + from = "/blog/2012/11/17/open-sublime-text-2-mac-os-x-command-line"; + to = "/blog/open-sublime-text-2-mac-os-x-command-line"; + } + { + from = "/blog/2012/12/06/use-sass-and-compass-drupal-7-using-sassy"; + to = "/blog/use-sass-and-compass-drupal-7-using-sassy"; + } + { + from = "/blog/2012/12/use-sass-and-compass-drupal-7-using-sassy"; + to = "/blog/use-sass-and-compass-drupal-7-using-sassy"; + } + { + from = "/blog/2013/01/09/checking-if-user-logged-drupal-right-way"; + to = "/blog/checking-if-user-logged-drupal-right-way"; + } + { + from = "/blog/2013/02/16/creating-and-using-custom-tokens-drupal-7"; + to = "/blog/creating-and-using-custom-tokens-drupal-7"; + } + { + from = "/blog/2013/02/creating-and-using-custom-tokens-drupal-7"; + to = "/blog/creating-using-custom-tokens-drupal-7"; + } + { + from = "/blog/2013/03/02/quickest-way-install-sublime-text-2-ubuntu"; + to = "/blog/quickest-way-install-sublime-text-2-ubuntu"; + } + { + from = "/blog/2013/04/20/leaving-nomensa-joining-precedent"; + to = "/blog/leaving-nomensa-joining-precedent"; + } + { + from = "/blog/2013/04/27/display-git-branch-or-tag-names-your-bash-prompt"; + to = "/blog/display-git-branch-or-tag-names-your-bash-prompt"; + } + { + from = "/blog/2013/04/display-git-branch-or-tag-names-your-bash-prompt"; + to = "/blog/display-git-branch-or-tag-names-your-bash-prompt"; + } + { + from = "/blog/2013/06/13/some-useful-links-using-simpletest-drupal"; + to = "/blog/some-useful-links-using-simpletest-drupal"; + } + { + from = "/blog/2013/07/17/creating-local-and-staging-sites-drupals-domain-module-enabled"; + to = "/blog/creating-local-and-staging-sites-drupals-domain-module-enabled"; + } + { + from = "/blog/2013/07/26/going-drupalcon"; + to = "/blog/going-drupalcon"; + } + { + from = "/blog/2013/09/06/create-a-zen-sub-theme-using-drush"; + to = "/blog/create-a-zen-sub-theme-using-drush"; + } + { + from = "/blog/2013/09/create-zen-sub-theme-using-drush"; + to = "/blog/create-zen-sub-theme-using-drush"; + } + { + from = "/blog/2013/11/19/dont-bootstrap-drupal-use-drush"; + to = "/blog/dont-bootstrap-drupal-use-drush"; + } + { + from = "/blog/2013/11/27/useful-vagrant-commands"; + to = "/blog/useful-vagrant-commands"; + } + { + from = "/blog/2013/11/dont-bootstrap-drupal-use-drush"; + to = "/blog/dont-bootstrap-drupal-use-drush"; + } + { + from = "/blog/2013/12/24/quickly-apply-patches-using-git-and-curl-or-wget"; + to = "/blog/quickly-apply-patches-using-git-and-curl-or-wget"; + } + { + from = "/blog/2013/12/31/download-different-versions-drupal-drush"; + to = "/blog/download-different-versions-drupal-drush"; + } + { + from = "/blog/2013/12/quickly-apply-patches-using-git-and-curl-or-wget"; + to = "/blog/quickly-apply-patches-using-git-curl-or-wget"; + } + { + from = "/blog/2014/01/15/some-useful-git-aliases"; + to = "/blog/some-useful-git-aliases"; + } + { + from = "/blog/2014/02/09/drupalcamp-london-2014"; + to = "/blog/drupalcamp-london-2014"; + } + { + from = "/blog/2014/03/03/what-git-flow"; + to = "/blog/what-git-flow"; + } + { + from = "/blog/2014/05/03/drupal-association"; + to = "/blog/drupal-association"; + } + { + from = "/blog/2014/05/06/thanks"; + to = "/blog/thanks"; + } + { + from = "/blog/2014/05/21/git-format-patch"; + to = "/blog/git-format-patch"; + } + { + from = "/blog/2014/07/02/drush-make-drupalbristol"; + to = "/blog/drush-make-drupalbristol"; + } + { + from = "/blog/2014/10/06/fix-vagrant-loading-wrong-virtual-machine"; + to = "/blog/fix-vagrant-loading-wrong-virtual-machine"; + } + { + from = "/blog/2014/10/21/updating-features-and-adding-components-using-drush"; + to = "/blog/updating-features-and-adding-components-using-drush"; + } + { + from = "/blog/2014/11/18/include-css-fonts-using-sass-each-loop"; + to = "/blog/include-css-fonts-using-sass-each-loop"; + } + { + from = "/blog/2014/11/20/using-remote-files-when-developing-locally-with-stage-file-proxy-module"; + to = "/blog/using-remote-files-when-developing-locally-with-stage-file-proxy-module"; + } + { + from = "/blog/2014/11/27/pantheon-settings-files"; + to = "/blog/pantheon-settings-files"; + } + { + from = "/blog/2014/12/20/include-local-drupal-settings-file-environment-configuration-and-overrides"; + to = "/blog/include-local-drupal-settings-file-environment-configuration-and-overrides"; + } + { + from = "/blog/2015/04/03/how-to-define-a-minimum-drupal-core-version"; + to = "/blog/how-to-define-a-minimum-drupal-core-version"; + } + { + from = "/blog/2015/06/18/updating-forked-repositories-on-github"; + to = "/blog/updating-forked-repositories-on-github"; + } + { + from = "/blog/2015/07/19/sculpin-twig-resources"; + to = "/blog/sculpin-twig-resources"; + } + { + from = "/blog/2015/07/21/automating-sculpin-jenkins"; + to = "/blog/automating-sculpin-jenkins"; + } + { + from = "/blog/2015/12/22/programmatically-load-an-entityform-in-drupal-7"; + to = "/blog/programmatically-load-an-entityform-in-drupal-7"; + } + { + from = "/blog/2016/02/15/announcing-the-drupal-vm-generator"; + to = "/blog/announcing-the-drupal-vm-generator"; + } + { + from = "/blog/2016/05/03/simplifying-drupal-migrations-with-xautoload"; + to = "/blog/simplifying-drupal-migrations-with-xautoload"; + } + { + from = "/blog/2016/07/15/building-gmail-filters-with-php"; + to = "/blog/building-gmail-filters-with-php"; + } + { + from = "/blog/2016/12/30/drupal-vm-generator-291-released"; + to = "/blog/drupal-vm-generator-291-released"; + } + { + from = "/blog/2017/01/07/easier-sculpin-commands-with-composer-and-npm-scripts"; + to = "/blog/easier-sculpin-commands-with-composer-and-npm-scripts"; + } + { + from = "/blog/2017/01/31/nginx-redirects-with-query-string-arguments"; + to = "/blog/nginx-redirects-with-query-string-arguments"; + } + { + from = "/blog/2017/05/05/fixing-drupal-simpletest-docker"; + to = "/blog/2017/05/05/fixing-drupal-simpletest-issues-inside-docker-containers"; + } + { + from = "/blog/2017/05/05/fixing-drupal-simpletest-issues-inside-docker-containers"; + to = "/blog/fixing-drupal-simpletest-issues-inside-docker-containers"; + } + { + from = "/blog/2017/05/20/turning-drupal-module-into-feature"; + to = "/blog/turning-your-custom-drupal-module-feature"; + } + { + from = "/blog/2017/06/09/introducing-the-drupal-meetups-twitterbot"; + to = "/blog/introducing-the-drupal-meetups-twitterbot"; + } + { + from = "/blog/2017/07/13/publishing-sculpin-sites-with-github-pages"; + to = "/blog/publishing-sculpin-sites-github-pages"; + } + { + from = "/blog/2017/11/07/tdd-test-driven-drupal"; + to = "/blog/tdd-test-driven-drupal"; + } + { + from = "/blog/2017/11/07/writing-drupal-module-test-driven-development-tdd"; + to = "/blog/2017/11/07/tdd-test-driven-drupal"; + } + { + from = "/blog/2018/01/30/drupalcamp-bristol-2018"; + to = "/blog/drupalcamp-bristol-2018"; + } + { + from = "/blog/2018/02/05/using-tailwind-css-in-your-drupal-theme"; + to = "/blog/using-tailwind-css-in-your-drupal-theme"; + } + { + from = "/blog/2018/02/27/looking-forward-to-drupalcamp-london"; + to = "/blog/looking-forward-to-drupalcamp-london"; + } + { + from = "/blog/2018/02/27/queuing-private-messages-in-drupal-8"; + to = "/blog/queuing-private-messages-in-drupal-8"; + } + { + from = "/blog/2018/02/28/building-the-new-phpsw-website"; + to = "/blog/building-the-new-phpsw-website"; + } + { + from = "/blog/2018/03/02/yay-the-mediacurrent-contrib-half-hour-is-back"; + to = "/blog/yay-the-mediacurrent-contrib-half-hour-is-back"; + } + { + from = "/blog/2018/03/04/tweets-from-drupalcamp-london"; + to = "/blog/tweets-from-drupalcamp-london"; + } + { + from = "/blog/2018/04/23/back-to-the-future-git-diff-apply"; + to = "/blog/back-future-gits-diff-apply-commands"; + } + { + from = "/blog/2018/05/06/creating-a-custom-phpunit-command-for-docksal"; + to = "/blog/creating-a-custom-phpunit-command-for-docksal"; + } + { + from = "/blog/add-date-popup-calendar-custom-form"; + to = "/blog/how-add-date-popup-calendar-custom-form"; + } + { + from = "/blog/adding-methods-decorating-entity-metadata-wrapper"; + to = "/blog/decorating-entity-metadata-wrapper-add-refactor-methods"; + } + { + from = "/blog/announcing-drupal-vm-generator"; + to = "/blog/announcing-the-drupal-vm-generator"; + } + { + from = "/blog/announcing-the-drupal-vm-config-generator"; + to = "/blog/announcing-the-drupal-vm-generator"; + } + { + from = "/blog/back-to-the-future-git-diff-apply"; + to = "/blog/back-future-gits-diff-apply-commands"; + } + { + from = "/blog/building-gmail-filters-in-php"; + to = "/blog/building-gmail-filters-php"; + } + { + from = "/blog/building-new-phpsw-website"; + to = "/blog/building-the-new-phpsw-website"; + } + { + from = "/blog/building-presentation-slides-reveal-js-tailwind-css"; + to = "/blog/building-presentation-slides-rst2pdf"; + } + { + from = "/blog/building-speaker-leaderboard-php-south-wales-using-drupal-symfony"; + to = "/blog/building-speaker-leaderboard-php-south-wales-drupal-symfony"; + } + { + from = "/blog/create-and-apply-patches"; + to = "/blog/how-create-apply-patches"; + } + { + from = "/blog/create-flickr-photo-gallery-using-feeds-cck-and-views"; + to = "/blog/create-flickr-photo-gallery-using-feeds-cck-views"; + } + { + from = "/blog/creating-and-using-custom-tokens-drupal-7"; + to = "/blog/creating-using-custom-tokens-drupal-7"; + } + { + from = "/blog/creating-custom-docksal-commands"; + to = "/blog/creating-custom-phpunit-command-docksal"; + } + { + from = "/blog/debugging-drupal-commerce-promotions-illiminate-collections"; + to = "/blog/debugging-drupal-commerce-illuminate-collections"; + } + { + from = "/blog/decorating-entity-metadata-wrapper-add-add-refactor-methods"; + to = "/blog/decorating-entity-metadata-wrapper-add-refactor-methods"; + } + { + from = "/blog/dev-book-club-refactoring-chapter-1"; + to = "/blog/dev-book-club-notes-refactoring-chapter-1"; + } + { + from = "/blog/dividing-drupals-process-preprocess-functions-separate-files"; + to = "/blog/dividing-drupals-process-and-preprocess-functions-separate-files"; + } + { + from = "/blog/drupal-8-commerce-fixing-no-such-customer-error-(on-)?checkout"; + to = "/blog/drupal-8-commerce-fixing-no-such-customer-error-checkout"; + } + { + from = "/blog/drupal-vm-generator-291-released"; + to = "/blog/drupal-vm-generator-updates"; + } + { + from = "/blog/drupalcamp-london-2019-tickets"; + to = "/blog/drupalcamp-london-2019-tickets-available-call-sessions"; + } + { + from = "/blog/drush-make-drupalbristol"; + to = "/talks/drush-make-drupalbristol"; + } + { + from = "/blog/easier-git-repository-cloning-with-insteadof"; + to = "/blog/easier-git-repository-cloning-insteadof"; + } + { + from = "/blog/easier-sculpin-commands-with-composer-and-npm-scripts"; + to = "/blog/easier-sculpin-commands-composer-npm-scripts"; + } + { + from = "/blog/editing-meetup-videos-kdenlive"; + to = "/blog/editing-meetup-videos-linux-kdenlive"; + } + { + from = "/blog/examples-of-laravel-collections-in-drupal"; + to = "/blog/using-laravel-collections-drupal"; + } + { + from = "/blog/experimenting-with-events-in-drupal-8"; + to = "/blog/experimenting-events-drupal-8"; + } + { + from = "/blog/fix-vagrant-loading-wrong-virtual-machine"; + to = "/blog/how-fix-vagrant-loading-wrong-virtual-machine"; + } + { + from = "/blog/fixing-drupal-simpletest-docker"; + to = "/blog/fixing-drupal-simpletest-issues-inside-docker-containers"; + } + { + from = "/blog/forward-one-domain-another-using-modrewrite-and-htaccess"; + to = "/blog/forward-one-domain-another-using-modrewrite-htaccess"; + } + { + from = "/blog/forward-one-domain-another-using-modrewrite-and-htaccess"; + to = "/blog/forward-one-domain-another-using-modrewrite-htaccess"; + } + { + from = "/blog/git-format-patch"; + to = "/blog/git-format-patch-your-friend"; + } + { + from = "/blog/how-easily-embed-typekit-fonts-your-drupal-website"; + to = "/blog/easily-embed-typekit-fonts-your-drupal-website"; + } + { + from = "/blog/how-split-new-drupal-contrib-project-within-another-repository"; + to = "/blog/splitting-new-drupal-project-from-repo"; + } + { + from = "/blog/how-style-drupal-6s-taxonomy-lists-php-css-and-jquery"; + to = "/blog/style-drupal-6s-taxonomy-lists-php-css-jquery"; + } + { + from = "/blog/include-local-drupal-settings-file-environment-configuration-overrides"; + to = "/blog/include-local-drupal-settings-file-environment-configuration-and-overrides"; + } + { + from = "/blog/install-and-configure-subversion-svn-server-ubuntu"; + to = "/blog/how-install-configure-subversion-svn-server-ubuntu"; + } + { + from = "/blog/live-blogging-symfonylive-london"; + to = "/blog/live-blogging-symfonylive-london-2019"; + } + { + from = "/blog/minimum-core-version"; + to = "/blog/how-define-minimum-drupal-core-version"; + } + { + from = "/blog/nginx-redirects-with-query-string-arguments"; + to = "/blog/nginx-redirects-query-string-arguments"; + } + { + from = "/blog/null-users-and-system-users-in-drupal"; + to = "/blog/null-users-system-users-drupal"; + } + { + from = "/blog/overridding-phpcs-configuration-drupal-ci"; + to = "/blog/overriding-phpcs-configuration-drupal-ci"; + } + { + from = "/blog/pantheon-settings-files"; + to = "/blog/include-environment-specific-settings-files-pantheon"; + } + { + from = "/blog/pdfpc-pdf-presenter-console-notes"; + to = "/blog/presenting-pdf-slides-using-pdfpc-pdf-presenter-console"; + } + { + from = "/blog/php-apps-subdirectory-nginx"; + to = "/blog/how-put-your-php-application-subdirectory-another-site-nginx"; + } + { + from = "/blog/presenting-tailwind-css-ansible-cms-philly"; + to = "/blog/presenting-on-tailwind-css-and-ansible-at-cms-philly"; + } + { + from = "/blog/programmatically-load-(an-)?entityform-(in-)?drupal-7"; + to = "/blog/entityform"; + } + { + from = "/blog/published-my-first-docker-images-docker-hub"; + to = "/blog/published-my-first-docker-images-docker-hub-adr-tools-sculpin-rst2pdf"; + } + { + from = "/blog/publishing-sculpin-sites-(with-)?github-pages"; + to = "/blog/publishing-sculpin-sites-github-pages"; + } + { + from = "/blog/queuing-private-messages-in-drupal-8"; + to = "/blog/queuing-private-messages-drupal-8"; + } + { + from = "/blog/quick-project-switching-in-phpstorm"; + to = "/blog/quick-project-switching-phpstorm"; + } + { + from = "/blog/quickly-apply-patches-using-git-and-curl-or-wget"; + to = "/blog/quickly-apply-patches-using-git-curl-or-wget"; + } + { + from = "/blog/rebuilding-bartik-with-vuejs-tailwind-css"; + to = "/blog/rebuilding-bartik-drupals-default-theme-vuejs-tailwind-css"; + } + { + from = "/blog/rebuilding-bartik-with-vuejs-tailwind-css-part-2"; + to = "/blog/rebuilding-bartik-drupals-default-theme-vuejs-tailwind-css-part-2"; + } + { + from = "/blog/rebuilding-uis-tailwind-css"; + to = "/blog/uis-ive-rebuilt-tailwind-css"; + } + { + from = "/blog/restructuring-my-tailwindjs-config-files"; + to = "/blog/restructuring-my-tailwindjs-configuration-files"; + } + { + from = "/blog/retrieving-profile-data-user-using-entity-metadata-wrapper"; + to = "/blog/cleanly-retrieving-user-profile-data-using-entity-metadata-wrapper"; + } + { + from = "/blog/running-drupal-with-symfony-local-server"; + to = "/blog/running-drupal-88-symfony-local-server"; + } + { + from = "/blog/running-phpunit-tests-docksal-phpstorm"; + to = "/blog/how-run-drupal-8-phpunit-tests-within-docksal-phpstorm"; + } + { + from = "/blog/simplifying-drupal-migrations-with-xautoload"; + to = "/blog/simplifying-drupal-migrations-xautoload"; + } + { + from = "/blog/speaking-drupalcon-barcelona-2020"; + to = "/blog/speaking-drupalcon-europe-2020"; + } + { + from = "/blog/speaking-during-lockdown"; + to = "/blog/speaking-remotely-during-covid-19"; + } + { + from = "/blog/speaking-remotely-during-lockdown"; + to = "/blog/speaking-remotely-during-covid-19"; + } + { + from = "/blog/style-drupal-6s-taxonomy-lists-php-css-jquery"; + to = "/blog/style-drupal-6s-taxonomy-lists-php-css-and-jquery"; + } + { + from = "/blog/survey-results-my-drupalcon-europe-session"; + to = "/blog/survey-results-my-drupalcon-europe-session-test-driven-drupal"; + } + { + from = "/blog/system-users-null-users"; + to = "/blog/null-users-and-system-users-in-drupal"; + } + { + from = "/blog/test-driven-drupal-gitstore-leanpub"; + to = "/blog/test-driven-drupal-on-gitstore-leanpub"; + } + { + from = "/blog/test-driven-drupal-presentation-drupalcon-europe-0"; + to = "/blog/test-driven-drupal-presentation-drupalcon-europe"; + } + { + from = "/blog/test-driven-drupal-session-drupalcon-europe"; + to = "/blog/test-driven-drupal-presentation-drupalcon-europe"; + } + { + from = "/blog/test-driven-drupal-session-video-drupalcon-europe"; + to = "/blog/test-driven-drupal-presentation-drupalcon-europe"; + } + { + from = "/blog/testing-tailwind-css-plugins-with-jest"; + to = "/blog/testing-tailwind-css-plugins-jest"; + } + { + from = "/blog/testing-tailwindcss-plugins-with-jest"; + to = "/blog/testing-tailwind-css-plugins-jest"; + } + { + from = "/blog/tweets-from-drupalcamp-london"; + to = "/blog/tweets-drupalcamp-london"; + } + { + from = "/blog/updating-features-and-adding-components-using-drush"; + to = "/blog/updating-features-adding-components-using-drush"; + } + { + from = "/blog/updating-forked-repositories-github"; + to = "/blog/updating-forked-github-repos"; + } + { + from = "/blog/use-regular-expressions-search-and-replace-coda-or-textmate"; + to = "/blog/use-regular-expressions-search-replace-coda-or-textmate"; + } + { + from = "/blog/using-environment-variables-settings-docksal"; + to = "/blog/how-use-environment-variables-your-drupal-settings-docksal"; + } + { + from = "/blog/using-psr-4-autoloading-your-drupal-7-test-cases"; + to = "/blog/psr4-autoloading-test-cases-drupal-7"; + } + { + from = "/blog/using-tailwind-css-in-your-drupal-theme"; + to = "/blog/using-tailwind-css-your-drupal-theme"; + } + { + from = "/blog/using-the-pcss-extension-postcss-webpack-encore"; + to = "/blog/using-pcss-extension-postcss-webpack-encore"; + } + { + from = "/blog/weeknotes-june-5th"; + to = "/blog/weeknotes-2021-06-05"; + } + { + from = "/blog/writing-drupal-module-test-driven-development-tdd"; + to = "/blog/writing-new-drupal-8-module-using-test-driven-development-tdd"; + } + { + from = "/book"; + to = "/test-driven-drupal"; + } + { + from = "/calendars?"; + to = "https://savvycal.com/opdavies"; + } + { + from = "/cms-philly"; + to = "/articles/presenting-on-tailwind-css-and-ansible-at-cms-philly"; + } + { + from = "/code-enigma-interview"; + to = "https://blog.codeenigma.com/interview-with-a-drupal-expert-9fcd8e0fad28"; + } + { + from = "/consulting"; + to = "/"; + } + { + from = "/contrib-half-hour"; + to = "https://www.youtube.com/playlist?list=PLu-MxhbnjI9rHroPvZO5LEUhr58Yl0j_F"; + } + { + from = "/cv"; + to = "/cv.txt"; + } + { + from = "/d0P5z"; + to = "/talks/drupal-8-php-libraries-drupalorg-api"; + } + { + from = "/d7"; + to = "/drupal7"; + } + { + from = "/dcbristol-cfp"; + to = "https://www.papercall.io/drupalcamp-bristol-2019"; + } + { + from = "/dcbristol17-videos"; + to = "https://www.youtube.com/playlist?list=PLOwPvExSyLLngtd6R4PUD9MCXa6QL_obA"; + } + { + from = "/dcbristol19-announced"; + to = "/articles/drupalcamp-bristol-2019-speakers-sessions-announced"; + } + { + from = "/dclondon-sat"; + to = "https://drupalcamp.london/schedule/saturday"; + } + { + from = "/dclondon-sun"; + to = "https://drupalcamp.london/schedule/sunday"; + } + { + from = "/dclondon20"; + to = "/articles/drupalcamp-london-testing-workshop"; + } + { + from = "/ddev-phpunit-command"; + to = "/blog/creating-custom-phpunit-command-ddev"; + } + { + from = "/deploying-php-ansible"; + to = "/talks/deploying-php-ansible-ansistrano"; + } + { + from = "/dks7E"; + to = "https://www.youtube.com/watch?v=PLS4ET7FAcU"; + } + { + from = "/do-library"; + to = "https://github.com/opdavies/drupalorg-api-php"; + } + { + from = "/do-projects"; + to = "https://github.com/opdavies/drupal-module-drupalorg-projects"; + } + { + from = "/docksal-phpunit-phpstorm"; + to = "/articles/running-phpunit-tests-docksal-phpstorm"; + } + { + from = "/docksal-posts"; + to = "/articles/tags/docksal"; + } + { + from = "/dransible"; + to = "https://github.com/opdavies/dransible"; + } + { + from = "/dransible-drupal-9"; + to = "/blog/upgrading-dransible-project-drupal-9"; + } + { + from = "/drupal-bristol-march-19"; + to = "https://docs.google.com/presentation/d/1pk9LIN-hHX73kvDdo-lzgmKlAeH33_K_uvI0t7A-rvY/edit?usp=sharing"; + } + { + from = "/drupal-consultant"; + to = "/drupal-consulting"; + } + { + from = "/drupal-consulting"; + to = "/"; + } + { + from = "/drupal-core-live-stream"; + to = "https://www.youtube.com/watch?v=OK4FWwh1gQU"; + } + { + from = "/drupal-core-testing-gate"; + to = "https://www.drupal.org/core/gates#testing"; + } + { + from = "/drupal-first-time-issues"; + to = "https://www.drupal.org/project/issues/search?text=&projects=&assigned=&submitted=&project_issue_followers=&status%5B%5D=Open&issue_tags_op=%3D&issue_tags=Novice"; + } + { + from = "/drupal-forum-post"; + to = "http://www.webmaster-forums.net/webmasters-corner/developing-my-website-using-php-and-mysql#comment-1231537"; + } + { + from = "/drupal-marketplace-uk"; + to = "https://www.drupal.org/drupal-services?offices%5B%5D=24460"; + } + { + from = "/drupal-meetups-twitterbot"; + to = "/articles/introducing-the-drupal-meetups-twitterbot"; + } + { + from = "/drupal-novice-issues"; + to = "https://www.drupal.org/project/issues/search?text=&projects=&assigned=&submitted=&project_issue_followers=&status%5B%5D=Open&issue_tags_op=%3D&issue_tags=Novice"; + } + { + from = "/drupal-php-developer"; + to = "/drupal-consultant"; + } + { + from = "/drupal-php-developer-consultant-uk"; + to = "/drupal-php-developer"; + } + { + from = "/drupal-tailwind-demo"; + to = "https://www.youtube.com/watch?v=1eM-Gw6GI4g"; + } + { + from = "/drupal-tailwindcss"; + to = "https://www.drupal.org/project/tailwindcss"; + } + { + from = "/drupal-vuejs"; + to = "/talks/decoupling-drupal-vuejs/"; + } + { + from = "/drupal7"; + to = "/drupal-upgrade"; + } + { + from = "/drupalcamp-london-2019-tickets"; + to = "/articles/drupalcamp-london-2019-tickets"; + } + { + from = "/drupalcamp-nyc-training"; + to = "https://www.youtube.com/watch?v=3M9c4UUzKm0"; + } + { + from = "/drupalorg"; + to = "https://www.drupal.org/u/opdavies"; + } + { + from = "/drupalorg-project-issues"; + to = "https://www.drupal.org/project/issues/search?projects=Override+Node+Options%2C+Tailwind+CSS+Starter+Kit%2C+Block+ARIA+Landmark+Roles%2C+Copyright+Block+module%2C+System+User%2C+Null+User%2C+Collection+class%2C+Pathauto+Menu+Link%2C+Webform+ARIA&project_issue_followers=&status%5B%5D=1&status%5B%5D=13&status%5B%5D=8&status%5B%5D=14&status%5B%5D=15&issue_tags_op=%3D"; + } + { + from = "/drupalversary"; + to = "https://github.com/opdavies/drupal-module-drupalversary"; + } + { + from = "/elewant"; + to = "https://elewant.com/shepherd/admire/opdavies"; + } + { + from = "/feed"; + to = "/rss.xml"; + } + { + from = "/first-drupal-core-issue"; + to = "https://www.drupal.org/project/drupal/issues/753898"; + } + { + from = "/first-npm-package"; + to = "https://www.npmjs.com/package/tailwindcss-vuejs"; + } + { + from = "/freeagent"; + to = "https://opdavies.freeagent.com"; + } + { + from = "/git-flow"; + to = "/talks/git-flow"; + } + { + from = "/gitlab"; + to = "https://gitlab.com/opdavies"; + } + { + from = "/gitstore"; + to = "https://enjoy.gitstore.app/maintainers/opdavies"; + } + { + from = "/gmail-filters"; + to = "https://gitlab.com/opdavies/gmail-filters"; + } + { + from = "/images/me-precedent.jpg"; + to = "/sites/default/files/images/social-avatar.jpg"; + } + { + from = "/inviqa-tailwind-demo"; + to = "https://play.tailwindcss.com/Yfmw8O5UNN"; + } + { + from = "/inviqa-tailwind-notes"; + to = "https://gist.github.com/opdavies/e6f0f4938506a6859acf1aca8b4e1a74"; + } + { + from = "/join-php-south-wales-slack"; + to = "https://join.slack.com/t/phpsouthwales/shared_invite/zt-4vuetc43-AvtEK1WqNzp5k1w4yWKOJA"; + } + { + from = "/jy6rW"; + to = "https://www.meetup.com/PHP-South-Wales/events/264731393"; + } + { + from = "/kB6Jd"; + to = "/articles/running-drupal-with-symfony-local-server/"; + } + { + from = "/kmDRA"; + to = "https://www.bbc.co.uk/news/uk-46561779"; + } + { + from = "/leeds-php-drupal-9"; + to = "https://www.meetup.com/leedsphp/events/272504993"; + } + { + from = "/live"; + to = "https://www.youtube.com/channel/UCkeK0qF9HHUPQH_fvn4ghqQ"; + } + { + from = "/npm"; + to = "https://www.npmjs.com/~opdavies"; + } + { + from = "/oFlkS"; + to = "/articles/test-driven-drupal-on-gitstore-leanpub"; + } + { + from = "/oliver-davies-uk-based-drupal-symfony-developer"; + to = "/oliver-davies-uk-based-drupal-php-developer"; + } + { + from = "/pair-programming"; + to = "/pair"; + } + { + from = "/pair-with-me"; + to = "/pair"; + } + { + from = "/pairing"; + to = "/pair"; + } + { + from = "/php-ansible"; + to = "/talks/deploying-php-ansible-ansistrano"; + } + { + from = "/presentations/building-presenting-slide-decks-rst2pdf"; + to = "/presentations/rst2pdf"; + } + { + from = "/presentations/building-static-websites-sculpin"; + to = "/presentations/sculpin"; + } + { + from = "/qSHAl"; + to = "/articles/published-my-first-npm-package/"; + } + { + from = "/qT1Rb"; + to = "https://github.com/opdavies/drupal-meetups-twitterbot"; + } + { + from = "/rebuilding-acquia"; + to = "https://rebuilding-acquia.oliverdavies.uk"; + } + { + from = "/rebuilding-bartik"; + to = "/articles/rebuilding-bartik-with-vuejs-tailwind-css"; + } + { + from = "/rebuilding-bristol-js"; + to = "https://github.com/opdavies/rebuilding-bristol-js"; + } + { + from = "/rebuilding-pantheon"; + to = "https://play.tailwindcss.com/LND98XihGI?layout=horizontal"; + } + { + from = "/rebuilding-platformsh"; + to = "https://rebuilding-platformsh.oliverdavies.uk"; + } + { + from = "/rebuilding-symfony"; + to = "https://github.com/opdavies/rebuilding-symfony"; + } + { + from = "/rk29B"; + to = "https://www.meetup.com/PHP-South-Wales/events/268422525"; + } + { + from = "/roadmap"; + to = "/drupal-upgrade"; + } + { + from = "/rss"; + to = "/rss.xml"; + } + { + from = "/rst2pdf"; + to = "/talks/building-presenting-slide-decks-rst2pdf"; + } + { + from = "/s9MjJ"; + to = "https://symfonycasts.com/screencast/symfony"; + } + { + from = "/sculpin"; + to = "/talks/building-static-websites-sculpin"; + } + { + from = "/sculpin-encore-versioning"; + to = "https://github.com/opdavies/oliverdavies.uk/commit/d192b04aefa6e7a21bfc1f2e0fe0a16111e0e8a2"; + } + { + from = "/sites/default/files/images/social-avatar.jpg"; + to = "/images/social-avatar.jpg"; + } + { + from = "/skills"; + to = "https://opdavies-skills-tailwindcss.netlify.com/"; + } + { + from = "/slides-drupal-9"; + to = "https://slides-upgrading-to-drupal-9.oliverdavies.uk"; + } + { + from = "/slides-upgrading-to-drupal-9"; + to = "https://slides-upgrading-to-drupal-9.oliverdavies.uk"; + } + { + from = "/slides-upgrading-to-drupal-9/index.html"; + to = "https://slides-upgrading-to-drupal-9.oliverdavies.uk"; + } + { + from = "/slides-working-with-workspace"; + to = "https://slides-working-with-workspace.oliverdavies.uk"; + } + { + from = "/speaker"; + to = "/press"; + } + { + from = "/speaker-info"; + to = "/speaker"; + } + { + from = "/speaker-information"; + to = "/speaker"; + } + { + from = "/speaking-videos"; + to = "https://www.youtube.com/playlist?list=PLHn41Ay7w7kfAzczswrANch5oHAPZBlvu"; + } + { + from = "/stream"; + to = "https://www.youtube.com/channel/UCkeK0qF9HHUPQH_fvn4ghqQ/live"; + } + { + from = "/subscription"; + to = "/"; + } + { + from = "/swap-markdown-parser"; + to = "https://github.com/opdavies/sculpin-twig-markdown-bundle-example/tree/swap-markdown-parser"; + } + { + from = "/symfony"; + to = "https://connect.symfony.com/profile/opdavies"; + } + { + from = "/symfony-server"; + to = "/articles/running-drupal-with-symfony-local-server"; + } + { + from = "/symfonylive"; + to = "/articles/live-blogging-symfonylive-london"; + } + { + from = "/symposium"; + to = "https://symposiumapp.com/u/opdavies"; + } + { + from = "/tailwind-css-talk"; + to = "/talks/taking-flight-tailwind-css"; + } + { + from = "/tailwind-repos"; + to = "https://github.com/opdavies?utf8=%e2%9c%93&tab=repositories&q=tailwindcss"; + } + { + from = "/tailwind-talk"; + to = "/talks/taking-flight-with-tailwind-css"; + } + { + from = "/tailwindcss-demo"; + to = "http://tailwindcss-demo.oliverdavies.uk/"; + } + { + from = "/talks"; + to = "/presentations"; + } + { + from = "/talks-offer-tweet"; + to = "https://twitter.com/opdavies/status/1250870367712935938"; + } + { + from = "/talks/2012/09/05/what-is-this-drupal-thing-unified-diff"; + to = "/talks/what-is-this-drupal-thing"; + } + { + from = "/talks/2013/07/10/drupal-ldap-swdug"; + to = "/talks/drupal-ldap"; + } + { + from = "/talks/2014/03/01/git-flow-drupalcamp-london-2014"; + to = "/talks/git-flow"; + } + { + from = "/talks/2014/07/02/drush-make-drupalbristol-drupal-bristol"; + to = "/talks/drush-make-drupalbristol"; + } + { + from = "/talks/2014/08/19/drupal-association-swdug"; + to = "/talks/drupal-association"; + } + { + from = "/talks/2015/01/18/drupalorg-2015-drupalcamp-brighton-2015"; + to = "/talks/drupalorg-in-2015-whats-coming-next"; + } + { + from = "/talks/2015/02/28/drupalorg-2015-drupalcamp-london-2015"; + to = "/talks/drupalorg-in-2015-whats-coming-next"; + } + { + from = "/talks/2015/04/08/drupal-8-phpsw"; + to = "/talks/drupal-8"; + } + { + from = "/talks/2015/07/25/test-drive-twig-with-sculpin-drupalcamp-north-2015"; + to = "/talks/test-drive-twig-with-sculpin"; + } + { + from = "/talks/2015/08/25/dancing-for-drupal-umbristol"; + to = "/talks/dancing-for-drupal"; + } + { + from = "/talks/2015/10/14/sculpin-phpsw"; + to = "/talks/sculpin"; + } + { + from = "/talks/2016/03/05/drupal-8-module-development-drupalcamp-london-2016"; + to = "/talks/getting-started-with-drupal-8-module-development"; + } + { + from = "/talks/2016/03/09/drupal-vm-generator-nwdug"; + to = "/talks/drupal-vm-generator"; + } + { + from = "/talks/2016/04/02/drupal-vm-generator-drupal-bristol"; + to = "/talks/drupal-vm-generator"; + } + { + from = "/talks/2016/06/11/drupal-8-rejoining-the-herd-php-south-coast-2016"; + to = "/talks/drupal-8-rejoining-the-herd"; + } + { + from = "/talks/2016/07/23/drupal-vm-meet-symfony-console-drupalcamp-bristol-2016"; + to = "/talks/drupal-vm-meet-symfony-console"; + } + { + from = "/talks/2016/11/09/drupal-development-with-composer-phpsw"; + to = "/talks/drupal-development-with-composer"; + } + { + from = "/talks/2016/11/17/goodbye-drush-make-hello-composer-drupal-bristol"; + to = "/talks/goodbye-drush-make-hello-composer"; + } + { + from = "/talks/2017/01/18/getting-your-data-into-drupal-8-drupal-bristol"; + to = "/talks/getting-your-data-into-drupal-8"; + } + { + from = "/talks/2017/03/04/getting-your-data-into-drupal-8-drupalcamp-london-2017"; + to = "/talks/getting-your-data-into-drupal-8"; + } + { + from = "/talks/ansible-ansistrano"; + to = "https://www.oliverdavies.uk/talks/deploying-php-ansible-ansistrano"; + } + { + from = "/talks/deploying-php-applications-fabric"; + to = "/talks/deploying-php-fabric"; + } + { + from = "/talks/deploying-php-applications-with-fabric"; + to = "/talks/deploying-php-fabric"; + } + { + from = "/talks/drupal-vm-generator-2"; + to = "/talks/drupal-vm-generator"; + } + { + from = "/talks/drupalorg-2015-2"; + to = "/talks/drupalorg-2015"; + } + { + from = "/talks/drupalorg-in-2015-whats-coming-next"; + to = "/talks/drupalorg-2015"; + } + { + from = "/talks/getting-started-with-drupal-8-module-development"; + to = "/drupal-8-module-development"; + } + { + from = "/talks/having-fun-drupal-8-php-libraries-drupalorg-api"; + to = "/talks/drupal-8-php-libraries-drupalorg-api"; + } + { + from = "/talks/never-commit-master-introduction-git-flow"; + to = "/talks/git-flow"; + } + { + from = "/talks/sculpin"; + to = "/talks/building-static-websites-sculpin"; + } + { + from = "/talks/tailwind"; + to = "/talks/taking-flight-with-tailwind-css/"; + } + { + from = "/talks/taking-flight-tailwind-css"; + to = "/talks/taking-flight-with-tailwind-css"; + } + { + from = "/talks/using-laravel-collections-outside-laravel"; + to = "/talks/using-illuminate-collections-outside-laravel"; + } + { + from = "/talks/working-workspace"; + to = "/talks/working-with-workspace"; + } + { + from = "/tdd-blog"; + to = "https://github.com/opdavies/drupal-module-tdd-blog"; + } + { + from = "/tdd-test-driven-drupal"; + to = "/talks/tdd-test-driven-drupal/"; + } + { + from = "/team-coaching"; + to = "/"; + } + { + from = "/test-driven-drupal-book"; + to = "/test-driven-drupal"; + } + { + from = "/testing-drupal"; + to = "https://www.oliverdavies.uk/talks/tdd-test-driven-drupal"; + } + { + from = "/testing-drupal-intro"; + to = "https://inviqa.com/blog/drupal-automated-testing-introduction"; + } + { + from = "/testing-tailwind-plugins"; + to = "/articles/testing-tailwindcss-plugins-with-jest"; + } + { + from = "/testing-workshop"; + to = "https://github.com/opdavies/workshop-drupal-automated-testing"; + } + { + from = "/testing-workshop-code"; + to = "https://github.com/opdavies/workshop-drupal-automated-testing-code"; + } + { + from = "/todoist-filters"; + to = "https://gist.github.com/opdavies/6709fbdac5c3babbd94137bcc8b8e3c2"; + } + { + from = "/twitter-tweaks"; + to = "https://github.com/opdavies/chrome-extension-twitter-tweaks"; + } + { + from = "/upgrading-to-drupal-9"; + to = "/talks/upgrading-your-site-drupal-9"; + } + { + from = "/uxbjV"; + to = "https://www.drupal.org/project/copyright_block"; + } + { + from = "/vyTEF"; + to = "https://www.npmjs.com/package/tailwindcss-vuejs"; + } + { + from = "/webpack-encore-pcss-regex"; + to = "https://regexr.com/51iaf"; + } + { + from = "/wordcamp-bristol-tailwindcss"; + to = "https://2019.bristol.wordcamp.org/session/taking-flight-with-tailwind-css"; + } + { + from = "/wordpress-tailwind"; + to = "https://github.com/opdavies/wordcamp-bristol-2019"; + } + { + from = "/work"; + to = "/drupal-php-developer"; + } + { + from = "/working-with-workspace"; + to = "/talks/working-with-workspace"; + } + { + from = "/workshop-drupal-testing"; + to = "https://github.com/opdavies/workshop-drupal-automated-testing"; + } + { + from = "/workspace-demo"; + to = "https://github.com/opdavies/working-with-workspace-demo"; + } + { + from = "/wp-tailwind"; + to = "https://wp-tailwind.oliverdavies.uk"; + } + { + from = "/wp-tailwind-repo"; + to = "https://github.com/opdavies/wordcamp-bristol-2019"; + } + { + from = "/wp-tailwind-starter"; + to = "https://github.com/opdavies/wordpress-tailwindcss-startker-kit"; + } + { + from = "/wp-tailwind-static"; + to = "https://wp-tailwind.oliverdavies.uk"; + } + { + from = "/yXhoS"; + to = "/talks/things-you-should-know-about-php"; + } +] diff --git a/hosts/hetznix/services/caddy/vhosts/www.oliverdavies.uk.nix b/hosts/hetznix/services/caddy/vhosts/www.oliverdavies.uk.nix index 210248e8..aa6f10a1 100644 --- a/hosts/hetznix/services/caddy/vhosts/www.oliverdavies.uk.nix +++ b/hosts/hetznix/services/caddy/vhosts/www.oliverdavies.uk.nix @@ -28,6 +28,12 @@ } '') tomePaths ); + + redirects = import ./www.oliverdavies.uk-redirects.nix; + + redirectLines = builtins.concatStringsSep "\n" ( + map (r: "redir ${r.from} ${r.to} permanent") redirects + ); in '' encode gzip @@ -44,8 +50,17 @@ } ${tomeConfig} - '' - + builtins.readFile ./www.oliverdavies.uk-redirects.caddy; + + @articles path_regexp ^/articles/(.*)$ + @talks path_regexp ^/talks/(.*)$ + @talks-archive path_regexp ^/talks/archive/(.*)$ + + redir @articles /blog/{re.1} permanent + redir @talks-archive /presentations/{re.1} permanent + redir @talks /presentations/{re.1} permanent + + ${redirectLines} + ''; }; }; }