Leben++

It's never too late to get a life

Working with PHP dependencies in multiple repositories

Imagine yourself working on a PHP code base distributed between two or more Git repositories, for example a library and an application part. Ideally, the two repositories should be independent, but sometimes that lofty goal can’t be achieved. And having two repositories open in your editor and doing git commit, git push, composer update all the time becomes tedious. This article shows how to work faster with two dependent PHP code bases.

Migration from Spress to Hugo

History and Motivation The list of static site generators is very long, but which one should you choose? When I ported this blog from Drupal to static HTML, I chose Spress, written in PHP, because PHP was my main programming language, its code looked well-thought-out, relied on established libraries and did everything I wanted out of the box and with a minimum amount of configuration. However, during the last year there was only one minor release of Spress and I missed some features I saw in other projects:

How to run npm install as non-root from a Docker container

Suppose you don’t want to install Node.js and npm on your local machine and already run your application in a Docker container. How do you install your dependencies from package.json? For deployment, the most common way is to create your own Docker image, where npm install is part of the Dockerfile. But what do you do on your development machine, where you don’t want to build a new image all the time and use the vanilla node image ?

Ideas and takeaways from DDD Europe 2018

Keynote by David Snowden An inspiring talk about complexity and modeling, using the Cynefin framework to understand the nature of your domain (Complex/Complicated/Simple/Chaotic) and how to model and measure success according to that nature. What stood out to me was the idea that complex domains - like ecosystems, financial markets, large organizations or even “society” itself - can’t be analyzed and fully understood like complicated domains. Thus, they can’t be “modeled”, since every abstraction will miss crucial behavior.

Error log analysis with jq

This is a step-by-step introduction into aggregating and analyzing errors from a JSON error log (where each error is a JSON object on a single line) with the tool jq. While most tutorials and documentation of jq focus on how to transform JSON objects to other JSON objects on a 1:1 basis, this tutorial is more about building aggregates, using an approach that takes a page out of functional programming.

Ideas and links from SoCraTes Day Berlin 2017

I attended the SoCraTes Day Berlin and came back inspired and full of ideas I want to share with the world. Lean Coffee We discussed estimations (Complexity vs time, who needs them, when are they helping) and I learned about the method of “Magic estimation”. Someone mentioned “Scripts to rule them all”, an attempt to establish a common set of scripts in each project that do certain project tasks like bootstrapping, resetting, updating, running the CI validation, etc.

Four weeks of fish shell

At the SoCraTes conference I attended a demo of the fish shell and was so impressed that I pledged to use fish instead of zsh as my main shell for 4 weeks. This is the result of the experiment and contains my collected experiences. Fish is awesome I really like fish and will continue to use it. The syntax highlighting of the the commands gives immediate feedback (unknown commands are shown in red) and the command autosuggestions are a real time saver.

Impressions from SoCraTes 2017

I attended SoCraTes 2017 in Soltau. SoCraTes is an “Unconference”, where the participants set their own agenda and come up with topics for their sessions. Sessions can be presentations, workshops and open discussions. Here are the notes from some of the sessions I attended: Programming Exercise: Banishing State The example of this exercise was taken from a real-life project: A book indexing service that takes keyword/page number pairs as input and outputs either the page number, a range of page numbers or nothing, depending on previous inputs.