When you look at how a given organization develops software over time, it’s not uncommon to spot evolutionary patterns that mimic what we see in nature.
Particularly where micro services are involved, you might well be able to deduce which services came first, and which were developed later in time, by looking at various subtle variations in project structure, tools, dependencies, build pipelines and deployment descriptors.
Later services copy elements from the initial template services, apply variations to fit their needs, and successful variations are again used in future services, or even applied in the original template services.
Variations from service to service are essential to maintaining a vibrant engineering culture, with room for experimentation within appropriate boundaries.
Over time however, all the subtle variations can make it harder to reason across services, particularly when you want to apply broader changes.
In this blogpost I’ll outline, and provide various samples of, how I harmonize such diverse micro service landscapes, and the scripts I use to reduce the accidental complexity in maintaining the various variations.
Continue reading →
If we need to create a Java properties file in our build we could create a custom task and use the Properties
class to store a file with properties. Instead of writing our custom task we can use the task WriteProperties
that is already part of Gradle. Using this task Gradle will not add a timestamp in the comment to the properties file. Also the properties are sorted by name, so we know the properties are always in the same order in the output file. Finally, a fixed line separator is used, which is \n
by default, but can be set via the task property lineSeparator
.
To define the properties that need to be in the output file we can use the property
method for a single property, or we can use properties
method with a Map
argument to set multiple properties.
Continue reading →
As explained in part two of this series, OBS is a tool that makes it possible to create your ‘virtual camera’.
We can use this camera in conferencing tools like Zoom, Slack, Microsoft Teams, Google meet, Signal, and so on.
OBS is available for Windows, Mac and Linux, so it will probably work on your system as well.
In this part I’m going to explain how to get and install OBS, then we’re going to use it together with the chromakey screen.
I’ll focus on the virtual camera support, but the OBS suite can do a lot more.
It is free and open source software for video recording and live streaming.
It allows you to apply filters, supports NFI (via a plug-in) and much more.
OBS can be found on the OBS project website.
Here you’ll find a support forum as well, there is an active community helping you out on problems you might face.
For now let’s download the software.
Select your operating system en press ‘Download Installer’.
When you’re using Linux, it’s a bit harder.
If your distribution does not offer OBS Studio as a package, you’ll have to build it yourself.
Luckily the build instructions are not that hard to follow.
On the Mac or on Windows, the process is straight-forward.
After downloading the installer, just run it, and follow the given steps.
As it gives you the question for what it should be optimised for, I did choose 'streaming'.
You are able to change this later on in the 'Profile menu', when you select 'New'.
Continue reading →
The Maven Release plugin allows you to easily craft releases of your own libraries, to share code between projects.
When combined with Semantic Versioning you can communicate clearly to your library users which changes are minor, or potentially breaking.
The plugin will trim off the -SNAPSHOT
suffix of your artifact version, run through all the stages to create your build artifacts, and push those artifacts to a remote registry such as Artifactory.
It will also push a Git tag to your code repository, as well as increment your artifact version to prepare for further development.
This blogpost will run you through the steps to authenticate with both GitLab and Artifactory when running a Maven Release from GitLab CI.
Continue reading →
More and more companies are switching over to cloud native environments.
As a developer this gives me a lot of services to create awesome applications.
The challenge that occurred to me right away was how to use all those new components during development, since some companies do not have a testing/development environment in their cloud provider to play with.
LocalStack piqued my interest to simulate an AWS environment locally on my laptop, or when running the CI/CD pipeline.
This blog will give a brief introduction in what LocalStack can do and how you can use it for your own projects.
Continue reading →
In the first part of the small series about videoconferencing, I talked about the hardware.
As promised, this time it’s all about the software, and you don’t have to spend any money on it!
All the software we’re going to use here is open source.
This means it’s free to download, install and use!
Best of all, you are able to contribute to the projects as well, perhaps you’re a gifted developer that can improve the program.
Then give your improvements back to the community!
For now, let’s have a look at the programs you might want to download.
Continue reading →
As a consultant I find myself alternating between GitLab and GitHub about once a year, depending on the assignment.
While I like GitLab a lot, there’s one thing I had sorely missed whenever I switch back from GitHub: Dependabot.
Dependabot scans your project dependencies, and creates merge requests whenever updates are found.
This provides you with an easy way to keep up to date on dependencies, and notifies you early if there are any incompatibilities.
Luckily though, there’s now a Dependabot for GitLab project.
This project is based on the same Open Source Dependabot Core, so you can get the exact same automated dependency updates on both platforms.
In this blogpost I’ll walk you through how you can quickly roll out Dependabot on an existing GitLab installation, so you can start updating your dependencies automatically.
Continue reading →
Java 15 introduced the multi-line string value referred to as a text block. With this introduction also the formatted
method was added to the String
class. The method can be invoked on a String
value directly and function exactly as the static String.format
method. The nice thing is that now we directly can use a method on the value instead of having to use a static method where the value is passed as argument.
In the following example we use the formatted
method for a normal String
value and a text block:
Continue reading →
Since most of us are more or less forced to work from home, we’re using Zoom, Google meet, Microsoft Teams, Slack or other videoconferencing programs to keep in touch with each other.
Even though most programs allow you to blur your background or replace it with a nice image, it isn’t ideal and the quality isn’t that good.
On the other hand, you don’t want to be in a situation that you’re in the middle of an important meeting, and find out that you forgot to clean up that pile of laundry or other private goods that you rather don’t show to the outer world.
This is why I thought it would be nice to create a short series that helps you to professionalize your video conferencing setup.
The focus is to keep a tight budget, let’s say about 150 Euro of hardware.
We only will use open source programs to create your virtual environment you want to be in.
This isn’t only a thing that is just fun to do, but I’ll show other possibilities as well.
For example: You are able to place yourself in front of your PowerPoint presentation.
In the end, you’ll be able to create an end-result like this:
For this short demo I used free video footage available on videezy and vidveo.
If you want to use their free available products, remember to link to them and give the proper credits to them as well.
Continue reading →
A while ago I was working on a Spring REST project and had a special wish. I wanted for one endpoint an exception thrown when someone requested it with an object with unknown properties. All the other endpoints with their rest objects should continue to exhibit the same behaviour. Let me share how I did this.
Continue reading →