<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en">
<link href="https://danielrotter.at/feed.xml" rel="self" type="application/atom+xml"/>
<link href="https://danielrotter.at/" rel="alternate" type="text/html" hreflang="en"/>
<updated>2026-04-02</updated>
<id>https://danielrotter.at/feed.xml</id>
<title type="html">Daniel Rotter</title>
<subtitle>A blog about web development in general and about PHP, JavaScript, Linux and its command line in particular.</subtitle>
<entry>
<title type="html">Batch fixing date of images based on filename in fish</title>
<link href="https://danielrotter.at//2025/11/12/batch-fixing-date-of-images-based-on-filename-in-fish.html" rel="alternate" type="text/html" title="Batch fixing date of images based on filename in fish"/>
<published>2025-11-12</published>
<updated>2025-11-12</updated>
<id>https://danielrotter.at//2025/11/12/batch-fixing-date-of-images-based-on-filename-in-fish.html</id>
<category term="cli"/>
<category term="fish"/>
<category term="regex"/>
<category term="linux"/>
<summary type="html">I was confronted with a large amount of images, all of which did not have the correct date attached to them. Fortunately I was able to fix them by relying on the filename.</summary>
</entry>
<entry>
<title type="html">Don’t be shy, start your own meetup!</title>
<link href="https://danielrotter.at//2025/08/11/dont-be-shy-start-your-own-meetup.html" rel="alternate" type="text/html" title="Don’t be shy, start your own meetup!"/>
<published>2025-08-11</published>
<updated>2025-08-11</updated>
<id>https://danielrotter.at//2025/08/11/dont-be-shy-start-your-own-meetup.html</id>
<category term="meetup"/>
<summary type="html">You might think that starting your own meetup might be very hard. Let me tell you the story about the VlbgWebDev meetup, which might change your mind.</summary>
</entry>
<entry>
<title type="html">Test creation methods on steroids with named parameters</title>
<link href="https://danielrotter.at//2025/06/29/test-creation-methods-on-steroids-with-named-parameters.html" rel="alternate" type="text/html" title="Test creation methods on steroids with named parameters"/>
<published>2025-06-29</published>
<updated>2025-06-29</updated>
<id>https://danielrotter.at//2025/06/29/test-creation-methods-on-steroids-with-named-parameters.html</id>
<category term="testing"/>
<category term="php"/>
<summary type="html">Creation methods are a well-known pattern in testing. But they are even more powerful when used with named parameters.</summary>
</entry>
<entry>
<title type="html">Batch curl requests in PHP using multi handles</title>
<link href="https://danielrotter.at//2025/04/12/batch-curl-requests-in-php-using-multi-handles.html" rel="alternate" type="text/html" title="Batch curl requests in PHP using multi handles"/>
<published>2025-04-12</published>
<updated>2025-04-12</updated>
<id>https://danielrotter.at//2025/04/12/batch-curl-requests-in-php-using-multi-handles.html</id>
<category term="programming"/>
<category term="php"/>
<summary type="html">Sending many requests in a PHP script might not be a straightforward task, especially if you want to do that in a performant manner.</summary>
</entry>
<entry>
<title type="html">Automatically generate changelogs with git</title>
<link href="https://danielrotter.at//2025/03/05/automatically-generate-changelogs-with-git.html" rel="alternate" type="text/html" title="Automatically generate changelogs with git"/>
<published>2025-03-05</published>
<updated>2025-03-05</updated>
<id>https://danielrotter.at//2025/03/05/automatically-generate-changelogs-with-git.html</id>
<category term="git"/>
<summary type="html">Generating changelogs is a rather tedious task for developers. But with a bit of discipline it becomes a one-line script.</summary>
</entry>
<entry>
<title type="html">The problem with indirections</title>
<link href="https://danielrotter.at//2025/02/05/the-problem-with-indirections.html" rel="alternate" type="text/html" title="The problem with indirections"/>
<published>2025-02-05</published>
<updated>2025-02-05</updated>
<id>https://danielrotter.at//2025/02/05/the-problem-with-indirections.html</id>
<category term="programming"/>
<category term="php"/>
<category term="javascript"/>
<category term="vue"/>
<summary type="html">Indirections are invaluable for programming, since basically every programming concept makes use of one. However, we should still be careful when using them.</summary>
</entry>
<entry>
<title type="html">Writing high quality tests</title>
<link href="https://danielrotter.at//2024/10/19/writing-high-quality-tests.html" rel="alternate" type="text/html" title="Writing high quality tests"/>
<published>2024-10-19</published>
<updated>2024-10-19</updated>
<id>https://danielrotter.at//2024/10/19/writing-high-quality-tests.html</id>
<category term="testing"/>
<category term="php"/>
<category term="javascript"/>
<category term="react"/>
<summary type="html">Tests often do not get the attention they deserver especially during code reviews, even though there are some things a reviewer could look out for.</summary>
</entry>
<entry>
<title type="html">Finding all HTML tags in a project not being self-closed</title>
<link href="https://danielrotter.at//2024/04/02/finding-all-html-tags-not-being-self-closed.html" rel="alternate" type="text/html" title="Finding all HTML tags in a project not being self-closed"/>
<published>2024-04-02</published>
<updated>2024-04-02</updated>
<id>https://danielrotter.at//2024/04/02/finding-all-html-tags-not-being-self-closed.html</id>
<category term="html"/>
<category term="vue"/>
<category term="regex"/>
<category term="cli"/>
<summary type="html">For some refactoring I needed to find all HTMl tags not being self-closed. I decided to use regular expression for that, and this is what I came up with.</summary>
</entry>
<entry>
<title type="html">git bisect and the importance of a clean history</title>
<link href="https://danielrotter.at//2023/10/28/git-bisect-and-the-importance-of-a-clean-history.html" rel="alternate" type="text/html" title="git bisect and the importance of a clean history"/>
<published>2023-10-28</published>
<updated>2024-02-10</updated>
<id>https://danielrotter.at//2023/10/28/git-bisect-and-the-importance-of-a-clean-history.html</id>
<category term="git"/>
<category term="cli"/>
<summary type="html">The value of a clean git history is often underestimated. I will explain one of the advantages based on the git bisect command.</summary>
</entry>
<entry>
<title type="html">Avoid mocking repositories by using in-memory implementations</title>
<link href="https://danielrotter.at//2023/09/22/avoid-mocking-repositories-by-using-in-memory-implementations.html" rel="alternate" type="text/html" title="Avoid mocking repositories by using in-memory implementations"/>
<published>2023-09-22</published>
<updated>2023-09-25</updated>
<id>https://danielrotter.at//2023/09/22/avoid-mocking-repositories-by-using-in-memory-implementations.html</id>
<category term="testing"/>
<category term="php"/>
<category term="symfony"/>
<summary type="html">Mocking libraries come with disadvantages, but fortunately they can be replaced by in-memory implementations, at least for repositories.</summary>
</entry>
<entry>
<title type="html">Making the shell history more useful by using shell variables</title>
<link href="https://danielrotter.at//2023/09/02/making-the-shell-history-more-useful-by-using-shell-variables.html" rel="alternate" type="text/html" title="Making the shell history more useful by using shell variables"/>
<published>2023-09-02</published>
<updated>2023-09-02</updated>
<id>https://danielrotter.at//2023/09/02/making-the-shell-history-more-useful-by-using-shell-variables.html</id>
<category term="cli"/>
<category term="linux"/>
<category term="fish"/>
<summary type="html">The shell history is cluttered with useless commands if stuff like tokens are included. Shell variables allow to exclude such content from the history.</summary>
</entry>
<entry>
<title type="html">Redesign website to be even simpler</title>
<link href="https://danielrotter.at//2023/08/07/redesign-website-to-be-even-simpler.html" rel="alternate" type="text/html" title="Redesign website to be even simpler"/>
<published>2023-08-07</published>
<updated>2023-08-07</updated>
<id>https://danielrotter.at//2023/08/07/redesign-website-to-be-even-simpler.html</id>
<category term="html"/>
<category term="css"/>
<summary type="html">After a few years with my website I felt like it could be even simpler, so I reduced the design and HTML/CSS to the absolute minimum.</summary>
</entry>
<entry>
<title type="html">Combine jq with curl to improve its JSON handling</title>
<link href="https://danielrotter.at//2023/07/19/combine-jq-with-curl-to-improve-its-json-handling.html" rel="alternate" type="text/html" title="Combine jq with curl to improve its JSON handling"/>
<published>2023-07-19</published>
<updated>2023-07-19</updated>
<id>https://danielrotter.at//2023/07/19/combine-jq-with-curl-to-improve-its-json-handling.html</id>
<category term="cli"/>
<category term="http"/>
<category term="json"/>
<category term="logging"/>
<summary type="html">jq is a nice JSON processor, which is helpful when working with JSON outputs, no matter if they are retrieved using curl or any other command.</summary>
</entry>
<entry>
<title type="html">Use external programs like git in Neovim commands</title>
<link href="https://danielrotter.at//2023/07/06/use-external-programs-like-git-in-Neovim-commands.html" rel="alternate" type="text/html" title="Use external programs like git in Neovim commands"/>
<published>2023-07-06</published>
<updated>2023-08-06</updated>
<id>https://danielrotter.at//2023/07/06/use-external-programs-like-git-in-Neovim-commands.html</id>
<category term="neovim"/>
<category term="vim"/>
<category term="git"/>
<category term="cli"/>
<summary type="html">Neovim comes with a very powerful command system, which can even be combined with existing shell commands!</summary>
</entry>
<entry>
<title type="html">Configuring nginx with php-fpm in kubernetes and the “File not found.” error</title>
<link href="https://danielrotter.at//2023/05/30/configuring-nginx-with-php-fpm-in-kubernetes-and-the-file-not-found-error.html" rel="alternate" type="text/html" title="Configuring nginx with php-fpm in kubernetes and the “File not found.” error"/>
<published>2023-05-30</published>
<updated>2023-05-30</updated>
<id>https://danielrotter.at//2023/05/30/configuring-nginx-with-php-fpm-in-kubernetes-and-the-file-not-found-error.html</id>
<category term="nginx"/>
<category term="php"/>
<category term="docker"/>
<category term="kubernetes"/>
<summary type="html">It was not trivial to setup nginx with php-fpm to run in separate containers in kubernetes. Therefore I want to explain how I got it to work.</summary>
</entry>
<entry>
<title type="html">Some reasons for disliking react hooks</title>
<link href="https://danielrotter.at//2022/01/16/some-reasons-for-disliking-react-hooks.html" rel="alternate" type="text/html" title="Some reasons for disliking react hooks"/>
<published>2022-01-16</published>
<updated>2022-02-12</updated>
<id>https://danielrotter.at//2022/01/16/some-reasons-for-disliking-react-hooks.html</id>
<category term="javascript"/>
<category term="react"/>
<summary type="html">React has introduced hooks to replace classes. Some people are huge fans, while I am a bit more skeptical. An explanation.</summary>
</entry>
<entry>
<title type="html">Use git submodules and make for simple code sharing</title>
<link href="https://danielrotter.at//2021/03/06/use-git-submodules-and-make-for-simple-code-sharing.html" rel="alternate" type="text/html" title="Use git submodules and make for simple code sharing"/>
<published>2021-03-06</published>
<updated>2021-03-06</updated>
<id>https://danielrotter.at//2021/03/06/use-git-submodules-and-make-for-simple-code-sharing.html</id>
<category term="html"/>
<category term="css"/>
<category term="javascript"/>
<category term="git"/>
<category term="pandoc"/>
<category term="graphviz"/>
<category term="make"/>
<summary type="html">Simple code often does not require complicated packaging mechanisms. Reusing established tools like Git and make seem perfect for this use case.</summary>
</entry>
<entry>
<title type="html">Code comments are (mostly) a violation of DRY</title>
<link href="https://danielrotter.at//2021/01/16/code-comments-are-mostly-a-violation-of-dry.html" rel="alternate" type="text/html" title="Code comments are (mostly) a violation of DRY"/>
<published>2021-01-16</published>
<updated>2021-01-16</updated>
<id>https://danielrotter.at//2021/01/16/code-comments-are-mostly-a-violation-of-dry.html</id>
<category term="php"/>
<category term="javascript"/>
<category term="programming"/>
<category term="documentation"/>
<category term="dry"/>
<summary type="html">Comments in code are quite often a code smell. Let’s see what is suboptimal about comments and talk about some strategies to avoid them.</summary>
</entry>
<entry>
<title type="html">Automatic command execution on file changes with entr</title>
<link href="https://danielrotter.at//2020/10/07/automatic-command-execution-on-file-changes-with-entr.html" rel="alternate" type="text/html" title="Automatic command execution on file changes with entr"/>
<published>2020-10-07</published>
<updated>2020-10-07</updated>
<id>https://danielrotter.at//2020/10/07/automatic-command-execution-on-file-changes-with-entr.html</id>
<category term="cli"/>
<category term="linux"/>
<category term="php"/>
<category term="testing"/>
<category term="markdown"/>
<category term="presentations"/>
<summary type="html">Sometimes you want a command to be automatically executed as soon as a certain file changes. There is a small tool called entr, which helps with that.</summary>
</entry>
<entry>
<title type="html">Applying design patterns: The builder and factory pattern in a DI context</title>
<link href="https://danielrotter.at//2020/08/24/applying-design-patterns-the-builder-and-factory-pattern.html" rel="alternate" type="text/html" title="Applying design patterns: The builder and factory pattern in a DI context"/>
<published>2020-08-24</published>
<updated>2020-09-10</updated>
<id>https://danielrotter.at//2020/08/24/applying-design-patterns-the-builder-and-factory-pattern.html</id>
<category term="php"/>
<category term="oop"/>
<category term="symfony"/>
<summary type="html">Creating objects is a very basic task. Although this seems like a simple problem, it can be improved by using patterns like builder and factory.</summary>
</entry>
<entry>
<title type="html">Understanding animated graphs in D3.js</title>
<link href="https://danielrotter.at//2020/06/12/understanding-animated-graphs-with-d3js.html" rel="alternate" type="text/html" title="Understanding animated graphs in D3.js"/>
<published>2020-06-12</published>
<updated>2020-06-12</updated>
<id>https://danielrotter.at//2020/06/12/understanding-animated-graphs-with-d3js.html</id>
<category term="javascript"/>
<category term="d3js"/>
<category term="visualization"/>
<category term="svg"/>
<summary type="html">Building a graph is a pretty straight forward task in D3.js, but I’ve had a hard time understanding how to update them. This is a try to explain why.</summary>
</entry>
<entry>
<title type="html">Typing in JavaScript - Flow vs. TypeScript</title>
<link href="https://danielrotter.at//2020/06/05/typing-in-javascript-flow-vs-typescript.html" rel="alternate" type="text/html" title="Typing in JavaScript - Flow vs. TypeScript"/>
<published>2020-06-05</published>
<updated>2020-06-05</updated>
<id>https://danielrotter.at//2020/06/05/typing-in-javascript-flow-vs-typescript.html</id>
<category term="javascript"/>
<category term="flow"/>
<category term="typescript"/>
<category term="typing"/>
<summary type="html">There were two choices for static type checking in JavaScript - Flow and TypeScript. TypeScript is much more popular nowadays, but let’s compare them anyway.</summary>
</entry>
<entry>
<title type="html">Execute commands for multiple files using fish</title>
<link href="https://danielrotter.at//2020/05/13/execute-commands-for-multiple-files-in-fish.html" rel="alternate" type="text/html" title="Execute commands for multiple files using fish"/>
<published>2020-05-13</published>
<updated>2020-05-13</updated>
<id>https://danielrotter.at//2020/05/13/execute-commands-for-multiple-files-in-fish.html</id>
<category term="cli"/>
<category term="fish"/>
<category term="linux"/>
<summary type="html">Quite often I want to execute the same command for multiple files. It is quite easy to achieve that using the fish shell, once you get the hang of it.</summary>
</entry>
<entry>
<title type="html">Finding used values of XML attributes using the command line</title>
<link href="https://danielrotter.at//2020/04/14/finding-used-values-of-xml-attributes-using-the-commandline.html" rel="alternate" type="text/html" title="Finding used values of XML attributes using the command line"/>
<published>2020-04-14</published>
<updated>2020-04-14</updated>
<id>https://danielrotter.at//2020/04/14/finding-used-values-of-xml-attributes-using-the-commandline.html</id>
<category term="cli"/>
<category term="xml"/>
<category term="regex"/>
<category term="linux"/>
<summary type="html">I was refactoring a feature and wanted to know which options were used for a certain attribute in a XML file. I decided to level up my CLI skills for that.</summary>
</entry>
<entry>
<title type="html">Avoid z-indexes whenever possible</title>
<link href="https://danielrotter.at//2020/04/08/avoid-z-index-whenever-possible.html" rel="alternate" type="text/html" title="Avoid z-indexes whenever possible"/>
<published>2020-04-08</published>
<updated>2020-04-08</updated>
<id>https://danielrotter.at//2020/04/08/avoid-z-index-whenever-possible.html</id>
<category term="html"/>
<category term="css"/>
<category term="javascript"/>
<category term="react"/>
<summary type="html">Whenever I use z-indexes, I am going to regret it at some point, especially with libraries utilizing components. Let’s see if we can avoid them all together.</summary>
</entry>
<entry>
<title type="html">Creating highly customizable HTML presentations with markdown and pandoc</title>
<link href="https://danielrotter.at//2020/03/28/creating-highly-customizable-html-presentation-with-markdown-and-pandoc.html" rel="alternate" type="text/html" title="Creating highly customizable HTML presentations with markdown and pandoc"/>
<published>2020-03-28</published>
<updated>2021-02-28</updated>
<id>https://danielrotter.at//2020/03/28/creating-highly-customizable-html-presentation-with-markdown-and-pandoc.html</id>
<category term="presentations"/>
<category term="html"/>
<category term="markdown"/>
<category term="pandoc"/>
<category term="graphviz"/>
<summary type="html">Presentations can be created using markdown, a plain file format. There are some available options, but let’s see why it pays off to build your own solution.</summary>
</entry>
<entry>
<title type="html">Testing traits with non-public methods</title>
<link href="https://danielrotter.at//2014/04/10/testing-traits-with-non-public-methods.html" rel="alternate" type="text/html" title="Testing traits with non-public methods"/>
<published>2014-04-10</published>
<updated>2014-04-10</updated>
<id>https://danielrotter.at//2014/04/10/testing-traits-with-non-public-methods.html</id>
<category term="php"/>
<category term="testing"/>
<category term="traits"/>
<summary type="html">Testing a trait with PHPUnit is not that easy, especially if it only contains private methods. See how it can be achieved in this step by step introduction.</summary>
</entry>
<entry>
<title type="html">My Getting Things Done system in Wunderlist</title>
<link href="https://danielrotter.at//2014/02/07/my-getting-things-done-system-in-wunderlist.html" rel="alternate" type="text/html" title="My Getting Things Done system in Wunderlist"/>
<published>2014-02-07</published>
<updated>2020-08-28</updated>
<id>https://danielrotter.at//2014/02/07/my-getting-things-done-system-in-wunderlist.html</id>
<category term="productivity"/>
<category term="wunderlist"/>
<summary type="html">Building your own “Getting Things Done” system using a few simple tips, including some that will hopefully boost your productivity.</summary>
</entry>
</feed>
